aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Gundersen <teg@jklm.no>2014-07-14 10:37:25 -0400
committerDavid S. Miller <davem@davemloft.net>2014-07-15 19:13:07 -0400
commit5517750f058edd111bcabe5e116056cc63b1f39c (patch)
tree200173a4d60aa65dc22ece6efa83b8e0f5dd2a29
parentc835a677331495cf137a7f8a023463afd9f032f8 (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.c11
-rw-r--r--include/net/rtnetlink.h1
-rw-r--r--net/core/rtnetlink.c12
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
137struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]); 137struct net *rtnl_link_get_net(struct net *src_net, struct nlattr *tb[]);
138struct net_device *rtnl_create_link(struct net *net, char *ifname, 138struct 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[]);
141int rtnl_configure_link(struct net_device *dev, const struct ifinfomsg *ifm); 142int 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)
1810EXPORT_SYMBOL(rtnl_configure_link); 1810EXPORT_SYMBOL(rtnl_configure_link);
1811 1811
1812struct net_device *rtnl_create_link(struct net *net, 1812struct 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;