WNM: Workaround for broken AP operating class behavior

Some APs do not advertise operating classes correctly for BSS Transition
Management. Try to determine the most likely operating frequency based
on the channel number (1..14 --> 2.4 GHz; 36..169 --> 5 GHz) if invalid
op_class == 0 is received in a BSS Transition Management Request. This
speeds up the following operating by avoiding a full scan due to an
unknown channel.

Signed-off-by: Jouni Malinen <jouni@qca.qualcomm.com>
This commit is contained in:
Jouni Malinen 2016-02-05 17:06:06 +02:00 committed by Jouni Malinen
parent af060932de
commit 80ce804e88

View file

@ -429,6 +429,7 @@ static int wnm_nei_get_chan(struct wpa_supplicant *wpa_s, u8 op_class, u8 chan)
{ {
struct wpa_bss *bss = wpa_s->current_bss; struct wpa_bss *bss = wpa_s->current_bss;
const char *country = NULL; const char *country = NULL;
int freq;
if (bss) { if (bss) {
const u8 *elem = wpa_bss_get_ie(bss, WLAN_EID_COUNTRY); const u8 *elem = wpa_bss_get_ie(bss, WLAN_EID_COUNTRY);
@ -437,7 +438,21 @@ static int wnm_nei_get_chan(struct wpa_supplicant *wpa_s, u8 op_class, u8 chan)
country = (const char *) (elem + 2); country = (const char *) (elem + 2);
} }
return ieee80211_chan_to_freq(country, op_class, chan); freq = ieee80211_chan_to_freq(country, op_class, chan);
if (freq <= 0 && op_class == 0) {
/*
* Some APs do not advertise correct operating class
* information. Try to determine the most likely operating
* frequency based on the channel number.
*/
if (chan >= 1 && chan <= 13)
freq = 2407 + chan * 5;
else if (chan == 14)
freq = 2484;
else if (chan >= 36 && chan <= 169)
freq = 5000 + chan * 5;
}
return freq;
} }