back to topotato report
topotato coverage report
Current view: top level - zebra - rib.h (source / functions) Hit Total Coverage
Test: aggregated run ( view descriptions ) Lines: 19 21 90.5 %
Date: 2023-02-24 19:38:44 Functions: 4 4 100.0 %

          Line data    Source code
       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 along
      18             :  * with this program; see the file COPYING; if not, write to the Free Software
      19             :  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
      20             :  */
      21             : 
      22             : #ifndef _ZEBRA_RIB_H
      23             : #define _ZEBRA_RIB_H
      24             : 
      25             : #include "zebra.h"
      26             : #include "memory.h"
      27             : #include "hook.h"
      28             : #include "typesafe.h"
      29             : #include "linklist.h"
      30             : #include "prefix.h"
      31             : #include "table.h"
      32             : #include "queue.h"
      33             : #include "nexthop.h"
      34             : #include "nexthop_group.h"
      35             : #include "vrf.h"
      36             : #include "if.h"
      37             : #include "mpls.h"
      38             : #include "srcdest_table.h"
      39             : #include "zebra/zebra_nhg.h"
      40             : 
      41             : #ifdef __cplusplus
      42             : extern "C" {
      43             : #endif
      44             : 
      45             : DECLARE_MGROUP(ZEBRA);
      46             : 
      47             : DECLARE_MTYPE(RE);
      48             : 
      49             : PREDECL_LIST(rnh_list);
      50             : 
      51             : /* Nexthop structure. */
      52             : struct rnh {
      53             :         uint8_t flags;
      54             : 
      55             : #define ZEBRA_NHT_CONNECTED 0x1
      56             : #define ZEBRA_NHT_DELETED 0x2
      57             : #define ZEBRA_NHT_RESOLVE_VIA_DEFAULT 0x4
      58             : 
      59             :         /* VRF identifier. */
      60             :         vrf_id_t vrf_id;
      61             : 
      62             :         afi_t afi;
      63             :         safi_t safi;
      64             : 
      65             :         uint32_t seqno;
      66             : 
      67             :         struct route_entry *state;
      68             :         struct prefix resolved_route;
      69             :         struct list *client_list;
      70             : 
      71             :         /* pseudowires dependent on this nh */
      72             :         struct list *zebra_pseudowire_list;
      73             : 
      74             :         struct route_node *node;
      75             : 
      76             :         /*
      77             :          * if this has been filtered for the client
      78             :          */
      79             :         int filtered[ZEBRA_ROUTE_MAX];
      80             : 
      81             :         struct rnh_list_item rnh_list_item;
      82             : };
      83             : 
      84             : #define DISTANCE_INFINITY  255
      85             : #define ZEBRA_KERNEL_TABLE_MAX 252 /* support for no more than this rt tables */
      86             : 
      87             : PREDECL_LIST(re_list);
      88             : 
      89             : struct re_opaque {
      90             :         uint16_t length;
      91             :         uint8_t data[];
      92             : };
      93             : 
      94             : struct route_entry {
      95             :         /* Link list. */
      96             :         struct re_list_item next;
      97             : 
      98             :         /* Nexthop group, shared/refcounted, based on the nexthop(s)
      99             :          * provided by the owner of the route
     100             :          */
     101             :         struct nhg_hash_entry *nhe;
     102             : 
     103             :         /* Nexthop group from FIB (optional), reflecting what is actually
     104             :          * installed in the FIB if that differs. The 'backup' group is used
     105             :          * when backup nexthops are present in the route's nhg.
     106             :          */
     107             :         struct nexthop_group fib_ng;
     108             :         struct nexthop_group fib_backup_ng;
     109             : 
     110             :         /* Nexthop group hash entry IDs. The "installed" id is the id
     111             :          * used in linux/netlink, if available.
     112             :          */
     113             :         uint32_t nhe_id;
     114             :         uint32_t nhe_installed_id;
     115             : 
     116             :         /* Tag */
     117             :         route_tag_t tag;
     118             : 
     119             :         /* Uptime. */
     120             :         time_t uptime;
     121             : 
     122             :         /* Type of this route. */
     123             :         int type;
     124             : 
     125             :         /* VRF identifier. */
     126             :         vrf_id_t vrf_id;
     127             : 
     128             :         /* Which routing table */
     129             :         uint32_t table;
     130             : 
     131             :         /* Metric */
     132             :         uint32_t metric;
     133             : 
     134             :         /* MTU */
     135             :         uint32_t mtu;
     136             :         uint32_t nexthop_mtu;
     137             : 
     138             :         /* Flags of this route.
     139             :          * This flag's definition is in lib/zebra.h ZEBRA_FLAG_* and is exposed
     140             :          * to clients via Zserv
     141             :          */
     142             :         uint32_t flags;
     143             : 
     144             :         /* RIB internal status */
     145             :         uint32_t status;
     146             : #define ROUTE_ENTRY_REMOVED          0x1
     147             : /* The Route Entry has changed */
     148             : #define ROUTE_ENTRY_CHANGED          0x2
     149             : /* The Label has changed on the Route entry */
     150             : #define ROUTE_ENTRY_LABELS_CHANGED   0x4
     151             : /* Route is queued for Installation into the Data Plane */
     152             : #define ROUTE_ENTRY_QUEUED   0x8
     153             : /* Route is installed into the Data Plane */
     154             : #define ROUTE_ENTRY_INSTALLED        0x10
     155             : /* Route has Failed installation into the Data Plane in some manner */
     156             : #define ROUTE_ENTRY_FAILED           0x20
     157             : /* Route has a 'fib' set of nexthops, probably because the installed set
     158             :  * differs from the rib/normal set of nexthops.
     159             :  */
     160             : #define ROUTE_ENTRY_USE_FIB_NHG      0x40
     161             : /*
     162             :  * Route entries that are going to the dplane for a Route Replace
     163             :  * let's note the fact that this is happening.  This will
     164             :  * be useful when zebra is determing if a route can be
     165             :  * used for nexthops
     166             :  */
     167             : #define ROUTE_ENTRY_ROUTE_REPLACING 0x80
     168             : 
     169             :         /* Sequence value incremented for each dataplane operation */
     170             :         uint32_t dplane_sequence;
     171             : 
     172             :         /* Source protocol instance */
     173             :         uint16_t instance;
     174             : 
     175             :         /* Distance. */
     176             :         uint8_t distance;
     177             : 
     178             :         struct re_opaque *opaque;
     179             : };
     180             : 
     181             : #define RIB_SYSTEM_ROUTE(R) RSYSTEM_ROUTE((R)->type)
     182             : 
     183             : #define RIB_KERNEL_ROUTE(R) RKERNEL_ROUTE((R)->type)
     184             : 
     185             : /* meta-queue structure:
     186             :  * sub-queue 0: nexthop group objects
     187             :  * sub-queue 1: EVPN/VxLAN objects
     188             :  * sub-queue 2: Early Route Processing
     189             :  * sub-queue 3: Early Label Processing
     190             :  * sub-queue 4: connected
     191             :  * sub-queue 5: kernel
     192             :  * sub-queue 6: static
     193             :  * sub-queue 7: RIP, RIPng, OSPF, OSPF6, IS-IS, EIGRP, NHRP
     194             :  * sub-queue 8: iBGP, eBGP
     195             :  * sub-queue 9: any other origin (if any) typically those that
     196             :  *              don't generate routes
     197             :  */
     198             : #define MQ_SIZE 10
     199             : struct meta_queue {
     200             :         struct list *subq[MQ_SIZE];
     201             :         uint32_t size; /* sum of lengths of all subqueues */
     202             : };
     203             : 
     204             : /*
     205             :  * Structure that represents a single destination (prefix).
     206             :  */
     207             : typedef struct rib_dest_t_ {
     208             : 
     209             :         /*
     210             :          * Back pointer to the route node for this destination. This helps
     211             :          * us get to the prefix that this structure is for.
     212             :          */
     213             :         struct route_node *rnode;
     214             : 
     215             :         /*
     216             :          * Doubly-linked list of routes for this prefix.
     217             :          */
     218             :         struct re_list_head routes;
     219             : 
     220             :         struct route_entry *selected_fib;
     221             : 
     222             :         /*
     223             :          * Flags, see below.
     224             :          */
     225             :         uint32_t flags;
     226             : 
     227             :         /*
     228             :          * The list of nht prefixes that have ended up
     229             :          * depending on this route node.
     230             :          * After route processing is returned from
     231             :          * the data plane we will run evaluate_rnh
     232             :          * on these prefixes.
     233             :          */
     234             :         struct rnh_list_head nht;
     235             : 
     236             :         /*
     237             :          * Linkage to put dest on the FPM processing queue.
     238             :          */
     239             :         TAILQ_ENTRY(rib_dest_t_) fpm_q_entries;
     240             : 
     241             : } rib_dest_t;
     242             : 
     243        5204 : DECLARE_LIST(rnh_list, struct rnh, rnh_list_item);
     244       66350 : DECLARE_LIST(re_list, struct route_entry, next);
     245             : 
     246             : #define RIB_ROUTE_QUEUED(x)     (1 << (x))
     247             : // If MQ_SIZE is modified this value needs to be updated.
     248             : #define RIB_ROUTE_ANY_QUEUED 0x3F
     249             : 
     250             : /*
     251             :  * The maximum qindex that can be used.
     252             :  */
     253             : #define ZEBRA_MAX_QINDEX        (MQ_SIZE - 1)
     254             : 
     255             : /*
     256             :  * This flag indicates that a given prefix has been 'advertised' to
     257             :  * the FPM to be installed in the forwarding plane.
     258             :  */
     259             : #define RIB_DEST_SENT_TO_FPM   (1 << (ZEBRA_MAX_QINDEX + 1))
     260             : 
     261             : /*
     262             :  * This flag is set when we need to send an update to the FPM about a
     263             :  * dest.
     264             :  */
     265             : #define RIB_DEST_UPDATE_FPM    (1 << (ZEBRA_MAX_QINDEX + 2))
     266             : 
     267             : #define RIB_DEST_UPDATE_LSPS   (1 << (ZEBRA_MAX_QINDEX + 3))
     268             : 
     269             : /*
     270             :  * Macro to iterate over each route for a destination (prefix).
     271             :  */
     272             : #define RE_DEST_FOREACH_ROUTE(dest, re)                                        \
     273             :         for ((re) = (dest) ? re_list_first(&((dest)->routes)) : NULL; (re);    \
     274             :              (re) = re_list_next(&((dest)->routes), (re)))
     275             : 
     276             : /*
     277             :  * Same as above, but allows the current node to be unlinked.
     278             :  */
     279             : #define RE_DEST_FOREACH_ROUTE_SAFE(dest, re, next)                             \
     280             :         for ((re) = (dest) ? re_list_first(&((dest)->routes)) : NULL;          \
     281             :              (re) && ((next) = re_list_next(&((dest)->routes), (re)), 1);      \
     282             :              (re) = (next))
     283             : 
     284             : #define RE_DEST_FIRST_ROUTE(dest, re)                                          \
     285             :         ((re) = (dest) ? re_list_first(&((dest)->routes)) : NULL)
     286             : 
     287             : #define RE_DEST_NEXT_ROUTE(dest, re)                                           \
     288             :         ((re) = (dest) ? re_list_next(&((dest)->routes), (re)) : NULL)
     289             : 
     290             : #define RNODE_FOREACH_RE(rn, re)                                               \
     291             :         RE_DEST_FOREACH_ROUTE (rib_dest_from_rnode(rn), re)
     292             : 
     293             : #define RNODE_FOREACH_RE_SAFE(rn, re, next)                                    \
     294             :         RE_DEST_FOREACH_ROUTE_SAFE (rib_dest_from_rnode(rn), re, next)
     295             : 
     296             : #define RNODE_FIRST_RE(rn, re) RE_DEST_FIRST_ROUTE(rib_dest_from_rnode(rn), re)
     297             : 
     298             : #define RNODE_NEXT_RE(rn, re) RE_DEST_NEXT_ROUTE(rib_dest_from_rnode(rn), re)
     299             : 
     300             : /*
     301             :  * rib_table_info_t
     302             :  *
     303             :  * Structure that is hung off of a route_table that holds information about
     304             :  * the table.
     305             :  */
     306             : struct rib_table_info {
     307             : 
     308             :         /*
     309             :          * Back pointer to zebra_vrf.
     310             :          */
     311             :         struct zebra_vrf *zvrf;
     312             :         afi_t afi;
     313             :         safi_t safi;
     314             :         uint32_t table_id;
     315             : };
     316             : 
     317             : enum rib_tables_iter_state {
     318             :         RIB_TABLES_ITER_S_INIT,
     319             :         RIB_TABLES_ITER_S_ITERATING,
     320             :         RIB_TABLES_ITER_S_DONE
     321             : };
     322             : 
     323             : /*
     324             :  * Structure that holds state for iterating over all tables in the
     325             :  * Routing Information Base.
     326             :  */
     327             : typedef struct rib_tables_iter_t_ {
     328             :         vrf_id_t vrf_id;
     329             :         int afi_safi_ix;
     330             : 
     331             :         enum rib_tables_iter_state state;
     332             : } rib_tables_iter_t;
     333             : 
     334             : /* Events/reasons triggering a RIB update. */
     335             : enum rib_update_event {
     336             :         RIB_UPDATE_KERNEL,
     337             :         RIB_UPDATE_RMAP_CHANGE,
     338             :         RIB_UPDATE_OTHER,
     339             :         RIB_UPDATE_MAX
     340             : };
     341             : 
     342             : int route_entry_update_nhe(struct route_entry *re,
     343             :                            struct nhg_hash_entry *new_nhghe);
     344             : 
     345             : /* NHG replace has happend, we have to update route_entry pointers to new one */
     346             : void rib_handle_nhg_replace(struct nhg_hash_entry *old_entry,
     347             :                             struct nhg_hash_entry *new_entry);
     348             : 
     349             : #define route_entry_dump(prefix, src, re) _route_entry_dump(__func__, prefix, src, re)
     350             : extern void _route_entry_dump(const char *func, union prefixconstptr pp,
     351             :                               union prefixconstptr src_pp,
     352             :                               const struct route_entry *re);
     353             : 
     354             : struct route_entry *
     355             : zebra_rib_route_entry_new(vrf_id_t vrf_id, int type, uint8_t instance,
     356             :                           uint32_t flags, uint32_t nhe_id, uint32_t table_id,
     357             :                           uint32_t metric, uint32_t mtu, uint8_t distance,
     358             :                           route_tag_t tag);
     359             : 
     360             : #define ZEBRA_RIB_LOOKUP_ERROR -1
     361             : #define ZEBRA_RIB_FOUND_EXACT 0
     362             : #define ZEBRA_RIB_FOUND_NOGATE 1
     363             : #define ZEBRA_RIB_FOUND_CONNECTED 2
     364             : #define ZEBRA_RIB_NOTFOUND 3
     365             : 
     366             : extern int is_zebra_valid_kernel_table(uint32_t table_id);
     367             : extern int is_zebra_main_routing_table(uint32_t table_id);
     368             : extern int zebra_check_addr(const struct prefix *p);
     369             : 
     370             : extern void rib_delnode(struct route_node *rn, struct route_entry *re);
     371             : extern void rib_install_kernel(struct route_node *rn, struct route_entry *re,
     372             :                                struct route_entry *old);
     373             : extern void rib_uninstall_kernel(struct route_node *rn, struct route_entry *re);
     374             : 
     375             : /* NOTE:
     376             :  * All rib_add function will not just add prefix into RIB, but
     377             :  * also implicitly withdraw equal prefix of same type. */
     378             : extern int rib_add(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
     379             :                    unsigned short instance, uint32_t flags, struct prefix *p,
     380             :                    struct prefix_ipv6 *src_p, const struct nexthop *nh,
     381             :                    uint32_t nhe_id, uint32_t table_id, uint32_t metric,
     382             :                    uint32_t mtu, uint8_t distance, route_tag_t tag,
     383             :                    bool startup);
     384             : /*
     385             :  * Multipath route apis.
     386             :  */
     387             : extern int rib_add_multipath(afi_t afi, safi_t safi, struct prefix *p,
     388             :                              struct prefix_ipv6 *src_p, struct route_entry *re,
     389             :                              struct nexthop_group *ng, bool startup);
     390             : /*
     391             :  * -1 -> some sort of error
     392             :  *  0 -> an add
     393             :  *  1 -> an update
     394             :  */
     395             : extern int rib_add_multipath_nhe(afi_t afi, safi_t safi, struct prefix *p,
     396             :                                  struct prefix_ipv6 *src_p,
     397             :                                  struct route_entry *re,
     398             :                                  struct nhg_hash_entry *nhe, bool startup);
     399             : 
     400             : extern void rib_delete(afi_t afi, safi_t safi, vrf_id_t vrf_id, int type,
     401             :                        unsigned short instance, uint32_t flags,
     402             :                        struct prefix *p, struct prefix_ipv6 *src_p,
     403             :                        const struct nexthop *nh, uint32_t nhe_id,
     404             :                        uint32_t table_id, uint32_t metric, uint8_t distance,
     405             :                        bool fromkernel);
     406             : 
     407             : extern struct route_entry *rib_match(afi_t afi, safi_t safi, vrf_id_t vrf_id,
     408             :                                      const union g_addr *addr,
     409             :                                      struct route_node **rn_out);
     410             : extern struct route_entry *rib_match_ipv4_multicast(vrf_id_t vrf_id,
     411             :                                                     struct in_addr addr,
     412             :                                                     struct route_node **rn_out);
     413             : extern struct route_entry *rib_match_ipv6_multicast(vrf_id_t vrf_id,
     414             :                                                     struct in6_addr addr,
     415             :                                                     struct route_node **rn_out);
     416             : 
     417             : extern struct route_entry *rib_lookup_ipv4(struct prefix_ipv4 *p,
     418             :                                            vrf_id_t vrf_id);
     419             : 
     420             : extern void rib_update(enum rib_update_event event);
     421             : extern void rib_update_table(struct route_table *table,
     422             :                              enum rib_update_event event, int rtype);
     423             : extern void rib_sweep_route(struct thread *t);
     424             : extern void rib_sweep_table(struct route_table *table);
     425             : extern void rib_close_table(struct route_table *table);
     426             : extern void rib_init(void);
     427             : extern unsigned long rib_score_proto(uint8_t proto, unsigned short instance);
     428             : extern unsigned long rib_score_proto_table(uint8_t proto,
     429             :                                            unsigned short instance,
     430             :                                            struct route_table *table);
     431             : 
     432             : extern int rib_queue_add(struct route_node *rn);
     433             : 
     434             : struct nhg_ctx; /* Forward declaration */
     435             : 
     436             : /* Enqueue incoming nhg from OS for processing */
     437             : extern int rib_queue_nhg_ctx_add(struct nhg_ctx *ctx);
     438             : 
     439             : /* Enqueue incoming nhg from proto daemon for processing */
     440             : extern int rib_queue_nhe_add(struct nhg_hash_entry *nhe);
     441             : 
     442             : /* Enqueue evpn route for processing */
     443             : int zebra_rib_queue_evpn_route_add(vrf_id_t vrf_id, const struct ethaddr *rmac,
     444             :                                    const struct ipaddr *vtep_ip,
     445             :                                    const struct prefix *host_prefix);
     446             : int zebra_rib_queue_evpn_route_del(vrf_id_t vrf_id,
     447             :                                    const struct ipaddr *vtep_ip,
     448             :                                    const struct prefix *host_prefix);
     449             : /* Enqueue EVPN remote ES for processing */
     450             : int zebra_rib_queue_evpn_rem_es_add(const esi_t *esi,
     451             :                                     const struct in_addr *vtep_ip,
     452             :                                     bool esr_rxed, uint8_t df_alg,
     453             :                                     uint16_t df_pref);
     454             : int zebra_rib_queue_evpn_rem_es_del(const esi_t *esi,
     455             :                                     const struct in_addr *vtep_ip);
     456             : /* Enqueue EVPN remote macip update for processing */
     457             : int zebra_rib_queue_evpn_rem_macip_del(vni_t vni, const struct ethaddr *macaddr,
     458             :                                        const struct ipaddr *ip,
     459             :                                        struct in_addr vtep_ip);
     460             : int zebra_rib_queue_evpn_rem_macip_add(vni_t vni, const struct ethaddr *macaddr,
     461             :                                        const struct ipaddr *ipaddr,
     462             :                                        uint8_t flags, uint32_t seq,
     463             :                                        struct in_addr vtep_ip,
     464             :                                        const esi_t *esi);
     465             : /* Enqueue VXLAN remote vtep update for processing */
     466             : int zebra_rib_queue_evpn_rem_vtep_add(vrf_id_t vrf_id, vni_t vni,
     467             :                                       struct in_addr vtep_ip,
     468             :                                       int flood_control);
     469             : int zebra_rib_queue_evpn_rem_vtep_del(vrf_id_t vrf_id, vni_t vni,
     470             :                                       struct in_addr vtep_ip);
     471             : 
     472             : extern void meta_queue_free(struct meta_queue *mq, struct zebra_vrf *zvrf);
     473             : extern int zebra_rib_labeled_unicast(struct route_entry *re);
     474             : extern struct route_table *rib_table_ipv6;
     475             : 
     476             : extern void rib_unlink(struct route_node *rn, struct route_entry *re);
     477             : extern int rib_gc_dest(struct route_node *rn);
     478             : extern struct route_table *rib_tables_iter_next(rib_tables_iter_t *iter);
     479             : 
     480             : extern uint8_t route_distance(int type);
     481             : 
     482             : extern void zebra_rib_evaluate_rn_nexthops(struct route_node *rn, uint32_t seq,
     483             :                                            bool rt_delete);
     484             : 
     485             : extern struct route_node *
     486             : rib_find_rn_from_ctx(const struct zebra_dplane_ctx *ctx);
     487             : 
     488             : /*
     489             :  * Inline functions.
     490             :  */
     491             : 
     492             : /*
     493             :  * rib_table_info
     494             :  */
     495        6028 : static inline struct rib_table_info *rib_table_info(struct route_table *table)
     496             : {
     497        6028 :         return (struct rib_table_info *)route_table_get_info(table);
     498             : }
     499             : 
     500             : /*
     501             :  * rib_dest_from_rnode
     502             :  */
     503       51002 : static inline rib_dest_t *rib_dest_from_rnode(struct route_node *rn)
     504             : {
     505       58130 :         return (rib_dest_t *)rn->info;
     506             : }
     507             : 
     508             : /*
     509             :  * rnode_to_ribs
     510             :  *
     511             :  * Returns a pointer to the list of routes corresponding to the given
     512             :  * route_node.
     513             :  */
     514        2602 : static inline struct route_entry *rnode_to_ribs(struct route_node *rn)
     515             : {
     516        2602 :         rib_dest_t *dest;
     517             : 
     518        2602 :         dest = rib_dest_from_rnode(rn);
     519        2602 :         if (!dest)
     520             :                 return NULL;
     521             : 
     522        2602 :         return re_list_first(&dest->routes);
     523             : }
     524             : 
     525             : /*
     526             :  * rib_dest_prefix
     527             :  */
     528             : static inline struct prefix *rib_dest_prefix(rib_dest_t *dest)
     529             : {
     530             :         return &dest->rnode->p;
     531             : }
     532             : 
     533             : /*
     534             :  * rib_dest_af
     535             :  *
     536             :  * Returns the address family that the destination is for.
     537             :  */
     538             : static inline uint8_t rib_dest_af(rib_dest_t *dest)
     539             : {
     540             :         return dest->rnode->p.family;
     541             : }
     542             : 
     543             : /*
     544             :  * rib_dest_table
     545             :  */
     546        6028 : static inline struct route_table *rib_dest_table(rib_dest_t *dest)
     547             : {
     548       12056 :         return srcdest_rnode_table(dest->rnode);
     549             : }
     550             : 
     551             : /*
     552             :  * rib_dest_vrf
     553             :  */
     554        6028 : static inline struct zebra_vrf *rib_dest_vrf(rib_dest_t *dest)
     555             : {
     556        6028 :         return rib_table_info(rib_dest_table(dest))->zvrf;
     557             : }
     558             : 
     559             : /*
     560             :  * Create the rib_dest_t and attach it to the specified node
     561             :  */
     562             : extern rib_dest_t *zebra_rib_create_dest(struct route_node *rn);
     563             : 
     564             : /*
     565             :  * rib_tables_iter_init
     566             :  */
     567             : static inline void rib_tables_iter_init(rib_tables_iter_t *iter)
     568             : 
     569             : {
     570             :         memset(iter, 0, sizeof(*iter));
     571             :         iter->state = RIB_TABLES_ITER_S_INIT;
     572             : }
     573             : 
     574             : /*
     575             :  * rib_tables_iter_started
     576             :  *
     577             :  * Returns true if this iterator has started iterating over the set of
     578             :  * tables.
     579             :  */
     580             : static inline int rib_tables_iter_started(rib_tables_iter_t *iter)
     581             : {
     582             :         return iter->state != RIB_TABLES_ITER_S_INIT;
     583             : }
     584             : 
     585             : /*
     586             :  * rib_tables_iter_cleanup
     587             :  */
     588             : static inline void rib_tables_iter_cleanup(rib_tables_iter_t *iter)
     589             : {
     590             :         iter->state = RIB_TABLES_ITER_S_DONE;
     591             : }
     592             : 
     593             : DECLARE_HOOK(rib_update, (struct route_node * rn, const char *reason),
     594             :              (rn, reason));
     595             : DECLARE_HOOK(rib_shutdown, (struct route_node * rn), (rn));
     596             : 
     597             : /*
     598             :  * Access installed/fib nexthops, which may be a subset of the
     599             :  * rib nexthops.
     600             :  */
     601         222 : static inline struct nexthop_group *rib_get_fib_nhg(struct route_entry *re)
     602             : {
     603             :         /* If the fib set is a subset of the active rib set,
     604             :          * use the dedicated fib list.
     605             :          */
     606         222 :         if (CHECK_FLAG(re->status, ROUTE_ENTRY_USE_FIB_NHG))
     607           0 :                 return &(re->fib_ng);
     608             :         else
     609         222 :                 return &(re->nhe->nhg);
     610             : }
     611             : 
     612             : /*
     613             :  * Access backup nexthop-group that represents the installed backup nexthops;
     614             :  * any installed backup will be on the fib list.
     615             :  */
     616           0 : static inline struct nexthop_group *rib_get_fib_backup_nhg(
     617             :         struct route_entry *re)
     618             : {
     619         147 :         return &(re->fib_backup_ng);
     620             : }
     621             : 
     622             : extern void zebra_vty_init(void);
     623             : 
     624             : extern pid_t pid;
     625             : 
     626             : extern bool v6_rr_semantics;
     627             : 
     628             : #ifdef __cplusplus
     629             : }
     630             : #endif
     631             : 
     632             : #endif /*_ZEBRA_RIB_H */

Generated by: LCOV version v1.16-topotato