mac80211: fix scan when operating on DFS channels in ETSI domains
In non-ETSI regulatory domains scan is blocked when operating channel is a DFS channel. For ETSI, however, once DFS channel is marked as available after the CAC, this channel will remain available (for some time) even after leaving this channel. Therefore a scan can be done without any impact on the availability of the DFS channel as no new CAC is required after the scan. Enable scan in mac80211 in these cases. Signed-off-by: Aaron Komisar <aaron.komisar@tandemg.com> Link: https://lore.kernel.org/r/1570024728-17284-1-git-send-email-aaron.komisar@tandemg.com Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:

committed by
Johannes Berg

parent
95697f9907
commit
dc0c18ed22
@@ -520,10 +520,33 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool __ieee80211_can_leave_ch(struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
struct ieee80211_local *local = sdata->local;
|
||||
struct ieee80211_sub_if_data *sdata_iter;
|
||||
|
||||
if (!ieee80211_is_radar_required(local))
|
||||
return true;
|
||||
|
||||
if (!regulatory_pre_cac_allowed(local->hw.wiphy))
|
||||
return false;
|
||||
|
||||
mutex_lock(&local->iflist_mtx);
|
||||
list_for_each_entry(sdata_iter, &local->interfaces, list) {
|
||||
if (sdata_iter->wdev.cac_started) {
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
mutex_unlock(&local->iflist_mtx);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool ieee80211_can_scan(struct ieee80211_local *local,
|
||||
struct ieee80211_sub_if_data *sdata)
|
||||
{
|
||||
if (ieee80211_is_radar_required(local))
|
||||
if (!__ieee80211_can_leave_ch(sdata))
|
||||
return false;
|
||||
|
||||
if (!list_empty(&local->roc_list))
|
||||
@@ -630,7 +653,10 @@ static int __ieee80211_start_scan(struct ieee80211_sub_if_data *sdata,
|
||||
|
||||
lockdep_assert_held(&local->mtx);
|
||||
|
||||
if (local->scan_req || ieee80211_is_radar_required(local))
|
||||
if (local->scan_req)
|
||||
return -EBUSY;
|
||||
|
||||
if (!__ieee80211_can_leave_ch(sdata))
|
||||
return -EBUSY;
|
||||
|
||||
if (!ieee80211_can_scan(local, sdata)) {
|
||||
|
Reference in New Issue
Block a user