Import Upstream version 1.2.2
[quagga-debian.git] / ospfd / ospf_route.h
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 */