diff options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/vrf.c | 59 | ||||
| -rw-r--r-- | lib/vrf.h | 12 | ||||
| -rw-r--r-- | lib/zclient.c | 3 |
3 files changed, 61 insertions, 13 deletions
@@ -39,6 +39,7 @@ /* default VRF ID value used when VRF backend is not NETNS */ #define VRF_DEFAULT_INTERNAL 0 +#define VRF_DEFAULT_NAME_INTERNAL "default" DEFINE_MTYPE_STATIC(LIB, VRF, "VRF") DEFINE_MTYPE_STATIC(LIB, VRF_BITMAP, "VRF bit-map") @@ -56,6 +57,7 @@ struct vrf_name_head vrfs_by_name = RB_INITIALIZER(&vrfs_by_name); static int vrf_backend; static struct zebra_privs_t *vrf_daemon_privs; +static char vrf_default_name[VRF_NAMSIZ] = VRF_DEFAULT_NAME_INTERNAL; /* * Turn on/off debug code @@ -69,6 +71,7 @@ struct vrf_master { int (*vrf_delete_hook)(struct vrf *); int (*vrf_enable_hook)(struct vrf *); int (*vrf_disable_hook)(struct vrf *); + int (*vrf_update_name_hook)(struct vrf *vrf); } vrf_master = { 0, }; @@ -165,6 +168,13 @@ struct vrf *vrf_get(vrf_id_t vrf_id, const char *name) */ if (name) vrf = vrf_lookup_by_name(name); + if (vrf && vrf_id != VRF_UNKNOWN + && vrf->vrf_id != VRF_UNKNOWN + && vrf->vrf_id != vrf_id) { + zlog_debug("VRF_GET: avoid %s creation(%u), same name exists (%u)", + name, vrf_id, vrf->vrf_id); + return NULL; + } /* Try to find VRF both by ID and name */ if (!vrf && vrf_id != VRF_UNKNOWN) vrf = vrf_lookup_by_id(vrf_id); @@ -445,10 +455,8 @@ static void vrf_autocomplete(vector comps, struct cmd_token *token) { struct vrf *vrf = NULL; - RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) { - if (vrf->vrf_id != VRF_DEFAULT) - vector_set(comps, XSTRDUP(MTYPE_COMPLETION, vrf->name)); - } + RB_FOREACH (vrf, vrf_name_head, &vrfs_by_name) + vector_set(comps, XSTRDUP(MTYPE_COMPLETION, vrf->name)); } static const struct cmd_variable_handler vrf_var_handlers[] = { @@ -461,7 +469,8 @@ static const struct cmd_variable_handler vrf_var_handlers[] = { /* Initialize VRF module. */ void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *), - int (*disable)(struct vrf *), int (*delete)(struct vrf *)) + int (*disable)(struct vrf *), int (*delete)(struct vrf *), + int ((*update)(struct vrf *))) { struct vrf *default_vrf; @@ -475,6 +484,7 @@ void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *), vrf_master.vrf_enable_hook = enable; vrf_master.vrf_disable_hook = disable; vrf_master.vrf_delete_hook = delete; + vrf_master.vrf_update_name_hook = update; /* The default VRF always exists. */ default_vrf = vrf_get(VRF_DEFAULT, VRF_DEFAULT_NAME); @@ -483,6 +493,9 @@ void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *), "vrf_init: failed to create the default VRF!"); exit(1); } + if (vrf_is_backend_netns()) + strlcpy(default_vrf->data.l.netns_name, + VRF_DEFAULT_NAME, NS_NAMSIZ); /* Enable the default VRF. */ if (!vrf_enable(default_vrf)) { @@ -876,12 +889,40 @@ void vrf_cmd_init(int (*writefunc)(struct vty *vty), } } -vrf_id_t vrf_get_default_id(void) +void vrf_set_default_name(const char *default_name) { - struct vrf *vrf = vrf_lookup_by_name(VRF_DEFAULT_NAME); + struct vrf *def_vrf; + struct vrf *vrf_with_default_name = NULL; - if (vrf) - return vrf->vrf_id; + def_vrf = vrf_lookup_by_id(VRF_DEFAULT); + assert(default_name); + vrf_with_default_name = vrf_lookup_by_name(default_name); + if (vrf_with_default_name && vrf_with_default_name != def_vrf) { + /* vrf name already used by an other VRF */ + zlog_debug("VRF: %s, avoid changing name to %s, same name exists (%u)", + vrf_with_default_name->name, default_name, + vrf_with_default_name->vrf_id); + return; + } + snprintf(vrf_default_name, VRF_NAMSIZ, "%s", default_name); + if (def_vrf) { + RB_REMOVE(vrf_name_head, &vrfs_by_name, def_vrf); + strlcpy(def_vrf->data.l.netns_name, + vrf_default_name, NS_NAMSIZ); + strlcpy(def_vrf->name, vrf_default_name, sizeof(def_vrf->name)); + RB_INSERT(vrf_name_head, &vrfs_by_name, def_vrf); + if (vrf_master.vrf_update_name_hook) + (*vrf_master.vrf_update_name_hook)(def_vrf); + } +} + +const char *vrf_get_default_name(void) +{ + return vrf_default_name; +} + +vrf_id_t vrf_get_default_id(void) +{ /* backend netns is only known by zebra * for other daemons, we return VRF_DEFAULT_INTERNAL */ @@ -41,8 +41,6 @@ enum { IFLA_VRF_UNSPEC, IFLA_VRF_TABLE, __IFLA_VRF_MAX }; #define VRF_NAMSIZ 36 #define NS_NAMSIZ 16 -#define VRF_DEFAULT_NAME "Default-IP-Routing-Table" - /* * The command strings */ @@ -201,8 +199,10 @@ extern int vrf_bitmap_check(vrf_bitmap_t, vrf_id_t); * delete -> Called back when a vrf is being deleted from * the system ( 2 and 3 ) above. */ -extern void vrf_init(int (*create)(struct vrf *), int (*enable)(struct vrf *), - int (*disable)(struct vrf *), int (*delete)(struct vrf *)); +extern void vrf_init(int (*create)(struct vrf *vrf), int (*enable)(struct vrf *vrf), + int (*disable)(struct vrf *vrf), int (*delete)(struct vrf *vrf), + int ((*update)(struct vrf *vrf))); + /* * Call vrf_terminate when the protocol is being shutdown */ @@ -236,6 +236,10 @@ extern vrf_id_t vrf_get_default_id(void); /* The default VRF ID */ #define VRF_DEFAULT vrf_get_default_id() +extern void vrf_set_default_name(const char *default_name); +extern const char *vrf_get_default_name(void); +#define VRF_DEFAULT_NAME vrf_get_default_name() + /* VRF is mapped on netns or not ? */ int vrf_is_mapped_on_netns(struct vrf *vrf); diff --git a/lib/zclient.c b/lib/zclient.c index b2bafcb7d8..c5a48c178a 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -1366,6 +1366,9 @@ static void zclient_vrf_add(struct zclient *zclient, vrf_id_t vrf_id) vrf = vrf_get(vrf_id, vrfname_tmp); vrf->data.l.table_id = data.l.table_id; memcpy(vrf->data.l.netns_name, data.l.netns_name, NS_NAMSIZ); + /* overwrite default vrf */ + if (vrf_id == VRF_DEFAULT) + vrf_set_default_name(vrfname_tmp); vrf_enable(vrf); } |
