"ip link add netns" support was not added because nsenter -n ip link add
has the same effect.

Signed-off-by: Alex Xu <[email protected]>
---
 networking/libiproute/iplink.c | 45 +++++++++++++++++++++++++++++++++++-------
 1 file changed, 38 insertions(+), 7 deletions(-)

diff --git a/networking/libiproute/iplink.c b/networking/libiproute/iplink.c
index ae3ef0c..4d1946e 100644
--- a/networking/libiproute/iplink.c
+++ b/networking/libiproute/iplink.c
@@ -43,6 +43,12 @@ struct ifla_vlan_flags {
 };
 #endif
 
+struct iplink_req {
+        struct nlmsghdr         n;
+        struct ifinfomsg        i;
+        char                    buf[1024];
+};
+
 /* taken from linux/sockios.h */
 #define SIOCSIFNAME  0x8923  /* set interface name */
 
@@ -124,6 +130,24 @@ static void set_mtu(char *dev, int mtu)
        close(s);
 }
 
+static int set_netns(char *dev, int netns)
+{
+       struct iplink_req req;
+       struct rtnl_handle rth;
+       memset(&req, 0, sizeof(req));
+       req.n.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));
+       req.n.nlmsg_flags = NLM_F_REQUEST;
+       req.n.nlmsg_type = RTM_NEWLINK;
+       req.i.ifi_family = preferred_family;
+       req.i.ifi_index = xll_name_to_index(dev);
+       addattr_l(&req.n, sizeof(req), IFLA_NET_NS_FD, &netns, 4);
+       xrtnl_open(&rth);
+       ll_init_map(&rth);
+       if (rtnl_talk(&rth, &req.n, 0, 0, NULL, NULL, NULL) < 0)
+               return 2;
+       return 0;
+}
+
 /* Exits on error */
 static int get_address(char *dev, int *htype)
 {
@@ -206,12 +230,13 @@ static int do_set(char **argv)
        int htype, halen;
        static const char keywords[] ALIGN1 =
                "up\0""down\0""name\0""mtu\0""qlen\0""multicast\0"
-               "arp\0""address\0""dev\0";
+               "arp\0""address\0""netns\0""dev\0";
        enum { ARG_up = 0, ARG_down, ARG_name, ARG_mtu, ARG_qlen, ARG_multicast,
-               ARG_arp, ARG_addr, ARG_dev };
+               ARG_arp, ARG_addr, ARG_netns, ARG_dev };
        static const char str_on_off[] ALIGN1 = "on\0""off\0";
        enum { PARM_on = 0, PARM_off };
        smalluint key;
+       int netns = -1;
 
        while (*argv) {
                /* substring search ensures that e.g. "addr" and "address"
@@ -239,6 +264,13 @@ static int do_set(char **argv)
                } else if (key == ARG_addr) {
                        NEXT_ARG();
                        newaddr = *argv;
+               } else if (key == ARG_netns) {
+                       NEXT_ARG();
+                       if (netns != -1)
+                               duparg("netns", *argv);
+                       netns = open(*argv, O_RDONLY);
+                       if (netns == -1)
+                               invarg_1_to_2(*argv, "netns");
                } else if (key >= ARG_dev) {
                        if (key == ARG_dev) {
                                NEXT_ARG();
@@ -297,6 +329,9 @@ static int do_set(char **argv)
        if (mtu != -1) {
                set_mtu(dev, mtu);
        }
+       if (netns != -1)
+               if (set_netns(dev, netns))
+                       return 2;
        if (mask)
                do_chflags(dev, flags, mask);
        return 0;
@@ -416,11 +451,7 @@ static int do_add_or_delete(char **argv, const unsigned 
rtm)
                ARG_address,
        };
        struct rtnl_handle rth;
-       struct {
-               struct nlmsghdr  n;
-               struct ifinfomsg i;
-               char             buf[1024];
-       } req;
+       struct iplink_req req;
        smalluint arg;
        char *name_str = NULL;
        char *link_str = NULL;
-- 
2.9.2

_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to