Allow to change the interface to which a given interface is linked to.
This is useful in the case of multi-CPU port DSA, for changing the CPU
port of a given user port.

Signed-off-by: Marek BehĂșn <marek.be...@nic.cz>
Cc: David Ahern <dsah...@gmail.com>
Cc: Stephen Hemminger <step...@networkplumber.org>
---
 ip/iplink.c           | 16 +++++-----------
 man/man8/ip-link.8.in |  7 +++++++
 2 files changed, 12 insertions(+), 11 deletions(-)

diff --git a/ip/iplink.c b/ip/iplink.c
index 212a0885..d52c0aaf 100644
--- a/ip/iplink.c
+++ b/ip/iplink.c
@@ -579,7 +579,6 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
 {
        char *name = NULL;
        char *dev = NULL;
-       char *link = NULL;
        int ret, len;
        char abuf[32];
        int qlen = -1;
@@ -590,6 +589,7 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
        int numrxqueues = -1;
        int link_netnsid = -1;
        int index = 0;
+       int link = -1;
        int group = -1;
        int addr_len = 0;
 
@@ -620,7 +620,10 @@ int iplink_parse(int argc, char **argv, struct iplink_req 
*req, char **type)
                                invarg("Invalid \"index\" value", *argv);
                } else if (matches(*argv, "link") == 0) {
                        NEXT_ARG();
-                       link = *argv;
+                       link = ll_name_to_index(*argv);
+                       if (!link)
+                               return nodev(*argv);
+                       addattr32(&req->n, sizeof(*req), IFLA_LINK, link);
                } else if (matches(*argv, "address") == 0) {
                        NEXT_ARG();
                        addr_len = ll_addr_a2n(abuf, sizeof(abuf), *argv);
@@ -1004,15 +1007,6 @@ int iplink_parse(int argc, char **argv, struct 
iplink_req *req, char **type)
                        exit(-1);
                }
 
-               if (link) {
-                       int ifindex;
-
-                       ifindex = ll_name_to_index(link);
-                       if (!ifindex)
-                               return nodev(link);
-                       addattr32(&req->n, sizeof(*req), IFLA_LINK, ifindex);
-               }
-
                req->i.ifi_index = index;
        }
 
diff --git a/man/man8/ip-link.8.in b/man/man8/ip-link.8.in
index a8ae72d2..800aed05 100644
--- a/man/man8/ip-link.8.in
+++ b/man/man8/ip-link.8.in
@@ -149,6 +149,9 @@ ip-link \- network device configuration
 .br
 .RB "[ " nomaster " ]"
 .br
+.RB "[ " link
+.IR DEVICE " ]"
+.br
 .RB "[ " vrf
 .IR NAME " ]"
 .br
@@ -2131,6 +2134,10 @@ set master device of the device (enslave device).
 .BI nomaster
 unset master device of the device (release device).
 
+.TP
+.BI link " DEVICE"
+set device to which this device is linked to.
+
 .TP
 .BI addrgenmode " eui64|none|stable_secret|random"
 set the IPv6 address generation mode
-- 
2.21.0


Reply via email to