diff options
author | Tom Gundersen <teg@jklm.no> | 2014-07-14 10:37:25 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2014-07-15 19:13:07 -0400 |
commit | 5517750f058edd111bcabe5e116056cc63b1f39c (patch) | |
tree | 200173a4d60aa65dc22ece6efa83b8e0f5dd2a29 | |
parent | c835a677331495cf137a7f8a023463afd9f032f8 (diff) |
net: rtnetlink - make create_link take name_assign_type
This passes down NET_NAME_USER (or NET_NAME_ENUM) to alloc_netdev(),
for any device created over rtnetlink.
v9: restore reverse-christmas-tree order of local variables
Signed-off-by: Tom Gundersen <teg@jklm.no>
Signed-off-by: David S. Miller <davem@davemloft.net>
-rw-r--r-- | drivers/net/veth.c | 11 | ||||
-rw-r--r-- | include/net/rtnetlink.h | 1 | ||||
-rw-r--r-- | net/core/rtnetlink.c | 12 |
3 files changed, 17 insertions, 7 deletions
diff --git a/drivers/net/veth.c b/drivers/net/veth.c index 9b945e60530e..8ad596573d17 100644 --- a/drivers/net/veth.c +++ b/drivers/net/veth.c | |||
@@ -335,6 +335,7 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, | |||
335 | struct veth_priv *priv; | 335 | struct veth_priv *priv; |
336 | char ifname[IFNAMSIZ]; | 336 | char ifname[IFNAMSIZ]; |
337 | struct nlattr *peer_tb[IFLA_MAX + 1], **tbp; | 337 | struct nlattr *peer_tb[IFLA_MAX + 1], **tbp; |
338 | unsigned char name_assign_type; | ||
338 | struct ifinfomsg *ifmp; | 339 | struct ifinfomsg *ifmp; |
339 | struct net *net; | 340 | struct net *net; |
340 | 341 | ||
@@ -362,16 +363,20 @@ static int veth_newlink(struct net *src_net, struct net_device *dev, | |||
362 | tbp = tb; | 363 | tbp = tb; |
363 | } | 364 | } |
364 | 365 | ||
365 | if (tbp[IFLA_IFNAME]) | 366 | if (tbp[IFLA_IFNAME]) { |
366 | nla_strlcpy(ifname, tbp[IFLA_IFNAME], IFNAMSIZ); | 367 | nla_strlcpy(ifname, tbp[IFLA_IFNAME], IFNAMSIZ); |
367 | else | 368 | name_assign_type = NET_NAME_USER; |
369 | } else { | ||
368 | snprintf(ifname, IFNAMSIZ, DRV_NAME "%%d"); | 370 | snprintf(ifname, IFNAMSIZ, DRV_NAME "%%d"); |
371 | name_assign_type = NET_NAME_ENUM; | ||
372 | } | ||
369 | 373 | ||
370 | net = rtnl_link_get_net(src_net, tbp); | 374 | net = rtnl_link_get_net(src_net, tbp); |
371 | if (IS_ERR(net)) | 375 | if (IS_ERR(net)) |
372 | return PTR_ERR(net); | 376 | return PTR_ERR(net); |
373 | 377 | ||
374 | peer = rtnl_create_link(net, ifname, &veth_link_ops, tbp); | 378 | peer = rtnl_create_link(net, ifname, name_assign_type, |
379 | &veth_link_ops, tbp); | ||
375 | if (IS_ERR(peer)) { | 380 | if (IS_ERR(peer)) { |
376 | put_net(net); | 381 | put_net(net); |
377 | return PTR_ERR(peer); | 382 | return PTR_ERR(peer); |
diff --git a/include/net/rtnetlink.h b/include/net/rtnetlink.h index 72240e5ac2c4..e21b9f9653c0 100644 --- a/include/net/rtnetlink.h +++ b/include/net/rtnetlink.h | |||
@@ -136,6 +136,7 @@ void rtnl_af_unregister(struct rtnl_af_ops *ops); | |||
136 | 136 | ||
137 | struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]); | 137 | struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]); |
138 | struct net_device *rtnl_create_link(struct net *net, char *ifname, | 138 | struct net_device *rtnl_create_link(struct net *net, char *ifname, |
139 | unsigned char name_assign_type, | ||
139 | const struct rtnl_link_ops *ops, | 140 | const struct rtnl_link_ops *ops, |
140 | struct nlattr *tb[]); | 141 | struct nlattr *tb[]); |
141 | int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); | 142 | int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); |
diff --git a/net/core/rtnetlink.c b/net/core/rtnetlink.c index 599864322de8..e9918020dbc9 100644 --- a/net/core/rtnetlink.c +++ b/net/core/rtnetlink.c | |||
@@ -1810,7 +1810,8 @@ int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm) | |||
1810 | EXPORT_SYMBOL(rtnl_configure_link); | 1810 | EXPORT_SYMBOL(rtnl_configure_link); |
1811 | 1811 | ||
1812 | struct net_device *rtnl_create_link(struct net *net, | 1812 | struct net_device *rtnl_create_link(struct net *net, |
1813 | char *ifname, const struct rtnl_link_ops *ops, struct nlattr *tb[]) | 1813 | char *ifname, unsigned char name_assign_type, |
1814 | const struct rtnl_link_ops *ops, struct nlattr *tb[]) | ||
1814 | { | 1815 | { |
1815 | int err; | 1816 | int err; |
1816 | struct net_device *dev; | 1817 | struct net_device *dev; |
@@ -1828,7 +1829,7 @@ struct net_device *rtnl_create_link(struct net *net, | |||
1828 | num_rx_queues = ops->get_num_rx_queues(); | 1829 | num_rx_queues = ops->get_num_rx_queues(); |
1829 | 1830 | ||
1830 | err = -ENOMEM; | 1831 | err = -ENOMEM; |
1831 | dev = alloc_netdev_mqs(ops->priv_size, ifname, NET_NAME_UNKNOWN, | 1832 | dev = alloc_netdev_mqs(ops->priv_size, ifname, name_assign_type, |
1832 | ops->setup, num_tx_queues, num_rx_queues); | 1833 | ops->setup, num_tx_queues, num_rx_queues); |
1833 | if (!dev) | 1834 | if (!dev) |
1834 | goto err; | 1835 | goto err; |
@@ -1894,6 +1895,7 @@ static int rtnl_newlink(struct sk_buff *skb, struct nlmsghdr *nlh) | |||
1894 | char ifname[IFNAMSIZ]; | 1895 | char ifname[IFNAMSIZ]; |
1895 | struct nlattr *tb[IFLA_MAX+1]; | 1896 | struct nlattr *tb[IFLA_MAX+1]; |
1896 | struct nlattr *linkinfo[IFLA_INFO_MAX+1]; | 1897 | struct nlattr *linkinfo[IFLA_INFO_MAX+1]; |
1898 | unsigned char name_assign_type = NET_NAME_USER; | ||
1897 | int err; | 1899 | int err; |
1898 | 1900 | ||
1899 | #ifdef CONFIG_MODULES | 1901 | #ifdef CONFIG_MODULES |
@@ -2046,14 +2048,16 @@ replay: | |||
2046 | if (!ops->setup) | 2048 | if (!ops->setup) |
2047 | return -EOPNOTSUPP; | 2049 | return -EOPNOTSUPP; |
2048 | 2050 | ||
2049 | if (!ifname[0]) | 2051 | if (!ifname[0]) { |
2050 | snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind); | 2052 | snprintf(ifname, IFNAMSIZ, "%s%%d", ops->kind); |
2053 | name_assign_type = NET_NAME_ENUM; | ||
2054 | } | ||
2051 | 2055 | ||
2052 | dest_net = rtnl_link_get_net(net, tb); | 2056 | dest_net = rtnl_link_get_net(net, tb); |
2053 | if (IS_ERR(dest_net)) | 2057 | if (IS_ERR(dest_net)) |
2054 | return PTR_ERR(dest_net); | 2058 | return PTR_ERR(dest_net); |
2055 | 2059 | ||
2056 | dev = rtnl_create_link(dest_net, ifname, ops, tb); | 2060 | dev = rtnl_create_link(dest_net, ifname, name_assign_type, ops, tb); |
2057 | if (IS_ERR(dev)) { | 2061 | if (IS_ERR(dev)) { |
2058 | err = PTR_ERR(dev); | 2062 | err = PTR_ERR(dev); |
2059 | goto out; | 2063 | goto out; |