2
* Copyright (C) 2003 Yasuhiro Ohara
4
* This file is part of GNU Zebra.
6
* GNU Zebra is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU General Public License as published by the
8
* Free Software Foundation; either version 2, or (at your option) any
11
* GNU Zebra is distributed in the hope that it will be useful, but
12
* WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* General Public License for more details.
16
* You should have received a copy of the GNU General Public License
17
* along with GNU Zebra; see the file COPYING. If not, write to the
18
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19
* Boston, MA 02111-1307, USA.
25
#define OSPF6_MULTI_PATH_LIMIT 4
28
extern unsigned char conf_debug_ospf6_route;
29
#define OSPF6_DEBUG_ROUTE_TABLE 0x01
30
#define OSPF6_DEBUG_ROUTE_INTRA 0x02
31
#define OSPF6_DEBUG_ROUTE_INTER 0x04
32
#define OSPF6_DEBUG_ROUTE_ON(level) \
33
(conf_debug_ospf6_route |= (level))
34
#define OSPF6_DEBUG_ROUTE_OFF(level) \
35
(conf_debug_ospf6_route &= ~(level))
36
#define IS_OSPF6_DEBUG_ROUTE(e) \
37
(conf_debug_ospf6_route & OSPF6_DEBUG_ROUTE_ ## e)
45
/* IP address, if any */
46
struct in6_addr address;
49
#define ospf6_nexthop_is_set(x) \
50
((x)->ifindex || ! IN6_IS_ADDR_UNSPECIFIED (&(x)->address))
51
#define ospf6_nexthop_is_same(a,b) \
52
((a)->ifindex == (b)->ifindex && \
53
IN6_ARE_ADDR_EQUAL (&(a)->address, &(b)->address))
54
#define ospf6_nexthop_clear(x) \
57
memset (&(x)->address, 0, sizeof (struct in6_addr)); \
59
#define ospf6_nexthop_copy(a, b) \
61
(a)->ifindex = (b)->ifindex; \
62
memcpy (&(a)->address, &(b)->address, \
63
sizeof (struct in6_addr)); \
67
struct ospf6_ls_origin
76
/* Link State Origin */
77
struct ospf6_ls_origin origin;
82
/* Optional Capabilities */
86
u_char prefix_options;
93
u_char subtype; /* only used for redistribute i.e ZEBRA_ROUTE_XXX */
101
#define OSPF6_PATH_TYPE_NONE 0
102
#define OSPF6_PATH_TYPE_INTRA 1
103
#define OSPF6_PATH_TYPE_INTER 2
104
#define OSPF6_PATH_TYPE_EXTERNAL1 3
105
#define OSPF6_PATH_TYPE_EXTERNAL2 4
106
#define OSPF6_PATH_TYPE_REDISTRIBUTE 5
107
#define OSPF6_PATH_TYPE_MAX 6
114
struct route_node *rnode;
116
struct ospf6_route *prev;
117
struct ospf6_route *next;
121
/* Destination Type */
125
struct prefix prefix;
128
struct timeval installed;
129
struct timeval changed;
135
struct ospf6_path path;
138
struct ospf6_nexthop nexthop[OSPF6_MULTI_PATH_LIMIT];
143
/* link state id for advertising */
144
u_int32_t linkstate_id;
147
#define OSPF6_DEST_TYPE_NONE 0
148
#define OSPF6_DEST_TYPE_ROUTER 1
149
#define OSPF6_DEST_TYPE_NETWORK 2
150
#define OSPF6_DEST_TYPE_DISCARD 3
151
#define OSPF6_DEST_TYPE_LINKSTATE 4
152
#define OSPF6_DEST_TYPE_RANGE 5
153
#define OSPF6_DEST_TYPE_MAX 6
155
#define OSPF6_ROUTE_CHANGE 0x01
156
#define OSPF6_ROUTE_ADD 0x02
157
#define OSPF6_ROUTE_REMOVE 0x04
158
#define OSPF6_ROUTE_BEST 0x08
159
#define OSPF6_ROUTE_ACTIVE_SUMMARY 0x10
160
#define OSPF6_ROUTE_DO_NOT_ADVERTISE 0x20
161
#define OSPF6_ROUTE_WAS_REMOVED 0x40
163
struct ospf6_route_table
166
struct route_table *table;
171
void (*hook_add) (struct ospf6_route *);
172
void (*hook_change) (struct ospf6_route *);
173
void (*hook_remove) (struct ospf6_route *);
176
extern const char *ospf6_dest_type_str[OSPF6_DEST_TYPE_MAX];
177
extern const char *ospf6_dest_type_substr[OSPF6_DEST_TYPE_MAX];
178
#define OSPF6_DEST_TYPE_NAME(x) \
179
(0 < (x) && (x) < OSPF6_DEST_TYPE_MAX ? \
180
ospf6_dest_type_str[(x)] : ospf6_dest_type_str[0])
181
#define OSPF6_DEST_TYPE_SUBSTR(x) \
182
(0 < (x) && (x) < OSPF6_DEST_TYPE_MAX ? \
183
ospf6_dest_type_substr[(x)] : ospf6_dest_type_substr[0])
185
extern const char *ospf6_path_type_str[OSPF6_PATH_TYPE_MAX];
186
extern const char *ospf6_path_type_substr[OSPF6_PATH_TYPE_MAX];
187
#define OSPF6_PATH_TYPE_NAME(x) \
188
(0 < (x) && (x) < OSPF6_PATH_TYPE_MAX ? \
189
ospf6_path_type_str[(x)] : ospf6_path_type_str[0])
190
#define OSPF6_PATH_TYPE_SUBSTR(x) \
191
(0 < (x) && (x) < OSPF6_PATH_TYPE_MAX ? \
192
ospf6_path_type_substr[(x)] : ospf6_path_type_substr[0])
194
#define OSPF6_ROUTE_ADDRESS_STR "Display the route bestmatches the address\n"
195
#define OSPF6_ROUTE_PREFIX_STR "Display the route\n"
196
#define OSPF6_ROUTE_MATCH_STR "Display the route matches the prefix\n"
198
#define ospf6_route_is_prefix(p, r) \
199
(memcmp (p, &(r)->prefix, sizeof (struct prefix)) == 0)
200
#define ospf6_route_is_same(ra, rb) \
201
(prefix_same (&(ra)->prefix, &(rb)->prefix))
202
#define ospf6_route_is_same_origin(ra, rb) \
203
((ra)->path.area_id == (rb)->path.area_id && \
204
memcmp (&(ra)->path.origin, &(rb)->path.origin, \
205
sizeof (struct ospf6_ls_origin)) == 0)
206
#define ospf6_route_is_identical(ra, rb) \
207
((ra)->type == (rb)->type && \
208
memcmp (&(ra)->prefix, &(rb)->prefix, sizeof (struct prefix)) == 0 && \
209
memcmp (&(ra)->path, &(rb)->path, sizeof (struct ospf6_path)) == 0 && \
210
memcmp (&(ra)->nexthop, &(rb)->nexthop, \
211
sizeof (struct ospf6_nexthop) * OSPF6_MULTI_PATH_LIMIT) == 0)
212
#define ospf6_route_is_best(r) (CHECK_FLAG ((r)->flag, OSPF6_ROUTE_BEST))
214
#define ospf6_linkstate_prefix_adv_router(x) \
215
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[0]))
216
#define ospf6_linkstate_prefix_id(x) \
217
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
219
#define ADV_ROUTER_IN_PREFIX(x) \
220
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[0]))
221
#define ID_IN_PREFIX(x) \
222
(*(u_int32_t *)(&(x)->u.prefix6.s6_addr[4]))
224
/* Function prototype */
225
void ospf6_linkstate_prefix (u_int32_t adv_router, u_int32_t id,
226
struct prefix *prefix);
227
void ospf6_linkstate_prefix2str (struct prefix *prefix, char *buf, int size);
229
struct ospf6_route *ospf6_route_create ();
230
void ospf6_route_delete (struct ospf6_route *);
231
struct ospf6_route *ospf6_route_copy (struct ospf6_route *route);
233
void ospf6_route_lock (struct ospf6_route *route);
234
void ospf6_route_unlock (struct ospf6_route *route);
237
ospf6_route_lookup (struct prefix *prefix,
238
struct ospf6_route_table *table);
240
ospf6_route_lookup_identical (struct ospf6_route *route,
241
struct ospf6_route_table *table);
243
ospf6_route_lookup_bestmatch (struct prefix *prefix,
244
struct ospf6_route_table *table);
247
ospf6_route_add (struct ospf6_route *route, struct ospf6_route_table *table);
249
ospf6_route_remove (struct ospf6_route *route, struct ospf6_route_table *table);
251
struct ospf6_route *ospf6_route_head (struct ospf6_route_table *table);
252
struct ospf6_route *ospf6_route_next (struct ospf6_route *route);
253
struct ospf6_route *ospf6_route_best_next (struct ospf6_route *route);
255
struct ospf6_route *ospf6_route_match_head (struct prefix *prefix,
256
struct ospf6_route_table *table);
257
struct ospf6_route *ospf6_route_match_next (struct prefix *prefix,
258
struct ospf6_route *route);
260
void ospf6_route_remove_all (struct ospf6_route_table *);
261
struct ospf6_route_table *ospf6_route_table_create ();
262
void ospf6_route_table_delete (struct ospf6_route_table *);
263
void ospf6_route_dump (struct ospf6_route_table *table);
266
void ospf6_route_show (struct vty *vty, struct ospf6_route *route);
267
void ospf6_route_show_detail (struct vty *vty, struct ospf6_route *route);
269
int ospf6_route_table_show (struct vty *, int, const char *[],
270
struct ospf6_route_table *);
271
int ospf6_linkstate_table_show (struct vty *vty, int argc, const char *argv[],
272
struct ospf6_route_table *table);
274
void ospf6_brouter_show_header (struct vty *vty);
275
void ospf6_brouter_show (struct vty *vty, struct ospf6_route *route);
277
int config_write_ospf6_debug_route (struct vty *vty);
278
void install_element_ospf6_debug_route ();
279
void ospf6_route_init ();
281
#endif /* OSPF6_ROUTE_H */