OSDN Git Service

net: rtnetlink: introduce helper to get net_device instance by ifname
authorJiri Pirko <jiri@mellanox.com>
Mon, 30 Sep 2019 09:48:19 +0000 (11:48 +0200)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Oct 2019 21:47:19 +0000 (14:47 -0700)
Introduce helper function rtnl_get_dev() that gets net_device structure
instance pointer according to passed ifname or ifname attribute.

Signed-off-by: Jiri Pirko <jiri@mellanox.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/core/rtnetlink.c

index a001773..77d4719 100644 (file)
@@ -2778,6 +2778,23 @@ errout:
        return err;
 }
 
+static struct net_device *rtnl_dev_get(struct net *net,
+                                      struct nlattr *ifname_attr,
+                                      char *ifname)
+{
+       char buffer[IFNAMSIZ];
+
+       if (!ifname) {
+               ifname = buffer;
+               if (ifname_attr)
+                       nla_strlcpy(ifname, ifname_attr, IFNAMSIZ);
+               else
+                       return NULL;
+       }
+
+       return __dev_get_by_name(net, ifname);
+}
+
 static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
                        struct netlink_ext_ack *extack)
 {
@@ -2807,7 +2824,7 @@ static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
        else if (tb[IFLA_IFNAME])
-               dev = __dev_get_by_name(net, ifname);
+               dev = rtnl_dev_get(net, NULL, ifname);
        else
                goto errout;
 
@@ -2880,7 +2897,6 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct net *tgt_net = net;
        struct net_device *dev = NULL;
        struct ifinfomsg *ifm;
-       char ifname[IFNAMSIZ];
        struct nlattr *tb[IFLA_MAX+1];
        int err;
        int netnsid = -1;
@@ -2894,9 +2910,6 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (err < 0)
                return err;
 
-       if (tb[IFLA_IFNAME])
-               nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
-
        if (tb[IFLA_TARGET_NETNSID]) {
                netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]);
                tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, netnsid);
@@ -2909,7 +2922,7 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
        else if (tb[IFLA_IFNAME])
-               dev = __dev_get_by_name(tgt_net, ifname);
+               dev = rtnl_dev_get(net, tb[IFLA_IFNAME], NULL);
        else if (tb[IFLA_GROUP])
                err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP]));
        else
@@ -3081,7 +3094,7 @@ replay:
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
        else if (tb[IFLA_IFNAME])
-               dev = __dev_get_by_name(net, ifname);
+               dev = rtnl_dev_get(net, NULL, ifname);
        else
                dev = NULL;
 
@@ -3363,7 +3376,6 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
        struct net *net = sock_net(skb->sk);
        struct net *tgt_net = net;
        struct ifinfomsg *ifm;
-       char ifname[IFNAMSIZ];
        struct nlattr *tb[IFLA_MAX+1];
        struct net_device *dev = NULL;
        struct sk_buff *nskb;
@@ -3386,9 +3398,6 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
                        return PTR_ERR(tgt_net);
        }
 
-       if (tb[IFLA_IFNAME])
-               nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
-
        if (tb[IFLA_EXT_MASK])
                ext_filter_mask = nla_get_u32(tb[IFLA_EXT_MASK]);
 
@@ -3397,7 +3406,7 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
        if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
        else if (tb[IFLA_IFNAME])
-               dev = __dev_get_by_name(tgt_net, ifname);
+               dev = rtnl_dev_get(tgt_net, tb[IFLA_IFNAME], NULL);
        else
                goto out;
 
@@ -3480,16 +3489,12 @@ static int rtnl_linkprop(int cmd, struct sk_buff *skb, struct nlmsghdr *nlh,
                return err;
 
        ifm = nlmsg_data(nlh);
-       if (ifm->ifi_index > 0) {
+       if (ifm->ifi_index > 0)
                dev = __dev_get_by_index(net, ifm->ifi_index);
-       } else if (tb[IFLA_IFNAME]) {
-               char ifname[IFNAMSIZ];
-
-               nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
-               dev = __dev_get_by_name(net, ifname);
-       } else {
+       else if (tb[IFLA_IFNAME])
+               dev = rtnl_dev_get(net, tb[IFLA_IFNAME], NULL);
+       else
                return -EINVAL;
-       }
 
        if (!dev)
                return -ENODEV;