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 ******************************************************************************/
16 #include <osdep_service.h>
17 #include <drv_types.h>
18 #include <recv_osdep.h>
19 #include <mlme_osdep.h>
21 #include <linux/if_ether.h>
23 #include <linux/ieee80211.h>
25 #include <rtl8723a_recv.h>
26 #include <rtl8723a_xmit.h>
28 void rtw_signal_stat_timer_hdl23a(unsigned long data
);
30 void _rtw_init_sta_recv_priv23a(struct sta_recv_priv
*psta_recvpriv
)
35 spin_lock_init(&psta_recvpriv
->lock
);
37 /* for (i = 0; i<MAX_RX_NUMBLKS; i++) */
38 /* _rtw_init_queue23a(&psta_recvpriv->blk_strms[i]); */
40 _rtw_init_queue23a(&psta_recvpriv
->defrag_q
);
45 int _rtw_init_recv_priv23a(struct recv_priv
*precvpriv
,
46 struct rtw_adapter
*padapter
)
48 struct recv_frame
*precvframe
;
52 spin_lock_init(&precvpriv
->lock
);
54 _rtw_init_queue23a(&precvpriv
->free_recv_queue
);
55 _rtw_init_queue23a(&precvpriv
->recv_pending_queue
);
56 _rtw_init_queue23a(&precvpriv
->uc_swdec_pending_queue
);
58 precvpriv
->adapter
= padapter
;
60 for (i
= 0; i
< NR_RECVFRAME
; i
++) {
61 precvframe
= kzalloc(sizeof(struct recv_frame
), GFP_KERNEL
);
64 INIT_LIST_HEAD(&precvframe
->list
);
66 list_add_tail(&precvframe
->list
,
67 &precvpriv
->free_recv_queue
.queue
);
69 precvframe
->adapter
= padapter
;
73 precvpriv
->free_recvframe_cnt
= i
;
74 precvpriv
->rx_pending_cnt
= 1;
76 res
= rtl8723au_init_recv_priv(padapter
);
78 setup_timer(&precvpriv
->signal_stat_timer
, rtw_signal_stat_timer_hdl23a
,
79 (unsigned long)padapter
);
81 precvpriv
->signal_stat_sampling_interval
= 1000; /* ms */
83 rtw_set_signal_stat_timer(precvpriv
);
88 void _rtw_free_recv_priv23a(struct recv_priv
*precvpriv
)
90 struct rtw_adapter
*padapter
= precvpriv
->adapter
;
91 struct recv_frame
*precvframe
, *ptmp
;
93 rtw_free_uc_swdec_pending_queue23a(padapter
);
95 list_for_each_entry_safe(precvframe
, ptmp
,
96 &precvpriv
->free_recv_queue
.queue
, list
) {
97 list_del_init(&precvframe
->list
);
101 rtl8723au_free_recv_priv(padapter
);
104 struct recv_frame
*rtw_alloc_recvframe23a(struct rtw_queue
*pfree_recv_queue
)
106 struct recv_frame
*pframe
;
107 struct rtw_adapter
*padapter
;
108 struct recv_priv
*precvpriv
;
110 spin_lock_bh(&pfree_recv_queue
->lock
);
112 pframe
= list_first_entry_or_null(&pfree_recv_queue
->queue
,
113 struct recv_frame
, list
);
115 list_del_init(&pframe
->list
);
116 padapter
= pframe
->adapter
;
118 precvpriv
= &padapter
->recvpriv
;
119 if (pfree_recv_queue
== &precvpriv
->free_recv_queue
)
120 precvpriv
->free_recvframe_cnt
--;
124 spin_unlock_bh(&pfree_recv_queue
->lock
);
129 int rtw_free_recvframe23a(struct recv_frame
*precvframe
)
131 struct rtw_adapter
*padapter
= precvframe
->adapter
;
132 struct recv_priv
*precvpriv
= &padapter
->recvpriv
;
133 struct rtw_queue
*pfree_recv_queue
;
135 if (precvframe
->pkt
) {
136 dev_kfree_skb_any(precvframe
->pkt
);/* free skb by driver */
137 precvframe
->pkt
= NULL
;
140 pfree_recv_queue
= &precvpriv
->free_recv_queue
;
141 spin_lock_bh(&pfree_recv_queue
->lock
);
143 list_del_init(&precvframe
->list
);
145 list_add_tail(&precvframe
->list
, get_list_head(pfree_recv_queue
));
148 if (pfree_recv_queue
== &precvpriv
->free_recv_queue
)
149 precvpriv
->free_recvframe_cnt
++;
152 spin_unlock_bh(&pfree_recv_queue
->lock
);
159 int rtw_enqueue_recvframe23a(struct recv_frame
*precvframe
, struct rtw_queue
*queue
)
161 struct rtw_adapter
*padapter
= precvframe
->adapter
;
162 struct recv_priv
*precvpriv
= &padapter
->recvpriv
;
164 spin_lock_bh(&queue
->lock
);
166 list_del_init(&precvframe
->list
);
168 list_add_tail(&precvframe
->list
, get_list_head(queue
));
171 if (queue
== &precvpriv
->free_recv_queue
)
172 precvpriv
->free_recvframe_cnt
++;
175 spin_unlock_bh(&queue
->lock
);
181 caller : defrag ; recvframe_chk_defrag23a in recv_thread (passive)
182 pframequeue: defrag_queue : will be accessed in recv_thread (passive)
184 using spinlock to protect
188 static void rtw_free_recvframe23a_queue(struct rtw_queue
*pframequeue
)
190 struct recv_frame
*hdr
, *ptmp
;
191 struct list_head
*phead
;
193 spin_lock(&pframequeue
->lock
);
194 phead
= get_list_head(pframequeue
);
195 list_for_each_entry_safe(hdr
, ptmp
, phead
, list
)
196 rtw_free_recvframe23a(hdr
);
197 spin_unlock(&pframequeue
->lock
);
200 u32
rtw_free_uc_swdec_pending_queue23a(struct rtw_adapter
*adapter
)
203 struct recv_frame
*pending_frame
;
205 while ((pending_frame
= rtw_alloc_recvframe23a(&adapter
->recvpriv
.uc_swdec_pending_queue
))) {
206 rtw_free_recvframe23a(pending_frame
);
207 DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__
);
214 int rtw_enqueue_recvbuf23a_to_head(struct recv_buf
*precvbuf
, struct rtw_queue
*queue
)
216 spin_lock_bh(&queue
->lock
);
218 list_del_init(&precvbuf
->list
);
219 list_add(&precvbuf
->list
, get_list_head(queue
));
221 spin_unlock_bh(&queue
->lock
);
226 int rtw_enqueue_recvbuf23a(struct recv_buf
*precvbuf
, struct rtw_queue
*queue
)
230 spin_lock_irqsave(&queue
->lock
, irqL
);
232 list_del_init(&precvbuf
->list
);
234 list_add_tail(&precvbuf
->list
, get_list_head(queue
));
235 spin_unlock_irqrestore(&queue
->lock
, irqL
);
239 struct recv_buf
*rtw_dequeue_recvbuf23a (struct rtw_queue
*queue
)
242 struct recv_buf
*precvbuf
;
244 spin_lock_irqsave(&queue
->lock
, irqL
);
246 precvbuf
= list_first_entry_or_null(&queue
->queue
,
247 struct recv_buf
, list
);
249 list_del_init(&precvbuf
->list
);
251 spin_unlock_irqrestore(&queue
->lock
, irqL
);
256 int recvframe_chkmic(struct rtw_adapter
*adapter
,
257 struct recv_frame
*precvframe
);
258 int recvframe_chkmic(struct rtw_adapter
*adapter
,
259 struct recv_frame
*precvframe
) {
261 int i
, res
= _SUCCESS
;
264 u8 bmic_err
= false, brpt_micerror
= true;
265 u8
*pframe
, *payload
, *pframemic
;
267 struct sta_info
*stainfo
;
268 struct rx_pkt_attrib
*prxattrib
= &precvframe
->attrib
;
269 struct security_priv
*psecuritypriv
= &adapter
->securitypriv
;
271 struct mlme_ext_priv
*pmlmeext
= &adapter
->mlmeextpriv
;
272 struct mlme_ext_info
*pmlmeinfo
= &pmlmeext
->mlmext_info
;
275 stainfo
= rtw_get_stainfo23a(&adapter
->stapriv
, &prxattrib
->ta
[0]);
277 if (prxattrib
->encrypt
== WLAN_CIPHER_SUITE_TKIP
) {
278 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
279 "recvframe_chkmic:prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP\n");
280 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
281 "recvframe_chkmic:da = %pM\n", prxattrib
->ra
);
283 /* calculate mic code */
284 if (stainfo
!= NULL
) {
285 if (is_multicast_ether_addr(prxattrib
->ra
)) {
286 mickey
= &psecuritypriv
->dot118021XGrprxmickey
[prxattrib
->key_index
].skey
[0];
288 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
289 "recvframe_chkmic: bcmc key\n");
291 if (!psecuritypriv
->binstallGrpkey
) {
293 RT_TRACE(_module_rtl871x_recv_c_
,
295 "recvframe_chkmic:didn't install group key!\n");
296 DBG_8723A("\n recvframe_chkmic:didn't "
297 "install group key!!!!!!\n");
301 mickey
= &stainfo
->dot11tkiprxmickey
.skey
[0];
302 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
303 "recvframe_chkmic: unicast key\n");
306 /* icv_len included the mic code */
307 datalen
= precvframe
->pkt
->len
-prxattrib
->
308 hdrlen
-prxattrib
->iv_len
-prxattrib
->icv_len
- 8;
309 pframe
= precvframe
->pkt
->data
;
310 payload
= pframe
+ prxattrib
->hdrlen
+
313 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
314 "prxattrib->iv_len =%d prxattrib->icv_len =%d\n",
315 prxattrib
->iv_len
, prxattrib
->icv_len
);
317 /* care the length of the data */
318 rtw_seccalctkipmic23a(mickey
, pframe
, payload
,
319 datalen
, &miccode
[0],
320 (unsigned char)prxattrib
->priority
);
322 pframemic
= payload
+ datalen
;
326 for (i
= 0; i
< 8; i
++) {
327 if (miccode
[i
] != *(pframemic
+ i
)) {
328 RT_TRACE(_module_rtl871x_recv_c_
,
330 "recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x)\n",
332 i
, *(pframemic
+ i
));
337 if (bmic_err
== true) {
340 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
341 "*(pframemic-8)-*(pframemic-1) =%*phC\n",
343 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
344 "*(pframemic-16)-*(pframemic-9) =%*phC\n",
347 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
348 "====== demp packet (len =%d) ======\n",
349 precvframe
->pkt
->len
);
350 for (i
= 0; i
< precvframe
->pkt
->len
; i
= i
+ 8) {
351 RT_TRACE(_module_rtl871x_recv_c_
,
352 _drv_err_
, "%*phC\n",
353 8, precvframe
->pkt
->data
+ i
);
355 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
356 "====== demp packet end [len =%d]======\n",
357 precvframe
->pkt
->len
);
358 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
359 "hrdlen =%d\n", prxattrib
->hdrlen
);
361 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
362 "ra = %pM psecuritypriv->binstallGrpkey =%d\n",
364 psecuritypriv
->binstallGrpkey
);
366 /* double check key_index for some timing
367 issue, cannot compare with
368 psecuritypriv->dot118021XGrpKeyid also
369 cause timing issue */
370 if ((is_multicast_ether_addr(prxattrib
->ra
)) &&
371 (prxattrib
->key_index
!=
372 pmlmeinfo
->key_index
))
373 brpt_micerror
= false;
375 if ((prxattrib
->bdecrypted
== true) &&
376 (brpt_micerror
== true)) {
377 rtw_handle_tkip_mic_err23a(adapter
, (u8
)is_multicast_ether_addr(prxattrib
->ra
));
378 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
379 "mic error :prxattrib->bdecrypted =%d\n",
380 prxattrib
->bdecrypted
);
381 DBG_8723A(" mic error :prxattrib->"
383 prxattrib
->bdecrypted
);
385 RT_TRACE(_module_rtl871x_recv_c_
,
387 "mic error :prxattrib->bdecrypted =%d\n",
388 prxattrib
->bdecrypted
);
389 DBG_8723A(" mic error :prxattrib->"
391 prxattrib
->bdecrypted
);
397 if (!psecuritypriv
->bcheck_grpkey
&&
398 is_multicast_ether_addr(prxattrib
->ra
)) {
399 psecuritypriv
->bcheck_grpkey
= 1;
400 RT_TRACE(_module_rtl871x_recv_c_
,
402 "psecuritypriv->bcheck_grpkey = true\n");
406 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
407 "recvframe_chkmic: rtw_get_stainfo23a ==NULL!!!\n");
410 skb_trim(precvframe
->pkt
, precvframe
->pkt
->len
- 8);
420 /* decrypt and set the ivlen, icvlen of the recv_frame */
421 struct recv_frame
*decryptor(struct rtw_adapter
*padapter
,
422 struct recv_frame
*precv_frame
);
423 struct recv_frame
*decryptor(struct rtw_adapter
*padapter
,
424 struct recv_frame
*precv_frame
)
426 struct rx_pkt_attrib
*prxattrib
= &precv_frame
->attrib
;
427 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
428 struct recv_frame
*return_packet
= precv_frame
;
431 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
432 "prxstat->decrypted =%x prxattrib->encrypt = 0x%03x\n",
433 prxattrib
->bdecrypted
, prxattrib
->encrypt
);
435 if (prxattrib
->encrypt
> 0) {
436 u8
*iv
= precv_frame
->pkt
->data
+ prxattrib
->hdrlen
;
438 prxattrib
->key_index
= (((iv
[3]) >> 6) & 0x3);
440 if (prxattrib
->key_index
> WEP_KEYS
) {
441 DBG_8723A("prxattrib->key_index(%d) > WEP_KEYS\n",
442 prxattrib
->key_index
);
444 switch (prxattrib
->encrypt
) {
445 case WLAN_CIPHER_SUITE_WEP40
:
446 case WLAN_CIPHER_SUITE_WEP104
:
447 prxattrib
->key_index
=
448 psecuritypriv
->dot11PrivacyKeyIndex
;
450 case WLAN_CIPHER_SUITE_TKIP
:
451 case WLAN_CIPHER_SUITE_CCMP
:
453 prxattrib
->key_index
=
454 psecuritypriv
->dot118021XGrpKeyid
;
460 if ((prxattrib
->encrypt
> 0) && ((prxattrib
->bdecrypted
== 0))) {
461 psecuritypriv
->hw_decrypted
= 0;
462 switch (prxattrib
->encrypt
) {
463 case WLAN_CIPHER_SUITE_WEP40
:
464 case WLAN_CIPHER_SUITE_WEP104
:
465 rtw_wep_decrypt23a(padapter
, precv_frame
);
467 case WLAN_CIPHER_SUITE_TKIP
:
468 res
= rtw_tkip_decrypt23a(padapter
, precv_frame
);
470 case WLAN_CIPHER_SUITE_CCMP
:
471 res
= rtw_aes_decrypt23a(padapter
, precv_frame
);
476 } else if (prxattrib
->bdecrypted
== 1 && prxattrib
->encrypt
> 0 &&
477 (psecuritypriv
->busetkipkey
== 1 ||
478 prxattrib
->encrypt
!= WLAN_CIPHER_SUITE_TKIP
)) {
479 psecuritypriv
->hw_decrypted
= 1;
483 rtw_free_recvframe23a(return_packet
);
484 return_packet
= NULL
;
489 return return_packet
;
492 /* set the security information in the recv_frame */
493 static struct recv_frame
*portctrl(struct rtw_adapter
*adapter
,
494 struct recv_frame
*precv_frame
)
498 struct recv_frame
*pfhdr
;
499 struct sta_info
*psta
;
500 struct sta_priv
*pstapriv
;
501 struct recv_frame
*prtnframe
;
503 u16 eapol_type
= ETH_P_PAE
;/* for Funia BD's WPA issue */
504 struct rx_pkt_attrib
*pattrib
;
506 pstapriv
= &adapter
->stapriv
;
508 auth_alg
= adapter
->securitypriv
.dot11AuthAlgrthm
;
511 pattrib
= &pfhdr
->attrib
;
512 psta_addr
= pattrib
->ta
;
513 psta
= rtw_get_stainfo23a(pstapriv
, psta_addr
);
515 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
516 "########portctrl:adapter->securitypriv.dot11AuthAlgrthm =%d\n",
517 adapter
->securitypriv
.dot11AuthAlgrthm
);
519 prtnframe
= precv_frame
;
521 if (auth_alg
== dot11AuthAlgrthm_8021X
) {
523 ptr
= pfhdr
->pkt
->data
+ pfhdr
->attrib
.hdrlen
;
525 ether_type
= (ptr
[6] << 8) | ptr
[7];
527 if (psta
&& psta
->ieee8021x_blocked
) {
529 /* only accept EAPOL frame */
530 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
531 "########portctrl:psta->ieee8021x_blocked ==1\n");
533 if (ether_type
!= eapol_type
) {
534 /* free this frame */
535 rtw_free_recvframe23a(precv_frame
);
544 int recv_decache(struct recv_frame
*precv_frame
, u8 bretry
,
545 struct stainfo_rxcache
*prxcache
);
546 int recv_decache(struct recv_frame
*precv_frame
, u8 bretry
,
547 struct stainfo_rxcache
*prxcache
)
549 int tid
= precv_frame
->attrib
.priority
;
551 u16 seq_ctrl
= ((precv_frame
->attrib
.seq_num
& 0xffff) << 4) |
552 (precv_frame
->attrib
.frag_num
& 0xf);
557 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
558 "recv_decache, (tid>15)! seq_ctrl = 0x%x, tid = 0x%x\n",
564 if (1) { /* if (bretry) */
565 if (seq_ctrl
== prxcache
->tid_rxseq
[tid
]) {
566 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
567 "recv_decache, seq_ctrl = 0x%x, tid = 0x%x, tid_rxseq = 0x%x\n",
568 seq_ctrl
, tid
, prxcache
->tid_rxseq
[tid
]);
574 prxcache
->tid_rxseq
[tid
] = seq_ctrl
;
581 void process23a_pwrbit_data(struct rtw_adapter
*padapter
,
582 struct recv_frame
*precv_frame
);
583 void process23a_pwrbit_data(struct rtw_adapter
*padapter
,
584 struct recv_frame
*precv_frame
)
586 #ifdef CONFIG_8723AU_AP_MODE
587 unsigned char pwrbit
;
588 struct sk_buff
*skb
= precv_frame
->pkt
;
589 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
590 struct rx_pkt_attrib
*pattrib
= &precv_frame
->attrib
;
591 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
592 struct sta_info
*psta
;
594 psta
= rtw_get_stainfo23a(pstapriv
, pattrib
->src
);
597 pwrbit
= ieee80211_has_pm(hdr
->frame_control
);
600 if (!(psta
->state
& WIFI_SLEEP_STATE
))
601 stop_sta_xmit23a(padapter
, psta
);
603 if (psta
->state
& WIFI_SLEEP_STATE
)
604 wakeup_sta_to_xmit23a(padapter
, psta
);
611 void process_wmmps_data(struct rtw_adapter
*padapter
,
612 struct recv_frame
*precv_frame
);
613 void process_wmmps_data(struct rtw_adapter
*padapter
,
614 struct recv_frame
*precv_frame
)
616 #ifdef CONFIG_8723AU_AP_MODE
617 struct rx_pkt_attrib
*pattrib
= &precv_frame
->attrib
;
618 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
619 struct sta_info
*psta
;
621 psta
= rtw_get_stainfo23a(pstapriv
, pattrib
->src
);
627 if (!psta
->qos_option
)
630 if (!(psta
->qos_info
& 0xf))
633 if (psta
->state
& WIFI_SLEEP_STATE
) {
636 switch (pattrib
->priority
) {
639 wmmps_ac
= psta
->uapsd_bk
& BIT(1);
643 wmmps_ac
= psta
->uapsd_vi
& BIT(1);
647 wmmps_ac
= psta
->uapsd_vo
& BIT(1);
652 wmmps_ac
= psta
->uapsd_be
& BIT(1);
657 if (psta
->sleepq_ac_len
> 0) {
658 /* process received triggered frame */
659 xmit_delivery_enabled_frames23a(padapter
, psta
);
661 /* issue one qos null frame with More data bit = 0 and the EOSP bit set (= 1) */
662 issue_qos_nulldata23a(padapter
, psta
->hwaddr
,
663 (u16
)pattrib
->priority
,
672 static void count_rx_stats(struct rtw_adapter
*padapter
,
673 struct recv_frame
*prframe
, struct sta_info
*sta
)
676 struct sta_info
*psta
= NULL
;
677 struct stainfo_stats
*pstats
= NULL
;
678 struct rx_pkt_attrib
*pattrib
= & prframe
->attrib
;
679 struct recv_priv
*precvpriv
= &padapter
->recvpriv
;
681 sz
= prframe
->pkt
->len
;
682 precvpriv
->rx_bytes
+= sz
;
684 padapter
->mlmepriv
.LinkDetectInfo
.NumRxOkInPeriod
++;
686 if ((!is_broadcast_ether_addr(pattrib
->dst
)) &&
687 (!is_multicast_ether_addr(pattrib
->dst
)))
688 padapter
->mlmepriv
.LinkDetectInfo
.NumRxUnicastOkInPeriod
++;
693 psta
= prframe
->psta
;
696 pstats
= &psta
->sta_stats
;
698 pstats
->rx_data_pkts
++;
699 pstats
->rx_bytes
+= sz
;
703 static int sta2sta_data_frame(struct rtw_adapter
*adapter
,
704 struct recv_frame
*precv_frame
,
705 struct sta_info
**psta
)
707 struct sk_buff
*skb
= precv_frame
->pkt
;
708 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
710 struct rx_pkt_attrib
*pattrib
= & precv_frame
->attrib
;
711 struct sta_priv
*pstapriv
= &adapter
->stapriv
;
712 struct mlme_priv
*pmlmepriv
= &adapter
->mlmepriv
;
713 u8
*mybssid
= get_bssid(pmlmepriv
);
714 u8
*myhwaddr
= myid(&adapter
->eeprompriv
);
716 int bmcast
= is_multicast_ether_addr(pattrib
->dst
);
720 if (check_fwstate(pmlmepriv
, WIFI_ADHOC_STATE
) ||
721 check_fwstate(pmlmepriv
, WIFI_ADHOC_MASTER_STATE
)) {
723 /* filter packets that SA is myself or multicast or broadcast */
724 if (ether_addr_equal(myhwaddr
, pattrib
->src
)) {
725 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
731 if (!ether_addr_equal(myhwaddr
, pattrib
->dst
) && !bmcast
) {
736 if (ether_addr_equal(pattrib
->bssid
, "\x0\x0\x0\x0\x0\x0") ||
737 ether_addr_equal(mybssid
, "\x0\x0\x0\x0\x0\x0") ||
738 !ether_addr_equal(pattrib
->bssid
, mybssid
)) {
743 sta_addr
= pattrib
->src
;
744 } else if (check_fwstate(pmlmepriv
, WIFI_STATION_STATE
)) {
745 /* For Station mode, sa and bssid should always be BSSID,
746 and DA is my mac-address */
747 if (!ether_addr_equal(pattrib
->bssid
, pattrib
->src
)) {
748 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
749 "bssid != TA under STATION_MODE; drop pkt\n");
754 sta_addr
= pattrib
->bssid
;
756 } else if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
758 /* For AP mode, if DA == MCAST, then BSSID should be also MCAST */
759 if (!is_multicast_ether_addr(pattrib
->bssid
)) {
763 } else { /* not mc-frame */
764 /* For AP mode, if DA is non-MCAST, then it must
765 be BSSID, and bssid == BSSID */
766 if (!ether_addr_equal(pattrib
->bssid
, pattrib
->dst
)) {
771 sta_addr
= pattrib
->src
;
773 } else if (check_fwstate(pmlmepriv
, WIFI_MP_STATE
)) {
774 ether_addr_copy(pattrib
->dst
, hdr
->addr1
);
775 ether_addr_copy(pattrib
->src
, hdr
->addr2
);
776 ether_addr_copy(pattrib
->bssid
, hdr
->addr3
);
777 ether_addr_copy(pattrib
->ra
, pattrib
->dst
);
778 ether_addr_copy(pattrib
->ta
, pattrib
->src
);
786 *psta
= rtw_get_bcmc_stainfo23a(adapter
);
788 *psta
= rtw_get_stainfo23a(pstapriv
, sta_addr
); /* get ap_info */
791 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
792 "can't get psta under sta2sta_data_frame ; drop pkt\n");
802 int ap2sta_data_frame(struct rtw_adapter
*adapter
,
803 struct recv_frame
*precv_frame
,
804 struct sta_info
**psta
);
805 int ap2sta_data_frame(struct rtw_adapter
*adapter
,
806 struct recv_frame
*precv_frame
,
807 struct sta_info
**psta
)
809 struct sk_buff
*skb
= precv_frame
->pkt
;
810 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
811 struct rx_pkt_attrib
*pattrib
= & precv_frame
->attrib
;
813 struct sta_priv
*pstapriv
= &adapter
->stapriv
;
814 struct mlme_priv
*pmlmepriv
= &adapter
->mlmepriv
;
815 u8
*mybssid
= get_bssid(pmlmepriv
);
816 u8
*myhwaddr
= myid(&adapter
->eeprompriv
);
817 int bmcast
= is_multicast_ether_addr(pattrib
->dst
);
821 if (check_fwstate(pmlmepriv
, WIFI_STATION_STATE
) &&
822 (check_fwstate(pmlmepriv
, _FW_LINKED
) ||
823 check_fwstate(pmlmepriv
, _FW_UNDER_LINKING
))) {
825 /* filter packets that SA is myself or multicast or broadcast */
826 if (ether_addr_equal(myhwaddr
, pattrib
->src
)) {
827 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
833 /* da should be for me */
834 if (!ether_addr_equal(myhwaddr
, pattrib
->dst
) && !bmcast
) {
835 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
836 "ap2sta_data_frame: compare DA failed; DA=%pM\n",
843 if (ether_addr_equal(pattrib
->bssid
, "\x0\x0\x0\x0\x0\x0") ||
844 ether_addr_equal(mybssid
, "\x0\x0\x0\x0\x0\x0") ||
845 !ether_addr_equal(pattrib
->bssid
, mybssid
)) {
846 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
847 "ap2sta_data_frame: compare BSSID failed; BSSID=%pM\n",
849 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
850 "mybssid=%pM\n", mybssid
);
853 DBG_8723A("issue_deauth23a to the nonassociated ap=%pM for the reason(7)\n",
855 issue_deauth23a(adapter
, pattrib
->bssid
,
856 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA
);
864 *psta
= rtw_get_bcmc_stainfo23a(adapter
);
867 *psta
= rtw_get_stainfo23a(pstapriv
, pattrib
->bssid
);
870 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
871 "ap2sta: can't get psta under STATION_MODE; drop pkt\n");
876 if (ieee80211_is_nullfunc(hdr
->frame_control
)) {
877 /* No data, will not indicate to upper layer,
878 temporily count it here */
879 count_rx_stats(adapter
, precv_frame
, *psta
);
880 ret
= RTW_RX_HANDLED
;
884 } else if (check_fwstate(pmlmepriv
, WIFI_MP_STATE
) &&
885 check_fwstate(pmlmepriv
, _FW_LINKED
)) {
886 ether_addr_copy(pattrib
->dst
, hdr
->addr1
);
887 ether_addr_copy(pattrib
->src
, hdr
->addr2
);
888 ether_addr_copy(pattrib
->bssid
, hdr
->addr3
);
889 ether_addr_copy(pattrib
->ra
, pattrib
->dst
);
890 ether_addr_copy(pattrib
->ta
, pattrib
->src
);
893 ether_addr_copy(pattrib
->bssid
, mybssid
);
896 *psta
= rtw_get_stainfo23a(pstapriv
, pattrib
->bssid
);
898 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
899 "can't get psta under MP_MODE ; drop pkt\n");
903 } else if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
905 ret
= RTW_RX_HANDLED
;
908 if (ether_addr_equal(myhwaddr
, pattrib
->dst
) && !bmcast
) {
909 *psta
= rtw_get_stainfo23a(pstapriv
, pattrib
->bssid
);
911 DBG_8723A("issue_deauth23a to the ap=%pM for the reason(7)\n",
914 issue_deauth23a(adapter
, pattrib
->bssid
,
915 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA
);
929 int sta2ap_data_frame(struct rtw_adapter
*adapter
,
930 struct recv_frame
*precv_frame
,
931 struct sta_info
**psta
);
932 int sta2ap_data_frame(struct rtw_adapter
*adapter
,
933 struct recv_frame
*precv_frame
,
934 struct sta_info
**psta
)
936 struct sk_buff
*skb
= precv_frame
->pkt
;
937 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
938 struct rx_pkt_attrib
*pattrib
= & precv_frame
->attrib
;
939 struct sta_priv
*pstapriv
= &adapter
->stapriv
;
940 struct mlme_priv
*pmlmepriv
= &adapter
->mlmepriv
;
941 unsigned char *mybssid
= get_bssid(pmlmepriv
);
946 if (check_fwstate(pmlmepriv
, WIFI_AP_STATE
)) {
947 /* For AP mode, RA = BSSID, TX = STA(SRC_ADDR), A3 = DST_ADDR */
948 if (!ether_addr_equal(pattrib
->bssid
, mybssid
)) {
953 *psta
= rtw_get_stainfo23a(pstapriv
, pattrib
->src
);
955 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
956 "can't get psta under AP_MODE; drop pkt\n");
957 DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
960 issue_deauth23a(adapter
, pattrib
->src
,
961 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA
);
963 ret
= RTW_RX_HANDLED
;
967 process23a_pwrbit_data(adapter
, precv_frame
);
969 /* We only get here if it's a data frame, so no need to
970 * confirm data frame type first */
971 if (ieee80211_is_data_qos(hdr
->frame_control
))
972 process_wmmps_data(adapter
, precv_frame
);
974 if (ieee80211_is_nullfunc(hdr
->frame_control
)) {
975 /* No data, will not indicate to upper layer,
976 temporily count it here */
977 count_rx_stats(adapter
, precv_frame
, *psta
);
978 ret
= RTW_RX_HANDLED
;
982 u8
*myhwaddr
= myid(&adapter
->eeprompriv
);
984 if (!ether_addr_equal(pattrib
->ra
, myhwaddr
)) {
985 ret
= RTW_RX_HANDLED
;
988 DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
990 issue_deauth23a(adapter
, pattrib
->src
,
991 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA
);
992 ret
= RTW_RX_HANDLED
;
1003 static int validate_recv_ctrl_frame(struct rtw_adapter
*padapter
,
1004 struct recv_frame
*precv_frame
)
1006 #ifdef CONFIG_8723AU_AP_MODE
1007 struct rx_pkt_attrib
*pattrib
= &precv_frame
->attrib
;
1008 struct sta_priv
*pstapriv
= &padapter
->stapriv
;
1009 struct sk_buff
*skb
= precv_frame
->pkt
;
1010 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
1012 if (!ieee80211_is_ctl(hdr
->frame_control
))
1015 /* receive the frames that ra(a1) is my address */
1016 if (!ether_addr_equal(hdr
->addr1
, myid(&padapter
->eeprompriv
)))
1019 /* only handle ps-poll */
1020 if (ieee80211_is_pspoll(hdr
->frame_control
)) {
1021 struct ieee80211_pspoll
*psp
= (struct ieee80211_pspoll
*)hdr
;
1024 struct sta_info
*psta
= NULL
;
1026 aid
= le16_to_cpu(psp
->aid
) & 0x3fff;
1027 psta
= rtw_get_stainfo23a(pstapriv
, hdr
->addr2
);
1029 if (!psta
|| psta
->aid
!= aid
)
1032 /* for rx pkt statistics */
1033 psta
->sta_stats
.rx_ctrl_pkts
++;
1035 switch (pattrib
->priority
) {
1038 wmmps_ac
= psta
->uapsd_bk
& BIT(0);
1042 wmmps_ac
= psta
->uapsd_vi
& BIT(0);
1046 wmmps_ac
= psta
->uapsd_vo
& BIT(0);
1051 wmmps_ac
= psta
->uapsd_be
& BIT(0);
1058 if (psta
->state
& WIFI_STA_ALIVE_CHK_STATE
) {
1059 DBG_8723A("%s alive check-rx ps-poll\n", __func__
);
1060 psta
->expire_to
= pstapriv
->expire_to
;
1061 psta
->state
^= WIFI_STA_ALIVE_CHK_STATE
;
1064 if ((psta
->state
& WIFI_SLEEP_STATE
) &&
1065 (pstapriv
->sta_dz_bitmap
& CHKBIT(psta
->aid
))) {
1066 struct list_head
*xmitframe_phead
;
1067 struct xmit_frame
*pxmitframe
;
1068 struct xmit_priv
*pxmitpriv
= &padapter
->xmitpriv
;
1070 spin_lock_bh(&pxmitpriv
->lock
);
1072 xmitframe_phead
= get_list_head(&psta
->sleep_q
);
1073 pxmitframe
= list_first_entry_or_null(xmitframe_phead
,
1077 list_del_init(&pxmitframe
->list
);
1081 if (psta
->sleepq_len
>0)
1082 pxmitframe
->attrib
.mdata
= 1;
1084 pxmitframe
->attrib
.mdata
= 0;
1086 pxmitframe
->attrib
.triggered
= 1;
1088 rtl8723au_hal_xmitframe_enqueue(padapter
,
1091 if (psta
->sleepq_len
== 0) {
1092 pstapriv
->tim_bitmap
&= ~CHKBIT(psta
->aid
);
1093 update_beacon23a(padapter
, WLAN_EID_TIM
,
1097 spin_unlock_bh(&pxmitpriv
->lock
);
1100 spin_unlock_bh(&pxmitpriv
->lock
);
1102 if (pstapriv
->tim_bitmap
& CHKBIT(psta
->aid
)) {
1103 if (psta
->sleepq_len
== 0) {
1104 DBG_8723A("no buffered packets "
1107 /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
1108 issue_nulldata23a(padapter
,
1112 DBG_8723A("error!psta->sleepq"
1115 psta
->sleepq_len
= 0;
1118 pstapriv
->tim_bitmap
&= ~CHKBIT(psta
->aid
);
1120 update_beacon23a(padapter
, WLAN_EID_TIM
,
1131 struct recv_frame
*recvframe_chk_defrag23a(struct rtw_adapter
*padapter
,
1132 struct recv_frame
*precv_frame
);
1133 static int validate_recv_mgnt_frame(struct rtw_adapter
*padapter
,
1134 struct recv_frame
*precv_frame
)
1136 struct sta_info
*psta
;
1137 struct sk_buff
*skb
;
1138 struct ieee80211_hdr
*hdr
;
1140 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1141 "+validate_recv_mgnt_frame\n");
1143 precv_frame
= recvframe_chk_defrag23a(padapter
, precv_frame
);
1144 if (precv_frame
== NULL
) {
1145 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
1146 "%s: fragment packet\n", __func__
);
1150 skb
= precv_frame
->pkt
;
1151 hdr
= (struct ieee80211_hdr
*) skb
->data
;
1153 /* for rx pkt statistics */
1154 psta
= rtw_get_stainfo23a(&padapter
->stapriv
, hdr
->addr2
);
1156 psta
->sta_stats
.rx_mgnt_pkts
++;
1158 if (ieee80211_is_beacon(hdr
->frame_control
))
1159 psta
->sta_stats
.rx_beacon_pkts
++;
1160 else if (ieee80211_is_probe_req(hdr
->frame_control
))
1161 psta
->sta_stats
.rx_probereq_pkts
++;
1162 else if (ieee80211_is_probe_resp(hdr
->frame_control
)) {
1163 if (ether_addr_equal(padapter
->eeprompriv
.mac_addr
,
1165 psta
->sta_stats
.rx_probersp_pkts
++;
1166 else if (is_broadcast_ether_addr(hdr
->addr1
) ||
1167 is_multicast_ether_addr(hdr
->addr1
))
1168 psta
->sta_stats
.rx_probersp_bm_pkts
++;
1170 psta
->sta_stats
.rx_probersp_uo_pkts
++;
1174 mgt_dispatcher23a(padapter
, precv_frame
);
1179 static int validate_recv_data_frame(struct rtw_adapter
*adapter
,
1180 struct recv_frame
*precv_frame
)
1184 struct sta_info
*psta
= NULL
;
1185 struct rx_pkt_attrib
*pattrib
= & precv_frame
->attrib
;
1186 struct security_priv
*psecuritypriv
= &adapter
->securitypriv
;
1188 struct sk_buff
*skb
= precv_frame
->pkt
;
1189 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
1193 bretry
= ieee80211_has_retry(hdr
->frame_control
);
1194 pda
= ieee80211_get_DA(hdr
);
1195 psa
= ieee80211_get_SA(hdr
);
1197 ether_addr_copy(pattrib
->dst
, pda
);
1198 ether_addr_copy(pattrib
->src
, psa
);
1200 switch (hdr
->frame_control
&
1201 cpu_to_le16(IEEE80211_FCTL_TODS
| IEEE80211_FCTL_FROMDS
)) {
1202 case cpu_to_le16(0):
1203 ether_addr_copy(pattrib
->bssid
, hdr
->addr3
);
1204 ether_addr_copy(pattrib
->ra
, pda
);
1205 ether_addr_copy(pattrib
->ta
, psa
);
1206 ret
= sta2sta_data_frame(adapter
, precv_frame
, &psta
);
1209 case cpu_to_le16(IEEE80211_FCTL_FROMDS
):
1210 ether_addr_copy(pattrib
->bssid
, hdr
->addr2
);
1211 ether_addr_copy(pattrib
->ra
, pda
);
1212 ether_addr_copy(pattrib
->ta
, hdr
->addr2
);
1213 ret
= ap2sta_data_frame(adapter
, precv_frame
, &psta
);
1216 case cpu_to_le16(IEEE80211_FCTL_TODS
):
1217 ether_addr_copy(pattrib
->bssid
, hdr
->addr1
);
1218 ether_addr_copy(pattrib
->ra
, hdr
->addr1
);
1219 ether_addr_copy(pattrib
->ta
, psa
);
1220 ret
= sta2ap_data_frame(adapter
, precv_frame
, &psta
);
1223 case cpu_to_le16(IEEE80211_FCTL_TODS
| IEEE80211_FCTL_FROMDS
):
1225 * There is no BSSID in this case, but the driver has been
1226 * using addr1 so far, so keep it for now.
1228 ether_addr_copy(pattrib
->bssid
, hdr
->addr1
);
1229 ether_addr_copy(pattrib
->ra
, hdr
->addr1
);
1230 ether_addr_copy(pattrib
->ta
, hdr
->addr2
);
1232 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
, "case 3\n");
1236 if ((ret
== _FAIL
) || (ret
== RTW_RX_HANDLED
))
1240 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1241 "after to_fr_ds_chk; psta == NULL\n");
1246 precv_frame
->psta
= psta
;
1248 pattrib
->hdrlen
= sizeof(struct ieee80211_hdr_3addr
);
1249 if (ieee80211_has_a4(hdr
->frame_control
))
1250 pattrib
->hdrlen
+= ETH_ALEN
;
1252 /* parsing QC field */
1253 if (pattrib
->qos
== 1) {
1254 __le16
*qptr
= (__le16
*)ieee80211_get_qos_ctl(hdr
);
1255 u16 qos_ctrl
= le16_to_cpu(*qptr
);
1257 pattrib
->priority
= qos_ctrl
& IEEE80211_QOS_CTL_TID_MASK
;
1258 pattrib
->ack_policy
= (qos_ctrl
>> 5) & 3;
1260 (qos_ctrl
& IEEE80211_QOS_CTL_A_MSDU_PRESENT
) >> 7;
1261 pattrib
->hdrlen
+= IEEE80211_QOS_CTL_LEN
;
1263 if (pattrib
->priority
!= 0 && pattrib
->priority
!= 3) {
1264 adapter
->recvpriv
.bIsAnyNonBEPkts
= true;
1267 pattrib
->priority
= 0;
1268 pattrib
->ack_policy
= 0;
1272 if (pattrib
->order
) { /* HT-CTRL 11n */
1273 pattrib
->hdrlen
+= 4;
1276 precv_frame
->preorder_ctrl
= &psta
->recvreorder_ctrl
[pattrib
->priority
];
1278 /* decache, drop duplicate recv packets */
1279 if (recv_decache(precv_frame
, bretry
, &psta
->sta_recvpriv
.rxcache
) ==
1281 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1282 "decache : drop pkt\n");
1287 if (pattrib
->privacy
) {
1288 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1289 "validate_recv_data_frame:pattrib->privacy =%x\n",
1291 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1292 "^^^^^^^^^^^is_multicast_ether_addr(pattrib->ra(0x%02x)) =%d^^^^^^^^^^^^^^^6\n",
1294 is_multicast_ether_addr(pattrib
->ra
));
1296 GET_ENCRY_ALGO(psecuritypriv
, psta
, pattrib
->encrypt
,
1297 is_multicast_ether_addr(pattrib
->ra
));
1299 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1300 "pattrib->encrypt =%d\n", pattrib
->encrypt
);
1302 switch (pattrib
->encrypt
) {
1303 case WLAN_CIPHER_SUITE_WEP40
:
1304 case WLAN_CIPHER_SUITE_WEP104
:
1305 pattrib
->iv_len
= IEEE80211_WEP_IV_LEN
;
1306 pattrib
->icv_len
= IEEE80211_WEP_ICV_LEN
;
1308 case WLAN_CIPHER_SUITE_TKIP
:
1309 pattrib
->iv_len
= IEEE80211_TKIP_IV_LEN
;
1310 pattrib
->icv_len
= IEEE80211_TKIP_ICV_LEN
;
1312 case WLAN_CIPHER_SUITE_CCMP
:
1313 pattrib
->iv_len
= IEEE80211_CCMP_HDR_LEN
;
1314 pattrib
->icv_len
= IEEE80211_CCMP_MIC_LEN
;
1317 pattrib
->iv_len
= 0;
1318 pattrib
->icv_len
= 0;
1322 pattrib
->encrypt
= 0;
1323 pattrib
->iv_len
= 0;
1324 pattrib
->icv_len
= 0;
1334 static void dump_rx_pkt(struct sk_buff
*skb
, u16 type
, int level
)
1340 ((level
== 2) && (type
== IEEE80211_FTYPE_MGMT
)) ||
1341 ((level
== 3) && (type
== IEEE80211_FTYPE_DATA
))) {
1345 DBG_8723A("#############################\n");
1347 for (i
= 0; i
< 64; i
= i
+ 8)
1348 DBG_8723A("%*phC:\n", 8, ptr
+ i
);
1349 DBG_8723A("#############################\n");
1353 static int validate_recv_frame(struct rtw_adapter
*adapter
,
1354 struct recv_frame
*precv_frame
)
1356 /* shall check frame subtype, to / from ds, da, bssid */
1358 /* then call check if rx seq/frag. duplicated. */
1361 int retval
= _SUCCESS
;
1362 struct rx_pkt_attrib
*pattrib
= & precv_frame
->attrib
;
1363 struct sk_buff
*skb
= precv_frame
->pkt
;
1364 struct ieee80211_hdr
*hdr
= (struct ieee80211_hdr
*) skb
->data
;
1369 fctl
= le16_to_cpu(hdr
->frame_control
);
1370 ver
= fctl
& IEEE80211_FCTL_VERS
;
1371 type
= fctl
& IEEE80211_FCTL_FTYPE
;
1372 subtype
= fctl
& IEEE80211_FCTL_STYPE
;
1374 /* add version chk */
1376 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1377 "validate_recv_data_frame fail! (ver!= 0)\n");
1382 seq_ctrl
= le16_to_cpu(hdr
->seq_ctrl
);
1383 pattrib
->frag_num
= seq_ctrl
& IEEE80211_SCTL_FRAG
;
1384 pattrib
->seq_num
= seq_ctrl
>> 4;
1386 pattrib
->pw_save
= ieee80211_has_pm(hdr
->frame_control
);
1387 pattrib
->mfrag
= ieee80211_has_morefrags(hdr
->frame_control
);
1388 pattrib
->mdata
= ieee80211_has_moredata(hdr
->frame_control
);
1389 pattrib
->privacy
= ieee80211_has_protected(hdr
->frame_control
);
1390 pattrib
->order
= ieee80211_has_order(hdr
->frame_control
);
1392 GetHalDefVar8192CUsb(adapter
, HAL_DEF_DBG_DUMP_RXPKT
, &bDumpRxPkt
);
1394 if (unlikely(bDumpRxPkt
== 1))
1395 dump_rx_pkt(skb
, type
, bDumpRxPkt
);
1398 case IEEE80211_FTYPE_MGMT
:
1399 retval
= validate_recv_mgnt_frame(adapter
, precv_frame
);
1400 if (retval
== _FAIL
) {
1401 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1402 "validate_recv_mgnt_frame fail\n");
1404 retval
= _FAIL
; /* only data frame return _SUCCESS */
1406 case IEEE80211_FTYPE_CTL
:
1407 retval
= validate_recv_ctrl_frame(adapter
, precv_frame
);
1408 if (retval
== _FAIL
) {
1409 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1410 "validate_recv_ctrl_frame fail\n");
1412 retval
= _FAIL
; /* only data frame return _SUCCESS */
1414 case IEEE80211_FTYPE_DATA
:
1415 pattrib
->qos
= (subtype
& IEEE80211_STYPE_QOS_DATA
) ? 1 : 0;
1416 retval
= validate_recv_data_frame(adapter
, precv_frame
);
1417 if (retval
== _FAIL
) {
1418 struct recv_priv
*precvpriv
= &adapter
->recvpriv
;
1420 precvpriv
->rx_drop
++;
1424 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1425 "validate_recv_data_frame fail! type = 0x%x\n", type
);
1434 /* remove the wlanhdr and add the eth_hdr */
1436 static int wlanhdr_to_ethhdr (struct recv_frame
*precvframe
)
1438 u16 eth_type
, len
, hdrlen
;
1441 struct rtw_adapter
*adapter
= precvframe
->adapter
;
1442 struct mlme_priv
*pmlmepriv
= &adapter
->mlmepriv
;
1444 struct sk_buff
*skb
= precvframe
->pkt
;
1446 struct rx_pkt_attrib
*pattrib
= &precvframe
->attrib
;
1451 hdrlen
= pattrib
->hdrlen
;
1452 psnap
= ptr
+ hdrlen
;
1453 eth_type
= (psnap
[6] << 8) | psnap
[7];
1454 /* convert hdr + possible LLC headers into Ethernet header */
1455 if ((ether_addr_equal(psnap
, rfc1042_header
) &&
1456 eth_type
!= ETH_P_AARP
&& eth_type
!= ETH_P_IPX
) ||
1457 ether_addr_equal(psnap
, bridge_tunnel_header
)) {
1458 /* remove RFC1042 or Bridge-Tunnel encapsulation
1459 and replace EtherType */
1461 hdrlen
+= SNAP_SIZE
;
1463 /* Leave Ethernet header part of hdr and full payload */
1465 eth_type
= (psnap
[0] << 8) | psnap
[1];
1468 len
= skb
->len
- hdrlen
;
1470 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1471 "=== pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n",
1472 pattrib
->hdrlen
, pattrib
->iv_len
);
1474 pattrib
->eth_type
= eth_type
;
1475 if (check_fwstate(pmlmepriv
, WIFI_MP_STATE
)) {
1481 /* append rx status for mp test packets */
1483 ptr
= skb_pull(skb
, (hdrlen
- sizeof(struct ethhdr
) + 2) - 24);
1484 memcpy(ptr
, skb
->head
, 24);
1487 ptr
= skb_pull(skb
, (hdrlen
- sizeof(struct ethhdr
) +
1491 ether_addr_copy(ptr
, pattrib
->dst
);
1492 ether_addr_copy(ptr
+ ETH_ALEN
, pattrib
->src
);
1495 put_unaligned_be16(len
, ptr
+ 12);
1502 /* perform defrag */
1503 struct recv_frame
*recvframe_defrag(struct rtw_adapter
*adapter
,
1504 struct rtw_queue
*defrag_q
);
1505 struct recv_frame
*recvframe_defrag(struct rtw_adapter
*adapter
,
1506 struct rtw_queue
*defrag_q
)
1508 struct list_head
*phead
;
1511 struct recv_frame
*pnfhdr
, *ptmp
;
1512 struct recv_frame
*prframe
, *pnextrframe
;
1513 struct rtw_queue
*pfree_recv_queue
;
1514 struct sk_buff
*skb
;
1517 pfree_recv_queue
= &adapter
->recvpriv
.free_recv_queue
;
1519 phead
= get_list_head(defrag_q
);
1520 prframe
= list_first_entry(phead
, struct recv_frame
, list
);
1521 list_del_init(&prframe
->list
);
1524 if (curfragnum
!= prframe
->attrib
.frag_num
) {
1525 /* the first fragment number must be 0 */
1526 /* free the whole queue */
1527 rtw_free_recvframe23a(prframe
);
1528 rtw_free_recvframe23a_queue(defrag_q
);
1535 list_for_each_entry_safe(pnfhdr
, ptmp
, phead
, list
) {
1536 pnextrframe
= (struct recv_frame
*)pnfhdr
;
1537 /* check the fragment sequence (2nd ~n fragment frame) */
1539 if (curfragnum
!= pnfhdr
->attrib
.frag_num
) {
1540 /* the fragment number must be increasing
1542 /* release the defrag_q & prframe */
1543 rtw_free_recvframe23a(prframe
);
1544 rtw_free_recvframe23a_queue(defrag_q
);
1550 /* copy the 2nd~n fragment frame's payload to the
1552 /* get the 2nd~last fragment frame's payload */
1554 wlanhdr_offset
= pnfhdr
->attrib
.hdrlen
+ pnfhdr
->attrib
.iv_len
;
1556 skb_pull(pnfhdr
->pkt
, wlanhdr_offset
);
1558 /* append to first fragment frame's tail
1559 (if privacy frame, pull the ICV) */
1561 skb_trim(skb
, skb
->len
- prframe
->attrib
.icv_len
);
1563 memcpy(skb_tail_pointer(skb
), pnfhdr
->pkt
->data
,
1566 skb_put(skb
, pnfhdr
->pkt
->len
);
1568 prframe
->attrib
.icv_len
= pnfhdr
->attrib
.icv_len
;
1571 /* free the defrag_q queue and return the prframe */
1572 rtw_free_recvframe23a_queue(defrag_q
);
1574 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1575 "Performance defrag!!!!!\n");
1580 /* check if need to defrag, if needed queue the frame to defrag_q */
1581 struct recv_frame
*recvframe_chk_defrag23a(struct rtw_adapter
*padapter
,
1582 struct recv_frame
*precv_frame
)
1587 struct recv_frame
*pfhdr
;
1588 struct sta_info
*psta
;
1589 struct sta_priv
*pstapriv
;
1590 struct list_head
*phead
;
1591 struct recv_frame
*prtnframe
= NULL
;
1592 struct rtw_queue
*pfree_recv_queue
, *pdefrag_q
;
1596 pstapriv
= &padapter
->stapriv
;
1598 pfhdr
= precv_frame
;
1600 pfree_recv_queue
= &padapter
->recvpriv
.free_recv_queue
;
1602 /* need to define struct of wlan header frame ctrl */
1603 ismfrag
= pfhdr
->attrib
.mfrag
;
1604 fragnum
= pfhdr
->attrib
.frag_num
;
1606 psta_addr
= pfhdr
->attrib
.ta
;
1607 psta
= rtw_get_stainfo23a(pstapriv
, psta_addr
);
1609 struct ieee80211_hdr
*hdr
=
1610 (struct ieee80211_hdr
*) pfhdr
->pkt
->data
;
1611 if (!ieee80211_is_data(hdr
->frame_control
)) {
1612 psta
= rtw_get_bcmc_stainfo23a(padapter
);
1613 pdefrag_q
= &psta
->sta_recvpriv
.defrag_q
;
1617 pdefrag_q
= &psta
->sta_recvpriv
.defrag_q
;
1619 if ((ismfrag
== 0) && (fragnum
== 0)) {
1620 prtnframe
= precv_frame
;/* isn't a fragment frame */
1624 /* 0~(n-1) fragment frame */
1625 /* enqueue to defraf_g */
1626 if (pdefrag_q
!= NULL
) {
1628 /* the first fragment */
1629 if (!list_empty(&pdefrag_q
->queue
)) {
1630 /* free current defrag_q */
1631 rtw_free_recvframe23a_queue(pdefrag_q
);
1635 /* Then enqueue the 0~(n-1) fragment into the
1638 /* spin_lock(&pdefrag_q->lock); */
1639 phead
= get_list_head(pdefrag_q
);
1640 list_add_tail(&pfhdr
->list
, phead
);
1641 /* spin_unlock(&pdefrag_q->lock); */
1643 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1644 "Enqueuq: ismfrag = %d, fragnum = %d\n",
1650 /* can't find this ta's defrag_queue,
1651 so free this recv_frame */
1652 rtw_free_recvframe23a(precv_frame
);
1654 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1655 "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
1660 if ((ismfrag
== 0) && (fragnum
!= 0)) {
1661 /* the last fragment frame */
1662 /* enqueue the last fragment */
1663 if (pdefrag_q
!= NULL
) {
1664 /* spin_lock(&pdefrag_q->lock); */
1665 phead
= get_list_head(pdefrag_q
);
1666 list_add_tail(&pfhdr
->list
, phead
);
1667 /* spin_unlock(&pdefrag_q->lock); */
1669 /* call recvframe_defrag to defrag */
1670 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
1671 "defrag: ismfrag = %d, fragnum = %d\n",
1673 precv_frame
= recvframe_defrag(padapter
, pdefrag_q
);
1674 prtnframe
= precv_frame
;
1676 /* can't find this ta's defrag_queue,
1677 so free this recv_frame */
1678 rtw_free_recvframe23a(precv_frame
);
1680 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1681 "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
1687 if ((prtnframe
!= NULL
) && (prtnframe
->attrib
.privacy
)) {
1688 /* after defrag we must check tkip mic code */
1689 if (recvframe_chkmic(padapter
, prtnframe
) == _FAIL
) {
1690 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
1691 "recvframe_chkmic(padapter, prtnframe) ==_FAIL\n");
1692 rtw_free_recvframe23a(prtnframe
);
1702 int amsdu_to_msdu(struct rtw_adapter
*padapter
, struct recv_frame
*prframe
);
1703 int amsdu_to_msdu(struct rtw_adapter
*padapter
, struct recv_frame
*prframe
)
1705 struct rx_pkt_attrib
*pattrib
;
1706 struct sk_buff
*skb
, *sub_skb
;
1707 struct sk_buff_head skb_list
;
1709 pattrib
= &prframe
->attrib
;
1712 skb_pull(skb
, prframe
->attrib
.hdrlen
);
1713 __skb_queue_head_init(&skb_list
);
1715 ieee80211_amsdu_to_8023s(skb
, &skb_list
, NULL
, 0, 0, false);
1717 while (!skb_queue_empty(&skb_list
)) {
1718 sub_skb
= __skb_dequeue(&skb_list
);
1720 sub_skb
->protocol
= eth_type_trans(sub_skb
, padapter
->pnetdev
);
1721 sub_skb
->dev
= padapter
->pnetdev
;
1723 sub_skb
->ip_summed
= CHECKSUM_NONE
;
1728 prframe
->pkt
= NULL
;
1729 rtw_free_recvframe23a(prframe
);
1733 int check_indicate_seq(struct recv_reorder_ctrl
*preorder_ctrl
, u16 seq_num
);
1734 int check_indicate_seq(struct recv_reorder_ctrl
*preorder_ctrl
, u16 seq_num
)
1736 u8 wsize
= preorder_ctrl
->wsize_b
;
1737 u16 wend
= (preorder_ctrl
->indicate_seq
+ wsize
-1) & 0xFFF;
1739 /* Rx Reorder initialize condition. */
1740 if (preorder_ctrl
->indicate_seq
== 0xFFFF)
1741 preorder_ctrl
->indicate_seq
= seq_num
;
1743 /* Drop out the packet which SeqNum is smaller than WinStart */
1744 if (SN_LESS(seq_num
, preorder_ctrl
->indicate_seq
))
1748 /* Sliding window manipulation. Conditions includes: */
1749 /* 1. Incoming SeqNum is equal to WinStart =>Window shift 1 */
1750 /* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */
1752 if (SN_EQUAL(seq_num
, preorder_ctrl
->indicate_seq
)) {
1753 preorder_ctrl
->indicate_seq
=
1754 (preorder_ctrl
->indicate_seq
+ 1) & 0xFFF;
1755 } else if (SN_LESS(wend
, seq_num
)) {
1756 /* boundary situation, when seq_num cross 0xFFF */
1757 if (seq_num
>= (wsize
- 1))
1758 preorder_ctrl
->indicate_seq
= seq_num
+ 1 -wsize
;
1760 preorder_ctrl
->indicate_seq
= 0xFFF - (wsize
- (seq_num
+ 1)) + 1;
1765 static int enqueue_reorder_recvframe23a(struct recv_reorder_ctrl
*preorder_ctrl
,
1766 struct recv_frame
*prframe
)
1768 struct rx_pkt_attrib
*pattrib
= &prframe
->attrib
;
1769 struct rtw_queue
*ppending_recvframe_queue
;
1770 struct list_head
*phead
, *plist
, *ptmp
;
1771 struct recv_frame
*hdr
;
1772 struct rx_pkt_attrib
*pnextattrib
;
1774 ppending_recvframe_queue
= &preorder_ctrl
->pending_recvframe_queue
;
1775 phead
= get_list_head(ppending_recvframe_queue
);
1777 list_for_each_safe(plist
, ptmp
, phead
) {
1778 hdr
= container_of(plist
, struct recv_frame
, list
);
1779 pnextattrib
= &hdr
->attrib
;
1781 if (SN_LESS(pnextattrib
->seq_num
, pattrib
->seq_num
)) {
1783 } else if (SN_EQUAL(pnextattrib
->seq_num
, pattrib
->seq_num
)) {
1784 /* Duplicate entry is found!! Do not insert current entry. */
1792 list_del_init(&prframe
->list
);
1794 list_add_tail(&prframe
->list
, plist
);
1799 int recv_indicatepkts_in_order(struct rtw_adapter
*padapter
,
1800 struct recv_reorder_ctrl
*preorder_ctrl
,
1802 int recv_indicatepkts_in_order(struct rtw_adapter
*padapter
,
1803 struct recv_reorder_ctrl
*preorder_ctrl
,
1806 struct list_head
*phead
, *plist
;
1807 struct recv_frame
*prframe
;
1808 struct rx_pkt_attrib
*pattrib
;
1809 int bPktInBuf
= false;
1810 struct recv_priv
*precvpriv
;
1811 struct rtw_queue
*ppending_recvframe_queue
;
1813 precvpriv
= &padapter
->recvpriv
;
1814 ppending_recvframe_queue
= &preorder_ctrl
->pending_recvframe_queue
;
1815 phead
= get_list_head(ppending_recvframe_queue
);
1816 plist
= phead
->next
;
1818 /* Handling some condition for forced indicate case. */
1820 if (list_empty(phead
)) {
1824 prframe
= container_of(plist
, struct recv_frame
, list
);
1825 pattrib
= &prframe
->attrib
;
1826 preorder_ctrl
->indicate_seq
= pattrib
->seq_num
;
1829 /* Prepare indication list and indication. */
1830 /* Check if there is any packet need indicate. */
1831 while (!list_empty(phead
)) {
1833 prframe
= container_of(plist
, struct recv_frame
, list
);
1834 pattrib
= &prframe
->attrib
;
1836 if (!SN_LESS(preorder_ctrl
->indicate_seq
, pattrib
->seq_num
)) {
1837 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
1838 "recv_indicatepkts_in_order: indicate =%d seq =%d amsdu =%d\n",
1839 preorder_ctrl
->indicate_seq
,
1840 pattrib
->seq_num
, pattrib
->amsdu
);
1842 plist
= plist
->next
;
1843 list_del_init(&prframe
->list
);
1845 if (SN_EQUAL(preorder_ctrl
->indicate_seq
,
1846 pattrib
->seq_num
)) {
1847 preorder_ctrl
->indicate_seq
=
1848 (preorder_ctrl
->indicate_seq
+ 1)&0xFFF;
1851 if (!pattrib
->amsdu
) {
1852 if ((padapter
->bDriverStopped
== false) &&
1853 (padapter
->bSurpriseRemoved
== false)) {
1854 rtw_recv_indicatepkt23a(padapter
, prframe
);
1857 if (amsdu_to_msdu(padapter
, prframe
) !=
1859 rtw_free_recvframe23a(prframe
);
1862 /* Update local variables. */
1875 int recv_indicatepkt_reorder(struct rtw_adapter
*padapter
,
1876 struct recv_frame
*prframe
);
1877 int recv_indicatepkt_reorder(struct rtw_adapter
*padapter
,
1878 struct recv_frame
*prframe
)
1880 int retval
= _SUCCESS
;
1881 struct rx_pkt_attrib
*pattrib
;
1882 struct recv_reorder_ctrl
*preorder_ctrl
;
1883 struct rtw_queue
*ppending_recvframe_queue
;
1885 pattrib
= &prframe
->attrib
;
1886 preorder_ctrl
= prframe
->preorder_ctrl
;
1887 ppending_recvframe_queue
= &preorder_ctrl
->pending_recvframe_queue
;
1889 if (!pattrib
->amsdu
) {
1891 wlanhdr_to_ethhdr(prframe
);
1893 if ((pattrib
->qos
!= 1) || (pattrib
->eth_type
== ETH_P_ARP
) ||
1894 (pattrib
->ack_policy
!= 0)) {
1895 if ((padapter
->bDriverStopped
== false) &&
1896 (padapter
->bSurpriseRemoved
== false)) {
1897 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
1898 "@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n");
1900 rtw_recv_indicatepkt23a(padapter
, prframe
);
1907 if (preorder_ctrl
->enable
== false) {
1908 /* indicate this recv_frame */
1909 preorder_ctrl
->indicate_seq
= pattrib
->seq_num
;
1910 rtw_recv_indicatepkt23a(padapter
, prframe
);
1912 preorder_ctrl
->indicate_seq
=
1913 (preorder_ctrl
->indicate_seq
+ 1) % 4096;
1917 /* temp filter -> means didn't support A-MSDUs in a A-MPDU */
1918 if (preorder_ctrl
->enable
== false) {
1919 preorder_ctrl
->indicate_seq
= pattrib
->seq_num
;
1920 retval
= amsdu_to_msdu(padapter
, prframe
);
1922 preorder_ctrl
->indicate_seq
=
1923 (preorder_ctrl
->indicate_seq
+ 1) % 4096;
1928 spin_lock_bh(&ppending_recvframe_queue
->lock
);
1930 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
1931 "recv_indicatepkt_reorder: indicate =%d seq =%d\n",
1932 preorder_ctrl
->indicate_seq
, pattrib
->seq_num
);
1934 /* s2. check if winstart_b(indicate_seq) needs to been updated */
1935 if (!check_indicate_seq(preorder_ctrl
, pattrib
->seq_num
)) {
1939 /* s3. Insert all packet into Reorder Queue to maintain its ordering. */
1940 if (!enqueue_reorder_recvframe23a(preorder_ctrl
, prframe
)) {
1945 /* Indication process. */
1946 /* After Packet dropping and Sliding Window shifting as above,
1947 we can now just indicate the packets */
1948 /* with the SeqNum smaller than latest WinStart and buffer
1951 /* For Rx Reorder condition: */
1952 /* 1. All packets with SeqNum smaller than WinStart => Indicate */
1953 /* 2. All packets with SeqNum larger than or equal to WinStart =>
1957 if (recv_indicatepkts_in_order(padapter
, preorder_ctrl
, false) == true) {
1958 mod_timer(&preorder_ctrl
->reordering_ctrl_timer
,
1959 jiffies
+ msecs_to_jiffies(REORDER_WAIT_TIME
));
1960 spin_unlock_bh(&ppending_recvframe_queue
->lock
);
1962 spin_unlock_bh(&ppending_recvframe_queue
->lock
);
1963 del_timer_sync(&preorder_ctrl
->reordering_ctrl_timer
);
1969 spin_unlock_bh(&ppending_recvframe_queue
->lock
);
1973 void rtw_reordering_ctrl_timeout_handler23a(unsigned long pcontext
)
1975 struct recv_reorder_ctrl
*preorder_ctrl
;
1976 struct rtw_adapter
*padapter
;
1977 struct rtw_queue
*ppending_recvframe_queue
;
1979 preorder_ctrl
= (struct recv_reorder_ctrl
*)pcontext
;
1980 padapter
= preorder_ctrl
->padapter
;
1981 ppending_recvframe_queue
= &preorder_ctrl
->pending_recvframe_queue
;
1983 if (padapter
->bDriverStopped
|| padapter
->bSurpriseRemoved
) {
1987 spin_lock_bh(&ppending_recvframe_queue
->lock
);
1989 if (recv_indicatepkts_in_order(padapter
, preorder_ctrl
, true) == true) {
1990 mod_timer(&preorder_ctrl
->reordering_ctrl_timer
,
1991 jiffies
+ msecs_to_jiffies(REORDER_WAIT_TIME
));
1994 spin_unlock_bh(&ppending_recvframe_queue
->lock
);
1997 int process_recv_indicatepkts(struct rtw_adapter
*padapter
,
1998 struct recv_frame
*prframe
);
1999 int process_recv_indicatepkts(struct rtw_adapter
*padapter
,
2000 struct recv_frame
*prframe
)
2002 int retval
= _SUCCESS
;
2003 struct mlme_priv
*pmlmepriv
= &padapter
->mlmepriv
;
2004 struct ht_priv
*phtpriv
= &pmlmepriv
->htpriv
;
2006 if (phtpriv
->ht_option
== true) { /* B/G/N Mode */
2007 /* including perform A-MPDU Rx Ordering Buffer Control */
2008 if (recv_indicatepkt_reorder(padapter
, prframe
) != _SUCCESS
) {
2009 if ((padapter
->bDriverStopped
== false) &&
2010 (padapter
->bSurpriseRemoved
== false)) {
2015 } else { /* B/G mode */
2016 retval
= wlanhdr_to_ethhdr(prframe
);
2017 if (retval
!= _SUCCESS
) {
2018 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
2019 "wlanhdr_to_ethhdr: drop pkt\n");
2023 if ((padapter
->bDriverStopped
== false) &&
2024 (padapter
->bSurpriseRemoved
== false)) {
2025 /* indicate this recv_frame */
2026 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
2027 "@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n");
2028 rtw_recv_indicatepkt23a(padapter
, prframe
);
2030 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
2031 "@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n");
2033 RT_TRACE(_module_rtl871x_recv_c_
, _drv_notice_
,
2034 "recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",
2035 padapter
->bDriverStopped
,
2036 padapter
->bSurpriseRemoved
);
2046 static int recv_func_prehandle(struct rtw_adapter
*padapter
,
2047 struct recv_frame
*rframe
)
2051 /* check the frame crtl field and decache */
2052 ret
= validate_recv_frame(padapter
, rframe
);
2053 if (ret
!= _SUCCESS
) {
2054 RT_TRACE(_module_rtl871x_recv_c_
, _drv_info_
,
2055 "recv_func: validate_recv_frame fail! drop pkt\n");
2056 rtw_free_recvframe23a(rframe
);
2064 static int recv_func_posthandle(struct rtw_adapter
*padapter
,
2065 struct recv_frame
*prframe
)
2068 struct recv_frame
*orig_prframe
= prframe
;
2069 struct recv_priv
*precvpriv
= &padapter
->recvpriv
;
2072 prframe
= decryptor(padapter
, prframe
);
2073 if (prframe
== NULL
) {
2074 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
2075 "decryptor: drop pkt\n");
2077 goto _recv_data_drop
;
2080 prframe
= recvframe_chk_defrag23a(padapter
, prframe
);
2082 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
2083 "recvframe_chk_defrag23a: drop pkt\n");
2084 goto _recv_data_drop
;
2088 * Pull off crypto headers
2090 if (prframe
->attrib
.iv_len
> 0) {
2091 skb_pull(prframe
->pkt
, prframe
->attrib
.iv_len
);
2094 if (prframe
->attrib
.icv_len
> 0) {
2095 skb_trim(prframe
->pkt
,
2096 prframe
->pkt
->len
- prframe
->attrib
.icv_len
);
2099 prframe
= portctrl(padapter
, prframe
);
2101 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
2102 "portctrl: drop pkt\n");
2104 goto _recv_data_drop
;
2107 count_rx_stats(padapter
, prframe
, NULL
);
2109 ret
= process_recv_indicatepkts(padapter
, prframe
);
2110 if (ret
!= _SUCCESS
) {
2111 RT_TRACE(_module_rtl871x_recv_c_
, _drv_err_
,
2112 "recv_func: process_recv_indicatepkts fail!\n");
2113 rtw_free_recvframe23a(orig_prframe
);/* free this recv_frame */
2114 goto _recv_data_drop
;
2119 precvpriv
->rx_drop
++;
2123 int rtw_recv_entry23a(struct recv_frame
*rframe
)
2126 struct rtw_adapter
*padapter
= rframe
->adapter
;
2127 struct rx_pkt_attrib
*prxattrib
= &rframe
->attrib
;
2128 struct recv_priv
*recvpriv
= &padapter
->recvpriv
;
2129 struct security_priv
*psecuritypriv
= &padapter
->securitypriv
;
2130 struct mlme_priv
*mlmepriv
= &padapter
->mlmepriv
;
2132 /* check if need to handle uc_swdec_pending_queue*/
2133 if (check_fwstate(mlmepriv
, WIFI_STATION_STATE
) &&
2134 psecuritypriv
->busetkipkey
) {
2135 struct recv_frame
*pending_frame
;
2137 while ((pending_frame
= rtw_alloc_recvframe23a(&padapter
->recvpriv
.uc_swdec_pending_queue
))) {
2138 r
= recv_func_posthandle(padapter
, pending_frame
);
2140 DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__
);
2144 ret
= recv_func_prehandle(padapter
, rframe
);
2146 if (ret
== _SUCCESS
) {
2147 /* check if need to enqueue into uc_swdec_pending_queue*/
2148 if (check_fwstate(mlmepriv
, WIFI_STATION_STATE
) &&
2149 !is_multicast_ether_addr(prxattrib
->ra
) &&
2150 prxattrib
->encrypt
> 0 &&
2151 (prxattrib
->bdecrypted
== 0) &&
2152 !is_wep_enc(psecuritypriv
->dot11PrivacyAlgrthm
) &&
2153 !psecuritypriv
->busetkipkey
) {
2154 rtw_enqueue_recvframe23a(rframe
, &padapter
->recvpriv
.uc_swdec_pending_queue
);
2155 DBG_8723A("%s: no key, enqueue uc_swdec_pending_queue\n", __func__
);
2159 ret
= recv_func_posthandle(padapter
, rframe
);
2161 recvpriv
->rx_pkts
++;
2168 void rtw_signal_stat_timer_hdl23a(unsigned long data
)
2170 struct rtw_adapter
*adapter
= (struct rtw_adapter
*)data
;
2171 struct recv_priv
*recvpriv
= &adapter
->recvpriv
;
2174 u8 avg_signal_strength
= 0;
2175 u8 avg_signal_qual
= 0;
2176 u32 num_signal_strength
= 0;
2177 u32 num_signal_qual
= 0;
2178 u8 _alpha
= 3; /* this value is based on converging_constant = 5000 */
2179 /* and sampling_interval = 1000 */
2181 if (recvpriv
->signal_strength_data
.update_req
== 0) {
2182 /* update_req is clear, means we got rx */
2183 avg_signal_strength
= recvpriv
->signal_strength_data
.avg_val
;
2184 num_signal_strength
= recvpriv
->signal_strength_data
.total_num
;
2185 /* after avg_vals are acquired, we can re-stat */
2186 /* the signal values */
2187 recvpriv
->signal_strength_data
.update_req
= 1;
2190 if (recvpriv
->signal_qual_data
.update_req
== 0) {
2191 /* update_req is clear, means we got rx */
2192 avg_signal_qual
= recvpriv
->signal_qual_data
.avg_val
;
2193 num_signal_qual
= recvpriv
->signal_qual_data
.total_num
;
2194 /* after avg_vals are acquired, we can re-stat */
2195 /*the signal values */
2196 recvpriv
->signal_qual_data
.update_req
= 1;
2199 /* update value of signal_strength, rssi, signal_qual */
2200 if (!check_fwstate(&adapter
->mlmepriv
, _FW_UNDER_SURVEY
)) {
2201 tmp_s
= avg_signal_strength
+ (_alpha
- 1) *
2202 recvpriv
->signal_strength
;
2204 tmp_s
= tmp_s
/ _alpha
+ 1;
2206 tmp_s
= tmp_s
/ _alpha
;
2210 tmp_q
= avg_signal_qual
+ (_alpha
- 1) * recvpriv
->signal_qual
;
2212 tmp_q
= tmp_q
/ _alpha
+ 1;
2214 tmp_q
= tmp_q
/ _alpha
;
2218 recvpriv
->signal_strength
= tmp_s
;
2219 recvpriv
->signal_qual
= tmp_q
;
2221 DBG_8723A("%s signal_strength:%3u, signal_qual:%3u, "
2222 "num_signal_strength:%u, num_signal_qual:%u\n",
2223 __func__
, recvpriv
->signal_strength
,
2224 recvpriv
->signal_qual
, num_signal_strength
,
2228 rtw_set_signal_stat_timer(recvpriv
);