net: rtnetlink: introduce helper to get net_device instance by ifname
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>
This commit is contained in:
parent
7af12cba4e
commit
cc6090e985
1 changed files with 25 additions and 20 deletions
|
@ -2778,6 +2778,23 @@ errout:
|
||||||
return err;
|
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,
|
static int rtnl_setlink(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
struct netlink_ext_ack *extack)
|
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)
|
if (ifm->ifi_index > 0)
|
||||||
dev = __dev_get_by_index(net, ifm->ifi_index);
|
dev = __dev_get_by_index(net, ifm->ifi_index);
|
||||||
else if (tb[IFLA_IFNAME])
|
else if (tb[IFLA_IFNAME])
|
||||||
dev = __dev_get_by_name(net, ifname);
|
dev = rtnl_dev_get(net, NULL, ifname);
|
||||||
else
|
else
|
||||||
goto errout;
|
goto errout;
|
||||||
|
|
||||||
|
@ -2880,7 +2897,6 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
struct net *tgt_net = net;
|
struct net *tgt_net = net;
|
||||||
struct net_device *dev = NULL;
|
struct net_device *dev = NULL;
|
||||||
struct ifinfomsg *ifm;
|
struct ifinfomsg *ifm;
|
||||||
char ifname[IFNAMSIZ];
|
|
||||||
struct nlattr *tb[IFLA_MAX+1];
|
struct nlattr *tb[IFLA_MAX+1];
|
||||||
int err;
|
int err;
|
||||||
int netnsid = -1;
|
int netnsid = -1;
|
||||||
|
@ -2894,9 +2910,6 @@ static int rtnl_dellink(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
if (tb[IFLA_IFNAME])
|
|
||||||
nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
|
|
||||||
|
|
||||||
if (tb[IFLA_TARGET_NETNSID]) {
|
if (tb[IFLA_TARGET_NETNSID]) {
|
||||||
netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]);
|
netnsid = nla_get_s32(tb[IFLA_TARGET_NETNSID]);
|
||||||
tgt_net = rtnl_get_net_ns_capable(NETLINK_CB(skb).sk, 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)
|
if (ifm->ifi_index > 0)
|
||||||
dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
|
dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
|
||||||
else if (tb[IFLA_IFNAME])
|
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])
|
else if (tb[IFLA_GROUP])
|
||||||
err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP]));
|
err = rtnl_group_dellink(tgt_net, nla_get_u32(tb[IFLA_GROUP]));
|
||||||
else
|
else
|
||||||
|
@ -3081,7 +3094,7 @@ replay:
|
||||||
if (ifm->ifi_index > 0)
|
if (ifm->ifi_index > 0)
|
||||||
dev = __dev_get_by_index(net, ifm->ifi_index);
|
dev = __dev_get_by_index(net, ifm->ifi_index);
|
||||||
else if (tb[IFLA_IFNAME])
|
else if (tb[IFLA_IFNAME])
|
||||||
dev = __dev_get_by_name(net, ifname);
|
dev = rtnl_dev_get(net, NULL, ifname);
|
||||||
else
|
else
|
||||||
dev = NULL;
|
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 *net = sock_net(skb->sk);
|
||||||
struct net *tgt_net = net;
|
struct net *tgt_net = net;
|
||||||
struct ifinfomsg *ifm;
|
struct ifinfomsg *ifm;
|
||||||
char ifname[IFNAMSIZ];
|
|
||||||
struct nlattr *tb[IFLA_MAX+1];
|
struct nlattr *tb[IFLA_MAX+1];
|
||||||
struct net_device *dev = NULL;
|
struct net_device *dev = NULL;
|
||||||
struct sk_buff *nskb;
|
struct sk_buff *nskb;
|
||||||
|
@ -3386,9 +3398,6 @@ static int rtnl_getlink(struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
return PTR_ERR(tgt_net);
|
return PTR_ERR(tgt_net);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tb[IFLA_IFNAME])
|
|
||||||
nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
|
|
||||||
|
|
||||||
if (tb[IFLA_EXT_MASK])
|
if (tb[IFLA_EXT_MASK])
|
||||||
ext_filter_mask = nla_get_u32(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)
|
if (ifm->ifi_index > 0)
|
||||||
dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
|
dev = __dev_get_by_index(tgt_net, ifm->ifi_index);
|
||||||
else if (tb[IFLA_IFNAME])
|
else if (tb[IFLA_IFNAME])
|
||||||
dev = __dev_get_by_name(tgt_net, ifname);
|
dev = rtnl_dev_get(tgt_net, tb[IFLA_IFNAME], NULL);
|
||||||
else
|
else
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -3480,16 +3489,12 @@ static int rtnl_linkprop(int cmd, struct sk_buff *skb, struct nlmsghdr *nlh,
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
ifm = nlmsg_data(nlh);
|
ifm = nlmsg_data(nlh);
|
||||||
if (ifm->ifi_index > 0) {
|
if (ifm->ifi_index > 0)
|
||||||
dev = __dev_get_by_index(net, ifm->ifi_index);
|
dev = __dev_get_by_index(net, ifm->ifi_index);
|
||||||
} else if (tb[IFLA_IFNAME]) {
|
else if (tb[IFLA_IFNAME])
|
||||||
char ifname[IFNAMSIZ];
|
dev = rtnl_dev_get(net, tb[IFLA_IFNAME], NULL);
|
||||||
|
else
|
||||||
nla_strlcpy(ifname, tb[IFLA_IFNAME], IFNAMSIZ);
|
|
||||||
dev = __dev_get_by_name(net, ifname);
|
|
||||||
} else {
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
|
||||||
|
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
Loading…
Add table
Reference in a new issue