mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
cfg80211: add helper fn for single rule channels
As a preparation to handle adjacent rule channels, factor out handling channels located in a single regulatory rule. Signed-off-by: Markus Theil <markus.theil@tu-ilmenau.de> Link: https://lore.kernel.org/r/20200803144353.305538-1-markus.theil@tu-ilmenau.de Signed-off-by: Johannes Berg <johannes.berg@intel.com>
This commit is contained in:
parent
c8b8280230
commit
7c9ff7e232
1 changed files with 59 additions and 47 deletions
|
@ -1691,57 +1691,18 @@ static uint32_t reg_rule_to_chan_bw_flags(const struct ieee80211_regdomain *regd
|
||||||
return bw_flags;
|
return bw_flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
static void handle_channel_single_rule(struct wiphy *wiphy,
|
||||||
* Note that right now we assume the desired channel bandwidth
|
|
||||||
* is always 20 MHz for each individual channel (HT40 uses 20 MHz
|
|
||||||
* per channel, the primary and the extension channel).
|
|
||||||
*/
|
|
||||||
static void handle_channel(struct wiphy *wiphy,
|
|
||||||
enum nl80211_reg_initiator initiator,
|
enum nl80211_reg_initiator initiator,
|
||||||
struct ieee80211_channel *chan)
|
struct ieee80211_channel *chan,
|
||||||
|
u32 flags,
|
||||||
|
struct regulatory_request *lr,
|
||||||
|
struct wiphy *request_wiphy,
|
||||||
|
const struct ieee80211_reg_rule *reg_rule)
|
||||||
{
|
{
|
||||||
u32 flags, bw_flags = 0;
|
u32 bw_flags = 0;
|
||||||
const struct ieee80211_reg_rule *reg_rule = NULL;
|
|
||||||
const struct ieee80211_power_rule *power_rule = NULL;
|
const struct ieee80211_power_rule *power_rule = NULL;
|
||||||
struct wiphy *request_wiphy = NULL;
|
|
||||||
struct regulatory_request *lr = get_last_request();
|
|
||||||
const struct ieee80211_regdomain *regd;
|
const struct ieee80211_regdomain *regd;
|
||||||
|
|
||||||
request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
|
|
||||||
|
|
||||||
flags = chan->orig_flags;
|
|
||||||
|
|
||||||
reg_rule = freq_reg_info(wiphy, ieee80211_channel_to_khz(chan));
|
|
||||||
if (IS_ERR(reg_rule)) {
|
|
||||||
/*
|
|
||||||
* We will disable all channels that do not match our
|
|
||||||
* received regulatory rule unless the hint is coming
|
|
||||||
* from a Country IE and the Country IE had no information
|
|
||||||
* about a band. The IEEE 802.11 spec allows for an AP
|
|
||||||
* to send only a subset of the regulatory rules allowed,
|
|
||||||
* so an AP in the US that only supports 2.4 GHz may only send
|
|
||||||
* a country IE with information for the 2.4 GHz band
|
|
||||||
* while 5 GHz is still supported.
|
|
||||||
*/
|
|
||||||
if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
|
|
||||||
PTR_ERR(reg_rule) == -ERANGE)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
|
|
||||||
request_wiphy && request_wiphy == wiphy &&
|
|
||||||
request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
|
|
||||||
pr_debug("Disabling freq %d.%03d MHz for good\n",
|
|
||||||
chan->center_freq, chan->freq_offset);
|
|
||||||
chan->orig_flags |= IEEE80211_CHAN_DISABLED;
|
|
||||||
chan->flags = chan->orig_flags;
|
|
||||||
} else {
|
|
||||||
pr_debug("Disabling freq %d.%03d MHz\n",
|
|
||||||
chan->center_freq, chan->freq_offset);
|
|
||||||
chan->flags |= IEEE80211_CHAN_DISABLED;
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
regd = reg_get_regdomain(wiphy);
|
regd = reg_get_regdomain(wiphy);
|
||||||
|
|
||||||
power_rule = ®_rule->power_rule;
|
power_rule = ®_rule->power_rule;
|
||||||
|
@ -1803,6 +1764,57 @@ static void handle_channel(struct wiphy *wiphy,
|
||||||
chan->max_power = chan->max_reg_power;
|
chan->max_power = chan->max_reg_power;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Note that right now we assume the desired channel bandwidth
|
||||||
|
* is always 20 MHz for each individual channel (HT40 uses 20 MHz
|
||||||
|
* per channel, the primary and the extension channel).
|
||||||
|
*/
|
||||||
|
static void handle_channel(struct wiphy *wiphy,
|
||||||
|
enum nl80211_reg_initiator initiator,
|
||||||
|
struct ieee80211_channel *chan)
|
||||||
|
{
|
||||||
|
u32 flags = 0;
|
||||||
|
const struct ieee80211_reg_rule *reg_rule = NULL;
|
||||||
|
struct wiphy *request_wiphy = NULL;
|
||||||
|
struct regulatory_request *lr = get_last_request();
|
||||||
|
|
||||||
|
request_wiphy = wiphy_idx_to_wiphy(lr->wiphy_idx);
|
||||||
|
|
||||||
|
flags = chan->orig_flags;
|
||||||
|
|
||||||
|
reg_rule = freq_reg_info(wiphy, ieee80211_channel_to_khz(chan));
|
||||||
|
if (IS_ERR(reg_rule)) {
|
||||||
|
/* We will disable all channels that do not match our
|
||||||
|
* received regulatory rule unless the hint is coming
|
||||||
|
* from a Country IE and the Country IE had no information
|
||||||
|
* about a band. The IEEE 802.11 spec allows for an AP
|
||||||
|
* to send only a subset of the regulatory rules allowed,
|
||||||
|
* so an AP in the US that only supports 2.4 GHz may only send
|
||||||
|
* a country IE with information for the 2.4 GHz band
|
||||||
|
* while 5 GHz is still supported.
|
||||||
|
*/
|
||||||
|
if (initiator == NL80211_REGDOM_SET_BY_COUNTRY_IE &&
|
||||||
|
PTR_ERR(reg_rule) == -ERANGE)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (lr->initiator == NL80211_REGDOM_SET_BY_DRIVER &&
|
||||||
|
request_wiphy && request_wiphy == wiphy &&
|
||||||
|
request_wiphy->regulatory_flags & REGULATORY_STRICT_REG) {
|
||||||
|
pr_debug("Disabling freq %d.%03d MHz for good\n",
|
||||||
|
chan->center_freq, chan->freq_offset);
|
||||||
|
chan->orig_flags |= IEEE80211_CHAN_DISABLED;
|
||||||
|
chan->flags = chan->orig_flags;
|
||||||
|
} else {
|
||||||
|
pr_debug("Disabling freq %d.%03d MHz\n",
|
||||||
|
chan->center_freq, chan->freq_offset);
|
||||||
|
chan->flags |= IEEE80211_CHAN_DISABLED;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
handle_channel_single_rule(wiphy, initiator, chan, flags, lr,
|
||||||
|
request_wiphy, reg_rule);
|
||||||
|
}
|
||||||
|
|
||||||
static void handle_band(struct wiphy *wiphy,
|
static void handle_band(struct wiphy *wiphy,
|
||||||
enum nl80211_reg_initiator initiator,
|
enum nl80211_reg_initiator initiator,
|
||||||
struct ieee80211_supported_band *sband)
|
struct ieee80211_supported_band *sband)
|
||||||
|
|
Loading…
Reference in a new issue