From 3ffa4355a212434a4884946996cbed76d255765f Mon Sep 17 00:00:00 2001 From: Jes Sorensen Date: Tue, 15 Apr 2014 19:43:59 +0200 Subject: [PATCH] staging: rtl8723au: rtw_check_bcn_info23a(): Use cfg80211_find_ie() Signed-off-by: Jes Sorensen Signed-off-by: Greg Kroah-Hartman --- .../staging/rtl8723au/core/rtw_wlan_util.c | 117 ++++++++++-------- 1 file changed, 62 insertions(+), 55 deletions(-) diff --git a/drivers/staging/rtl8723au/core/rtw_wlan_util.c b/drivers/staging/rtl8723au/core/rtw_wlan_util.c index ac9d39a7c4f4..ff5cbc99dc47 100644 --- a/drivers/staging/rtl8723au/core/rtw_wlan_util.c +++ b/drivers/staging/rtl8723au/core/rtw_wlan_util.c @@ -857,10 +857,8 @@ void VCS_update23a(struct rtw_adapter *padapter, struct sta_info *psta) } int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, - struct ieee80211_mgmt *mgmt, u32 packet_len) + struct ieee80211_mgmt *mgmt, u32 pkt_len) { - unsigned int len; - unsigned char *p; unsigned short val16; struct wlan_network *cur_network = &Adapter->mlmepriv.cur_network; u16 wpa_len = 0, rsn_len = 0; @@ -875,6 +873,9 @@ int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, u32 bcn_channel; unsigned short ht_cap_info; unsigned char ht_info_infos_0; + int len, pie_len, ie_offset; + const u8 *p; + u8 *pie; if (is_client_associated_to_ap23a(Adapter) == false) return true; @@ -885,7 +886,7 @@ int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, return false; } - len = packet_len - sizeof(struct ieee80211_hdr_3addr); + len = pkt_len - sizeof(struct ieee80211_hdr_3addr); if (len > MAX_IE_SZ) { DBG_8723A("%s IE too long for survey event\n", __func__); @@ -913,70 +914,76 @@ int rtw_check_bcn_info23a(struct rtw_adapter *Adapter, /* check bw and channel offset */ /* parsing HT_CAP_IE */ - p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, - WLAN_EID_HT_CAPABILITY, - &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (p && len>0) { - pht_cap = (struct ieee80211_ht_cap *)(p + 2); - ht_cap_info = pht_cap->cap_info; - } else { - ht_cap_info = 0; - } + ie_offset = offsetof(struct ieee80211_mgmt, u.beacon.variable) - + offsetof(struct ieee80211_mgmt, u); + pie = bssid->IEs + ie_offset; + pie_len = pkt_len - ie_offset; + + p = cfg80211_find_ie(WLAN_EID_HT_CAPABILITY, pie, pie_len); + if (p && p[1] > 0) { + pht_cap = (struct ieee80211_ht_cap *)(p + 2); + ht_cap_info = pht_cap->cap_info; + } else + ht_cap_info = 0; + /* parsing HT_INFO_IE */ - p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, WLAN_EID_HT_OPERATION, - &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (p && len>0) { - pht_info = (struct HT_info_element *)(p + 2); - ht_info_infos_0 = pht_info->infos[0]; - } else { - ht_info_infos_0 = 0; - } + p = cfg80211_find_ie(WLAN_EID_HT_OPERATION, pie, pie_len); + if (p && p[1] > 0) { + pht_info = (struct HT_info_element *)(p + 2); + ht_info_infos_0 = pht_info->infos[0]; + } else + ht_info_infos_0 = 0; + if (ht_cap_info != cur_network->BcnInfo.ht_cap_info || - ((ht_info_infos_0&0x03) != (cur_network->BcnInfo.ht_info_infos_0&0x03))) { - DBG_8723A("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, - ht_cap_info, ht_info_infos_0); - DBG_8723A("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", __func__, - cur_network->BcnInfo.ht_cap_info, cur_network->BcnInfo.ht_info_infos_0); - DBG_8723A("%s bw mode change, disconnect\n", __func__); - /* bcn_info_update */ - cur_network->BcnInfo.ht_cap_info = ht_cap_info; - cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0; - /* to do : need to check that whether modify related register of BB or not */ + ((ht_info_infos_0 & 0x03) != + (cur_network->BcnInfo.ht_info_infos_0 & 0x03))) { + DBG_8723A("%s bcn now: ht_cap_info:%x ht_info_infos_0:%x\n", + __func__, ht_cap_info, ht_info_infos_0); + DBG_8723A("%s bcn link: ht_cap_info:%x ht_info_infos_0:%x\n", + __func__, cur_network->BcnInfo.ht_cap_info, + cur_network->BcnInfo.ht_info_infos_0); + DBG_8723A("%s bw mode change, disconnect\n", __func__); + /* bcn_info_update */ + cur_network->BcnInfo.ht_cap_info = ht_cap_info; + cur_network->BcnInfo.ht_info_infos_0 = ht_info_infos_0; + /* to do : need to check that whether modify related + register of BB or not */ } /* Checking for channel */ - p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, WLAN_EID_DS_PARAMS, - &len, bssid->IELength - _FIXED_IE_LENGTH_); - if (p) { - bcn_channel = *(p + 2); - } else {/* In 5G, some ap do not have DSSET IE checking HT info for channel */ - p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, - WLAN_EID_HT_OPERATION, &len, - bssid->IELength - _FIXED_IE_LENGTH_); - if (pht_info) { - bcn_channel = pht_info->primary_channel; - } else { /* we don't find channel IE, so don't check it */ - DBG_8723A("Oops: %s we don't find channel IE, so don't check it\n", __func__); - bcn_channel = Adapter->mlmeextpriv.cur_channel; - } + p = cfg80211_find_ie(WLAN_EID_DS_PARAMS, pie, pie_len); + if (p) + bcn_channel = p[2]; + else { + /* In 5G, some ap do not have DSSET IE checking HT + info for channel */ + p = cfg80211_find_ie(WLAN_EID_HT_OPERATION, pie, pie_len); + + if (pht_info) + bcn_channel = pht_info->primary_channel; + else { /* we don't find channel IE, so don't check it */ + DBG_8723A("Oops: %s we don't find channel IE, so don't " + "check it\n", __func__); + bcn_channel = Adapter->mlmeextpriv.cur_channel; + } } if (bcn_channel != Adapter->mlmeextpriv.cur_channel) { - DBG_8723A("%s beacon channel:%d cur channel:%d disconnect\n", __func__, - bcn_channel, Adapter->mlmeextpriv.cur_channel); - goto _mismatch; + DBG_8723A("%s beacon channel:%d cur channel:%d disconnect\n", + __func__, bcn_channel, + Adapter->mlmeextpriv.cur_channel); + goto _mismatch; } /* checking SSID */ - if ((p = rtw_get_ie23a(bssid->IEs + _FIXED_IE_LENGTH_, WLAN_EID_SSID, - &len, bssid->IELength - _FIXED_IE_LENGTH_)) == - NULL) { - DBG_8723A("%s marc: cannot find SSID for survey event\n", __func__); + p = cfg80211_find_ie(WLAN_EID_SSID, pie, pie_len); + if (!p) { + DBG_8723A("%s marc: cannot find SSID for survey event\n", + __func__); hidden_ssid = true; - } else { + } else hidden_ssid = false; - } - if ((NULL != p) && (false == hidden_ssid && (*(p + 1)))) { + if (p && (hidden_ssid == false && *(p + 1))) { memcpy(bssid->Ssid.ssid, (p + 2), *(p + 1)); bssid->Ssid.ssid_len = *(p + 1); } else {