diff options
Diffstat (limited to 'drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c')
-rw-r--r-- | drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c | 1988 |
1 files changed, 455 insertions, 1533 deletions
diff --git a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c index 50840b9a11fa..0c9f5cebfb42 100644 --- a/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c +++ b/drivers/staging/rtl8723au/os_dep/ioctl_cfg80211.c @@ -20,7 +20,6 @@ #include <xmit_osdep.h> #include "ioctl_cfg80211.h" -#include <linux/version.h> #define RTW_MAX_MGMT_TX_CNT 8 @@ -260,26 +259,21 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter, size_t notify_ielen; s32 notify_signal; u8 buf[MAX_BSSINFO_LEN], *pbuf; - size_t len, bssinf_len = 0; + size_t len; struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 bc_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }; - struct wireless_dev *wdev = padapter->rtw_wdev; struct wiphy *wiphy = wdev->wiphy; struct mlme_priv *pmlmepriv = &padapter->mlmepriv; /* DBG_8723A("%s\n", __func__); */ - bssinf_len = - pnetwork->network.IELength + sizeof(struct ieee80211_hdr_3addr); - if (bssinf_len > MAX_BSSINFO_LEN) { + if (pnetwork->network.IELength > MAX_IE_SZ) { DBG_8723A("%s IE Length too long > %d byte\n", __func__, - MAX_BSSINFO_LEN); + MAX_IE_SZ); goto exit; } - channel = pnetwork->network.Configuration.DSConfig; + channel = pnetwork->network.DSConfig; if (channel <= RTW_CH_MAX_2G_CHANNEL) freq = ieee80211_channel_to_frequency(channel, IEEE80211_BAND_2GHZ); @@ -289,14 +283,13 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter, notify_channel = ieee80211_get_channel(wiphy, freq); - /* rtw_get_timestampe_from_ie23a() */ notify_timestamp = jiffies_to_msecs(jiffies) * 1000; /* uSec */ notify_interval = - le16_to_cpu(*(u16 *) + get_unaligned_le16( rtw_get_beacon_interval23a_from_ie(pnetwork->network.IEs)); notify_capability = - le16_to_cpu(*(u16 *) + get_unaligned_le16( rtw_get_capability23a_from_ie(pnetwork->network.IEs)); notify_ie = pnetwork->network.IEs + _FIXED_IE_LENGTH_; @@ -315,21 +308,22 @@ static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter, pbuf = buf; pwlanhdr = (struct ieee80211_hdr *)pbuf; - fctrl = &pwlanhdr->frame_control; - *(fctrl) = 0; - SetSeqNum(pwlanhdr, 0); + pwlanhdr->seq_ctrl = 0; if (pnetwork->network.reserved == 1) { /* WIFI_BEACON */ - memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN); - SetFrameSubType(pbuf, WIFI_BEACON); + eth_broadcast_addr(pwlanhdr->addr1); + pwlanhdr->frame_control = cpu_to_le16(IEEE80211_FTYPE_MGMT | + IEEE80211_STYPE_BEACON); } else { - memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN); - SetFrameSubType(pbuf, WIFI_PROBERSP); + ether_addr_copy(pwlanhdr->addr1, myid(&padapter->eeprompriv)); + pwlanhdr->frame_control = + cpu_to_le16(IEEE80211_FTYPE_MGMT | + IEEE80211_STYPE_PROBE_RESP); } - memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN); - memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN); + ether_addr_copy(pwlanhdr->addr2, pnetwork->network.MacAddress); + ether_addr_copy(pwlanhdr->addr3, pnetwork->network.MacAddress); pbuf += sizeof(struct ieee80211_hdr_3addr); len = sizeof(struct ieee80211_hdr_3addr); @@ -357,9 +351,6 @@ void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter) struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wlan_network *cur_network = &pmlmepriv->cur_network; struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_8723AU_P2P - struct wifidirect_info *pwdinfo = &padapter->wdinfo; -#endif DBG_8723A("%s(padapter =%p)\n", __func__, padapter); @@ -370,22 +361,11 @@ void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter) if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) return; -#ifdef CONFIG_8723AU_P2P - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n", - __func__, rtw_p2p_role(pwdinfo), - rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } -#endif /* CONFIG_8723AU_P2P */ - - if (rtw_to_roaming(padapter) > 0) { + if (padapter->mlmepriv.to_roaming > 0) { struct wiphy *wiphy = pwdev->wiphy; struct ieee80211_channel *notify_channel; u32 freq; - u16 channel = cur_network->network.Configuration.DSConfig; + u16 channel = cur_network->network.DSConfig; if (channel <= RTW_CH_MAX_2G_CHANNEL) freq = @@ -429,9 +409,6 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter) { struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct wireless_dev *pwdev = padapter->rtw_wdev; -#ifdef CONFIG_8723AU_P2P - struct wifidirect_info *pwdinfo = &padapter->wdinfo; -#endif DBG_8723A("%s(padapter =%p)\n", __func__, padapter); @@ -442,21 +419,6 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter) if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) return; -#ifdef CONFIG_8723AU_P2P - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - del_timer_sync(&pwdinfo->find_phase_timer); - del_timer_sync(&pwdinfo->restore_p2p_state_timer); - del_timer_sync(&pwdinfo->pre_tx_scan_timer); - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - - DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n", - __func__, rtw_p2p_role(pwdinfo), - rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo)); - } -#endif /* CONFIG_8723AU_P2P */ - if (!padapter->mlmepriv.not_indic_disco) { if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING)) { cfg80211_connect_result(padapter->pnetdev, NULL, NULL, @@ -471,12 +433,12 @@ void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter) } #ifdef CONFIG_8723AU_AP_MODE -static u8 set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta) +static int set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta) { struct cmd_obj *ph2c; struct set_stakey_parm *psetstakey_para; struct cmd_priv *pcmdpriv = &padapter->cmdpriv; - u8 res = _SUCCESS; + int res = _SUCCESS; ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); if (ph2c == NULL) { @@ -493,9 +455,9 @@ static u8 set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta) init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_); - psetstakey_para->algorithm = (u8) psta->dot118021XPrivacy; + psetstakey_para->algorithm = psta->dot118021XPrivacy; - memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN); + ether_addr_copy(psetstakey_para->addr, psta->hwaddr); memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16); @@ -505,8 +467,8 @@ exit: return res; } -static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg, - int keyid) +static int set_group_key(struct rtw_adapter *padapter, u8 *key, u32 alg, + u8 keyid) { u8 keylen; struct cmd_obj *pcmd; @@ -516,6 +478,11 @@ static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg, DBG_8723A("%s\n", __func__); + if (keyid >= 4) { + res = _FAIL; + goto exit; + } + pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL); if (!pcmd) { res = _FAIL; @@ -528,24 +495,23 @@ static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg, goto exit; } - psetkeyparm->keyid = (u8) keyid; + psetkeyparm->keyid = keyid; if (is_wep_enc(alg)) - padapter->mlmepriv.key_mask |= CHKBIT(psetkeyparm->keyid); + padapter->mlmepriv.key_mask |= BIT(psetkeyparm->keyid); psetkeyparm->algorithm = alg; psetkeyparm->set_tx = 1; switch (alg) { - case _WEP40_: + case WLAN_CIPHER_SUITE_WEP40: keylen = 5; break; - case _WEP104_: + case WLAN_CIPHER_SUITE_WEP104: keylen = 13; break; - case _TKIP_: - case _TKIP_WTMIC_: - case _AES_: + case WLAN_CIPHER_SUITE_TKIP: + case WLAN_CIPHER_SUITE_CCMP: default: keylen = 16; } @@ -558,28 +524,26 @@ static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg, pcmd->rsp = NULL; pcmd->rspsz = 0; - INIT_LIST_HEAD(&pcmd->list); - res = rtw_enqueue_cmd23a(pcmdpriv, pcmd); exit: return res; } -static int set_wep_key(struct rtw_adapter *padapter, u8 *key, u8 keylen, - int keyid) +static int set_wep_key(struct rtw_adapter *padapter, u8 *key, u16 keylen, + u8 keyid) { - u8 alg; + u32 alg; switch (keylen) { case 5: - alg = _WEP40_; + alg = WLAN_CIPHER_SUITE_WEP40; break; case 13: - alg = _WEP104_; + alg = WLAN_CIPHER_SUITE_WEP104; break; default: - alg = _NO_PRIVACY_; + alg = 0; } return set_group_key(padapter, key, alg, keyid); @@ -590,7 +554,8 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, u32 param_len) { int ret = 0; - u32 wep_key_idx, wep_key_len; + u16 wep_key_len; + u8 wep_key_idx; struct sta_info *psta = NULL, *pbcmc_sta = NULL; struct rtw_adapter *padapter = netdev_priv(dev); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; @@ -658,21 +623,21 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; if (wep_key_len == 13) { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104; } psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; } - memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0], + memcpy(&psecuritypriv->wep_key[wep_key_idx].key, param->u.crypt.key, wep_key_len); - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + psecuritypriv->wep_key[wep_key_idx].keylen = wep_key_len; set_wep_key(padapter, param->u.crypt.key, wep_key_len, wep_key_idx); @@ -684,8 +649,7 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, if (!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) { /* group key */ if (param->u.crypt.set_tx == 0) { /* group key */ if (strcmp(param->u.crypt.alg, "WEP") == 0) { - DBG_8723A("%s, set group_key, WEP\n", - __func__); + DBG_8723A("%s, set group_key, WEP\n", __func__); memcpy(psecuritypriv-> dot118021XGrpKey[param->u.crypt.idx]. @@ -693,17 +657,17 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, (param->u.crypt.key_len > 16 ? 16 : param->u.crypt.key_len)); - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; if (param->u.crypt.key_len == 13) { psecuritypriv->dot118021XGrpPrivacy = - _WEP104_; + WLAN_CIPHER_SUITE_WEP104; } } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) { DBG_8723A("%s, set group_key, TKIP\n", __func__); - psecuritypriv->dot118021XGrpPrivacy = _TKIP_; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_TKIP; memcpy(psecuritypriv-> dot118021XGrpKey[param->u.crypt.idx]. @@ -722,13 +686,13 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, idx].skey, ¶m->u.crypt.key[24], 8); - psecuritypriv->busetkipkey = true; + psecuritypriv->busetkipkey = 1; } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) { DBG_8723A("%s, set group_key, CCMP\n", __func__); - psecuritypriv->dot118021XGrpPrivacy = _AES_; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_CCMP; memcpy(psecuritypriv-> dot118021XGrpKey[param->u.crypt.idx]. @@ -740,12 +704,12 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, __func__); psecuritypriv->dot118021XGrpPrivacy = - _NO_PRIVACY_; + 0; } psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - psecuritypriv->binstallGrpkey = true; + psecuritypriv->binstallGrpkey = 1; psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy; @@ -782,16 +746,16 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, DBG_8723A("%s, set pairwise key, WEP\n", __func__); - psta->dot118021XPrivacy = _WEP40_; + psta->dot118021XPrivacy = WLAN_CIPHER_SUITE_WEP40; if (param->u.crypt.key_len == 13) { psta->dot118021XPrivacy = - _WEP104_; + WLAN_CIPHER_SUITE_WEP104; } } else if (!strcmp(param->u.crypt.alg, "TKIP")) { DBG_8723A("%s, set pairwise key, " "TKIP\n", __func__); - psta->dot118021XPrivacy = _TKIP_; + psta->dot118021XPrivacy = WLAN_CIPHER_SUITE_TKIP; /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */ /* set mic key */ @@ -800,19 +764,19 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, memcpy(psta->dot11tkiprxmickey.skey, ¶m->u.crypt.key[24], 8); - psecuritypriv->busetkipkey = true; + psecuritypriv->busetkipkey = 1; } else if (!strcmp(param->u.crypt.alg, "CCMP")) { DBG_8723A("%s, set pairwise key, " "CCMP\n", __func__); - psta->dot118021XPrivacy = _AES_; + psta->dot118021XPrivacy = WLAN_CIPHER_SUITE_CCMP; } else { DBG_8723A("%s, set pairwise key, " "none\n", __func__); - psta->dot118021XPrivacy = _NO_PRIVACY_; + psta->dot118021XPrivacy = 0; } set_pairwise_key(padapter, psta); @@ -831,15 +795,15 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, key_len)); psecuritypriv->dot118021XGrpPrivacy = - _WEP40_; + WLAN_CIPHER_SUITE_WEP40; if (param->u.crypt.key_len == 13) { psecuritypriv-> dot118021XGrpPrivacy = - _WEP104_; + WLAN_CIPHER_SUITE_WEP104; } } else if (!strcmp(param->u.crypt.alg, "TKIP")) { psecuritypriv->dot118021XGrpPrivacy = - _TKIP_; + WLAN_CIPHER_SUITE_TKIP; memcpy(psecuritypriv-> dot118021XGrpKey[param->u.crypt. @@ -864,11 +828,11 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, skey, ¶m->u.crypt.key[24], 8); - psecuritypriv->busetkipkey = true; + psecuritypriv->busetkipkey = 1; } else if (!strcmp(param->u.crypt.alg, "CCMP")) { psecuritypriv->dot118021XGrpPrivacy = - _AES_; + WLAN_CIPHER_SUITE_CCMP; memcpy(psecuritypriv-> dot118021XGrpKey[param->u.crypt. @@ -879,13 +843,13 @@ static int rtw_cfg80211_ap_set_encryption(struct net_device *dev, key_len)); } else { psecuritypriv->dot118021XGrpPrivacy = - _NO_PRIVACY_; + 0; } psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx; - psecuritypriv->binstallGrpkey = true; + psecuritypriv->binstallGrpkey = 1; psecuritypriv->dot11PrivacyAlgrthm = psecuritypriv->dot118021XGrpPrivacy; @@ -917,15 +881,11 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, struct ieee_param *param, u32 param_len) { int ret = 0; - u32 wep_key_idx, wep_key_len; + u32 wep_key_idx; + u16 wep_key_len; struct rtw_adapter *padapter = netdev_priv(dev); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct security_priv *psecuritypriv = &padapter->securitypriv; -#ifdef CONFIG_8723AU_P2P - struct wifidirect_info *pwdinfo = &padapter->wdinfo; -#endif /* CONFIG_8723AU_P2P */ - - DBG_8723A("%s\n", __func__); @@ -970,21 +930,21 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; if (wep_key_len == 13) { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104; } psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx; } - memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0], + memcpy(&psecuritypriv->wep_key[wep_key_idx].key, param->u.crypt.key, wep_key_len); - psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len; + psecuritypriv->wep_key[wep_key_idx].keylen = wep_key_len; rtw_set_key23a(padapter, psecuritypriv, wep_key_idx, 0); @@ -1041,7 +1001,7 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, 8); padapter->securitypriv. - busetkipkey = false; + busetkipkey = 0; } DBG_8723A(" ~~~~set sta key:unicastkey\n"); @@ -1067,7 +1027,7 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, skey, ¶m->u.crypt.key[24], 8); padapter->securitypriv.binstallGrpkey = - true; + 1; /* DEBUG_ERR((" param->u.crypt.key_len" "=%d\n", param->u.crypt.key_len)); */ DBG_8723A @@ -1080,15 +1040,6 @@ static int rtw_cfg80211_set_encryption(struct net_device *dev, rtw_set_key23a(padapter, &padapter->securitypriv, param->u.crypt.idx, 1); -#ifdef CONFIG_8723AU_P2P - if (rtw_p2p_chk_state - (pwdinfo, - P2P_STATE_PROVISIONING_ING)) { - rtw_p2p_set_state(pwdinfo, - P2P_STATE_PROVISIONING_DONE); - } -#endif /* CONFIG_8723AU_P2P */ - } } @@ -1127,13 +1078,13 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, { char *alg_name; u32 param_len; - struct ieee_param *param = NULL; + struct ieee_param *param; int ret = 0; struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - DBG_8723A(FUNC_NDEV_FMT " adding key for %pM\n", FUNC_NDEV_ARG(ndev), + DBG_8723A("%s(%s): adding key for %pM\n", __func__, ndev->name, mac_addr); DBG_8723A("cipher = 0x%x\n", params->cipher); DBG_8723A("key_len = 0x%x\n", params->key_len); @@ -1143,11 +1094,11 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, param_len = sizeof(struct ieee_param) + params->key_len; param = kzalloc(param_len, GFP_KERNEL); - if (param == NULL) - return -1; + if (!param) + return -ENOMEM; param->cmd = IEEE_CMD_SET_ENCRYPTION; - memset(param->sta_addr, 0xff, ETH_ALEN); + eth_broadcast_addr(param->sta_addr); switch (params->cipher) { case IW_AUTH_CIPHER_NONE: @@ -1196,7 +1147,7 @@ static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev, } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { #ifdef CONFIG_8723AU_AP_MODE if (mac_addr) - memcpy(param->sta_addr, (void *)mac_addr, ETH_ALEN); + ether_addr_copy(param->sta_addr, mac_addr); ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len); #endif @@ -1218,7 +1169,7 @@ cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev, void *cookie, void (*callback) (void *cookie, struct key_params *)) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } @@ -1229,8 +1180,7 @@ static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev, struct rtw_adapter *padapter = netdev_priv(ndev); struct security_priv *psecuritypriv = &padapter->securitypriv; - DBG_8723A(FUNC_NDEV_FMT " key_index =%d\n", FUNC_NDEV_ARG(ndev), - key_index); + DBG_8723A("%s(%s): key_index =%d\n", __func__, ndev->name, key_index); if (key_index == psecuritypriv->dot11PrivacyKeyIndex) { /* clear the flag of wep default key set. */ @@ -1247,23 +1197,24 @@ static int cfg80211_rtw_set_default_key(struct wiphy *wiphy, struct rtw_adapter *padapter = netdev_priv(ndev); struct security_priv *psecuritypriv = &padapter->securitypriv; - DBG_8723A(FUNC_NDEV_FMT " key_index =%d" - ", unicast =%d, multicast =%d.\n", FUNC_NDEV_ARG(ndev), - key_index, unicast, multicast); + DBG_8723A("%s(%s): key_index =%d, unicast =%d, multicast =%d.\n", + __func__, ndev->name, key_index, unicast, multicast); - if ((key_index < WEP_KEYS) && - ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) || - (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) { + if (key_index < NUM_WEP_KEYS && + (psecuritypriv->dot11PrivacyAlgrthm == WLAN_CIPHER_SUITE_WEP40 || + psecuritypriv->dot11PrivacyAlgrthm == WLAN_CIPHER_SUITE_WEP104)) { /* set wep default key */ psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled; psecuritypriv->dot11PrivacyKeyIndex = key_index; - psecuritypriv->dot11PrivacyAlgrthm = _WEP40_; - psecuritypriv->dot118021XGrpPrivacy = _WEP40_; - if (psecuritypriv->dot11DefKeylen[key_index] == 13) { - psecuritypriv->dot11PrivacyAlgrthm = _WEP104_; - psecuritypriv->dot118021XGrpPrivacy = _WEP104_; + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; + psecuritypriv->dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; + if (psecuritypriv->wep_key[key_index].keylen == 13) { + psecuritypriv->dot11PrivacyAlgrthm = + WLAN_CIPHER_SUITE_WEP104; + psecuritypriv->dot118021XGrpPrivacy = + WLAN_CIPHER_SUITE_WEP104; } /* set the flag to represent that wep default key @@ -1287,7 +1238,7 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy, sinfo->filled = 0; if (!mac) { - DBG_8723A(FUNC_NDEV_FMT " mac ==%p\n", FUNC_NDEV_ARG(ndev), mac); + DBG_8723A("%s(%s): mac ==%p\n", __func__, ndev->name, mac); ret = -ENOENT; goto exit; } @@ -1298,17 +1249,15 @@ static int cfg80211_rtw_get_station(struct wiphy *wiphy, ret = -ENOENT; goto exit; } -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A(FUNC_NDEV_FMT " mac =" MAC_FMT "\n", FUNC_NDEV_ARG(ndev), + DBG_8723A("%s(%s): mac =" MAC_FMT "\n", __func__, ndev->name, MAC_ARG(mac)); -#endif /* for infra./P2PClient mode */ if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) && check_fwstate(pmlmepriv, _FW_LINKED)) { struct wlan_network *cur_network = &pmlmepriv->cur_network; - if (memcmp(mac, cur_network->network.MacAddress, ETH_ALEN)) { + if (!ether_addr_equal(mac, cur_network->network.MacAddress)) { DBG_8723A("%s, mismatch bssid =" MAC_FMT "\n", __func__, MAC_ARG(cur_network->network.MacAddress)); ret = -ENOENT; @@ -1342,78 +1291,122 @@ exit: return ret; } +int cfg80211_infrastructure_mode(struct rtw_adapter* padapter, + enum nl80211_iftype ifmode) +{ + struct mlme_priv *pmlmepriv = &padapter->mlmepriv; + struct wlan_network *cur_network = &pmlmepriv->cur_network; + enum nl80211_iftype old_mode; + + old_mode = cur_network->network.ifmode; + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_notice_, + ("+%s: old =%d new =%d fw_state = 0x%08x\n", __func__, + old_mode, ifmode, get_fwstate(pmlmepriv))); + + if (old_mode != ifmode) { + spin_lock_bh(&pmlmepriv->lock); + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + (" change mode!")); + + if (old_mode == NL80211_IFTYPE_AP || + old_mode == NL80211_IFTYPE_P2P_GO) { + /* change to other mode from Ndis802_11APMode */ + cur_network->join_res = -1; + +#ifdef CONFIG_8723AU_AP_MODE + stop_ap_mode23a(padapter); +#endif + } + + if (check_fwstate(pmlmepriv, _FW_LINKED) || + old_mode == NL80211_IFTYPE_ADHOC) + rtw_disassoc_cmd23a(padapter, 0, true); + + if (check_fwstate(pmlmepriv, _FW_LINKED) || + check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) + rtw_free_assoc_resources23a(padapter, 1); + + if (old_mode == NL80211_IFTYPE_STATION || + old_mode == NL80211_IFTYPE_P2P_CLIENT || + old_mode == NL80211_IFTYPE_ADHOC) { + if (check_fwstate(pmlmepriv, _FW_LINKED)) { + /* will clr Linked_state; before this function, + we must have chked whether issue + dis-assoc_cmd or not */ + rtw_indicate_disconnect23a(padapter); + } + } + + cur_network->network.ifmode = ifmode; + + _clr_fwstate_(pmlmepriv, ~WIFI_NULL_STATE); + + switch (ifmode) { + case NL80211_IFTYPE_ADHOC: + set_fwstate(pmlmepriv, WIFI_ADHOC_STATE); + break; + + case NL80211_IFTYPE_P2P_CLIENT: + case NL80211_IFTYPE_STATION: + set_fwstate(pmlmepriv, WIFI_STATION_STATE); + break; + + case NL80211_IFTYPE_P2P_GO: + case NL80211_IFTYPE_AP: + set_fwstate(pmlmepriv, WIFI_AP_STATE); +#ifdef CONFIG_8723AU_AP_MODE + start_ap_mode23a(padapter); + /* rtw_indicate_connect23a(padapter); */ +#endif + break; + + default: + break; + } + + /* SecClearAllKeys(adapter); */ + + /* RT_TRACE(COMP_OID_SET, DBG_LOUD, + ("set_infrastructure: fw_state:%x after changing mode\n", */ + /* get_fwstate(pmlmepriv))); */ + + spin_unlock_bh(&pmlmepriv->lock); + } + + return _SUCCESS; +} + static int cfg80211_rtw_change_iface(struct wiphy *wiphy, struct net_device *ndev, enum nl80211_iftype type, u32 *flags, struct vif_params *params) { enum nl80211_iftype old_type; - enum ndis_802_11_net_infra networkType; struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy); -#ifdef CONFIG_8723AU_P2P - struct wifidirect_info *pwdinfo = &padapter->wdinfo; -#endif int ret = 0; - u8 change = false; - DBG_8723A(FUNC_NDEV_FMT " call netdev_open23a\n", FUNC_NDEV_ARG(ndev)); - if (netdev_open23a(ndev) != 0) { - ret = -EPERM; - goto exit; - } - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - ret = -EPERM; - goto exit; - } + DBG_8723A("%s(%s): call netdev_open23a\n", __func__, ndev->name); old_type = rtw_wdev->iftype; - DBG_8723A(FUNC_NDEV_FMT " old_iftype =%d, new_iftype =%d\n", - FUNC_NDEV_ARG(ndev), old_type, type); + DBG_8723A("%s(%s): old_iftype =%d, new_iftype =%d\n", + __func__, ndev->name, old_type, type); if (old_type != type) { - change = true; pmlmeext->action_public_rxseq = 0xffff; pmlmeext->action_public_dialog_token = 0xff; } switch (type) { case NL80211_IFTYPE_ADHOC: - networkType = Ndis802_11IBSS; - break; case NL80211_IFTYPE_P2P_CLIENT: case NL80211_IFTYPE_STATION: - networkType = Ndis802_11Infrastructure; -#ifdef CONFIG_8723AU_P2P - if (change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) { - del_timer_sync(&pwdinfo->find_phase_timer); - del_timer_sync(&pwdinfo->restore_p2p_state_timer); - del_timer_sync(&pwdinfo->pre_tx_scan_timer); - - /* it means remove GO and change mode from AP(GO) - to station(P2P DEVICE) */ - rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE); - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); - - DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =" - "%d\n", __func__, rtw_p2p_role(pwdinfo), - rtw_p2p_state(pwdinfo), - rtw_p2p_pre_state(pwdinfo)); - } -#endif /* CONFIG_8723AU_P2P */ - break; case NL80211_IFTYPE_P2P_GO: case NL80211_IFTYPE_AP: - networkType = Ndis802_11APMode; -#ifdef CONFIG_8723AU_P2P - if (change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - /* it means P2P Group created, we will be GO - and change mode from P2P DEVICE to AP(GO) */ - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - } -#endif /* CONFIG_8723AU_P2P */ + case NL80211_IFTYPE_UNSPECIFIED: break; default: return -EOPNOTSUPP; @@ -1421,13 +1414,13 @@ static int cfg80211_rtw_change_iface(struct wiphy *wiphy, rtw_wdev->iftype = type; - if (rtw_set_802_11_infrastructure_mode23a(padapter, networkType) == false) { + if (cfg80211_infrastructure_mode(padapter, type) != _SUCCESS) { rtw_wdev->iftype = old_type; ret = -EPERM; goto exit; } - rtw_setopmode_cmd23a(padapter, networkType); + rtw_setopmode_cmd23a(padapter, type); exit: return ret; @@ -1438,9 +1431,8 @@ void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, { spin_lock_bh(&pwdev_priv->scan_req_lock); if (pwdev_priv->scan_request != NULL) { -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("%s with scan req\n", __func__); -#endif + if (pwdev_priv->scan_request->wiphy != pwdev_priv->rtw_wdev->wiphy) DBG_8723A("error wiphy compare\n"); @@ -1449,9 +1441,7 @@ void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv, pwdev_priv->scan_request = NULL; } else { -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("%s without scan req\n", __func__); -#endif } spin_unlock_bh(&pwdev_priv->scan_req_lock); } @@ -1463,10 +1453,6 @@ void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter) struct rtw_queue *queue = &pmlmepriv->scanned_queue; struct wlan_network *pnetwork; -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s\n", __func__); -#endif - spin_lock_bh(&pmlmepriv->scanned_queue.lock); phead = get_list_head(queue); @@ -1478,7 +1464,7 @@ void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter) contains the channel to which this network belongs */ if (rtw_ch_set_search_ch23a (padapter->mlmeextpriv.channel_set, - pnetwork->network.Configuration.DSConfig) >= 0) + pnetwork->network.DSConfig) >= 0) rtw_cfg80211_inform_bss(padapter, pnetwork); } @@ -1495,93 +1481,31 @@ static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter, int ret = 0; uint wps_ielen = 0; u8 *wps_ie; -#ifdef CONFIG_8723AU_P2P - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; -#endif struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("%s, ielen =%d\n", __func__, len); -#endif if (len > 0) { wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen); if (wps_ie) { -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("probe_req_wps_ielen =%d\n", wps_ielen); -#endif + if (pmlmepriv->wps_probe_req_ie) { pmlmepriv->wps_probe_req_ie_len = 0; kfree(pmlmepriv->wps_probe_req_ie); pmlmepriv->wps_probe_req_ie = NULL; } - pmlmepriv->wps_probe_req_ie = - kmalloc(wps_ielen, GFP_KERNEL); + pmlmepriv->wps_probe_req_ie = kmemdup(wps_ie, + wps_ielen, + GFP_KERNEL); if (pmlmepriv->wps_probe_req_ie == NULL) { DBG_8723A("%s()-%d: kmalloc() ERROR!\n", __func__, __LINE__); return -EINVAL; } - memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen); pmlmepriv->wps_probe_req_ie_len = wps_ielen; } -#ifdef CONFIG_8723AU_P2P - p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen); - if (p2p_ie) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("probe_req_p2p_ielen =%d\n", p2p_ielen); -#endif - - if (pmlmepriv->p2p_probe_req_ie) { - pmlmepriv->p2p_probe_req_ie_len = 0; - kfree(pmlmepriv->p2p_probe_req_ie); - pmlmepriv->p2p_probe_req_ie = NULL; - } - - pmlmepriv->p2p_probe_req_ie = - kmalloc(p2p_ielen, GFP_KERNEL); - if (pmlmepriv->p2p_probe_req_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_probe_req_ie_len = p2p_ielen; - } -#endif /* CONFIG_8723AU_P2P */ - - /* buf += p2p_ielen; */ - /* len -= p2p_ielen; */ - -#ifdef CONFIG_8723AU_P2P - if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("probe_req_wfd_ielen =%d\n", wfd_ielen); -#endif - - if (pmlmepriv->wfd_probe_req_ie) { - pmlmepriv->wfd_probe_req_ie_len = 0; - kfree(pmlmepriv->wfd_probe_req_ie); - pmlmepriv->wfd_probe_req_ie = NULL; - } - - pmlmepriv->wfd_probe_req_ie = - kmalloc(wfd_ielen, GFP_KERNEL); - if (pmlmepriv->wfd_probe_req_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie, - &pmlmepriv->wfd_probe_req_ie_len); - } -#endif /* CONFIG_8723AU_P2P */ - } return ret; @@ -1599,25 +1523,16 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy, struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT]; struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); struct cfg80211_ssid *ssids = request->ssids; -#ifdef CONFIG_8723AU_P2P - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - int social_channel = 0; -#endif /* CONFIG_8723AU_P2P */ bool need_indicate_scan_done = false; -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); -#endif + DBG_8723A("%s(%s)\n", __func__, padapter->pnetdev->name); spin_lock_bh(&pwdev_priv->scan_req_lock); pwdev_priv->scan_request = request; spin_unlock_bh(&pwdev_priv->scan_req_lock); if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) { - -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("%s under WIFI_AP_STATE\n", __func__); -#endif /* need_indicate_scan_done = true; */ /* goto check_need_indicate_scan_done; */ } @@ -1626,29 +1541,6 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy, need_indicate_scan_done = true; goto check_need_indicate_scan_done; } -#ifdef CONFIG_8723AU_P2P - if (!memcmp(ssids->ssid, "DIRECT-", 7) && - rtw_get_p2p_ie23a((u8 *) request->ie, request->ie_len, NULL, NULL)) { - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true; - } else { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__, - rtw_p2p_role(pwdinfo), - rtw_p2p_state(pwdinfo)); -#endif - } - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - if (request->n_channels == 3 && - request->channels[0]->hw_value == 1 && - request->channels[1]->hw_value == 6 && - request->channels[2]->hw_value == 11) - social_channel = 1; - } -#endif /* CONFIG_8723AU_P2P */ if (request->ie && request->ie_len > 0) { rtw_cfg80211_set_probe_req_wpsp2pie(padapter, @@ -1662,8 +1554,8 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy, goto check_need_indicate_scan_done; } if (rtw_is_scan_deny(padapter)) { - DBG_8723A(FUNC_ADPT_FMT ": scan deny\n", - FUNC_ADPT_ARG(padapter)); + DBG_8723A("%s(%s): scan deny\n", __func__, + padapter->pnetdev->name); need_indicate_scan_done = true; goto check_need_indicate_scan_done; } @@ -1674,28 +1566,12 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy, need_indicate_scan_done = true; goto check_need_indicate_scan_done; } -#ifdef CONFIG_8723AU_P2P - if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) && - !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) { - rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH); - rtw_free_network_queue23a(padapter, true); - - if (social_channel == 0) - rtw_p2p_findphase_ex_set(pwdinfo, - P2P_FINDPHASE_EX_NONE); - else - rtw_p2p_findphase_ex_set(pwdinfo, - P2P_FINDPHASE_EX_SOCIAL_LAST); - } -#endif /* CONFIG_8723AU_P2P */ memset(ssid, 0, sizeof(struct cfg80211_ssid) * RTW_SSID_SCAN_AMOUNT); /* parsing request ssids, n_ssids */ for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) { -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("ssid =%s, len =%d\n", ssids[i].ssid, ssids[i].ssid_len); -#endif memcpy(ssid[i].ssid, ssids[i].ssid, ssids[i].ssid_len); ssid[i].ssid_len = ssids[i].ssid_len; } @@ -1707,11 +1583,9 @@ static int cfg80211_rtw_scan(struct wiphy *wiphy, if (request->n_channels == 1) { for (i = 0; i < request->n_channels && i < RTW_CHANNEL_SCAN_AMOUNT; i++) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A(FUNC_ADPT_FMT CHAN_FMT "\n", - FUNC_ADPT_ARG(padapter), + DBG_8723A("%s:(%s):" CHAN_FMT "\n", + __func__, padapter->pnetdev->name, CHAN_ARG(request->channels[i])); -#endif ch[i].hw_value = request->channels[i]->hw_value; ch[i].flags = request->channels[i]->flags; } @@ -1747,13 +1621,13 @@ static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed) static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_ibss_params *params) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } @@ -1822,30 +1696,30 @@ static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv, DBG_8723A("%s, ucast =%d, cipher = 0x%x\n", __func__, ucast, cipher); if (!cipher) { - *profile_cipher = _NO_PRIVACY_; + *profile_cipher = 0; psecuritypriv->ndisencryptstatus = ndisencryptstatus; return 0; } switch (cipher) { case IW_AUTH_CIPHER_NONE: - *profile_cipher = _NO_PRIVACY_; + *profile_cipher = 0; ndisencryptstatus = Ndis802_11EncryptionDisabled; break; case WLAN_CIPHER_SUITE_WEP40: - *profile_cipher = _WEP40_; + *profile_cipher = WLAN_CIPHER_SUITE_WEP40; ndisencryptstatus = Ndis802_11Encryption1Enabled; break; case WLAN_CIPHER_SUITE_WEP104: - *profile_cipher = _WEP104_; + *profile_cipher = WLAN_CIPHER_SUITE_WEP104; ndisencryptstatus = Ndis802_11Encryption1Enabled; break; case WLAN_CIPHER_SUITE_TKIP: - *profile_cipher = _TKIP_; + *profile_cipher = WLAN_CIPHER_SUITE_TKIP; ndisencryptstatus = Ndis802_11Encryption2Enabled; break; case WLAN_CIPHER_SUITE_CCMP: - *profile_cipher = _AES_; + *profile_cipher = WLAN_CIPHER_SUITE_CCMP; ndisencryptstatus = Ndis802_11Encryption3Enabled; break; default: @@ -1877,13 +1751,10 @@ static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv, static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, size_t ielen) { - u8 *buf = NULL, *pos = NULL; + u8 *buf = NULL; int group_cipher = 0, pairwise_cipher = 0; int ret = 0; - int wpa_ielen = 0; - int wpa2_ielen = 0; - u8 *pwpa, *pwpa2; - u8 null_addr[] = { 0, 0, 0, 0, 0, 0 }; + const u8 *pwpa, *pwpa2; int i; if (!pie || !ielen) { @@ -1896,12 +1767,11 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, ret = -EINVAL; goto exit; } - buf = kzalloc(ielen, GFP_KERNEL); + buf = kmemdup(pie, ielen, GFP_KERNEL); if (buf == NULL) { ret = -ENOMEM; goto exit; } - memcpy(buf, pie, ielen); /* dump */ DBG_8723A("set wpa_ie(length:%zu):\n", ielen); @@ -1910,7 +1780,6 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, buf[i], buf[i + 1], buf[i + 2], buf[i + 3], buf[i + 4], buf[i + 5], buf[i + 6], buf[i + 7]); - pos = buf; if (ielen < RSN_HEADER_LEN) { RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_, ("Ie len too short %d\n", (int)ielen)); @@ -1918,33 +1787,35 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, goto exit; } - pwpa = rtw_get_wpa_ie23a(buf, &wpa_ielen, ielen); - if (pwpa && wpa_ielen > 0) { - if (rtw_parse_wpa_ie23a(pwpa, wpa_ielen + 2, &group_cipher, - &pairwise_cipher, NULL) == _SUCCESS) { + pwpa = cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT, + WLAN_OUI_TYPE_MICROSOFT_WPA, + buf, ielen); + if (pwpa && pwpa[1] > 0) { + if (rtw_parse_wpa_ie23a(pwpa, pwpa[1] + 2, &group_cipher, + &pairwise_cipher, NULL) == _SUCCESS) { padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPAPSK; - memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0], - wpa_ielen + 2); + memcpy(padapter->securitypriv.supplicant_ie, pwpa, + pwpa[1] + 2); - DBG_8723A("got wpa_ie, wpa_ielen:%u\n", wpa_ielen); + DBG_8723A("got wpa_ie, wpa_ielen:%u\n", pwpa[1]); } } - pwpa2 = rtw_get_wpa2_ie23a(buf, &wpa2_ielen, ielen); - if (pwpa2 && wpa2_ielen > 0) { - if (rtw_parse_wpa2_ie23a (pwpa2, wpa2_ielen + 2, &group_cipher, - &pairwise_cipher, NULL) == _SUCCESS) { + pwpa2 = cfg80211_find_ie(WLAN_EID_RSN, buf, ielen); + if (pwpa2 && pwpa2[1] > 0) { + if (rtw_parse_wpa2_ie23a (pwpa2, pwpa2[1] + 2, &group_cipher, + &pairwise_cipher, NULL) == _SUCCESS) { padapter->securitypriv.dot11AuthAlgrthm = dot11AuthAlgrthm_8021X; padapter->securitypriv.ndisauthtype = Ndis802_11AuthModeWPA2PSK; - memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0], - wpa2_ielen + 2); + memcpy(padapter->securitypriv.supplicant_ie, pwpa2, + pwpa2[1] + 2); - DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen); + DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", pwpa2[1]); } } @@ -1957,27 +1828,27 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, switch (group_cipher) { case WPA_CIPHER_NONE: - padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_; + padapter->securitypriv.dot118021XGrpPrivacy = 0; padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; break; case WPA_CIPHER_WEP40: - padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_; + padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP40; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; break; case WPA_CIPHER_TKIP: - padapter->securitypriv.dot118021XGrpPrivacy = _TKIP_; + padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_TKIP; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; break; case WPA_CIPHER_CCMP: - padapter->securitypriv.dot118021XGrpPrivacy = _AES_; + padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_CCMP; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; break; case WPA_CIPHER_WEP104: - padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_; + padapter->securitypriv.dot118021XGrpPrivacy = WLAN_CIPHER_SUITE_WEP104; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; break; @@ -1985,27 +1856,27 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, switch (pairwise_cipher) { case WPA_CIPHER_NONE: - padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_; + padapter->securitypriv.dot11PrivacyAlgrthm = 0; padapter->securitypriv.ndisencryptstatus = Ndis802_11EncryptionDisabled; break; case WPA_CIPHER_WEP40: - padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_; + padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; break; case WPA_CIPHER_TKIP: - padapter->securitypriv.dot11PrivacyAlgrthm = _TKIP_; + padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_TKIP; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption2Enabled; break; case WPA_CIPHER_CCMP: - padapter->securitypriv.dot11PrivacyAlgrthm = _AES_; + padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_CCMP; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption3Enabled; break; case WPA_CIPHER_WEP104: - padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_; + padapter->securitypriv.dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104; padapter->securitypriv.ndisencryptstatus = Ndis802_11Encryption1Enabled; break; @@ -2029,75 +1900,14 @@ static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie, } } -#ifdef CONFIG_8723AU_P2P - { /* check p2p_ie for assoc req; */ - uint p2p_ielen = 0; - u8 *p2p_ie; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - p2p_ie = rtw_get_p2p_ie23a(buf, ielen, NULL, &p2p_ielen); - if (p2p_ie) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s p2p_assoc_req_ielen =%d\n", __func__, - p2p_ielen); -#endif - - if (pmlmepriv->p2p_assoc_req_ie) { - pmlmepriv->p2p_assoc_req_ie_len = 0; - kfree(pmlmepriv->p2p_assoc_req_ie); - pmlmepriv->p2p_assoc_req_ie = NULL; - } - - pmlmepriv->p2p_assoc_req_ie = - kmalloc(p2p_ielen, GFP_KERNEL); - if (pmlmepriv->p2p_assoc_req_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - goto exit; - } - memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen; - } - } -#endif /* CONFIG_8723AU_P2P */ - -#ifdef CONFIG_8723AU_P2P - { /* check wfd_ie for assoc req; */ - uint wfd_ielen = 0; - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - if (rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s wfd_assoc_req_ielen =%d\n", __func__, - wfd_ielen); -#endif - - if (pmlmepriv->wfd_assoc_req_ie) { - pmlmepriv->wfd_assoc_req_ie_len = 0; - kfree(pmlmepriv->wfd_assoc_req_ie); - pmlmepriv->wfd_assoc_req_ie = NULL; - } - - pmlmepriv->wfd_assoc_req_ie = - kmalloc(wfd_ielen, GFP_KERNEL); - if (pmlmepriv->wfd_assoc_req_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - goto exit; - } - rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie, - &pmlmepriv->wfd_assoc_req_ie_len); - } - } -#endif /* CONFIG_8723AU_P2P */ - /* TKIP and AES disallow multicast packets until installing group key */ - if (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ || - padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ || - padapter->securitypriv.dot11PrivacyAlgrthm == _AES_) + if (padapter->securitypriv.dot11PrivacyAlgrthm == + WLAN_CIPHER_SUITE_TKIP || + padapter->securitypriv.dot11PrivacyAlgrthm == + WLAN_CIPHER_SUITE_CCMP) /* WPS open need to enable multicast */ /* check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == true)*/ - rtw_hal_set_hwreg23a(padapter, HW_VAR_OFF_RCR_AM, null_addr); + rtl8723a_off_rcr_am(padapter); RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_, ("rtw_set_wpa_ie: pairwise_cipher = 0x%08x padapter->" @@ -2113,6 +1923,70 @@ exit: return ret; } +static int rtw_cfg80211_add_wep(struct rtw_adapter *padapter, + struct rtw_wep_key *wep, u8 keyid) +{ + int res; + struct security_priv *psecuritypriv = &padapter->securitypriv; + + if (keyid >= NUM_WEP_KEYS) { + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_err_, + ("%s:keyid>4 =>fail\n", __func__)); + res = _FAIL; + goto exit; + } + + switch (wep->keylen) { + case 5: + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP40; + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + ("%s:wep->KeyLength = 5\n", __func__)); + break; + case 13: + psecuritypriv->dot11PrivacyAlgrthm = WLAN_CIPHER_SUITE_WEP104; + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + ("%s:wep->KeyLength = 13\n", __func__)); + break; + default: + psecuritypriv->dot11PrivacyAlgrthm = 0; + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + ("%s:wep->KeyLength!= 5 or 13\n", __func__)); + res = _FAIL; + goto exit; + } + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + ("%s:before memcpy, wep->KeyLength = 0x%x keyid =%x\n", + __func__, wep->keylen, keyid)); + + memcpy(&psecuritypriv->wep_key[keyid], wep, sizeof(struct rtw_wep_key)); + + psecuritypriv->dot11PrivacyKeyIndex = keyid; + + RT_TRACE(_module_rtl871x_ioctl_set_c_, _drv_info_, + ("%s:security key material : " + "%x %x %x %x %x %x %x %x %x %x %x %x %x\n", __func__, + psecuritypriv->wep_key[keyid].key[0], + psecuritypriv->wep_key[keyid].key[1], + psecuritypriv->wep_key[keyid].key[2], + psecuritypriv->wep_key[keyid].key[3], + psecuritypriv->wep_key[keyid].key[4], + psecuritypriv->wep_key[keyid].key[5], + psecuritypriv->wep_key[keyid].key[6], + psecuritypriv->wep_key[keyid].key[7], + psecuritypriv->wep_key[keyid].key[8], + psecuritypriv->wep_key[keyid].key[9], + psecuritypriv->wep_key[keyid].key[10], + psecuritypriv->wep_key[keyid].key[11], + psecuritypriv->wep_key[keyid].key[12])); + + res = rtw_set_key23a(padapter, psecuritypriv, keyid, 1); + +exit: + + return res; +} + static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, struct cfg80211_connect_params *sme) { @@ -2133,16 +2007,10 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, struct security_priv *psecuritypriv = &padapter->securitypriv; struct rtw_queue *queue = &pmlmepriv->scanned_queue; - DBG_8723A("=>" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("=>" "%s(%s)\n", __func__, ndev->name); DBG_8723A("privacy =%d, key =%p, key_len =%d, key_idx =%d\n", sme->privacy, sme->key, sme->key_len, sme->key_idx); - if (wdev_to_priv(padapter->rtw_wdev)->block) { - ret = -EBUSY; - DBG_8723A("%s wdev_priv.block is set\n", __func__); - goto exit; - } - if (_FAIL == rtw_pwr_wakeup(padapter)) { ret = -EPERM; goto exit; @@ -2193,8 +2061,8 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, dst_bssid = pnetwork->network.MacAddress; if (sme->bssid) { - if (memcmp(pnetwork->network.MacAddress, - sme->bssid, ETH_ALEN)) + if (!ether_addr_equal(pnetwork->network.MacAddress, + sme->bssid)) continue; } @@ -2208,7 +2076,7 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, if (sme->bssid) { src_bssid = sme->bssid; - if ((!memcmp(dst_bssid, src_bssid, ETH_ALEN))) { + if (ether_addr_equal(dst_bssid, src_bssid)) { DBG_8723A("matched by bssid\n"); ndis_ssid.ssid_len = @@ -2242,15 +2110,15 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, goto exit; } - if (rtw_set_802_11_infrastructure_mode23a - (padapter, pnetwork->network.InfrastructureMode) == false) { + if (cfg80211_infrastructure_mode( + padapter, pnetwork->network.ifmode) != _SUCCESS) { ret = -EPERM; goto exit; } psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled; - psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_; - psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_; + psecuritypriv->dot11PrivacyAlgrthm = 0; + psecuritypriv->dot118021XGrpPrivacy = 0; psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open; psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen; @@ -2283,58 +2151,42 @@ static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev, if ((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared || psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) && sme->key) { - u32 wep_key_idx, wep_key_len, wep_total_len; - struct ndis_802_11_wep *pwep = NULL; + struct rtw_wep_key wep_key; + u8 wep_key_idx, wep_key_len; DBG_8723A("%s(): Shared/Auto WEP\n", __func__); wep_key_idx = sme->key_idx; wep_key_len = sme->key_len; - if (sme->key_idx > WEP_KEYS) { + if (wep_key_idx > WEP_KEYS || !wep_key_len || + wep_key_len > WLAN_KEY_LEN_WEP104) { ret = -EINVAL; goto exit; } - if (wep_key_len > 0) { - wep_key_len = wep_key_len <= 5 ? 5 : 13; - wep_total_len = - wep_key_len + - offsetof(struct ndis_802_11_wep, KeyMaterial); - pwep = (struct ndis_802_11_wep *)kmalloc(wep_total_len, - GFP_KERNEL); - if (pwep == NULL) { - DBG_8723A(" wpa_set_encryption: pwep " - "allocate fail !!!\n"); - ret = -ENOMEM; - goto exit; - } + wep_key_len = wep_key_len <= 5 ? 5 : 13; - memset(pwep, 0, wep_total_len); + memset(&wep_key, 0, sizeof(struct rtw_wep_key)); - pwep->KeyLength = wep_key_len; - pwep->Length = wep_total_len; + wep_key.keylen = wep_key_len; - if (wep_key_len == 13) { - padapter->securitypriv.dot11PrivacyAlgrthm = - _WEP104_; - padapter->securitypriv.dot118021XGrpPrivacy = - _WEP104_; - } + if (wep_key_len == 13) { + padapter->securitypriv.dot11PrivacyAlgrthm = + WLAN_CIPHER_SUITE_WEP104; + padapter->securitypriv.dot118021XGrpPrivacy = + WLAN_CIPHER_SUITE_WEP104; } else { - ret = -EINVAL; - goto exit; + padapter->securitypriv.dot11PrivacyAlgrthm = + WLAN_CIPHER_SUITE_WEP40; + padapter->securitypriv.dot118021XGrpPrivacy = + WLAN_CIPHER_SUITE_WEP40; } - pwep->KeyIndex = wep_key_idx; - pwep->KeyIndex |= 0x80000000; + memcpy(wep_key.key, (void *)sme->key, wep_key.keylen); - memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength); - - if (rtw_set_802_11_add_wep23a(padapter, pwep) == (u8) _FAIL) { + if (rtw_cfg80211_add_wep(padapter, &wep_key, wep_key_idx) != + _SUCCESS) ret = -EOPNOTSUPP; - } - - kfree(pwep); if (ret < 0) goto exit; @@ -2380,7 +2232,7 @@ static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev, { struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); rtw_set_roaming(padapter, 0); @@ -2430,8 +2282,8 @@ static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy, struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev); - DBG_8723A(FUNC_NDEV_FMT " enabled:%u, timeout:%d\n", - FUNC_NDEV_ARG(ndev), enabled, timeout); + DBG_8723A("%s(%s): enabled:%u, timeout:%d\n", + __func__, ndev->name, enabled, timeout); rtw_wdev_priv->power_mgmt = enabled; @@ -2448,25 +2300,22 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, u8 index, blInserted = false; struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); struct security_priv *psecuritypriv = &padapter->securitypriv; - u8 strZeroMacAddress[ETH_ALEN] = { 0x00 }; - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev)); + DBG_8723A("%s(%s)\n", __func__, netdev->name); - if (!memcmp(pmksa->bssid, strZeroMacAddress, ETH_ALEN)) { + if (is_zero_ether_addr(pmksa->bssid)) return -EINVAL; - } blInserted = false; /* overwrite PMKID */ for (index = 0; index < NUM_PMKID_CACHE; index++) { - if (!memcmp(psecuritypriv->PMKIDList[index].Bssid, - pmksa->bssid, ETH_ALEN)) { + if (ether_addr_equal(psecuritypriv->PMKIDList[index].Bssid, + pmksa->bssid)) { /* BSSID is matched, the same AP => rewrite with new PMKID. */ - DBG_8723A(FUNC_NDEV_FMT - " BSSID exists in the PMKList.\n", - FUNC_NDEV_ARG(netdev)); + DBG_8723A("%s(%s): BSSID exists in the PMKList.\n", + __func__, netdev->name); memcpy(psecuritypriv->PMKIDList[index].PMKID, pmksa->pmkid, WLAN_PMKID_LEN); @@ -2479,12 +2328,12 @@ static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy, if (!blInserted) { /* Find a new entry */ - DBG_8723A(FUNC_NDEV_FMT - " Use the new entry index = %d for this PMKID.\n", - FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex); + DBG_8723A("%s(%s): Use new entry index = %d for this PMKID\n", + __func__, netdev->name, psecuritypriv->PMKIDIndex); - memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex]. - Bssid, pmksa->bssid, ETH_ALEN); + ether_addr_copy( + psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex]. + Bssid, pmksa->bssid); memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex]. PMKID, pmksa->pmkid, WLAN_PMKID_LEN); @@ -2507,14 +2356,14 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); struct security_priv *psecuritypriv = &padapter->securitypriv; - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev)); + DBG_8723A("%s(%s)\n", __func__, netdev->name); for (index = 0; index < NUM_PMKID_CACHE; index++) { - if (!memcmp(psecuritypriv->PMKIDList[index].Bssid, - pmksa->bssid, ETH_ALEN)) { - /* BSSID is matched, the same AP => Remove this PMKID information and reset it. */ - memset(psecuritypriv->PMKIDList[index].Bssid, 0x00, - ETH_ALEN); + if (ether_addr_equal(psecuritypriv->PMKIDList[index].Bssid, + pmksa->bssid)) { + /* BSSID is matched, the same AP => Remove this PMKID + information and reset it. */ + eth_zero_addr(psecuritypriv->PMKIDList[index].Bssid); memset(psecuritypriv->PMKIDList[index].PMKID, 0x00, WLAN_PMKID_LEN); psecuritypriv->PMKIDList[index].bUsed = false; @@ -2524,8 +2373,8 @@ static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy, } if (false == bMatched) { - DBG_8723A(FUNC_NDEV_FMT " do not have matched BSSID\n", - FUNC_NDEV_ARG(netdev)); + DBG_8723A("%s(%s): do not have matched BSSID\n", __func__, + netdev->name); return -EINVAL; } @@ -2538,7 +2387,7 @@ static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy, struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); struct security_priv *psecuritypriv = &padapter->securitypriv; - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev)); + DBG_8723A("%s(%s)\n", __func__, netdev->name); memset(&psecuritypriv->PMKIDList[0], 0x00, sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE); @@ -2583,8 +2432,8 @@ void rtw_cfg80211_indicate_sta_assoc(struct rtw_adapter *padapter, freq = ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, - GFP_ATOMIC); + cfg80211_rx_mgmt(padapter->rtw_wdev, freq, 0, pmgmt_frame, frame_len, + 0, GFP_ATOMIC); #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ } @@ -2597,14 +2446,15 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter, u8 *pmgmt_frame; uint frame_len; struct ieee80211_hdr *pwlanhdr; - unsigned short *fctrl; - u8 mgmt_buf[128] = { 0 }; + u8 mgmt_buf[128]; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info; struct net_device *ndev = padapter->pnetdev; DBG_8723A("%s(padapter =%p,%s)\n", __func__, padapter, ndev->name); + memset(mgmt_buf, 0, 128); + #if defined(RTW_USE_CFG80211_STA_EVENT) cfg80211_del_sta(ndev, da, GFP_ATOMIC); #else /* defined(RTW_USE_CFG80211_STA_EVENT) */ @@ -2619,16 +2469,16 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter, pmgmt_frame = mgmt_buf; pwlanhdr = (struct ieee80211_hdr *)pmgmt_frame; - fctrl = &pwlanhdr->frame_control; - *(fctrl) = 0; + pwlanhdr->frame_control = + cpu_to_le16(IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_DEAUTH); - memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN); - memcpy(pwlanhdr->addr2, da, ETH_ALEN); - memcpy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network), ETH_ALEN); + ether_addr_copy(pwlanhdr->addr1, myid(&padapter->eeprompriv)); + ether_addr_copy(pwlanhdr->addr2, da); + ether_addr_copy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network)); - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); + pwlanhdr->seq_ctrl = + cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext->mgnt_seq)); pmlmeext->mgnt_seq++; - SetFrameSubType(pmgmt_frame, WIFI_DEAUTH); pmgmt_frame += sizeof(struct ieee80211_hdr_3addr); frame_len = sizeof(struct ieee80211_hdr_3addr); @@ -2638,8 +2488,8 @@ void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter, WLAN_REASON_PREV_AUTH_NOT_VALID, (unsigned char *)&reason, &frame_len); - rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len, - GFP_ATOMIC); + cfg80211_rx_mgmt(padapter->rtw_wdev, freq, 0, mgmt_buf, frame_len, + 0, GFP_ATOMIC); #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */ } @@ -2676,7 +2526,7 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct ieee80211_radiotap_header *rtap_hdr; struct rtw_adapter *padapter = netdev_priv(ndev); - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header))) goto fail; @@ -2718,8 +2568,8 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, skb_pull(skb, dot11_hdr_len + qos_len + snap_len - ETH_ALEN * 2); pdata = (unsigned char *)skb->data; - memcpy(pdata, dst_mac_addr, ETH_ALEN); - memcpy(pdata + ETH_ALEN, src_mac_addr, ETH_ALEN); + ether_addr_copy(pdata, dst_mac_addr); + ether_addr_copy(pdata + ETH_ALEN, src_mac_addr); DBG_8723A("should be eapol packet\n"); @@ -2729,6 +2579,7 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, return ret; } else if (ieee80211_is_action(dot11_hdr->frame_control)) { + struct ieee80211_mgmt *mgmt; /* only for action frames */ struct xmit_frame *pmgntframe; struct pkt_attrib *pattrib; @@ -2739,33 +2590,19 @@ static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb, struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; u32 len = skb->len; u8 category, action; -#ifdef CONFIG_8723AU_P2P - int type = -1; -#endif - if (rtw_action_frame_parse23a(skb->data, len, &category, - &action) == false) { - DBG_8723A(FUNC_NDEV_FMT " frame_control:0x%x\n", - FUNC_NDEV_ARG(ndev), - le16_to_cpu(dot11_hdr->frame_control)); - goto fail; - } + mgmt = (struct ieee80211_mgmt *)dot11_hdr; - DBG_8723A("RTW_Tx:da =" MAC_FMT " via " FUNC_NDEV_FMT "\n", - MAC_ARG(dot11_hdr->addr1), FUNC_NDEV_ARG(ndev)); -#ifdef CONFIG_8723AU_P2P - type = rtw_p2p_check_frames(padapter, skb->data, len, true); - if (type >= 0) - goto dump; -#endif - if (category == WLAN_CATEGORY_PUBLIC) + DBG_8723A("RTW_Tx:da =" MAC_FMT " via %s(%s)\n", + MAC_ARG(mgmt->da), __func__, ndev->name); + category = mgmt->u.action.category; + action = mgmt->u.action.u.wme_action.action_code; + if (mgmt->u.action.category == WLAN_CATEGORY_PUBLIC) DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action)); else DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category, action); -#ifdef CONFIG_8723AU_P2P -dump: -#endif + /* starting alloc mgmt frame to dump it */ pmgntframe = alloc_mgtxmitframe23a(pxmitpriv); if (pmgntframe == NULL) @@ -2781,16 +2618,6 @@ dump: pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET; memcpy(pframe, skb->data, len); -#ifdef CONFIG_8723AU_P2P - if (type >= 0) { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if (pwfd_info->wfd_enable) - rtw_append_wfd_ie(padapter, pframe, &len); - } -#endif /* CONFIG_8723AU_P2P */ pattrib->pktlen = len; /* update seq number */ @@ -2836,24 +2663,23 @@ static int rtw_cfg80211_add_monitor_if(struct rtw_adapter *padapter, char *name, struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); if (!name) { - DBG_8723A(FUNC_ADPT_FMT " without specific name\n", - FUNC_ADPT_ARG(padapter)); + DBG_8723A("%s(%s): without specific name\n", + __func__, padapter->pnetdev->name); ret = -EINVAL; goto out; } if (pwdev_priv->pmon_ndev) { - DBG_8723A(FUNC_ADPT_FMT " monitor interface exist: " NDEV_FMT - "\n", FUNC_ADPT_ARG(padapter), - NDEV_ARG(pwdev_priv->pmon_ndev)); + DBG_8723A("%s(%s): monitor interface exist: %s\n", __func__, + padapter->pnetdev->name, pwdev_priv->pmon_ndev->name); ret = -EBUSY; goto out; } mon_ndev = alloc_etherdev(sizeof(struct rtw_adapter)); if (!mon_ndev) { - DBG_8723A(FUNC_ADPT_FMT " allocate ndev fail\n", - FUNC_ADPT_ARG(padapter)); + DBG_8723A("%s(%s): allocate ndev fail\n", __func__, + padapter->pnetdev->name); ret = -ENOMEM; goto out; } @@ -2868,8 +2694,8 @@ static int rtw_cfg80211_add_monitor_if(struct rtw_adapter *padapter, char *name, /* wdev */ mon_wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); if (!mon_wdev) { - DBG_8723A(FUNC_ADPT_FMT " allocate mon_wdev fail\n", - FUNC_ADPT_ARG(padapter)); + DBG_8723A("%s(%s): allocate mon_wdev fail\n", __func__, + padapter->pnetdev->name); ret = -ENOMEM; goto out; } @@ -2910,8 +2736,8 @@ cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, const char *name, struct net_device *ndev = NULL; struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - DBG_8723A(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n", - FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type); + DBG_8723A("%s(%s): wiphy:%s, name:%s, type:%d\n", __func__, + padapter->pnetdev->name, wiphy_name(wiphy), name, type); switch (type) { case NL80211_IFTYPE_ADHOC: @@ -2940,7 +2766,8 @@ cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, const char *name, break; } - DBG_8723A(FUNC_ADPT_FMT " ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter), + DBG_8723A("%s(%s): ndev:%p, ret:%d\n", __func__, + padapter->pnetdev->name, ndev, ret); return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret); @@ -2962,8 +2789,8 @@ static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy, if (ndev == pwdev_priv->pmon_ndev) { pwdev_priv->pmon_ndev = NULL; pwdev_priv->ifname_mon[0] = '\0'; - DBG_8723A(FUNC_NDEV_FMT " remove monitor interface\n", - FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s): remove monitor interface\n", + __func__, ndev->name); } exit: @@ -2976,10 +2803,6 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head, int ret = 0; u8 *pbuf = NULL; uint len, wps_ielen = 0; -#ifdef CONFIG_8723AU_P2P - uint p2p_ielen = 0; - u8 got_p2p_ie = false; -#endif struct mlme_priv *pmlmepriv = &adapter->mlmepriv; /* struct sta_priv *pstapriv = &padapter->stapriv; */ @@ -3007,55 +2830,14 @@ static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head, &wps_ielen)) DBG_8723A("add bcn, wps_ielen =%d\n", wps_ielen); -#ifdef CONFIG_8723AU_P2P - /* check p2p ie if inclued */ - if (rtw_get_p2p_ie23a - (pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL, - &p2p_ielen)) { - DBG_8723A("got p2p_ie, len =%d\n", p2p_ielen); - got_p2p_ie = true; - } -#endif - /* pbss_network->IEs will not include p2p_ie, wfd ie */ - rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, - P2P_OUI23A, 4); - rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_, - WFD_OUI23A, 4); + rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, + WLAN_EID_VENDOR_SPECIFIC, P2P_OUI23A, 4); + rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, + WLAN_EID_VENDOR_SPECIFIC, WFD_OUI23A, 4); if (rtw_check_beacon_data23a(adapter, pbuf, len) == _SUCCESS) { -#ifdef CONFIG_8723AU_P2P - /* check p2p if enable */ - if (got_p2p_ie == true) { - struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv; - struct wifidirect_info *pwdinfo = &adapter->wdinfo; - - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - DBG_8723A("Enable P2P function for the first " - "time\n"); - rtw_p2p_enable23a(adapter, P2P_ROLE_GO); - wdev_to_priv(adapter->rtw_wdev)->p2p_enabled = - true; - } else { - del_timer_sync(&pwdinfo->find_phase_timer); - del_timer_sync(&pwdinfo-> - restore_p2p_state_timer); - del_timer_sync(&pwdinfo->pre_tx_scan_timer); - - DBG_8723A("enter GO Mode, p2p_ielen =%d\n", - p2p_ielen); - - rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO); - rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK); - pwdinfo->intent = 15; - } - - pwdinfo->operating_channel = pmlmeext->cur_channel; - } -#endif /* CONFIG_8723AU_P2P */ - ret = 0; - } else { ret = -EINVAL; } @@ -3071,8 +2853,8 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, int ret = 0; struct rtw_adapter *adapter = wiphy_to_adapter(wiphy); - DBG_8723A(FUNC_NDEV_FMT " hidden_ssid:%d, auth_type:%d\n", - FUNC_NDEV_ARG(ndev), settings->hidden_ssid, + DBG_8723A("%s(%s): hidden_ssid:%d, auth_type:%d\n", + __func__, ndev->name, settings->hidden_ssid, settings->auth_type); ret = rtw_add_beacon(adapter, settings->beacon.head, @@ -3088,29 +2870,12 @@ static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev, struct wlan_bssid_ex *pbss_network_ext = &adapter->mlmeextpriv.mlmext_info.network; - if (0) - DBG_8723A(FUNC_ADPT_FMT - " ssid:(%s,%d), from ie:(%s,%d)\n", - FUNC_ADPT_ARG(adapter), settings->ssid, - (int)settings->ssid_len, - pbss_network->Ssid.ssid, - pbss_network->Ssid.ssid_len); - memcpy(pbss_network->Ssid.ssid, (void *)settings->ssid, settings->ssid_len); pbss_network->Ssid.ssid_len = settings->ssid_len; memcpy(pbss_network_ext->Ssid.ssid, (void *)settings->ssid, settings->ssid_len); pbss_network_ext->Ssid.ssid_len = settings->ssid_len; - - if (0) - DBG_8723A(FUNC_ADPT_FMT - " after ssid:(%s,%d), (%s,%d)\n", - FUNC_ADPT_ARG(adapter), - pbss_network->Ssid.ssid, - pbss_network->Ssid.ssid_len, - pbss_network_ext->Ssid.ssid, - pbss_network_ext->Ssid.ssid_len); } return ret; @@ -3123,7 +2888,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, int ret = 0; struct rtw_adapter *adapter = wiphy_to_adapter(wiphy); - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail, info->tail_len); @@ -3133,7 +2898,7 @@ static int cfg80211_rtw_change_beacon(struct wiphy *wiphy, static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } @@ -3141,7 +2906,7 @@ static int cfg80211_rtw_add_station(struct wiphy *wiphy, struct net_device *ndev, u8 *mac, struct station_parameters *params) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } @@ -3157,7 +2922,7 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy, struct mlme_priv *pmlmepriv = &padapter->mlmepriv; struct sta_priv *pstapriv = &padapter->stapriv; - DBG_8723A("+" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("+%s(%s)\n", __func__, ndev->name); if (check_fwstate(pmlmepriv, (_FW_LINKED | WIFI_AP_STATE)) != true) { DBG_8723A("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n", @@ -3188,7 +2953,7 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy, list_for_each_safe(plist, ptmp, phead) { psta = container_of(plist, struct sta_info, asoc_list); - if (!memcmp(mac, psta->hwaddr, ETH_ALEN)) { + if (ether_addr_equal(mac, psta->hwaddr)) { if (psta->dot8021xalg == 1 && psta->bpairwise_key_installed == false) { DBG_8723A("%s, sta's dot8021xalg = 1 and " @@ -3217,7 +2982,7 @@ static int cfg80211_rtw_del_station(struct wiphy *wiphy, associated_clients_update23a(padapter, updated); - DBG_8723A("-" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("-%s(%s)\n", __func__, ndev->name); return ret; } @@ -3226,7 +2991,7 @@ static int cfg80211_rtw_change_station(struct wiphy *wiphy, struct net_device *ndev, u8 *mac, struct station_parameters *params) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } @@ -3234,7 +2999,7 @@ static int cfg80211_rtw_dump_station(struct wiphy *wiphy, struct net_device *ndev, int idx, u8 *mac, struct station_info *sinfo) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); /* TODO: dump scanned queue */ @@ -3244,104 +3009,27 @@ static int cfg80211_rtw_dump_station(struct wiphy *wiphy, static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev, struct bss_parameters *params) { - DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev)); + DBG_8723A("%s(%s)\n", __func__, ndev->name); return 0; } #endif /* CONFIG_8723AU_AP_MODE */ -void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame, - uint frame_len) -{ -#ifdef CONFIG_8723AU_P2P - int type; -#endif - s32 freq; - int channel; - u8 category, action; - - channel = rtw_get_oper_ch23a(padapter); - - DBG_8723A("RTW_Rx:cur_ch =%d\n", channel); -#ifdef CONFIG_8723AU_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false); - if (type >= 0) - goto indicate; -#endif - rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action); - DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action); - -#ifdef CONFIG_8723AU_P2P -indicate: -#endif - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = ieee80211_channel_to_frequency(channel, - IEEE80211_BAND_2GHZ); - else - freq = ieee80211_channel_to_frequency(channel, - IEEE80211_BAND_5GHZ); - - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, - GFP_ATOMIC); -} - -void rtw_cfg80211_rx_p2p_action_public(struct rtw_adapter *padapter, - u8 *pmgmt_frame, uint frame_len) -{ -#ifdef CONFIG_8723AU_P2P - int type; -#endif - s32 freq; - int channel; - u8 category, action; - - channel = rtw_get_oper_ch23a(padapter); - - DBG_8723A("RTW_Rx:cur_ch =%d\n", channel); -#ifdef CONFIG_8723AU_P2P - type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false); - if (type >= 0) { - switch (type) { - case P2P_GO_NEGO_CONF: - case P2P_PROVISION_DISC_RESP: - rtw_clear_scan_deny(padapter); - } - goto indicate; - } -#endif - rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action); - DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action); - -#ifdef CONFIG_8723AU_P2P -indicate: -#endif - if (channel <= RTW_CH_MAX_2G_CHANNEL) - freq = ieee80211_channel_to_frequency(channel, - IEEE80211_BAND_2GHZ); - else - freq = ieee80211_channel_to_frequency(channel, - IEEE80211_BAND_5GHZ); - - rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len, - GFP_ATOMIC); -} - void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame, uint frame_len, const char *msg) { + struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *)frame; s32 freq; int channel; - u8 category, action; channel = rtw_get_oper_ch23a(adapter); - rtw_action_frame_parse23a(frame, frame_len, &category, &action); - DBG_8723A("RTW_Rx:cur_ch =%d\n", channel); if (msg) DBG_8723A("RTW_Rx:%s\n", msg); else - DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, - action); + DBG_8723A("RTW_Rx:category(%u), action(%u)\n", + hdr->u.action.category, + hdr->u.action.u.wme_action.action_code); if (channel <= RTW_CH_MAX_2G_CHANNEL) freq = ieee80211_channel_to_frequency(channel, @@ -3350,353 +3038,10 @@ void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame, freq = ieee80211_channel_to_frequency(channel, IEEE80211_BAND_5GHZ); - rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC); + cfg80211_rx_mgmt(adapter->rtw_wdev, freq, 0, frame, frame_len, + 0, GFP_ATOMIC); } -#ifdef CONFIG_8723AU_P2P -void rtw_cfg80211_issue_p2p_provision_request23a(struct rtw_adapter *padapter, - const u8 *buf, size_t len) -{ - u16 wps_devicepassword_id = 0x0000; - uint wps_devicepassword_id_len = 0; - u8 wpsie[255] = { 0x00 }, p2p_ie[255] = { 0x00 }; - uint p2p_ielen = 0; - uint wpsielen = 0; - u32 devinfo_contentlen = 0; - u8 devinfo_content[64] = { 0x00 }; - u16 capability = 0; - uint capability_len = 0; - - unsigned char category = WLAN_CATEGORY_PUBLIC; - u8 action = P2P_PUB_ACTION_ACTION; - u8 dialogToken = 1; - u32 p2poui = cpu_to_be32(P2POUI); - u8 oui_subtype = P2P_PROVISION_DISC_REQ; - u32 p2pielen = 0; -#ifdef CONFIG_8723AU_P2P - u32 wfdielen = 0; -#endif /* CONFIG_8723AU_P2P */ - - struct xmit_frame *pmgntframe; - struct pkt_attrib *pattrib; - unsigned char *pframe; - struct ieee80211_hdr *pwlanhdr, *hdr; - struct xmit_priv *pxmitpriv = &padapter->xmitpriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - u8 *frame_body = - (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr)); - size_t frame_body_len = len - sizeof(struct ieee80211_hdr_3addr); - - DBG_8723A("[%s] In\n", __func__); - - hdr = (struct ieee80211_hdr *)buf; - /* prepare for building provision_request frame */ - memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, hdr->addr1, ETH_ALEN); - memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, hdr->addr1, ETH_ALEN); - - pwdinfo->tx_prov_disc_info.wps_config_method_request = - WPS_CM_PUSH_BUTTON; - - rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_, - frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie, - &wpsielen); - rtw_get_wps_attr_content23a(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID, - (u8 *)&wps_devicepassword_id, - &wps_devicepassword_id_len); - wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id); - - switch (wps_devicepassword_id) { - case WPS_DPID_PIN: - pwdinfo->tx_prov_disc_info.wps_config_method_request = - WPS_CM_LABEL; - break; - case WPS_DPID_USER_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = - WPS_CM_DISPLYA; - break; - case WPS_DPID_MACHINE_SPEC: - break; - case WPS_DPID_REKEY: - break; - case WPS_DPID_PBC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = - WPS_CM_PUSH_BUTTON; - break; - case WPS_DPID_REGISTRAR_SPEC: - pwdinfo->tx_prov_disc_info.wps_config_method_request = - WPS_CM_KEYPAD; - break; - default: - break; - } - - if (rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_, - frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, - p2p_ie, &p2p_ielen)) { - rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, - P2P_ATTR_DEVICE_INFO, devinfo_content, - &devinfo_contentlen); - rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY, - (u8 *)&capability, &capability_len); - } - - /* start to build provision_request frame */ - memset(wpsie, 0, sizeof(wpsie)); - memset(p2p_ie, 0, sizeof(p2p_ie)); - p2p_ielen = 0; - - pmgntframe = alloc_mgtxmitframe23a(pxmitpriv); - if (pmgntframe == NULL) - return; - /* update attribute */ - pattrib = &pmgntframe->attrib; - update_mgntframe_attrib23a(padapter, pattrib); - - memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET); - - pframe = (u8 *) (pmgntframe->buf_addr) + TXDESC_OFFSET; - pwlanhdr = (struct ieee80211_hdr *)pframe; - - pwlanhdr->frame_control = 0; - - memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr, - ETH_ALEN); - memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN); - memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr, - ETH_ALEN); - - SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq); - pmlmeext->mgnt_seq++; - SetFrameSubType(pframe, WIFI_ACTION); - - pframe += sizeof(struct ieee80211_hdr_3addr); - pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr); - - pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen); - pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen); - pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui, - &pattrib->pktlen); - pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen); - pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen); - - /* build_prov_disc_request_p2p_ie23a */ - /* P2P OUI */ - p2pielen = 0; - p2p_ie[p2pielen++] = 0x50; - p2p_ie[p2pielen++] = 0x6F; - p2p_ie[p2pielen++] = 0x9A; - p2p_ie[p2pielen++] = 0x09; /* WFA P2P v1.0 */ - - /* Commented by Albert 20110301 */ - /* According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */ - /* 1. P2P Capability */ - /* 2. Device Info */ - /* 3. Group ID ( When joining an operating P2P Group ) */ - - /* P2P Capability ATTR */ - /* Type: */ - p2p_ie[p2pielen++] = P2P_ATTR_CAPABILITY; - - /* Length: */ - put_unaligned_le16(0x0002, p2p_ie + p2pielen); - p2pielen += 2; - - /* Value: */ - /* Device Capability Bitmap, 1 byte */ - /* Group Capability Bitmap, 1 byte */ - memcpy(p2p_ie + p2pielen, &capability, 2); - p2pielen += 2; - - /* Device Info ATTR */ - /* Type: */ - p2p_ie[p2pielen++] = P2P_ATTR_DEVICE_INFO; - - /* Length: */ - put_unaligned_le16(devinfo_contentlen, p2p_ie + p2pielen); - p2pielen += 2; - - /* Value: */ - memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen); - p2pielen += devinfo_contentlen; - - pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen, - (unsigned char *)p2p_ie, &p2p_ielen); - pattrib->pktlen += p2p_ielen; - - wpsielen = 0; - /* WPS OUI */ - *(u32 *)(wpsie) = cpu_to_be32(WPSOUI); - wpsielen += 4; - - /* WPS version */ - /* Type: */ - *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1); - wpsielen += 2; - - /* Length: */ - *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001); - wpsielen += 2; - - /* Value: */ - wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */ - - /* Config Method */ - /* Type: */ - *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD); - wpsielen += 2; - - /* Length: */ - *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002); - wpsielen += 2; - - /* Value: */ - *(u16 *)(wpsie + wpsielen) = - cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request); - wpsielen += 2; - - pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen, - (unsigned char *)wpsie, &pattrib->pktlen); - -#ifdef CONFIG_8723AU_P2P - wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe); - pframe += wfdielen; - pattrib->pktlen += wfdielen; -#endif /* CONFIG_8723AU_P2P */ - - pattrib->last_txcmdsz = pattrib->pktlen; - - /* dump_mgntframe23a(padapter, pmgntframe); */ - if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS) - DBG_8723A("%s, ack to\n", __func__); -} - -static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy, - struct wireless_dev *wdev, - struct ieee80211_channel *channel, - unsigned int duration, u64 *cookie) -{ - s32 err = 0; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = - &padapter->cfg80211_wdinfo; - u8 remain_ch = - (u8) ieee80211_frequency_to_channel(channel->center_freq); - u8 ready_on_channel = false; - - DBG_8723A(FUNC_ADPT_FMT " ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter), - remain_ch, duration); - - if (pcfg80211_wdinfo->is_ro_ch == true) { - DBG_8723A("%s, cancel ro ch timer\n", __func__); - - del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer); - -#ifdef CONFIG_8723AU_P2P - p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK); -#endif - } - - pcfg80211_wdinfo->is_ro_ch = true; - - if (_FAIL == rtw_pwr_wakeup(padapter)) { - err = -EFAULT; - goto exit; - } - - memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel, - sizeof(struct ieee80211_channel)); - pcfg80211_wdinfo->remain_on_ch_cookie = *cookie; - - rtw_scan_abort23a(padapter); - if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) { - rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE); - wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true; - } else { - rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__, - rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - } - - rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN); - - if (duration < 400) - duration = duration * 3; /* extend from exper. */ - - pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel; - - if (rtw_ch_set_search_ch23a(pmlmeext->channel_set, remain_ch) >= 0) { - if (remain_ch != pmlmeext->cur_channel) { - ready_on_channel = true; - } - } else { - DBG_8723A("%s remain_ch:%u not in channel plan!!!!\n", - __func__, remain_ch); - } - - /* call this after other things have been done */ - if (ready_on_channel == true) { - if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) { - pmlmeext->cur_channel = remain_ch; - - set_channel_bwmode23a(padapter, remain_ch, - HAL_PRIME_CHNL_OFFSET_DONT_CARE, - HT_CHANNEL_WIDTH_20); - } - } - DBG_8723A("%s, set ro ch timer, duration =%d\n", __func__, duration); - mod_timer(&pcfg80211_wdinfo->remain_on_ch_timer, - jiffies + msecs_to_jiffies(duration)); - - rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type, - duration, GFP_KERNEL); - - pwdinfo->listen_channel = pmlmeext->cur_channel; - -exit: - if (err) - pcfg80211_wdinfo->is_ro_ch = false; - - return err; -} - -static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy, - struct wireless_dev *wdev, - u64 cookie) -{ - s32 err = 0; - struct rtw_adapter *padapter = wiphy_to_adapter(wiphy); - struct wifidirect_info *pwdinfo = &padapter->wdinfo; - struct cfg80211_wifidirect_info *pcfg80211_wdinfo = - &padapter->cfg80211_wdinfo; - - DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter)); - - if (pcfg80211_wdinfo->is_ro_ch == true) { - DBG_8723A("%s, cancel ro ch timer\n", __func__); - del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer); -#ifdef CONFIG_8723AU_P2P - p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK); -#endif - } - - rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo)); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__, - rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo)); -#endif - pcfg80211_wdinfo->is_ro_ch = false; - - return err; -} - -#endif /* CONFIG_8723AU_P2P */ - static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch, const u8 *buf, size_t len) { @@ -3704,11 +3049,9 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch, struct pkt_attrib *pattrib; unsigned char *pframe; int ret = _FAIL; - bool ack = true; struct ieee80211_hdr *pwlanhdr; struct xmit_priv *pxmitpriv = &padapter->xmitpriv; struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - /* struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; */ if (_FAIL == rtw_pwr_wakeup(padapter)) { ret = -EFAULT; @@ -3729,7 +3072,7 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch, /* starting alloc mgmt frame to dump it */ pmgntframe = alloc_mgtxmitframe23a(pxmitpriv); - if (pmgntframe == NULL) { + if (!pmgntframe) { /* ret = -ENOMEM; */ ret = _FAIL; goto exit; @@ -3753,139 +3096,76 @@ static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch, pattrib->seqnum = pmlmeext->mgnt_seq; pmlmeext->mgnt_seq++; -#ifdef CONFIG_8723AU_P2P - { - struct wifi_display_info *pwfd_info; - - pwfd_info = padapter->wdinfo.wfd_info; - - if (true == pwfd_info->wfd_enable) { - rtw_append_wfd_ie(padapter, pframe, &pattrib->pktlen); - } - } -#endif /* CONFIG_8723AU_P2P */ - pattrib->last_txcmdsz = pattrib->pktlen; - if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS) { - ack = false; - ret = _FAIL; + ret = dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe); -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s, ack == _FAIL\n", __func__); -#endif - } else { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s, ack =%d, ok!\n", __func__, ack); -#endif - ret = _SUCCESS; - } + if (ret != _SUCCESS) + DBG_8723A("%s, ack == false\n", __func__); + else + DBG_8723A("%s, ack == true\n", __func__); exit: -#ifdef CONFIG_DEBUG_CFG80211 DBG_8723A("%s, ret =%d\n", __func__, ret); -#endif return ret; } static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev, -#if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0)) - struct ieee80211_channel *chan, - bool offchan, - unsigned int wait, - const u8 *buf, size_t len, - bool no_cck, bool dont_wait_for_ack, -#else struct cfg80211_mgmt_tx_params *params, -#endif u64 *cookie) { struct rtw_adapter *padapter = (struct rtw_adapter *)wiphy_to_adapter(wiphy); - struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev); int ret = 0; int tx_ret; u32 dump_limit = RTW_MAX_MGMT_TX_CNT; u32 dump_cnt = 0; bool ack = true; u8 category, action; - int type = (-1); unsigned long start = jiffies; -#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0)) size_t len = params->len; struct ieee80211_channel *chan = params->chan; const u8 *buf = params->buf; -#endif - struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)buf; + struct ieee80211_mgmt *hdr = (struct ieee80211_mgmt *)buf; u8 tx_ch = (u8) ieee80211_frequency_to_channel(chan->center_freq); + if (!ieee80211_is_action(hdr->frame_control)) + return -EINVAL; + /* cookie generation */ *cookie = (unsigned long)buf; -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A(FUNC_ADPT_FMT " len =%zu, ch =%d" - "\n", FUNC_ADPT_ARG(padapter), len, tx_ch); -#endif /* CONFIG_DEBUG_CFG80211 */ + DBG_8723A("%s(%s): len =%zu, ch =%d\n", __func__, + padapter->pnetdev->name, len, tx_ch); /* indicate ack before issue frame to avoid racing with rsp frame */ - rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack, - GFP_KERNEL); - - if (rtw_action_frame_parse23a(buf, len, &category, &action) == false) { - DBG_8723A(FUNC_ADPT_FMT " frame_control:0x%x\n", - FUNC_ADPT_ARG(padapter), - le16_to_cpu(hdr->frame_control)); - goto exit; - } + cfg80211_mgmt_tx_status(padapter->rtw_wdev, *cookie, buf, len, ack, + GFP_KERNEL); DBG_8723A("RTW_Tx:tx_ch =%d, da =" MAC_FMT "\n", tx_ch, - MAC_ARG(hdr->addr1)); -#ifdef CONFIG_8723AU_P2P - type = rtw_p2p_check_frames(padapter, buf, len, true); - if (type >= 0) - goto dump; -#endif + MAC_ARG(hdr->da)); + category = hdr->u.action.category; + action = hdr->u.action.u.wme_action.action_code; if (category == WLAN_CATEGORY_PUBLIC) DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action)); else DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category, action); -#ifdef CONFIG_8723AU_P2P -dump: -#endif do { dump_cnt++; tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len); } while (dump_cnt < dump_limit && tx_ret != _SUCCESS); if (tx_ret != _SUCCESS || dump_cnt > 1) { - DBG_8723A(FUNC_ADPT_FMT " %s (%d/%d) in %d ms\n", - FUNC_ADPT_ARG(padapter), + DBG_8723A("%s(%s): %s (%d/%d) in %d ms\n", + __func__, padapter->pnetdev->name, tx_ret == _SUCCESS ? "OK" : "FAIL", dump_cnt, dump_limit, jiffies_to_msecs(jiffies - start)); } - switch (type) { - case P2P_GO_NEGO_CONF: - rtw_clear_scan_deny(padapter); - break; - case P2P_INVIT_RESP: - if (pwdev_priv->invit_info.flags & BIT(0) - && pwdev_priv->invit_info.status == 0) { - DBG_8723A(FUNC_ADPT_FMT " agree with invitation of " - "persistent group\n", - FUNC_ADPT_ARG(padapter)); - rtw_set_scan_deny(padapter, 5000); - rtw_pwr_wakeup_ex(padapter, 5000); - rtw_clear_scan_deny(padapter); - } - break; - } - -exit: return ret; } @@ -3893,358 +3173,12 @@ static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy, struct wireless_dev *wdev, u16 frame_type, bool reg) { - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A(FUNC_ADPT_FMT " frame_type:%x, reg:%d\n", - FUNC_ADPT_ARG(adapter), frame_type, reg); -#endif - if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ)) return; return; } -static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf, - int len) -{ - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; -#ifdef CONFIG_8723AU_P2P - u32 p2p_ielen = 0; - u32 wfd_ielen = 0; - u8 *p2p_ie; -#endif -#ifdef CONFIG_8723AU_AP_MODE - u8 wps_oui[8] = { 0x0, 0x50, 0xf2, 0x04 }; -#endif - struct rtw_adapter *padapter = netdev_priv(ndev); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv; - - DBG_8723A(FUNC_NDEV_FMT " ielen =%d\n", FUNC_NDEV_ARG(ndev), len); - - if (len > 0) { - wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen); - if (wps_ie) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("bcn_wps_ielen =%d\n", wps_ielen); -#endif - - if (pmlmepriv->wps_beacon_ie) { - pmlmepriv->wps_beacon_ie_len = 0; - kfree(pmlmepriv->wps_beacon_ie); - pmlmepriv->wps_beacon_ie = NULL; - } - - pmlmepriv->wps_beacon_ie = - kmalloc(wps_ielen, GFP_KERNEL); - if (pmlmepriv->wps_beacon_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - } - memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen); - pmlmepriv->wps_beacon_ie_len = wps_ielen; - -#ifdef CONFIG_8723AU_AP_MODE - update_beacon23a(padapter, _VENDOR_SPECIFIC_IE_, wps_oui, - true); -#endif - } -#ifdef CONFIG_8723AU_P2P - p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen); - if (p2p_ie) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("bcn_p2p_ielen =%d\n", p2p_ielen); -#endif - - if (pmlmepriv->p2p_beacon_ie) { - pmlmepriv->p2p_beacon_ie_len = 0; - kfree(pmlmepriv->p2p_beacon_ie); - pmlmepriv->p2p_beacon_ie = NULL; - } - - pmlmepriv->p2p_beacon_ie = - kmalloc(p2p_ielen, GFP_KERNEL); - if (pmlmepriv->p2p_beacon_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - } - - memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen); - pmlmepriv->p2p_beacon_ie_len = p2p_ielen; - } -#endif /* CONFIG_8723AU_P2P */ - - /* buf += p2p_ielen; */ - /* len -= p2p_ielen; */ - -#ifdef CONFIG_8723AU_P2P - if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("bcn_wfd_ielen =%d\n", wfd_ielen); -#endif - - if (pmlmepriv->wfd_beacon_ie) { - pmlmepriv->wfd_beacon_ie_len = 0; - kfree(pmlmepriv->wfd_beacon_ie); - pmlmepriv->wfd_beacon_ie = NULL; - } - - pmlmepriv->wfd_beacon_ie = - kmalloc(wfd_ielen, GFP_KERNEL); - if (pmlmepriv->wfd_beacon_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie, - &pmlmepriv->wfd_beacon_ie_len); - } -#endif /* CONFIG_8723AU_P2P */ - - pmlmeext->bstart_bss = true; - - } - - return ret; -} - -static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net, - char *buf, int len) -{ - struct rtw_adapter *padapter = netdev_priv(net); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; -#ifdef CONFIG_8723AU_P2P - u32 p2p_ielen = 0; - u8 *p2p_ie; - u32 wfd_ielen = 0; -#endif - int ret = 0; - uint wps_ielen = 0; - u8 *wps_ie; - - if (len > 0) { - wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen); - if (wps_ie) { - uint attr_contentlen = 0; - u16 uconfig_method, *puconfig_method = NULL; - - if (pmlmepriv->wps_probe_resp_ie) { - pmlmepriv->wps_probe_resp_ie_len = 0; - kfree(pmlmepriv->wps_probe_resp_ie); - pmlmepriv->wps_probe_resp_ie = NULL; - } - - pmlmepriv->wps_probe_resp_ie = - kmalloc(wps_ielen, GFP_KERNEL); - if (pmlmepriv->wps_probe_resp_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - - /* add PUSH_BUTTON config_method by driver self in - wpsie of probe_resp at GO Mode */ - puconfig_method = (u16 *)rtw_get_wps_attr_content23a(wps_ie, wps_ielen, - WPS_ATTR_CONF_METHOD, - NULL, - &attr_contentlen); - if (puconfig_method) { - uconfig_method = WPS_CM_PUSH_BUTTON; - uconfig_method = cpu_to_be16(uconfig_method); - - *puconfig_method |= uconfig_method; - } - - memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen); - pmlmepriv->wps_probe_resp_ie_len = wps_ielen; - - } - - /* buf += wps_ielen; */ - /* len -= wps_ielen; */ - -#ifdef CONFIG_8723AU_P2P - p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen); - if (p2p_ie) { - u8 is_GO = false; - u32 attr_contentlen = 0; - u16 cap_attr = 0; - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("probe_resp_p2p_ielen =%d\n", p2p_ielen); -#endif - - /* Check P2P Capability ATTR */ - if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, - P2P_ATTR_CAPABILITY, - (u8 *) &cap_attr, - (uint *) &attr_contentlen)) { - u8 grp_cap = 0; - /* DBG_8723A( "[%s] Got P2P Capability Attr!!\n", __func__ ); */ - cap_attr = le16_to_cpu(cap_attr); - grp_cap = (u8) ((cap_attr >> 8) & 0xff); - - is_GO = (grp_cap & BIT(0)) ? true : false; - - if (is_GO) - DBG_8723A - ("Got P2P Capability Attr, grp_cap" - "= 0x%x, is_GO\n", grp_cap); - } - - if (is_GO == false) { - if (pmlmepriv->p2p_probe_resp_ie) { - pmlmepriv->p2p_probe_resp_ie_len = 0; - kfree(pmlmepriv->p2p_probe_resp_ie); - pmlmepriv->p2p_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_probe_resp_ie = - kmalloc(p2p_ielen, GFP_KERNEL); - if (pmlmepriv->p2p_probe_resp_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - } - memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie, - p2p_ielen); - pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen; - } else { - if (pmlmepriv->p2p_go_probe_resp_ie) { - pmlmepriv->p2p_go_probe_resp_ie_len = 0; - kfree(pmlmepriv->p2p_go_probe_resp_ie); - pmlmepriv->p2p_go_probe_resp_ie = NULL; - } - - pmlmepriv->p2p_go_probe_resp_ie = - kmalloc(p2p_ielen, GFP_KERNEL); - if (pmlmepriv->p2p_go_probe_resp_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - memcpy(pmlmepriv->p2p_go_probe_resp_ie, - p2p_ie, p2p_ielen); - pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen; - } - } -#endif /* CONFIG_8723AU_P2P */ - - /* buf += p2p_ielen; */ - /* len -= p2p_ielen; */ - -#ifdef CONFIG_8723AU_P2P - if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) { -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("probe_resp_wfd_ielen =%d\n", wfd_ielen); -#endif - - if (pmlmepriv->wfd_probe_resp_ie) { - pmlmepriv->wfd_probe_resp_ie_len = 0; - kfree(pmlmepriv->wfd_probe_resp_ie); - pmlmepriv->wfd_probe_resp_ie = NULL; - } - - pmlmepriv->wfd_probe_resp_ie = - kmalloc(wfd_ielen, GFP_KERNEL); - if (pmlmepriv->wfd_probe_resp_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie, - &pmlmepriv->wfd_probe_resp_ie_len); - } -#endif /* CONFIG_8723AU_P2P */ - } - - return ret; -} - -static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net, - char *buf, int len) -{ - int ret = 0; - struct rtw_adapter *padapter = netdev_priv(net); - struct mlme_priv *pmlmepriv = &padapter->mlmepriv; - - DBG_8723A("%s, ielen =%d\n", __func__, len); - - if (len > 0) { - if (pmlmepriv->wps_assoc_resp_ie) { - pmlmepriv->wps_assoc_resp_ie_len = 0; - kfree(pmlmepriv->wps_assoc_resp_ie); - pmlmepriv->wps_assoc_resp_ie = NULL; - } - - pmlmepriv->wps_assoc_resp_ie = kmalloc(len, GFP_KERNEL); - if (pmlmepriv->wps_assoc_resp_ie == NULL) { - DBG_8723A("%s()-%d: kmalloc() ERROR!\n", - __func__, __LINE__); - return -EINVAL; - - } - memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len); - pmlmepriv->wps_assoc_resp_ie_len = len; - } - - return ret; -} - -int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len, - int type) -{ - int ret = 0; - uint wps_ielen = 0; -#ifdef CONFIG_8723AU_P2P - u32 p2p_ielen = 0; -#endif - -#ifdef CONFIG_DEBUG_CFG80211 - DBG_8723A("%s, ielen =%d\n", __func__, len); -#endif - - if ((rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen) && (wps_ielen > 0)) -#ifdef CONFIG_8723AU_P2P - || (rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen) && (p2p_ielen > 0)) -#endif - ) { - if (net) { - switch (type) { - case 0x1: /* BEACON */ - ret = - rtw_cfg80211_set_beacon_wpsp2pie(net, buf, - len); - break; - case 0x2: /* PROBE_RESP */ - ret = - rtw_cfg80211_set_probe_resp_wpsp2pie(net, - buf, - len); - break; - case 0x4: /* ASSOC_RESP */ - ret = - rtw_cfg80211_set_assoc_resp_wpsp2pie(net, - buf, - len); - break; - } - } - } - - return ret; - -} - static struct cfg80211_ops rtw_cfg80211_ops = { .change_virtual_intf = cfg80211_rtw_change_iface, .add_key = cfg80211_rtw_add_key, @@ -4280,11 +3214,6 @@ static struct cfg80211_ops rtw_cfg80211_ops = { .change_bss = cfg80211_rtw_change_bss, #endif /* CONFIG_8723AU_AP_MODE */ -#ifdef CONFIG_8723AU_P2P - .remain_on_channel = cfg80211_rtw_remain_on_channel, - .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel, -#endif - .mgmt_tx = cfg80211_rtw_mgmt_tx, .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register, }; @@ -4348,7 +3277,7 @@ void rtw_cfg80211_init_wiphy(struct rtw_adapter *padapter) struct wireless_dev *pwdev = padapter->rtw_wdev; struct wiphy *wiphy = pwdev->wiphy; - rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type)); + rf_type = rtl8723a_get_rf_type(padapter); DBG_8723A("%s:rf_type =%d\n", __func__, rf_type); @@ -4388,9 +3317,6 @@ static void rtw_cfg80211_preinit_wiphy(struct rtw_adapter *padapter, #ifdef CONFIG_8723AU_AP_MODE BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR) | #endif -#if defined(CONFIG_8723AU_P2P) - BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) | -#endif 0; #ifdef CONFIG_8723AU_AP_MODE @@ -4440,22 +3366,24 @@ int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev) ret = -ENOMEM; goto exit; } + + /* wdev */ + wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); + if (!wdev) { + DBG_8723A("Couldn't allocate wireless device\n"); + ret = -ENOMEM; + goto free_wiphy; + } + set_wiphy_dev(wiphy, dev); rtw_cfg80211_preinit_wiphy(padapter, wiphy); ret = wiphy_register(wiphy); if (ret < 0) { DBG_8723A("Couldn't register wiphy device\n"); - goto free_wiphy; + goto free_wdev; } - /* wdev */ - wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL); - if (!wdev) { - DBG_8723A("Couldn't allocate wireless device\n"); - ret = -ENOMEM; - goto unregister_wiphy; - } wdev->wiphy = wiphy; wdev->netdev = pnetdev; /* wdev->iftype = NL80211_IFTYPE_STATION; */ @@ -4474,8 +3402,6 @@ int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev) spin_lock_init(&pwdev_priv->scan_req_lock); pwdev_priv->p2p_enabled = false; - pwdev_priv->provdisc_req_issued = false; - rtw_wdev_invit_info_init(&pwdev_priv->invit_info); if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE) pwdev_priv->power_mgmt = true; @@ -4483,8 +3409,8 @@ int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev) pwdev_priv->power_mgmt = false; return ret; -unregister_wiphy: - wiphy_unregister(wiphy); +free_wdev: + kfree(wdev); free_wiphy: wiphy_free(wiphy); exit: @@ -4493,15 +3419,11 @@ exit: void rtw_wdev_free(struct wireless_dev *wdev) { - struct rtw_wdev_priv *pwdev_priv; - DBG_8723A("%s(wdev =%p)\n", __func__, wdev); if (!wdev) return; - pwdev_priv = wdev_to_priv(wdev); - kfree(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]); kfree(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]); |