diff options
author | Jes Sorensen <Jes.Sorensen@redhat.com> | 2014-05-21 09:37:42 +0200 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@linuxfoundation.org> | 2014-05-23 16:27:43 +0900 |
commit | b171da3c6ee98f170b1064319095b9516851a757 (patch) | |
tree | 26a00f705848a779a9eafd4a6942621a05af27f9 /drivers/staging/rtl8723au/core/rtw_wlan_util.c | |
parent | staging: rtli8723au: Get rid of struct ndis_802_11_fixed_ies (diff) | |
download | linux-dev-b171da3c6ee98f170b1064319095b9516851a757.tar.xz linux-dev-b171da3c6ee98f170b1064319095b9516851a757.zip |
staging: rtl8723au: Get rid of struct ndis_802_11_var_ies
Signed-off-by: Jes Sorensen <Jes.Sorensen@redhat.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/staging/rtl8723au/core/rtw_wlan_util.c')
-rw-r--r-- | drivers/staging/rtl8723au/core/rtw_wlan_util.c | 143 |
1 files changed, 68 insertions, 75 deletions
diff --git a/drivers/staging/rtl8723au/core/rtw_wlan_util.c b/drivers/staging/rtl8723au/core/rtw_wlan_util.c index ce73cbecd20b..68ba22555d38 100644 --- a/drivers/staging/rtl8723au/core/rtw_wlan_util.c +++ b/drivers/staging/rtl8723au/core/rtw_wlan_util.c @@ -512,8 +512,7 @@ void flush_all_cam_entry23a(struct rtw_adapter *padapter) memset(pmlmeinfo->FW_sta_info, 0, sizeof(pmlmeinfo->FW_sta_info)); } -int WMM_param_handler23a(struct rtw_adapter *padapter, - struct ndis_802_11_var_ies *pIE) +int WMM_param_handler23a(struct rtw_adapter *padapter, u8 *p) { /* struct registry_priv *pregpriv = &padapter->registrypriv; */ struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -526,7 +525,7 @@ int WMM_param_handler23a(struct rtw_adapter *padapter, } pmlmeinfo->WMM_enable = 1; - memcpy(&pmlmeinfo->WMM_param, (pIE->data + 6), + memcpy(&pmlmeinfo->WMM_param, p + 2 + 6, sizeof(struct WMM_para_element)); return true; } @@ -642,8 +641,7 @@ void WMMOnAssocRsp23a(struct rtw_adapter *padapter) return; } -static void bwmode_update_check(struct rtw_adapter *padapter, - struct ndis_802_11_var_ies *pIE) +static void bwmode_update_check(struct rtw_adapter *padapter, u8 *p) { struct HT_info_element *pHT_info; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -654,14 +652,14 @@ static void bwmode_update_check(struct rtw_adapter *padapter, unsigned char new_bwmode; unsigned char new_ch_offset; - if (!pIE) + if (!p) return; if (!phtpriv->ht_option) return; - if (pIE->Length > sizeof(struct HT_info_element)) + if (p[1] > sizeof(struct HT_info_element)) return; - pHT_info = (struct HT_info_element *)pIE->data; + pHT_info = (struct HT_info_element *)(p + 2); if ((pHT_info->infos[0] & BIT(2)) && pregistrypriv->cbw40_enable) { new_bwmode = HT_CHANNEL_WIDTH_40; @@ -690,7 +688,7 @@ static void bwmode_update_check(struct rtw_adapter *padapter, pmlmeext->cur_ch_offset = new_ch_offset; /* update HT info also */ - HT_info_handler23a(padapter, pIE); + HT_info_handler23a(padapter, p); } else pmlmeinfo->bwmode_updated = false; @@ -721,8 +719,7 @@ static void bwmode_update_check(struct rtw_adapter *padapter, } } -void HT_caps_handler23a(struct rtw_adapter *padapter, - struct ndis_802_11_var_ies * pIE) +void HT_caps_handler23a(struct rtw_adapter *padapter, u8 *p) { unsigned int i; u8 rf_type; @@ -732,7 +729,7 @@ void HT_caps_handler23a(struct rtw_adapter *padapter, struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; - if (!pIE) + if (!p) return; if (phtpriv->ht_option == false) @@ -740,24 +737,25 @@ void HT_caps_handler23a(struct rtw_adapter *padapter, pmlmeinfo->HT_caps_enable = 1; - for (i = 0; i < pIE->Length; i++) { + for (i = 0; i < p[1]; i++) { if (i != 2) { /* Commented by Albert 2010/07/12 */ /* Got the endian issue here. */ - pmlmeinfo->HT_caps.u.HT_cap[i] &= (pIE->data[i]); + pmlmeinfo->HT_caps.u.HT_cap[i] &= p[i + 2]; } else { /* modify from fw by Thomas 2010/11/17 */ - if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (pIE->data[i] & 0x3)) - max_AMPDU_len = pIE->data[i] & 0x3; + if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3) > (p[i + 2] & 0x3)) + max_AMPDU_len = p[i + 2] & 0x3; else max_AMPDU_len = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x3; - if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (pIE->data[i] & 0x1c)) + if ((pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c) > (p[i + 2] & 0x1c)) min_MPDU_spacing = pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para & 0x1c; else - min_MPDU_spacing = (pIE->data[i] & 0x1c); + min_MPDU_spacing = p[i + 2] & 0x1c; - pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = max_AMPDU_len | min_MPDU_spacing; + pmlmeinfo->HT_caps.u.HT_cap_element.AMPDU_para = + max_AMPDU_len | min_MPDU_spacing; } } @@ -783,25 +781,24 @@ void HT_caps_handler23a(struct rtw_adapter *padapter, return; } -void HT_info_handler23a(struct rtw_adapter *padapter, - struct ndis_802_11_var_ies *pIE) +void HT_info_handler23a(struct rtw_adapter *padapter, u8 *p) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct ht_priv *phtpriv = &pmlmepriv->htpriv; - if (!pIE) + if (!p) return; if (phtpriv->ht_option == false) return; - if (pIE->Length > sizeof(struct HT_info_element)) + if (p[1] > sizeof(struct HT_info_element)) return; pmlmeinfo->HT_info_enable = 1; - memcpy(&pmlmeinfo->HT_info, pIE->data, pIE->Length); + memcpy(&pmlmeinfo->HT_info, p + 2, p[1]); return; } @@ -838,17 +835,16 @@ void HTOnAssocRsp23a(struct rtw_adapter *padapter) rtl8723a_set_ampdu_factor(padapter, max_AMPDU_len); } -void ERP_IE_handler23a(struct rtw_adapter *padapter, - struct ndis_802_11_var_ies *pIE) +void ERP_IE_handler23a(struct rtw_adapter *padapter, u8 *p) { struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; - if (pIE->Length > 1) + if (p[1] > 1) return; pmlmeinfo->ERP_enable = 1; - memcpy(&pmlmeinfo->ERP_IE, pIE->data, pIE->Length); + memcpy(&pmlmeinfo->ERP_IE, p + 2, p[1]); } void VCS_update23a(struct rtw_adapter *padapter, struct sta_info *psta) @@ -1138,41 +1134,42 @@ _mismatch: return _FAIL; } -void update_beacon23a_info(struct rtw_adapter *padapter, u8 *pframe, uint pkt_len, struct sta_info *psta) +void update_beacon23a_info(struct rtw_adapter *padapter, u8 *pframe, + uint pkt_len, struct sta_info *psta) { unsigned int i; unsigned int len; - struct ndis_802_11_var_ies * pIE; + u8 *p; len = pkt_len - (_BEACON_IE_OFFSET_ + sizeof(struct ieee80211_hdr_3addr)); for (i = 0; i < len;) { - pIE = (struct ndis_802_11_var_ies *)(pframe + (_BEACON_IE_OFFSET_ + sizeof(struct ieee80211_hdr_3addr)) + i); + p = (u8 *)(pframe + (_BEACON_IE_OFFSET_ + sizeof(struct ieee80211_hdr_3addr)) + i); - switch (pIE->ElementID) { + switch (p[0]) { case WLAN_EID_HT_OPERATION: /* HT info */ /* HT_info_handler23a(padapter, pIE); */ - bwmode_update_check(padapter, pIE); + bwmode_update_check(padapter, p); break; case WLAN_EID_ERP_INFO: - ERP_IE_handler23a(padapter, pIE); + ERP_IE_handler23a(padapter, p); VCS_update23a(padapter, psta); break; default: break; } - i += (pIE->Length + 2); + i += (p[1] + 2); } } bool is_ap_in_tkip23a(struct rtw_adapter *padapter) { u32 i; - struct ndis_802_11_var_ies *pIE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; + const u8 *p; int bcn_fixed_size; bcn_fixed_size = offsetof(struct ieee80211_mgmt, u.beacon.variable) - @@ -1180,24 +1177,22 @@ bool is_ap_in_tkip23a(struct rtw_adapter *padapter) if (rtw_get_capability23a(cur_network) & WLAN_CAPABILITY_PRIVACY) { for (i = bcn_fixed_size; i < pmlmeinfo->network.IELength;) { - pIE = (struct ndis_802_11_var_ies *) - (pmlmeinfo->network.IEs + i); + p = pmlmeinfo->network.IEs + i; - switch (pIE->ElementID) { + switch (p[0]) { case WLAN_EID_VENDOR_SPECIFIC: - if (!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4)&& - !memcmp((pIE->data + 12), - WPA_TKIP_CIPHER, 4)) + if (!memcmp(p + 2, RTW_WPA_OUI23A_TYPE, 4) && + !memcmp(p + 2 + 12, WPA_TKIP_CIPHER, 4)) return true; break; case WLAN_EID_RSN: - if (!memcmp(pIE->data + 8, RSN_TKIP_CIPHER, 4)) + if (!memcmp(p + 2 + 8, RSN_TKIP_CIPHER, 4)) return true; break; default: break; } - i += (pIE->Length + 2); + i += (p[1] + 2); } return false; } else @@ -1207,9 +1202,9 @@ bool is_ap_in_tkip23a(struct rtw_adapter *padapter) bool should_forbid_n_rate23a(struct rtw_adapter * padapter) { u32 i; - struct ndis_802_11_var_ies *pIE; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_bssid_ex *cur_network = &pmlmepriv->cur_network.network; + const u8 *p; int bcn_fixed_size; bcn_fixed_size = offsetof(struct ieee80211_mgmt, u.beacon.variable) - @@ -1217,29 +1212,28 @@ bool should_forbid_n_rate23a(struct rtw_adapter * padapter) if (rtw_get_capability23a(cur_network) & WLAN_CAPABILITY_PRIVACY) { for (i = bcn_fixed_size; i < cur_network->IELength;) { - pIE = (struct ndis_802_11_var_ies *) - (cur_network->IEs + i); + p = cur_network->IEs + i; - switch (pIE->ElementID) { + switch (p[0]) { case WLAN_EID_VENDOR_SPECIFIC: - if (!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4)&& - (!memcmp(pIE->data + 12, + if (!memcmp(p + 2, RTW_WPA_OUI23A_TYPE, 4) && + (!memcmp(p + 2 + 12, WPA_CIPHER_SUITE_CCMP23A, 4) || - !memcmp(pIE->data + 16, + !memcmp(p + 2 + 16, WPA_CIPHER_SUITE_CCMP23A, 4))) return false; break; case WLAN_EID_RSN: - if (!memcmp(pIE->data + 8, + if (!memcmp(p + 2 + 8, RSN_CIPHER_SUITE_CCMP23A, 4) || - !memcmp(pIE->data + 12, + !memcmp(p + 2 + 12, RSN_CIPHER_SUITE_CCMP23A, 4)) return false; default: break; } - i += (pIE->Length + 2); + i += (p[1] + 2); } return true; } else { @@ -1250,10 +1244,10 @@ bool should_forbid_n_rate23a(struct rtw_adapter * padapter) bool is_ap_in_wep23a(struct rtw_adapter *padapter) { u32 i; - struct ndis_802_11_var_ies *pIE; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct wlan_bssid_ex *cur_network = &pmlmeinfo->network; + const u8 *p; int bcn_fixed_size; bcn_fixed_size = offsetof(struct ieee80211_mgmt, u.beacon.variable) - @@ -1261,12 +1255,11 @@ bool is_ap_in_wep23a(struct rtw_adapter *padapter) if (rtw_get_capability23a(cur_network) & WLAN_CAPABILITY_PRIVACY) { for (i = bcn_fixed_size; i < pmlmeinfo->network.IELength;) { - pIE = (struct ndis_802_11_var_ies *) - (pmlmeinfo->network.IEs + i); + p = pmlmeinfo->network.IEs + i; - switch (pIE->ElementID) { + switch (p[0]) { case WLAN_EID_VENDOR_SPECIFIC: - if (!memcmp(pIE->data, RTW_WPA_OUI23A_TYPE, 4)) + if (!memcmp(p + 2, RTW_WPA_OUI23A_TYPE, 4)) return false; break; case WLAN_EID_RSN: @@ -1276,7 +1269,7 @@ bool is_ap_in_wep23a(struct rtw_adapter *padapter) break; } - i += (pIE->Length + 2); + i += (p[1] + 2); } return true; @@ -1442,9 +1435,9 @@ void update_tx_basic_rate23a(struct rtw_adapter *padapter, u8 wirelessmode) unsigned char check_assoc_AP23a(u8 *pframe, uint len) { int i, bcn_fixed_size; - struct ndis_802_11_var_ies *pIE; u8 epigram_vendor_flag; u8 ralink_vendor_flag; + const u8 *p; epigram_vendor_flag = 0; ralink_vendor_flag = 0; @@ -1452,39 +1445,39 @@ unsigned char check_assoc_AP23a(u8 *pframe, uint len) offsetof(struct ieee80211_mgmt, u.beacon); for (i = bcn_fixed_size; i < len;) { - pIE = (struct ndis_802_11_var_ies *)(pframe + i); + p = pframe + i; - switch (pIE->ElementID) { + switch (p[0]) { case WLAN_EID_VENDOR_SPECIFIC: - if (!memcmp(pIE->data, ARTHEROS_OUI1, 3) || - !memcmp(pIE->data, ARTHEROS_OUI2, 3)) { + if (!memcmp(p + 2, ARTHEROS_OUI1, 3) || + !memcmp(p + 2, ARTHEROS_OUI2, 3)) { DBG_8723A("link to Artheros AP\n"); return HT_IOT_PEER_ATHEROS; - } else if (!memcmp(pIE->data, BROADCOM_OUI1, 3) || - !memcmp(pIE->data, BROADCOM_OUI2, 3) || - !memcmp(pIE->data, BROADCOM_OUI2, 3)) { + } else if (!memcmp(p + 2, BROADCOM_OUI1, 3) || + !memcmp(p + 2, BROADCOM_OUI2, 3) || + !memcmp(p + 2, BROADCOM_OUI2, 3)) { DBG_8723A("link to Broadcom AP\n"); return HT_IOT_PEER_BROADCOM; - } else if (!memcmp(pIE->data, MARVELL_OUI, 3)) { + } else if (!memcmp(p + 2, MARVELL_OUI, 3)) { DBG_8723A("link to Marvell AP\n"); return HT_IOT_PEER_MARVELL; - } else if (!memcmp(pIE->data, RALINK_OUI, 3)) { + } else if (!memcmp(p + 2, RALINK_OUI, 3)) { if (!ralink_vendor_flag) ralink_vendor_flag = 1; else { DBG_8723A("link to Ralink AP\n"); return HT_IOT_PEER_RALINK; } - } else if (!memcmp(pIE->data, CISCO_OUI, 3)) { + } else if (!memcmp(p + 2, CISCO_OUI, 3)) { DBG_8723A("link to Cisco AP\n"); return HT_IOT_PEER_CISCO; - } else if (!memcmp(pIE->data, REALTEK_OUI, 3)) { + } else if (!memcmp(p + 2, REALTEK_OUI, 3)) { DBG_8723A("link to Realtek 96B\n"); return HT_IOT_PEER_REALTEK; - } else if (!memcmp(pIE->data, AIRGOCAP_OUI, 3)) { + } else if (!memcmp(p + 2, AIRGOCAP_OUI, 3)) { DBG_8723A("link to Airgo Cap\n"); return HT_IOT_PEER_AIRGO; - } else if (!memcmp(pIE->data, EPIGRAM_OUI, 3)) { + } else if (!memcmp(p + 2, EPIGRAM_OUI, 3)) { epigram_vendor_flag = 1; if (ralink_vendor_flag) { DBG_8723A("link to Tenda W311R AP\n"); @@ -1497,7 +1490,7 @@ unsigned char check_assoc_AP23a(u8 *pframe, uint len) break; } - i += (pIE->Length + 2); + i += (p[1] + 2); } if (ralink_vendor_flag && !epigram_vendor_flag) { |