]> git.proxmox.com Git - mirror_iproute2.git/commitdiff
ip netns: Reset vrf to default VRF on namespace switch
authorDavid Ahern <dsa@cumulusnetworks.com>
Thu, 15 Dec 2016 20:07:02 +0000 (12:07 -0800)
committerStephen Hemminger <stephen@networkplumber.org>
Wed, 21 Dec 2016 23:56:39 +0000 (15:56 -0800)
A vrf is local to a namespace. Drop any VRF association before trying
to exec a command in the new namespace.

Signed-off-by: David Ahern <dsa@cumulusnetworks.com>
ip/ip_common.h
ip/ipnetns.c
ip/ipvrf.c

index 28763e81e4a4f63e728f1aecc8428827c9a3bcb2..ab6a83431fd68939d3258928c0628c16fa674a49 100644 (file)
@@ -58,6 +58,7 @@ int do_tcp_metrics(int argc, char **argv);
 int do_ipnetconf(int argc, char **argv);
 int do_iptoken(int argc, char **argv);
 int do_ipvrf(int argc, char **argv);
+void vrf_reset(void);
 
 int iplink_get(unsigned int flags, char *name, __u32 filt_mask);
 
index db9a541769f1709ee26356d97b86e83d546d5aaa..8201b94a1620991bfac511d1238771f8c495b023 100644 (file)
@@ -387,6 +387,11 @@ static int netns_exec(int argc, char **argv)
        if (netns_switch(argv[0]))
                return -1;
 
+       /* we just changed namespaces. clear any vrf association
+        * with prior namespace before exec'ing command
+        */
+       vrf_reset();
+
        /* ip must return the status of the child,
         * but do_cmd() will add a minus to this,
         * so let's add another one here to cancel it.
index de2ec5c120cb4ae789c5fb2688f12cba97abf8e3..dc8364a43a57d51d6d9a6f88fb8c65964f50e98d 100644 (file)
@@ -277,6 +277,20 @@ static int ipvrf_exec(int argc, char **argv)
        return -cmd_exec(argv[1], argv + 1, !!batch_mode);
 }
 
+/* reset VRF association of current process to default VRF;
+ * used by netns_exec
+ */
+void vrf_reset(void)
+{
+       char vrf[32];
+
+       if (vrf_identify(getpid(), vrf, sizeof(vrf)) ||
+           (vrf[0] == '\0'))
+               return;
+
+       vrf_switch("default");
+}
+
 int do_ipvrf(int argc, char **argv)
 {
        if (argc == 0) {