]> git.proxmox.com Git - mirror_frr.git/commitdiff
lib, zebra: default vrf configured will not be overwritten by discovery
authorPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 21 Nov 2018 13:46:08 +0000 (14:46 +0100)
committerPhilippe Guibert <philippe.guibert@6wind.com>
Wed, 21 Nov 2018 16:21:19 +0000 (17:21 +0100)
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 <philippe.guibert@6wind.com>
Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
lib/vrf.c
lib/vrf.h
lib/zclient.c
zebra/main.c
zebra/zebra_netns_notify.c

index 046e468f20dcd27bd47b5389217f6a3b2d9baad3..8409a1c9a13ed5e9bb4febd561d3c0e637ef8cd2 100644 (file)
--- 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);
index 3bc88e610a6a898e585b571edddcc05011c92d05..fe4fc77250cc7ac6bd027fe3be51afe421482a69 100644 (file)
--- 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()
 
index b879326d71b56deeb5dbc0fe6f9f041bdbec52b2..beb3ca4f345e844131af5b4d7e91265600ac946c 100644 (file)
@@ -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);
 }
 
index 5628b5e022434bba5dcf654a1dbced3577852d3f..2e92a78385df377ff2ad50ae1d8310ba7d66c710 100644 (file)
@@ -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;
index 4d2aefa2362fd5dd5b0b5312e2d9da3ee0af156c..3f69b98413b11739c093bbdbf957e560ef42baf5 100644 (file)
@@ -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);