diff options
author | Johannes Berg <johannes@sipsolutions.net> | 2017-03-17 10:24:15 +0100 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2017-03-17 11:39:55 +0100 |
commit | b6ecfd469e82886308b44bf715d48fbe7b19ad4c (patch) | |
tree | b652bf22e80e53e555c1e39fae735f6dc58243f4 /net/wireless | |
parent | 335d534938d327d5ba266564b7e6beaf5d456dd2 (diff) | |
download | lwn-b6ecfd469e82886308b44bf715d48fbe7b19ad4c.tar.gz lwn-b6ecfd469e82886308b44bf715d48fbe7b19ad4c.zip |
cfg80211: preserve wdev ID across netns changes
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>
Diffstat (limited to 'net/wireless')
-rw-r--r-- | net/wireless/core.c | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c index b1a028d381ef..b0d6761f0cdd 100644 --- a/net/wireless/core.c +++ b/net/wireless/core.c @@ -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 */ |