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>