From 4fe52e76226a37eb998991491ac635eac7024167 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 21 Nov 2018 14:46:08 +0100 Subject: [PATCH 1/2] lib, zebra: default vrf configured will not be overwritten by discovery the netns discovery process executed when vrf backend is netns, allows the zebra daemon to dynamically change the default vrf name value. This option is disabled, when the zebra is forced to a default vrf value with option -o. PR=61513 Signed-off-by: Philippe Guibert Acked-by: Nicolas Dichtel --- lib/vrf.c | 12 ++++++++++-- lib/vrf.h | 2 +- lib/zclient.c | 2 +- zebra/main.c | 2 +- zebra/zebra_netns_notify.c | 4 ++-- 5 files changed, 15 insertions(+), 7 deletions(-) diff --git a/lib/vrf.c b/lib/vrf.c index 046e468f20..8409a1c9a1 100644 --- a/lib/vrf.c +++ b/lib/vrf.c @@ -894,14 +894,20 @@ void vrf_cmd_init(int (*writefunc)(struct vty *vty), } } -void vrf_set_default_name(const char *default_name) +void vrf_set_default_name(const char *default_name, bool force) { struct vrf *def_vrf; struct vrf *vrf_with_default_name = NULL; + static bool def_vrf_forced; def_vrf = vrf_lookup_by_id(VRF_DEFAULT); assert(default_name); - vrf_with_default_name = vrf_lookup_by_name(default_name); + if (def_vrf && !force && def_vrf_forced) { + zlog_debug("VRF: %s, avoid changing name to %s, previously forced (%u)", + def_vrf->name, default_name, + def_vrf->vrf_id); + return; + } 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)", @@ -911,6 +917,8 @@ void vrf_set_default_name(const char *default_name) } snprintf(vrf_default_name, VRF_NAMSIZ, "%s", default_name); if (def_vrf) { + if (force) + def_vrf_forced = true; RB_REMOVE(vrf_name_head, &vrfs_by_name, def_vrf); strlcpy(def_vrf->data.l.netns_name, vrf_default_name, NS_NAMSIZ); diff --git a/lib/vrf.h b/lib/vrf.h index 3bc88e610a..fe4fc77250 100644 --- a/lib/vrf.h +++ b/lib/vrf.h @@ -236,7 +236,7 @@ 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 void vrf_set_default_name(const char *default_name, bool force); extern const char *vrf_get_default_name(void); #define VRF_DEFAULT_NAME vrf_get_default_name() diff --git a/lib/zclient.c b/lib/zclient.c index b879326d71..beb3ca4f34 100644 --- a/lib/zclient.c +++ b/lib/zclient.c @@ -1370,7 +1370,7 @@ static void zclient_vrf_add(struct zclient *zclient, vrf_id_t vrf_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_set_default_name(vrfname_tmp, false); vrf_enable(vrf); } diff --git a/zebra/main.c b/zebra/main.c index 5628b5e022..2e92a78385 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -336,7 +336,7 @@ int main(int argc, char **argv) } break; case 'o': - vrf_set_default_name(optarg); + vrf_set_default_name(optarg, true); break; case 'z': zserv_path = optarg; diff --git a/zebra/zebra_netns_notify.c b/zebra/zebra_netns_notify.c index 4d2aefa236..3f69b98413 100644 --- a/zebra/zebra_netns_notify.c +++ b/zebra/zebra_netns_notify.c @@ -219,7 +219,7 @@ static int zebra_ns_ready_read(struct thread *t) zlog_warn( "NS notify : NS %s is default VRF." " Updating VRF Name", basename(netnspath)); - vrf_set_default_name(basename(netnspath)); + vrf_set_default_name(basename(netnspath), false); return zebra_ns_continue_read(zns_info, 1); } @@ -314,7 +314,7 @@ void zebra_ns_notify_parse(void) zlog_warn( "NS notify : NS %s is default VRF." " Updating VRF Name", dent->d_name); - vrf_set_default_name(dent->d_name); + vrf_set_default_name(dent->d_name, false); continue; } zebra_ns_notify_create_context_from_entry_name(dent->d_name); From 53af0706e2175111ccf94d8505f846a3b2cda467 Mon Sep 17 00:00:00 2001 From: Philippe Guibert Date: Wed, 21 Nov 2018 14:48:10 +0100 Subject: [PATCH 2/2] zebra: delay default vrf name after vrf initialization the vrf context was not created at previous location of the call. The call is done after vrf initialisation. PR=61513 Signed-off-by: Philippe Guibert Acked-by: Nicolas dichtel --- zebra/main.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/zebra/main.c b/zebra/main.c index 2e92a78385..5cea4fa932 100644 --- a/zebra/main.c +++ b/zebra/main.c @@ -256,6 +256,7 @@ int main(int argc, char **argv) { // int batch_mode = 0; char *zserv_path = NULL; + char *vrf_default_name_configured = NULL; /* Socket to external label manager */ char *lblmgr_path = NULL; struct sockaddr_storage dummy; @@ -336,7 +337,7 @@ int main(int argc, char **argv) } break; case 'o': - vrf_set_default_name(optarg, true); + vrf_default_name_configured = optarg; break; case 'z': zserv_path = optarg; @@ -402,7 +403,9 @@ int main(int argc, char **argv) * Initialize NS( and implicitly the VRF module), and make kernel * routing socket. */ zebra_ns_init(); - + if (vrf_default_name_configured) + vrf_set_default_name(vrf_default_name_configured, + true); zebra_vty_init(); access_list_init(); prefix_list_init();