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 <xmit_osdep.h>
21 #include "ioctl_cfg80211.h"
23 #define RTW_MAX_MGMT_TX_CNT 8
25 #define RTW_MAX_REMAIN_ON_CHANNEL_DURATION 65535 /* ms */
26 #define RTW_MAX_NUM_PMKIDS 4
28 static const u32 rtw_cipher_suites
[] = {
29 WLAN_CIPHER_SUITE_WEP40
,
30 WLAN_CIPHER_SUITE_WEP104
,
31 WLAN_CIPHER_SUITE_TKIP
,
32 WLAN_CIPHER_SUITE_CCMP
,
35 #define RATETAB_ENT(_rate, _rateid, _flags) { \
37 .hw_value = (_rateid), \
41 #define CHAN2G(_channel, _freq, _flags) { \
42 .band = IEEE80211_BAND_2GHZ, \
43 .center_freq = (_freq), \
44 .hw_value = (_channel), \
46 .max_antenna_gain = 0, \
50 #define CHAN5G(_channel, _flags) { \
51 .band = IEEE80211_BAND_5GHZ, \
52 .center_freq = 5000 + (5 * (_channel)), \
53 .hw_value = (_channel), \
55 .max_antenna_gain = 0, \
59 static struct ieee80211_rate rtw_rates
[] = {
60 RATETAB_ENT(10, 0x1, 0),
61 RATETAB_ENT(20, 0x2, 0),
62 RATETAB_ENT(55, 0x4, 0),
63 RATETAB_ENT(110, 0x8, 0),
64 RATETAB_ENT(60, 0x10, 0),
65 RATETAB_ENT(90, 0x20, 0),
66 RATETAB_ENT(120, 0x40, 0),
67 RATETAB_ENT(180, 0x80, 0),
68 RATETAB_ENT(240, 0x100, 0),
69 RATETAB_ENT(360, 0x200, 0),
70 RATETAB_ENT(480, 0x400, 0),
71 RATETAB_ENT(540, 0x800, 0),
74 #define rtw_a_rates (rtw_rates + 4)
75 #define RTW_A_RATES_NUM 8
76 #define rtw_g_rates (rtw_rates + 0)
77 #define RTW_G_RATES_NUM 12
79 #define RTW_2G_CHANNELS_NUM 14
80 #define RTW_5G_CHANNELS_NUM 37
82 static struct ieee80211_channel rtw_2ghz_channels
[] = {
99 static struct ieee80211_channel rtw_5ghz_a_channels
[] = {
100 CHAN5G(34, 0), CHAN5G(36, 0),
101 CHAN5G(38, 0), CHAN5G(40, 0),
102 CHAN5G(42, 0), CHAN5G(44, 0),
103 CHAN5G(46, 0), CHAN5G(48, 0),
104 CHAN5G(52, 0), CHAN5G(56, 0),
105 CHAN5G(60, 0), CHAN5G(64, 0),
106 CHAN5G(100, 0), CHAN5G(104, 0),
107 CHAN5G(108, 0), CHAN5G(112, 0),
108 CHAN5G(116, 0), CHAN5G(120, 0),
109 CHAN5G(124, 0), CHAN5G(128, 0),
110 CHAN5G(132, 0), CHAN5G(136, 0),
111 CHAN5G(140, 0), CHAN5G(149, 0),
112 CHAN5G(153, 0), CHAN5G(157, 0),
113 CHAN5G(161, 0), CHAN5G(165, 0),
114 CHAN5G(184, 0), CHAN5G(188, 0),
115 CHAN5G(192, 0), CHAN5G(196, 0),
116 CHAN5G(200, 0), CHAN5G(204, 0),
117 CHAN5G(208, 0), CHAN5G(212, 0),
121 static void rtw_2g_channels_init(struct ieee80211_channel
*channels
)
123 memcpy((void *)channels
, (void *)rtw_2ghz_channels
,
124 sizeof(struct ieee80211_channel
) * RTW_2G_CHANNELS_NUM
);
127 static void rtw_5g_channels_init(struct ieee80211_channel
*channels
)
129 memcpy((void *)channels
, (void *)rtw_5ghz_a_channels
,
130 sizeof(struct ieee80211_channel
) * RTW_5G_CHANNELS_NUM
);
133 static void rtw_2g_rates_init(struct ieee80211_rate
*rates
)
135 memcpy(rates
, rtw_g_rates
,
136 sizeof(struct ieee80211_rate
) * RTW_G_RATES_NUM
);
139 static void rtw_5g_rates_init(struct ieee80211_rate
*rates
)
141 memcpy(rates
, rtw_a_rates
,
142 sizeof(struct ieee80211_rate
) * RTW_A_RATES_NUM
);
145 static struct ieee80211_supported_band
*
146 rtw_spt_band_alloc(enum ieee80211_band band
)
148 struct ieee80211_supported_band
*spt_band
= NULL
;
149 int n_channels
, n_bitrates
;
151 if (band
== IEEE80211_BAND_2GHZ
) {
152 n_channels
= RTW_2G_CHANNELS_NUM
;
153 n_bitrates
= RTW_G_RATES_NUM
;
154 } else if (band
== IEEE80211_BAND_5GHZ
) {
155 n_channels
= RTW_5G_CHANNELS_NUM
;
156 n_bitrates
= RTW_A_RATES_NUM
;
160 spt_band
= kzalloc(sizeof(struct ieee80211_supported_band
) +
161 sizeof(struct ieee80211_channel
) * n_channels
+
162 sizeof(struct ieee80211_rate
) * n_bitrates
,
168 (struct ieee80211_channel
*)(((u8
*) spt_band
) +
170 ieee80211_supported_band
));
172 (struct ieee80211_rate
*)(((u8
*) spt_band
->channels
) +
173 sizeof(struct ieee80211_channel
) *
175 spt_band
->band
= band
;
176 spt_band
->n_channels
= n_channels
;
177 spt_band
->n_bitrates
= n_bitrates
;
179 if (band
== IEEE80211_BAND_2GHZ
) {
180 rtw_2g_channels_init(spt_band
->channels
);
181 rtw_2g_rates_init(spt_band
->bitrates
);
182 } else if (band
== IEEE80211_BAND_5GHZ
) {
183 rtw_5g_channels_init(spt_band
->channels
);
184 rtw_5g_rates_init(spt_band
->bitrates
);
187 /* spt_band.ht_cap */
193 static const struct ieee80211_txrx_stypes
194 rtw_cfg80211_default_mgmt_stypes
[NUM_NL80211_IFTYPES
] = {
195 [NL80211_IFTYPE_ADHOC
] = {
197 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4)
199 [NL80211_IFTYPE_STATION
] = {
201 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
202 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
204 [NL80211_IFTYPE_AP
] = {
206 .rx
= BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
207 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
208 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
209 BIT(IEEE80211_STYPE_DISASSOC
>> 4) |
210 BIT(IEEE80211_STYPE_AUTH
>> 4) |
211 BIT(IEEE80211_STYPE_DEAUTH
>> 4) |
212 BIT(IEEE80211_STYPE_ACTION
>> 4)
214 [NL80211_IFTYPE_AP_VLAN
] = {
217 .rx
= BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
218 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
219 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
220 BIT(IEEE80211_STYPE_DISASSOC
>> 4) |
221 BIT(IEEE80211_STYPE_AUTH
>> 4) |
222 BIT(IEEE80211_STYPE_DEAUTH
>> 4) |
223 BIT(IEEE80211_STYPE_ACTION
>> 4)
225 [NL80211_IFTYPE_P2P_CLIENT
] = {
227 .rx
= BIT(IEEE80211_STYPE_ACTION
>> 4) |
228 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4)
230 [NL80211_IFTYPE_P2P_GO
] = {
232 .rx
= BIT(IEEE80211_STYPE_ASSOC_REQ
>> 4) |
233 BIT(IEEE80211_STYPE_REASSOC_REQ
>> 4) |
234 BIT(IEEE80211_STYPE_PROBE_REQ
>> 4) |
235 BIT(IEEE80211_STYPE_DISASSOC
>> 4) |
236 BIT(IEEE80211_STYPE_AUTH
>> 4) |
237 BIT(IEEE80211_STYPE_DEAUTH
>> 4) |
238 BIT(IEEE80211_STYPE_ACTION
>> 4)
242 static int rtw_cfg80211_inform_bss(struct rtw_adapter
*padapter
,
243 struct wlan_network
*pnetwork
)
246 struct ieee80211_channel
*notify_channel
;
247 struct cfg80211_bss
*bss
;
253 struct wireless_dev
*wdev
= padapter
->rtw_wdev
;
254 struct wiphy
*wiphy
= wdev
->wiphy
;
255 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
257 channel
= pnetwork
->network
.DSConfig
;
258 if (channel
<= RTW_CH_MAX_2G_CHANNEL
)
259 freq
= ieee80211_channel_to_frequency(channel
,
260 IEEE80211_BAND_2GHZ
);
262 freq
= ieee80211_channel_to_frequency(channel
,
263 IEEE80211_BAND_5GHZ
);
265 notify_channel
= ieee80211_get_channel(wiphy
, freq
);
267 notify_ie
= pnetwork
->network
.IEs
;
268 notify_ielen
= pnetwork
->network
.IELength
;
270 /* We've set wiphy's signal_type as CFG80211_SIGNAL_TYPE_MBM:
271 * signal strength in mBm (100*dBm)
273 if (check_fwstate(pmlmepriv
, _FW_LINKED
) &&
274 is_same_network23a(&pmlmepriv
->cur_network
.network
,
275 &pnetwork
->network
)) {
276 notify_signal
= 100 * translate_percentage_to_dbm(padapter
->recvpriv
.signal_strength
); /* dbm */
278 notify_signal
= 100 * translate_percentage_to_dbm(pnetwork
->network
.PhyInfo
.SignalStrength
); /* dbm */
281 bss
= cfg80211_inform_bss(wiphy
, notify_channel
,
282 pnetwork
->network
.MacAddress
,
283 pnetwork
->network
.tsf
,
284 pnetwork
->network
.capability
,
285 pnetwork
->network
.beacon_interval
,
286 notify_ie
, notify_ielen
,
287 notify_signal
, GFP_ATOMIC
);
289 if (unlikely(!bss
)) {
290 DBG_8723A("rtw_cfg80211_inform_bss error\n");
294 cfg80211_put_bss(wiphy
, bss
);
299 void rtw_cfg80211_indicate_connect(struct rtw_adapter
*padapter
)
301 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
302 struct wlan_network
*cur_network
= &pmlmepriv
->cur_network
;
303 struct wireless_dev
*pwdev
= padapter
->rtw_wdev
;
305 DBG_8723A("%s(padapter =%p)\n", __func__
, padapter
);
307 if (pwdev
->iftype
!= NL80211_IFTYPE_STATION
&&
308 pwdev
->iftype
!= NL80211_IFTYPE_P2P_CLIENT
)
311 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
))
314 if (padapter
->mlmepriv
.to_roaming
> 0) {
315 struct wiphy
*wiphy
= pwdev
->wiphy
;
316 struct ieee80211_channel
*notify_channel
;
318 u16 channel
= cur_network
->network
.DSConfig
;
320 if (channel
<= RTW_CH_MAX_2G_CHANNEL
)
322 ieee80211_channel_to_frequency(channel
,
323 IEEE80211_BAND_2GHZ
);
326 ieee80211_channel_to_frequency(channel
,
327 IEEE80211_BAND_5GHZ
);
329 notify_channel
= ieee80211_get_channel(wiphy
, freq
);
331 DBG_8723A("%s call cfg80211_roamed\n", __func__
);
332 cfg80211_roamed(padapter
->pnetdev
, notify_channel
,
333 cur_network
->network
.MacAddress
,
334 pmlmepriv
->assoc_req
+
335 sizeof(struct ieee80211_hdr_3addr
) + 2,
336 pmlmepriv
->assoc_req_len
-
337 sizeof(struct ieee80211_hdr_3addr
) - 2,
338 pmlmepriv
->assoc_rsp
+
339 sizeof(struct ieee80211_hdr_3addr
) + 6,
340 pmlmepriv
->assoc_rsp_len
-
341 sizeof(struct ieee80211_hdr_3addr
) - 6,
344 cfg80211_connect_result(padapter
->pnetdev
,
345 cur_network
->network
.MacAddress
,
346 pmlmepriv
->assoc_req
+
347 sizeof(struct ieee80211_hdr_3addr
) + 2,
348 pmlmepriv
->assoc_req_len
-
349 sizeof(struct ieee80211_hdr_3addr
) - 2,
350 pmlmepriv
->assoc_rsp
+
351 sizeof(struct ieee80211_hdr_3addr
) + 6,
352 pmlmepriv
->assoc_rsp_len
-
353 sizeof(struct ieee80211_hdr_3addr
) - 6,
354 WLAN_STATUS_SUCCESS
, GFP_ATOMIC
);
358 void rtw_cfg80211_indicate_disconnect(struct rtw_adapter
*padapter
)
360 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
361 struct wireless_dev
*pwdev
= padapter
->rtw_wdev
;
363 DBG_8723A("%s(padapter =%p)\n", __func__
, padapter
);
365 if (pwdev
->iftype
!= NL80211_IFTYPE_STATION
&&
366 pwdev
->iftype
!= NL80211_IFTYPE_P2P_CLIENT
)
369 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
))
372 if (!padapter
->mlmepriv
.not_indic_disco
) {
373 if (check_fwstate(&padapter
->mlmepriv
, WIFI_UNDER_LINKING
)) {
374 cfg80211_connect_result(padapter
->pnetdev
, NULL
, NULL
,
376 WLAN_STATUS_UNSPECIFIED_FAILURE
,
379 cfg80211_disconnected(padapter
->pnetdev
, 0, NULL
,
385 #ifdef CONFIG_8723AU_AP_MODE
386 static int set_pairwise_key(struct rtw_adapter
*padapter
, struct sta_info
*psta
)
388 struct cmd_obj
*ph2c
;
389 struct set_stakey_parm
*psetstakey_para
;
390 struct cmd_priv
*pcmdpriv
= &padapter
->cmdpriv
;
393 ph2c
= kzalloc(sizeof(struct cmd_obj
), GFP_KERNEL
);
399 psetstakey_para
= kzalloc(sizeof(struct set_stakey_parm
), GFP_KERNEL
);
400 if (psetstakey_para
== NULL
) {
406 init_h2fwcmd_w_parm_no_rsp(ph2c
, psetstakey_para
, _SetStaKey_CMD_
);
408 psetstakey_para
->algorithm
= psta
->dot118021XPrivacy
;
410 ether_addr_copy(psetstakey_para
->addr
, psta
->hwaddr
);
412 memcpy(psetstakey_para
->key
, &psta
->dot118021x_UncstKey
, 16);
414 res
= rtw_enqueue_cmd23a(pcmdpriv
, ph2c
);
420 static int set_group_key(struct rtw_adapter
*padapter
, const u8
*key
, u32 alg
,
424 struct cmd_obj
*pcmd
;
425 struct setkey_parm
*psetkeyparm
;
426 struct cmd_priv
*pcmdpriv
= &padapter
->cmdpriv
;
429 DBG_8723A("%s\n", __func__
);
436 pcmd
= kzalloc(sizeof(struct cmd_obj
), GFP_KERNEL
);
441 psetkeyparm
= kzalloc(sizeof(struct setkey_parm
), GFP_KERNEL
);
448 psetkeyparm
->keyid
= keyid
;
450 padapter
->mlmepriv
.key_mask
|= BIT(psetkeyparm
->keyid
);
452 psetkeyparm
->algorithm
= alg
;
454 psetkeyparm
->set_tx
= 1;
457 case WLAN_CIPHER_SUITE_WEP40
:
460 case WLAN_CIPHER_SUITE_WEP104
:
463 case WLAN_CIPHER_SUITE_TKIP
:
464 case WLAN_CIPHER_SUITE_CCMP
:
469 memcpy(&psetkeyparm
->key
[0], key
, keylen
);
471 pcmd
->cmdcode
= _SetKey_CMD_
;
472 pcmd
->parmbuf
= (u8
*) psetkeyparm
;
473 pcmd
->cmdsz
= (sizeof(struct setkey_parm
));
477 res
= rtw_enqueue_cmd23a(pcmdpriv
, pcmd
);
483 static int set_wep_key(struct rtw_adapter
*padapter
, const u8
*key
, u16 keylen
,
490 alg
= WLAN_CIPHER_SUITE_WEP40
;
493 alg
= WLAN_CIPHER_SUITE_WEP104
;
499 return set_group_key(padapter
, key
, alg
, keyid
);
502 static int rtw_cfg80211_ap_set_encryption(struct net_device
*dev
,
503 struct ieee_param
*param
,
505 struct key_params
*keyparms
)
510 struct sta_info
*psta
= NULL
, *pbcmc_sta
= NULL
;
511 struct rtw_adapter
*padapter
= netdev_priv(dev
);
512 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
513 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
515 DBG_8723A("%s\n", __func__
);
517 param
->u
.crypt
.err
= 0;
518 param
->u
.crypt
.alg
[IEEE_CRYPT_ALG_NAME_LEN
- 1] = '\0';
520 /* sizeof(struct ieee_param) = 64 bytes; */
521 /* if (param_len != (u32) ((u8 *) param->u.crypt.key -
522 (u8 *) param) + param->u.crypt.key_len) */
523 if (param_len
!= sizeof(struct ieee_param
) + param
->u
.crypt
.key_len
) {
528 if (is_broadcast_ether_addr(param
->sta_addr
)) {
529 if (param
->u
.crypt
.idx
>= WEP_KEYS
) {
533 switch (keyparms
->cipher
) {
534 case WLAN_CIPHER_SUITE_WEP40
:
535 case WLAN_CIPHER_SUITE_WEP104
:
536 case WLAN_CIPHER_SUITE_TKIP
:
537 case WLAN_CIPHER_SUITE_CCMP
:
545 psta
= rtw_get_stainfo23a(pstapriv
, param
->sta_addr
);
548 DBG_8723A("rtw_set_encryption(), sta has already "
549 "been removed or never been added\n");
554 key_len
= keyparms
->key_len
;
556 if (!psta
&& (keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
557 keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP104
)) {
558 DBG_8723A("r871x_set_encryption, crypt.alg = WEP\n");
560 wep_key_idx
= param
->u
.crypt
.idx
;
562 DBG_8723A("r871x_set_encryption, wep_key_idx =%d, len =%d\n",
563 wep_key_idx
, key_len
);
565 if (wep_key_idx
>= WEP_KEYS
|| key_len
<= 0) {
571 key_len
= key_len
<= 5 ? 5 : 13;
574 if (psecuritypriv
->bWepDefaultKeyIdxSet
== 0) {
575 /* wep default key has not been set, so use
576 this key index as default key. */
578 psecuritypriv
->ndisencryptstatus
=
579 Ndis802_11Encryption1Enabled
;
580 psecuritypriv
->dot11PrivacyAlgrthm
= keyparms
->cipher
;
581 psecuritypriv
->dot118021XGrpPrivacy
= keyparms
->cipher
;
583 psecuritypriv
->dot11PrivacyKeyIndex
= wep_key_idx
;
586 memcpy(&psecuritypriv
->wep_key
[wep_key_idx
].key
,
587 keyparms
->key
, key_len
);
589 psecuritypriv
->wep_key
[wep_key_idx
].keylen
= key_len
;
591 set_wep_key(padapter
, keyparms
->key
, key_len
, wep_key_idx
);
596 if (!psta
) { /* group key */
597 if (param
->u
.crypt
.set_tx
== 0) { /* group key */
598 if (keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
599 keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP104
) {
600 DBG_8723A("%s, set group_key, WEP\n", __func__
);
602 memcpy(psecuritypriv
->
603 dot118021XGrpKey
[param
->u
.crypt
.idx
].
605 (key_len
> 16 ? 16 : key_len
));
607 psecuritypriv
->dot118021XGrpPrivacy
=
609 } else if (keyparms
->cipher
== WLAN_CIPHER_SUITE_TKIP
) {
610 DBG_8723A("%s, set group_key, TKIP\n",
613 psecuritypriv
->dot118021XGrpPrivacy
=
614 WLAN_CIPHER_SUITE_TKIP
;
616 memcpy(psecuritypriv
->
617 dot118021XGrpKey
[param
->u
.crypt
.idx
].
618 skey
, param
->u
.crypt
.key
,
619 (key_len
> 16 ? 16 : key_len
));
621 /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
623 memcpy(psecuritypriv
->
624 dot118021XGrptxmickey
[param
->u
.crypt
.
626 ¶m
->u
.crypt
.key
[16], 8);
627 memcpy(psecuritypriv
->
628 dot118021XGrprxmickey
[param
->u
.crypt
.
630 ¶m
->u
.crypt
.key
[24], 8);
632 psecuritypriv
->busetkipkey
= 1;
634 } else if (keyparms
->cipher
== WLAN_CIPHER_SUITE_CCMP
) {
635 DBG_8723A("%s, set group_key, CCMP\n",
638 psecuritypriv
->dot118021XGrpPrivacy
=
639 WLAN_CIPHER_SUITE_CCMP
;
641 memcpy(psecuritypriv
->
642 dot118021XGrpKey
[param
->u
.crypt
.idx
].
643 skey
, param
->u
.crypt
.key
,
644 (key_len
> 16 ? 16 : key_len
));
646 DBG_8723A("%s, set group_key, none\n",
649 psecuritypriv
->dot118021XGrpPrivacy
=
653 psecuritypriv
->dot118021XGrpKeyid
= param
->u
.crypt
.idx
;
655 psecuritypriv
->binstallGrpkey
= 1;
657 psecuritypriv
->dot11PrivacyAlgrthm
=
658 psecuritypriv
->dot118021XGrpPrivacy
;
660 set_group_key(padapter
, param
->u
.crypt
.key
,
661 psecuritypriv
->dot118021XGrpPrivacy
,
664 pbcmc_sta
= rtw_get_bcmc_stainfo23a(padapter
);
666 pbcmc_sta
->ieee8021x_blocked
= false;
667 /* rx will use bmc_sta's dot118021XPrivacy */
668 pbcmc_sta
->dot118021XPrivacy
=
669 psecuritypriv
->dot118021XGrpPrivacy
;
678 if (psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_8021X
&& psta
) {
680 if (param
->u
.crypt
.set_tx
== 1) {
682 memcpy(psta
->dot118021x_UncstKey
.skey
,
684 (key_len
> 16 ? 16 : key_len
));
686 if (keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
687 keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP104
) {
688 DBG_8723A("%s, set pairwise key, WEP\n",
691 psecuritypriv
->dot118021XGrpPrivacy
=
693 } else if (keyparms
->cipher
== WLAN_CIPHER_SUITE_TKIP
) {
694 DBG_8723A("%s, set pairwise key, TKIP\n",
697 psta
->dot118021XPrivacy
=
698 WLAN_CIPHER_SUITE_TKIP
;
700 /* DEBUG_ERR("set key length :param->u.crypt.key_len =%d\n", param->u.crypt.key_len); */
702 memcpy(psta
->dot11tkiptxmickey
.skey
,
703 ¶m
->u
.crypt
.key
[16], 8);
704 memcpy(psta
->dot11tkiprxmickey
.skey
,
705 ¶m
->u
.crypt
.key
[24], 8);
707 psecuritypriv
->busetkipkey
= 1;
709 } else if (keyparms
->cipher
== WLAN_CIPHER_SUITE_CCMP
) {
710 DBG_8723A("%s, set pairwise key, CCMP\n",
713 psta
->dot118021XPrivacy
=
714 WLAN_CIPHER_SUITE_CCMP
;
716 DBG_8723A("%s, set pairwise key, none\n",
719 psta
->dot118021XPrivacy
= 0;
722 set_pairwise_key(padapter
, psta
);
724 psta
->ieee8021x_blocked
= false;
726 psta
->bpairwise_key_installed
= true;
727 } else { /* group key??? */
728 if (keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
729 keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP104
) {
730 memcpy(psecuritypriv
->
731 dot118021XGrpKey
[param
->u
.crypt
.
734 (key_len
> 16 ? 16 : key_len
));
736 psecuritypriv
->dot118021XGrpPrivacy
=
738 } else if (keyparms
->cipher
== WLAN_CIPHER_SUITE_TKIP
) {
739 psecuritypriv
->dot118021XGrpPrivacy
=
740 WLAN_CIPHER_SUITE_TKIP
;
742 memcpy(psecuritypriv
->
743 dot118021XGrpKey
[param
->u
.crypt
.
746 (key_len
> 16 ? 16 : key_len
));
748 /* DEBUG_ERR("set key length :param->u"
749 ".crypt.key_len =%d\n",
750 param->u.crypt.key_len); */
752 memcpy(psecuritypriv
->
753 dot118021XGrptxmickey
[param
->u
.
755 ¶m
->u
.crypt
.key
[16], 8);
756 memcpy(psecuritypriv
->
757 dot118021XGrprxmickey
[param
->u
.
759 ¶m
->u
.crypt
.key
[24], 8);
761 psecuritypriv
->busetkipkey
= 1;
763 } else if (keyparms
->cipher
== WLAN_CIPHER_SUITE_CCMP
) {
764 psecuritypriv
->dot118021XGrpPrivacy
=
765 WLAN_CIPHER_SUITE_CCMP
;
767 memcpy(psecuritypriv
->
768 dot118021XGrpKey
[param
->u
.crypt
.
771 (key_len
> 16 ? 16 : key_len
));
773 psecuritypriv
->dot118021XGrpPrivacy
= 0;
776 psecuritypriv
->dot118021XGrpKeyid
= param
->u
.crypt
.idx
;
778 psecuritypriv
->binstallGrpkey
= 1;
780 psecuritypriv
->dot11PrivacyAlgrthm
=
781 psecuritypriv
->dot118021XGrpPrivacy
;
783 set_group_key(padapter
, param
->u
.crypt
.key
,
784 psecuritypriv
->dot118021XGrpPrivacy
,
787 pbcmc_sta
= rtw_get_bcmc_stainfo23a(padapter
);
789 /* rx will use bmc_sta's
791 pbcmc_sta
->ieee8021x_blocked
= false;
792 pbcmc_sta
->dot118021XPrivacy
=
793 psecuritypriv
->dot118021XGrpPrivacy
;
804 static int rtw_cfg80211_set_encryption(struct net_device
*dev
,
805 struct ieee_param
*param
, u32 param_len
,
806 struct key_params
*keyparms
)
811 struct rtw_adapter
*padapter
= netdev_priv(dev
);
812 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
813 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
815 DBG_8723A("%s\n", __func__
);
817 param
->u
.crypt
.err
= 0;
818 param
->u
.crypt
.alg
[IEEE_CRYPT_ALG_NAME_LEN
- 1] = '\0';
820 key_len
= keyparms
->key_len
;
823 (u32
) ((u8
*) param
->u
.crypt
.key
- (u8
*) param
) + key_len
) {
828 if (is_broadcast_ether_addr(param
->sta_addr
)) {
829 if (param
->u
.crypt
.idx
>= WEP_KEYS
) {
838 if (keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP40
||
839 keyparms
->cipher
== WLAN_CIPHER_SUITE_WEP104
) {
840 RT_TRACE(_module_rtl871x_ioctl_os_c
, _drv_err_
,
841 ("wpa_set_encryption, crypt.alg = WEP\n"));
842 DBG_8723A("wpa_set_encryption, crypt.alg = WEP\n");
844 wep_key_idx
= param
->u
.crypt
.idx
;
846 if (wep_key_idx
> WEP_KEYS
|| key_len
<= 0) {
851 if (psecuritypriv
->bWepDefaultKeyIdxSet
== 0) {
852 /* wep default key has not been set, so use this
853 key index as default key. */
855 key_len
= key_len
<= 5 ? 5 : 13;
857 psecuritypriv
->ndisencryptstatus
=
858 Ndis802_11Encryption1Enabled
;
859 psecuritypriv
->dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP40
;
860 psecuritypriv
->dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_WEP40
;
863 psecuritypriv
->dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP104
;
864 psecuritypriv
->dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_WEP104
;
867 psecuritypriv
->dot11PrivacyKeyIndex
= wep_key_idx
;
870 memcpy(&psecuritypriv
->wep_key
[wep_key_idx
].key
,
871 keyparms
->key
, key_len
);
873 psecuritypriv
->wep_key
[wep_key_idx
].keylen
= key_len
;
875 rtw_set_key23a(padapter
, psecuritypriv
, wep_key_idx
, 0);
880 if (padapter
->securitypriv
.dot11AuthAlgrthm
==
881 dot11AuthAlgrthm_8021X
) { /* 802_1x */
882 struct sta_info
*psta
, *pbcmc_sta
;
883 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
885 if (check_fwstate(pmlmepriv
,
886 WIFI_STATION_STATE
| WIFI_MP_STATE
)) {
888 psta
= rtw_get_stainfo23a(pstapriv
, get_bssid(pmlmepriv
));
890 DBG_8723A("%s, : Obtain Sta_info fail\n",
893 /* Jeff: don't disable ieee8021x_blocked
894 while clearing key */
895 if (strcmp(param
->u
.crypt
.alg
, "none") != 0)
896 psta
->ieee8021x_blocked
= false;
898 if ((padapter
->securitypriv
.ndisencryptstatus
==
899 Ndis802_11Encryption2Enabled
) ||
900 (padapter
->securitypriv
.ndisencryptstatus
==
901 Ndis802_11Encryption3Enabled
)) {
902 psta
->dot118021XPrivacy
=
903 padapter
->securitypriv
.
907 if (param
->u
.crypt
.set_tx
== 1) {
909 DBG_8723A("%s, : param->u.crypt.set_tx"
910 " == 1\n", __func__
);
912 memcpy(psta
->dot118021x_UncstKey
.skey
,
914 (key_len
> 16 ? 16 : key_len
));
916 if (keyparms
->cipher
==
917 WLAN_CIPHER_SUITE_TKIP
) {
918 memcpy(psta
->dot11tkiptxmickey
.
920 &keyparms
->key
[16], 8);
921 memcpy(psta
->dot11tkiprxmickey
.
923 &keyparms
->key
[24], 8);
925 padapter
->securitypriv
.
928 DBG_8723A(" ~~~~set sta key:unicastkey\n");
930 rtw_setstakey_cmd23a(padapter
,
931 (unsigned char *)psta
,
933 } else { /* group key */
934 memcpy(padapter
->securitypriv
.
935 dot118021XGrpKey
[param
->u
.crypt
.
938 (key_len
> 16 ? 16 : key_len
));
939 memcpy(padapter
->securitypriv
.
940 dot118021XGrptxmickey
[param
->u
.
942 skey
, &keyparms
->key
[16], 8);
943 memcpy(padapter
->securitypriv
.
944 dot118021XGrprxmickey
[param
->u
.
946 skey
, &keyparms
->key
[24], 8);
947 padapter
->securitypriv
.binstallGrpkey
=
950 (" ~~~~set sta key:groupkey\n");
952 padapter
->securitypriv
.
956 rtw_set_key23a(padapter
,
957 &padapter
->securitypriv
,
958 param
->u
.crypt
.idx
, 1);
962 pbcmc_sta
= rtw_get_bcmc_stainfo23a(padapter
);
964 /* Jeff: don't disable ieee8021x_blocked
965 while clearing key */
966 if (strcmp(param
->u
.crypt
.alg
, "none") != 0)
967 pbcmc_sta
->ieee8021x_blocked
= false;
969 if ((padapter
->securitypriv
.ndisencryptstatus
==
970 Ndis802_11Encryption2Enabled
) ||
971 (padapter
->securitypriv
.ndisencryptstatus
==
972 Ndis802_11Encryption3Enabled
)) {
973 pbcmc_sta
->dot118021XPrivacy
=
974 padapter
->securitypriv
.
978 } else if (check_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
)) { /* adhoc mode */
984 DBG_8723A("%s, ret =%d\n", __func__
, ret
);
991 static int cfg80211_rtw_add_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
992 u8 key_index
, bool pairwise
,
993 const u8
*mac_addr
, struct key_params
*params
)
997 struct ieee_param
*param
;
999 struct wireless_dev
*rtw_wdev
= wiphy_to_wdev(wiphy
);
1000 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
1001 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1003 DBG_8723A("%s(%s): adding key for %pM\n", __func__
, ndev
->name
,
1005 DBG_8723A("cipher = 0x%x\n", params
->cipher
);
1006 DBG_8723A("key_len = 0x%x\n", params
->key_len
);
1007 DBG_8723A("seq_len = 0x%x\n", params
->seq_len
);
1008 DBG_8723A("key_index =%d\n", key_index
);
1009 DBG_8723A("pairwise =%d\n", pairwise
);
1011 param_len
= sizeof(struct ieee_param
) + params
->key_len
;
1012 param
= kzalloc(param_len
, GFP_KERNEL
);
1016 param
->cmd
= IEEE_CMD_SET_ENCRYPTION
;
1017 eth_broadcast_addr(param
->sta_addr
);
1019 switch (params
->cipher
) {
1020 case IW_AUTH_CIPHER_NONE
:
1021 /* todo: remove key */
1025 case WLAN_CIPHER_SUITE_WEP40
:
1026 case WLAN_CIPHER_SUITE_WEP104
:
1029 case WLAN_CIPHER_SUITE_TKIP
:
1032 case WLAN_CIPHER_SUITE_CCMP
:
1041 strncpy((char *)param
->u
.crypt
.alg
, alg_name
, IEEE_CRYPT_ALG_NAME_LEN
);
1043 if (!mac_addr
|| is_broadcast_ether_addr(mac_addr
)) {
1044 param
->u
.crypt
.set_tx
= 0; /* for wpa/wpa2 group key */
1046 param
->u
.crypt
.set_tx
= 1; /* for wpa/wpa2 pairwise key */
1049 /* param->u.crypt.idx = key_index - 1; */
1050 param
->u
.crypt
.idx
= key_index
;
1052 if (params
->seq_len
&& params
->seq
) {
1053 memcpy(param
->u
.crypt
.seq
, params
->seq
, params
->seq_len
);
1056 if (params
->key_len
&& params
->key
) {
1057 param
->u
.crypt
.key_len
= params
->key_len
;
1058 memcpy(param
->u
.crypt
.key
, params
->key
, params
->key_len
);
1061 if (check_fwstate(pmlmepriv
, WIFI_STATION_STATE
)) {
1062 ret
= rtw_cfg80211_set_encryption(ndev
, param
, param_len
,
1064 } else if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
1065 #ifdef CONFIG_8723AU_AP_MODE
1067 ether_addr_copy(param
->sta_addr
, mac_addr
);
1069 ret
= rtw_cfg80211_ap_set_encryption(ndev
, param
, param_len
,
1073 DBG_8723A("error! fw_state = 0x%x, iftype =%d\n",
1074 pmlmepriv
->fw_state
, rtw_wdev
->iftype
);
1085 cfg80211_rtw_get_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
1086 u8 key_index
, bool pairwise
, const u8
*mac_addr
,
1088 void (*callback
) (void *cookie
, struct key_params
*))
1090 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
1094 static int cfg80211_rtw_del_key(struct wiphy
*wiphy
, struct net_device
*ndev
,
1095 u8 key_index
, bool pairwise
,
1098 struct rtw_adapter
*padapter
= netdev_priv(ndev
);
1099 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
1101 DBG_8723A("%s(%s): key_index =%d\n", __func__
, ndev
->name
, key_index
);
1103 if (key_index
== psecuritypriv
->dot11PrivacyKeyIndex
) {
1104 /* clear the flag of wep default key set. */
1105 psecuritypriv
->bWepDefaultKeyIdxSet
= 0;
1111 static int cfg80211_rtw_set_default_key(struct wiphy
*wiphy
,
1112 struct net_device
*ndev
, u8 key_index
,
1113 bool unicast
, bool multicast
)
1115 struct rtw_adapter
*padapter
= netdev_priv(ndev
);
1116 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
1118 DBG_8723A("%s(%s): key_index =%d, unicast =%d, multicast =%d.\n",
1119 __func__
, ndev
->name
, key_index
, unicast
, multicast
);
1121 if (key_index
< NUM_WEP_KEYS
&&
1122 (psecuritypriv
->dot11PrivacyAlgrthm
== WLAN_CIPHER_SUITE_WEP40
||
1123 psecuritypriv
->dot11PrivacyAlgrthm
== WLAN_CIPHER_SUITE_WEP104
)) {
1124 /* set wep default key */
1125 psecuritypriv
->ndisencryptstatus
= Ndis802_11Encryption1Enabled
;
1127 psecuritypriv
->dot11PrivacyKeyIndex
= key_index
;
1129 psecuritypriv
->dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP40
;
1130 psecuritypriv
->dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_WEP40
;
1131 if (psecuritypriv
->wep_key
[key_index
].keylen
== 13) {
1132 psecuritypriv
->dot11PrivacyAlgrthm
=
1133 WLAN_CIPHER_SUITE_WEP104
;
1134 psecuritypriv
->dot118021XGrpPrivacy
=
1135 WLAN_CIPHER_SUITE_WEP104
;
1138 /* set the flag to represent that wep default key
1140 psecuritypriv
->bWepDefaultKeyIdxSet
= 1;
1146 static u16
rtw_get_cur_max_rate(struct rtw_adapter
*adapter
)
1150 u16 rate
= 0, max_rate
= 0;
1151 struct mlme_ext_priv
*pmlmeext
= &adapter
->mlmeextpriv
;
1152 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
1153 struct registry_priv
*pregistrypriv
= &adapter
->registrypriv
;
1154 struct mlme_priv
*pmlmepriv
= &adapter
->mlmepriv
;
1155 struct wlan_bssid_ex
*pcur_bss
= &pmlmepriv
->cur_network
.network
;
1156 struct ieee80211_ht_cap
*pht_capie
;
1158 u8 bw_40MHz
= 0, short_GI_20
= 0, short_GI_40
= 0;
1161 p
= cfg80211_find_ie(WLAN_EID_HT_CAPABILITY
,
1162 pcur_bss
->IEs
, pcur_bss
->IELength
);
1163 if (p
&& p
[1] > 0) {
1164 pht_capie
= (struct ieee80211_ht_cap
*)(p
+ 2);
1166 memcpy(&mcs_rate
, &pht_capie
->mcs
, 2);
1168 /* bw_40MHz = (pht_capie->cap_info&
1169 IEEE80211_HT_CAP_SUP_WIDTH_20_40) ? 1:0; */
1170 /* cur_bwmod is updated by beacon, pmlmeinfo is
1171 updated by association response */
1172 bw_40MHz
= (pmlmeext
->cur_bwmode
&&
1173 (pmlmeinfo
->HT_info
.ht_param
&
1174 IEEE80211_HT_PARAM_CHAN_WIDTH_ANY
)) ? 1:0;
1176 /* short_GI = (pht_capie->cap_info & (IEEE80211_HT_CAP
1177 _SGI_20|IEEE80211_HT_CAP_SGI_40)) ? 1 : 0; */
1178 short_GI_20
= (pmlmeinfo
->ht_cap
.cap_info
&
1179 cpu_to_le16(IEEE80211_HT_CAP_SGI_20
)) ? 1:0;
1180 short_GI_40
= (pmlmeinfo
->ht_cap
.cap_info
&
1181 cpu_to_le16(IEEE80211_HT_CAP_SGI_40
)) ? 1:0;
1183 rf_type
= rtl8723a_get_rf_type(adapter
);
1184 max_rate
= rtw_mcs_rate23a(rf_type
, bw_40MHz
&
1185 pregistrypriv
->cbw40_enable
,
1186 short_GI_20
, short_GI_40
,
1187 &pmlmeinfo
->ht_cap
.mcs
);
1189 while (pcur_bss
->SupportedRates
[i
] != 0 &&
1190 pcur_bss
->SupportedRates
[i
] != 0xFF) {
1191 rate
= pcur_bss
->SupportedRates
[i
] & 0x7F;
1197 max_rate
= max_rate
* 10 / 2;
1203 static int cfg80211_rtw_get_station(struct wiphy
*wiphy
,
1204 struct net_device
*ndev
,
1205 const u8
*mac
, struct station_info
*sinfo
)
1208 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
1209 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1210 struct sta_info
*psta
= NULL
;
1211 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1216 DBG_8723A("%s(%s): mac ==%p\n", __func__
, ndev
->name
, mac
);
1221 psta
= rtw_get_stainfo23a(pstapriv
, mac
);
1223 DBG_8723A("%s, sta_info is null\n", __func__
);
1227 DBG_8723A("%s(%s): mac =" MAC_FMT
"\n", __func__
, ndev
->name
,
1230 /* for infra./P2PClient mode */
1231 if (check_fwstate(pmlmepriv
, WIFI_STATION_STATE
) &&
1232 check_fwstate(pmlmepriv
, _FW_LINKED
)) {
1233 struct wlan_network
*cur_network
= &pmlmepriv
->cur_network
;
1235 if (!ether_addr_equal(mac
, cur_network
->network
.MacAddress
)) {
1236 DBG_8723A("%s, mismatch bssid =" MAC_FMT
"\n", __func__
,
1237 MAC_ARG(cur_network
->network
.MacAddress
));
1242 sinfo
->filled
|= STATION_INFO_SIGNAL
;
1243 sinfo
->signal
= translate_percentage_to_dbm(padapter
->recvpriv
.
1246 sinfo
->filled
|= STATION_INFO_TX_BITRATE
;
1247 sinfo
->txrate
.legacy
= rtw_get_cur_max_rate(padapter
);
1249 sinfo
->filled
|= STATION_INFO_RX_PACKETS
;
1250 sinfo
->rx_packets
= sta_rx_data_pkts(psta
);
1252 sinfo
->filled
|= STATION_INFO_TX_PACKETS
;
1253 sinfo
->tx_packets
= psta
->sta_stats
.tx_pkts
;
1256 /* for Ad-Hoc/AP mode */
1257 if ((check_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
) ||
1258 check_fwstate(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
) ||
1259 check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) &&
1260 check_fwstate(pmlmepriv
, _FW_LINKED
)
1262 /* TODO: should acquire station info... */
1269 int cfg80211_infrastructure_mode(struct rtw_adapter
* padapter
,
1270 enum nl80211_iftype ifmode
)
1272 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1273 struct wlan_network
*cur_network
= &pmlmepriv
->cur_network
;
1274 enum nl80211_iftype old_mode
;
1276 old_mode
= cur_network
->network
.ifmode
;
1278 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_notice_
,
1279 ("+%s: old =%d new =%d fw_state = 0x%08x\n", __func__
,
1280 old_mode
, ifmode
, get_fwstate(pmlmepriv
)));
1282 if (old_mode
!= ifmode
) {
1283 spin_lock_bh(&pmlmepriv
->lock
);
1285 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1288 if (old_mode
== NL80211_IFTYPE_AP
||
1289 old_mode
== NL80211_IFTYPE_P2P_GO
) {
1290 /* change to other mode from Ndis802_11APMode */
1291 cur_network
->join_res
= -1;
1293 #ifdef CONFIG_8723AU_AP_MODE
1294 stop_ap_mode23a(padapter
);
1298 if (check_fwstate(pmlmepriv
, _FW_LINKED
) ||
1299 old_mode
== NL80211_IFTYPE_ADHOC
)
1300 rtw_disassoc_cmd23a(padapter
, 0, true);
1302 if (check_fwstate(pmlmepriv
, _FW_LINKED
) ||
1303 check_fwstate(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
))
1304 rtw_free_assoc_resources23a(padapter
, 1);
1306 if (old_mode
== NL80211_IFTYPE_STATION
||
1307 old_mode
== NL80211_IFTYPE_P2P_CLIENT
||
1308 old_mode
== NL80211_IFTYPE_ADHOC
) {
1309 if (check_fwstate(pmlmepriv
, _FW_LINKED
)) {
1310 /* will clr Linked_state; before this function,
1311 we must have chked whether issue
1312 dis-assoc_cmd or not */
1313 rtw_indicate_disconnect23a(padapter
);
1317 cur_network
->network
.ifmode
= ifmode
;
1319 _clr_fwstate_(pmlmepriv
, ~WIFI_NULL_STATE
);
1322 case NL80211_IFTYPE_ADHOC
:
1323 set_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
);
1326 case NL80211_IFTYPE_P2P_CLIENT
:
1327 case NL80211_IFTYPE_STATION
:
1328 set_fwstate(pmlmepriv
, WIFI_STATION_STATE
);
1331 case NL80211_IFTYPE_P2P_GO
:
1332 case NL80211_IFTYPE_AP
:
1333 set_fwstate(pmlmepriv
, WIFI_AP_STATE
);
1334 #ifdef CONFIG_8723AU_AP_MODE
1335 start_ap_mode23a(padapter
);
1336 /* rtw_indicate_connect23a(padapter); */
1344 /* SecClearAllKeys(adapter); */
1346 /* RT_TRACE(COMP_OID_SET, DBG_LOUD,
1347 ("set_infrastructure: fw_state:%x after changing mode\n", */
1348 /* get_fwstate(pmlmepriv))); */
1350 spin_unlock_bh(&pmlmepriv
->lock
);
1356 static int cfg80211_rtw_change_iface(struct wiphy
*wiphy
,
1357 struct net_device
*ndev
,
1358 enum nl80211_iftype type
, u32
*flags
,
1359 struct vif_params
*params
)
1361 enum nl80211_iftype old_type
;
1362 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
1363 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
1364 struct wireless_dev
*rtw_wdev
= wiphy_to_wdev(wiphy
);
1367 DBG_8723A("%s(%s): call netdev_open23a\n", __func__
, ndev
->name
);
1369 old_type
= rtw_wdev
->iftype
;
1370 DBG_8723A("%s(%s): old_iftype =%d, new_iftype =%d\n",
1371 __func__
, ndev
->name
, old_type
, type
);
1373 if (old_type
!= type
) {
1374 pmlmeext
->action_public_rxseq
= 0xffff;
1375 pmlmeext
->action_public_dialog_token
= 0xff;
1379 case NL80211_IFTYPE_ADHOC
:
1380 case NL80211_IFTYPE_P2P_CLIENT
:
1381 case NL80211_IFTYPE_STATION
:
1382 case NL80211_IFTYPE_P2P_GO
:
1383 case NL80211_IFTYPE_AP
:
1384 case NL80211_IFTYPE_UNSPECIFIED
:
1390 rtw_wdev
->iftype
= type
;
1392 if (cfg80211_infrastructure_mode(padapter
, type
) != _SUCCESS
) {
1393 rtw_wdev
->iftype
= old_type
;
1398 rtw_setopmode_cmd23a(padapter
, type
);
1404 void rtw_cfg80211_indicate_scan_done(struct rtw_wdev_priv
*pwdev_priv
,
1407 spin_lock_bh(&pwdev_priv
->scan_req_lock
);
1408 if (pwdev_priv
->scan_request
!= NULL
) {
1409 DBG_8723A("%s with scan req\n", __func__
);
1411 if (pwdev_priv
->scan_request
->wiphy
!=
1412 pwdev_priv
->rtw_wdev
->wiphy
)
1413 DBG_8723A("error wiphy compare\n");
1415 cfg80211_scan_done(pwdev_priv
->scan_request
, aborted
);
1417 pwdev_priv
->scan_request
= NULL
;
1419 DBG_8723A("%s without scan req\n", __func__
);
1421 spin_unlock_bh(&pwdev_priv
->scan_req_lock
);
1424 void rtw_cfg80211_surveydone_event_callback(struct rtw_adapter
*padapter
)
1426 struct list_head
*plist
, *phead
, *ptmp
;
1427 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1428 struct rtw_queue
*queue
= &pmlmepriv
->scanned_queue
;
1429 struct wlan_network
*pnetwork
;
1431 spin_lock_bh(&pmlmepriv
->scanned_queue
.lock
);
1433 phead
= get_list_head(queue
);
1435 list_for_each_safe(plist
, ptmp
, phead
) {
1436 pnetwork
= container_of(plist
, struct wlan_network
, list
);
1438 /* report network only if the current channel set
1439 contains the channel to which this network belongs */
1440 if (rtw_ch_set_search_ch23a
1441 (padapter
->mlmeextpriv
.channel_set
,
1442 pnetwork
->network
.DSConfig
) >= 0)
1443 rtw_cfg80211_inform_bss(padapter
, pnetwork
);
1446 spin_unlock_bh(&pmlmepriv
->scanned_queue
.lock
);
1448 /* call this after other things have been done */
1449 rtw_cfg80211_indicate_scan_done(wdev_to_priv(padapter
->rtw_wdev
),
1453 static int rtw_cfg80211_set_probe_req_wpsp2pie(struct rtw_adapter
*padapter
,
1458 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1460 DBG_8723A("%s, ielen =%d\n", __func__
, len
);
1463 wps_ie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
1464 WLAN_OUI_TYPE_MICROSOFT_WPS
,
1467 DBG_8723A("probe_req_wps_ielen =%d\n", wps_ie
[1]);
1469 if (pmlmepriv
->wps_probe_req_ie
) {
1470 pmlmepriv
->wps_probe_req_ie_len
= 0;
1471 kfree(pmlmepriv
->wps_probe_req_ie
);
1472 pmlmepriv
->wps_probe_req_ie
= NULL
;
1475 pmlmepriv
->wps_probe_req_ie
= kmemdup(wps_ie
, wps_ie
[1],
1477 if (pmlmepriv
->wps_probe_req_ie
== NULL
) {
1478 DBG_8723A("%s()-%d: kmalloc() ERROR!\n",
1479 __func__
, __LINE__
);
1482 pmlmepriv
->wps_probe_req_ie_len
= wps_ie
[1];
1489 static int cfg80211_rtw_scan(struct wiphy
*wiphy
,
1490 struct cfg80211_scan_request
*request
)
1495 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
1496 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1497 struct cfg80211_ssid ssid
[RTW_SSID_SCAN_AMOUNT
];
1498 struct rtw_ieee80211_channel ch
[RTW_CHANNEL_SCAN_AMOUNT
];
1499 struct rtw_wdev_priv
*pwdev_priv
= wdev_to_priv(padapter
->rtw_wdev
);
1500 struct cfg80211_ssid
*ssids
= request
->ssids
;
1501 bool need_indicate_scan_done
= false;
1503 DBG_8723A("%s(%s)\n", __func__
, padapter
->pnetdev
->name
);
1505 spin_lock_bh(&pwdev_priv
->scan_req_lock
);
1506 pwdev_priv
->scan_request
= request
;
1507 spin_unlock_bh(&pwdev_priv
->scan_req_lock
);
1509 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
1510 DBG_8723A("%s under WIFI_AP_STATE\n", __func__
);
1511 /* need_indicate_scan_done = true; */
1512 /* goto check_need_indicate_scan_done; */
1515 if (rtw_pwr_wakeup(padapter
) == _FAIL
) {
1516 need_indicate_scan_done
= true;
1517 goto check_need_indicate_scan_done
;
1520 if (request
->ie
&& request
->ie_len
> 0) {
1521 rtw_cfg80211_set_probe_req_wpsp2pie(padapter
,
1526 if (pmlmepriv
->LinkDetectInfo
.bBusyTraffic
== true) {
1527 DBG_8723A("%s, bBusyTraffic == true\n", __func__
);
1528 need_indicate_scan_done
= true;
1529 goto check_need_indicate_scan_done
;
1531 if (rtw_is_scan_deny(padapter
)) {
1532 DBG_8723A("%s(%s): scan deny\n", __func__
,
1533 padapter
->pnetdev
->name
);
1534 need_indicate_scan_done
= true;
1535 goto check_need_indicate_scan_done
;
1538 if (check_fwstate(pmlmepriv
, _FW_UNDER_SURVEY
| _FW_UNDER_LINKING
) ==
1540 DBG_8723A("%s, fwstate = 0x%x\n", __func__
, pmlmepriv
->fw_state
);
1541 need_indicate_scan_done
= true;
1542 goto check_need_indicate_scan_done
;
1545 memset(ssid
, 0, sizeof(struct cfg80211_ssid
) * RTW_SSID_SCAN_AMOUNT
);
1546 /* parsing request ssids, n_ssids */
1547 for (i
= 0; i
< request
->n_ssids
&& i
< RTW_SSID_SCAN_AMOUNT
; i
++) {
1548 DBG_8723A("ssid =%s, len =%d\n", ssids
[i
].ssid
,
1550 memcpy(ssid
[i
].ssid
, ssids
[i
].ssid
, ssids
[i
].ssid_len
);
1551 ssid
[i
].ssid_len
= ssids
[i
].ssid_len
;
1554 /* parsing channels, n_channels */
1556 sizeof(struct rtw_ieee80211_channel
) * RTW_CHANNEL_SCAN_AMOUNT
);
1558 if (request
->n_channels
== 1) {
1559 for (i
= 0; i
< request
->n_channels
&&
1560 i
< RTW_CHANNEL_SCAN_AMOUNT
; i
++) {
1561 DBG_8723A("%s:(%s):" CHAN_FMT
"\n",
1562 __func__
, padapter
->pnetdev
->name
,
1563 CHAN_ARG(request
->channels
[i
]));
1564 ch
[i
].hw_value
= request
->channels
[i
]->hw_value
;
1565 ch
[i
].flags
= request
->channels
[i
]->flags
;
1569 spin_lock_bh(&pmlmepriv
->lock
);
1570 if (request
->n_channels
== 1) {
1571 memcpy(&ch
[1], &ch
[0], sizeof(struct rtw_ieee80211_channel
));
1572 memcpy(&ch
[2], &ch
[0], sizeof(struct rtw_ieee80211_channel
));
1573 _status
= rtw_sitesurvey_cmd23a(padapter
, ssid
,
1574 RTW_SSID_SCAN_AMOUNT
, ch
, 3);
1576 _status
= rtw_sitesurvey_cmd23a(padapter
, ssid
,
1577 RTW_SSID_SCAN_AMOUNT
, NULL
, 0);
1579 spin_unlock_bh(&pmlmepriv
->lock
);
1581 if (_status
== false)
1584 check_need_indicate_scan_done
:
1585 if (need_indicate_scan_done
)
1586 rtw_cfg80211_surveydone_event_callback(padapter
);
1590 static int cfg80211_rtw_set_wiphy_params(struct wiphy
*wiphy
, u32 changed
)
1592 DBG_8723A("%s\n", __func__
);
1596 static int cfg80211_rtw_join_ibss(struct wiphy
*wiphy
, struct net_device
*ndev
,
1597 struct cfg80211_ibss_params
*params
)
1599 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
1603 static int cfg80211_rtw_leave_ibss(struct wiphy
*wiphy
, struct net_device
*ndev
)
1605 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
1609 static int rtw_cfg80211_set_wpa_version(struct security_priv
*psecuritypriv
,
1612 DBG_8723A("%s, wpa_version =%d\n", __func__
, wpa_version
);
1615 psecuritypriv
->ndisauthtype
= Ndis802_11AuthModeOpen
;
1619 if (wpa_version
& (NL80211_WPA_VERSION_1
| NL80211_WPA_VERSION_2
)) {
1620 psecuritypriv
->ndisauthtype
= Ndis802_11AuthModeWPAPSK
;
1624 if (wpa_version & NL80211_WPA_VERSION_2)
1626 psecuritypriv->ndisauthtype = Ndis802_11AuthModeWPA2PSK;
1633 static int rtw_cfg80211_set_auth_type(struct security_priv
*psecuritypriv
,
1634 enum nl80211_auth_type sme_auth_type
)
1636 DBG_8723A("%s, nl80211_auth_type =%d\n", __func__
, sme_auth_type
);
1638 switch (sme_auth_type
) {
1639 case NL80211_AUTHTYPE_AUTOMATIC
:
1640 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_Auto
;
1643 case NL80211_AUTHTYPE_OPEN_SYSTEM
:
1644 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_Open
;
1646 if (psecuritypriv
->ndisauthtype
> Ndis802_11AuthModeWPA
)
1647 psecuritypriv
->dot11AuthAlgrthm
=
1648 dot11AuthAlgrthm_8021X
;
1650 case NL80211_AUTHTYPE_SHARED_KEY
:
1651 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_Shared
;
1653 psecuritypriv
->ndisencryptstatus
= Ndis802_11Encryption1Enabled
;
1656 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_Open
;
1657 /* return -ENOTSUPP; */
1663 static int rtw_cfg80211_set_cipher(struct security_priv
*psecuritypriv
,
1664 u32 cipher
, bool ucast
)
1666 u32 ndisencryptstatus
= Ndis802_11EncryptionDisabled
;
1668 u32
*profile_cipher
= ucast
? &psecuritypriv
->dot11PrivacyAlgrthm
:
1669 &psecuritypriv
->dot118021XGrpPrivacy
;
1671 DBG_8723A("%s, ucast =%d, cipher = 0x%x\n", __func__
, ucast
, cipher
);
1674 *profile_cipher
= 0;
1675 psecuritypriv
->ndisencryptstatus
= ndisencryptstatus
;
1680 case IW_AUTH_CIPHER_NONE
:
1681 *profile_cipher
= 0;
1682 ndisencryptstatus
= Ndis802_11EncryptionDisabled
;
1684 case WLAN_CIPHER_SUITE_WEP40
:
1685 *profile_cipher
= WLAN_CIPHER_SUITE_WEP40
;
1686 ndisencryptstatus
= Ndis802_11Encryption1Enabled
;
1688 case WLAN_CIPHER_SUITE_WEP104
:
1689 *profile_cipher
= WLAN_CIPHER_SUITE_WEP104
;
1690 ndisencryptstatus
= Ndis802_11Encryption1Enabled
;
1692 case WLAN_CIPHER_SUITE_TKIP
:
1693 *profile_cipher
= WLAN_CIPHER_SUITE_TKIP
;
1694 ndisencryptstatus
= Ndis802_11Encryption2Enabled
;
1696 case WLAN_CIPHER_SUITE_CCMP
:
1697 *profile_cipher
= WLAN_CIPHER_SUITE_CCMP
;
1698 ndisencryptstatus
= Ndis802_11Encryption3Enabled
;
1701 DBG_8723A("Unsupported cipher: 0x%x\n", cipher
);
1706 psecuritypriv
->ndisencryptstatus
= ndisencryptstatus
;
1711 static int rtw_cfg80211_set_key_mgt(struct security_priv
*psecuritypriv
,
1714 DBG_8723A("%s, key_mgt = 0x%x\n", __func__
, key_mgt
);
1716 if (key_mgt
== WLAN_AKM_SUITE_8021X
)
1717 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
1718 else if (key_mgt
== WLAN_AKM_SUITE_PSK
)
1719 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
1721 DBG_8723A("Invalid key mgt: 0x%x\n", key_mgt
);
1726 static int rtw_cfg80211_set_wpa_ie(struct rtw_adapter
*padapter
, const u8
*pie
,
1730 int group_cipher
= 0, pairwise_cipher
= 0;
1732 const u8
*pwpa
, *pwpa2
;
1735 if (!pie
|| !ielen
) {
1736 /* Treat this as normal case, but need to clear
1738 _clr_fwstate_(&padapter
->mlmepriv
, WIFI_UNDER_WPS
);
1741 if (ielen
> MAX_WPA_IE_LEN
+ MAX_WPS_IE_LEN
+ MAX_P2P_IE_LEN
) {
1747 DBG_8723A("set wpa_ie(length:%zu):\n", ielen
);
1748 for (i
= 0; i
< ielen
; i
= i
+ 8)
1749 DBG_8723A("0x%.2x 0x%.2x 0x%.2x 0x%.2x "
1750 "0x%.2x 0x%.2x 0x%.2x 0x%.2x\n",
1751 pie
[i
], pie
[i
+ 1], pie
[i
+ 2], pie
[i
+ 3],
1752 pie
[i
+ 4], pie
[i
+ 5], pie
[i
+ 6], pie
[i
+ 7]);
1753 if (ielen
< RSN_HEADER_LEN
) {
1754 RT_TRACE(_module_rtl871x_ioctl_os_c
, _drv_err_
,
1755 ("Ie len too short %d\n", (int)ielen
));
1760 pwpa
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
1761 WLAN_OUI_TYPE_MICROSOFT_WPA
,
1763 if (pwpa
&& pwpa
[1] > 0) {
1764 if (rtw_parse_wpa_ie23a(pwpa
, pwpa
[1] + 2, &group_cipher
,
1765 &pairwise_cipher
, NULL
) == _SUCCESS
) {
1766 padapter
->securitypriv
.dot11AuthAlgrthm
=
1767 dot11AuthAlgrthm_8021X
;
1768 padapter
->securitypriv
.ndisauthtype
=
1769 Ndis802_11AuthModeWPAPSK
;
1770 memcpy(padapter
->securitypriv
.supplicant_ie
, pwpa
,
1773 DBG_8723A("got wpa_ie, wpa_ielen:%u\n", pwpa
[1]);
1777 pwpa2
= cfg80211_find_ie(WLAN_EID_RSN
, pie
, ielen
);
1778 if (pwpa2
&& pwpa2
[1] > 0) {
1779 if (rtw_parse_wpa2_ie23a (pwpa2
, pwpa2
[1] + 2, &group_cipher
,
1780 &pairwise_cipher
, NULL
) == _SUCCESS
) {
1781 padapter
->securitypriv
.dot11AuthAlgrthm
=
1782 dot11AuthAlgrthm_8021X
;
1783 padapter
->securitypriv
.ndisauthtype
=
1784 Ndis802_11AuthModeWPA2PSK
;
1785 memcpy(padapter
->securitypriv
.supplicant_ie
, pwpa2
,
1788 DBG_8723A("got wpa2_ie, wpa2_ielen:%u\n", pwpa2
[1]);
1792 if (group_cipher
== 0) {
1793 group_cipher
= WPA_CIPHER_NONE
;
1795 if (pairwise_cipher
== 0) {
1796 pairwise_cipher
= WPA_CIPHER_NONE
;
1799 switch (group_cipher
) {
1800 case WPA_CIPHER_NONE
:
1801 padapter
->securitypriv
.dot118021XGrpPrivacy
= 0;
1802 padapter
->securitypriv
.ndisencryptstatus
=
1803 Ndis802_11EncryptionDisabled
;
1805 case WPA_CIPHER_WEP40
:
1806 padapter
->securitypriv
.dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_WEP40
;
1807 padapter
->securitypriv
.ndisencryptstatus
=
1808 Ndis802_11Encryption1Enabled
;
1810 case WPA_CIPHER_TKIP
:
1811 padapter
->securitypriv
.dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_TKIP
;
1812 padapter
->securitypriv
.ndisencryptstatus
=
1813 Ndis802_11Encryption2Enabled
;
1815 case WPA_CIPHER_CCMP
:
1816 padapter
->securitypriv
.dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_CCMP
;
1817 padapter
->securitypriv
.ndisencryptstatus
=
1818 Ndis802_11Encryption3Enabled
;
1820 case WPA_CIPHER_WEP104
:
1821 padapter
->securitypriv
.dot118021XGrpPrivacy
= WLAN_CIPHER_SUITE_WEP104
;
1822 padapter
->securitypriv
.ndisencryptstatus
=
1823 Ndis802_11Encryption1Enabled
;
1827 switch (pairwise_cipher
) {
1828 case WPA_CIPHER_NONE
:
1829 padapter
->securitypriv
.dot11PrivacyAlgrthm
= 0;
1830 padapter
->securitypriv
.ndisencryptstatus
=
1831 Ndis802_11EncryptionDisabled
;
1833 case WPA_CIPHER_WEP40
:
1834 padapter
->securitypriv
.dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP40
;
1835 padapter
->securitypriv
.ndisencryptstatus
=
1836 Ndis802_11Encryption1Enabled
;
1838 case WPA_CIPHER_TKIP
:
1839 padapter
->securitypriv
.dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_TKIP
;
1840 padapter
->securitypriv
.ndisencryptstatus
=
1841 Ndis802_11Encryption2Enabled
;
1843 case WPA_CIPHER_CCMP
:
1844 padapter
->securitypriv
.dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_CCMP
;
1845 padapter
->securitypriv
.ndisencryptstatus
=
1846 Ndis802_11Encryption3Enabled
;
1848 case WPA_CIPHER_WEP104
:
1849 padapter
->securitypriv
.dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP104
;
1850 padapter
->securitypriv
.ndisencryptstatus
=
1851 Ndis802_11Encryption1Enabled
;
1855 wps_ie
= cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
1856 WLAN_OUI_TYPE_MICROSOFT_WPS
,
1858 if (wps_ie
&& wps_ie
[1] > 0) {
1859 DBG_8723A("got wps_ie, wps_ielen:%u\n", wps_ie
[1]);
1860 padapter
->securitypriv
.wps_ie_len
= wps_ie
[1];
1861 memcpy(padapter
->securitypriv
.wps_ie
, wps_ie
,
1862 padapter
->securitypriv
.wps_ie_len
);
1863 set_fwstate(&padapter
->mlmepriv
, WIFI_UNDER_WPS
);
1865 _clr_fwstate_(&padapter
->mlmepriv
, WIFI_UNDER_WPS
);
1868 /* TKIP and AES disallow multicast packets until installing group key */
1869 if (padapter
->securitypriv
.dot11PrivacyAlgrthm
==
1870 WLAN_CIPHER_SUITE_TKIP
||
1871 padapter
->securitypriv
.dot11PrivacyAlgrthm
==
1872 WLAN_CIPHER_SUITE_CCMP
)
1873 /* WPS open need to enable multicast */
1874 /* check_fwstate(&padapter->mlmepriv, WIFI_UNDER_WPS) == true)*/
1875 rtl8723a_off_rcr_am(padapter
);
1877 RT_TRACE(_module_rtl871x_ioctl_os_c
, _drv_info_
,
1878 ("rtw_set_wpa_ie: pairwise_cipher = 0x%08x padapter->"
1879 "securitypriv.ndisencryptstatus =%d padapter->"
1880 "securitypriv.ndisauthtype =%d\n", pairwise_cipher
,
1881 padapter
->securitypriv
.ndisencryptstatus
,
1882 padapter
->securitypriv
.ndisauthtype
));
1886 _clr_fwstate_(&padapter
->mlmepriv
, WIFI_UNDER_WPS
);
1890 static int rtw_cfg80211_add_wep(struct rtw_adapter
*padapter
,
1891 struct rtw_wep_key
*wep
, u8 keyid
)
1894 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
1896 if (keyid
>= NUM_WEP_KEYS
) {
1897 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_err_
,
1898 ("%s:keyid>4 =>fail\n", __func__
));
1903 switch (wep
->keylen
) {
1904 case WLAN_KEY_LEN_WEP40
:
1905 psecuritypriv
->dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP40
;
1906 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1907 ("%s:wep->KeyLength = 5\n", __func__
));
1909 case WLAN_KEY_LEN_WEP104
:
1910 psecuritypriv
->dot11PrivacyAlgrthm
= WLAN_CIPHER_SUITE_WEP104
;
1911 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1912 ("%s:wep->KeyLength = 13\n", __func__
));
1915 psecuritypriv
->dot11PrivacyAlgrthm
= 0;
1916 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1917 ("%s:wep->KeyLength!= 5 or 13\n", __func__
));
1922 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1923 ("%s:before memcpy, wep->KeyLength = 0x%x keyid =%x\n",
1924 __func__
, wep
->keylen
, keyid
));
1926 memcpy(&psecuritypriv
->wep_key
[keyid
], wep
, sizeof(struct rtw_wep_key
));
1928 psecuritypriv
->dot11PrivacyKeyIndex
= keyid
;
1930 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1931 ("%s:security key material : "
1932 "%x %x %x %x %x %x %x %x %x %x %x %x %x\n", __func__
,
1933 psecuritypriv
->wep_key
[keyid
].key
[0],
1934 psecuritypriv
->wep_key
[keyid
].key
[1],
1935 psecuritypriv
->wep_key
[keyid
].key
[2],
1936 psecuritypriv
->wep_key
[keyid
].key
[3],
1937 psecuritypriv
->wep_key
[keyid
].key
[4],
1938 psecuritypriv
->wep_key
[keyid
].key
[5],
1939 psecuritypriv
->wep_key
[keyid
].key
[6],
1940 psecuritypriv
->wep_key
[keyid
].key
[7],
1941 psecuritypriv
->wep_key
[keyid
].key
[8],
1942 psecuritypriv
->wep_key
[keyid
].key
[9],
1943 psecuritypriv
->wep_key
[keyid
].key
[10],
1944 psecuritypriv
->wep_key
[keyid
].key
[11],
1945 psecuritypriv
->wep_key
[keyid
].key
[12]));
1947 res
= rtw_set_key23a(padapter
, psecuritypriv
, keyid
, 1);
1954 static int rtw_set_ssid(struct rtw_adapter
*padapter
,
1955 struct wlan_network
*newnetwork
)
1957 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
1958 struct wlan_network
*pnetwork
= &pmlmepriv
->cur_network
;
1959 int status
= _SUCCESS
;
1962 DBG_8723A_LEVEL(_drv_always_
, "set ssid [%s] fw_state = 0x%08x\n",
1963 newnetwork
->network
.Ssid
.ssid
, get_fwstate(pmlmepriv
));
1965 if (padapter
->hw_init_completed
== false) {
1966 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_err_
,
1967 ("set_ssid: hw_init_completed == false =>exit!!!\n"));
1972 spin_lock_bh(&pmlmepriv
->lock
);
1974 DBG_8723A("Set SSID under fw_state = 0x%08x\n", get_fwstate(pmlmepriv
));
1975 if (check_fwstate(pmlmepriv
, _FW_UNDER_SURVEY
))
1976 goto handle_tkip_countermeasure
;
1978 if (check_fwstate(pmlmepriv
, _FW_LINKED
|WIFI_ADHOC_MASTER_STATE
)) {
1979 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
1980 ("set_ssid: _FW_LINKED||WIFI_ADHOC_MASTER_STATE\n"));
1982 if (pmlmepriv
->assoc_ssid
.ssid_len
==
1983 newnetwork
->network
.Ssid
.ssid_len
&&
1984 !memcmp(&pmlmepriv
->assoc_ssid
.ssid
,
1985 newnetwork
->network
.Ssid
.ssid
,
1986 newnetwork
->network
.Ssid
.ssid_len
)) {
1987 if (!check_fwstate(pmlmepriv
, WIFI_STATION_STATE
)) {
1988 RT_TRACE(_module_rtl871x_ioctl_set_c_
,
1989 _drv_err_
, ("New SSID is same SSID, "
1990 "fw_state = 0x%08x\n",
1991 get_fwstate(pmlmepriv
)));
1993 if (rtw_is_same_ibss23a(padapter
, pnetwork
)) {
1995 * it means driver is in
1996 * WIFI_ADHOC_MASTER_STATE, we needn't
1999 goto release_mlme_lock
;
2003 * if in WIFI_ADHOC_MASTER_STATE |
2004 * WIFI_ADHOC_STATE, create bss or
2007 rtw_disassoc_cmd23a(padapter
, 0, true);
2009 if (check_fwstate(pmlmepriv
, _FW_LINKED
))
2010 rtw_indicate_disconnect23a(padapter
);
2012 rtw_free_assoc_resources23a(padapter
, 1);
2014 if (check_fwstate(pmlmepriv
,
2015 WIFI_ADHOC_MASTER_STATE
)) {
2016 _clr_fwstate_(pmlmepriv
,
2017 WIFI_ADHOC_MASTER_STATE
);
2018 set_fwstate(pmlmepriv
,
2022 rtw_lps_ctrl_wk_cmd23a(padapter
,
2023 LPS_CTRL_JOINBSS
, 1);
2026 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
2027 ("Set SSID not the same ssid\n"));
2028 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
2029 ("set_ssid =[%s] len = 0x%x\n",
2030 newnetwork
->network
.Ssid
.ssid
,
2031 newnetwork
->network
.Ssid
.ssid_len
));
2032 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_info_
,
2033 ("assoc_ssid =[%s] len = 0x%x\n",
2034 pmlmepriv
->assoc_ssid
.ssid
,
2035 pmlmepriv
->assoc_ssid
.ssid_len
));
2037 rtw_disassoc_cmd23a(padapter
, 0, true);
2039 if (check_fwstate(pmlmepriv
, _FW_LINKED
))
2040 rtw_indicate_disconnect23a(padapter
);
2042 rtw_free_assoc_resources23a(padapter
, 1);
2044 if (check_fwstate(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
)) {
2045 _clr_fwstate_(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
);
2046 set_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
);
2051 handle_tkip_countermeasure
:
2053 if (padapter
->securitypriv
.btkip_countermeasure
== true) {
2057 padapter
->securitypriv
.btkip_countermeasure_time
) >
2059 padapter
->securitypriv
.btkip_countermeasure
= false;
2060 padapter
->securitypriv
.btkip_countermeasure_time
= 0;
2063 goto release_mlme_lock
;
2067 memcpy(&pmlmepriv
->assoc_ssid
, &newnetwork
->network
.Ssid
,
2068 sizeof(struct cfg80211_ssid
));
2070 pmlmepriv
->assoc_by_bssid
= false;
2072 pmlmepriv
->to_join
= true;
2074 if (!check_fwstate(pmlmepriv
, _FW_UNDER_SURVEY
)) {
2075 pmlmepriv
->cur_network
.join_res
= -2;
2077 status
= rtw_do_join_network(padapter
, newnetwork
);
2078 if (status
== _SUCCESS
) {
2079 pmlmepriv
->to_join
= false;
2081 if (check_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
)) {
2082 /* switch to ADHOC_MASTER */
2083 status
= rtw_do_join_adhoc(padapter
);
2084 if (status
!= _SUCCESS
)
2085 goto release_mlme_lock
;
2087 /* can't associate ; reset under-linking */
2088 _clr_fwstate_(pmlmepriv
, _FW_UNDER_LINKING
);
2090 pmlmepriv
->to_join
= false;
2095 spin_unlock_bh(&pmlmepriv
->lock
);
2098 RT_TRACE(_module_rtl871x_ioctl_set_c_
, _drv_err_
,
2099 ("-%s: status =%d\n", __func__
, status
));
2104 static int cfg80211_rtw_connect(struct wiphy
*wiphy
, struct net_device
*ndev
,
2105 struct cfg80211_connect_params
*sme
)
2108 struct list_head
*phead
, *plist
, *ptmp
;
2109 struct wlan_network
*pnetwork
= NULL
;
2110 /* u8 matched_by_bssid = false; */
2111 /* u8 matched_by_ssid = false; */
2113 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2114 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
2115 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
2116 struct rtw_queue
*queue
= &pmlmepriv
->scanned_queue
;
2118 DBG_8723A("=>" "%s(%s)\n", __func__
, ndev
->name
);
2119 DBG_8723A("privacy =%d, key =%p, key_len =%d, key_idx =%d\n",
2120 sme
->privacy
, sme
->key
, sme
->key_len
, sme
->key_idx
);
2122 if (_FAIL
== rtw_pwr_wakeup(padapter
)) {
2127 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
2132 if (!sme
->ssid
|| !sme
->ssid_len
||
2133 sme
->ssid_len
> IEEE80211_MAX_SSID_LEN
) {
2138 DBG_8723A("ssid =%s, len =%zu\n", sme
->ssid
, sme
->ssid_len
);
2141 DBG_8723A("bssid =" MAC_FMT
"\n", MAC_ARG(sme
->bssid
));
2143 if (check_fwstate(pmlmepriv
, _FW_UNDER_LINKING
)) {
2145 DBG_8723A("%s, fw_state = 0x%x, goto exit\n", __func__
,
2146 pmlmepriv
->fw_state
);
2149 if (check_fwstate(pmlmepriv
, _FW_UNDER_SURVEY
)) {
2150 rtw_scan_abort23a(padapter
);
2153 spin_lock_bh(&queue
->lock
);
2155 phead
= get_list_head(queue
);
2157 list_for_each_safe(plist
, ptmp
, phead
) {
2158 pnetwork
= container_of(plist
, struct wlan_network
, list
);
2161 if (!ether_addr_equal(pnetwork
->network
.MacAddress
,
2166 if (sme
->ssid
&& sme
->ssid_len
) {
2167 if (pnetwork
->network
.Ssid
.ssid_len
!= sme
->ssid_len
||
2168 memcmp(pnetwork
->network
.Ssid
.ssid
, sme
->ssid
,
2174 if (ether_addr_equal(pnetwork
->network
.MacAddress
,
2176 DBG_8723A("matched by bssid\n");
2181 } else if (sme
->ssid
&& sme
->ssid_len
) {
2182 if (!memcmp(pnetwork
->network
.Ssid
.ssid
,
2183 sme
->ssid
, sme
->ssid_len
) &&
2184 pnetwork
->network
.Ssid
.ssid_len
== sme
->ssid_len
) {
2185 DBG_8723A("matched by ssid\n");
2193 spin_unlock_bh(&queue
->lock
);
2195 if (!matched
|| !pnetwork
) {
2197 DBG_8723A("connect, matched == false, goto exit\n");
2201 if (cfg80211_infrastructure_mode(
2202 padapter
, pnetwork
->network
.ifmode
) != _SUCCESS
) {
2207 psecuritypriv
->ndisencryptstatus
= Ndis802_11EncryptionDisabled
;
2208 psecuritypriv
->dot11PrivacyAlgrthm
= 0;
2209 psecuritypriv
->dot118021XGrpPrivacy
= 0;
2210 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_Open
;
2211 psecuritypriv
->ndisauthtype
= Ndis802_11AuthModeOpen
;
2213 ret
= rtw_cfg80211_set_wpa_version(psecuritypriv
,
2214 sme
->crypto
.wpa_versions
);
2218 ret
= rtw_cfg80211_set_auth_type(psecuritypriv
, sme
->auth_type
);
2223 DBG_8723A("%s, ie_len =%zu\n", __func__
, sme
->ie_len
);
2225 ret
= rtw_cfg80211_set_wpa_ie(padapter
, sme
->ie
, sme
->ie_len
);
2229 if (sme
->crypto
.n_ciphers_pairwise
) {
2230 ret
= rtw_cfg80211_set_cipher(psecuritypriv
,
2231 sme
->crypto
.ciphers_pairwise
[0],
2237 /* For WEP Shared auth */
2238 if ((psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_Shared
||
2239 psecuritypriv
->dot11AuthAlgrthm
== dot11AuthAlgrthm_Auto
) &&
2241 struct rtw_wep_key wep_key
;
2242 u8 wep_key_idx
, wep_key_len
;
2243 DBG_8723A("%s(): Shared/Auto WEP\n", __func__
);
2245 wep_key_idx
= sme
->key_idx
;
2246 wep_key_len
= sme
->key_len
;
2248 if (wep_key_idx
> WEP_KEYS
|| !wep_key_len
||
2249 wep_key_len
> WLAN_KEY_LEN_WEP104
) {
2254 wep_key_len
= wep_key_len
<= 5 ? 5 : 13;
2256 memset(&wep_key
, 0, sizeof(struct rtw_wep_key
));
2258 wep_key
.keylen
= wep_key_len
;
2260 if (wep_key_len
== 13) {
2261 padapter
->securitypriv
.dot11PrivacyAlgrthm
=
2262 WLAN_CIPHER_SUITE_WEP104
;
2263 padapter
->securitypriv
.dot118021XGrpPrivacy
=
2264 WLAN_CIPHER_SUITE_WEP104
;
2266 padapter
->securitypriv
.dot11PrivacyAlgrthm
=
2267 WLAN_CIPHER_SUITE_WEP40
;
2268 padapter
->securitypriv
.dot118021XGrpPrivacy
=
2269 WLAN_CIPHER_SUITE_WEP40
;
2272 memcpy(wep_key
.key
, (void *)sme
->key
, wep_key
.keylen
);
2274 if (rtw_cfg80211_add_wep(padapter
, &wep_key
, wep_key_idx
) !=
2282 ret
= rtw_cfg80211_set_cipher(psecuritypriv
,
2283 sme
->crypto
.cipher_group
, false);
2287 if (sme
->crypto
.n_akm_suites
) {
2288 ret
= rtw_cfg80211_set_key_mgt(psecuritypriv
,
2289 sme
->crypto
.akm_suites
[0]);
2294 if (psecuritypriv
->ndisauthtype
> 3)
2295 psecuritypriv
->dot11AuthAlgrthm
= dot11AuthAlgrthm_8021X
;
2297 if (rtw_set_auth23a(padapter
, psecuritypriv
) != _SUCCESS
) {
2302 /* rtw_set_802_11_encryption_mode(padapter,
2303 padapter->securitypriv.ndisencryptstatus); */
2305 if (rtw_set_ssid(padapter
, pnetwork
) != _SUCCESS
) {
2310 DBG_8723A("set ssid:dot11AuthAlgrthm =%d, dot11PrivacyAlgrthm =%d, "
2311 "dot118021XGrpPrivacy =%d\n", psecuritypriv
->dot11AuthAlgrthm
,
2312 psecuritypriv
->dot11PrivacyAlgrthm
,
2313 psecuritypriv
->dot118021XGrpPrivacy
);
2317 DBG_8723A("<=%s, ret %d\n", __func__
, ret
);
2322 static int cfg80211_rtw_disconnect(struct wiphy
*wiphy
, struct net_device
*ndev
,
2325 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2327 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
2329 rtw_set_roaming(padapter
, 0);
2331 if (check_fwstate(&padapter
->mlmepriv
, _FW_LINKED
)) {
2332 rtw_scan_abort23a(padapter
);
2333 LeaveAllPowerSaveMode23a(padapter
);
2334 rtw_disassoc_cmd23a(padapter
, 500, false);
2336 DBG_8723A("%s...call rtw_indicate_disconnect23a\n", __func__
);
2338 padapter
->mlmepriv
.not_indic_disco
= true;
2339 rtw_indicate_disconnect23a(padapter
);
2340 padapter
->mlmepriv
.not_indic_disco
= false;
2342 rtw_free_assoc_resources23a(padapter
, 1);
2348 static int cfg80211_rtw_set_txpower(struct wiphy
*wiphy
,
2349 struct wireless_dev
*wdev
,
2350 enum nl80211_tx_power_setting type
, int mbm
)
2352 DBG_8723A("%s\n", __func__
);
2356 static int cfg80211_rtw_get_txpower(struct wiphy
*wiphy
,
2357 struct wireless_dev
*wdev
, int *dbm
)
2359 DBG_8723A("%s\n", __func__
);
2364 inline bool rtw_cfg80211_pwr_mgmt(struct rtw_adapter
*adapter
)
2366 struct rtw_wdev_priv
*rtw_wdev_priv
= wdev_to_priv(adapter
->rtw_wdev
);
2367 return rtw_wdev_priv
->power_mgmt
;
2370 static int cfg80211_rtw_set_power_mgmt(struct wiphy
*wiphy
,
2371 struct net_device
*ndev
,
2372 bool enabled
, int timeout
)
2374 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2375 struct rtw_wdev_priv
*rtw_wdev_priv
= wdev_to_priv(padapter
->rtw_wdev
);
2377 DBG_8723A("%s(%s): enabled:%u, timeout:%d\n",
2378 __func__
, ndev
->name
, enabled
, timeout
);
2380 rtw_wdev_priv
->power_mgmt
= enabled
;
2383 LPS_Leave23a(padapter
);
2388 static int cfg80211_rtw_set_pmksa(struct wiphy
*wiphy
,
2389 struct net_device
*netdev
,
2390 struct cfg80211_pmksa
*pmksa
)
2392 u8 index
, blInserted
= false;
2393 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2394 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
2396 DBG_8723A("%s(%s)\n", __func__
, netdev
->name
);
2398 if (is_zero_ether_addr(pmksa
->bssid
))
2403 /* overwrite PMKID */
2404 for (index
= 0; index
< NUM_PMKID_CACHE
; index
++) {
2405 if (ether_addr_equal(psecuritypriv
->PMKIDList
[index
].Bssid
,
2407 /* BSSID is matched, the same AP => rewrite with
2409 DBG_8723A("%s(%s): BSSID exists in the PMKList.\n",
2410 __func__
, netdev
->name
);
2412 memcpy(psecuritypriv
->PMKIDList
[index
].PMKID
,
2413 pmksa
->pmkid
, WLAN_PMKID_LEN
);
2414 psecuritypriv
->PMKIDList
[index
].bUsed
= true;
2415 psecuritypriv
->PMKIDIndex
= index
+ 1;
2422 /* Find a new entry */
2423 DBG_8723A("%s(%s): Use new entry index = %d for this PMKID\n",
2424 __func__
, netdev
->name
, psecuritypriv
->PMKIDIndex
);
2427 psecuritypriv
->PMKIDList
[psecuritypriv
->PMKIDIndex
].
2428 Bssid
, pmksa
->bssid
);
2429 memcpy(psecuritypriv
->PMKIDList
[psecuritypriv
->PMKIDIndex
].
2430 PMKID
, pmksa
->pmkid
, WLAN_PMKID_LEN
);
2432 psecuritypriv
->PMKIDList
[psecuritypriv
->PMKIDIndex
].bUsed
=
2434 psecuritypriv
->PMKIDIndex
++;
2435 if (psecuritypriv
->PMKIDIndex
== 16) {
2436 psecuritypriv
->PMKIDIndex
= 0;
2443 static int cfg80211_rtw_del_pmksa(struct wiphy
*wiphy
,
2444 struct net_device
*netdev
,
2445 struct cfg80211_pmksa
*pmksa
)
2447 u8 index
, bMatched
= false;
2448 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2449 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
2451 DBG_8723A("%s(%s)\n", __func__
, netdev
->name
);
2453 for (index
= 0; index
< NUM_PMKID_CACHE
; index
++) {
2454 if (ether_addr_equal(psecuritypriv
->PMKIDList
[index
].Bssid
,
2456 /* BSSID is matched, the same AP => Remove this PMKID
2457 information and reset it. */
2458 eth_zero_addr(psecuritypriv
->PMKIDList
[index
].Bssid
);
2459 memset(psecuritypriv
->PMKIDList
[index
].PMKID
, 0x00,
2461 psecuritypriv
->PMKIDList
[index
].bUsed
= false;
2467 if (false == bMatched
) {
2468 DBG_8723A("%s(%s): do not have matched BSSID\n", __func__
,
2476 static int cfg80211_rtw_flush_pmksa(struct wiphy
*wiphy
,
2477 struct net_device
*netdev
)
2479 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2480 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
2482 DBG_8723A("%s(%s)\n", __func__
, netdev
->name
);
2484 memset(&psecuritypriv
->PMKIDList
[0], 0x00,
2485 sizeof(struct rt_pmkid_list
) * NUM_PMKID_CACHE
);
2486 psecuritypriv
->PMKIDIndex
= 0;
2491 #ifdef CONFIG_8723AU_AP_MODE
2492 void rtw_cfg80211_indicate_sta_assoc(struct rtw_adapter
*padapter
,
2493 u8
*pmgmt_frame
, uint frame_len
)
2497 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
2498 struct net_device
*ndev
= padapter
->pnetdev
;
2500 DBG_8723A("%s(padapter =%p,%s)\n", __func__
, padapter
, ndev
->name
);
2502 #if defined(RTW_USE_CFG80211_STA_EVENT)
2504 struct station_info sinfo
;
2507 if (ieee80211_is_assoc_req(hdr
->frame_control
))
2508 ie_offset
= offsetof(struct ieee80211_mgmt
,
2509 u
.assoc_req
.variable
);
2510 else /* WIFI_REASSOCREQ */
2511 ie_offset
= offsetof(struct ieee80211_mgmt
,
2512 u
.reassoc_req
.variable
);
2515 sinfo
.filled
= STATION_INFO_ASSOC_REQ_IES
;
2516 sinfo
.assoc_req_ies
= pmgmt_frame
+ ie_offset
;
2517 sinfo
.assoc_req_ies_len
= frame_len
- ie_offset
;
2518 cfg80211_new_sta(ndev
, hdr
->addr2
, &sinfo
, GFP_ATOMIC
);
2520 #else /* defined(RTW_USE_CFG80211_STA_EVENT) */
2521 channel
= pmlmeext
->cur_channel
;
2522 if (channel
<= RTW_CH_MAX_2G_CHANNEL
)
2523 freq
= ieee80211_channel_to_frequency(channel
,
2524 IEEE80211_BAND_2GHZ
);
2526 freq
= ieee80211_channel_to_frequency(channel
,
2527 IEEE80211_BAND_5GHZ
);
2529 cfg80211_rx_mgmt(padapter
->rtw_wdev
, freq
, 0, pmgmt_frame
, frame_len
,
2531 #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
2534 void rtw_cfg80211_indicate_sta_disassoc(struct rtw_adapter
*padapter
,
2536 unsigned short reason
)
2541 struct ieee80211_mgmt mgmt
;
2542 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
2543 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
2544 struct net_device
*ndev
= padapter
->pnetdev
;
2546 DBG_8723A("%s(padapter =%p,%s)\n", __func__
, padapter
, ndev
->name
);
2548 memset(&mgmt
, 0, sizeof(struct ieee80211_mgmt
));
2550 #if defined(RTW_USE_CFG80211_STA_EVENT)
2551 cfg80211_del_sta(ndev
, da
, GFP_ATOMIC
);
2552 #else /* defined(RTW_USE_CFG80211_STA_EVENT) */
2553 channel
= pmlmeext
->cur_channel
;
2554 if (channel
<= RTW_CH_MAX_2G_CHANNEL
)
2555 freq
= ieee80211_channel_to_frequency(channel
,
2556 IEEE80211_BAND_2GHZ
);
2558 freq
= ieee80211_channel_to_frequency(channel
,
2559 IEEE80211_BAND_5GHZ
);
2561 mgmt
.frame_control
=
2562 cpu_to_le16(IEEE80211_FTYPE_MGMT
| IEEE80211_STYPE_DEAUTH
);
2564 ether_addr_copy(mgmt
.da
, myid(&padapter
->eeprompriv
));
2565 ether_addr_copy(mgmt
.sa
, da
);
2566 ether_addr_copy(mgmt
.bssid
, get_my_bssid23a(&pmlmeinfo
->network
));
2568 mgmt
.seq_ctrl
= cpu_to_le16(IEEE80211_SN_TO_SEQ(pmlmeext
->mgnt_seq
));
2569 pmlmeext
->mgnt_seq
++;
2571 mgmt
.u
.disassoc
.reason_code
= cpu_to_le16(reason
);
2573 frame_len
= sizeof(struct ieee80211_hdr_3addr
) + 2;
2575 cfg80211_rx_mgmt(padapter
->rtw_wdev
, freq
, 0, (u8
*)&mgmt
, frame_len
,
2577 #endif /* defined(RTW_USE_CFG80211_STA_EVENT) */
2580 static int rtw_cfg80211_monitor_if_open(struct net_device
*ndev
)
2584 DBG_8723A("%s\n", __func__
);
2589 static int rtw_cfg80211_monitor_if_close(struct net_device
*ndev
)
2593 DBG_8723A("%s\n", __func__
);
2598 static int rtw_cfg80211_monitor_if_xmit_entry(struct sk_buff
*skb
,
2599 struct net_device
*ndev
)
2604 int dot11_hdr_len
= 24;
2606 unsigned char *pdata
;
2607 unsigned char src_mac_addr
[6];
2608 unsigned char dst_mac_addr
[6];
2609 struct ieee80211_hdr
*dot11_hdr
;
2610 struct ieee80211_radiotap_header
*rtap_hdr
;
2611 struct rtw_adapter
*padapter
= netdev_priv(ndev
);
2613 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
2615 if (unlikely(skb
->len
< sizeof(struct ieee80211_radiotap_header
)))
2618 rtap_hdr
= (struct ieee80211_radiotap_header
*)skb
->data
;
2619 if (unlikely(rtap_hdr
->it_version
))
2622 rtap_len
= ieee80211_get_radiotap_len(skb
->data
);
2623 if (unlikely(skb
->len
< rtap_len
))
2626 if (rtap_len
!= 14) {
2627 DBG_8723A("radiotap len (should be 14): %d\n", rtap_len
);
2631 /* Skip the ratio tap header */
2632 skb_pull(skb
, rtap_len
);
2634 dot11_hdr
= (struct ieee80211_hdr
*)skb
->data
;
2635 /* Check if the QoS bit is set */
2636 if (ieee80211_is_data(dot11_hdr
->frame_control
)) {
2637 /* Check if this ia a Wireless Distribution System (WDS) frame
2638 * which has 4 MAC addresses
2640 if (ieee80211_is_data_qos(dot11_hdr
->frame_control
))
2641 qos_len
= IEEE80211_QOS_CTL_LEN
;
2642 if (ieee80211_has_a4(dot11_hdr
->frame_control
))
2645 memcpy(dst_mac_addr
, dot11_hdr
->addr1
, sizeof(dst_mac_addr
));
2646 memcpy(src_mac_addr
, dot11_hdr
->addr2
, sizeof(src_mac_addr
));
2649 * Skip the 802.11 header, QoS (if any) and SNAP,
2650 * but leave spaces for two MAC addresses
2652 skb_pull(skb
, dot11_hdr_len
+ qos_len
+ snap_len
-
2654 pdata
= (unsigned char *)skb
->data
;
2655 ether_addr_copy(pdata
, dst_mac_addr
);
2656 ether_addr_copy(pdata
+ ETH_ALEN
, src_mac_addr
);
2658 DBG_8723A("should be eapol packet\n");
2660 /* Use the real net device to transmit the packet */
2661 ret
= rtw_xmit23a_entry23a(skb
, padapter
->pnetdev
);
2665 } else if (ieee80211_is_action(dot11_hdr
->frame_control
)) {
2666 struct ieee80211_mgmt
*mgmt
;
2667 /* only for action frames */
2668 struct xmit_frame
*pmgntframe
;
2669 struct pkt_attrib
*pattrib
;
2670 unsigned char *pframe
;
2671 /* u8 category, action, OUI_Subtype, dialogToken = 0; */
2672 /* unsigned char *frame_body; */
2673 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
2674 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
2676 u8 category
, action
;
2678 mgmt
= (struct ieee80211_mgmt
*)dot11_hdr
;
2680 DBG_8723A("RTW_Tx:da =" MAC_FMT
" via %s(%s)\n",
2681 MAC_ARG(mgmt
->da
), __func__
, ndev
->name
);
2682 category
= mgmt
->u
.action
.category
;
2683 action
= mgmt
->u
.action
.u
.wme_action
.action_code
;
2684 DBG_8723A("RTW_Tx:category(%u), action(%u)\n",
2687 /* starting alloc mgmt frame to dump it */
2688 pmgntframe
= alloc_mgtxmitframe23a(pxmitpriv
);
2689 if (pmgntframe
== NULL
)
2692 /* update attribute */
2693 pattrib
= &pmgntframe
->attrib
;
2694 update_mgntframe_attrib23a(padapter
, pattrib
);
2695 pattrib
->retry_ctrl
= false;
2697 memset(pmgntframe
->buf_addr
, 0, WLANHDR_OFFSET
+ TXDESC_OFFSET
);
2699 pframe
= (u8
*)(pmgntframe
->buf_addr
) + TXDESC_OFFSET
;
2701 memcpy(pframe
, skb
->data
, len
);
2702 pattrib
->pktlen
= len
;
2704 /* update seq number */
2705 pmlmeext
->mgnt_seq
= le16_to_cpu(dot11_hdr
->seq_ctrl
) >> 4;
2706 pattrib
->seqnum
= pmlmeext
->mgnt_seq
;
2707 pmlmeext
->mgnt_seq
++;
2709 pattrib
->last_txcmdsz
= pattrib
->pktlen
;
2711 dump_mgntframe23a(padapter
, pmgntframe
);
2722 rtw_cfg80211_monitor_if_set_mac_address(struct net_device
*ndev
, void *addr
)
2726 DBG_8723A("%s\n", __func__
);
2731 static const struct net_device_ops rtw_cfg80211_monitor_if_ops
= {
2732 .ndo_open
= rtw_cfg80211_monitor_if_open
,
2733 .ndo_stop
= rtw_cfg80211_monitor_if_close
,
2734 .ndo_start_xmit
= rtw_cfg80211_monitor_if_xmit_entry
,
2735 .ndo_set_mac_address
= rtw_cfg80211_monitor_if_set_mac_address
,
2738 static int rtw_cfg80211_add_monitor_if(struct rtw_adapter
*padapter
, char *name
,
2739 struct net_device
**ndev
)
2742 struct net_device
*mon_ndev
= NULL
;
2743 struct wireless_dev
*mon_wdev
= NULL
;
2744 struct rtw_wdev_priv
*pwdev_priv
= wdev_to_priv(padapter
->rtw_wdev
);
2747 DBG_8723A("%s(%s): without specific name\n",
2748 __func__
, padapter
->pnetdev
->name
);
2753 if (pwdev_priv
->pmon_ndev
) {
2754 DBG_8723A("%s(%s): monitor interface exist: %s\n", __func__
,
2755 padapter
->pnetdev
->name
, pwdev_priv
->pmon_ndev
->name
);
2760 mon_ndev
= alloc_etherdev(sizeof(struct rtw_adapter
));
2762 DBG_8723A("%s(%s): allocate ndev fail\n", __func__
,
2763 padapter
->pnetdev
->name
);
2768 mon_ndev
->type
= ARPHRD_IEEE80211_RADIOTAP
;
2769 strncpy(mon_ndev
->name
, name
, IFNAMSIZ
);
2770 mon_ndev
->name
[IFNAMSIZ
- 1] = 0;
2771 mon_ndev
->destructor
= rtw_ndev_destructor
;
2773 mon_ndev
->netdev_ops
= &rtw_cfg80211_monitor_if_ops
;
2776 mon_wdev
= kzalloc(sizeof(struct wireless_dev
), GFP_KERNEL
);
2778 DBG_8723A("%s(%s): allocate mon_wdev fail\n", __func__
,
2779 padapter
->pnetdev
->name
);
2784 mon_wdev
->wiphy
= padapter
->rtw_wdev
->wiphy
;
2785 mon_wdev
->netdev
= mon_ndev
;
2786 mon_wdev
->iftype
= NL80211_IFTYPE_MONITOR
;
2787 mon_ndev
->ieee80211_ptr
= mon_wdev
;
2789 ret
= register_netdevice(mon_ndev
);
2794 *ndev
= pwdev_priv
->pmon_ndev
= mon_ndev
;
2795 memcpy(pwdev_priv
->ifname_mon
, name
, IFNAMSIZ
+ 1);
2803 if (ret
&& mon_ndev
) {
2804 free_netdev(mon_ndev
);
2805 *ndev
= mon_ndev
= NULL
;
2811 static struct wireless_dev
*
2812 cfg80211_rtw_add_virtual_intf(struct wiphy
*wiphy
, const char *name
,
2813 enum nl80211_iftype type
, u32
*flags
,
2814 struct vif_params
*params
)
2817 struct net_device
*ndev
= NULL
;
2818 struct rtw_adapter
*padapter
= wiphy_to_adapter(wiphy
);
2820 DBG_8723A("%s(%s): wiphy:%s, name:%s, type:%d\n", __func__
,
2821 padapter
->pnetdev
->name
, wiphy_name(wiphy
), name
, type
);
2824 case NL80211_IFTYPE_ADHOC
:
2825 case NL80211_IFTYPE_AP_VLAN
:
2826 case NL80211_IFTYPE_WDS
:
2827 case NL80211_IFTYPE_MESH_POINT
:
2830 case NL80211_IFTYPE_MONITOR
:
2832 rtw_cfg80211_add_monitor_if(padapter
, (char *)name
, &ndev
);
2835 case NL80211_IFTYPE_P2P_CLIENT
:
2836 case NL80211_IFTYPE_STATION
:
2840 case NL80211_IFTYPE_P2P_GO
:
2841 case NL80211_IFTYPE_AP
:
2846 DBG_8723A("Unsupported interface type\n");
2850 DBG_8723A("%s(%s): ndev:%p, ret:%d\n", __func__
,
2851 padapter
->pnetdev
->name
,
2854 return ndev
? ndev
->ieee80211_ptr
: ERR_PTR(ret
);
2857 static int cfg80211_rtw_del_virtual_intf(struct wiphy
*wiphy
,
2858 struct wireless_dev
*wdev
)
2860 struct rtw_wdev_priv
*pwdev_priv
=
2861 (struct rtw_wdev_priv
*)wiphy_priv(wiphy
);
2862 struct net_device
*ndev
;
2863 ndev
= wdev
? wdev
->netdev
: NULL
;
2868 unregister_netdevice(ndev
);
2870 if (ndev
== pwdev_priv
->pmon_ndev
) {
2871 pwdev_priv
->pmon_ndev
= NULL
;
2872 pwdev_priv
->ifname_mon
[0] = '\0';
2873 DBG_8723A("%s(%s): remove monitor interface\n",
2874 __func__
, ndev
->name
);
2881 static int rtw_add_beacon(struct rtw_adapter
*adapter
, const u8
*head
,
2882 size_t head_len
, const u8
*tail
, size_t tail_len
)
2886 uint len
, ielen
, wps_ielen
= 0;
2887 struct mlme_priv
*pmlmepriv
= &adapter
->mlmepriv
;
2888 struct wlan_bssid_ex
*bss
= &pmlmepriv
->cur_network
.network
;
2889 const struct ieee80211_mgmt
*mgmt
= (struct ieee80211_mgmt
*)head
;
2890 struct ieee80211_mgmt
*tmpmgmt
;
2891 /* struct sta_priv *pstapriv = &padapter->stapriv; */
2893 DBG_8723A("%s beacon_head_len =%zu, beacon_tail_len =%zu\n",
2894 __func__
, head_len
, tail_len
);
2896 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
) != true)
2899 if (head_len
< offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
))
2902 pbuf
= kzalloc(head_len
+ tail_len
, GFP_KERNEL
);
2905 tmpmgmt
= (struct ieee80211_mgmt
*)pbuf
;
2907 bss
->beacon_interval
= get_unaligned_le16(&mgmt
->u
.beacon
.beacon_int
);
2908 bss
->capability
= get_unaligned_le16(&mgmt
->u
.beacon
.capab_info
);
2909 bss
->tsf
= get_unaligned_le64(&mgmt
->u
.beacon
.timestamp
);
2911 /* 24 = beacon header len. */
2912 memcpy(pbuf
, (void *)head
, head_len
);
2913 memcpy(pbuf
+ head_len
, (void *)tail
, tail_len
);
2915 len
= head_len
+ tail_len
;
2916 ielen
= len
- offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
2917 /* check wps ie if inclued */
2918 if (cfg80211_find_vendor_ie(WLAN_OUI_MICROSOFT
,
2919 WLAN_OUI_TYPE_MICROSOFT_WPS
,
2920 tmpmgmt
->u
.beacon
.variable
, ielen
))
2921 DBG_8723A("add bcn, wps_ielen =%d\n", wps_ielen
);
2923 /* pbss_network->IEs will not include p2p_ie, wfd ie */
2924 rtw_ies_remove_ie23a(tmpmgmt
->u
.beacon
.variable
, &ielen
, 0,
2925 WLAN_EID_VENDOR_SPECIFIC
, P2P_OUI23A
, 4);
2926 rtw_ies_remove_ie23a(tmpmgmt
->u
.beacon
.variable
, &ielen
, 0,
2927 WLAN_EID_VENDOR_SPECIFIC
, WFD_OUI23A
, 4);
2929 len
= ielen
+ offsetof(struct ieee80211_mgmt
, u
.beacon
.variable
);
2930 if (rtw_check_beacon_data23a(adapter
, tmpmgmt
, len
) == _SUCCESS
) {
2941 static int cfg80211_rtw_start_ap(struct wiphy
*wiphy
, struct net_device
*ndev
,
2942 struct cfg80211_ap_settings
*settings
)
2945 struct rtw_adapter
*adapter
= wiphy_to_adapter(wiphy
);
2947 DBG_8723A("%s(%s): hidden_ssid:%d, auth_type:%d\n",
2948 __func__
, ndev
->name
, settings
->hidden_ssid
,
2949 settings
->auth_type
);
2951 ret
= rtw_add_beacon(adapter
, settings
->beacon
.head
,
2952 settings
->beacon
.head_len
, settings
->beacon
.tail
,
2953 settings
->beacon
.tail_len
);
2955 adapter
->mlmeextpriv
.mlmext_info
.hidden_ssid_mode
=
2956 settings
->hidden_ssid
;
2958 if (settings
->ssid
&& settings
->ssid_len
) {
2959 struct wlan_bssid_ex
*pbss_network
=
2960 &adapter
->mlmepriv
.cur_network
.network
;
2961 struct wlan_bssid_ex
*pbss_network_ext
=
2962 &adapter
->mlmeextpriv
.mlmext_info
.network
;
2964 memcpy(pbss_network
->Ssid
.ssid
, (void *)settings
->ssid
,
2965 settings
->ssid_len
);
2966 pbss_network
->Ssid
.ssid_len
= settings
->ssid_len
;
2967 memcpy(pbss_network_ext
->Ssid
.ssid
, (void *)settings
->ssid
,
2968 settings
->ssid_len
);
2969 pbss_network_ext
->Ssid
.ssid_len
= settings
->ssid_len
;
2975 static int cfg80211_rtw_change_beacon(struct wiphy
*wiphy
,
2976 struct net_device
*ndev
,
2977 struct cfg80211_beacon_data
*info
)
2980 struct rtw_adapter
*adapter
= wiphy_to_adapter(wiphy
);
2982 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
2984 ret
= rtw_add_beacon(adapter
, info
->head
, info
->head_len
, info
->tail
,
2990 static int cfg80211_rtw_stop_ap(struct wiphy
*wiphy
, struct net_device
*ndev
)
2992 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
2996 static int cfg80211_rtw_add_station(struct wiphy
*wiphy
,
2997 struct net_device
*ndev
, const u8
*mac
,
2998 struct station_parameters
*params
)
3000 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
3005 static int cfg80211_rtw_del_station(struct wiphy
*wiphy
,
3006 struct net_device
*ndev
, const u8
*mac
)
3009 struct list_head
*phead
, *plist
, *ptmp
;
3011 struct sta_info
*psta
;
3012 struct rtw_adapter
*padapter
= netdev_priv(ndev
);
3013 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
3014 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
3016 DBG_8723A("+%s(%s)\n", __func__
, ndev
->name
);
3018 if (check_fwstate(pmlmepriv
, (_FW_LINKED
| WIFI_AP_STATE
)) != true) {
3019 DBG_8723A("%s, fw_state != FW_LINKED|WIFI_AP_STATE\n",
3025 DBG_8723A("flush all sta, and cam_entry\n");
3027 flush_all_cam_entry23a(padapter
); /* clear CAM */
3029 ret
= rtw_sta_flush23a(padapter
);
3034 DBG_8723A("free sta macaddr =" MAC_FMT
"\n", MAC_ARG(mac
));
3036 if (is_broadcast_ether_addr(mac
))
3039 spin_lock_bh(&pstapriv
->asoc_list_lock
);
3041 phead
= &pstapriv
->asoc_list
;
3043 /* check asoc_queue */
3044 list_for_each_safe(plist
, ptmp
, phead
) {
3045 psta
= container_of(plist
, struct sta_info
, asoc_list
);
3047 if (ether_addr_equal(mac
, psta
->hwaddr
)) {
3048 if (psta
->dot8021xalg
== 1 &&
3049 psta
->bpairwise_key_installed
== false) {
3050 DBG_8723A("%s, sta's dot8021xalg = 1 and "
3051 "key_installed = false\n", __func__
);
3053 DBG_8723A("free psta =%p, aid =%d\n", psta
,
3056 list_del_init(&psta
->asoc_list
);
3057 pstapriv
->asoc_list_cnt
--;
3059 /* spin_unlock_bh(&pstapriv->asoc_list_lock); */
3061 ap_free_sta23a(padapter
, psta
, true,
3062 WLAN_REASON_DEAUTH_LEAVING
);
3063 /* spin_lock_bh(&pstapriv->asoc_list_lock); */
3072 spin_unlock_bh(&pstapriv
->asoc_list_lock
);
3074 associated_clients_update23a(padapter
, updated
);
3076 DBG_8723A("-%s(%s)\n", __func__
, ndev
->name
);
3081 static int cfg80211_rtw_change_station(struct wiphy
*wiphy
,
3082 struct net_device
*ndev
, const u8
*mac
,
3083 struct station_parameters
*params
)
3085 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
3089 static int cfg80211_rtw_dump_station(struct wiphy
*wiphy
,
3090 struct net_device
*ndev
, int idx
, u8
*mac
,
3091 struct station_info
*sinfo
)
3093 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
3095 /* TODO: dump scanned queue */
3100 static int cfg80211_rtw_change_bss(struct wiphy
*wiphy
, struct net_device
*ndev
,
3101 struct bss_parameters
*params
)
3103 DBG_8723A("%s(%s)\n", __func__
, ndev
->name
);
3106 #endif /* CONFIG_8723AU_AP_MODE */
3108 static int _cfg80211_rtw_mgmt_tx(struct rtw_adapter
*padapter
, u8 tx_ch
,
3109 const u8
*buf
, size_t len
)
3111 struct xmit_frame
*pmgntframe
;
3112 struct pkt_attrib
*pattrib
;
3113 unsigned char *pframe
;
3115 struct ieee80211_hdr
*pwlanhdr
;
3116 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
3117 struct mlme_ext_priv
*pmlmeext
= &padapter
->mlmeextpriv
;
3119 if (_FAIL
== rtw_pwr_wakeup(padapter
)) {
3124 rtw_set_scan_deny(padapter
, 1000);
3126 rtw_scan_abort23a(padapter
);
3128 if (tx_ch
!= rtw_get_oper_ch23a(padapter
)) {
3129 if (!check_fwstate(&padapter
->mlmepriv
, _FW_LINKED
))
3130 pmlmeext
->cur_channel
= tx_ch
;
3131 set_channel_bwmode23a(padapter
, tx_ch
,
3132 HAL_PRIME_CHNL_OFFSET_DONT_CARE
,
3133 HT_CHANNEL_WIDTH_20
);
3136 /* starting alloc mgmt frame to dump it */
3137 pmgntframe
= alloc_mgtxmitframe23a(pxmitpriv
);
3139 /* ret = -ENOMEM; */
3144 /* update attribute */
3145 pattrib
= &pmgntframe
->attrib
;
3146 update_mgntframe_attrib23a(padapter
, pattrib
);
3147 pattrib
->retry_ctrl
= false;
3149 memset(pmgntframe
->buf_addr
, 0, WLANHDR_OFFSET
+ TXDESC_OFFSET
);
3151 pframe
= (u8
*) (pmgntframe
->buf_addr
) + TXDESC_OFFSET
;
3153 memcpy(pframe
, (void *)buf
, len
);
3154 pattrib
->pktlen
= len
;
3156 pwlanhdr
= (struct ieee80211_hdr
*)pframe
;
3157 /* update seq number */
3158 pmlmeext
->mgnt_seq
= le16_to_cpu(pwlanhdr
->seq_ctrl
) >> 4;
3159 pattrib
->seqnum
= pmlmeext
->mgnt_seq
;
3160 pmlmeext
->mgnt_seq
++;
3162 pattrib
->last_txcmdsz
= pattrib
->pktlen
;
3164 ret
= dump_mgntframe23a_and_wait_ack23a(padapter
, pmgntframe
);
3166 if (ret
!= _SUCCESS
)
3167 DBG_8723A("%s, ack == false\n", __func__
);
3169 DBG_8723A("%s, ack == true\n", __func__
);
3173 DBG_8723A("%s, ret =%d\n", __func__
, ret
);
3178 static int cfg80211_rtw_mgmt_tx(struct wiphy
*wiphy
, struct wireless_dev
*wdev
,
3179 struct cfg80211_mgmt_tx_params
*params
,
3182 struct rtw_adapter
*padapter
=
3183 (struct rtw_adapter
*)wiphy_to_adapter(wiphy
);
3186 u32 dump_limit
= RTW_MAX_MGMT_TX_CNT
;
3189 u8 category
, action
;
3190 unsigned long start
= jiffies
;
3191 size_t len
= params
->len
;
3192 struct ieee80211_channel
*chan
= params
->chan
;
3193 const u8
*buf
= params
->buf
;
3194 struct ieee80211_mgmt
*hdr
= (struct ieee80211_mgmt
*)buf
;
3195 u8 tx_ch
= (u8
) ieee80211_frequency_to_channel(chan
->center_freq
);
3197 if (!ieee80211_is_action(hdr
->frame_control
))
3200 /* cookie generation */
3201 *cookie
= (unsigned long)buf
;
3203 DBG_8723A("%s(%s): len =%zu, ch =%d\n", __func__
,
3204 padapter
->pnetdev
->name
, len
, tx_ch
);
3206 /* indicate ack before issue frame to avoid racing with rsp frame */
3207 cfg80211_mgmt_tx_status(padapter
->rtw_wdev
, *cookie
, buf
, len
, ack
,
3210 DBG_8723A("RTW_Tx:tx_ch =%d, da =" MAC_FMT
"\n", tx_ch
,
3212 category
= hdr
->u
.action
.category
;
3213 action
= hdr
->u
.action
.u
.wme_action
.action_code
;
3214 DBG_8723A("RTW_Tx:category(%u), action(%u)\n", category
, action
);
3218 tx_ret
= _cfg80211_rtw_mgmt_tx(padapter
, tx_ch
, buf
, len
);
3219 } while (dump_cnt
< dump_limit
&& tx_ret
!= _SUCCESS
);
3221 if (tx_ret
!= _SUCCESS
|| dump_cnt
> 1) {
3222 DBG_8723A("%s(%s): %s (%d/%d) in %d ms\n",
3223 __func__
, padapter
->pnetdev
->name
,
3224 tx_ret
== _SUCCESS
? "OK" : "FAIL", dump_cnt
,
3225 dump_limit
, jiffies_to_msecs(jiffies
- start
));
3231 static void cfg80211_rtw_mgmt_frame_register(struct wiphy
*wiphy
,
3232 struct wireless_dev
*wdev
,
3233 u16 frame_type
, bool reg
)
3235 if (frame_type
!= (IEEE80211_FTYPE_MGMT
| IEEE80211_STYPE_PROBE_REQ
))
3241 static struct cfg80211_ops rtw_cfg80211_ops
= {
3242 .change_virtual_intf
= cfg80211_rtw_change_iface
,
3243 .add_key
= cfg80211_rtw_add_key
,
3244 .get_key
= cfg80211_rtw_get_key
,
3245 .del_key
= cfg80211_rtw_del_key
,
3246 .set_default_key
= cfg80211_rtw_set_default_key
,
3247 .get_station
= cfg80211_rtw_get_station
,
3248 .scan
= cfg80211_rtw_scan
,
3249 .set_wiphy_params
= cfg80211_rtw_set_wiphy_params
,
3250 .connect
= cfg80211_rtw_connect
,
3251 .disconnect
= cfg80211_rtw_disconnect
,
3252 .join_ibss
= cfg80211_rtw_join_ibss
,
3253 .leave_ibss
= cfg80211_rtw_leave_ibss
,
3254 .set_tx_power
= cfg80211_rtw_set_txpower
,
3255 .get_tx_power
= cfg80211_rtw_get_txpower
,
3256 .set_power_mgmt
= cfg80211_rtw_set_power_mgmt
,
3257 .set_pmksa
= cfg80211_rtw_set_pmksa
,
3258 .del_pmksa
= cfg80211_rtw_del_pmksa
,
3259 .flush_pmksa
= cfg80211_rtw_flush_pmksa
,
3261 #ifdef CONFIG_8723AU_AP_MODE
3262 .add_virtual_intf
= cfg80211_rtw_add_virtual_intf
,
3263 .del_virtual_intf
= cfg80211_rtw_del_virtual_intf
,
3265 .start_ap
= cfg80211_rtw_start_ap
,
3266 .change_beacon
= cfg80211_rtw_change_beacon
,
3267 .stop_ap
= cfg80211_rtw_stop_ap
,
3269 .add_station
= cfg80211_rtw_add_station
,
3270 .del_station
= cfg80211_rtw_del_station
,
3271 .change_station
= cfg80211_rtw_change_station
,
3272 .dump_station
= cfg80211_rtw_dump_station
,
3273 .change_bss
= cfg80211_rtw_change_bss
,
3274 #endif /* CONFIG_8723AU_AP_MODE */
3276 .mgmt_tx
= cfg80211_rtw_mgmt_tx
,
3277 .mgmt_frame_register
= cfg80211_rtw_mgmt_frame_register
,
3280 static void rtw_cfg80211_init_ht_capab(struct ieee80211_sta_ht_cap
*ht_cap
,
3281 enum ieee80211_band band
, u8 rf_type
)
3284 #define MAX_BIT_RATE_40MHZ_MCS15 300 /* Mbps */
3285 #define MAX_BIT_RATE_40MHZ_MCS7 150 /* Mbps */
3287 ht_cap
->ht_supported
= true;
3289 ht_cap
->cap
= IEEE80211_HT_CAP_SUP_WIDTH_20_40
|
3290 IEEE80211_HT_CAP_SGI_40
| IEEE80211_HT_CAP_SGI_20
|
3291 IEEE80211_HT_CAP_DSSSCCK40
| IEEE80211_HT_CAP_MAX_AMSDU
;
3294 *Maximum length of AMPDU that the STA can receive.
3295 *Length = 2 ^ (13 + max_ampdu_length_exp) - 1 (octets)
3297 ht_cap
->ampdu_factor
= IEEE80211_HT_MAX_AMPDU_64K
;
3299 /*Minimum MPDU start spacing , */
3300 ht_cap
->ampdu_density
= IEEE80211_HT_MPDU_DENSITY_16
;
3302 ht_cap
->mcs
.tx_params
= IEEE80211_HT_MCS_TX_DEFINED
;
3305 *hw->wiphy->bands[IEEE80211_BAND_2GHZ]
3308 *if rx_ant = 1 rx_mask[0]= 0xff;==>MCS0-MCS7
3309 *if rx_ant = 2 rx_mask[1]= 0xff;==>MCS8-MCS15
3310 *if rx_ant >= 3 rx_mask[2]= 0xff;
3311 *if BW_40 rx_mask[4]= 0x01;
3312 *highest supported RX rate
3314 if (rf_type
== RF_1T1R
) {
3315 ht_cap
->mcs
.rx_mask
[0] = 0xFF;
3316 ht_cap
->mcs
.rx_mask
[1] = 0x00;
3317 ht_cap
->mcs
.rx_mask
[4] = 0x01;
3319 ht_cap
->mcs
.rx_highest
= MAX_BIT_RATE_40MHZ_MCS7
;
3320 } else if ((rf_type
== RF_1T2R
) || (rf_type
== RF_2T2R
)) {
3321 ht_cap
->mcs
.rx_mask
[0] = 0xFF;
3322 ht_cap
->mcs
.rx_mask
[1] = 0xFF;
3323 ht_cap
->mcs
.rx_mask
[4] = 0x01;
3325 ht_cap
->mcs
.rx_highest
= MAX_BIT_RATE_40MHZ_MCS15
;
3327 DBG_8723A("%s, error rf_type =%d\n", __func__
, rf_type
);
3332 void rtw_cfg80211_init_wiphy(struct rtw_adapter
*padapter
)
3335 struct ieee80211_supported_band
*bands
;
3336 struct wireless_dev
*pwdev
= padapter
->rtw_wdev
;
3337 struct wiphy
*wiphy
= pwdev
->wiphy
;
3339 rf_type
= rtl8723a_get_rf_type(padapter
);
3341 DBG_8723A("%s:rf_type =%d\n", __func__
, rf_type
);
3343 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */
3345 bands
= wiphy
->bands
[IEEE80211_BAND_2GHZ
];
3347 rtw_cfg80211_init_ht_capab(&bands
->ht_cap
,
3348 IEEE80211_BAND_2GHZ
,
3352 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */
3354 bands
= wiphy
->bands
[IEEE80211_BAND_5GHZ
];
3356 rtw_cfg80211_init_ht_capab(&bands
->ht_cap
,
3357 IEEE80211_BAND_5GHZ
,
3362 static void rtw_cfg80211_preinit_wiphy(struct rtw_adapter
*padapter
,
3363 struct wiphy
*wiphy
)
3365 wiphy
->signal_type
= CFG80211_SIGNAL_TYPE_MBM
;
3367 wiphy
->max_scan_ssids
= RTW_SSID_SCAN_AMOUNT
;
3368 wiphy
->max_scan_ie_len
= IEEE80211_MAX_DATA_LEN
;
3369 wiphy
->max_num_pmkids
= RTW_MAX_NUM_PMKIDS
;
3371 wiphy
->max_remain_on_channel_duration
=
3372 RTW_MAX_REMAIN_ON_CHANNEL_DURATION
;
3374 wiphy
->interface_modes
= BIT(NL80211_IFTYPE_STATION
) |
3375 BIT(NL80211_IFTYPE_ADHOC
) |
3376 #ifdef CONFIG_8723AU_AP_MODE
3377 BIT(NL80211_IFTYPE_AP
) | BIT(NL80211_IFTYPE_MONITOR
) |
3381 #ifdef CONFIG_8723AU_AP_MODE
3382 wiphy
->mgmt_stypes
= rtw_cfg80211_default_mgmt_stypes
;
3383 #endif /* CONFIG_8723AU_AP_MODE */
3385 wiphy
->software_iftypes
|= BIT(NL80211_IFTYPE_MONITOR
);
3388 wiphy->iface_combinations = &rtw_combinations;
3389 wiphy->n_iface_combinations = 1;
3392 wiphy
->cipher_suites
= rtw_cipher_suites
;
3393 wiphy
->n_cipher_suites
= ARRAY_SIZE(rtw_cipher_suites
);
3395 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11G) */
3396 wiphy
->bands
[IEEE80211_BAND_2GHZ
] =
3397 rtw_spt_band_alloc(IEEE80211_BAND_2GHZ
);
3398 /* if (padapter->registrypriv.wireless_mode & WIRELESS_11A) */
3399 wiphy
->bands
[IEEE80211_BAND_5GHZ
] =
3400 rtw_spt_band_alloc(IEEE80211_BAND_5GHZ
);
3402 wiphy
->flags
|= WIPHY_FLAG_HAS_REMAIN_ON_CHANNEL
;
3403 wiphy
->flags
|= WIPHY_FLAG_OFFCHAN_TX
| WIPHY_FLAG_HAVE_AP_SME
;
3405 if (padapter
->registrypriv
.power_mgnt
!= PS_MODE_ACTIVE
)
3406 wiphy
->flags
|= WIPHY_FLAG_PS_ON_BY_DEFAULT
;
3408 wiphy
->flags
&= ~WIPHY_FLAG_PS_ON_BY_DEFAULT
;
3411 int rtw_wdev_alloc(struct rtw_adapter
*padapter
, struct device
*dev
)
3414 struct wiphy
*wiphy
;
3415 struct wireless_dev
*wdev
;
3416 struct rtw_wdev_priv
*pwdev_priv
;
3417 struct net_device
*pnetdev
= padapter
->pnetdev
;
3419 DBG_8723A("%s(padapter =%p)\n", __func__
, padapter
);
3422 wiphy
= wiphy_new(&rtw_cfg80211_ops
, sizeof(struct rtw_wdev_priv
));
3424 DBG_8723A("Couldn't allocate wiphy device\n");
3430 wdev
= kzalloc(sizeof(struct wireless_dev
), GFP_KERNEL
);
3432 DBG_8723A("Couldn't allocate wireless device\n");
3437 set_wiphy_dev(wiphy
, dev
);
3438 rtw_cfg80211_preinit_wiphy(padapter
, wiphy
);
3440 ret
= wiphy_register(wiphy
);
3442 DBG_8723A("Couldn't register wiphy device\n");
3446 wdev
->wiphy
= wiphy
;
3447 wdev
->netdev
= pnetdev
;
3448 /* wdev->iftype = NL80211_IFTYPE_STATION; */
3449 /* for rtw_setopmode_cmd23a() in cfg80211_rtw_change_iface() */
3450 wdev
->iftype
= NL80211_IFTYPE_MONITOR
;
3451 padapter
->rtw_wdev
= wdev
;
3452 pnetdev
->ieee80211_ptr
= wdev
;
3454 /* init pwdev_priv */
3455 pwdev_priv
= wdev_to_priv(wdev
);
3456 pwdev_priv
->rtw_wdev
= wdev
;
3457 pwdev_priv
->pmon_ndev
= NULL
;
3458 pwdev_priv
->ifname_mon
[0] = '\0';
3459 pwdev_priv
->padapter
= padapter
;
3460 pwdev_priv
->scan_request
= NULL
;
3461 spin_lock_init(&pwdev_priv
->scan_req_lock
);
3463 pwdev_priv
->p2p_enabled
= false;
3465 if (padapter
->registrypriv
.power_mgnt
!= PS_MODE_ACTIVE
)
3466 pwdev_priv
->power_mgmt
= true;
3468 pwdev_priv
->power_mgmt
= false;
3479 void rtw_wdev_free(struct wireless_dev
*wdev
)
3481 DBG_8723A("%s(wdev =%p)\n", __func__
, wdev
);
3486 kfree(wdev
->wiphy
->bands
[IEEE80211_BAND_2GHZ
]);
3487 kfree(wdev
->wiphy
->bands
[IEEE80211_BAND_5GHZ
]);
3489 wiphy_free(wdev
->wiphy
);
3494 void rtw_wdev_unregister(struct wireless_dev
*wdev
)
3496 struct rtw_wdev_priv
*pwdev_priv
;
3498 DBG_8723A("%s(wdev =%p)\n", __func__
, wdev
);
3503 pwdev_priv
= wdev_to_priv(wdev
);
3505 rtw_cfg80211_indicate_scan_done(pwdev_priv
, true);
3507 if (pwdev_priv
->pmon_ndev
) {
3508 DBG_8723A("%s, unregister monitor interface\n", __func__
);
3509 unregister_netdev(pwdev_priv
->pmon_ndev
);
3512 wiphy_unregister(wdev
->wiphy
);