diff options
author | Johannes Berg <johannes.berg@intel.com> | 2024-05-06 21:11:59 +0200 |
---|---|---|
committer | Johannes Berg <johannes.berg@intel.com> | 2024-05-23 11:28:48 +0200 |
commit | 2d33ecf5d0148671c74e68e18755b9411a7ba923 (patch) | |
tree | 813ac93b17321a38d76a7d06cbbd42da6e77698e /net/wireless/nl80211.c | |
parent | ce9e660ef32e87441bf59b04f67a24113e82546a (diff) | |
download | linux-2d33ecf5d0148671c74e68e18755b9411a7ba923.tar.gz linux-2d33ecf5d0148671c74e68e18755b9411a7ba923.tar.bz2 linux-2d33ecf5d0148671c74e68e18755b9411a7ba923.zip |
wifi: cfg80211: restrict operation during radar detection
Just like it's not currently possible to start radar
detection while already operating, it shouldn't be
possible to start operating while radar detection is
running. Fix that.
Also, improve the check whether operating (carrier
might not be up if e.g. attempting to join IBSS).
Reviewed-by: Miriam Rachel Korenblit <miriam.rachel.korenblit@intel.com>
Link: https://msgid.link/20240506211158.ae8dca3d0d6c.I7c70a66a5fbdbc63a78fee8a34f31d1995491bc3@changeid
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
Diffstat (limited to 'net/wireless/nl80211.c')
-rw-r--r-- | net/wireless/nl80211.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c index 93c313149f57..6ba988a6f5a2 100644 --- a/net/wireless/nl80211.c +++ b/net/wireless/nl80211.c @@ -5964,6 +5964,9 @@ static int nl80211_start_ap(struct sk_buff *skb, struct genl_info *info) if (!rdev->ops->start_ap) return -EOPNOTSUPP; + if (wdev->cac_started) + return -EBUSY; + if (wdev->links[link_id].ap.beacon_interval) return -EALREADY; @@ -9956,6 +9959,17 @@ static int nl80211_start_radar_detection(struct sk_buff *skb, flush_delayed_work(&rdev->dfs_update_channels_wk); + switch (wdev->iftype) { + case NL80211_IFTYPE_AP: + case NL80211_IFTYPE_P2P_GO: + case NL80211_IFTYPE_MESH_POINT: + case NL80211_IFTYPE_ADHOC: + break; + default: + /* caution - see cfg80211_beaconing_iface_active() below */ + return -EINVAL; + } + wiphy_lock(wiphy); dfs_region = reg_get_dfs_region(wiphy); @@ -9986,12 +10000,7 @@ static int nl80211_start_radar_detection(struct sk_buff *skb, goto unlock; } - if (netif_carrier_ok(dev)) { - err = -EBUSY; - goto unlock; - } - - if (wdev->cac_started) { + if (cfg80211_beaconing_iface_active(wdev) || wdev->cac_started) { err = -EBUSY; goto unlock; } |