1 /*
2  * OSPF routing table.
3  * Copyright (C) 1999, 2000 Toshiaki Takada
4  *
5  * This file is part of GNU Zebra.
6  *
7  * GNU Zebra is free software; you can redistribute it and/or modify it
8  * under the terms of the GNU General Public License as published by the
9  * Free Software Foundation; either version 2, or (at your option) any
10  * later version.
11  *
12  * GNU Zebra is distributed in the hope that it will be useful, but
13  * WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with GNU Zebra; see the file COPYING.  If not, write to the Free
19  * Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
20  * 02111-1307, USA.
21  */
22 
23 #ifndef _ZEBRA_OSPF_ROUTE_H
24 #define _ZEBRA_OSPF_ROUTE_H
25 
26 #define OSPF_DESTINATION_ROUTER		1
27 #define OSPF_DESTINATION_NETWORK	2
28 #define OSPF_DESTINATION_DISCARD	3
29 
30 #define OSPF_PATH_MIN			0
31 #define OSPF_PATH_INTRA_AREA		1
32 #define OSPF_PATH_INTER_AREA		2
33 #define OSPF_PATH_TYPE1_EXTERNAL	3
34 #define OSPF_PATH_TYPE2_EXTERNAL	4
35 #define OSPF_PATH_MAX			5
36 
37 /* OSPF Path. */
38 struct ospf_path
39 {
40   struct in_addr nexthop;
41   struct in_addr adv_router;
42   ifindex_t ifindex;
43 };
44 
45 /* Below is the structure linked to every
46    route node. Note that for Network routing
47    entries a single ospf_route is kept, while
48    for ABRs and ASBRs (Router routing entries),
49    we link an instance of ospf_router_route
50    where a list of paths is maintained, so
51 
52    nr->info is a (struct ospf_route *) for OSPF_DESTINATION_NETWORK
53    but
54    nr->info is a (struct ospf_router_route *) for OSPF_DESTINATION_ROUTER
55 */
56 
57 struct route_standard
58 {
59   /* Link Sate Origin. */
60   struct lsa_header *origin;
61 
62   /* Associated Area. */
63   struct in_addr area_id;	/* The area the route belongs to */
64 
65   /*  Area Type */
66   int external_routing;
67 
68   /* Optional Capability. */
69   u_char options;		/* Get from LSA header. */
70 
71   /*  */
72   u_char flags; 		/* From router-LSA */
73 };
74 
75 struct route_external
76 {
77   /* Link State Origin. */
78   struct ospf_lsa *origin;
79 
80   /* Link State Cost Type2. */
81   u_int32_t type2_cost;
82 
83   /* Tag value. */
84   u_int32_t tag;
85 
86   /* ASBR route. */
87   struct ospf_route *asbr;
88 };
89 
90 struct ospf_route
91 {
92   /* Create time. */
93   time_t ctime;
94 
95   /* Modified time. */
96   time_t mtime;
97 
98   /* Destination Type. */
99   u_char type;
100 
101   /* Destination ID. */		/* i.e. Link State ID. */
102   struct in_addr id;
103 
104   /* Address Mask. */
105   struct in_addr mask;		/* Only valid for networks. */
106 
107   /* Path Type. */
108   u_char path_type;
109 
110   /* List of Paths. */
111   struct list *paths;
112 
113   /* Link State Cost. */
114   u_int32_t cost;		/* i.e. metric. */
115 
116   /* Route specific info. */
117   union
118   {
119     struct route_standard std;
120     struct route_external ext;
121   } u;
122 };
123 
124 extern struct ospf_path *ospf_path_new (void);
125 extern void ospf_path_free (struct ospf_path *);
126 extern struct ospf_path *ospf_path_lookup (struct list *, struct ospf_path *);
127 extern struct ospf_route *ospf_route_new (void);
128 extern void ospf_route_free (struct ospf_route *);
129 extern void ospf_route_delete (struct route_table *);
130 extern void ospf_route_table_free (struct route_table *);
131 
132 extern void ospf_route_install (struct ospf *, struct route_table *);
133 extern void ospf_route_table_dump (struct route_table *);
134 
135 extern void ospf_intra_add_router (struct route_table *, struct vertex *,
136 				   struct ospf_area *);
137 
138 extern void ospf_intra_add_transit (struct route_table *, struct vertex *,
139 				    struct ospf_area *);
140 
141 extern void ospf_intra_add_stub (struct route_table *,
142 				 struct router_lsa_link *, struct vertex *,
143 				 struct ospf_area *,
144 				 int parent_is_root, int);
145 
146 extern int ospf_route_cmp (struct ospf *, struct ospf_route *,
147 			   struct ospf_route *);
148 extern void ospf_route_copy_nexthops (struct ospf_route *, struct list *);
149 extern void ospf_route_copy_nexthops_from_vertex (struct ospf_route *,
150 						  struct vertex *);
151 
152 extern void ospf_route_subst (struct route_node *, struct ospf_route *,
153 			      struct ospf_route *);
154 extern void ospf_route_add (struct route_table *, struct prefix_ipv4 *,
155 			    struct ospf_route *, struct ospf_route *);
156 
157 extern void ospf_route_subst_nexthops (struct ospf_route *, struct list *);
158 extern void ospf_prune_unreachable_networks (struct route_table *);
159 extern void ospf_prune_unreachable_routers (struct route_table *);
160 extern int ospf_add_discard_route (struct route_table *, struct ospf_area *,
161 				   struct prefix_ipv4 *);
162 extern void ospf_delete_discard_route (struct route_table *, struct prefix_ipv4 *);
163 extern int ospf_route_match_same (struct route_table *, struct prefix_ipv4 *,
164 				  struct ospf_route *);
165 
166 #endif /* _ZEBRA_OSPF_ROUTE_H */
167