net: rtnetlink: add possibility to use alternative names as message handle
Extend the basic rtnetlink commands to use alternative interface names as a handle instead of ifindex and ifname. Signed-off-by: Jiri Pirko <jiri@mellanox.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
cc6090e985
commit
76c9ac0ee8
|
@ -2780,14 +2780,17 @@ errout:
|
|||
|
||||
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;
|
||||
}
|
||||
|
@ -2823,8 +2826,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;
|
||||
|
||||
|
@ -2921,8 +2924,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
|
||||
|
@ -3093,8 +3097,8 @@ replay:
|
|||
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;
|
||||
|
||||
|
@ -3358,6 +3362,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;
|
||||
|
@ -3405,8 +3410,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;
|
||||
|
||||
|
@ -3491,8 +3497,9 @@ static int rtnl_linkprop(int cmd, 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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue