]> git.ipfire.org Git - thirdparty/iproute2.git/commitdiff
iproute: Make it possible to specify index on link creation
authorPavel Emelyanov <xemul@parallels.com>
Thu, 26 Dec 2013 19:15:20 +0000 (23:15 +0400)
committerStephen Hemminger <stephen@networkplumber.org>
Sat, 28 Dec 2013 19:24:11 +0000 (11:24 -0800)
The RTM_NEWLINK message accepts ifi_index non-zero value and lets
creation of links with given index (if it's free, or course). This
functionality is available since linux-v3.5.

This patch makes this API available via ip tool.

Signed-off-by: Pavel Emelyanov <xemul@parallels.com>
include/utils.h
ip/iplink.c
ip/link_veth.c

index a3e310eeb5d20bcf89393f2ac0e531805a8f82bf..a4b5b4cc60d7e654e2926e40b25c71519afe0f9b 100644 (file)
@@ -156,5 +156,5 @@ extern int inet_get_addr(const char *src, __u32 *dst, struct in6_addr *dst6);
 struct iplink_req;
 int iplink_parse(int argc, char **argv, struct iplink_req *req,
                char **name, char **type, char **link, char **dev,
-               int *group);
+               int *group, int *index);
 #endif /* __UTILS_H__ */
index e0c14e621d633ce92b64cc92b7c5c32b437fc0a3..343b29f92bf6cc15856afc9e35151dc25c72e9db 100644 (file)
@@ -47,7 +47,7 @@ void iplink_usage(void)
                fprintf(stderr, "                   [ txqueuelen PACKETS ]\n");
                fprintf(stderr, "                   [ address LLADDR ]\n");
                fprintf(stderr, "                   [ broadcast LLADDR ]\n");
-               fprintf(stderr, "                   [ mtu MTU ]\n");
+               fprintf(stderr, "                   [ mtu MTU ] [index IDX ]\n");
                fprintf(stderr, "                   [ numtxqueues QUEUE_COUNT ]\n");
                fprintf(stderr, "                   [ numrxqueues QUEUE_COUNT ]\n");
                fprintf(stderr, "                   type TYPE [ ARGS ]\n");
@@ -291,7 +291,7 @@ static int iplink_parse_vf(int vf, int *argcp, char ***argvp,
 }
 
 int iplink_parse(int argc, char **argv, struct iplink_req *req,
-               char **name, char **type, char **link, char **dev, int *group)
+               char **name, char **type, char **link, char **dev, int *group, int *index)
 {
        int ret, len;
        char abuf[32];
@@ -315,6 +315,9 @@ int iplink_parse(int argc, char **argv, struct iplink_req *req,
                } else if (strcmp(*argv, "name") == 0) {
                        NEXT_ARG();
                        *name = *argv;
+               } else if (strcmp(*argv, "index") == 0) {
+                       NEXT_ARG();
+                       *index = atoi(*argv);
                } else if (matches(*argv, "link") == 0) {
                        NEXT_ARG();
                        *link = *argv;
@@ -506,6 +509,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
        char *name = NULL;
        char *link = NULL;
        char *type = NULL;
+       int index = 0;
        int group;
        struct link_util *lu = NULL;
        struct iplink_req req;
@@ -518,7 +522,7 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
        req.n.nlmsg_type = cmd;
        req.i.ifi_family = preferred_family;
 
-       ret = iplink_parse(argc, argv, &req, &name, &type, &link, &dev, &group);
+       ret = iplink_parse(argc, argv, &req, &name, &type, &link, &dev, &group, &index);
        if (ret < 0)
                return ret;
 
@@ -578,6 +582,8 @@ static int iplink_modify(int cmd, unsigned int flags, int argc, char **argv)
                        }
                        addattr_l(&req.n, sizeof(req), IFLA_LINK, &ifindex, 4);
                }
+
+               req.i.ifi_index = index;
        }
 
        if (name) {
index 62cb5a55b5a8212dddbec9db354583330d148788..3cbeb544b542cde8103df6256ff8c88e609724d2 100644 (file)
@@ -30,6 +30,7 @@ static int veth_parse_opt(struct link_util *lu, int argc, char **argv,
        char *name = NULL;
        char *link = NULL;
        char *type = NULL;
+       int index = 0;
        int err, len;
        struct rtattr * data;
        int group;
@@ -45,7 +46,7 @@ static int veth_parse_opt(struct link_util *lu, int argc, char **argv,
        hdr->nlmsg_len += sizeof(struct ifinfomsg);
 
        err = iplink_parse(argc - 1, argv + 1, (struct iplink_req *)hdr,
-                          &name, &type, &link, &dev, &group);
+                          &name, &type, &link, &dev, &group, &index);
        if (err < 0)
                return err;
 
@@ -56,6 +57,11 @@ static int veth_parse_opt(struct link_util *lu, int argc, char **argv,
                addattr_l(hdr, 1024, IFLA_IFNAME, name, len);
        }
 
+       if (index) {
+               struct ifinfomsg *ifi = (struct ifinfomsg *)(data + 1);
+               ifi->ifi_index = index;
+       }
+
        if (group != -1)
                addattr32(hdr, 1024, IFLA_GROUP, group);