Annotation of embedaddon/quagga/zebra/rib.h, revision 1.1.1.4
1.1 misho 1: /*
2: * Routing Information Base header
3: * Copyright (C) 1997 Kunihiro Ishiguro
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_RIB_H
24: #define _ZEBRA_RIB_H
25:
1.1.1.4 ! misho 26: #include "linklist.h"
1.1 misho 27: #include "prefix.h"
1.1.1.3 misho 28: #include "table.h"
29: #include "queue.h"
1.1 misho 30:
31: #define DISTANCE_INFINITY 255
32:
33: /* Routing information base. */
34:
35: union g_addr {
36: struct in_addr ipv4;
37: #ifdef HAVE_IPV6
38: struct in6_addr ipv6;
39: #endif /* HAVE_IPV6 */
40: };
41:
42: struct rib
43: {
44: /* Link list. */
45: struct rib *next;
46: struct rib *prev;
47:
48: /* Nexthop structure */
49: struct nexthop *nexthop;
50:
51: /* Refrence count. */
52: unsigned long refcnt;
53:
54: /* Uptime. */
55: time_t uptime;
56:
57: /* Type fo this route. */
58: int type;
59:
1.1.1.4 ! misho 60: /* VRF identifier. */
! 61: vrf_id_t vrf_id;
! 62:
1.1 misho 63: /* Which routing table */
64: int table;
65:
66: /* Metric */
67: u_int32_t metric;
68:
1.1.1.4 ! misho 69: /* MTU */
! 70: u_int32_t mtu;
! 71: u_int32_t nexthop_mtu;
! 72:
1.1 misho 73: /* Distance. */
74: u_char distance;
75:
76: /* Flags of this route.
77: * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed
78: * to clients via Zserv
79: */
80: u_char flags;
81:
82: /* RIB internal status */
83: u_char status;
84: #define RIB_ENTRY_REMOVED (1 << 0)
1.1.1.4 ! misho 85: #define RIB_ENTRY_CHANGED (1 << 1)
! 86: #define RIB_ENTRY_SELECTED_FIB (1 << 2)
1.1 misho 87:
88: /* Nexthop information. */
89: u_char nexthop_num;
90: u_char nexthop_active_num;
91: u_char nexthop_fib_num;
92: };
93:
94: /* meta-queue structure:
95: * sub-queue 0: connected, kernel
96: * sub-queue 1: static
97: * sub-queue 2: RIP, RIPng, OSPF, OSPF6, IS-IS
98: * sub-queue 3: iBGP, eBGP
99: * sub-queue 4: any other origin (if any)
100: */
101: #define MQ_SIZE 5
102: struct meta_queue
103: {
104: struct list *subq[MQ_SIZE];
105: u_int32_t size; /* sum of lengths of all subqueues */
106: };
107:
1.1.1.3 misho 108: /*
109: * Structure that represents a single destination (prefix).
110: */
111: typedef struct rib_dest_t_
112: {
113:
114: /*
115: * Back pointer to the route node for this destination. This helps
116: * us get to the prefix that this structure is for.
117: */
118: struct route_node *rnode;
119:
120: /*
121: * Doubly-linked list of routes for this prefix.
122: */
123: struct rib *routes;
124:
125: /*
126: * Flags, see below.
127: */
128: u_int32_t flags;
129:
130: /*
131: * Linkage to put dest on the FPM processing queue.
132: */
133: TAILQ_ENTRY(rib_dest_t_) fpm_q_entries;
134:
135: } rib_dest_t;
136:
137: #define RIB_ROUTE_QUEUED(x) (1 << (x))
138:
139: /*
140: * The maximum qindex that can be used.
141: */
142: #define ZEBRA_MAX_QINDEX (MQ_SIZE - 1)
143:
144: /*
145: * This flag indicates that a given prefix has been 'advertised' to
146: * the FPM to be installed in the forwarding plane.
147: */
148: #define RIB_DEST_SENT_TO_FPM (1 << (ZEBRA_MAX_QINDEX + 1))
149:
150: /*
151: * This flag is set when we need to send an update to the FPM about a
152: * dest.
153: */
154: #define RIB_DEST_UPDATE_FPM (1 << (ZEBRA_MAX_QINDEX + 2))
155:
156: /*
157: * Macro to iterate over each route for a destination (prefix).
158: */
159: #define RIB_DEST_FOREACH_ROUTE(dest, rib) \
160: for ((rib) = (dest) ? (dest)->routes : NULL; (rib); (rib) = (rib)->next)
161:
162: /*
163: * Same as above, but allows the current node to be unlinked.
164: */
165: #define RIB_DEST_FOREACH_ROUTE_SAFE(dest, rib, next) \
166: for ((rib) = (dest) ? (dest)->routes : NULL; \
167: (rib) && ((next) = (rib)->next, 1); \
168: (rib) = (next))
169:
170: #define RNODE_FOREACH_RIB(rn, rib) \
171: RIB_DEST_FOREACH_ROUTE (rib_dest_from_rnode (rn), rib)
172:
173: #define RNODE_FOREACH_RIB_SAFE(rn, rib, next) \
174: RIB_DEST_FOREACH_ROUTE_SAFE (rib_dest_from_rnode (rn), rib, next)
175:
1.1 misho 176: /* Static route information. */
1.1.1.4 ! misho 177: struct static_route
1.1 misho 178: {
179: /* For linked list. */
1.1.1.4 ! misho 180: struct static_route *prev;
! 181: struct static_route *next;
1.1 misho 182:
1.1.1.4 ! misho 183: /* VRF identifier. */
! 184: vrf_id_t vrf_id;
1.1 misho 185:
186: /* Administrative distance. */
187: u_char distance;
188:
189: /* Flag for this static route's type. */
190: u_char type;
1.1.1.4 ! misho 191: #define STATIC_IPV4_GATEWAY 1
! 192: #define STATIC_IPV4_IFNAME 2
! 193: #define STATIC_IPV4_BLACKHOLE 3
! 194: #define STATIC_IPV6_GATEWAY 4
! 195: #define STATIC_IPV6_GATEWAY_IFNAME 5
! 196: #define STATIC_IPV6_IFNAME 6
1.1 misho 197:
198: /* Nexthop value. */
1.1.1.4 ! misho 199: union g_addr addr;
1.1 misho 200: char *ifname;
201:
202: /* bit flags */
203: u_char flags;
204: /*
205: see ZEBRA_FLAG_REJECT
206: ZEBRA_FLAG_BLACKHOLE
207: */
208: };
209:
210: enum nexthop_types_t
211: {
212: NEXTHOP_TYPE_IFINDEX = 1, /* Directly connected. */
213: NEXTHOP_TYPE_IFNAME, /* Interface route. */
214: NEXTHOP_TYPE_IPV4, /* IPv4 nexthop. */
215: NEXTHOP_TYPE_IPV4_IFINDEX, /* IPv4 nexthop with ifindex. */
216: NEXTHOP_TYPE_IPV4_IFNAME, /* IPv4 nexthop with ifname. */
217: NEXTHOP_TYPE_IPV6, /* IPv6 nexthop. */
218: NEXTHOP_TYPE_IPV6_IFINDEX, /* IPv6 nexthop with ifindex. */
219: NEXTHOP_TYPE_IPV6_IFNAME, /* IPv6 nexthop with ifname. */
220: NEXTHOP_TYPE_BLACKHOLE, /* Null0 nexthop. */
221: };
222:
223: /* Nexthop structure. */
224: struct nexthop
225: {
226: struct nexthop *next;
227: struct nexthop *prev;
228:
229: /* Interface index. */
230: char *ifname;
1.1.1.4 ! misho 231: ifindex_t ifindex;
1.1 misho 232:
233: enum nexthop_types_t type;
234:
235: u_char flags;
236: #define NEXTHOP_FLAG_ACTIVE (1 << 0) /* This nexthop is alive. */
237: #define NEXTHOP_FLAG_FIB (1 << 1) /* FIB nexthop. */
238: #define NEXTHOP_FLAG_RECURSIVE (1 << 2) /* Recursive nexthop. */
1.1.1.4 ! misho 239: #define NEXTHOP_FLAG_ONLINK (1 << 3) /* Nexthop should be installed onlink. */
1.1 misho 240:
1.1.1.4 ! misho 241: /* Nexthop address */
1.1 misho 242: union g_addr gate;
243: union g_addr src;
1.1.1.4 ! misho 244:
! 245: /* Nexthops obtained by recursive resolution.
! 246: *
! 247: * If the nexthop struct needs to be resolved recursively,
! 248: * NEXTHOP_FLAG_RECURSIVE will be set in flags and the nexthops
! 249: * obtained by recursive resolution will be added to `resolved'.
! 250: * Only one level of recursive resolution is currently supported. */
! 251: struct nexthop *resolved;
1.1 misho 252: };
253:
1.1.1.4 ! misho 254: /* The following for loop allows to iterate over the nexthop
! 255: * structure of routes.
! 256: *
! 257: * We have to maintain quite a bit of state:
! 258: *
! 259: * nexthop: The pointer to the current nexthop, either in the
! 260: * top-level chain or in the resolved chain of ni.
! 261: * tnexthop: The pointer to the current nexthop in the top-level
! 262: * nexthop chain.
! 263: * recursing: Information if nh currently is in the top-level chain
! 264: * (0) or in a resolved chain (1).
! 265: *
! 266: * Initialization: Set `nexthop' and `tnexthop' to the head of the
! 267: * top-level chain. As nexthop is in the top level chain, set recursing
! 268: * to 0.
! 269: *
! 270: * Iteration check: Check that the `nexthop' pointer is not NULL.
! 271: *
! 272: * Iteration step: This is the tricky part. Check if `nexthop' has
! 273: * NEXTHOP_FLAG_RECURSIVE set. If yes, this implies that `nexthop' is in
! 274: * the top level chain and has at least one nexthop attached to
! 275: * `nexthop->resolved'. As we want to descend into `nexthop->resolved',
! 276: * set `recursing' to 1 and set `nexthop' to `nexthop->resolved'.
! 277: * `tnexthop' is left alone in that case so we can remember which nexthop
! 278: * in the top level chain we are currently handling.
! 279: *
! 280: * If NEXTHOP_FLAG_RECURSIVE is not set, `nexthop' will progress in its
! 281: * current chain. If we are recursing, `nexthop' will be set to
! 282: * `nexthop->next' and `tnexthop' will be left alone. If we are not
! 283: * recursing, both `tnexthop' and `nexthop' will be set to `nexthop->next'
! 284: * as we are progressing in the top level chain.
! 285: * If we encounter `nexthop->next == NULL', we will clear the `recursing'
! 286: * flag as we arived either at the end of the resolved chain or at the end
! 287: * of the top level chain. In both cases, we set `tnexthop' and `nexthop'
! 288: * to `tnexthop->next', progressing to the next position in the top-level
! 289: * chain and possibly to its end marked by NULL.
! 290: */
! 291: #define ALL_NEXTHOPS_RO(head, nexthop, tnexthop, recursing) \
! 292: (tnexthop) = (nexthop) = (head), (recursing) = 0; \
! 293: (nexthop); \
! 294: (nexthop) = CHECK_FLAG((nexthop)->flags, NEXTHOP_FLAG_RECURSIVE) \
! 295: ? (((recursing) = 1), (nexthop)->resolved) \
! 296: : ((nexthop)->next ? ((recursing) ? (nexthop)->next \
! 297: : ((tnexthop) = (nexthop)->next)) \
! 298: : (((recursing) = 0),((tnexthop) = (tnexthop)->next)))
! 299:
! 300: /* Structure holding nexthop & VRF identifier,
! 301: * used for applying the route-map. */
! 302: struct nexthop_vrfid
! 303: {
! 304: struct nexthop *nexthop;
! 305: vrf_id_t vrf_id;
! 306: };
! 307:
! 308:
! 309: #if defined (HAVE_RTADV)
! 310: /* Structure which hold status of router advertisement. */
! 311: struct rtadv
! 312: {
! 313: int sock;
! 314:
! 315: int adv_if_count;
! 316: int adv_msec_if_count;
! 317:
! 318: struct thread *ra_read;
! 319: struct thread *ra_timer;
! 320: };
! 321: #endif /* HAVE_RTADV */
! 322:
! 323: #ifdef HAVE_NETLINK
! 324: /* Socket interface to kernel */
! 325: struct nlsock
! 326: {
! 327: int sock;
! 328: int seq;
! 329: struct sockaddr_nl snl;
! 330: const char *name;
! 331: };
! 332: #endif
! 333:
1.1 misho 334: /* Routing table instance. */
1.1.1.4 ! misho 335: struct zebra_vrf
1.1 misho 336: {
1.1.1.4 ! misho 337: /* Identifier. */
! 338: vrf_id_t vrf_id;
1.1 misho 339:
340: /* Routing table name. */
341: char *name;
342:
343: /* Description. */
344: char *desc;
345:
346: /* FIB identifier. */
347: u_char fib_id;
348:
349: /* Routing table. */
350: struct route_table *table[AFI_MAX][SAFI_MAX];
351:
352: /* Static route configuration. */
353: struct route_table *stable[AFI_MAX][SAFI_MAX];
1.1.1.4 ! misho 354:
! 355: #ifdef HAVE_NETLINK
! 356: struct nlsock netlink; /* kernel messages */
! 357: struct nlsock netlink_cmd; /* command channel */
! 358: struct thread *t_netlink;
! 359: #endif
! 360:
! 361: /* 2nd pointer type used primarily to quell a warning on
! 362: * ALL_LIST_ELEMENTS_RO
! 363: */
! 364: struct list _rid_all_sorted_list;
! 365: struct list _rid_lo_sorted_list;
! 366: struct list *rid_all_sorted_list;
! 367: struct list *rid_lo_sorted_list;
! 368: struct prefix rid_user_assigned;
! 369:
! 370: #if defined (HAVE_RTADV)
! 371: struct rtadv rtadv;
! 372: #endif /* HAVE_RTADV */
1.1 misho 373: };
374:
1.1.1.3 misho 375: /*
376: * rib_table_info_t
377: *
378: * Structure that is hung off of a route_table that holds information about
379: * the table.
380: */
381: typedef struct rib_table_info_t_
382: {
383:
384: /*
1.1.1.4 ! misho 385: * Back pointer to zebra_vrf.
1.1.1.3 misho 386: */
1.1.1.4 ! misho 387: struct zebra_vrf *zvrf;
1.1.1.3 misho 388: afi_t afi;
389: safi_t safi;
390:
391: } rib_table_info_t;
392:
393: typedef enum
394: {
395: RIB_TABLES_ITER_S_INIT,
396: RIB_TABLES_ITER_S_ITERATING,
397: RIB_TABLES_ITER_S_DONE
398: } rib_tables_iter_state_t;
399:
400: /*
401: * Structure that holds state for iterating over all tables in the
402: * Routing Information Base.
403: */
404: typedef struct rib_tables_iter_t_
405: {
1.1.1.4 ! misho 406: vrf_id_t vrf_id;
1.1.1.3 misho 407: int afi_safi_ix;
408:
409: rib_tables_iter_state_t state;
410: } rib_tables_iter_t;
411:
1.1.1.4 ! misho 412: /* RPF lookup behaviour */
! 413: enum multicast_mode
! 414: {
! 415: MCAST_NO_CONFIG = 0, /* MIX_MRIB_FIRST, but no show in config write */
! 416: MCAST_MRIB_ONLY, /* MRIB only */
! 417: MCAST_URIB_ONLY, /* URIB only */
! 418: MCAST_MIX_MRIB_FIRST, /* MRIB, if nothing at all then URIB */
! 419: MCAST_MIX_DISTANCE, /* MRIB & URIB, lower distance wins */
! 420: MCAST_MIX_PFXLEN, /* MRIB & URIB, longer prefix wins */
! 421: /* on equal value, MRIB wins for last 2 */
! 422: };
! 423:
! 424: extern void multicast_mode_ipv4_set (enum multicast_mode mode);
! 425: extern enum multicast_mode multicast_mode_ipv4_get (void);
! 426:
1.1.1.3 misho 427: extern const char *nexthop_type_to_str (enum nexthop_types_t nh_type);
1.1.1.4 ! misho 428: extern struct nexthop *nexthop_ifindex_add (struct rib *, ifindex_t);
1.1 misho 429: extern struct nexthop *nexthop_ifname_add (struct rib *, char *);
430: extern struct nexthop *nexthop_blackhole_add (struct rib *);
431: extern struct nexthop *nexthop_ipv4_add (struct rib *, struct in_addr *,
432: struct in_addr *);
1.1.1.2 misho 433: extern struct nexthop *nexthop_ipv4_ifindex_add (struct rib *,
434: struct in_addr *,
435: struct in_addr *,
1.1.1.4 ! misho 436: ifindex_t);
! 437: extern int nexthop_has_fib_child(struct nexthop *);
1.1 misho 438: extern void rib_lookup_and_dump (struct prefix_ipv4 *);
439: extern void rib_lookup_and_pushup (struct prefix_ipv4 *);
1.1.1.4 ! misho 440: #define rib_dump(prefix ,rib) _rib_dump(__func__, prefix, rib)
! 441: extern void _rib_dump (const char *,
! 442: union prefix46constptr, const struct rib *);
! 443: extern int rib_lookup_ipv4_route (struct prefix_ipv4 *, union sockunion *,
! 444: vrf_id_t);
1.1 misho 445: #define ZEBRA_RIB_LOOKUP_ERROR -1
446: #define ZEBRA_RIB_FOUND_EXACT 0
447: #define ZEBRA_RIB_FOUND_NOGATE 1
448: #define ZEBRA_RIB_FOUND_CONNECTED 2
449: #define ZEBRA_RIB_NOTFOUND 3
450:
451: extern struct nexthop *nexthop_ipv6_add (struct rib *, struct in6_addr *);
452:
1.1.1.4 ! misho 453: extern struct zebra_vrf *zebra_vrf_alloc (vrf_id_t);
! 454: extern struct route_table *zebra_vrf_table (afi_t, safi_t, vrf_id_t);
! 455: extern struct route_table *zebra_vrf_static_table (afi_t, safi_t, vrf_id_t);
1.1 misho 456:
457: /* NOTE:
458: * All rib_add_ipv[46]* functions will not just add prefix into RIB, but
459: * also implicitly withdraw equal prefix of same type. */
460: extern int rib_add_ipv4 (int type, int flags, struct prefix_ipv4 *p,
461: struct in_addr *gate, struct in_addr *src,
1.1.1.4 ! misho 462: ifindex_t ifindex, vrf_id_t vrf_id, int table_id,
! 463: u_int32_t, u_int32_t, u_char, safi_t);
1.1 misho 464:
1.1.1.2 misho 465: extern int rib_add_ipv4_multipath (struct prefix_ipv4 *, struct rib *, safi_t);
1.1 misho 466:
467: extern int rib_delete_ipv4 (int type, int flags, struct prefix_ipv4 *p,
1.1.1.4 ! misho 468: struct in_addr *gate, ifindex_t ifindex,
! 469: vrf_id_t, safi_t safi);
1.1 misho 470:
1.1.1.4 ! misho 471: extern struct rib *rib_match_ipv4_safi (struct in_addr addr, safi_t safi,
! 472: int skip_bgp, struct route_node **rn_out,
! 473: vrf_id_t);
! 474: extern struct rib *rib_match_ipv4_multicast (struct in_addr addr,
! 475: struct route_node **rn_out,
! 476: vrf_id_t);
1.1 misho 477:
1.1.1.4 ! misho 478: extern struct rib *rib_lookup_ipv4 (struct prefix_ipv4 *, vrf_id_t);
1.1 misho 479:
1.1.1.4 ! misho 480: extern void rib_update (vrf_id_t);
1.1 misho 481: extern void rib_weed_tables (void);
482: extern void rib_sweep_route (void);
1.1.1.4 ! misho 483: extern void rib_close_table (struct route_table *);
1.1 misho 484: extern void rib_close (void);
485: extern void rib_init (void);
1.1.1.2 misho 486: extern unsigned long rib_score_proto (u_char proto);
1.1 misho 487:
488: extern int
1.1.1.4 ! misho 489: static_add_ipv4_safi (safi_t safi, struct prefix *p, struct in_addr *gate,
! 490: const char *ifname, u_char flags, u_char distance,
! 491: vrf_id_t vrf_id);
1.1 misho 492: extern int
1.1.1.4 ! misho 493: static_delete_ipv4_safi (safi_t safi, struct prefix *p, struct in_addr *gate,
! 494: const char *ifname, u_char distance, vrf_id_t vrf_id);
1.1 misho 495:
496: extern int
497: rib_add_ipv6 (int type, int flags, struct prefix_ipv6 *p,
1.1.1.4 ! misho 498: struct in6_addr *gate, ifindex_t ifindex, vrf_id_t vrf_id,
! 499: int table_id, u_int32_t metric, u_int32_t mtu,
! 500: u_char distance, safi_t safi);
1.1 misho 501:
502: extern int
503: rib_delete_ipv6 (int type, int flags, struct prefix_ipv6 *p,
1.1.1.4 ! misho 504: struct in6_addr *gate, ifindex_t ifindex, vrf_id_t vrf_id, safi_t safi);
1.1 misho 505:
1.1.1.4 ! misho 506: extern struct rib *rib_lookup_ipv6 (struct in6_addr *, vrf_id_t);
1.1 misho 507:
1.1.1.4 ! misho 508: extern struct rib *rib_match_ipv6 (struct in6_addr *, vrf_id_t);
1.1 misho 509:
510: extern struct route_table *rib_table_ipv6;
511:
512: extern int
513: static_add_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
514: const char *ifname, u_char flags, u_char distance,
1.1.1.4 ! misho 515: vrf_id_t vrf_id);
1.1 misho 516:
517: extern int
518: static_delete_ipv6 (struct prefix *p, u_char type, struct in6_addr *gate,
1.1.1.4 ! misho 519: const char *ifname, u_char distance, vrf_id_t vrf_id);
1.1 misho 520:
1.1.1.3 misho 521: extern int rib_gc_dest (struct route_node *rn);
522: extern struct route_table *rib_tables_iter_next (rib_tables_iter_t *iter);
523:
524: /*
525: * Inline functions.
526: */
527:
528: /*
529: * rib_table_info
530: */
531: static inline rib_table_info_t *
532: rib_table_info (struct route_table *table)
533: {
534: return (rib_table_info_t *) table->info;
535: }
536:
537: /*
538: * rib_dest_from_rnode
539: */
540: static inline rib_dest_t *
541: rib_dest_from_rnode (struct route_node *rn)
542: {
543: return (rib_dest_t *) rn->info;
544: }
545:
546: /*
547: * rnode_to_ribs
548: *
549: * Returns a pointer to the list of routes corresponding to the given
550: * route_node.
551: */
552: static inline struct rib *
553: rnode_to_ribs (struct route_node *rn)
554: {
555: rib_dest_t *dest;
556:
557: dest = rib_dest_from_rnode (rn);
558: if (!dest)
559: return NULL;
560:
561: return dest->routes;
562: }
563:
564: /*
565: * rib_dest_prefix
566: */
567: static inline struct prefix *
568: rib_dest_prefix (rib_dest_t *dest)
569: {
570: return &dest->rnode->p;
571: }
572:
573: /*
574: * rib_dest_af
575: *
576: * Returns the address family that the destination is for.
577: */
578: static inline u_char
579: rib_dest_af (rib_dest_t *dest)
580: {
581: return dest->rnode->p.family;
582: }
583:
584: /*
585: * rib_dest_table
586: */
587: static inline struct route_table *
588: rib_dest_table (rib_dest_t *dest)
589: {
590: return dest->rnode->table;
591: }
592:
593: /*
594: * rib_dest_vrf
595: */
1.1.1.4 ! misho 596: static inline struct zebra_vrf *
1.1.1.3 misho 597: rib_dest_vrf (rib_dest_t *dest)
598: {
1.1.1.4 ! misho 599: return rib_table_info (rib_dest_table (dest))->zvrf;
1.1.1.3 misho 600: }
601:
602: /*
603: * rib_tables_iter_init
604: */
605: static inline void
606: rib_tables_iter_init (rib_tables_iter_t *iter)
607:
608: {
609: memset (iter, 0, sizeof (*iter));
610: iter->state = RIB_TABLES_ITER_S_INIT;
611: }
612:
613: /*
614: * rib_tables_iter_started
615: *
616: * Returns TRUE if this iterator has started iterating over the set of
617: * tables.
618: */
619: static inline int
620: rib_tables_iter_started (rib_tables_iter_t *iter)
621: {
622: return iter->state != RIB_TABLES_ITER_S_INIT;
623: }
624:
625: /*
626: * rib_tables_iter_cleanup
627: */
628: static inline void
629: rib_tables_iter_cleanup (rib_tables_iter_t *iter)
630: {
631: iter->state = RIB_TABLES_ITER_S_DONE;
632: }
633:
1.1 misho 634: #endif /*_ZEBRA_RIB_H */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>