]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iplink: add support of IFLA_LINK_NETNSID attribute
authorNicolas Dichtel <nicolas.dichtel@6wind.com>
Tue, 17 Feb 2015 16:30:38 +0000 (17:30 +0100)
committerStephen Hemminger <shemming@brocade.com>
Sun, 22 Feb 2015 00:54:53 +0000 (16:54 -0800)
This new attribute is now advertised by the kernel for x-netns interfaces.
It's also possible to set it when an interface is created (and thus creating a
x-netns interface with one single message).

Example:
 $ ip netns add foo
 $ ip netns add bar
 $ ip -n foo netns set bar 15
 $ ip -n foo link add ipip1 link-netnsid 15 type ipip remote 10.16.0.121 local 10.16.0.249
 $ ip -n foo link ls ipip1
 3: ipip1@NONE: <POINTOPOINT,NOARP> mtu 1480 qdisc noop state DOWN mode DEFAULT group default
     link/ipip 10.16.0.249 peer 10.16.0.121 link-netnsid 15

Signed-off-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
ip/ipaddress.c
ip/iplink.c

index 3730424ad8cde5bb41497331465a4937b1de271e..99a6ab5977e3a942658da2be4c6ea05d5f737a95 100644 (file)
@@ -28,6 +28,7 @@
 #include <linux/netdevice.h>
 #include <linux/if_arp.h>
 #include <linux/sockios.h>
+#include <linux/net_namespace.h>
 
 #include "rt_names.h"
 #include "utils.h"
@@ -614,9 +615,13 @@ int print_linkinfo(const struct sockaddr_nl *who,
                if (iflink == 0)
                        fprintf(fp, "@NONE: ");
                else {
-                       fprintf(fp, "@%s: ", ll_idx_n2a(iflink, b1));
-                       m_flag = ll_index_to_flags(iflink);
-                       m_flag = !(m_flag & IFF_UP);
+                       if (tb[IFLA_LINK_NETNSID])
+                               fprintf(fp, "@if%d: ", iflink);
+                       else {
+                               fprintf(fp, "@%s: ", ll_idx_n2a(iflink, b1));
+                               m_flag = ll_index_to_flags(iflink);
+                               m_flag = !(m_flag & IFF_UP);
+                       }
                }
        } else {
                fprintf(fp, ": ");
@@ -678,6 +683,15 @@ int print_linkinfo(const struct sockaddr_nl *who,
                }
        }
 
+       if (tb[IFLA_LINK_NETNSID]) {
+               int id = *(int*)RTA_DATA(tb[IFLA_LINK_NETNSID]);
+
+               if (id >= 0)
+                       fprintf(fp, " link-netnsid %d", id);
+               else
+                       fprintf(fp, " link-netnsid unknown");
+       }
+
        if (tb[IFLA_PROMISCUITY] && show_details)
                fprintf(fp, " promiscuity %u ",
                        *(int*)RTA_DATA(tb[IFLA_PROMISCUITY]));
index c93d1dc3d5f600b8aeb91e81712ffe77a7b8b944..5893ee401cf96b82e62930bc1205b50ef6e85faa 100644 (file)
@@ -72,6 +72,7 @@ void iplink_usage(void)
        fprintf(stderr, "                         [ mtu MTU ]\n");
        fprintf(stderr, "                         [ netns PID ]\n");
        fprintf(stderr, "                         [ netns NAME ]\n");
+       fprintf(stderr, "                         [ link-netnsid ID ]\n");
        fprintf(stderr, "                         [ alias NAME ]\n");
        fprintf(stderr, "                         [ vf NUM [ mac LLADDR ]\n");
        fprintf(stderr, "                                  [ vlan VLANID [ qos VLAN-QOS ] ]\n");
@@ -386,6 +387,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
        int numtxqueues = -1;
        int numrxqueues = -1;
        int dev_index = 0;
+       int link_netnsid = -1;
 
        *group = -1;
        ret = argc;
@@ -588,6 +590,14 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
                        addattr8(&req->n, sizeof(*req), IFLA_INET6_ADDR_GEN_MODE, mode);
                        addattr_nest_end(&req->n, afs6);
                        addattr_nest_end(&req->n, afs);
+               } else if (matches(*argv, "link-netnsid") == 0) {
+                       NEXT_ARG();
+                       if (link_netnsid != -1)
+                               duparg("link-netnsid", *argv);
+                       if (get_integer(&link_netnsid, *argv, 0))
+                               invarg("Invalid \"link-netnsid\" value\n", *argv);
+                       addattr32(&req->n, sizeof(*req), IFLA_LINK_NETNSID,
+                                 link_netnsid);
                } else {
                        if (strcmp(*argv, "dev") == 0) {
                                NEXT_ARG();