back to topotato report
topotato coverage report
Current view: top level - lib - vrf.h (source / functions) Hit Total Coverage
Test: test_pim6_basic.py::PIM6Basic Lines: 6 6 100.0 %
Date: 2023-02-24 18:38:38 Functions: 0 0 -

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

Generated by: LCOV version v1.16-topotato