cfg80211: preserve wdev ID across netns changes
authorJohannes Berg <johannes@sipsolutions.net>
Fri, 17 Mar 2017 09:24:15 +0000 (10:24 +0100)
committerJohannes Berg <johannes.berg@intel.com>
Fri, 17 Mar 2017 10:39:55 +0000 (11:39 +0100)
When a wdev changes network namespace, its wdev ID will get
reassigned since NETDEV_REGISTER is called again, in the new
network namespace. Avoid that by checking if it was already
assigned before, and document why we do that.

Reported-and-tested-by: Arend Van Spriel <arend.vanspriel@broadcom.com>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
net/wireless/core.c

index b1a028d381efb438745e8bec1b6faf386b3e0d29..b0d6761f0cdd77ba67bf3caff2df6fcab4733e3c 100644 (file)
@@ -1159,7 +1159,15 @@ static int cfg80211_netdev_notifier_call(struct notifier_block *nb,
                INIT_LIST_HEAD(&wdev->mgmt_registrations);
                spin_lock_init(&wdev->mgmt_registrations_lock);
 
-               wdev->identifier = ++rdev->wdev_id;
+               /*
+                * We get here also when the interface changes network namespaces,
+                * as it's registered into the new one, but we don't want it to
+                * change ID in that case. Checking if the ID is already assigned
+                * works, because 0 isn't considered a valid ID and the memory is
+                * 0-initialized.
+                */
+               if (!wdev->identifier)
+                       wdev->identifier = ++rdev->wdev_id;
                list_add_rcu(&wdev->list, &rdev->wiphy.wdev_list);
                rdev->devlist_generation++;
                /* can only change netns with wiphy */