hostapd: Check for overlapping 20 MHz BSS before starting 20/40 MHz BSS
Before starting a 20/40 MHz BSS on the 2.4 GHz band, a 40-MHz-capable HT AP is required by the rules defined in IEEE Std 802.11-2012 10.15.5 to examine the channels of the current operational regulatory domain to determine whether the operation of a 20/40 MHz BSS might unfairly interfere with the operation of existing 20 MHz BSSs. The AP (or some of its associated HT STAs) is required to scan all of the channels of the current regulatory domain in order to ascertain the operating channels of any existing 20 MHz BSSs and 20/40 MHz BSSs. (IEEE 802.11-2012 S.5.2 Establishing a 20/40 MHz BSS). Add the check for an overlapping 20 MHz BSS to the initial AP scan for the P == OT_i case in 10.15.3.2. Signed-off-by: Rajkumar Manoharan <rmanohar@qti.qualcomm.com>
This commit is contained in:
parent
5516ed32c5
commit
f41d55da02
1 changed files with 38 additions and 0 deletions
|
@ -395,6 +395,36 @@ static int ieee80211n_check_40mhz_5g(struct hostapd_iface *iface,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int ieee80211n_check_20mhz_bss(struct wpa_scan_res *bss, int pri_freq,
|
||||||
|
int start, int end)
|
||||||
|
{
|
||||||
|
struct ieee802_11_elems elems;
|
||||||
|
struct ieee80211_ht_operation *oper;
|
||||||
|
|
||||||
|
if (bss->freq < start || bss->freq > end || bss->freq == pri_freq)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
ieee802_11_parse_elems((u8 *) (bss + 1), bss->ie_len, &elems, 0);
|
||||||
|
if (!elems.ht_capabilities) {
|
||||||
|
wpa_printf(MSG_DEBUG, "Found overlapping legacy BSS: "
|
||||||
|
MACSTR " freq=%d", MAC2STR(bss->bssid), bss->freq);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (elems.ht_operation &&
|
||||||
|
elems.ht_operation_len >= sizeof(*oper)) {
|
||||||
|
oper = (struct ieee80211_ht_operation *) elems.ht_operation;
|
||||||
|
if (oper->ht_param & HT_INFO_HT_PARAM_SECONDARY_CHNL_OFF_MASK)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
wpa_printf(MSG_DEBUG, "Found overlapping 20 MHz HT BSS: "
|
||||||
|
MACSTR " freq=%d", MAC2STR(bss->bssid), bss->freq);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static int ieee80211n_check_40mhz_2g4(struct hostapd_iface *iface,
|
static int ieee80211n_check_40mhz_2g4(struct hostapd_iface *iface,
|
||||||
struct wpa_scan_results *scan_res)
|
struct wpa_scan_results *scan_res)
|
||||||
{
|
{
|
||||||
|
@ -418,6 +448,14 @@ static int ieee80211n_check_40mhz_2g4(struct hostapd_iface *iface,
|
||||||
int sec_chan, pri_chan;
|
int sec_chan, pri_chan;
|
||||||
struct ieee802_11_elems elems;
|
struct ieee802_11_elems elems;
|
||||||
|
|
||||||
|
/* Check for overlapping 20 MHz BSS */
|
||||||
|
if (ieee80211n_check_20mhz_bss(bss, pri_freq, affected_start,
|
||||||
|
affected_end)) {
|
||||||
|
wpa_printf(MSG_DEBUG,
|
||||||
|
"Overlapping 20 MHz BSS is found");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
ieee80211n_get_pri_sec_chan(bss, &pri_chan, &sec_chan);
|
ieee80211n_get_pri_sec_chan(bss, &pri_chan, &sec_chan);
|
||||||
|
|
||||||
if (sec_chan) {
|
if (sec_chan) {
|
||||||
|
|
Loading…
Reference in a new issue