1 /******************************************************************************
3 * Copyright(c) 2007 - 2012 Realtek Corporation. All rights reserved.
5 * This program is free software; you can redistribute it and/or modify it
6 * under the terms of version 2 of the GNU General Public License as
7 * published by the Free Software Foundation.
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
14 ******************************************************************************/
15 #define _IOCTL_CFG80211_C_
17 #include <osdep_service.h>
18 #include <drv_types.h>
19 #include <rtw_ioctl_set.h>
20 #include <xmit_osdep.h>
22 #include "ioctl_cfg80211.h"
23 #include <linux/version.h>
25 #define RTW_MAX_MGMT_TX_CNT 8
27 #define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 /* ms */
28 #define RTW_MAX_NUM_PMKIDS 4
30 #define RTW_CH_MAX_2G_CHANNEL 14 /* Max channel in 2G band */
32 static const u32 rtw_cipher_suites[] = {
33 WLAN_CIPHER_SUITE_WEP40,
34 WLAN_CIPHER_SUITE_WEP104,
35 WLAN_CIPHER_SUITE_TKIP,
36 WLAN_CIPHER_SUITE_CCMP,
39 #define RATETAB_ENT(_rate, _rateid, _flags) { \
41 .hw_value = (_rateid), \
45 #define CHAN2G(_channel, _freq, _flags) { \
46 .band = IEEE80211_BAND_2GHZ, \
47 .center_freq = (_freq), \
48 .hw_value = (_channel), \
50 .max_antenna_gain = 0, \
54 #define CHAN5G(_channel, _flags) { \
55 .band = IEEE80211_BAND_5GHZ, \
56 .center_freq = 5000 + (5 * (_channel)), \
57 .hw_value = (_channel), \
59 .max_antenna_gain = 0, \
63 static struct ieee80211_rate rtw_rates[] = {
64 RATETAB_ENT(10, 0x1, 0),
65 RATETAB_ENT(20, 0x2, 0),
66 RATETAB_ENT(55, 0x4, 0),
67 RATETAB_ENT(110, 0x8, 0),
68 RATETAB_ENT(60, 0x10, 0),
69 RATETAB_ENT(90, 0x20, 0),
70 RATETAB_ENT(120, 0x40, 0),
71 RATETAB_ENT(180, 0x80, 0),
72 RATETAB_ENT(240, 0x100, 0),
73 RATETAB_ENT(360, 0x200, 0),
74 RATETAB_ENT(480, 0x400, 0),
75 RATETAB_ENT(540, 0x800, 0),
78 #define rtw_a_rates (rtw_rates + 4)
79 #define RTW_A_RATES_NUM 8
80 #define rtw_g_rates (rtw_rates + 0)
81 #define RTW_G_RATES_NUM 12
83 #define RTW_2G_CHANNELS_NUM 14
84 #define RTW_5G_CHANNELS_NUM 37
86 static struct ieee80211_channel rtw_2ghz_channels[] = {
103 static struct ieee80211_channel rtw_5ghz_a_channels[] = {
104 CHAN5G(34, 0), CHAN5G(36, 0),
105 CHAN5G(38, 0), CHAN5G(40, 0),
106 CHAN5G(42, 0), CHAN5G(44, 0),
107 CHAN5G(46, 0), CHAN5G(48, 0),
108 CHAN5G(52, 0), CHAN5G(56, 0),
109 CHAN5G(60, 0), CHAN5G(64, 0),
110 CHAN5G(100, 0), CHAN5G(104, 0),
111 CHAN5G(108, 0), CHAN5G(112, 0),
112 CHAN5G(116, 0), CHAN5G(120, 0),
113 CHAN5G(124, 0), CHAN5G(128, 0),
114 CHAN5G(132, 0), CHAN5G(136, 0),
115 CHAN5G(140, 0), CHAN5G(149, 0),
116 CHAN5G(153, 0), CHAN5G(157, 0),
117 CHAN5G(161, 0), CHAN5G(165, 0),
118 CHAN5G(184, 0), CHAN5G(188, 0),
119 CHAN5G(192, 0), CHAN5G(196, 0),
120 CHAN5G(200, 0), CHAN5G(204, 0),
121 CHAN5G(208, 0), CHAN5G(212, 0),
125 static void rtw_2g_channels_init(struct ieee80211_channel *channels)
127 memcpy((void *)channels, (void *)rtw_2ghz_channels,
128 sizeof(struct ieee80211_channel) * RTW_2G_CHANNELS_NUM);
131 static void rtw_5g_channels_init(struct ieee80211_channel *channels)
133 memcpy((void *)channels, (void *)rtw_5ghz_a_channels,
134 sizeof(struct ieee80211_channel) * RTW_5G_CHANNELS_NUM);
137 static void rtw_2g_rates_init(struct ieee80211_rate *rates)
139 memcpy(rates, rtw_g_rates,
140 sizeof(struct ieee80211_rate) * RTW_G_RATES_NUM);
143 static void rtw_5g_rates_init(struct ieee80211_rate *rates)
145 memcpy(rates, rtw_a_rates,
146 sizeof(struct ieee80211_rate) * RTW_A_RATES_NUM);
149 static struct ieee80211_supported_band *
150 rtw_spt_band_alloc(enum ieee80211_band band)
152 struct ieee80211_supported_band *spt_band = NULL;
153 int n_channels, n_bitrates;
155 if (band == IEEE80211_BAND_2GHZ) {
156 n_channels = RTW_2G_CHANNELS_NUM;
157 n_bitrates = RTW_G_RATES_NUM;
158 } else if (band == IEEE80211_BAND_5GHZ) {
159 n_channels = RTW_5G_CHANNELS_NUM;
160 n_bitrates = RTW_A_RATES_NUM;
164 spt_band = kzalloc(sizeof(struct ieee80211_supported_band) +
165 sizeof(struct ieee80211_channel) * n_channels +
166 sizeof(struct ieee80211_rate) * n_bitrates,
172 (struct ieee80211_channel *)(((u8 *) spt_band) +
174 ieee80211_supported_band));
176 (struct ieee80211_rate *)(((u8 *) spt_band->channels) +
177 sizeof(struct ieee80211_channel) *
179 spt_band->band = band;
180 spt_band->n_channels = n_channels;
181 spt_band->n_bitrates = n_bitrates;
183 if (band == IEEE80211_BAND_2GHZ) {
184 rtw_2g_channels_init(spt_band->channels);
185 rtw_2g_rates_init(spt_band->bitrates);
186 } else if (band == IEEE80211_BAND_5GHZ) {
187 rtw_5g_channels_init(spt_band->channels);
188 rtw_5g_rates_init(spt_band->bitrates);
191 /* spt_band.ht_cap */
197 static const struct ieee80211_txrx_stypes
198 rtw_cfg80211_default_mgmt_stypes[NUM_NL80211_IFTYPES] = {
199 [NL80211_IFTYPE_ADHOC] = {
201 .rx = BIT(IEEE80211_STYPE_ACTION >> 4)
203 [NL80211_IFTYPE_STATION] = {
205 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
206 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
208 [NL80211_IFTYPE_AP] = {
210 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
211 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
212 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
213 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
214 BIT(IEEE80211_STYPE_AUTH >> 4) |
215 BIT(IEEE80211_STYPE_DEAUTH >> 4) |
216 BIT(IEEE80211_STYPE_ACTION >> 4)
218 [NL80211_IFTYPE_AP_VLAN] = {
221 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
222 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
223 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
224 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
225 BIT(IEEE80211_STYPE_AUTH >> 4) |
226 BIT(IEEE80211_STYPE_DEAUTH >> 4) |
227 BIT(IEEE80211_STYPE_ACTION >> 4)
229 [NL80211_IFTYPE_P2P_CLIENT] = {
231 .rx = BIT(IEEE80211_STYPE_ACTION >> 4) |
232 BIT(IEEE80211_STYPE_PROBE_REQ >> 4)
234 [NL80211_IFTYPE_P2P_GO] = {
236 .rx = BIT(IEEE80211_STYPE_ASSOC_REQ >> 4) |
237 BIT(IEEE80211_STYPE_REASSOC_REQ >> 4) |
238 BIT(IEEE80211_STYPE_PROBE_REQ >> 4) |
239 BIT(IEEE80211_STYPE_DISASSOC >> 4) |
240 BIT(IEEE80211_STYPE_AUTH >> 4) |
241 BIT(IEEE80211_STYPE_DEAUTH >> 4) |
242 BIT(IEEE80211_STYPE_ACTION >> 4)
246 #define MAX_BSSINFO_LEN 1000
247 static int rtw_cfg80211_inform_bss(struct rtw_adapter *padapter,
248 struct wlan_network *pnetwork)
251 struct ieee80211_channel *notify_channel;
252 struct cfg80211_bss *bss;
253 /* struct ieee80211_supported_band *band; */
256 u64 notify_timestamp;
257 u16 notify_capability;
262 u8 buf[MAX_BSSINFO_LEN], *pbuf;
263 size_t len, bssinf_len = 0;
264 struct ieee80211_hdr *pwlanhdr;
265 unsigned short *fctrl;
266 u8 bc_addr[] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
268 struct wireless_dev *wdev = padapter->rtw_wdev;
269 struct wiphy *wiphy = wdev->wiphy;
270 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
272 /* DBG_8723A("%s\n", __func__); */
275 pnetwork->network.IELength + sizeof(struct ieee80211_hdr_3addr);
276 if (bssinf_len > MAX_BSSINFO_LEN) {
277 DBG_8723A("%s IE Length too long > %d byte\n", __func__,
282 channel = pnetwork->network.Configuration.DSConfig;
283 if (channel <= RTW_CH_MAX_2G_CHANNEL)
284 freq = ieee80211_channel_to_frequency(channel,
285 IEEE80211_BAND_2GHZ);
287 freq = ieee80211_channel_to_frequency(channel,
288 IEEE80211_BAND_5GHZ);
290 notify_channel = ieee80211_get_channel(wiphy, freq);
292 /* rtw_get_timestampe_from_ie23a() */
293 notify_timestamp = jiffies_to_msecs(jiffies) * 1000; /* uSec */
297 rtw_get_beacon_interval23a_from_ie(pnetwork->network.IEs));
300 rtw_get_capability23a_from_ie(pnetwork->network.IEs));
302 notify_ie = pnetwork->network.IEs + _FIXED_IE_LENGTH_;
303 notify_ielen = pnetwork->network.IELength - _FIXED_IE_LENGTH_;
305 /* We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM:
306 * signal strength in mBm (100*dBm)
308 if (check_fwstate(pmlmepriv, _FW_LINKED) &&
309 is_same_network23a(&pmlmepriv->cur_network.network,
310 &pnetwork->network)) {
311 notify_signal = 100 * translate_percentage_to_dbm(padapter->recvpriv.signal_strength); /* dbm */
313 notify_signal = 100 * translate_percentage_to_dbm(pnetwork->network.PhyInfo.SignalStrength); /* dbm */
317 pwlanhdr = (struct ieee80211_hdr *)pbuf;
318 fctrl = &pwlanhdr->frame_control;
321 SetSeqNum(pwlanhdr, 0);
323 if (pnetwork->network.reserved == 1) { /* WIFI_BEACON */
324 memcpy(pwlanhdr->addr1, bc_addr, ETH_ALEN);
325 SetFrameSubType(pbuf, WIFI_BEACON);
327 memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN);
328 SetFrameSubType(pbuf, WIFI_PROBERSP);
331 memcpy(pwlanhdr->addr2, pnetwork->network.MacAddress, ETH_ALEN);
332 memcpy(pwlanhdr->addr3, pnetwork->network.MacAddress, ETH_ALEN);
334 pbuf += sizeof(struct ieee80211_hdr_3addr);
335 len = sizeof(struct ieee80211_hdr_3addr);
337 memcpy(pbuf, pnetwork->network.IEs, pnetwork->network.IELength);
338 len += pnetwork->network.IELength;
340 bss = cfg80211_inform_bss_frame(wiphy, notify_channel,
341 (struct ieee80211_mgmt *)buf, len,
342 notify_signal, GFP_ATOMIC);
344 if (unlikely(!bss)) {
345 DBG_8723A("rtw_cfg80211_inform_bss error\n");
349 cfg80211_put_bss(wiphy, bss);
355 void rtw_cfg80211_indicate_connect(struct rtw_adapter *padapter)
357 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
358 struct wlan_network *cur_network = &pmlmepriv->cur_network;
359 struct wireless_dev *pwdev = padapter->rtw_wdev;
360 #ifdef CONFIG_8723AU_P2P
361 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
364 DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
366 if (pwdev->iftype != NL80211_IFTYPE_STATION &&
367 pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
370 if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
373 #ifdef CONFIG_8723AU_P2P
374 if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
375 rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
376 rtw_p2p_set_role(pwdinfo, P2P_ROLE_CLIENT);
377 rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
378 DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n",
379 __func__, rtw_p2p_role(pwdinfo),
380 rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
382 #endif /* CONFIG_8723AU_P2P */
384 if (rtw_to_roaming(padapter) > 0) {
385 struct wiphy *wiphy = pwdev->wiphy;
386 struct ieee80211_channel *notify_channel;
388 u16 channel = cur_network->network.Configuration.DSConfig;
390 if (channel <= RTW_CH_MAX_2G_CHANNEL)
392 ieee80211_channel_to_frequency(channel,
393 IEEE80211_BAND_2GHZ);
396 ieee80211_channel_to_frequency(channel,
397 IEEE80211_BAND_5GHZ);
399 notify_channel = ieee80211_get_channel(wiphy, freq);
401 DBG_8723A("%s call cfg80211_roamed\n", __func__);
402 cfg80211_roamed(padapter->pnetdev, notify_channel,
403 cur_network->network.MacAddress,
404 pmlmepriv->assoc_req +
405 sizeof(struct ieee80211_hdr_3addr) + 2,
406 pmlmepriv->assoc_req_len -
407 sizeof(struct ieee80211_hdr_3addr) - 2,
408 pmlmepriv->assoc_rsp +
409 sizeof(struct ieee80211_hdr_3addr) + 6,
410 pmlmepriv->assoc_rsp_len -
411 sizeof(struct ieee80211_hdr_3addr) - 6,
414 cfg80211_connect_result(padapter->pnetdev,
415 cur_network->network.MacAddress,
416 pmlmepriv->assoc_req +
417 sizeof(struct ieee80211_hdr_3addr) + 2,
418 pmlmepriv->assoc_req_len -
419 sizeof(struct ieee80211_hdr_3addr) - 2,
420 pmlmepriv->assoc_rsp +
421 sizeof(struct ieee80211_hdr_3addr) + 6,
422 pmlmepriv->assoc_rsp_len -
423 sizeof(struct ieee80211_hdr_3addr) - 6,
424 WLAN_STATUS_SUCCESS, GFP_ATOMIC);
428 void rtw_cfg80211_indicate_disconnect(struct rtw_adapter *padapter)
430 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
431 struct wireless_dev *pwdev = padapter->rtw_wdev;
432 #ifdef CONFIG_8723AU_P2P
433 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
436 DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
438 if (pwdev->iftype != NL80211_IFTYPE_STATION &&
439 pwdev->iftype != NL80211_IFTYPE_P2P_CLIENT)
442 if (check_fwstate(pmlmepriv, WIFI_AP_STATE))
445 #ifdef CONFIG_8723AU_P2P
446 if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
447 del_timer_sync(&pwdinfo->find_phase_timer);
448 del_timer_sync(&pwdinfo->restore_p2p_state_timer);
449 del_timer_sync(&pwdinfo->pre_tx_scan_timer);
451 rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
452 rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
454 DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state =%d\n",
455 __func__, rtw_p2p_role(pwdinfo),
456 rtw_p2p_state(pwdinfo), rtw_p2p_pre_state(pwdinfo));
458 #endif /* CONFIG_8723AU_P2P */
460 if (!padapter->mlmepriv.not_indic_disco) {
461 if (check_fwstate(&padapter->mlmepriv, WIFI_UNDER_LINKING)) {
462 cfg80211_connect_result(padapter->pnetdev, NULL, NULL,
464 WLAN_STATUS_UNSPECIFIED_FAILURE,
467 cfg80211_disconnected(padapter->pnetdev, 0, NULL,
473 #ifdef CONFIG_8723AU_AP_MODE
474 static u8 set_pairwise_key(struct rtw_adapter *padapter, struct sta_info *psta)
476 struct cmd_obj *ph2c;
477 struct set_stakey_parm *psetstakey_para;
478 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
481 ph2c = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
487 psetstakey_para = kzalloc(sizeof(struct set_stakey_parm), GFP_KERNEL);
488 if (psetstakey_para == NULL) {
494 init_h2fwcmd_w_parm_no_rsp(ph2c, psetstakey_para, _SetStaKey_CMD_);
496 psetstakey_para->algorithm = (u8) psta->dot118021XPrivacy;
498 memcpy(psetstakey_para->addr, psta->hwaddr, ETH_ALEN);
500 memcpy(psetstakey_para->key, &psta->dot118021x_UncstKey, 16);
502 res = rtw_enqueue_cmd23a(pcmdpriv, ph2c);
508 static int set_group_key(struct rtw_adapter *padapter, u8 *key, u8 alg,
512 struct cmd_obj *pcmd;
513 struct setkey_parm *psetkeyparm;
514 struct cmd_priv *pcmdpriv = &padapter->cmdpriv;
517 DBG_8723A("%s\n", __func__);
519 pcmd = kzalloc(sizeof(struct cmd_obj), GFP_KERNEL);
524 psetkeyparm = kzalloc(sizeof(struct setkey_parm), GFP_KERNEL);
531 psetkeyparm->keyid = (u8) keyid;
533 padapter->mlmepriv.key_mask |= CHKBIT(psetkeyparm->keyid);
535 psetkeyparm->algorithm = alg;
537 psetkeyparm->set_tx = 1;
553 memcpy(&psetkeyparm->key[0], key, keylen);
555 pcmd->cmdcode = _SetKey_CMD_;
556 pcmd->parmbuf = (u8 *) psetkeyparm;
557 pcmd->cmdsz = (sizeof(struct setkey_parm));
561 INIT_LIST_HEAD(&pcmd->list);
563 res = rtw_enqueue_cmd23a(pcmdpriv, pcmd);
569 static int set_wep_key(struct rtw_adapter *padapter, u8 *key, u8 keylen,
585 return set_group_key(padapter, key, alg, keyid);
588 static int rtw_cfg80211_ap_set_encryption(struct net_device *dev,
589 struct ieee_param *param,
593 u32 wep_key_idx, wep_key_len;
594 struct sta_info *psta = NULL, *pbcmc_sta = NULL;
595 struct rtw_adapter *padapter = netdev_priv(dev);
596 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
597 struct security_priv *psecuritypriv = &padapter->securitypriv;
598 struct sta_priv *pstapriv = &padapter->stapriv;
600 DBG_8723A("%s\n", __func__);
602 param->u.crypt.err = 0;
603 param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
605 /* sizeof(struct ieee_param) = 64 bytes; */
606 /* if (param_len != (u32) ((u8 *) param->u.crypt.key -
607 (u8 *) param) + param->u.crypt.key_len) */
608 if (param_len != sizeof(struct ieee_param) + param->u.crypt.key_len) {
613 if (is_broadcast_ether_addr(param->sta_addr)) {
614 if (param->u.crypt.idx >= WEP_KEYS) {
619 psta = rtw_get_stainfo23a(pstapriv, param->sta_addr);
622 DBG_8723A("rtw_set_encryption(), sta has already "
623 "been removed or never been added\n");
628 if (strcmp(param->u.crypt.alg, "none") == 0 && (psta == NULL)) {
629 /* todo:clear default encryption keys */
631 DBG_8723A("clear default encryption keys, keyid =%d\n",
637 if (strcmp(param->u.crypt.alg, "WEP") == 0 && (psta == NULL)) {
638 DBG_8723A("r871x_set_encryption, crypt.alg = WEP\n");
640 wep_key_idx = param->u.crypt.idx;
641 wep_key_len = param->u.crypt.key_len;
643 DBG_8723A("r871x_set_encryption, wep_key_idx =%d, len =%d\n",
644 wep_key_idx, wep_key_len);
646 if ((wep_key_idx >= WEP_KEYS) || (wep_key_len <= 0)) {
651 if (wep_key_len > 0) {
652 wep_key_len = wep_key_len <= 5 ? 5 : 13;
655 if (psecuritypriv->bWepDefaultKeyIdxSet == 0) {
656 /* wep default key has not been set, so use
657 this key index as default key. */
659 psecuritypriv->ndisencryptstatus =
660 Ndis802_11Encryption1Enabled;
661 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
662 psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
664 if (wep_key_len == 13) {
665 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
666 psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
669 psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
672 memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0],
673 param->u.crypt.key, wep_key_len);
675 psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
677 set_wep_key(padapter, param->u.crypt.key, wep_key_len,
684 if (!psta && check_fwstate(pmlmepriv, WIFI_AP_STATE)) { /* group key */
685 if (param->u.crypt.set_tx == 0) { /* group key */
686 if (strcmp(param->u.crypt.alg, "WEP") == 0) {
687 DBG_8723A("%s, set group_key, WEP\n",
690 memcpy(psecuritypriv->
691 dot118021XGrpKey[param->u.crypt.idx].
692 skey, param->u.crypt.key,
693 (param->u.crypt.key_len >
694 16 ? 16 : param->u.crypt.key_len));
696 psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
697 if (param->u.crypt.key_len == 13) {
698 psecuritypriv->dot118021XGrpPrivacy =
702 } else if (strcmp(param->u.crypt.alg, "TKIP") == 0) {
703 DBG_8723A("%s, set group_key, TKIP\n",
706 psecuritypriv->dot118021XGrpPrivacy = _TKIP_;
708 memcpy(psecuritypriv->
709 dot118021XGrpKey[param->u.crypt.idx].
710 skey, param->u.crypt.key,
711 (param->u.crypt.key_len >
712 16 ? 16 : param->u.crypt.key_len));
714 /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
716 memcpy(psecuritypriv->
717 dot118021XGrptxmickey[param->u.crypt.
719 ¶m->u.crypt.key[16], 8);
720 memcpy(psecuritypriv->
721 dot118021XGrprxmickey[param->u.crypt.
723 ¶m->u.crypt.key[24], 8);
725 psecuritypriv->busetkipkey = true;
727 } else if (strcmp(param->u.crypt.alg, "CCMP") == 0) {
728 DBG_8723A("%s, set group_key, CCMP\n",
731 psecuritypriv->dot118021XGrpPrivacy = _AES_;
733 memcpy(psecuritypriv->
734 dot118021XGrpKey[param->u.crypt.idx].
735 skey, param->u.crypt.key,
736 (param->u.crypt.key_len >
737 16 ? 16 : param->u.crypt.key_len));
739 DBG_8723A("%s, set group_key, none\n",
742 psecuritypriv->dot118021XGrpPrivacy =
746 psecuritypriv->dot118021XGrpKeyid = param->u.crypt.idx;
748 psecuritypriv->binstallGrpkey = true;
750 psecuritypriv->dot11PrivacyAlgrthm =
751 psecuritypriv->dot118021XGrpPrivacy;
753 set_group_key(padapter, param->u.crypt.key,
754 psecuritypriv->dot118021XGrpPrivacy,
757 pbcmc_sta = rtw_get_bcmc_stainfo23a(padapter);
759 pbcmc_sta->ieee8021x_blocked = false;
760 /* rx will use bmc_sta's dot118021XPrivacy */
761 pbcmc_sta->dot118021XPrivacy =
762 psecuritypriv->dot118021XGrpPrivacy;
771 if (psecuritypriv->dot11AuthAlgrthm ==
772 dot11AuthAlgrthm_8021X && psta) { /* psk/802_1x */
773 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
774 if (param->u.crypt.set_tx == 1) {
776 memcpy(psta->dot118021x_UncstKey.skey,
778 (param->u.crypt.key_len >
779 16 ? 16 : param->u.crypt.key_len));
781 if (!strcmp(param->u.crypt.alg, "WEP")) {
782 DBG_8723A("%s, set pairwise key, WEP\n",
785 psta->dot118021XPrivacy = _WEP40_;
786 if (param->u.crypt.key_len == 13) {
787 psta->dot118021XPrivacy =
790 } else if (!strcmp(param->u.crypt.alg, "TKIP")) {
791 DBG_8723A("%s, set pairwise key, "
794 psta->dot118021XPrivacy = _TKIP_;
796 /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
798 memcpy(psta->dot11tkiptxmickey.skey,
799 ¶m->u.crypt.key[16], 8);
800 memcpy(psta->dot11tkiprxmickey.skey,
801 ¶m->u.crypt.key[24], 8);
803 psecuritypriv->busetkipkey = true;
805 } else if (!strcmp(param->u.crypt.alg, "CCMP")) {
807 DBG_8723A("%s, set pairwise key, "
810 psta->dot118021XPrivacy = _AES_;
812 DBG_8723A("%s, set pairwise key, "
815 psta->dot118021XPrivacy = _NO_PRIVACY_;
818 set_pairwise_key(padapter, psta);
820 psta->ieee8021x_blocked = false;
822 psta->bpairwise_key_installed = true;
823 } else { /* group key??? */
824 if (!strcmp(param->u.crypt.alg, "WEP")) {
825 memcpy(psecuritypriv->
826 dot118021XGrpKey[param->u.crypt.
829 (param->u.crypt.key_len >
830 16 ? 16 : param->u.crypt.
833 psecuritypriv->dot118021XGrpPrivacy =
835 if (param->u.crypt.key_len == 13) {
837 dot118021XGrpPrivacy =
840 } else if (!strcmp(param->u.crypt.alg, "TKIP")) {
841 psecuritypriv->dot118021XGrpPrivacy =
844 memcpy(psecuritypriv->
845 dot118021XGrpKey[param->u.crypt.
848 (param->u.crypt.key_len >
849 16 ? 16 : param->u.crypt.
852 /* DEBUG_ERR("set key length :param->u"
853 ".crypt.key_len =%d\n",
854 param->u.crypt.key_len); */
856 memcpy(psecuritypriv->
857 dot118021XGrptxmickey[param->u.
859 skey, ¶m->u.crypt.key[16],
861 memcpy(psecuritypriv->
862 dot118021XGrprxmickey[param->u.
864 skey, ¶m->u.crypt.key[24],
867 psecuritypriv->busetkipkey = true;
869 } else if (!strcmp(param->u.crypt.alg, "CCMP")) {
870 psecuritypriv->dot118021XGrpPrivacy =
873 memcpy(psecuritypriv->
874 dot118021XGrpKey[param->u.crypt.
877 (param->u.crypt.key_len >
878 16 ? 16 : param->u.crypt.
881 psecuritypriv->dot118021XGrpPrivacy =
885 psecuritypriv->dot118021XGrpKeyid =
888 psecuritypriv->binstallGrpkey = true;
890 psecuritypriv->dot11PrivacyAlgrthm =
891 psecuritypriv->dot118021XGrpPrivacy;
893 set_group_key(padapter, param->u.crypt.key,
895 dot118021XGrpPrivacy,
898 pbcmc_sta = rtw_get_bcmc_stainfo23a(padapter);
900 /* rx will use bmc_sta's
902 pbcmc_sta->ieee8021x_blocked = false;
903 pbcmc_sta->dot118021XPrivacy = psecuritypriv->dot118021XGrpPrivacy;
916 static int rtw_cfg80211_set_encryption(struct net_device *dev,
917 struct ieee_param *param, u32 param_len)
920 u32 wep_key_idx, wep_key_len;
921 struct rtw_adapter *padapter = netdev_priv(dev);
922 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
923 struct security_priv *psecuritypriv = &padapter->securitypriv;
924 #ifdef CONFIG_8723AU_P2P
925 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
926 #endif /* CONFIG_8723AU_P2P */
930 DBG_8723A("%s\n", __func__);
932 param->u.crypt.err = 0;
933 param->u.crypt.alg[IEEE_CRYPT_ALG_NAME_LEN - 1] = '\0';
936 (u32) ((u8 *) param->u.crypt.key - (u8 *) param) +
937 param->u.crypt.key_len) {
942 if (is_broadcast_ether_addr(param->sta_addr)) {
943 if (param->u.crypt.idx >= WEP_KEYS) {
952 if (strcmp(param->u.crypt.alg, "WEP") == 0) {
953 RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_,
954 ("wpa_set_encryption, crypt.alg = WEP\n"));
955 DBG_8723A("wpa_set_encryption, crypt.alg = WEP\n");
957 wep_key_idx = param->u.crypt.idx;
958 wep_key_len = param->u.crypt.key_len;
960 if ((wep_key_idx > WEP_KEYS) || (wep_key_len <= 0)) {
965 if (psecuritypriv->bWepDefaultKeyIdxSet == 0) {
966 /* wep default key has not been set, so use this
967 key index as default key. */
969 wep_key_len = wep_key_len <= 5 ? 5 : 13;
971 psecuritypriv->ndisencryptstatus =
972 Ndis802_11Encryption1Enabled;
973 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
974 psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
976 if (wep_key_len == 13) {
977 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
978 psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
981 psecuritypriv->dot11PrivacyKeyIndex = wep_key_idx;
984 memcpy(&psecuritypriv->dot11DefKey[wep_key_idx].skey[0],
985 param->u.crypt.key, wep_key_len);
987 psecuritypriv->dot11DefKeylen[wep_key_idx] = wep_key_len;
989 rtw_set_key23a(padapter, psecuritypriv, wep_key_idx, 0);
994 if (padapter->securitypriv.dot11AuthAlgrthm ==
995 dot11AuthAlgrthm_8021X) { /* 802_1x */
996 struct sta_info *psta, *pbcmc_sta;
997 struct sta_priv *pstapriv = &padapter->stapriv;
999 if (check_fwstate(pmlmepriv,
1000 WIFI_STATION_STATE | WIFI_MP_STATE)) {
1002 psta = rtw_get_stainfo23a(pstapriv, get_bssid(pmlmepriv));
1004 DBG_8723A("%s, : Obtain Sta_info fail\n",
1007 /* Jeff: don't disable ieee8021x_blocked
1008 while clearing key */
1009 if (strcmp(param->u.crypt.alg, "none") != 0)
1010 psta->ieee8021x_blocked = false;
1012 if ((padapter->securitypriv.ndisencryptstatus ==
1013 Ndis802_11Encryption2Enabled) ||
1014 (padapter->securitypriv.ndisencryptstatus ==
1015 Ndis802_11Encryption3Enabled)) {
1016 psta->dot118021XPrivacy =
1017 padapter->securitypriv.
1018 dot11PrivacyAlgrthm;
1021 if (param->u.crypt.set_tx == 1) {
1023 DBG_8723A("%s, : param->u.crypt.set_tx"
1024 " == 1\n", __func__);
1026 memcpy(psta->dot118021x_UncstKey.skey,
1028 (param->u.crypt.key_len >
1029 16 ? 16 : param->u.crypt.
1032 if (strcmp(param->u.crypt.alg,
1034 memcpy(psta->dot11tkiptxmickey.
1036 ¶m->u.crypt.key[16],
1038 memcpy(psta->dot11tkiprxmickey.
1040 ¶m->u.crypt.key[24],
1043 padapter->securitypriv.
1044 busetkipkey = false;
1046 DBG_8723A(" ~~~~set sta key:unicastkey\n");
1048 rtw_setstakey_cmd23a(padapter,
1049 (unsigned char *)psta,
1051 } else { /* group key */
1052 memcpy(padapter->securitypriv.
1053 dot118021XGrpKey[param->u.crypt.
1056 (param->u.crypt.key_len >
1057 16 ? 16 : param->u.crypt.
1059 memcpy(padapter->securitypriv.
1060 dot118021XGrptxmickey[param->u.
1062 skey, ¶m->u.crypt.key[16],
1064 memcpy(padapter->securitypriv.
1065 dot118021XGrprxmickey[param->u.
1067 skey, ¶m->u.crypt.key[24],
1069 padapter->securitypriv.binstallGrpkey =
1071 /* DEBUG_ERR((" param->u.crypt.key_len"
1072 "=%d\n", param->u.crypt.key_len)); */
1074 (" ~~~~set sta key:groupkey\n");
1076 padapter->securitypriv.
1077 dot118021XGrpKeyid =
1080 rtw_set_key23a(padapter,
1081 &padapter->securitypriv,
1082 param->u.crypt.idx, 1);
1083 #ifdef CONFIG_8723AU_P2P
1084 if (rtw_p2p_chk_state
1086 P2P_STATE_PROVISIONING_ING)) {
1087 rtw_p2p_set_state(pwdinfo,
1088 P2P_STATE_PROVISIONING_DONE);
1090 #endif /* CONFIG_8723AU_P2P */
1095 pbcmc_sta = rtw_get_bcmc_stainfo23a(padapter);
1097 /* Jeff: don't disable ieee8021x_blocked
1098 while clearing key */
1099 if (strcmp(param->u.crypt.alg, "none") != 0)
1100 pbcmc_sta->ieee8021x_blocked = false;
1102 if ((padapter->securitypriv.ndisencryptstatus ==
1103 Ndis802_11Encryption2Enabled) ||
1104 (padapter->securitypriv.ndisencryptstatus ==
1105 Ndis802_11Encryption3Enabled)) {
1106 pbcmc_sta->dot118021XPrivacy =
1107 padapter->securitypriv.
1108 dot11PrivacyAlgrthm;
1111 } else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE)) { /* adhoc mode */
1117 DBG_8723A("%s, ret =%d\n", __func__, ret);
1124 static int cfg80211_rtw_add_key(struct wiphy *wiphy, struct net_device *ndev,
1125 u8 key_index, bool pairwise,
1126 const u8 *mac_addr, struct key_params *params)
1130 struct ieee_param *param = NULL;
1132 struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
1133 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
1134 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1136 DBG_8723A(FUNC_NDEV_FMT " adding key for %pM\n", FUNC_NDEV_ARG(ndev),
1138 DBG_8723A("cipher = 0x%x\n", params->cipher);
1139 DBG_8723A("key_len = 0x%x\n", params->key_len);
1140 DBG_8723A("seq_len = 0x%x\n", params->seq_len);
1141 DBG_8723A("key_index =%d\n", key_index);
1142 DBG_8723A("pairwise =%d\n", pairwise);
1144 param_len = sizeof(struct ieee_param) + params->key_len;
1145 param = kzalloc(param_len, GFP_KERNEL);
1149 param->cmd = IEEE_CMD_SET_ENCRYPTION;
1150 memset(param->sta_addr, 0xff, ETH_ALEN);
1152 switch (params->cipher) {
1153 case IW_AUTH_CIPHER_NONE:
1154 /* todo: remove key */
1158 case WLAN_CIPHER_SUITE_WEP40:
1159 case WLAN_CIPHER_SUITE_WEP104:
1162 case WLAN_CIPHER_SUITE_TKIP:
1165 case WLAN_CIPHER_SUITE_CCMP:
1174 strncpy((char *)param->u.crypt.alg, alg_name, IEEE_CRYPT_ALG_NAME_LEN);
1176 if (!mac_addr || is_broadcast_ether_addr(mac_addr)) {
1177 param->u.crypt.set_tx = 0; /* for wpa/wpa2 group key */
1179 param->u.crypt.set_tx = 1; /* for wpa/wpa2 pairwise key */
1182 /* param->u.crypt.idx = key_index - 1; */
1183 param->u.crypt.idx = key_index;
1185 if (params->seq_len && params->seq) {
1186 memcpy(param->u.crypt.seq, params->seq, params->seq_len);
1189 if (params->key_len && params->key) {
1190 param->u.crypt.key_len = params->key_len;
1191 memcpy(param->u.crypt.key, params->key, params->key_len);
1194 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
1195 ret = rtw_cfg80211_set_encryption(ndev, param, param_len);
1196 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
1197 #ifdef CONFIG_8723AU_AP_MODE
1199 memcpy(param->sta_addr, (void *)mac_addr, ETH_ALEN);
1201 ret = rtw_cfg80211_ap_set_encryption(ndev, param, param_len);
1204 DBG_8723A("error! fw_state = 0x%x, iftype =%d\n",
1205 pmlmepriv->fw_state, rtw_wdev->iftype);
1216 cfg80211_rtw_get_key(struct wiphy *wiphy, struct net_device *ndev,
1217 u8 key_index, bool pairwise, const u8 *mac_addr,
1219 void (*callback) (void *cookie, struct key_params *))
1221 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
1225 static int cfg80211_rtw_del_key(struct wiphy *wiphy, struct net_device *ndev,
1226 u8 key_index, bool pairwise,
1229 struct rtw_adapter *padapter = netdev_priv(ndev);
1230 struct security_priv *psecuritypriv = &padapter->securitypriv;
1232 DBG_8723A(FUNC_NDEV_FMT " key_index =%d\n", FUNC_NDEV_ARG(ndev),
1235 if (key_index == psecuritypriv->dot11PrivacyKeyIndex) {
1236 /* clear the flag of wep default key set. */
1237 psecuritypriv->bWepDefaultKeyIdxSet = 0;
1243 static int cfg80211_rtw_set_default_key(struct wiphy *wiphy,
1244 struct net_device *ndev, u8 key_index,
1245 bool unicast, bool multicast)
1247 struct rtw_adapter *padapter = netdev_priv(ndev);
1248 struct security_priv *psecuritypriv = &padapter->securitypriv;
1250 DBG_8723A(FUNC_NDEV_FMT " key_index =%d"
1251 ", unicast =%d, multicast =%d.\n", FUNC_NDEV_ARG(ndev),
1252 key_index, unicast, multicast);
1254 if ((key_index < WEP_KEYS) &&
1255 ((psecuritypriv->dot11PrivacyAlgrthm == _WEP40_) ||
1256 (psecuritypriv->dot11PrivacyAlgrthm == _WEP104_))) {
1257 /* set wep default key */
1258 psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
1260 psecuritypriv->dot11PrivacyKeyIndex = key_index;
1262 psecuritypriv->dot11PrivacyAlgrthm = _WEP40_;
1263 psecuritypriv->dot118021XGrpPrivacy = _WEP40_;
1264 if (psecuritypriv->dot11DefKeylen[key_index] == 13) {
1265 psecuritypriv->dot11PrivacyAlgrthm = _WEP104_;
1266 psecuritypriv->dot118021XGrpPrivacy = _WEP104_;
1269 /* set the flag to represent that wep default key
1271 psecuritypriv->bWepDefaultKeyIdxSet = 1;
1277 static int cfg80211_rtw_get_station(struct wiphy *wiphy,
1278 struct net_device *ndev,
1279 u8 *mac, struct station_info *sinfo)
1282 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
1283 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1284 struct sta_info *psta = NULL;
1285 struct sta_priv *pstapriv = &padapter->stapriv;
1290 DBG_8723A(FUNC_NDEV_FMT " mac ==%p\n", FUNC_NDEV_ARG(ndev), mac);
1295 psta = rtw_get_stainfo23a(pstapriv, mac);
1297 DBG_8723A("%s, sta_info is null\n", __func__);
1301 #ifdef CONFIG_DEBUG_CFG80211
1302 DBG_8723A(FUNC_NDEV_FMT " mac =" MAC_FMT "\n", FUNC_NDEV_ARG(ndev),
1306 /* for infra./P2PClient mode */
1307 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
1308 check_fwstate(pmlmepriv, _FW_LINKED)) {
1309 struct wlan_network *cur_network = &pmlmepriv->cur_network;
1311 if (memcmp(mac, cur_network->network.MacAddress, ETH_ALEN)) {
1312 DBG_8723A("%s, mismatch bssid =" MAC_FMT "\n", __func__,
1313 MAC_ARG(cur_network->network.MacAddress));
1318 sinfo->filled |= STATION_INFO_SIGNAL;
1319 sinfo->signal = translate_percentage_to_dbm(padapter->recvpriv.
1322 sinfo->filled |= STATION_INFO_TX_BITRATE;
1323 sinfo->txrate.legacy = rtw_get_cur_max_rate23a(padapter);
1325 sinfo->filled |= STATION_INFO_RX_PACKETS;
1326 sinfo->rx_packets = sta_rx_data_pkts(psta);
1328 sinfo->filled |= STATION_INFO_TX_PACKETS;
1329 sinfo->tx_packets = psta->sta_stats.tx_pkts;
1332 /* for Ad-Hoc/AP mode */
1333 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
1334 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) ||
1335 check_fwstate(pmlmepriv, WIFI_AP_STATE)) &&
1336 check_fwstate(pmlmepriv, _FW_LINKED)
1338 /* TODO: should acquire station info... */
1345 static int cfg80211_rtw_change_iface(struct wiphy *wiphy,
1346 struct net_device *ndev,
1347 enum nl80211_iftype type, u32 *flags,
1348 struct vif_params *params)
1350 enum nl80211_iftype old_type;
1351 enum ndis_802_11_net_infra networkType;
1352 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
1353 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
1354 struct wireless_dev *rtw_wdev = wiphy_to_wdev(wiphy);
1355 #ifdef CONFIG_8723AU_P2P
1356 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
1361 DBG_8723A(FUNC_NDEV_FMT " call netdev_open23a\n", FUNC_NDEV_ARG(ndev));
1362 if (netdev_open23a(ndev) != 0) {
1367 if (_FAIL == rtw_pwr_wakeup(padapter)) {
1372 old_type = rtw_wdev->iftype;
1373 DBG_8723A(FUNC_NDEV_FMT " old_iftype =%d, new_iftype =%d\n",
1374 FUNC_NDEV_ARG(ndev), old_type, type);
1376 if (old_type != type) {
1378 pmlmeext->action_public_rxseq = 0xffff;
1379 pmlmeext->action_public_dialog_token = 0xff;
1383 case NL80211_IFTYPE_ADHOC:
1384 networkType = Ndis802_11IBSS;
1386 case NL80211_IFTYPE_P2P_CLIENT:
1387 case NL80211_IFTYPE_STATION:
1388 networkType = Ndis802_11Infrastructure;
1389 #ifdef CONFIG_8723AU_P2P
1390 if (change && rtw_p2p_chk_role(pwdinfo, P2P_ROLE_GO)) {
1391 del_timer_sync(&pwdinfo->find_phase_timer);
1392 del_timer_sync(&pwdinfo->restore_p2p_state_timer);
1393 del_timer_sync(&pwdinfo->pre_tx_scan_timer);
1395 /* it means remove GO and change mode from AP(GO)
1396 to station(P2P DEVICE) */
1397 rtw_p2p_set_role(pwdinfo, P2P_ROLE_DEVICE);
1398 rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
1400 DBG_8723A("%s, role =%d, p2p_state =%d, pre_p2p_state ="
1401 "%d\n", __func__, rtw_p2p_role(pwdinfo),
1402 rtw_p2p_state(pwdinfo),
1403 rtw_p2p_pre_state(pwdinfo));
1405 #endif /* CONFIG_8723AU_P2P */
1407 case NL80211_IFTYPE_P2P_GO:
1408 case NL80211_IFTYPE_AP:
1409 networkType = Ndis802_11APMode;
1410 #ifdef CONFIG_8723AU_P2P
1411 if (change && !rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
1412 /* it means P2P Group created, we will be GO
1413 and change mode from P2P DEVICE to AP(GO) */
1414 rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
1416 #endif /* CONFIG_8723AU_P2P */
1422 rtw_wdev->iftype = type;
1424 if (rtw_set_802_11_infrastructure_mode23a(padapter, networkType) == false) {
1425 rtw_wdev->iftype = old_type;
1430 rtw_setopmode_cmd23a(padapter, networkType);
1436 void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv *pwdev_priv,
1439 spin_lock_bh(&pwdev_priv->scan_req_lock);
1440 if (pwdev_priv->scan_request != NULL) {
1441 #ifdef CONFIG_DEBUG_CFG80211
1442 DBG_8723A("%s with scan req\n", __func__);
1444 if (pwdev_priv->scan_request->wiphy !=
1445 pwdev_priv->rtw_wdev->wiphy)
1446 DBG_8723A("error wiphy compare\n");
1448 cfg80211_scan_done(pwdev_priv->scan_request, aborted);
1450 pwdev_priv->scan_request = NULL;
1452 #ifdef CONFIG_DEBUG_CFG80211
1453 DBG_8723A("%s without scan req\n", __func__);
1456 spin_unlock_bh(&pwdev_priv->scan_req_lock);
1459 void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter *padapter)
1461 struct list_head *plist, *phead, *ptmp;
1462 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1463 struct rtw_queue *queue = &pmlmepriv->scanned_queue;
1464 struct wlan_network *pnetwork;
1466 #ifdef CONFIG_DEBUG_CFG80211
1467 DBG_8723A("%s\n", __func__);
1470 spin_lock_bh(&pmlmepriv->scanned_queue.lock);
1472 phead = get_list_head(queue);
1474 list_for_each_safe(plist, ptmp, phead) {
1475 pnetwork = container_of(plist, struct wlan_network, list);
1477 /* report network only if the current channel set
1478 contains the channel to which this network belongs */
1479 if (rtw_ch_set_search_ch23a
1480 (padapter->mlmeextpriv.channel_set,
1481 pnetwork->network.Configuration.DSConfig) >= 0)
1482 rtw_cfg80211_inform_bss(padapter, pnetwork);
1485 spin_unlock_bh(&pmlmepriv->scanned_queue.lock);
1487 /* call this after other things have been done */
1488 rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter->rtw_wdev),
1492 static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter *padapter,
1498 #ifdef CONFIG_8723AU_P2P
1503 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1505 #ifdef CONFIG_DEBUG_CFG80211
1506 DBG_8723A("%s, ielen =%d\n", __func__, len);
1510 wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
1512 #ifdef CONFIG_DEBUG_CFG80211
1513 DBG_8723A("probe_req_wps_ielen =%d\n", wps_ielen);
1515 if (pmlmepriv->wps_probe_req_ie) {
1516 pmlmepriv->wps_probe_req_ie_len = 0;
1517 kfree(pmlmepriv->wps_probe_req_ie);
1518 pmlmepriv->wps_probe_req_ie = NULL;
1521 pmlmepriv->wps_probe_req_ie =
1522 kmalloc(wps_ielen, GFP_KERNEL);
1523 if (pmlmepriv->wps_probe_req_ie == NULL) {
1524 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
1525 __func__, __LINE__);
1528 memcpy(pmlmepriv->wps_probe_req_ie, wps_ie, wps_ielen);
1529 pmlmepriv->wps_probe_req_ie_len = wps_ielen;
1531 #ifdef CONFIG_8723AU_P2P
1532 p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
1534 #ifdef CONFIG_DEBUG_CFG80211
1535 DBG_8723A("probe_req_p2p_ielen =%d\n", p2p_ielen);
1538 if (pmlmepriv->p2p_probe_req_ie) {
1539 pmlmepriv->p2p_probe_req_ie_len = 0;
1540 kfree(pmlmepriv->p2p_probe_req_ie);
1541 pmlmepriv->p2p_probe_req_ie = NULL;
1544 pmlmepriv->p2p_probe_req_ie =
1545 kmalloc(p2p_ielen, GFP_KERNEL);
1546 if (pmlmepriv->p2p_probe_req_ie == NULL) {
1547 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
1548 __func__, __LINE__);
1552 memcpy(pmlmepriv->p2p_probe_req_ie, p2p_ie, p2p_ielen);
1553 pmlmepriv->p2p_probe_req_ie_len = p2p_ielen;
1555 #endif /* CONFIG_8723AU_P2P */
1557 /* buf += p2p_ielen; */
1558 /* len -= p2p_ielen; */
1560 #ifdef CONFIG_8723AU_P2P
1561 if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
1562 #ifdef CONFIG_DEBUG_CFG80211
1563 DBG_8723A("probe_req_wfd_ielen =%d\n", wfd_ielen);
1566 if (pmlmepriv->wfd_probe_req_ie) {
1567 pmlmepriv->wfd_probe_req_ie_len = 0;
1568 kfree(pmlmepriv->wfd_probe_req_ie);
1569 pmlmepriv->wfd_probe_req_ie = NULL;
1572 pmlmepriv->wfd_probe_req_ie =
1573 kmalloc(wfd_ielen, GFP_KERNEL);
1574 if (pmlmepriv->wfd_probe_req_ie == NULL) {
1575 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
1576 __func__, __LINE__);
1580 rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_req_ie,
1581 &pmlmepriv->wfd_probe_req_ie_len);
1583 #endif /* CONFIG_8723AU_P2P */
1590 static int cfg80211_rtw_scan(struct wiphy *wiphy,
1591 struct cfg80211_scan_request *request)
1596 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
1597 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1598 struct cfg80211_ssid ssid[RTW_SSID_SCAN_AMOUNT];
1599 struct rtw_ieee80211_channel ch[RTW_CHANNEL_SCAN_AMOUNT];
1600 struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
1601 struct cfg80211_ssid *ssids = request->ssids;
1602 #ifdef CONFIG_8723AU_P2P
1603 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
1604 int social_channel = 0;
1605 #endif /* CONFIG_8723AU_P2P */
1606 bool need_indicate_scan_done = false;
1608 #ifdef CONFIG_DEBUG_CFG80211
1609 DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
1612 spin_lock_bh(&pwdev_priv->scan_req_lock);
1613 pwdev_priv->scan_request = request;
1614 spin_unlock_bh(&pwdev_priv->scan_req_lock);
1616 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
1618 #ifdef CONFIG_DEBUG_CFG80211
1619 DBG_8723A("%s under WIFI_AP_STATE\n", __func__);
1621 /* need_indicate_scan_done = true; */
1622 /* goto check_need_indicate_scan_done; */
1625 if (rtw_pwr_wakeup(padapter) == _FAIL) {
1626 need_indicate_scan_done = true;
1627 goto check_need_indicate_scan_done;
1629 #ifdef CONFIG_8723AU_P2P
1630 if (!memcmp(ssids->ssid, "DIRECT-", 7) &&
1631 rtw_get_p2p_ie23a((u8 *) request->ie, request->ie_len, NULL, NULL)) {
1632 if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
1633 rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE);
1634 wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true;
1636 rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
1637 #ifdef CONFIG_DEBUG_CFG80211
1638 DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
1639 rtw_p2p_role(pwdinfo),
1640 rtw_p2p_state(pwdinfo));
1643 rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
1645 if (request->n_channels == 3 &&
1646 request->channels[0]->hw_value == 1 &&
1647 request->channels[1]->hw_value == 6 &&
1648 request->channels[2]->hw_value == 11)
1651 #endif /* CONFIG_8723AU_P2P */
1653 if (request->ie && request->ie_len > 0) {
1654 rtw_cfg80211_set_probe_req_wpsp2pie(padapter,
1659 if (pmlmepriv->LinkDetectInfo.bBusyTraffic == true) {
1660 DBG_8723A("%s, bBusyTraffic == true\n", __func__);
1661 need_indicate_scan_done = true;
1662 goto check_need_indicate_scan_done;
1664 if (rtw_is_scan_deny(padapter)) {
1665 DBG_8723A(FUNC_ADPT_FMT ": scan deny\n",
1666 FUNC_ADPT_ARG(padapter));
1667 need_indicate_scan_done = true;
1668 goto check_need_indicate_scan_done;
1671 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY | _FW_UNDER_LINKING) ==
1673 DBG_8723A("%s, fwstate = 0x%x\n", __func__, pmlmepriv->fw_state);
1674 need_indicate_scan_done = true;
1675 goto check_need_indicate_scan_done;
1677 #ifdef CONFIG_8723AU_P2P
1678 if (!rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE) &&
1679 !rtw_p2p_chk_state(pwdinfo, P2P_STATE_IDLE)) {
1680 rtw_p2p_set_state(pwdinfo, P2P_STATE_FIND_PHASE_SEARCH);
1681 rtw_free_network_queue23a(padapter, true);
1683 if (social_channel == 0)
1684 rtw_p2p_findphase_ex_set(pwdinfo,
1685 P2P_FINDPHASE_EX_NONE);
1687 rtw_p2p_findphase_ex_set(pwdinfo,
1688 P2P_FINDPHASE_EX_SOCIAL_LAST);
1690 #endif /* CONFIG_8723AU_P2P */
1692 memset(ssid, 0, sizeof(struct cfg80211_ssid) * RTW_SSID_SCAN_AMOUNT);
1693 /* parsing request ssids, n_ssids */
1694 for (i = 0; i < request->n_ssids && i < RTW_SSID_SCAN_AMOUNT; i++) {
1695 #ifdef CONFIG_DEBUG_CFG80211
1696 DBG_8723A("ssid =%s, len =%d\n", ssids[i].ssid,
1699 memcpy(ssid[i].ssid, ssids[i].ssid, ssids[i].ssid_len);
1700 ssid[i].ssid_len = ssids[i].ssid_len;
1703 /* parsing channels, n_channels */
1705 sizeof(struct rtw_ieee80211_channel) * RTW_CHANNEL_SCAN_AMOUNT);
1707 if (request->n_channels == 1) {
1708 for (i = 0; i < request->n_channels &&
1709 i < RTW_CHANNEL_SCAN_AMOUNT; i++) {
1710 #ifdef CONFIG_DEBUG_CFG80211
1711 DBG_8723A(FUNC_ADPT_FMT CHAN_FMT "\n",
1712 FUNC_ADPT_ARG(padapter),
1713 CHAN_ARG(request->channels[i]));
1715 ch[i].hw_value = request->channels[i]->hw_value;
1716 ch[i].flags = request->channels[i]->flags;
1720 spin_lock_bh(&pmlmepriv->lock);
1721 if (request->n_channels == 1) {
1722 memcpy(&ch[1], &ch[0], sizeof(struct rtw_ieee80211_channel));
1723 memcpy(&ch[2], &ch[0], sizeof(struct rtw_ieee80211_channel));
1724 _status = rtw_sitesurvey_cmd23a(padapter, ssid,
1725 RTW_SSID_SCAN_AMOUNT, ch, 3);
1727 _status = rtw_sitesurvey_cmd23a(padapter, ssid,
1728 RTW_SSID_SCAN_AMOUNT, NULL, 0);
1730 spin_unlock_bh(&pmlmepriv->lock);
1732 if (_status == false)
1735 check_need_indicate_scan_done:
1736 if (need_indicate_scan_done)
1737 rtw_cfg80211_surveydone_event_callback(padapter);
1741 static int cfg80211_rtw_set_wiphy_params(struct wiphy *wiphy, u32 changed)
1743 DBG_8723A("%s\n", __func__);
1747 static int cfg80211_rtw_join_ibss(struct wiphy *wiphy, struct net_device *ndev,
1748 struct cfg80211_ibss_params *params)
1750 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
1754 static int cfg80211_rtw_leave_ibss(struct wiphy *wiphy, struct net_device *ndev)
1756 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
1760 static int rtw_cfg80211_set_wpa_version(struct security_priv *psecuritypriv,
1763 DBG_8723A("%s, wpa_version =%d\n", __func__, wpa_version);
1766 psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
1770 if (wpa_version & (NL80211_WPA_VERSION_1 | NL80211_WPA_VERSION_2)) {
1771 psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPAPSK;
1775 if (wpa_version & NL80211_WPA_VERSION_2)
1777 psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK;
1784 static int rtw_cfg80211_set_auth_type(struct security_priv *psecuritypriv,
1785 enum nl80211_auth_type sme_auth_type)
1787 DBG_8723A("%s, nl80211_auth_type =%d\n", __func__, sme_auth_type);
1789 switch (sme_auth_type) {
1790 case NL80211_AUTHTYPE_AUTOMATIC:
1791 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Auto;
1794 case NL80211_AUTHTYPE_OPEN_SYSTEM:
1795 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
1797 if (psecuritypriv->ndisauthtype > Ndis802_11AuthModeWPA)
1798 psecuritypriv->dot11AuthAlgrthm =
1799 dot11AuthAlgrthm_8021X;
1801 case NL80211_AUTHTYPE_SHARED_KEY:
1802 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Shared;
1804 psecuritypriv->ndisencryptstatus = Ndis802_11Encryption1Enabled;
1807 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
1808 /* return -ENOTSUPP; */
1814 static int rtw_cfg80211_set_cipher(struct security_priv *psecuritypriv,
1815 u32 cipher, bool ucast)
1817 u32 ndisencryptstatus = Ndis802_11EncryptionDisabled;
1819 u32 *profile_cipher = ucast ? &psecuritypriv->dot11PrivacyAlgrthm :
1820 &psecuritypriv->dot118021XGrpPrivacy;
1822 DBG_8723A("%s, ucast =%d, cipher = 0x%x\n", __func__, ucast, cipher);
1825 *profile_cipher = _NO_PRIVACY_;
1826 psecuritypriv->ndisencryptstatus = ndisencryptstatus;
1831 case IW_AUTH_CIPHER_NONE:
1832 *profile_cipher = _NO_PRIVACY_;
1833 ndisencryptstatus = Ndis802_11EncryptionDisabled;
1835 case WLAN_CIPHER_SUITE_WEP40:
1836 *profile_cipher = _WEP40_;
1837 ndisencryptstatus = Ndis802_11Encryption1Enabled;
1839 case WLAN_CIPHER_SUITE_WEP104:
1840 *profile_cipher = _WEP104_;
1841 ndisencryptstatus = Ndis802_11Encryption1Enabled;
1843 case WLAN_CIPHER_SUITE_TKIP:
1844 *profile_cipher = _TKIP_;
1845 ndisencryptstatus = Ndis802_11Encryption2Enabled;
1847 case WLAN_CIPHER_SUITE_CCMP:
1848 *profile_cipher = _AES_;
1849 ndisencryptstatus = Ndis802_11Encryption3Enabled;
1852 DBG_8723A("Unsupported cipher: 0x%x\n", cipher);
1857 psecuritypriv->ndisencryptstatus = ndisencryptstatus;
1862 static int rtw_cfg80211_set_key_mgt(struct security_priv *psecuritypriv,
1865 DBG_8723A("%s, key_mgt = 0x%x\n", __func__, key_mgt);
1867 if (key_mgt == WLAN_AKM_SUITE_8021X)
1868 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;
1869 else if (key_mgt == WLAN_AKM_SUITE_PSK)
1870 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_8021X;
1872 DBG_8723A("Invalid key mgt: 0x%x\n", key_mgt);
1877 static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter *padapter, const u8 *pie,
1880 u8 *buf = NULL, *pos = NULL;
1881 int group_cipher = 0, pairwise_cipher = 0;
1886 u8 null_addr[] = { 0, 0, 0, 0, 0, 0 };
1889 if (!pie || !ielen) {
1890 /* Treat this as normal case, but need to clear
1892 _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
1895 if (ielen > MAX_WPA_IE_LEN + MAX_WPS_IE_LEN + MAX_P2P_IE_LEN) {
1899 buf = kzalloc(ielen, GFP_KERNEL);
1904 memcpy(buf, pie, ielen);
1907 DBG_8723A("set wpa_ie(length:%zu):\n", ielen);
1908 for (i = 0; i < ielen; i = i + 8)
1909 DBG_8723A("0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x 0x%.2x\n",
1911 buf[i + 2], buf[i + 3], buf[i + 4],
1912 buf[i + 5], buf[i + 6], buf[i + 7]);
1914 if (ielen < RSN_HEADER_LEN) {
1915 RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_err_,
1916 ("Ie len too short %d\n", (int)ielen));
1921 pwpa = rtw_get_wpa_ie23a(buf, &wpa_ielen, ielen);
1922 if (pwpa && wpa_ielen > 0) {
1923 if (rtw_parse_wpa_ie23a(pwpa, wpa_ielen + 2, &group_cipher,
1924 &pairwise_cipher, NULL) == _SUCCESS) {
1925 padapter->securitypriv.dot11AuthAlgrthm =
1926 dot11AuthAlgrthm_8021X;
1927 padapter->securitypriv.ndisauthtype =
1928 Ndis802_11AuthModeWPAPSK;
1929 memcpy(padapter->securitypriv.supplicant_ie, &pwpa[0],
1932 DBG_8723A("got wpa_ie, wpa_ielen:%u\n", wpa_ielen);
1936 pwpa2 = rtw_get_wpa2_ie23a(buf, &wpa2_ielen, ielen);
1937 if (pwpa2 && wpa2_ielen > 0) {
1938 if (rtw_parse_wpa2_ie23a (pwpa2, wpa2_ielen + 2, &group_cipher,
1939 &pairwise_cipher, NULL) == _SUCCESS) {
1940 padapter->securitypriv.dot11AuthAlgrthm =
1941 dot11AuthAlgrthm_8021X;
1942 padapter->securitypriv.ndisauthtype =
1943 Ndis802_11AuthModeWPA2PSK;
1944 memcpy(padapter->securitypriv.supplicant_ie, &pwpa2[0],
1947 DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", wpa2_ielen);
1951 if (group_cipher == 0) {
1952 group_cipher = WPA_CIPHER_NONE;
1954 if (pairwise_cipher == 0) {
1955 pairwise_cipher = WPA_CIPHER_NONE;
1958 switch (group_cipher) {
1959 case WPA_CIPHER_NONE:
1960 padapter->securitypriv.dot118021XGrpPrivacy = _NO_PRIVACY_;
1961 padapter->securitypriv.ndisencryptstatus =
1962 Ndis802_11EncryptionDisabled;
1964 case WPA_CIPHER_WEP40:
1965 padapter->securitypriv.dot118021XGrpPrivacy = _WEP40_;
1966 padapter->securitypriv.ndisencryptstatus =
1967 Ndis802_11Encryption1Enabled;
1969 case WPA_CIPHER_TKIP:
1970 padapter->securitypriv.dot118021XGrpPrivacy = _TKIP_;
1971 padapter->securitypriv.ndisencryptstatus =
1972 Ndis802_11Encryption2Enabled;
1974 case WPA_CIPHER_CCMP:
1975 padapter->securitypriv.dot118021XGrpPrivacy = _AES_;
1976 padapter->securitypriv.ndisencryptstatus =
1977 Ndis802_11Encryption3Enabled;
1979 case WPA_CIPHER_WEP104:
1980 padapter->securitypriv.dot118021XGrpPrivacy = _WEP104_;
1981 padapter->securitypriv.ndisencryptstatus =
1982 Ndis802_11Encryption1Enabled;
1986 switch (pairwise_cipher) {
1987 case WPA_CIPHER_NONE:
1988 padapter->securitypriv.dot11PrivacyAlgrthm = _NO_PRIVACY_;
1989 padapter->securitypriv.ndisencryptstatus =
1990 Ndis802_11EncryptionDisabled;
1992 case WPA_CIPHER_WEP40:
1993 padapter->securitypriv.dot11PrivacyAlgrthm = _WEP40_;
1994 padapter->securitypriv.ndisencryptstatus =
1995 Ndis802_11Encryption1Enabled;
1997 case WPA_CIPHER_TKIP:
1998 padapter->securitypriv.dot11PrivacyAlgrthm = _TKIP_;
1999 padapter->securitypriv.ndisencryptstatus =
2000 Ndis802_11Encryption2Enabled;
2002 case WPA_CIPHER_CCMP:
2003 padapter->securitypriv.dot11PrivacyAlgrthm = _AES_;
2004 padapter->securitypriv.ndisencryptstatus =
2005 Ndis802_11Encryption3Enabled;
2007 case WPA_CIPHER_WEP104:
2008 padapter->securitypriv.dot11PrivacyAlgrthm = _WEP104_;
2009 padapter->securitypriv.ndisencryptstatus =
2010 Ndis802_11Encryption1Enabled;
2014 { /* handle wps_ie */
2018 wps_ie = rtw_get_wps_ie23a(buf, ielen, NULL, &wps_ielen);
2019 if (wps_ie && wps_ielen > 0) {
2020 DBG_8723A("got wps_ie, wps_ielen:%u\n", wps_ielen);
2021 padapter->securitypriv.wps_ie_len =
2023 MAX_WPS_IE_LEN ? wps_ielen : MAX_WPS_IE_LEN;
2024 memcpy(padapter->securitypriv.wps_ie, wps_ie,
2025 padapter->securitypriv.wps_ie_len);
2026 set_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS);
2028 _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
2032 #ifdef CONFIG_8723AU_P2P
2033 { /* check p2p_ie for assoc req; */
2036 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2038 p2p_ie = rtw_get_p2p_ie23a(buf, ielen, NULL, &p2p_ielen);
2040 #ifdef CONFIG_DEBUG_CFG80211
2041 DBG_8723A("%s p2p_assoc_req_ielen =%d\n", __func__,
2045 if (pmlmepriv->p2p_assoc_req_ie) {
2046 pmlmepriv->p2p_assoc_req_ie_len = 0;
2047 kfree(pmlmepriv->p2p_assoc_req_ie);
2048 pmlmepriv->p2p_assoc_req_ie = NULL;
2051 pmlmepriv->p2p_assoc_req_ie =
2052 kmalloc(p2p_ielen, GFP_KERNEL);
2053 if (pmlmepriv->p2p_assoc_req_ie == NULL) {
2054 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
2055 __func__, __LINE__);
2058 memcpy(pmlmepriv->p2p_assoc_req_ie, p2p_ie, p2p_ielen);
2059 pmlmepriv->p2p_assoc_req_ie_len = p2p_ielen;
2062 #endif /* CONFIG_8723AU_P2P */
2064 #ifdef CONFIG_8723AU_P2P
2065 { /* check wfd_ie for assoc req; */
2067 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2069 if (rtw_get_wfd_ie(buf, ielen, NULL, &wfd_ielen)) {
2070 #ifdef CONFIG_DEBUG_CFG80211
2071 DBG_8723A("%s wfd_assoc_req_ielen =%d\n", __func__,
2075 if (pmlmepriv->wfd_assoc_req_ie) {
2076 pmlmepriv->wfd_assoc_req_ie_len = 0;
2077 kfree(pmlmepriv->wfd_assoc_req_ie);
2078 pmlmepriv->wfd_assoc_req_ie = NULL;
2081 pmlmepriv->wfd_assoc_req_ie =
2082 kmalloc(wfd_ielen, GFP_KERNEL);
2083 if (pmlmepriv->wfd_assoc_req_ie == NULL) {
2084 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
2085 __func__, __LINE__);
2088 rtw_get_wfd_ie(buf, ielen, pmlmepriv->wfd_assoc_req_ie,
2089 &pmlmepriv->wfd_assoc_req_ie_len);
2092 #endif /* CONFIG_8723AU_P2P */
2094 /* TKIP and AES disallow multicast packets until installing group key */
2095 if (padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_ ||
2096 padapter->securitypriv.dot11PrivacyAlgrthm == _TKIP_WTMIC_ ||
2097 padapter->securitypriv.dot11PrivacyAlgrthm == _AES_)
2098 /* WPS open need to enable multicast */
2099 /* check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == true)*/
2100 rtw_hal_set_hwreg23a(padapter, HW_VAR_OFF_RCR_AM, null_addr);
2102 RT_TRACE(_module_rtl871x_ioctl_os_c, _drv_info_,
2103 ("rtw_set_wpa_ie: pairwise_cipher = 0x%08x padapter->"
2104 "securitypriv.ndisencryptstatus =%d padapter->"
2105 "securitypriv.ndisauthtype =%d\n", pairwise_cipher,
2106 padapter->securitypriv.ndisencryptstatus,
2107 padapter->securitypriv.ndisauthtype));
2112 _clr_fwstate_(&padapter->mlmepriv, WIFI_UNDER_WPS);
2116 static int cfg80211_rtw_connect(struct wiphy *wiphy, struct net_device *ndev,
2117 struct cfg80211_connect_params *sme)
2120 struct list_head *phead, *plist, *ptmp;
2121 struct wlan_network *pnetwork = NULL;
2122 enum ndis_802_11_auth_mode authmode;
2123 struct cfg80211_ssid ndis_ssid;
2127 const u8 *src_bssid;
2128 /* u8 matched_by_bssid = false; */
2129 /* u8 matched_by_ssid = false; */
2131 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2132 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2133 struct security_priv *psecuritypriv = &padapter->securitypriv;
2134 struct rtw_queue *queue = &pmlmepriv->scanned_queue;
2136 DBG_8723A("=>" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
2137 DBG_8723A("privacy =%d, key =%p, key_len =%d, key_idx =%d\n",
2138 sme->privacy, sme->key, sme->key_len, sme->key_idx);
2140 if (wdev_to_priv(padapter->rtw_wdev)->block) {
2142 DBG_8723A("%s wdev_priv.block is set\n", __func__);
2146 if (_FAIL == rtw_pwr_wakeup(padapter)) {
2151 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
2156 if (!sme->ssid || !sme->ssid_len) {
2161 if (sme->ssid_len > IW_ESSID_MAX_SIZE) {
2166 memset(&ndis_ssid, 0, sizeof(struct cfg80211_ssid));
2167 ndis_ssid.ssid_len = sme->ssid_len;
2168 memcpy(ndis_ssid.ssid, sme->ssid, sme->ssid_len);
2170 DBG_8723A("ssid =%s, len =%zu\n", ndis_ssid.ssid, sme->ssid_len);
2173 DBG_8723A("bssid =" MAC_FMT "\n", MAC_ARG(sme->bssid));
2175 if (check_fwstate(pmlmepriv, _FW_UNDER_LINKING)) {
2177 DBG_8723A("%s, fw_state = 0x%x, goto exit\n", __func__,
2178 pmlmepriv->fw_state);
2181 if (check_fwstate(pmlmepriv, _FW_UNDER_SURVEY)) {
2182 rtw_scan_abort23a(padapter);
2185 spin_lock_bh(&queue->lock);
2187 phead = get_list_head(queue);
2189 list_for_each_safe(plist, ptmp, phead) {
2190 pnetwork = container_of(plist, struct wlan_network, list);
2192 dst_ssid = pnetwork->network.Ssid.ssid;
2193 dst_bssid = pnetwork->network.MacAddress;
2196 if (memcmp(pnetwork->network.MacAddress,
2197 sme->bssid, ETH_ALEN))
2201 if (sme->ssid && sme->ssid_len) {
2202 if (pnetwork->network.Ssid.ssid_len != sme->ssid_len ||
2203 memcmp(pnetwork->network.Ssid.ssid, sme->ssid,
2209 src_bssid = sme->bssid;
2211 if ((!memcmp(dst_bssid, src_bssid, ETH_ALEN))) {
2212 DBG_8723A("matched by bssid\n");
2214 ndis_ssid.ssid_len =
2215 pnetwork->network.Ssid.ssid_len;
2216 memcpy(ndis_ssid.ssid,
2217 pnetwork->network.Ssid.ssid,
2218 pnetwork->network.Ssid.ssid_len);
2224 } else if (sme->ssid && sme->ssid_len) {
2225 src_ssid = ndis_ssid.ssid;
2227 if ((!memcmp(dst_ssid, src_ssid, ndis_ssid.ssid_len)) &&
2228 (pnetwork->network.Ssid.ssid_len ==
2229 ndis_ssid.ssid_len)) {
2230 DBG_8723A("matched by ssid\n");
2237 spin_unlock_bh(&queue->lock);
2239 if (!matched || (pnetwork == NULL)) {
2241 DBG_8723A("connect, matched == false, goto exit\n");
2245 if (rtw_set_802_11_infrastructure_mode23a
2246 (padapter, pnetwork->network.InfrastructureMode) == false) {
2251 psecuritypriv->ndisencryptstatus = Ndis802_11EncryptionDisabled;
2252 psecuritypriv->dot11PrivacyAlgrthm = _NO_PRIVACY_;
2253 psecuritypriv->dot118021XGrpPrivacy = _NO_PRIVACY_;
2254 psecuritypriv->dot11AuthAlgrthm = dot11AuthAlgrthm_Open;
2255 psecuritypriv->ndisauthtype = Ndis802_11AuthModeOpen;
2258 rtw_cfg80211_set_wpa_version(psecuritypriv,
2259 sme->crypto.wpa_versions);
2263 ret = rtw_cfg80211_set_auth_type(psecuritypriv, sme->auth_type);
2268 DBG_8723A("%s, ie_len =%zu\n", __func__, sme->ie_len);
2270 ret = rtw_cfg80211_set_wpa_ie(padapter, sme->ie, sme->ie_len);
2274 if (sme->crypto.n_ciphers_pairwise) {
2275 ret = rtw_cfg80211_set_cipher(psecuritypriv,
2276 sme->crypto.ciphers_pairwise[0],
2282 /* For WEP Shared auth */
2283 if ((psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Shared ||
2284 psecuritypriv->dot11AuthAlgrthm == dot11AuthAlgrthm_Auto) &&
2286 u32 wep_key_idx, wep_key_len, wep_total_len;
2287 struct ndis_802_11_wep *pwep = NULL;
2288 DBG_8723A("%s(): Shared/Auto WEP\n", __func__);
2290 wep_key_idx = sme->key_idx;
2291 wep_key_len = sme->key_len;
2293 if (sme->key_idx > WEP_KEYS) {
2298 if (wep_key_len > 0) {
2299 wep_key_len = wep_key_len <= 5 ? 5 : 13;
2302 offsetof(struct ndis_802_11_wep, KeyMaterial);
2303 pwep = (struct ndis_802_11_wep *)kmalloc(wep_total_len,
2306 DBG_8723A(" wpa_set_encryption: pwep "
2307 "allocate fail !!!\n");
2312 memset(pwep, 0, wep_total_len);
2314 pwep->KeyLength = wep_key_len;
2315 pwep->Length = wep_total_len;
2317 if (wep_key_len == 13) {
2318 padapter->securitypriv.dot11PrivacyAlgrthm =
2320 padapter->securitypriv.dot118021XGrpPrivacy =
2328 pwep->KeyIndex = wep_key_idx;
2329 pwep->KeyIndex |= 0x80000000;
2331 memcpy(pwep->KeyMaterial, (void *)sme->key, pwep->KeyLength);
2333 if (rtw_set_802_11_add_wep23a(padapter, pwep) == (u8) _FAIL) {
2343 ret = rtw_cfg80211_set_cipher(psecuritypriv,
2344 sme->crypto.cipher_group, false);
2348 if (sme->crypto.n_akm_suites) {
2349 ret = rtw_cfg80211_set_key_mgt(psecuritypriv,
2350 sme->crypto.akm_suites[0]);
2355 authmode = psecuritypriv->ndisauthtype;
2356 rtw_set_802_11_authentication_mode23a(padapter, authmode);
2358 /* rtw_set_802_11_encryption_mode(padapter,
2359 padapter->securitypriv.ndisencryptstatus); */
2361 if (rtw_set_802_11_ssid23a(padapter, &ndis_ssid) == false) {
2366 DBG_8723A("set ssid:dot11AuthAlgrthm =%d, dot11PrivacyAlgrthm =%d, "
2367 "dot118021XGrpPrivacy =%d\n", psecuritypriv->dot11AuthAlgrthm,
2368 psecuritypriv->dot11PrivacyAlgrthm,
2369 psecuritypriv->dot118021XGrpPrivacy);
2373 DBG_8723A("<=%s, ret %d\n", __func__, ret);
2378 static int cfg80211_rtw_disconnect(struct wiphy *wiphy, struct net_device *ndev,
2381 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2383 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
2385 rtw_set_roaming(padapter, 0);
2387 if (check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
2388 rtw_scan_abort23a(padapter);
2389 LeaveAllPowerSaveMode23a(padapter);
2390 rtw_disassoc_cmd23a(padapter, 500, false);
2392 DBG_8723A("%s...call rtw_indicate_disconnect23a\n", __func__);
2394 padapter->mlmepriv.not_indic_disco = true;
2395 rtw_indicate_disconnect23a(padapter);
2396 padapter->mlmepriv.not_indic_disco = false;
2398 rtw_free_assoc_resources23a(padapter, 1);
2404 static int cfg80211_rtw_set_txpower(struct wiphy *wiphy,
2405 struct wireless_dev *wdev,
2406 enum nl80211_tx_power_setting type, int mbm)
2408 DBG_8723A("%s\n", __func__);
2412 static int cfg80211_rtw_get_txpower(struct wiphy *wiphy,
2413 struct wireless_dev *wdev, int *dbm)
2415 DBG_8723A("%s\n", __func__);
2420 inline bool rtw_cfg80211_pwr_mgmt(struct rtw_adapter *adapter)
2422 struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(adapter->rtw_wdev);
2423 return rtw_wdev_priv->power_mgmt;
2426 static int cfg80211_rtw_set_power_mgmt(struct wiphy *wiphy,
2427 struct net_device *ndev,
2428 bool enabled, int timeout)
2430 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2431 struct rtw_wdev_priv *rtw_wdev_priv = wdev_to_priv(padapter->rtw_wdev);
2433 DBG_8723A(FUNC_NDEV_FMT " enabled:%u, timeout:%d\n",
2434 FUNC_NDEV_ARG(ndev), enabled, timeout);
2436 rtw_wdev_priv->power_mgmt = enabled;
2439 LPS_Leave23a(padapter);
2444 static int cfg80211_rtw_set_pmksa(struct wiphy *wiphy,
2445 struct net_device *netdev,
2446 struct cfg80211_pmksa *pmksa)
2448 u8 index, blInserted = false;
2449 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2450 struct security_priv *psecuritypriv = &padapter->securitypriv;
2451 u8 strZeroMacAddress[ETH_ALEN] = { 0x00 };
2453 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev));
2455 if (!memcmp(pmksa->bssid, strZeroMacAddress, ETH_ALEN)) {
2461 /* overwrite PMKID */
2462 for (index = 0; index < NUM_PMKID_CACHE; index++) {
2463 if (!memcmp(psecuritypriv->PMKIDList[index].Bssid,
2464 pmksa->bssid, ETH_ALEN)) {
2465 /* BSSID is matched, the same AP => rewrite with
2467 DBG_8723A(FUNC_NDEV_FMT
2468 " BSSID exists in the PMKList.\n",
2469 FUNC_NDEV_ARG(netdev));
2471 memcpy(psecuritypriv->PMKIDList[index].PMKID,
2472 pmksa->pmkid, WLAN_PMKID_LEN);
2473 psecuritypriv->PMKIDList[index].bUsed = true;
2474 psecuritypriv->PMKIDIndex = index + 1;
2481 /* Find a new entry */
2482 DBG_8723A(FUNC_NDEV_FMT
2483 " Use the new entry index = %d for this PMKID.\n",
2484 FUNC_NDEV_ARG(netdev), psecuritypriv->PMKIDIndex);
2486 memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].
2487 Bssid, pmksa->bssid, ETH_ALEN);
2488 memcpy(psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].
2489 PMKID, pmksa->pmkid, WLAN_PMKID_LEN);
2491 psecuritypriv->PMKIDList[psecuritypriv->PMKIDIndex].bUsed =
2493 psecuritypriv->PMKIDIndex++;
2494 if (psecuritypriv->PMKIDIndex == 16) {
2495 psecuritypriv->PMKIDIndex = 0;
2502 static int cfg80211_rtw_del_pmksa(struct wiphy *wiphy,
2503 struct net_device *netdev,
2504 struct cfg80211_pmksa *pmksa)
2506 u8 index, bMatched = false;
2507 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2508 struct security_priv *psecuritypriv = &padapter->securitypriv;
2510 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev));
2512 for (index = 0; index < NUM_PMKID_CACHE; index++) {
2513 if (!memcmp(psecuritypriv->PMKIDList[index].Bssid,
2514 pmksa->bssid, ETH_ALEN)) {
2515 /* BSSID is matched, the same AP => Remove this PMKID information and reset it. */
2516 memset(psecuritypriv->PMKIDList[index].Bssid, 0x00,
2518 memset(psecuritypriv->PMKIDList[index].PMKID, 0x00,
2520 psecuritypriv->PMKIDList[index].bUsed = false;
2526 if (false == bMatched) {
2527 DBG_8723A(FUNC_NDEV_FMT " do not have matched BSSID\n",
2528 FUNC_NDEV_ARG(netdev));
2535 static int cfg80211_rtw_flush_pmksa(struct wiphy *wiphy,
2536 struct net_device *netdev)
2538 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2539 struct security_priv *psecuritypriv = &padapter->securitypriv;
2541 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(netdev));
2543 memset(&psecuritypriv->PMKIDList[0], 0x00,
2544 sizeof(struct rt_pmkid_list) * NUM_PMKID_CACHE);
2545 psecuritypriv->PMKIDIndex = 0;
2550 #ifdef CONFIG_8723AU_AP_MODE
2551 void rtw_cfg80211_indicate_sta_assoc(struct rtw_adapter *padapter,
2552 u8 *pmgmt_frame, uint frame_len)
2556 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2557 struct net_device *ndev = padapter->pnetdev;
2559 DBG_8723A("%s(padapter =%p,%s)\n", __func__, padapter, ndev->name);
2561 #if defined(RTW_USE_CFG80211_STA_EVENT)
2563 struct station_info sinfo;
2565 if (ieee80211_is_assoc_req(hdr->frame_control))
2566 ie_offset = _ASOCREQ_IE_OFFSET_;
2567 else /* WIFI_REASSOCREQ */
2568 ie_offset = _REASOCREQ_IE_OFFSET_;
2571 sinfo.filled = STATION_INFO_ASSOC_REQ_IES;
2572 sinfo.assoc_req_ies = pmgmt_frame + WLAN_HDR_A3_LEN + ie_offset;
2573 sinfo.assoc_req_ies_len =
2574 frame_len - WLAN_HDR_A3_LEN - ie_offset;
2575 cfg80211_new_sta(ndev, hdr->addr2, &sinfo, GFP_ATOMIC);
2577 #else /* defined(RTW_USE_CFG80211_STA_EVENT) */
2578 channel = pmlmeext->cur_channel;
2579 if (channel <= RTW_CH_MAX_2G_CHANNEL)
2580 freq = ieee80211_channel_to_frequency(channel,
2581 IEEE80211_BAND_2GHZ);
2583 freq = ieee80211_channel_to_frequency(channel,
2584 IEEE80211_BAND_5GHZ);
2586 rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len,
2588 #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
2591 void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter *padapter,
2593 unsigned short reason)
2599 struct ieee80211_hdr *pwlanhdr;
2600 unsigned short *fctrl;
2601 u8 mgmt_buf[128] = { 0 };
2602 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2603 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
2604 struct net_device *ndev = padapter->pnetdev;
2606 DBG_8723A("%s(padapter =%p,%s)\n", __func__, padapter, ndev->name);
2608 #if defined(RTW_USE_CFG80211_STA_EVENT)
2609 cfg80211_del_sta(ndev, da, GFP_ATOMIC);
2610 #else /* defined(RTW_USE_CFG80211_STA_EVENT) */
2611 channel = pmlmeext->cur_channel;
2612 if (channel <= RTW_CH_MAX_2G_CHANNEL)
2613 freq = ieee80211_channel_to_frequency(channel,
2614 IEEE80211_BAND_2GHZ);
2616 freq = ieee80211_channel_to_frequency(channel,
2617 IEEE80211_BAND_5GHZ);
2619 pmgmt_frame = mgmt_buf;
2620 pwlanhdr = (struct ieee80211_hdr *)pmgmt_frame;
2622 fctrl = &pwlanhdr->frame_control;
2625 memcpy(pwlanhdr->addr1, myid(&padapter->eeprompriv), ETH_ALEN);
2626 memcpy(pwlanhdr->addr2, da, ETH_ALEN);
2627 memcpy(pwlanhdr->addr3, get_my_bssid23a(&pmlmeinfo->network), ETH_ALEN);
2629 SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
2630 pmlmeext->mgnt_seq++;
2631 SetFrameSubType(pmgmt_frame, WIFI_DEAUTH);
2633 pmgmt_frame += sizeof(struct ieee80211_hdr_3addr);
2634 frame_len = sizeof(struct ieee80211_hdr_3addr);
2636 reason = cpu_to_le16(reason);
2637 pmgmt_frame = rtw_set_fixed_ie23a(pmgmt_frame,
2638 WLAN_REASON_PREV_AUTH_NOT_VALID,
2639 (unsigned char *)&reason, &frame_len);
2641 rtw_cfg80211_rx_mgmt(padapter, freq, 0, mgmt_buf, frame_len,
2643 #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
2646 static int rtw_cfg80211_monitor_if_open(struct net_device *ndev)
2650 DBG_8723A("%s\n", __func__);
2655 static int rtw_cfg80211_monitor_if_close(struct net_device *ndev)
2659 DBG_8723A("%s\n", __func__);
2664 static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff *skb,
2665 struct net_device *ndev)
2670 int dot11_hdr_len = 24;
2672 unsigned char *pdata;
2673 unsigned char src_mac_addr[6];
2674 unsigned char dst_mac_addr[6];
2675 struct ieee80211_hdr *dot11_hdr;
2676 struct ieee80211_radiotap_header *rtap_hdr;
2677 struct rtw_adapter *padapter = netdev_priv(ndev);
2679 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
2681 if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
2684 rtap_hdr = (struct ieee80211_radiotap_header *)skb->data;
2685 if (unlikely(rtap_hdr->it_version))
2688 rtap_len = ieee80211_get_radiotap_len(skb->data);
2689 if (unlikely(skb->len < rtap_len))
2692 if (rtap_len != 14) {
2693 DBG_8723A("radiotap len (should be 14): %d\n", rtap_len);
2697 /* Skip the ratio tap header */
2698 skb_pull(skb, rtap_len);
2700 dot11_hdr = (struct ieee80211_hdr *)skb->data;
2701 /* Check if the QoS bit is set */
2702 if (ieee80211_is_data(dot11_hdr->frame_control)) {
2703 /* Check if this ia a Wireless Distribution System (WDS) frame
2704 * which has 4 MAC addresses
2706 if (ieee80211_is_data_qos(dot11_hdr->frame_control))
2707 qos_len = IEEE80211_QOS_CTL_LEN;
2708 if (ieee80211_has_a4(dot11_hdr->frame_control))
2711 memcpy(dst_mac_addr, dot11_hdr->addr1, sizeof(dst_mac_addr));
2712 memcpy(src_mac_addr, dot11_hdr->addr2, sizeof(src_mac_addr));
2715 * Skip the 802.11 header, QoS (if any) and SNAP,
2716 * but leave spaces for two MAC addresses
2718 skb_pull(skb, dot11_hdr_len + qos_len + snap_len -
2720 pdata = (unsigned char *)skb->data;
2721 memcpy(pdata, dst_mac_addr, ETH_ALEN);
2722 memcpy(pdata + ETH_ALEN, src_mac_addr, ETH_ALEN);
2724 DBG_8723A("should be eapol packet\n");
2726 /* Use the real net device to transmit the packet */
2727 ret = rtw_xmit23a_entry23a(skb, padapter->pnetdev);
2731 } else if (ieee80211_is_action(dot11_hdr->frame_control)) {
2732 /* only for action frames */
2733 struct xmit_frame *pmgntframe;
2734 struct pkt_attrib *pattrib;
2735 unsigned char *pframe;
2736 /* u8 category, action, OUI_Subtype, dialogToken = 0; */
2737 /* unsigned char *frame_body; */
2738 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2739 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2741 u8 category, action;
2742 #ifdef CONFIG_8723AU_P2P
2746 if (rtw_action_frame_parse23a(skb->data, len, &category,
2747 &action) == false) {
2748 DBG_8723A(FUNC_NDEV_FMT " frame_control:0x%x\n",
2749 FUNC_NDEV_ARG(ndev),
2750 le16_to_cpu(dot11_hdr->frame_control));
2754 DBG_8723A("RTW_Tx:da =" MAC_FMT " via " FUNC_NDEV_FMT "\n",
2755 MAC_ARG(dot11_hdr->addr1), FUNC_NDEV_ARG(ndev));
2756 #ifdef CONFIG_8723AU_P2P
2757 type = rtw_p2p_check_frames(padapter, skb->data, len, true);
2761 if (category == WLAN_CATEGORY_PUBLIC)
2762 DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action));
2764 DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category,
2766 #ifdef CONFIG_8723AU_P2P
2769 /* starting alloc mgmt frame to dump it */
2770 pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
2771 if (pmgntframe == NULL)
2774 /* update attribute */
2775 pattrib = &pmgntframe->attrib;
2776 update_mgntframe_attrib23a(padapter, pattrib);
2777 pattrib->retry_ctrl = false;
2779 memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
2781 pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
2783 memcpy(pframe, skb->data, len);
2784 #ifdef CONFIG_8723AU_P2P
2786 struct wifi_display_info *pwfd_info;
2788 pwfd_info = padapter->wdinfo.wfd_info;
2790 if (pwfd_info->wfd_enable)
2791 rtw_append_wfd_ie(padapter, pframe, &len);
2793 #endif /* CONFIG_8723AU_P2P */
2794 pattrib->pktlen = len;
2796 /* update seq number */
2797 pmlmeext->mgnt_seq = le16_to_cpu(dot11_hdr->seq_ctrl) >> 4;
2798 pattrib->seqnum = pmlmeext->mgnt_seq;
2799 pmlmeext->mgnt_seq++;
2801 pattrib->last_txcmdsz = pattrib->pktlen;
2803 dump_mgntframe23a(padapter, pmgntframe);
2814 rtw_cfg80211_monitor_if_set_mac_address(struct net_device *ndev, void *addr)
2818 DBG_8723A("%s\n", __func__);
2823 static const struct net_device_ops rtw_cfg80211_monitor_if_ops = {
2824 .ndo_open = rtw_cfg80211_monitor_if_open,
2825 .ndo_stop = rtw_cfg80211_monitor_if_close,
2826 .ndo_start_xmit = rtw_cfg80211_monitor_if_xmit_entry,
2827 .ndo_set_mac_address = rtw_cfg80211_monitor_if_set_mac_address,
2830 static int rtw_cfg80211_add_monitor_if(struct rtw_adapter *padapter, char *name,
2831 struct net_device **ndev)
2834 struct net_device *mon_ndev = NULL;
2835 struct wireless_dev *mon_wdev = NULL;
2836 struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
2839 DBG_8723A(FUNC_ADPT_FMT " without specific name\n",
2840 FUNC_ADPT_ARG(padapter));
2845 if (pwdev_priv->pmon_ndev) {
2846 DBG_8723A(FUNC_ADPT_FMT " monitor interface exist: " NDEV_FMT
2847 "\n", FUNC_ADPT_ARG(padapter),
2848 NDEV_ARG(pwdev_priv->pmon_ndev));
2853 mon_ndev = alloc_etherdev(sizeof(struct rtw_adapter));
2855 DBG_8723A(FUNC_ADPT_FMT " allocate ndev fail\n",
2856 FUNC_ADPT_ARG(padapter));
2861 mon_ndev->type = ARPHRD_IEEE80211_RADIOTAP;
2862 strncpy(mon_ndev->name, name, IFNAMSIZ);
2863 mon_ndev->name[IFNAMSIZ - 1] = 0;
2864 mon_ndev->destructor = rtw_ndev_destructor;
2866 mon_ndev->netdev_ops = &rtw_cfg80211_monitor_if_ops;
2869 mon_wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
2871 DBG_8723A(FUNC_ADPT_FMT " allocate mon_wdev fail\n",
2872 FUNC_ADPT_ARG(padapter));
2877 mon_wdev->wiphy = padapter->rtw_wdev->wiphy;
2878 mon_wdev->netdev = mon_ndev;
2879 mon_wdev->iftype = NL80211_IFTYPE_MONITOR;
2880 mon_ndev->ieee80211_ptr = mon_wdev;
2882 ret = register_netdevice(mon_ndev);
2887 *ndev = pwdev_priv->pmon_ndev = mon_ndev;
2888 memcpy(pwdev_priv->ifname_mon, name, IFNAMSIZ + 1);
2896 if (ret && mon_ndev) {
2897 free_netdev(mon_ndev);
2898 *ndev = mon_ndev = NULL;
2904 static struct wireless_dev *
2905 cfg80211_rtw_add_virtual_intf(struct wiphy *wiphy, const char *name,
2906 enum nl80211_iftype type, u32 *flags,
2907 struct vif_params *params)
2910 struct net_device *ndev = NULL;
2911 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
2913 DBG_8723A(FUNC_ADPT_FMT " wiphy:%s, name:%s, type:%d\n",
2914 FUNC_ADPT_ARG(padapter), wiphy_name(wiphy), name, type);
2917 case NL80211_IFTYPE_ADHOC:
2918 case NL80211_IFTYPE_AP_VLAN:
2919 case NL80211_IFTYPE_WDS:
2920 case NL80211_IFTYPE_MESH_POINT:
2923 case NL80211_IFTYPE_MONITOR:
2925 rtw_cfg80211_add_monitor_if(padapter, (char *)name, &ndev);
2928 case NL80211_IFTYPE_P2P_CLIENT:
2929 case NL80211_IFTYPE_STATION:
2933 case NL80211_IFTYPE_P2P_GO:
2934 case NL80211_IFTYPE_AP:
2939 DBG_8723A("Unsupported interface type\n");
2943 DBG_8723A(FUNC_ADPT_FMT " ndev:%p, ret:%d\n", FUNC_ADPT_ARG(padapter),
2946 return ndev ? ndev->ieee80211_ptr : ERR_PTR(ret);
2949 static int cfg80211_rtw_del_virtual_intf(struct wiphy *wiphy,
2950 struct wireless_dev *wdev)
2952 struct rtw_wdev_priv *pwdev_priv =
2953 (struct rtw_wdev_priv *)wiphy_priv(wiphy);
2954 struct net_device *ndev;
2955 ndev = wdev ? wdev->netdev : NULL;
2960 unregister_netdevice(ndev);
2962 if (ndev == pwdev_priv->pmon_ndev) {
2963 pwdev_priv->pmon_ndev = NULL;
2964 pwdev_priv->ifname_mon[0] = '\0';
2965 DBG_8723A(FUNC_NDEV_FMT " remove monitor interface\n",
2966 FUNC_NDEV_ARG(ndev));
2973 static int rtw_add_beacon(struct rtw_adapter *adapter, const u8 *head,
2974 size_t head_len, const u8 *tail, size_t tail_len)
2978 uint len, wps_ielen = 0;
2979 #ifdef CONFIG_8723AU_P2P
2981 u8 got_p2p_ie = false;
2983 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
2984 /* struct sta_priv *pstapriv = &padapter->stapriv; */
2986 DBG_8723A("%s beacon_head_len =%zu, beacon_tail_len =%zu\n",
2987 __func__, head_len, tail_len);
2989 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) != true)
2995 pbuf = kzalloc(head_len + tail_len, GFP_KERNEL);
2998 /* 24 = beacon header len. */
2999 memcpy(pbuf, (void *)head + 24, head_len - 24);
3000 memcpy(pbuf + head_len - 24, (void *)tail, tail_len);
3002 len = head_len + tail_len - 24;
3004 /* check wps ie if inclued */
3005 if (rtw_get_wps_ie23a
3006 (pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL,
3008 DBG_8723A("add bcn, wps_ielen =%d\n", wps_ielen);
3010 #ifdef CONFIG_8723AU_P2P
3011 /* check p2p ie if inclued */
3012 if (rtw_get_p2p_ie23a
3013 (pbuf + _FIXED_IE_LENGTH_, len - _FIXED_IE_LENGTH_, NULL,
3015 DBG_8723A("got p2p_ie, len =%d\n", p2p_ielen);
3020 /* pbss_network->IEs will not include p2p_ie, wfd ie */
3021 rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_,
3023 rtw_ies_remove_ie23a(pbuf, &len, _BEACON_IE_OFFSET_, _VENDOR_SPECIFIC_IE_,
3026 if (rtw_check_beacon_data23a(adapter, pbuf, len) == _SUCCESS) {
3027 #ifdef CONFIG_8723AU_P2P
3028 /* check p2p if enable */
3029 if (got_p2p_ie == true) {
3030 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
3031 struct wifidirect_info *pwdinfo = &adapter->wdinfo;
3033 if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
3034 DBG_8723A("Enable P2P function for the first "
3036 rtw_p2p_enable23a(adapter, P2P_ROLE_GO);
3037 wdev_to_priv(adapter->rtw_wdev)->p2p_enabled =
3040 del_timer_sync(&pwdinfo->find_phase_timer);
3041 del_timer_sync(&pwdinfo->
3042 restore_p2p_state_timer);
3043 del_timer_sync(&pwdinfo->pre_tx_scan_timer);
3045 DBG_8723A("enter GO Mode, p2p_ielen =%d\n",
3048 rtw_p2p_set_role(pwdinfo, P2P_ROLE_GO);
3049 rtw_p2p_set_state(pwdinfo, P2P_STATE_GONEGO_OK);
3050 pwdinfo->intent = 15;
3053 pwdinfo->operating_channel = pmlmeext->cur_channel;
3055 #endif /* CONFIG_8723AU_P2P */
3068 static int cfg80211_rtw_start_ap(struct wiphy *wiphy, struct net_device *ndev,
3069 struct cfg80211_ap_settings *settings)
3072 struct rtw_adapter *adapter = wiphy_to_adapter(wiphy);
3074 DBG_8723A(FUNC_NDEV_FMT " hidden_ssid:%d, auth_type:%d\n",
3075 FUNC_NDEV_ARG(ndev), settings->hidden_ssid,
3076 settings->auth_type);
3078 ret = rtw_add_beacon(adapter, settings->beacon.head,
3079 settings->beacon.head_len, settings->beacon.tail,
3080 settings->beacon.tail_len);
3082 adapter->mlmeextpriv.mlmext_info.hidden_ssid_mode =
3083 settings->hidden_ssid;
3085 if (settings->ssid && settings->ssid_len) {
3086 struct wlan_bssid_ex *pbss_network =
3087 &adapter->mlmepriv.cur_network.network;
3088 struct wlan_bssid_ex *pbss_network_ext =
3089 &adapter->mlmeextpriv.mlmext_info.network;
3092 DBG_8723A(FUNC_ADPT_FMT
3093 " ssid:(%s,%d), from ie:(%s,%d)\n",
3094 FUNC_ADPT_ARG(adapter), settings->ssid,
3095 (int)settings->ssid_len,
3096 pbss_network->Ssid.ssid,
3097 pbss_network->Ssid.ssid_len);
3099 memcpy(pbss_network->Ssid.ssid, (void *)settings->ssid,
3100 settings->ssid_len);
3101 pbss_network->Ssid.ssid_len = settings->ssid_len;
3102 memcpy(pbss_network_ext->Ssid.ssid, (void *)settings->ssid,
3103 settings->ssid_len);
3104 pbss_network_ext->Ssid.ssid_len = settings->ssid_len;
3107 DBG_8723A(FUNC_ADPT_FMT
3108 " after ssid:(%s,%d), (%s,%d)\n",
3109 FUNC_ADPT_ARG(adapter),
3110 pbss_network->Ssid.ssid,
3111 pbss_network->Ssid.ssid_len,
3112 pbss_network_ext->Ssid.ssid,
3113 pbss_network_ext->Ssid.ssid_len);
3119 static int cfg80211_rtw_change_beacon(struct wiphy *wiphy,
3120 struct net_device *ndev,
3121 struct cfg80211_beacon_data *info)
3124 struct rtw_adapter *adapter = wiphy_to_adapter(wiphy);
3126 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3128 ret = rtw_add_beacon(adapter, info->head, info->head_len, info->tail,
3134 static int cfg80211_rtw_stop_ap(struct wiphy *wiphy, struct net_device *ndev)
3136 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3140 static int cfg80211_rtw_add_station(struct wiphy *wiphy,
3141 struct net_device *ndev, u8 *mac,
3142 struct station_parameters *params)
3144 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3149 static int cfg80211_rtw_del_station(struct wiphy *wiphy,
3150 struct net_device *ndev, u8 *mac)
3153 struct list_head *phead, *plist, *ptmp;
3155 struct sta_info *psta;
3156 struct rtw_adapter *padapter = netdev_priv(ndev);
3157 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3158 struct sta_priv *pstapriv = &padapter->stapriv;
3160 DBG_8723A("+" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3162 if (check_fwstate(pmlmepriv, (_FW_LINKED | WIFI_AP_STATE)) != true) {
3163 DBG_8723A("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n",
3169 DBG_8723A("flush all sta, and cam_entry\n");
3171 flush_all_cam_entry23a(padapter); /* clear CAM */
3173 ret = rtw_sta_flush23a(padapter);
3178 DBG_8723A("free sta macaddr =" MAC_FMT "\n", MAC_ARG(mac));
3180 if (is_broadcast_ether_addr(mac))
3183 spin_lock_bh(&pstapriv->asoc_list_lock);
3185 phead = &pstapriv->asoc_list;
3187 /* check asoc_queue */
3188 list_for_each_safe(plist, ptmp, phead) {
3189 psta = container_of(plist, struct sta_info, asoc_list);
3191 if (!memcmp(mac, psta->hwaddr, ETH_ALEN)) {
3192 if (psta->dot8021xalg == 1 &&
3193 psta->bpairwise_key_installed == false) {
3194 DBG_8723A("%s, sta's dot8021xalg = 1 and "
3195 "key_installed = false\n", __func__);
3197 DBG_8723A("free psta =%p, aid =%d\n", psta,
3200 list_del_init(&psta->asoc_list);
3201 pstapriv->asoc_list_cnt--;
3203 /* spin_unlock_bh(&pstapriv->asoc_list_lock); */
3205 ap_free_sta23a(padapter, psta, true,
3206 WLAN_REASON_DEAUTH_LEAVING);
3207 /* spin_lock_bh(&pstapriv->asoc_list_lock); */
3216 spin_unlock_bh(&pstapriv->asoc_list_lock);
3218 associated_clients_update23a(padapter, updated);
3220 DBG_8723A("-" FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3225 static int cfg80211_rtw_change_station(struct wiphy *wiphy,
3226 struct net_device *ndev, u8 *mac,
3227 struct station_parameters *params)
3229 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3233 static int cfg80211_rtw_dump_station(struct wiphy *wiphy,
3234 struct net_device *ndev, int idx, u8 *mac,
3235 struct station_info *sinfo)
3237 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3239 /* TODO: dump scanned queue */
3244 static int cfg80211_rtw_change_bss(struct wiphy *wiphy, struct net_device *ndev,
3245 struct bss_parameters *params)
3247 DBG_8723A(FUNC_NDEV_FMT "\n", FUNC_NDEV_ARG(ndev));
3250 #endif /* CONFIG_8723AU_AP_MODE */
3252 void rtw_cfg80211_rx_action_p2p(struct rtw_adapter *padapter, u8 *pmgmt_frame,
3255 #ifdef CONFIG_8723AU_P2P
3260 u8 category, action;
3262 channel = rtw_get_oper_ch23a(padapter);
3264 DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
3265 #ifdef CONFIG_8723AU_P2P
3266 type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false);
3270 rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action);
3271 DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action);
3273 #ifdef CONFIG_8723AU_P2P
3276 if (channel <= RTW_CH_MAX_2G_CHANNEL)
3277 freq = ieee80211_channel_to_frequency(channel,
3278 IEEE80211_BAND_2GHZ);
3280 freq = ieee80211_channel_to_frequency(channel,
3281 IEEE80211_BAND_5GHZ);
3283 rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len,
3287 void rtw_cfg80211_rx_p2p_action_public(struct rtw_adapter *padapter,
3288 u8 *pmgmt_frame, uint frame_len)
3290 #ifdef CONFIG_8723AU_P2P
3295 u8 category, action;
3297 channel = rtw_get_oper_ch23a(padapter);
3299 DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
3300 #ifdef CONFIG_8723AU_P2P
3301 type = rtw_p2p_check_frames(padapter, pmgmt_frame, frame_len, false);
3304 case P2P_GO_NEGO_CONF:
3305 case P2P_PROVISION_DISC_RESP:
3306 rtw_clear_scan_deny(padapter);
3311 rtw_action_frame_parse23a(pmgmt_frame, frame_len, &category, &action);
3312 DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category, action);
3314 #ifdef CONFIG_8723AU_P2P
3317 if (channel <= RTW_CH_MAX_2G_CHANNEL)
3318 freq = ieee80211_channel_to_frequency(channel,
3319 IEEE80211_BAND_2GHZ);
3321 freq = ieee80211_channel_to_frequency(channel,
3322 IEEE80211_BAND_5GHZ);
3324 rtw_cfg80211_rx_mgmt(padapter, freq, 0, pmgmt_frame, frame_len,
3328 void rtw_cfg80211_rx_action(struct rtw_adapter *adapter, u8 *frame,
3329 uint frame_len, const char *msg)
3333 u8 category, action;
3335 channel = rtw_get_oper_ch23a(adapter);
3337 rtw_action_frame_parse23a(frame, frame_len, &category, &action);
3339 DBG_8723A("RTW_Rx:cur_ch =%d\n", channel);
3341 DBG_8723A("RTW_Rx:%s\n", msg);
3343 DBG_8723A("RTW_Rx:category(%u), action(%u)\n", category,
3346 if (channel <= RTW_CH_MAX_2G_CHANNEL)
3347 freq = ieee80211_channel_to_frequency(channel,
3348 IEEE80211_BAND_2GHZ);
3350 freq = ieee80211_channel_to_frequency(channel,
3351 IEEE80211_BAND_5GHZ);
3353 rtw_cfg80211_rx_mgmt(adapter, freq, 0, frame, frame_len, GFP_ATOMIC);
3356 #ifdef CONFIG_8723AU_P2P
3357 void rtw_cfg80211_issue_p2p_provision_request23a(struct rtw_adapter *padapter,
3358 const u8 *buf, size_t len)
3360 u16 wps_devicepassword_id = 0x0000;
3361 uint wps_devicepassword_id_len = 0;
3362 u8 wpsie[255] = { 0x00 }, p2p_ie[255] = { 0x00 };
3365 u32 devinfo_contentlen = 0;
3366 u8 devinfo_content[64] = { 0x00 };
3368 uint capability_len = 0;
3370 unsigned char category = WLAN_CATEGORY_PUBLIC;
3371 u8 action = P2P_PUB_ACTION_ACTION;
3373 u32 p2poui = cpu_to_be32(P2POUI);
3374 u8 oui_subtype = P2P_PROVISION_DISC_REQ;
3376 #ifdef CONFIG_8723AU_P2P
3378 #endif /* CONFIG_8723AU_P2P */
3380 struct xmit_frame *pmgntframe;
3381 struct pkt_attrib *pattrib;
3382 unsigned char *pframe;
3383 struct ieee80211_hdr *pwlanhdr, *hdr;
3384 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3385 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
3387 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
3389 (unsigned char *)(buf + sizeof(struct ieee80211_hdr_3addr));
3390 size_t frame_body_len = len - sizeof(struct ieee80211_hdr_3addr);
3392 DBG_8723A("[%s] In\n", __func__);
3394 hdr = (struct ieee80211_hdr *)buf;
3395 /* prepare for building provision_request frame */
3396 memcpy(pwdinfo->tx_prov_disc_info.peerIFAddr, hdr->addr1, ETH_ALEN);
3397 memcpy(pwdinfo->tx_prov_disc_info.peerDevAddr, hdr->addr1, ETH_ALEN);
3399 pwdinfo->tx_prov_disc_info.wps_config_method_request =
3402 rtw_get_wps_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
3403 frame_body_len - _PUBLIC_ACTION_IE_OFFSET_, wpsie,
3405 rtw_get_wps_attr_content23a(wpsie, wpsielen, WPS_ATTR_DEVICE_PWID,
3406 (u8 *)&wps_devicepassword_id,
3407 &wps_devicepassword_id_len);
3408 wps_devicepassword_id = be16_to_cpu(wps_devicepassword_id);
3410 switch (wps_devicepassword_id) {
3412 pwdinfo->tx_prov_disc_info.wps_config_method_request =
3415 case WPS_DPID_USER_SPEC:
3416 pwdinfo->tx_prov_disc_info.wps_config_method_request =
3419 case WPS_DPID_MACHINE_SPEC:
3421 case WPS_DPID_REKEY:
3424 pwdinfo->tx_prov_disc_info.wps_config_method_request =
3427 case WPS_DPID_REGISTRAR_SPEC:
3428 pwdinfo->tx_prov_disc_info.wps_config_method_request =
3435 if (rtw_get_p2p_ie23a(frame_body + _PUBLIC_ACTION_IE_OFFSET_,
3436 frame_body_len - _PUBLIC_ACTION_IE_OFFSET_,
3437 p2p_ie, &p2p_ielen)) {
3438 rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
3439 P2P_ATTR_DEVICE_INFO, devinfo_content,
3440 &devinfo_contentlen);
3441 rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen, P2P_ATTR_CAPABILITY,
3442 (u8 *)&capability, &capability_len);
3445 /* start to build provision_request frame */
3446 memset(wpsie, 0, sizeof(wpsie));
3447 memset(p2p_ie, 0, sizeof(p2p_ie));
3450 pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
3451 if (pmgntframe == NULL)
3453 /* update attribute */
3454 pattrib = &pmgntframe->attrib;
3455 update_mgntframe_attrib23a(padapter, pattrib);
3457 memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
3459 pframe = (u8 *) (pmgntframe->buf_addr) + TXDESC_OFFSET;
3460 pwlanhdr = (struct ieee80211_hdr *)pframe;
3462 pwlanhdr->frame_control = 0;
3464 memcpy(pwlanhdr->addr1, pwdinfo->tx_prov_disc_info.peerDevAddr,
3466 memcpy(pwlanhdr->addr2, myid(&padapter->eeprompriv), ETH_ALEN);
3467 memcpy(pwlanhdr->addr3, pwdinfo->tx_prov_disc_info.peerDevAddr,
3470 SetSeqNum(pwlanhdr, pmlmeext->mgnt_seq);
3471 pmlmeext->mgnt_seq++;
3472 SetFrameSubType(pframe, WIFI_ACTION);
3474 pframe += sizeof(struct ieee80211_hdr_3addr);
3475 pattrib->pktlen = sizeof(struct ieee80211_hdr_3addr);
3477 pframe = rtw_set_fixed_ie23a(pframe, 1, &category, &pattrib->pktlen);
3478 pframe = rtw_set_fixed_ie23a(pframe, 1, &action, &pattrib->pktlen);
3479 pframe = rtw_set_fixed_ie23a(pframe, 4, (unsigned char *)&p2poui,
3481 pframe = rtw_set_fixed_ie23a(pframe, 1, &oui_subtype, &pattrib->pktlen);
3482 pframe = rtw_set_fixed_ie23a(pframe, 1, &dialogToken, &pattrib->pktlen);
3484 /* build_prov_disc_request_p2p_ie23a */
3487 p2p_ie[p2pielen++] = 0x50;
3488 p2p_ie[p2pielen++] = 0x6F;
3489 p2p_ie[p2pielen++] = 0x9A;
3490 p2p_ie[p2pielen++] = 0x09; /* WFA P2P v1.0 */
3492 /* Commented by Albert 20110301 */
3493 /* According to the P2P Specification, the provision discovery request frame should contain 3 P2P attributes */
3494 /* 1. P2P Capability */
3495 /* 2. Device Info */
3496 /* 3. Group ID ( When joining an operating P2P Group ) */
3498 /* P2P Capability ATTR */
3500 p2p_ie[p2pielen++] = P2P_ATTR_CAPABILITY;
3503 put_unaligned_le16(0x0002, p2p_ie + p2pielen);
3507 /* Device Capability Bitmap, 1 byte */
3508 /* Group Capability Bitmap, 1 byte */
3509 memcpy(p2p_ie + p2pielen, &capability, 2);
3512 /* Device Info ATTR */
3514 p2p_ie[p2pielen++] = P2P_ATTR_DEVICE_INFO;
3517 put_unaligned_le16(devinfo_contentlen, p2p_ie + p2pielen);
3521 memcpy(p2p_ie + p2pielen, devinfo_content, devinfo_contentlen);
3522 p2pielen += devinfo_contentlen;
3524 pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, p2pielen,
3525 (unsigned char *)p2p_ie, &p2p_ielen);
3526 pattrib->pktlen += p2p_ielen;
3530 *(u32 *)(wpsie) = cpu_to_be32(WPSOUI);
3535 *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_VER1);
3539 *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0001);
3543 wpsie[wpsielen++] = WPS_VERSION_1; /* Version 1.0 */
3547 *(u16 *)(wpsie + wpsielen) = cpu_to_be16(WPS_ATTR_CONF_METHOD);
3551 *(u16 *)(wpsie + wpsielen) = cpu_to_be16(0x0002);
3555 *(u16 *)(wpsie + wpsielen) =
3556 cpu_to_be16(pwdinfo->tx_prov_disc_info.wps_config_method_request);
3559 pframe = rtw_set_ie23a(pframe, _VENDOR_SPECIFIC_IE_, wpsielen,
3560 (unsigned char *)wpsie, &pattrib->pktlen);
3562 #ifdef CONFIG_8723AU_P2P
3563 wfdielen = build_provdisc_req_wfd_ie(pwdinfo, pframe);
3565 pattrib->pktlen += wfdielen;
3566 #endif /* CONFIG_8723AU_P2P */
3568 pattrib->last_txcmdsz = pattrib->pktlen;
3570 /* dump_mgntframe23a(padapter, pmgntframe); */
3571 if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS)
3572 DBG_8723A("%s, ack to\n", __func__);
3575 static s32 cfg80211_rtw_remain_on_channel(struct wiphy *wiphy,
3576 struct wireless_dev *wdev,
3577 struct ieee80211_channel *channel,
3578 unsigned int duration, u64 *cookie)
3581 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
3582 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
3583 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
3584 struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
3585 &padapter->cfg80211_wdinfo;
3587 (u8) ieee80211_frequency_to_channel(channel->center_freq);
3588 u8 ready_on_channel = false;
3590 DBG_8723A(FUNC_ADPT_FMT " ch:%u duration:%d\n", FUNC_ADPT_ARG(padapter),
3591 remain_ch, duration);
3593 if (pcfg80211_wdinfo->is_ro_ch == true) {
3594 DBG_8723A("%s, cancel ro ch timer\n", __func__);
3596 del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
3598 #ifdef CONFIG_8723AU_P2P
3599 p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK);
3603 pcfg80211_wdinfo->is_ro_ch = true;
3605 if (_FAIL == rtw_pwr_wakeup(padapter)) {
3610 memcpy(&pcfg80211_wdinfo->remain_on_ch_channel, channel,
3611 sizeof(struct ieee80211_channel));
3612 pcfg80211_wdinfo->remain_on_ch_cookie = *cookie;
3614 rtw_scan_abort23a(padapter);
3615 if (rtw_p2p_chk_state(pwdinfo, P2P_STATE_NONE)) {
3616 rtw_p2p_enable23a(padapter, P2P_ROLE_DEVICE);
3617 wdev_to_priv(padapter->rtw_wdev)->p2p_enabled = true;
3619 rtw_p2p_set_pre_state(pwdinfo, rtw_p2p_state(pwdinfo));
3620 #ifdef CONFIG_DEBUG_CFG80211
3621 DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
3622 rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
3626 rtw_p2p_set_state(pwdinfo, P2P_STATE_LISTEN);
3629 duration = duration * 3; /* extend from exper. */
3631 pcfg80211_wdinfo->restore_channel = pmlmeext->cur_channel;
3633 if (rtw_ch_set_search_ch23a(pmlmeext->channel_set, remain_ch) >= 0) {
3634 if (remain_ch != pmlmeext->cur_channel) {
3635 ready_on_channel = true;
3638 DBG_8723A("%s remain_ch:%u not in channel plan!!!!\n",
3639 __func__, remain_ch);
3642 /* call this after other things have been done */
3643 if (ready_on_channel == true) {
3644 if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED)) {
3645 pmlmeext->cur_channel = remain_ch;
3647 set_channel_bwmode23a(padapter, remain_ch,
3648 HAL_PRIME_CHNL_OFFSET_DONT_CARE,
3649 HT_CHANNEL_WIDTH_20);
3652 DBG_8723A("%s, set ro ch timer, duration =%d\n", __func__, duration);
3653 mod_timer(&pcfg80211_wdinfo->remain_on_ch_timer,
3654 jiffies + msecs_to_jiffies(duration));
3656 rtw_cfg80211_ready_on_channel(padapter, *cookie, channel, channel_type,
3657 duration, GFP_KERNEL);
3659 pwdinfo->listen_channel = pmlmeext->cur_channel;
3663 pcfg80211_wdinfo->is_ro_ch = false;
3668 static s32 cfg80211_rtw_cancel_remain_on_channel(struct wiphy *wiphy,
3669 struct wireless_dev *wdev,
3673 struct rtw_adapter *padapter = wiphy_to_adapter(wiphy);
3674 struct wifidirect_info *pwdinfo = &padapter->wdinfo;
3675 struct cfg80211_wifidirect_info *pcfg80211_wdinfo =
3676 &padapter->cfg80211_wdinfo;
3678 DBG_8723A(FUNC_ADPT_FMT "\n", FUNC_ADPT_ARG(padapter));
3680 if (pcfg80211_wdinfo->is_ro_ch == true) {
3681 DBG_8723A("%s, cancel ro ch timer\n", __func__);
3682 del_timer_sync(&padapter->cfg80211_wdinfo.remain_on_ch_timer);
3683 #ifdef CONFIG_8723AU_P2P
3684 p2p_protocol_wk_hdl23a(padapter, P2P_RO_CH_WK);
3688 rtw_p2p_set_state(pwdinfo, rtw_p2p_pre_state(pwdinfo));
3689 #ifdef CONFIG_DEBUG_CFG80211
3690 DBG_8723A("%s, role =%d, p2p_state =%d\n", __func__,
3691 rtw_p2p_role(pwdinfo), rtw_p2p_state(pwdinfo));
3693 pcfg80211_wdinfo->is_ro_ch = false;
3698 #endif /* CONFIG_8723AU_P2P */
3700 static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter *padapter, u8 tx_ch,
3701 const u8 *buf, size_t len)
3703 struct xmit_frame *pmgntframe;
3704 struct pkt_attrib *pattrib;
3705 unsigned char *pframe;
3708 struct ieee80211_hdr *pwlanhdr;
3709 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3710 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
3711 /* struct cfg80211_wifidirect_info *pcfg80211_wdinfo = &padapter->cfg80211_wdinfo; */
3713 if (_FAIL == rtw_pwr_wakeup(padapter)) {
3718 rtw_set_scan_deny(padapter, 1000);
3720 rtw_scan_abort23a(padapter);
3722 if (tx_ch != rtw_get_oper_ch23a(padapter)) {
3723 if (!check_fwstate(&padapter->mlmepriv, _FW_LINKED))
3724 pmlmeext->cur_channel = tx_ch;
3725 set_channel_bwmode23a(padapter, tx_ch,
3726 HAL_PRIME_CHNL_OFFSET_DONT_CARE,
3727 HT_CHANNEL_WIDTH_20);
3730 /* starting alloc mgmt frame to dump it */
3731 pmgntframe = alloc_mgtxmitframe23a(pxmitpriv);
3732 if (pmgntframe == NULL) {
3733 /* ret = -ENOMEM; */
3738 /* update attribute */
3739 pattrib = &pmgntframe->attrib;
3740 update_mgntframe_attrib23a(padapter, pattrib);
3741 pattrib->retry_ctrl = false;
3743 memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
3745 pframe = (u8 *) (pmgntframe->buf_addr) + TXDESC_OFFSET;
3747 memcpy(pframe, (void *)buf, len);
3748 pattrib->pktlen = len;
3750 pwlanhdr = (struct ieee80211_hdr *)pframe;
3751 /* update seq number */
3752 pmlmeext->mgnt_seq = le16_to_cpu(pwlanhdr->seq_ctrl) >> 4;
3753 pattrib->seqnum = pmlmeext->mgnt_seq;
3754 pmlmeext->mgnt_seq++;
3756 #ifdef CONFIG_8723AU_P2P
3758 struct wifi_display_info *pwfd_info;
3760 pwfd_info = padapter->wdinfo.wfd_info;
3762 if (true == pwfd_info->wfd_enable) {
3763 rtw_append_wfd_ie(padapter, pframe, &pattrib->pktlen);
3766 #endif /* CONFIG_8723AU_P2P */
3768 pattrib->last_txcmdsz = pattrib->pktlen;
3770 if (dump_mgntframe23a_and_wait_ack23a(padapter, pmgntframe) != _SUCCESS) {
3774 #ifdef CONFIG_DEBUG_CFG80211
3775 DBG_8723A("%s, ack == _FAIL\n", __func__);
3778 #ifdef CONFIG_DEBUG_CFG80211
3779 DBG_8723A("%s, ack =%d, ok!\n", __func__, ack);
3786 #ifdef CONFIG_DEBUG_CFG80211
3787 DBG_8723A("%s, ret =%d\n", __func__, ret);
3793 static int cfg80211_rtw_mgmt_tx(struct wiphy *wiphy, struct wireless_dev *wdev,
3794 #if (LINUX_VERSION_CODE < KERNEL_VERSION(3, 14, 0))
3795 struct ieee80211_channel *chan,
3798 const u8 *buf, size_t len,
3799 bool no_cck, bool dont_wait_for_ack,
3801 struct cfg80211_mgmt_tx_params *params,
3805 struct rtw_adapter *padapter =
3806 (struct rtw_adapter *)wiphy_to_adapter(wiphy);
3807 struct rtw_wdev_priv *pwdev_priv = wdev_to_priv(padapter->rtw_wdev);
3810 u32 dump_limit = RTW_MAX_MGMT_TX_CNT;
3813 u8 category, action;
3815 unsigned long start = jiffies;
3816 #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 14, 0))
3817 size_t len = params->len;
3818 struct ieee80211_channel *chan = params->chan;
3819 const u8 *buf = params->buf;
3821 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)buf;
3822 u8 tx_ch = (u8) ieee80211_frequency_to_channel(chan->center_freq);
3824 /* cookie generation */
3825 *cookie = (unsigned long)buf;
3827 #ifdef CONFIG_DEBUG_CFG80211
3828 DBG_8723A(FUNC_ADPT_FMT " len =%zu, ch =%d"
3829 "\n", FUNC_ADPT_ARG(padapter), len, tx_ch);
3830 #endif /* CONFIG_DEBUG_CFG80211 */
3832 /* indicate ack before issue frame to avoid racing with rsp frame */
3833 rtw_cfg80211_mgmt_tx_status(padapter, *cookie, buf, len, ack,
3836 if (rtw_action_frame_parse23a(buf, len, &category, &action) == false) {
3837 DBG_8723A(FUNC_ADPT_FMT " frame_control:0x%x\n",
3838 FUNC_ADPT_ARG(padapter),
3839 le16_to_cpu(hdr->frame_control));
3843 DBG_8723A("RTW_Tx:tx_ch =%d, da =" MAC_FMT "\n", tx_ch,
3844 MAC_ARG(hdr->addr1));
3845 #ifdef CONFIG_8723AU_P2P
3846 type = rtw_p2p_check_frames(padapter, buf, len, true);
3850 if (category == WLAN_CATEGORY_PUBLIC)
3851 DBG_8723A("RTW_Tx:%s\n", action_public_str23a(action));
3853 DBG_8723A("RTW_Tx:category(%u), action(%u)\n",
3856 #ifdef CONFIG_8723AU_P2P
3861 tx_ret = _cfg80211_rtw_mgmt_tx(padapter, tx_ch, buf, len);
3862 } while (dump_cnt < dump_limit && tx_ret != _SUCCESS);
3864 if (tx_ret != _SUCCESS || dump_cnt > 1) {
3865 DBG_8723A(FUNC_ADPT_FMT " %s (%d/%d) in %d ms\n",
3866 FUNC_ADPT_ARG(padapter),
3867 tx_ret == _SUCCESS ? "OK" : "FAIL", dump_cnt,
3868 dump_limit, jiffies_to_msecs(jiffies - start));
3872 case P2P_GO_NEGO_CONF:
3873 rtw_clear_scan_deny(padapter);
3875 case P2P_INVIT_RESP:
3876 if (pwdev_priv->invit_info.flags & BIT(0)
3877 && pwdev_priv->invit_info.status == 0) {
3878 DBG_8723A(FUNC_ADPT_FMT " agree with invitation of "
3879 "persistent group\n",
3880 FUNC_ADPT_ARG(padapter));
3881 rtw_set_scan_deny(padapter, 5000);
3882 rtw_pwr_wakeup_ex(padapter, 5000);
3883 rtw_clear_scan_deny(padapter);
3892 static void cfg80211_rtw_mgmt_frame_register(struct wiphy *wiphy,
3893 struct wireless_dev *wdev,
3894 u16 frame_type, bool reg)
3897 #ifdef CONFIG_DEBUG_CFG80211
3898 DBG_8723A(FUNC_ADPT_FMT " frame_type:%x, reg:%d\n",
3899 FUNC_ADPT_ARG(adapter), frame_type, reg);
3902 if (frame_type != (IEEE80211_FTYPE_MGMT | IEEE80211_STYPE_PROBE_REQ))
3908 static int rtw_cfg80211_set_beacon_wpsp2pie(struct net_device *ndev, char *buf,
3914 #ifdef CONFIG_8723AU_P2P
3919 #ifdef CONFIG_8723AU_AP_MODE
3920 u8 wps_oui[8] = { 0x0, 0x50, 0xf2, 0x04 };
3922 struct rtw_adapter *padapter = netdev_priv(ndev);
3923 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3924 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
3926 DBG_8723A(FUNC_NDEV_FMT " ielen =%d\n", FUNC_NDEV_ARG(ndev), len);
3929 wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
3931 #ifdef CONFIG_DEBUG_CFG80211
3932 DBG_8723A("bcn_wps_ielen =%d\n", wps_ielen);
3935 if (pmlmepriv->wps_beacon_ie) {
3936 pmlmepriv->wps_beacon_ie_len = 0;
3937 kfree(pmlmepriv->wps_beacon_ie);
3938 pmlmepriv->wps_beacon_ie = NULL;
3941 pmlmepriv->wps_beacon_ie =
3942 kmalloc(wps_ielen, GFP_KERNEL);
3943 if (pmlmepriv->wps_beacon_ie == NULL) {
3944 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
3945 __func__, __LINE__);
3948 memcpy(pmlmepriv->wps_beacon_ie, wps_ie, wps_ielen);
3949 pmlmepriv->wps_beacon_ie_len = wps_ielen;
3951 #ifdef CONFIG_8723AU_AP_MODE
3952 update_beacon23a(padapter, _VENDOR_SPECIFIC_IE_, wps_oui,
3956 #ifdef CONFIG_8723AU_P2P
3957 p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
3959 #ifdef CONFIG_DEBUG_CFG80211
3960 DBG_8723A("bcn_p2p_ielen =%d\n", p2p_ielen);
3963 if (pmlmepriv->p2p_beacon_ie) {
3964 pmlmepriv->p2p_beacon_ie_len = 0;
3965 kfree(pmlmepriv->p2p_beacon_ie);
3966 pmlmepriv->p2p_beacon_ie = NULL;
3969 pmlmepriv->p2p_beacon_ie =
3970 kmalloc(p2p_ielen, GFP_KERNEL);
3971 if (pmlmepriv->p2p_beacon_ie == NULL) {
3972 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
3973 __func__, __LINE__);
3977 memcpy(pmlmepriv->p2p_beacon_ie, p2p_ie, p2p_ielen);
3978 pmlmepriv->p2p_beacon_ie_len = p2p_ielen;
3980 #endif /* CONFIG_8723AU_P2P */
3982 /* buf += p2p_ielen; */
3983 /* len -= p2p_ielen; */
3985 #ifdef CONFIG_8723AU_P2P
3986 if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
3987 #ifdef CONFIG_DEBUG_CFG80211
3988 DBG_8723A("bcn_wfd_ielen =%d\n", wfd_ielen);
3991 if (pmlmepriv->wfd_beacon_ie) {
3992 pmlmepriv->wfd_beacon_ie_len = 0;
3993 kfree(pmlmepriv->wfd_beacon_ie);
3994 pmlmepriv->wfd_beacon_ie = NULL;
3997 pmlmepriv->wfd_beacon_ie =
3998 kmalloc(wfd_ielen, GFP_KERNEL);
3999 if (pmlmepriv->wfd_beacon_ie == NULL) {
4000 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
4001 __func__, __LINE__);
4005 rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_beacon_ie,
4006 &pmlmepriv->wfd_beacon_ie_len);
4008 #endif /* CONFIG_8723AU_P2P */
4010 pmlmeext->bstart_bss = true;
4017 static int rtw_cfg80211_set_probe_resp_wpsp2pie(struct net_device *net,
4020 struct rtw_adapter *padapter = netdev_priv(net);
4021 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
4022 #ifdef CONFIG_8723AU_P2P
4032 wps_ie = rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen);
4034 uint attr_contentlen = 0;
4035 u16 uconfig_method, *puconfig_method = NULL;
4037 if (pmlmepriv->wps_probe_resp_ie) {
4038 pmlmepriv->wps_probe_resp_ie_len = 0;
4039 kfree(pmlmepriv->wps_probe_resp_ie);
4040 pmlmepriv->wps_probe_resp_ie = NULL;
4043 pmlmepriv->wps_probe_resp_ie =
4044 kmalloc(wps_ielen, GFP_KERNEL);
4045 if (pmlmepriv->wps_probe_resp_ie == NULL) {
4046 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
4047 __func__, __LINE__);
4052 /* add PUSH_BUTTON config_method by driver self in
4053 wpsie of probe_resp at GO Mode */
4054 puconfig_method = (u16 *)rtw_get_wps_attr_content23a(wps_ie, wps_ielen,
4055 WPS_ATTR_CONF_METHOD,
4058 if (puconfig_method) {
4059 uconfig_method = WPS_CM_PUSH_BUTTON;
4060 uconfig_method = cpu_to_be16(uconfig_method);
4062 *puconfig_method |= uconfig_method;
4065 memcpy(pmlmepriv->wps_probe_resp_ie, wps_ie, wps_ielen);
4066 pmlmepriv->wps_probe_resp_ie_len = wps_ielen;
4070 /* buf += wps_ielen; */
4071 /* len -= wps_ielen; */
4073 #ifdef CONFIG_8723AU_P2P
4074 p2p_ie = rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen);
4077 u32 attr_contentlen = 0;
4080 #ifdef CONFIG_DEBUG_CFG80211
4081 DBG_8723A("probe_resp_p2p_ielen =%d\n", p2p_ielen);
4084 /* Check P2P Capability ATTR */
4085 if (rtw_get_p2p_attr23a_content(p2p_ie, p2p_ielen,
4086 P2P_ATTR_CAPABILITY,
4088 (uint *) &attr_contentlen)) {
4090 /* DBG_8723A( "[%s] Got P2P Capability Attr!!\n", __func__ ); */
4091 cap_attr = le16_to_cpu(cap_attr);
4092 grp_cap = (u8) ((cap_attr >> 8) & 0xff);
4094 is_GO = (grp_cap & BIT(0)) ? true : false;
4098 ("Got P2P Capability Attr, grp_cap"
4099 "= 0x%x, is_GO\n", grp_cap);
4102 if (is_GO == false) {
4103 if (pmlmepriv->p2p_probe_resp_ie) {
4104 pmlmepriv->p2p_probe_resp_ie_len = 0;
4105 kfree(pmlmepriv->p2p_probe_resp_ie);
4106 pmlmepriv->p2p_probe_resp_ie = NULL;
4109 pmlmepriv->p2p_probe_resp_ie =
4110 kmalloc(p2p_ielen, GFP_KERNEL);
4111 if (pmlmepriv->p2p_probe_resp_ie == NULL) {
4112 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
4113 __func__, __LINE__);
4116 memcpy(pmlmepriv->p2p_probe_resp_ie, p2p_ie,
4118 pmlmepriv->p2p_probe_resp_ie_len = p2p_ielen;
4120 if (pmlmepriv->p2p_go_probe_resp_ie) {
4121 pmlmepriv->p2p_go_probe_resp_ie_len = 0;
4122 kfree(pmlmepriv->p2p_go_probe_resp_ie);
4123 pmlmepriv->p2p_go_probe_resp_ie = NULL;
4126 pmlmepriv->p2p_go_probe_resp_ie =
4127 kmalloc(p2p_ielen, GFP_KERNEL);
4128 if (pmlmepriv->p2p_go_probe_resp_ie == NULL) {
4129 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
4130 __func__, __LINE__);
4134 memcpy(pmlmepriv->p2p_go_probe_resp_ie,
4136 pmlmepriv->p2p_go_probe_resp_ie_len = p2p_ielen;
4139 #endif /* CONFIG_8723AU_P2P */
4141 /* buf += p2p_ielen; */
4142 /* len -= p2p_ielen; */
4144 #ifdef CONFIG_8723AU_P2P
4145 if (rtw_get_wfd_ie(buf, len, NULL, &wfd_ielen)) {
4146 #ifdef CONFIG_DEBUG_CFG80211
4147 DBG_8723A("probe_resp_wfd_ielen =%d\n", wfd_ielen);
4150 if (pmlmepriv->wfd_probe_resp_ie) {
4151 pmlmepriv->wfd_probe_resp_ie_len = 0;
4152 kfree(pmlmepriv->wfd_probe_resp_ie);
4153 pmlmepriv->wfd_probe_resp_ie = NULL;
4156 pmlmepriv->wfd_probe_resp_ie =
4157 kmalloc(wfd_ielen, GFP_KERNEL);
4158 if (pmlmepriv->wfd_probe_resp_ie == NULL) {
4159 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
4160 __func__, __LINE__);
4164 rtw_get_wfd_ie(buf, len, pmlmepriv->wfd_probe_resp_ie,
4165 &pmlmepriv->wfd_probe_resp_ie_len);
4167 #endif /* CONFIG_8723AU_P2P */
4173 static int rtw_cfg80211_set_assoc_resp_wpsp2pie(struct net_device *net,
4177 struct rtw_adapter *padapter = netdev_priv(net);
4178 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
4180 DBG_8723A("%s, ielen =%d\n", __func__, len);
4183 if (pmlmepriv->wps_assoc_resp_ie) {
4184 pmlmepriv->wps_assoc_resp_ie_len = 0;
4185 kfree(pmlmepriv->wps_assoc_resp_ie);
4186 pmlmepriv->wps_assoc_resp_ie = NULL;
4189 pmlmepriv->wps_assoc_resp_ie = kmalloc(len, GFP_KERNEL);
4190 if (pmlmepriv->wps_assoc_resp_ie == NULL) {
4191 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
4192 __func__, __LINE__);
4196 memcpy(pmlmepriv->wps_assoc_resp_ie, buf, len);
4197 pmlmepriv->wps_assoc_resp_ie_len = len;
4203 int rtw_cfg80211_set_mgnt_wpsp2pie(struct net_device *net, char *buf, int len,
4208 #ifdef CONFIG_8723AU_P2P
4212 #ifdef CONFIG_DEBUG_CFG80211
4213 DBG_8723A("%s, ielen =%d\n", __func__, len);
4216 if ((rtw_get_wps_ie23a(buf, len, NULL, &wps_ielen) && (wps_ielen > 0))
4217 #ifdef CONFIG_8723AU_P2P
4218 || (rtw_get_p2p_ie23a(buf, len, NULL, &p2p_ielen) && (p2p_ielen > 0))
4223 case 0x1: /* BEACON */
4225 rtw_cfg80211_set_beacon_wpsp2pie(net, buf,
4228 case 0x2: /* PROBE_RESP */
4230 rtw_cfg80211_set_probe_resp_wpsp2pie(net,
4234 case 0x4: /* ASSOC_RESP */
4236 rtw_cfg80211_set_assoc_resp_wpsp2pie(net,
4248 static struct cfg80211_ops rtw_cfg80211_ops = {
4249 .change_virtual_intf = cfg80211_rtw_change_iface,
4250 .add_key = cfg80211_rtw_add_key,
4251 .get_key = cfg80211_rtw_get_key,
4252 .del_key = cfg80211_rtw_del_key,
4253 .set_default_key = cfg80211_rtw_set_default_key,
4254 .get_station = cfg80211_rtw_get_station,
4255 .scan = cfg80211_rtw_scan,
4256 .set_wiphy_params = cfg80211_rtw_set_wiphy_params,
4257 .connect = cfg80211_rtw_connect,
4258 .disconnect = cfg80211_rtw_disconnect,
4259 .join_ibss = cfg80211_rtw_join_ibss,
4260 .leave_ibss = cfg80211_rtw_leave_ibss,
4261 .set_tx_power = cfg80211_rtw_set_txpower,
4262 .get_tx_power = cfg80211_rtw_get_txpower,
4263 .set_power_mgmt = cfg80211_rtw_set_power_mgmt,
4264 .set_pmksa = cfg80211_rtw_set_pmksa,
4265 .del_pmksa = cfg80211_rtw_del_pmksa,
4266 .flush_pmksa = cfg80211_rtw_flush_pmksa,
4268 #ifdef CONFIG_8723AU_AP_MODE
4269 .add_virtual_intf = cfg80211_rtw_add_virtual_intf,
4270 .del_virtual_intf = cfg80211_rtw_del_virtual_intf,
4272 .start_ap = cfg80211_rtw_start_ap,
4273 .change_beacon = cfg80211_rtw_change_beacon,
4274 .stop_ap = cfg80211_rtw_stop_ap,
4276 .add_station = cfg80211_rtw_add_station,
4277 .del_station = cfg80211_rtw_del_station,
4278 .change_station = cfg80211_rtw_change_station,
4279 .dump_station = cfg80211_rtw_dump_station,
4280 .change_bss = cfg80211_rtw_change_bss,
4281 #endif /* CONFIG_8723AU_AP_MODE */
4283 #ifdef CONFIG_8723AU_P2P
4284 .remain_on_channel = cfg80211_rtw_remain_on_channel,
4285 .cancel_remain_on_channel = cfg80211_rtw_cancel_remain_on_channel,
4288 .mgmt_tx = cfg80211_rtw_mgmt_tx,
4289 .mgmt_frame_register = cfg80211_rtw_mgmt_frame_register,
4292 static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap *ht_cap,
4293 enum ieee80211_band band, u8 rf_type)
4296 #define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */
4297 #define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */
4299 ht_cap->ht_supported = true;
4301 ht_cap->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 |
4302 IEEE80211_HT_CAP_SGI_40 | IEEE80211_HT_CAP_SGI_20 |
4303 IEEE80211_HT_CAP_DSSSCCK40 | IEEE80211_HT_CAP_MAX_AMSDU;
4306 *Maximum length of AMPDU that the STA can receive.
4307 *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
4309 ht_cap->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K;
4311 /*Minimum MPDU start spacing , */
4312 ht_cap->ampdu_density = IEEE80211_HT_MPDU_DENSITY_16;
4314 ht_cap->mcs.tx_params = IEEE80211_HT_MCS_TX_DEFINED;
4317 *hw->wiphy->bands[IEEE80211_BAND_2GHZ]
4320 *if rx_ant = 1 rx_mask[0]= 0xff;==>MCS0-MCS7
4321 *if rx_ant = 2 rx_mask[1]= 0xff;==>MCS8-MCS15
4322 *if rx_ant >= 3 rx_mask[2]= 0xff;
4323 *if BW_40 rx_mask[4]= 0x01;
4324 *highest supported RX rate
4326 if (rf_type == RF_1T1R) {
4327 ht_cap->mcs.rx_mask[0] = 0xFF;
4328 ht_cap->mcs.rx_mask[1] = 0x00;
4329 ht_cap->mcs.rx_mask[4] = 0x01;
4331 ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS7;
4332 } else if ((rf_type == RF_1T2R) || (rf_type == RF_2T2R)) {
4333 ht_cap->mcs.rx_mask[0] = 0xFF;
4334 ht_cap->mcs.rx_mask[1] = 0xFF;
4335 ht_cap->mcs.rx_mask[4] = 0x01;
4337 ht_cap->mcs.rx_highest = MAX_BIT_RATE_40MHZ_MCS15;
4339 DBG_8723A("%s, error rf_type =%d\n", __func__, rf_type);
4344 void rtw_cfg80211_init_wiphy(struct rtw_adapter *padapter)
4347 struct ieee80211_supported_band *bands;
4348 struct wireless_dev *pwdev = padapter->rtw_wdev;
4349 struct wiphy *wiphy = pwdev->wiphy;
4351 rtw23a_hal_get_hwreg(padapter, HW_VAR_RF_TYPE, (u8 *)(&rf_type));
4353 DBG_8723A("%s:rf_type =%d\n", __func__, rf_type);
4355 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */
4357 bands = wiphy->bands[IEEE80211_BAND_2GHZ];
4359 rtw_cfg80211_init_ht_capab(&bands->ht_cap,
4360 IEEE80211_BAND_2GHZ,
4364 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */
4366 bands = wiphy->bands[IEEE80211_BAND_5GHZ];
4368 rtw_cfg80211_init_ht_capab(&bands->ht_cap,
4369 IEEE80211_BAND_5GHZ,
4374 static void rtw_cfg80211_preinit_wiphy(struct rtw_adapter *padapter,
4375 struct wiphy *wiphy)
4377 wiphy->signal_type = CFG80211_SIGNAL_TYPE_MBM;
4379 wiphy->max_scan_ssids = RTW_SSID_SCAN_AMOUNT;
4380 wiphy->max_scan_ie_len = IEEE80211_MAX_DATA_LEN;
4381 wiphy->max_num_pmkids = RTW_MAX_NUM_PMKIDS;
4383 wiphy->max_remain_on_channel_duration =
4384 RTW_MAX_REMAIN_ON_CHANNEL_DURATION;
4386 wiphy->interface_modes = BIT(NL80211_IFTYPE_STATION) |
4387 BIT(NL80211_IFTYPE_ADHOC) |
4388 #ifdef CONFIG_8723AU_AP_MODE
4389 BIT(NL80211_IFTYPE_AP) | BIT(NL80211_IFTYPE_MONITOR) |
4391 #if defined(CONFIG_8723AU_P2P)
4392 BIT(NL80211_IFTYPE_P2P_CLIENT) | BIT(NL80211_IFTYPE_P2P_GO) |
4396 #ifdef CONFIG_8723AU_AP_MODE
4397 wiphy->mgmt_stypes = rtw_cfg80211_default_mgmt_stypes;
4398 #endif /* CONFIG_8723AU_AP_MODE */
4400 wiphy->software_iftypes |= BIT(NL80211_IFTYPE_MONITOR);
4403 wiphy->iface_combinations = &rtw_combinations;
4404 wiphy->n_iface_combinations = 1;
4407 wiphy->cipher_suites = rtw_cipher_suites;
4408 wiphy->n_cipher_suites = ARRAY_SIZE(rtw_cipher_suites);
4410 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */
4411 wiphy->bands[IEEE80211_BAND_2GHZ] =
4412 rtw_spt_band_alloc(IEEE80211_BAND_2GHZ);
4413 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */
4414 wiphy->bands[IEEE80211_BAND_5GHZ] =
4415 rtw_spt_band_alloc(IEEE80211_BAND_5GHZ);
4417 wiphy->flags |= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL;
4418 wiphy->flags |= WIPHY_FLAG_OFFCHAN_TX | WIPHY_FLAG_HAVE_AP_SME;
4420 if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)
4421 wiphy->flags |= WIPHY_FLAG_PS_ON_BY_DEFAULT;
4423 wiphy->flags &= ~WIPHY_FLAG_PS_ON_BY_DEFAULT;
4426 int rtw_wdev_alloc(struct rtw_adapter *padapter, struct device *dev)
4429 struct wiphy *wiphy;
4430 struct wireless_dev *wdev;
4431 struct rtw_wdev_priv *pwdev_priv;
4432 struct net_device *pnetdev = padapter->pnetdev;
4434 DBG_8723A("%s(padapter =%p)\n", __func__, padapter);
4437 wiphy = wiphy_new(&rtw_cfg80211_ops, sizeof(struct rtw_wdev_priv));
4439 DBG_8723A("Couldn't allocate wiphy device\n");
4443 set_wiphy_dev(wiphy, dev);
4444 rtw_cfg80211_preinit_wiphy(padapter, wiphy);
4446 ret = wiphy_register(wiphy);
4448 DBG_8723A("Couldn't register wiphy device\n");
4453 wdev = kzalloc(sizeof(struct wireless_dev), GFP_KERNEL);
4455 DBG_8723A("Couldn't allocate wireless device\n");
4457 goto unregister_wiphy;
4459 wdev->wiphy = wiphy;
4460 wdev->netdev = pnetdev;
4461 /* wdev->iftype = NL80211_IFTYPE_STATION; */
4462 /* for rtw_setopmode_cmd23a() in cfg80211_rtw_change_iface() */
4463 wdev->iftype = NL80211_IFTYPE_MONITOR;
4464 padapter->rtw_wdev = wdev;
4465 pnetdev->ieee80211_ptr = wdev;
4467 /* init pwdev_priv */
4468 pwdev_priv = wdev_to_priv(wdev);
4469 pwdev_priv->rtw_wdev = wdev;
4470 pwdev_priv->pmon_ndev = NULL;
4471 pwdev_priv->ifname_mon[0] = '\0';
4472 pwdev_priv->padapter = padapter;
4473 pwdev_priv->scan_request = NULL;
4474 spin_lock_init(&pwdev_priv->scan_req_lock);
4476 pwdev_priv->p2p_enabled = false;
4477 pwdev_priv->provdisc_req_issued = false;
4478 rtw_wdev_invit_info_init(&pwdev_priv->invit_info);
4480 if (padapter->registrypriv.power_mgnt != PS_MODE_ACTIVE)
4481 pwdev_priv->power_mgmt = true;
4483 pwdev_priv->power_mgmt = false;
4487 wiphy_unregister(wiphy);
4494 void rtw_wdev_free(struct wireless_dev *wdev)
4496 struct rtw_wdev_priv *pwdev_priv;
4498 DBG_8723A("%s(wdev =%p)\n", __func__, wdev);
4503 pwdev_priv = wdev_to_priv(wdev);
4505 kfree(wdev->wiphy->bands[IEEE80211_BAND_2GHZ]);
4506 kfree(wdev->wiphy->bands[IEEE80211_BAND_5GHZ]);
4508 wiphy_free(wdev->wiphy);
4513 void rtw_wdev_unregister(struct wireless_dev *wdev)
4515 struct rtw_wdev_priv *pwdev_priv;
4517 DBG_8723A("%s(wdev =%p)\n", __func__, wdev);
4522 pwdev_priv = wdev_to_priv(wdev);
4524 rtw_cfg80211_indicate_scan_done(pwdev_priv, true);
4526 if (pwdev_priv->pmon_ndev) {
4527 DBG_8723A("%s, unregister monitor interface\n", __func__);
4528 unregister_netdev(pwdev_priv->pmon_ndev);
4531 wiphy_unregister(wdev->wiphy);