mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-25 02:09:42 +00:00
cfg80211: avoid intersection when applying self-managed reg
The custom-reg handling function can currently only add flags to a given channel. This results in stale flags being left applied. In some cases a channel was disabled and even the orig_flags were changed to reflect this. Previously the API was designed for a single invocation before wiphy registration, so this didn't matter. The previous approach doesn't scale well to self-managed regulatory devices, particularly when a more permissive regdom is applied after a restrictive one. Signed-off-by: Arik Nemtsov <arikx.nemtsov@intel.com> Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
1bdd716cbc
commit
db8dfee57d
1 changed files with 13 additions and 3 deletions
|
@ -1680,8 +1680,12 @@ static void handle_channel_custom(struct wiphy *wiphy,
|
|||
if (IS_ERR(reg_rule)) {
|
||||
REG_DBG_PRINT("Disabling freq %d MHz as custom regd has no rule that fits it\n",
|
||||
chan->center_freq);
|
||||
chan->orig_flags |= IEEE80211_CHAN_DISABLED;
|
||||
chan->flags = chan->orig_flags;
|
||||
if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED) {
|
||||
chan->flags |= IEEE80211_CHAN_DISABLED;
|
||||
} else {
|
||||
chan->orig_flags |= IEEE80211_CHAN_DISABLED;
|
||||
chan->flags = chan->orig_flags;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -1706,7 +1710,13 @@ static void handle_channel_custom(struct wiphy *wiphy,
|
|||
chan->dfs_state = NL80211_DFS_USABLE;
|
||||
|
||||
chan->beacon_found = false;
|
||||
chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
|
||||
|
||||
if (wiphy->regulatory_flags & REGULATORY_WIPHY_SELF_MANAGED)
|
||||
chan->flags = chan->orig_flags | bw_flags |
|
||||
map_regdom_flags(reg_rule->flags);
|
||||
else
|
||||
chan->flags |= map_regdom_flags(reg_rule->flags) | bw_flags;
|
||||
|
||||
chan->max_antenna_gain = (int) MBI_TO_DBI(power_rule->max_antenna_gain);
|
||||
chan->max_reg_power = chan->max_power =
|
||||
(int) MBM_TO_DBM(power_rule->max_eirp);
|
||||
|
|
Loading…
Reference in a new issue