mac80211: Fix n-band association problem
There are two structures named wmm_info and wmm_param, they are used while parsing the beacon frame. (Check the function ieee802_11_parse_elems). Certain APs like D-link does not set the fifth bit in WMM IE. While sending the association request to n-only ap it checks for wmm_ie. If it is set then only ieee80211_ht_cap is sent during association request. So n-only association fails. And this patch fixes this problem by copying the wmm_info to wmm_ie, which enables the "wmm" flag in iee80211_send_assoc. Signed-off-by: Abhijeet Kolekar <abhijeet.kolekar@intel.com> Acked-by: Ron Rindjunsky <ron.rindjunsky@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
parent
d7d313000b
commit
a46f025d05
|
@ -2709,7 +2709,26 @@ static void ieee80211_rx_bss_info(struct net_device *dev,
|
||||||
bss->wmm_ie_len = elems.wmm_param_len + 2;
|
bss->wmm_ie_len = elems.wmm_param_len + 2;
|
||||||
} else
|
} else
|
||||||
bss->wmm_ie_len = 0;
|
bss->wmm_ie_len = 0;
|
||||||
} else if (!elems.wmm_param && bss->wmm_ie) {
|
} else if (elems.wmm_info &&
|
||||||
|
(!bss->wmm_ie || bss->wmm_ie_len != elems.wmm_info_len ||
|
||||||
|
memcmp(bss->wmm_ie, elems.wmm_info, elems.wmm_info_len))) {
|
||||||
|
/* As for certain AP's Fifth bit is not set in WMM IE in
|
||||||
|
* beacon frames.So while parsing the beacon frame the
|
||||||
|
* wmm_info structure is used instead of wmm_param.
|
||||||
|
* wmm_info structure was never used to set bss->wmm_ie.
|
||||||
|
* This code fixes this problem by copying the WME
|
||||||
|
* information from wmm_info to bss->wmm_ie and enabling
|
||||||
|
* n-band association.
|
||||||
|
*/
|
||||||
|
kfree(bss->wmm_ie);
|
||||||
|
bss->wmm_ie = kmalloc(elems.wmm_info_len + 2, GFP_ATOMIC);
|
||||||
|
if (bss->wmm_ie) {
|
||||||
|
memcpy(bss->wmm_ie, elems.wmm_info - 2,
|
||||||
|
elems.wmm_info_len + 2);
|
||||||
|
bss->wmm_ie_len = elems.wmm_info_len + 2;
|
||||||
|
} else
|
||||||
|
bss->wmm_ie_len = 0;
|
||||||
|
} else if (!elems.wmm_param && !elems.wmm_info && bss->wmm_ie) {
|
||||||
kfree(bss->wmm_ie);
|
kfree(bss->wmm_ie);
|
||||||
bss->wmm_ie = NULL;
|
bss->wmm_ie = NULL;
|
||||||
bss->wmm_ie_len = 0;
|
bss->wmm_ie_len = 0;
|
||||||
|
|
Loading…
Reference in New Issue