1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
// SPDX-License-Identifier: GPL-2.0-or-later
/*
* NS related header.
* Copyright (C) 2014 6WIND S.A.
*/
#ifndef _ZEBRA_NS_H
#define _ZEBRA_NS_H
#include "openbsd-tree.h"
#include "linklist.h"
#include "vty.h"
#ifdef __cplusplus
extern "C" {
#endif
typedef uint32_t ns_id_t;
/* the default NS ID */
#define NS_UNKNOWN UINT32_MAX
/* Default netns directory (Linux) */
#define NS_RUN_DIR "/var/run/netns"
#ifdef HAVE_NETNS
#define NS_DEFAULT_NAME "/proc/self/ns/net"
#else /* !HAVE_NETNS */
#define NS_DEFAULT_NAME "default-netns"
#endif /* HAVE_NETNS */
struct ns {
RB_ENTRY(ns) entry;
/* Identifier, same as the vector index */
ns_id_t ns_id;
/* Identifier, mapped on the NSID value */
ns_id_t internal_ns_id;
/* Identifier, value of NSID of default netns,
* relative value in that local netns
*/
ns_id_t relative_default_ns;
/* Name */
char *name;
/* File descriptor */
int fd;
/* Master list of interfaces belonging to this NS */
struct list *iflist;
/* Back Pointer to VRF */
void *vrf_ctxt;
/* User data */
void *info;
};
RB_HEAD(ns_head, ns);
RB_PROTOTYPE(ns_head, ns, entry, ns_compare)
/*
* API for managing NETNS. eg from zebra daemon
* one want to manage the list of NETNS, etc...
*/
/*
* NS hooks
*/
#define NS_NEW_HOOK 0 /* a new netns is just created */
#define NS_DELETE_HOOK 1 /* a netns is to be deleted */
#define NS_ENABLE_HOOK 2 /* a netns is ready to use */
#define NS_DISABLE_HOOK 3 /* a netns is to be unusable */
/*
* Add a specific hook ns module.
* @param1: hook type
* @param2: the callback function
* - param 1: the NS ID
* - param 2: the address of the user data pointer (the user data
* can be stored in or freed from there)
*/
extern void ns_add_hook(int type, int (*)(struct ns *));
/*
* NS initializer/destructor
*/
extern void ns_terminate(void);
/* API to initialize NETNS managerment
* parameter is the default ns_id
*/
extern void ns_init_management(ns_id_t ns_id, ns_id_t internal_ns_idx);
/*
* NS utilities
*/
/* Create a socket serving for the given NS
*/
int ns_socket(int domain, int type, int protocol, ns_id_t ns_id);
/* return the path of the NETNS */
extern char *ns_netns_pathname(struct vty *vty, const char *name);
/* Parse and execute a function on all the NETNS */
#define NS_WALK_CONTINUE 0
#define NS_WALK_STOP 1
extern void ns_walk_func(int (*func)(struct ns *,
void *,
void **),
void *param_in,
void **param_out);
/* API to get the NETNS name, from the ns pointer */
extern const char *ns_get_name(struct ns *ns);
/* only called from vrf ( when removing netns from vrf)
* or at VRF termination
*/
extern void ns_delete(struct ns *ns);
/* return > 0 if netns is available
* called by VRF to check netns backend is available for VRF
*/
extern int ns_have_netns(void);
/* API to get context information of a NS */
extern void *ns_info_lookup(ns_id_t ns_id);
/* API to map internal ns id value with
* user friendly ns id external value
*/
extern ns_id_t ns_map_nsid_with_external(ns_id_t ns_id, bool map);
/*
* NS init routine
* should be called from backendx
*/
extern void ns_init(void);
#define NS_DEFAULT 0
/* API that can be used to change from NS */
extern int ns_switchback_to_initial(void);
extern int ns_switch_to_netns(const char *netns_name);
/*
* NS handling routines.
* called by modules that use NS backend
*/
/* API to search for already present NETNS */
extern struct ns *ns_lookup(ns_id_t ns_id);
extern struct ns *ns_lookup_name(const char *name);
/* API to handle NS : creation, enable, disable
* for enable, a callback function is passed as parameter
* the callback belongs to the module that uses NS as backend
* upon enabling the NETNS, the upper layer is informed
*/
extern int ns_enable(struct ns *ns, void (*func)(ns_id_t, void *));
extern struct ns *ns_get_created(struct ns *ns, char *name, ns_id_t ns_id);
extern ns_id_t ns_id_get_absolute(ns_id_t ns_id_reference, ns_id_t link_nsid);
extern void ns_disable(struct ns *ns);
extern struct ns *ns_get_default(void);
#ifdef __cplusplus
}
#endif
#endif /*_ZEBRA_NS_H*/
|