Skip to content

Commit

Permalink
net: move altnames together with the netdevice
Browse files Browse the repository at this point in the history
The altname nodes are currently not moved to the new netns
when netdevice itself moves:

  [ ~]# ip netns add test
  [ ~]# ip -netns test link add name eth0 type dummy
  [ ~]# ip -netns test link property add dev eth0 altname some-name
  [ ~]# ip -netns test link show dev some-name
  2: eth0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
      link/ether 1e:67:ed:19:3d:24 brd ff:ff:ff:ff:ff:ff
      altname some-name
  [ ~]# ip -netns test link set dev eth0 netns 1
  [ ~]# ip link
  ...
  3: eth0: <BROADCAST,NOARP> mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000
      link/ether 02:40:88:62:ec:b8 brd ff:ff:ff:ff:ff:ff
      altname some-name
  [ ~]# ip li show dev some-name
  Device "some-name" does not exist.

Remove them from the hash table when device is unlisted
and add back when listed again.

Fixes: 36fbf1e ("net: rtnetlink: add linkprop commands to add and delete alternative ifnames")
Reviewed-by: Jiri Pirko <jiri@nvidia.com>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
Signed-off-by: Paolo Abeni <pabeni@redhat.com>
  • Loading branch information
Jakub Kicinski authored and Paolo Abeni committed Oct 19, 2023
1 parent 1a83f4a commit 8e15aee
Showing 1 changed file with 9 additions and 4 deletions.
13 changes: 9 additions & 4 deletions net/core/dev.c
Original file line number Diff line number Diff line change
Expand Up @@ -381,6 +381,7 @@ static void netdev_name_node_alt_flush(struct net_device *dev)
/* Device list insertion */
static void list_netdevice(struct net_device *dev)
{
struct netdev_name_node *name_node;
struct net *net = dev_net(dev);

ASSERT_RTNL();
Expand All @@ -391,6 +392,10 @@ static void list_netdevice(struct net_device *dev)
hlist_add_head_rcu(&dev->index_hlist,
dev_index_hash(net, dev->ifindex));
write_unlock(&dev_base_lock);

netdev_for_each_altname(dev, name_node)
netdev_name_node_add(net, name_node);

/* We reserved the ifindex, this can't fail */
WARN_ON(xa_store(&net->dev_by_index, dev->ifindex, dev, GFP_KERNEL));

Expand All @@ -402,12 +407,16 @@ static void list_netdevice(struct net_device *dev)
*/
static void unlist_netdevice(struct net_device *dev, bool lock)
{
struct netdev_name_node *name_node;
struct net *net = dev_net(dev);

ASSERT_RTNL();

xa_erase(&net->dev_by_index, dev->ifindex);

netdev_for_each_altname(dev, name_node)
netdev_name_node_del(name_node);

/* Unlink dev from the device chain */
if (lock)
write_lock(&dev_base_lock);
Expand Down Expand Up @@ -10942,7 +10951,6 @@ void unregister_netdevice_many_notify(struct list_head *head,
synchronize_net();

list_for_each_entry(dev, head, unreg_list) {
struct netdev_name_node *name_node;
struct sk_buff *skb = NULL;

/* Shutdown queueing discipline. */
Expand Down Expand Up @@ -10970,9 +10978,6 @@ void unregister_netdevice_many_notify(struct list_head *head,
dev_uc_flush(dev);
dev_mc_flush(dev);

netdev_for_each_altname(dev, name_node)
netdev_name_node_del(name_node);
synchronize_rcu();
netdev_name_node_alt_flush(dev);
netdev_name_node_free(dev->name_node);

Expand Down

0 comments on commit 8e15aee

Please sign in to comment.