summaryrefslogtreecommitdiffstats
path: root/net
diff options
context:
space:
mode:
authorMartin Willi <martin@strongswan.org>2018-10-27 09:31:24 +0200
committerJohannes Berg <johannes.berg@intel.com>2018-11-09 11:21:10 +0100
commitc90b670b5c610266e255848f7fc774b57189a9a4 (patch)
tree307d67cc9b49c1b9bc398932268de98e014ac527 /net
parentcee7013be9b71082c7ea63c46850157aaa1bf4b1 (diff)
downloadlinux-c90b670b5c610266e255848f7fc774b57189a9a4.tar.gz
linux-c90b670b5c610266e255848f7fc774b57189a9a4.tar.bz2
linux-c90b670b5c610266e255848f7fc774b57189a9a4.zip
nl80211: announce radios/interfaces when switching namespaces
When a wiphy changes its namespace, all interfaces are moved to the new namespace as well. The network interfaces are properly announced as leaving on the old and as appearing on the new namespace through RTM_NEWLINK/RTM_DELLINK. On nl80211, however, these events are missing for radios and their interfaces. Add netlink announcements through nl80211 when switching namespaces, so userspace can rely on these events to discover radios properly. Signed-off-by: Martin Willi <martin@strongswan.org> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net')
-rw-r--r--net/wireless/core.c14
1 files changed, 14 insertions, 0 deletions
diff --git a/net/wireless/core.c b/net/wireless/core.c
index 0a3092c56b3e..623dfe5e211c 100644
--- a/net/wireless/core.c
+++ b/net/wireless/core.c
@@ -191,11 +191,25 @@ int cfg80211_switch_netns(struct cfg80211_registered_device *rdev,
return err;
}
+ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
+ if (!wdev->netdev)
+ continue;
+ nl80211_notify_iface(rdev, wdev, NL80211_CMD_DEL_INTERFACE);
+ }
+ nl80211_notify_wiphy(rdev, NL80211_CMD_DEL_WIPHY);
+
wiphy_net_set(&rdev->wiphy, net);
err = device_rename(&rdev->wiphy.dev, dev_name(&rdev->wiphy.dev));
WARN_ON(err);
+ nl80211_notify_wiphy(rdev, NL80211_CMD_NEW_WIPHY);
+ list_for_each_entry(wdev, &rdev->wiphy.wdev_list, list) {
+ if (!wdev->netdev)
+ continue;
+ nl80211_notify_iface(rdev, wdev, NL80211_CMD_NEW_INTERFACE);
+ }
+
return 0;
}