staging: rtl8723au: rtw_check_bcn_info23a(): Use cfg80211_find_ie()
authorJes Sorensen <Jes.Sorensen@redhat.com>
Tue, 15 Apr 2014 17:43:59 +0000 (19:43 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 15 Apr 2014 18:04:00 +0000 (11:04 -0700)
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/staging/rtl8723au/core/rtw_wlan_util.c

index ac9d39a7c4f4e578180800087cc5c77e64ea72a1..ff5cbc99dc47d2f62b490f50b25e825a85745919 100644 (file)
@@ -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 {