commit 7da7dfcb787d77929c15d5b7127c816ee16f1ede Author: Tom Goff Date: Fri Dec 16 17:39:00 2011 -0800 Make network device ifindex sequential per network namespace. diff --git a/include/net/net_namespace.h b/include/net/net_namespace.h index 3bb6fa0..2fd53da 100644 --- a/include/net/net_namespace.h +++ b/include/net/net_namespace.h @@ -62,6 +62,8 @@ struct net { struct sock *rtnl; /* rtnetlink socket */ struct sock *genl_sock; + int ifindex; + struct list_head dev_base_head; struct hlist_head *dev_name_head; struct hlist_head *dev_index_head; diff --git a/net/core/dev.c b/net/core/dev.c index 6ba50a1..ba95aa5 100644 --- a/net/core/dev.c +++ b/net/core/dev.c @@ -5260,12 +5260,11 @@ int dev_ioctl(struct net *net, unsigned int cmd, void __user *arg) */ static int dev_new_index(struct net *net) { - static int ifindex; for (;;) { - if (++ifindex <= 0) - ifindex = 1; - if (!__dev_get_by_index(net, ifindex)) - return ifindex; + if (++net->ifindex <= 0) + net->ifindex = 1; + if (!__dev_get_by_index(net, net->ifindex)) + return net->ifindex; } } @@ -6277,8 +6276,8 @@ int dev_change_net_namespace(struct net_device *dev, struct net *net, const char /* Actually switch the network namespace */ dev_net_set(dev, net); - /* If there is an ifindex conflict assign a new one */ - if (__dev_get_by_index(net, dev->ifindex)) { + /* Assign a new ifindex */ + { int iflink = (dev->iflink == dev->ifindex); dev->ifindex = dev_new_index(net); if (iflink)