Commit 71e6195e authored by Michal Kazior's avatar Michal Kazior Committed by Johannes Berg

mac80211: make check_combinations() aware of chanctx reservation

The ieee80211_check_combinations() computes
radar_detect accordingly depending on chanctx
reservation status.

This makes it possible to use the function for
channel_switch validation.
Signed-off-by: default avatarMichal Kazior <michal.kazior@tieto.com>
Signed-off-by: default avatarJohannes Berg <johannes.berg@intel.com>
parent 5bcae31d
...@@ -2933,6 +2933,35 @@ void ieee80211_recalc_dtim(struct ieee80211_local *local, ...@@ -2933,6 +2933,35 @@ void ieee80211_recalc_dtim(struct ieee80211_local *local,
ps->dtim_count = dtim_count; ps->dtim_count = dtim_count;
} }
static u8 ieee80211_chanctx_radar_detect(struct ieee80211_local *local,
struct ieee80211_chanctx *ctx)
{
struct ieee80211_sub_if_data *sdata;
u8 radar_detect = 0;
lockdep_assert_held(&local->chanctx_mtx);
if (WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED))
return 0;
list_for_each_entry(sdata, &ctx->reserved_vifs, reserved_chanctx_list)
if (sdata->reserved_radar_required)
radar_detect |= BIT(sdata->reserved_chandef.width);
/*
* An in-place reservation context should not have any assigned vifs
* until it replaces the other context.
*/
WARN_ON(ctx->replace_state == IEEE80211_CHANCTX_REPLACES_OTHER &&
!list_empty(&ctx->assigned_vifs));
list_for_each_entry(sdata, &ctx->assigned_vifs, assigned_chanctx_list)
if (sdata->radar_required)
radar_detect |= BIT(sdata->vif.bss_conf.chandef.width);
return radar_detect;
}
int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
const struct cfg80211_chan_def *chandef, const struct cfg80211_chan_def *chandef,
enum ieee80211_chanctx_mode chanmode, enum ieee80211_chanctx_mode chanmode,
...@@ -2976,8 +3005,7 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata, ...@@ -2976,8 +3005,7 @@ int ieee80211_check_combinations(struct ieee80211_sub_if_data *sdata,
list_for_each_entry(ctx, &local->chanctx_list, list) { list_for_each_entry(ctx, &local->chanctx_list, list) {
if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED) if (ctx->replace_state == IEEE80211_CHANCTX_WILL_BE_REPLACED)
continue; continue;
if (ctx->conf.radar_enabled) radar_detect |= ieee80211_chanctx_radar_detect(local, ctx);
radar_detect |= BIT(ctx->conf.def.width);
if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) { if (ctx->mode == IEEE80211_CHANCTX_EXCLUSIVE) {
num_different_channels++; num_different_channels++;
continue; continue;
...@@ -3039,8 +3067,7 @@ int ieee80211_max_num_channels(struct ieee80211_local *local) ...@@ -3039,8 +3067,7 @@ int ieee80211_max_num_channels(struct ieee80211_local *local)
num_different_channels++; num_different_channels++;
if (ctx->conf.radar_enabled) radar_detect |= ieee80211_chanctx_radar_detect(local, ctx);
radar_detect |= BIT(ctx->conf.def.width);
} }
list_for_each_entry_rcu(sdata, &local->interfaces, list) list_for_each_entry_rcu(sdata, &local->interfaces, list)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment