back to topotato report
topotato coverage report
Current view: top level - lib - vrf.h (source / functions) Hit Total Coverage
Test: test_bgp_ecmp_enhe.py::BGP_Unnumbered_ECMP Lines: 6 6 100.0 %
Date: 2023-11-16 17:19:14 Functions: 0 0 -

          Line data    Source code
       1             : // SPDX-License-Identifier: GPL-2.0-or-later
       2             : /*
       3             :  * VRF related header.
       4             :  * Copyright (C) 2014 6WIND S.A.
       5             :  */
       6             : 
       7             : #ifndef _ZEBRA_VRF_H
       8             : #define _ZEBRA_VRF_H
       9             : 
      10             : #include "openbsd-tree.h"
      11             : #include "linklist.h"
      12             : #include "qobj.h"
      13             : #include "vty.h"
      14             : #include "ns.h"
      15             : 
      16             : #ifdef __cplusplus
      17             : extern "C" {
      18             : #endif
      19             : 
      20             : /* The default VRF ID */
      21             : #define VRF_UNKNOWN UINT32_MAX
      22             : 
      23             : /* Pending: May need to refine this. */
      24             : #ifndef IFLA_VRF_MAX
      25             : enum { IFLA_VRF_UNSPEC, IFLA_VRF_TABLE, __IFLA_VRF_MAX };
      26             : 
      27             : #define IFLA_VRF_MAX (__IFLA_VRF_MAX - 1)
      28             : #endif
      29             : 
      30             : #define VRF_NAMSIZ      36
      31             : #define NS_NAMSIZ 36
      32             : 
      33             : /*
      34             :  * The command strings
      35             :  */
      36             : #define VRF_CMD_HELP_STR    "Specify the VRF\nThe VRF name\n"
      37             : #define VRF_ALL_CMD_HELP_STR    "Specify the VRF\nAll VRFs\n"
      38             : #define VRF_FULL_CMD_HELP_STR   "Specify the VRF\nThe VRF name\nAll VRFs\n"
      39             : 
      40             : #define FRR_VRF_XPATH "/frr-vrf:lib/vrf"
      41             : #define FRR_VRF_KEY_XPATH "/frr-vrf:lib/vrf[name='%s']"
      42             : 
      43             : /*
      44             :  * Pass some OS specific data up through
      45             :  * to the daemons
      46             :  */
      47             : struct vrf_data {
      48             :         union {
      49             :                 struct {
      50             :                         uint32_t table_id;
      51             :                         char netns_name[NS_NAMSIZ];
      52             :                 } l;
      53             :         };
      54             : };
      55             : 
      56             : struct vrf {
      57             :         RB_ENTRY(vrf) id_entry, name_entry;
      58             : 
      59             :         /* Identifier, same as the vector index */
      60             :         vrf_id_t vrf_id;
      61             : 
      62             :         /* Name */
      63             :         char name[VRF_NAMSIZ + 1];
      64             : 
      65             :         /* Zebra internal VRF status */
      66             :         uint8_t status;
      67             : #define VRF_ACTIVE     (1 << 0) /* VRF is up in kernel */
      68             : #define VRF_CONFIGURED (1 << 1) /* VRF has some FRR configuration */
      69             : 
      70             :         /* Interfaces belonging to this VRF */
      71             :         struct if_name_head ifaces_by_name;
      72             :         struct if_index_head ifaces_by_index;
      73             : 
      74             :         /* User data */
      75             :         void *info;
      76             : 
      77             :         /* The table_id from the kernel */
      78             :         struct vrf_data data;
      79             : 
      80             :         /* Back pointer to namespace context */
      81             :         void *ns_ctxt;
      82             : 
      83             :         QOBJ_FIELDS;
      84             : };
      85             : RB_HEAD(vrf_id_head, vrf);
      86        1560 : RB_PROTOTYPE(vrf_id_head, vrf, id_entry, vrf_id_compare)
      87             : RB_HEAD(vrf_name_head, vrf);
      88          96 : RB_PROTOTYPE(vrf_name_head, vrf, name_entry, vrf_name_compare)
      89             : DECLARE_QOBJ_TYPE(vrf);
      90             : 
      91             : /* Allow VRF with netns as backend */
      92             : enum vrf_backend_type {
      93             :         VRF_BACKEND_VRF_LITE,
      94             :         VRF_BACKEND_NETNS,
      95             :         VRF_BACKEND_UNKNOWN,
      96             :         VRF_BACKEND_MAX,
      97             : };
      98             : 
      99             : extern struct vrf_id_head vrfs_by_id;
     100             : extern struct vrf_name_head vrfs_by_name;
     101             : 
     102             : extern struct vrf *vrf_lookup_by_id(vrf_id_t);
     103             : extern struct vrf *vrf_lookup_by_name(const char *);
     104             : extern struct vrf *vrf_get(vrf_id_t, const char *);
     105             : extern struct vrf *vrf_update(vrf_id_t new_vrf_id, const char *name);
     106             : extern const char *vrf_id_to_name(vrf_id_t vrf_id);
     107             : 
     108             : #define VRF_LOGNAME(V) V ? V->name : "Unknown"
     109             : 
     110             : #define VRF_GET_ID(V, NAME, USE_JSON)                                          \
     111             :         do {                                                                   \
     112             :                 struct vrf *_vrf;                                              \
     113             :                 if (!(_vrf = vrf_lookup_by_name(NAME))) {                      \
     114             :                         if (USE_JSON) {                                        \
     115             :                                 vty_out(vty, "{}\n");                          \
     116             :                         } else {                                               \
     117             :                                 vty_out(vty, "%% VRF %s not found\n", NAME);   \
     118             :                         }                                                      \
     119             :                         return CMD_WARNING;                                    \
     120             :                 }                                                              \
     121             :                 if (_vrf->vrf_id == VRF_UNKNOWN) {                             \
     122             :                         if (USE_JSON) {                                        \
     123             :                                 vty_out(vty, "{}\n");                          \
     124             :                         } else {                                               \
     125             :                                 vty_out(vty, "%% VRF %s not active\n", NAME);  \
     126             :                         }                                                      \
     127             :                         return CMD_WARNING;                                    \
     128             :                 }                                                              \
     129             :                 (V) = _vrf->vrf_id;                                            \
     130             :         } while (0)
     131             : 
     132             : /*
     133             :  * Check whether the VRF is enabled.
     134             :  */
     135          32 : static inline int vrf_is_enabled(struct vrf *vrf)
     136             : {
     137          32 :         return vrf && CHECK_FLAG(vrf->status, VRF_ACTIVE);
     138             : }
     139             : 
     140             : /* check if the vrf is user configured */
     141           4 : static inline int vrf_is_user_cfged(struct vrf *vrf)
     142             : {
     143           4 :         return vrf && CHECK_FLAG(vrf->status, VRF_CONFIGURED);
     144             : }
     145             : 
     146             : static inline uint32_t vrf_interface_count(struct vrf *vrf)
     147             : {
     148             :         uint32_t count = 0;
     149             :         struct interface *ifp;
     150             : 
     151             :         RB_FOREACH (ifp, if_name_head, &vrf->ifaces_by_name) {
     152             :                 /* skip the l3mdev */
     153             :                 if (strncmp(ifp->name, vrf->name, VRF_NAMSIZ) == 0)
     154             :                         continue;
     155             :                 count++;
     156             :         }
     157             :         return count;
     158             : }
     159             : 
     160             : /*
     161             :  * Utilities to obtain the user data
     162             :  */
     163             : 
     164             : /* Look up the data pointer of the specified VRF. */
     165             : extern void *vrf_info_lookup(vrf_id_t);
     166             : 
     167             : /*
     168             :  * VRF bit-map: maintaining flags, one bit per VRF ID
     169             :  */
     170             : typedef void *vrf_bitmap_t;
     171             : #define VRF_BITMAP_NULL     NULL
     172             : 
     173             : extern void vrf_bitmap_init(vrf_bitmap_t *pbmap);
     174             : extern void vrf_bitmap_free(vrf_bitmap_t *pbmap);
     175             : extern void vrf_bitmap_set(vrf_bitmap_t *pbmap, vrf_id_t vrf_id);
     176             : extern void vrf_bitmap_unset(vrf_bitmap_t *pbmap, vrf_id_t vrf_id);
     177             : extern int vrf_bitmap_check(vrf_bitmap_t *pbmap, vrf_id_t vrf_id);
     178             : 
     179             : /*
     180             :  * VRF initializer/destructor
     181             :  *
     182             :  * create -> Called back when a new VRF is created.  This
     183             :  *           can be either through these 3 options:
     184             :  *           1) CLI mentions a vrf before OS knows about it
     185             :  *           2) OS calls zebra and we create the vrf from OS
     186             :  *              callback
     187             :  *           3) zebra calls individual protocols to notify
     188             :  *              about the new vrf
     189             :  *
     190             :  * enable -> Called back when a VRF is actually usable from
     191             :  *           an OS perspective ( 2 and 3 above )
     192             :  *
     193             :  * disable -> Called back when a VRF is being deleted from
     194             :  *            the system ( 2 and 3 ) above
     195             :  *
     196             :  * delete -> Called back when a vrf is being deleted from
     197             :  *           the system ( 2 and 3 ) above.
     198             :  */
     199             : extern void vrf_init(int (*create)(struct vrf *vrf),
     200             :                      int (*enable)(struct vrf *vrf),
     201             :                      int (*disable)(struct vrf *vrf),
     202             :                      int (*destroy)(struct vrf *vrf));
     203             : 
     204             : /*
     205             :  * Call vrf_terminate when the protocol is being shutdown
     206             :  */
     207             : extern void vrf_terminate(void);
     208             : 
     209             : /*
     210             :  * Utilities to create networks objects,
     211             :  * or call network operations
     212             :  */
     213             : 
     214             : /*
     215             :  * Create a new socket associated with a VRF.
     216             :  *
     217             :  * This is a wrapper that ensures correct behavior when using namespace VRFs.
     218             :  * In the namespace case, the socket is created within the namespace. In the
     219             :  * non-namespace case, this is equivalent to socket().
     220             :  *
     221             :  * If name is provided, this is provided to vrf_bind() to bind the socket to
     222             :  * the VRF. This is only relevant when using VRF-lite.
     223             :  *
     224             :  * Summary:
     225             :  * - Namespace: pass vrf_id but not name
     226             :  * - VRF-lite: pass vrf_id and name of VRF device to bind to
     227             :  * - VRF-lite, no binding: pass vrf_id but not name, or just use socket()
     228             :  */
     229             : extern int vrf_socket(int domain, int type, int protocol, vrf_id_t vrf_id,
     230             :                       const char *name);
     231             : 
     232             : extern int vrf_sockunion_socket(const union sockunion *su, vrf_id_t vrf_id,
     233             :                                 const char *name);
     234             : 
     235             : /*
     236             :  * Binds a socket to an interface (ifname) in a VRF (vrf_id).
     237             :  *
     238             :  * If ifname is NULL or is equal to the VRF name then bind to a VRF device.
     239             :  * Otherwise, bind to the specified interface in the specified VRF.
     240             :  *
     241             :  * Returns 0 on success and -1 on failure.
     242             :  */
     243             : extern int vrf_bind(vrf_id_t vrf_id, int fd, const char *ifname);
     244             : 
     245             : /* VRF ioctl operations */
     246             : extern int vrf_getaddrinfo(const char *node, const char *service,
     247             :                            const struct addrinfo *hints, struct addrinfo **res,
     248             :                            vrf_id_t vrf_id);
     249             : 
     250             : extern int vrf_ioctl(vrf_id_t vrf_id, int d, unsigned long request, char *args);
     251             : 
     252             : /* The default VRF ID */
     253             : #define VRF_DEFAULT 0
     254             : 
     255             : /* Must be called only during startup, before config is read */
     256             : extern void vrf_set_default_name(const char *default_name);
     257             : 
     258             : extern const char *vrf_get_default_name(void);
     259             : #define VRF_DEFAULT_NAME    vrf_get_default_name()
     260             : 
     261             : /* VRF switch from NETNS */
     262             : extern int vrf_switch_to_netns(vrf_id_t vrf_id);
     263             : extern int vrf_switchback_to_initial(void);
     264             : 
     265             : /*
     266             :  * VRF backend routines
     267             :  * should be called from zebra only
     268             :  */
     269             : 
     270             : /* VRF vty command initialisation
     271             :  */
     272             : extern void vrf_cmd_init(int (*writefunc)(struct vty *vty));
     273             : 
     274             : /* VRF vty debugging
     275             :  */
     276             : extern void vrf_install_commands(void);
     277             : 
     278             : /*
     279             :  * VRF utilities
     280             :  */
     281             : 
     282             : /*
     283             :  * API for configuring VRF backend
     284             :  */
     285             : extern int vrf_configure_backend(enum vrf_backend_type backend);
     286             : extern int vrf_get_backend(void);
     287             : extern int vrf_is_backend_netns(void);
     288             : 
     289             : /* used internally to enable or disable VRF.
     290             :  * Notify a change in the VRF ID of the VRF
     291             :  */
     292             : extern void vrf_disable(struct vrf *vrf);
     293             : extern int vrf_enable(struct vrf *vrf);
     294             : extern void vrf_delete(struct vrf *vrf);
     295             : 
     296             : extern const struct frr_yang_module_info frr_vrf_info;
     297             : 
     298             : #ifdef __cplusplus
     299             : }
     300             : #endif
     301             : 
     302             : #endif /*_ZEBRA_VRF_H*/

Generated by: LCOV version v1.16-topotato