From: Jiri Pirko <j...@mellanox.com>

Extend the basic rtnetlink commands to use alternative interface names
as a handle instead of ifindex and ifname.

Signed-off-by: Jiri Pirko <j...@mellanox.com>
---
 net/core/rtnetlink.c | 36 +++++++++++++++++++++++-------------
 1 file changed, 23 insertions(+), 13 deletions(-)

diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c
index 1fa30d514e3f..68ad12a7fc4d 100644
--- a/net/core/rtnetlink.c
+++ b/net/core/rtnetlink.c
@@ -1793,6 +1793,8 @@ static const struct nla_policy ifla_policy[IFLA_MAX+1] = {
        [IFLA_MAX_MTU]          = { .type = NLA_U32 },
        [IFLA_ALT_IFNAME_MOD]   = { .type = NLA_STRING,
                                    .len = ALTIFNAMSIZ - 1 },
+       [IFLA_ALT_IFNAME]       = { .type = NLA_STRING,
+                                   .len = ALTIFNAMSIZ - 1 },
 };
 
 static const struct nla_policy ifla_info_policy[IFLA_INFO_MAX+1] = {
@@ -2767,14 +2769,17 @@ static int do_setlink(const struct sk_buff *skb,
 
 static struct net_device *rtnl_dev_get(struct net *net,
                                       struct nlattr *ifname_attr,
+                                      struct nlattr *altifname_attr,
                                       char *ifname)
 {
-       char buffer[IFNAMSIZ];
+       char buffer[ALTIFNAMSIZ];
 
        if (!ifname) {
                ifname = buffer;
                if (ifname_attr)
                        nla_strlcpy(ifname, ifname_attr, IFNAMSIZ);
+               else if (altifname_attr)
+                       nla_strlcpy(ifname, altifname_attr, ALTIFNAMSIZ);
                else
                        return NULL;
        }
@@ -2810,8 +2815,8 @@ static int rtnl_setlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME])
-               dev = rtnl_dev_get(net, NULL, ifname);
+       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+               dev = rtnl_dev_get(net, NULL, tb[IFLA_ALT_IFNAME], ifname);
        else
                goto errout;
 
@@ -2908,8 +2913,9 @@ static int rtnl_dellink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME])
-               dev = rtnl_dev_get(net, tb[IFLA_IFNAME], NULL);
+       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+               dev = rtnl_dev_get(net, tb[IFLA_IFNAME],
+                                  tb[IFLA_ALT_IFNAME], NULL);
        else if (tb[IFLA_GROUP])
                err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP]));
        else
@@ -3080,8 +3086,8 @@ static int __rtnl_newlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME])
-               dev = rtnl_dev_get(net, NULL, ifname);
+       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+               dev = rtnl_dev_get(net, NULL, tb[IFLA_ALT_IFNAME], ifname);
        else
                dev = NULL;
 
@@ -3345,6 +3351,7 @@ static int rtnl_valid_getlink_req(struct sk_buff *skb,
 
                switch (i) {
                case IFLA_IFNAME:
+               case IFLA_ALT_IFNAME:
                case IFLA_EXT_MASK:
                case IFLA_TARGET_NETNSID:
                        break;
@@ -3392,8 +3399,9 @@ static int rtnl_getlink(struct sk_buff *skb, struct 
nlmsghdr *nlh,
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME])
-               dev = rtnl_dev_get(tgt_net, tb[IFLA_IFNAME], NULL);
+       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+               dev = rtnl_dev_get(tgt_net, tb[IFLA_IFNAME],
+                                  tb[IFLA_ALT_IFNAME], NULL);
        else
                goto out;
 
@@ -3444,8 +3452,9 @@ static int rtnl_newaltifname(struct sk_buff *skb, struct 
nlmsghdr *nlh,
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME])
-               dev = rtnl_dev_get(net, tb[IFLA_IFNAME], NULL);
+       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+               dev = rtnl_dev_get(net, tb[IFLA_IFNAME],
+                                  tb[IFLA_ALT_IFNAME], NULL);
        else
                return -EINVAL;
 
@@ -3491,8 +3500,9 @@ static int rtnl_delaltifname(struct sk_buff *skb, struct 
nlmsghdr *nlh,
        ifm = nlmsg_data(nlh);
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       else if (tb[IFLA_IFNAME])
-               dev = rtnl_dev_get(net, tb[IFLA_IFNAME], NULL);
+       else if (tb[IFLA_IFNAME] || tb[IFLA_ALT_IFNAME])
+               dev = rtnl_dev_get(net, tb[IFLA_IFNAME],
+                                  tb[IFLA_ALT_IFNAME], NULL);
        else
                return -EINVAL;
 
-- 
2.21.0

Reply via email to