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 struct recv_buf *rtw_dequeue_recvbuf23a (struct rtw_queue *queue)
217 struct recv_buf *precvbuf;
219 spin_lock_irqsave(&queue->lock, irqL);
221 precvbuf = list_first_entry_or_null(&queue->queue,
222 struct recv_buf, list);
224 list_del_init(&precvbuf->list);
226 spin_unlock_irqrestore(&queue->lock, irqL);
231 int recvframe_chkmic(struct rtw_adapter *adapter,
232 struct recv_frame *precvframe);
233 int recvframe_chkmic(struct rtw_adapter *adapter,
234 struct recv_frame *precvframe) {
236 int i, res = _SUCCESS;
239 u8 bmic_err = false, brpt_micerror = true;
240 u8 *pframe, *payload, *pframemic;
242 struct sta_info *stainfo;
243 struct rx_pkt_attrib *prxattrib = &precvframe->attrib;
244 struct security_priv *psecuritypriv = &adapter->securitypriv;
246 struct mlme_ext_priv *pmlmeext = &adapter->mlmeextpriv;
247 struct mlme_ext_info *pmlmeinfo = &pmlmeext->mlmext_info;
250 stainfo = rtw_get_stainfo23a(&adapter->stapriv, &prxattrib->ta[0]);
252 if (prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP) {
253 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
254 "recvframe_chkmic:prxattrib->encrypt == WLAN_CIPHER_SUITE_TKIP\n");
255 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
256 "recvframe_chkmic:da = %pM\n", prxattrib->ra);
258 /* calculate mic code */
259 if (stainfo != NULL) {
260 if (is_multicast_ether_addr(prxattrib->ra)) {
261 mickey = &psecuritypriv->dot118021XGrprxmickey[prxattrib->key_index].skey[0];
263 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
264 "recvframe_chkmic: bcmc key\n");
266 if (!psecuritypriv->binstallGrpkey) {
268 RT_TRACE(_module_rtl871x_recv_c_,
270 "recvframe_chkmic:didn't install group key!\n");
271 DBG_8723A("\n recvframe_chkmic:didn't "
272 "install group key!!!!!!\n");
276 mickey = &stainfo->dot11tkiprxmickey.skey[0];
277 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
278 "recvframe_chkmic: unicast key\n");
281 /* icv_len included the mic code */
282 datalen = precvframe->pkt->len-prxattrib->
283 hdrlen-prxattrib->iv_len-prxattrib->icv_len - 8;
284 pframe = precvframe->pkt->data;
285 payload = pframe + prxattrib->hdrlen +
288 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
289 "prxattrib->iv_len =%d prxattrib->icv_len =%d\n",
290 prxattrib->iv_len, prxattrib->icv_len);
292 /* care the length of the data */
293 rtw_seccalctkipmic23a(mickey, pframe, payload,
294 datalen, &miccode[0],
295 (unsigned char)prxattrib->priority);
297 pframemic = payload + datalen;
301 for (i = 0; i < 8; i++) {
302 if (miccode[i] != *(pframemic + i)) {
303 RT_TRACE(_module_rtl871x_recv_c_,
305 "recvframe_chkmic:miccode[%d](%02x) != *(pframemic+%d)(%02x)\n",
307 i, *(pframemic + i));
312 if (bmic_err == true) {
315 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
316 "*(pframemic-8)-*(pframemic-1) =%*phC\n",
318 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
319 "*(pframemic-16)-*(pframemic-9) =%*phC\n",
322 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
323 "====== demp packet (len =%d) ======\n",
324 precvframe->pkt->len);
325 for (i = 0; i < precvframe->pkt->len; i = i + 8) {
326 RT_TRACE(_module_rtl871x_recv_c_,
327 _drv_err_, "%*phC\n",
328 8, precvframe->pkt->data + i);
330 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
331 "====== demp packet end [len =%d]======\n",
332 precvframe->pkt->len);
333 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
334 "hrdlen =%d\n", prxattrib->hdrlen);
336 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
337 "ra = %pM psecuritypriv->binstallGrpkey =%d\n",
339 psecuritypriv->binstallGrpkey);
341 /* double check key_index for some timing
342 issue, cannot compare with
343 psecuritypriv->dot118021XGrpKeyid also
344 cause timing issue */
345 if ((is_multicast_ether_addr(prxattrib->ra)) &&
346 (prxattrib->key_index !=
347 pmlmeinfo->key_index))
348 brpt_micerror = false;
350 if ((prxattrib->bdecrypted == true) &&
351 (brpt_micerror == true)) {
352 rtw_handle_tkip_mic_err23a(adapter, (u8)is_multicast_ether_addr(prxattrib->ra));
353 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
354 "mic error :prxattrib->bdecrypted =%d\n",
355 prxattrib->bdecrypted);
356 DBG_8723A(" mic error :prxattrib->"
358 prxattrib->bdecrypted);
360 RT_TRACE(_module_rtl871x_recv_c_,
362 "mic error :prxattrib->bdecrypted =%d\n",
363 prxattrib->bdecrypted);
364 DBG_8723A(" mic error :prxattrib->"
366 prxattrib->bdecrypted);
372 if (!psecuritypriv->bcheck_grpkey &&
373 is_multicast_ether_addr(prxattrib->ra)) {
374 psecuritypriv->bcheck_grpkey = 1;
375 RT_TRACE(_module_rtl871x_recv_c_,
377 "psecuritypriv->bcheck_grpkey = true\n");
381 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
382 "recvframe_chkmic: rtw_get_stainfo23a ==NULL!!!\n");
385 skb_trim(precvframe->pkt, precvframe->pkt->len - 8);
395 /* decrypt and set the ivlen, icvlen of the recv_frame */
396 struct recv_frame *decryptor(struct rtw_adapter *padapter,
397 struct recv_frame *precv_frame);
398 struct recv_frame *decryptor(struct rtw_adapter *padapter,
399 struct recv_frame *precv_frame)
401 struct rx_pkt_attrib *prxattrib = &precv_frame->attrib;
402 struct security_priv *psecuritypriv = &padapter->securitypriv;
403 struct recv_frame *return_packet = precv_frame;
406 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
407 "prxstat->decrypted =%x prxattrib->encrypt = 0x%03x\n",
408 prxattrib->bdecrypted, prxattrib->encrypt);
410 if (prxattrib->encrypt > 0) {
411 u8 *iv = precv_frame->pkt->data + prxattrib->hdrlen;
413 prxattrib->key_index = (((iv[3]) >> 6) & 0x3);
415 if (prxattrib->key_index > WEP_KEYS) {
416 DBG_8723A("prxattrib->key_index(%d) > WEP_KEYS\n",
417 prxattrib->key_index);
419 switch (prxattrib->encrypt) {
420 case WLAN_CIPHER_SUITE_WEP40:
421 case WLAN_CIPHER_SUITE_WEP104:
422 prxattrib->key_index =
423 psecuritypriv->dot11PrivacyKeyIndex;
425 case WLAN_CIPHER_SUITE_TKIP:
426 case WLAN_CIPHER_SUITE_CCMP:
428 prxattrib->key_index =
429 psecuritypriv->dot118021XGrpKeyid;
435 if ((prxattrib->encrypt > 0) && ((prxattrib->bdecrypted == 0))) {
436 psecuritypriv->hw_decrypted = 0;
437 switch (prxattrib->encrypt) {
438 case WLAN_CIPHER_SUITE_WEP40:
439 case WLAN_CIPHER_SUITE_WEP104:
440 rtw_wep_decrypt23a(padapter, precv_frame);
442 case WLAN_CIPHER_SUITE_TKIP:
443 res = rtw_tkip_decrypt23a(padapter, precv_frame);
445 case WLAN_CIPHER_SUITE_CCMP:
446 res = rtw_aes_decrypt23a(padapter, precv_frame);
451 } else if (prxattrib->bdecrypted == 1 && prxattrib->encrypt > 0 &&
452 (psecuritypriv->busetkipkey == 1 ||
453 prxattrib->encrypt != WLAN_CIPHER_SUITE_TKIP)) {
454 psecuritypriv->hw_decrypted = 1;
458 rtw_free_recvframe23a(return_packet);
459 return_packet = NULL;
464 return return_packet;
467 /* set the security information in the recv_frame */
468 static struct recv_frame *portctrl(struct rtw_adapter *adapter,
469 struct recv_frame *precv_frame)
473 struct recv_frame *pfhdr;
474 struct sta_info *psta;
475 struct sta_priv *pstapriv ;
476 struct recv_frame *prtnframe;
478 u16 eapol_type = ETH_P_PAE;/* for Funia BD's WPA issue */
479 struct rx_pkt_attrib *pattrib;
481 pstapriv = &adapter->stapriv;
483 auth_alg = adapter->securitypriv.dot11AuthAlgrthm;
486 pattrib = &pfhdr->attrib;
487 psta_addr = pattrib->ta;
488 psta = rtw_get_stainfo23a(pstapriv, psta_addr);
490 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
491 "########portctrl:adapter->securitypriv.dot11AuthAlgrthm =%d\n",
492 adapter->securitypriv.dot11AuthAlgrthm);
494 prtnframe = precv_frame;
496 if (auth_alg == dot11AuthAlgrthm_8021X) {
498 ptr = pfhdr->pkt->data + pfhdr->attrib.hdrlen;
500 ether_type = (ptr[6] << 8) | ptr[7];
502 if (psta && psta->ieee8021x_blocked) {
504 /* only accept EAPOL frame */
505 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
506 "########portctrl:psta->ieee8021x_blocked ==1\n");
508 if (ether_type != eapol_type) {
509 /* free this frame */
510 rtw_free_recvframe23a(precv_frame);
519 int recv_decache(struct recv_frame *precv_frame, u8 bretry,
520 struct stainfo_rxcache *prxcache);
521 int recv_decache(struct recv_frame *precv_frame, u8 bretry,
522 struct stainfo_rxcache *prxcache)
524 int tid = precv_frame->attrib.priority;
526 u16 seq_ctrl = ((precv_frame->attrib.seq_num & 0xffff) << 4) |
527 (precv_frame->attrib.frag_num & 0xf);
532 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
533 "recv_decache, (tid>15)! seq_ctrl = 0x%x, tid = 0x%x\n",
539 if (1) { /* if (bretry) */
540 if (seq_ctrl == prxcache->tid_rxseq[tid]) {
541 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
542 "recv_decache, seq_ctrl = 0x%x, tid = 0x%x, tid_rxseq = 0x%x\n",
543 seq_ctrl, tid, prxcache->tid_rxseq[tid]);
549 prxcache->tid_rxseq[tid] = seq_ctrl;
556 void process23a_pwrbit_data(struct rtw_adapter *padapter,
557 struct recv_frame *precv_frame);
558 void process23a_pwrbit_data(struct rtw_adapter *padapter,
559 struct recv_frame *precv_frame)
561 #ifdef CONFIG_8723AU_AP_MODE
562 unsigned char pwrbit;
563 struct sk_buff *skb = precv_frame->pkt;
564 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
565 struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
566 struct sta_priv *pstapriv = &padapter->stapriv;
567 struct sta_info *psta;
569 psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
572 pwrbit = ieee80211_has_pm(hdr->frame_control);
575 if (!(psta->state & WIFI_SLEEP_STATE))
576 stop_sta_xmit23a(padapter, psta);
578 if (psta->state & WIFI_SLEEP_STATE)
579 wakeup_sta_to_xmit23a(padapter, psta);
586 void process_wmmps_data(struct rtw_adapter *padapter,
587 struct recv_frame *precv_frame);
588 void process_wmmps_data(struct rtw_adapter *padapter,
589 struct recv_frame *precv_frame)
591 #ifdef CONFIG_8723AU_AP_MODE
592 struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
593 struct sta_priv *pstapriv = &padapter->stapriv;
594 struct sta_info *psta;
596 psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
602 if (!psta->qos_option)
605 if (!(psta->qos_info & 0xf))
608 if (psta->state & WIFI_SLEEP_STATE) {
611 switch (pattrib->priority) {
614 wmmps_ac = psta->uapsd_bk & BIT(1);
618 wmmps_ac = psta->uapsd_vi & BIT(1);
622 wmmps_ac = psta->uapsd_vo & BIT(1);
627 wmmps_ac = psta->uapsd_be & BIT(1);
632 if (psta->sleepq_ac_len > 0) {
633 /* process received triggered frame */
634 xmit_delivery_enabled_frames23a(padapter, psta);
636 /* issue one qos null frame with More data bit = 0 and the EOSP bit set (= 1) */
637 issue_qos_nulldata23a(padapter, psta->hwaddr,
638 (u16)pattrib->priority,
647 static void count_rx_stats(struct rtw_adapter *padapter,
648 struct recv_frame *prframe, struct sta_info *sta)
651 struct sta_info *psta = NULL;
652 struct stainfo_stats *pstats = NULL;
653 struct rx_pkt_attrib *pattrib = & prframe->attrib;
654 struct recv_priv *precvpriv = &padapter->recvpriv;
656 sz = prframe->pkt->len;
657 precvpriv->rx_bytes += sz;
659 padapter->mlmepriv.LinkDetectInfo.NumRxOkInPeriod++;
661 if ((!is_broadcast_ether_addr(pattrib->dst)) &&
662 (!is_multicast_ether_addr(pattrib->dst)))
663 padapter->mlmepriv.LinkDetectInfo.NumRxUnicastOkInPeriod++;
668 psta = prframe->psta;
671 pstats = &psta->sta_stats;
673 pstats->rx_data_pkts++;
674 pstats->rx_bytes += sz;
678 static int sta2sta_data_frame(struct rtw_adapter *adapter,
679 struct recv_frame *precv_frame,
680 struct sta_info**psta)
682 struct sk_buff *skb = precv_frame->pkt;
683 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
685 struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
686 struct sta_priv *pstapriv = &adapter->stapriv;
687 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
688 u8 *mybssid = get_bssid(pmlmepriv);
689 u8 *myhwaddr = myid(&adapter->eeprompriv);
691 int bmcast = is_multicast_ether_addr(pattrib->dst);
695 if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
696 check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
698 /* filter packets that SA is myself or multicast or broadcast */
699 if (ether_addr_equal(myhwaddr, pattrib->src)) {
700 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
706 if (!ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
711 if (ether_addr_equal(pattrib->bssid, "\x0\x0\x0\x0\x0\x0") ||
712 ether_addr_equal(mybssid, "\x0\x0\x0\x0\x0\x0") ||
713 !ether_addr_equal(pattrib->bssid, mybssid)) {
718 sta_addr = pattrib->src;
719 } else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
720 /* For Station mode, sa and bssid should always be BSSID,
721 and DA is my mac-address */
722 if (!ether_addr_equal(pattrib->bssid, pattrib->src)) {
723 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
724 "bssid != TA under STATION_MODE; drop pkt\n");
729 sta_addr = pattrib->bssid;
731 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
733 /* For AP mode, if DA == MCAST, then BSSID should be also MCAST */
734 if (!is_multicast_ether_addr(pattrib->bssid)) {
738 } else { /* not mc-frame */
739 /* For AP mode, if DA is non-MCAST, then it must
740 be BSSID, and bssid == BSSID */
741 if (!ether_addr_equal(pattrib->bssid, pattrib->dst)) {
746 sta_addr = pattrib->src;
748 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
749 ether_addr_copy(pattrib->dst, hdr->addr1);
750 ether_addr_copy(pattrib->src, hdr->addr2);
751 ether_addr_copy(pattrib->bssid, hdr->addr3);
752 ether_addr_copy(pattrib->ra, pattrib->dst);
753 ether_addr_copy(pattrib->ta, pattrib->src);
761 *psta = rtw_get_bcmc_stainfo23a(adapter);
763 *psta = rtw_get_stainfo23a(pstapriv, sta_addr); /* get ap_info */
766 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
767 "can't get psta under sta2sta_data_frame ; drop pkt\n");
777 int ap2sta_data_frame(struct rtw_adapter *adapter,
778 struct recv_frame *precv_frame,
779 struct sta_info **psta);
780 int ap2sta_data_frame(struct rtw_adapter *adapter,
781 struct recv_frame *precv_frame,
782 struct sta_info **psta)
784 struct sk_buff *skb = precv_frame->pkt;
785 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
786 struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
788 struct sta_priv *pstapriv = &adapter->stapriv;
789 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
790 u8 *mybssid = get_bssid(pmlmepriv);
791 u8 *myhwaddr = myid(&adapter->eeprompriv);
792 int bmcast = is_multicast_ether_addr(pattrib->dst);
796 if (check_fwstate(pmlmepriv, WIFI_STATION_STATE) &&
797 (check_fwstate(pmlmepriv, _FW_LINKED) ||
798 check_fwstate(pmlmepriv, _FW_UNDER_LINKING))) {
800 /* filter packets that SA is myself or multicast or broadcast */
801 if (ether_addr_equal(myhwaddr, pattrib->src)) {
802 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
808 /* da should be for me */
809 if (!ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
810 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
811 "ap2sta_data_frame: compare DA failed; DA=%pM\n",
818 if (ether_addr_equal(pattrib->bssid, "\x0\x0\x0\x0\x0\x0") ||
819 ether_addr_equal(mybssid, "\x0\x0\x0\x0\x0\x0") ||
820 !ether_addr_equal(pattrib->bssid, mybssid)) {
821 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
822 "ap2sta_data_frame: compare BSSID failed; BSSID=%pM\n",
824 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
825 "mybssid=%pM\n", mybssid);
828 DBG_8723A("issue_deauth23a to the nonassociated ap=%pM for the reason(7)\n",
830 issue_deauth23a(adapter, pattrib->bssid,
831 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
839 *psta = rtw_get_bcmc_stainfo23a(adapter);
842 *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
845 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
846 "ap2sta: can't get psta under STATION_MODE; drop pkt\n");
851 if (ieee80211_is_nullfunc(hdr->frame_control)) {
852 /* No data, will not indicate to upper layer,
853 temporily count it here */
854 count_rx_stats(adapter, precv_frame, *psta);
855 ret = RTW_RX_HANDLED;
859 } else if (check_fwstate(pmlmepriv, WIFI_MP_STATE) &&
860 check_fwstate(pmlmepriv, _FW_LINKED)) {
861 ether_addr_copy(pattrib->dst, hdr->addr1);
862 ether_addr_copy(pattrib->src, hdr->addr2);
863 ether_addr_copy(pattrib->bssid, hdr->addr3);
864 ether_addr_copy(pattrib->ra, pattrib->dst);
865 ether_addr_copy(pattrib->ta, pattrib->src);
868 ether_addr_copy(pattrib->bssid, mybssid);
871 *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
873 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
874 "can't get psta under MP_MODE ; drop pkt\n");
878 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
880 ret = RTW_RX_HANDLED;
883 if (ether_addr_equal(myhwaddr, pattrib->dst) && !bmcast) {
884 *psta = rtw_get_stainfo23a(pstapriv, pattrib->bssid);
886 DBG_8723A("issue_deauth23a to the ap=%pM for the reason(7)\n",
889 issue_deauth23a(adapter, pattrib->bssid,
890 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
904 int sta2ap_data_frame(struct rtw_adapter *adapter,
905 struct recv_frame *precv_frame,
906 struct sta_info **psta);
907 int sta2ap_data_frame(struct rtw_adapter *adapter,
908 struct recv_frame *precv_frame,
909 struct sta_info **psta)
911 struct sk_buff *skb = precv_frame->pkt;
912 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
913 struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
914 struct sta_priv *pstapriv = &adapter->stapriv;
915 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
916 unsigned char *mybssid = get_bssid(pmlmepriv);
921 if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
922 /* For AP mode, RA = BSSID, TX = STA(SRC_ADDR), A3 = DST_ADDR */
923 if (!ether_addr_equal(pattrib->bssid, mybssid)) {
928 *psta = rtw_get_stainfo23a(pstapriv, pattrib->src);
930 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
931 "can't get psta under AP_MODE; drop pkt\n");
932 DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
935 issue_deauth23a(adapter, pattrib->src,
936 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
938 ret = RTW_RX_HANDLED;
942 process23a_pwrbit_data(adapter, precv_frame);
944 /* We only get here if it's a data frame, so no need to
945 * confirm data frame type first */
946 if (ieee80211_is_data_qos(hdr->frame_control))
947 process_wmmps_data(adapter, precv_frame);
949 if (ieee80211_is_nullfunc(hdr->frame_control)) {
950 /* No data, will not indicate to upper layer,
951 temporily count it here */
952 count_rx_stats(adapter, precv_frame, *psta);
953 ret = RTW_RX_HANDLED;
957 u8 *myhwaddr = myid(&adapter->eeprompriv);
959 if (!ether_addr_equal(pattrib->ra, myhwaddr)) {
960 ret = RTW_RX_HANDLED;
963 DBG_8723A("issue_deauth23a to sta=%pM for the reason(7)\n",
965 issue_deauth23a(adapter, pattrib->src,
966 WLAN_REASON_CLASS3_FRAME_FROM_NONASSOC_STA);
967 ret = RTW_RX_HANDLED;
978 static int validate_recv_ctrl_frame(struct rtw_adapter *padapter,
979 struct recv_frame *precv_frame)
981 #ifdef CONFIG_8723AU_AP_MODE
982 struct rx_pkt_attrib *pattrib = &precv_frame->attrib;
983 struct sta_priv *pstapriv = &padapter->stapriv;
984 struct sk_buff *skb = precv_frame->pkt;
985 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
987 if (!ieee80211_is_ctl(hdr->frame_control))
990 /* receive the frames that ra(a1) is my address */
991 if (!ether_addr_equal(hdr->addr1, myid(&padapter->eeprompriv)))
994 /* only handle ps-poll */
995 if (ieee80211_is_pspoll(hdr->frame_control)) {
996 struct ieee80211_pspoll *psp = (struct ieee80211_pspoll *)hdr;
999 struct sta_info *psta = NULL;
1001 aid = le16_to_cpu(psp->aid) & 0x3fff;
1002 psta = rtw_get_stainfo23a(pstapriv, hdr->addr2);
1004 if (!psta || psta->aid != aid)
1007 /* for rx pkt statistics */
1008 psta->sta_stats.rx_ctrl_pkts++;
1010 switch (pattrib->priority) {
1013 wmmps_ac = psta->uapsd_bk & BIT(0);
1017 wmmps_ac = psta->uapsd_vi & BIT(0);
1021 wmmps_ac = psta->uapsd_vo & BIT(0);
1026 wmmps_ac = psta->uapsd_be & BIT(0);
1033 if (psta->state & WIFI_STA_ALIVE_CHK_STATE) {
1034 DBG_8723A("%s alive check-rx ps-poll\n", __func__);
1035 psta->expire_to = pstapriv->expire_to;
1036 psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
1039 if ((psta->state & WIFI_SLEEP_STATE) &&
1040 (pstapriv->sta_dz_bitmap & CHKBIT(psta->aid))) {
1041 struct list_head *xmitframe_phead;
1042 struct xmit_frame *pxmitframe;
1043 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1045 spin_lock_bh(&pxmitpriv->lock);
1047 xmitframe_phead = get_list_head(&psta->sleep_q);
1048 pxmitframe = list_first_entry_or_null(xmitframe_phead,
1052 list_del_init(&pxmitframe->list);
1056 if (psta->sleepq_len>0)
1057 pxmitframe->attrib.mdata = 1;
1059 pxmitframe->attrib.mdata = 0;
1061 pxmitframe->attrib.triggered = 1;
1063 rtl8723au_hal_xmitframe_enqueue(padapter,
1066 if (psta->sleepq_len == 0) {
1067 pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
1068 update_beacon23a(padapter, WLAN_EID_TIM,
1072 spin_unlock_bh(&pxmitpriv->lock);
1075 spin_unlock_bh(&pxmitpriv->lock);
1077 if (pstapriv->tim_bitmap & CHKBIT(psta->aid)) {
1078 if (psta->sleepq_len == 0) {
1079 DBG_8723A("no buffered packets "
1082 /* issue nulldata with More data bit = 0 to indicate we have no buffered packets */
1083 issue_nulldata23a(padapter,
1087 DBG_8723A("error!psta->sleepq"
1090 psta->sleepq_len = 0;
1093 pstapriv->tim_bitmap &= ~CHKBIT(psta->aid);
1095 update_beacon23a(padapter, WLAN_EID_TIM,
1106 struct recv_frame *recvframe_chk_defrag23a(struct rtw_adapter *padapter,
1107 struct recv_frame *precv_frame);
1108 static int validate_recv_mgnt_frame(struct rtw_adapter *padapter,
1109 struct recv_frame *precv_frame)
1111 struct sta_info *psta;
1112 struct sk_buff *skb;
1113 struct ieee80211_hdr *hdr;
1115 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1116 "+validate_recv_mgnt_frame\n");
1118 precv_frame = recvframe_chk_defrag23a(padapter, precv_frame);
1119 if (precv_frame == NULL) {
1120 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1121 "%s: fragment packet\n", __func__);
1125 skb = precv_frame->pkt;
1126 hdr = (struct ieee80211_hdr *) skb->data;
1128 /* for rx pkt statistics */
1129 psta = rtw_get_stainfo23a(&padapter->stapriv, hdr->addr2);
1131 psta->sta_stats.rx_mgnt_pkts++;
1133 if (ieee80211_is_beacon(hdr->frame_control))
1134 psta->sta_stats.rx_beacon_pkts++;
1135 else if (ieee80211_is_probe_req(hdr->frame_control))
1136 psta->sta_stats.rx_probereq_pkts++;
1137 else if (ieee80211_is_probe_resp(hdr->frame_control)) {
1138 if (ether_addr_equal(padapter->eeprompriv.mac_addr,
1140 psta->sta_stats.rx_probersp_pkts++;
1141 else if (is_broadcast_ether_addr(hdr->addr1) ||
1142 is_multicast_ether_addr(hdr->addr1))
1143 psta->sta_stats.rx_probersp_bm_pkts++;
1145 psta->sta_stats.rx_probersp_uo_pkts++;
1149 mgt_dispatcher23a(padapter, precv_frame);
1154 static int validate_recv_data_frame(struct rtw_adapter *adapter,
1155 struct recv_frame *precv_frame)
1159 struct sta_info *psta = NULL;
1160 struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
1161 struct security_priv *psecuritypriv = &adapter->securitypriv;
1163 struct sk_buff *skb = precv_frame->pkt;
1164 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1168 bretry = ieee80211_has_retry(hdr->frame_control);
1169 pda = ieee80211_get_DA(hdr);
1170 psa = ieee80211_get_SA(hdr);
1172 ether_addr_copy(pattrib->dst, pda);
1173 ether_addr_copy(pattrib->src, psa);
1175 switch (hdr->frame_control &
1176 cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS)) {
1177 case cpu_to_le16(0):
1178 ether_addr_copy(pattrib->bssid, hdr->addr3);
1179 ether_addr_copy(pattrib->ra, pda);
1180 ether_addr_copy(pattrib->ta, psa);
1181 ret = sta2sta_data_frame(adapter, precv_frame, &psta);
1184 case cpu_to_le16(IEEE80211_FCTL_FROMDS):
1185 ether_addr_copy(pattrib->bssid, hdr->addr2);
1186 ether_addr_copy(pattrib->ra, pda);
1187 ether_addr_copy(pattrib->ta, hdr->addr2);
1188 ret = ap2sta_data_frame(adapter, precv_frame, &psta);
1191 case cpu_to_le16(IEEE80211_FCTL_TODS):
1192 ether_addr_copy(pattrib->bssid, hdr->addr1);
1193 ether_addr_copy(pattrib->ra, hdr->addr1);
1194 ether_addr_copy(pattrib->ta, psa);
1195 ret = sta2ap_data_frame(adapter, precv_frame, &psta);
1198 case cpu_to_le16(IEEE80211_FCTL_TODS | IEEE80211_FCTL_FROMDS):
1200 * There is no BSSID in this case, but the driver has been
1201 * using addr1 so far, so keep it for now.
1203 ether_addr_copy(pattrib->bssid, hdr->addr1);
1204 ether_addr_copy(pattrib->ra, hdr->addr1);
1205 ether_addr_copy(pattrib->ta, hdr->addr2);
1207 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_, "case 3\n");
1211 if ((ret == _FAIL) || (ret == RTW_RX_HANDLED))
1215 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1216 "after to_fr_ds_chk; psta == NULL\n");
1221 precv_frame->psta = psta;
1223 pattrib->hdrlen = sizeof(struct ieee80211_hdr_3addr);
1224 if (ieee80211_has_a4(hdr->frame_control))
1225 pattrib->hdrlen += ETH_ALEN;
1227 /* parsing QC field */
1228 if (pattrib->qos == 1) {
1229 __le16 *qptr = (__le16 *)ieee80211_get_qos_ctl(hdr);
1230 u16 qos_ctrl = le16_to_cpu(*qptr);
1232 pattrib->priority = qos_ctrl & IEEE80211_QOS_CTL_TID_MASK;
1233 pattrib->ack_policy = (qos_ctrl >> 5) & 3;
1235 (qos_ctrl & IEEE80211_QOS_CTL_A_MSDU_PRESENT) >> 7;
1236 pattrib->hdrlen += IEEE80211_QOS_CTL_LEN;
1238 if (pattrib->priority != 0 && pattrib->priority != 3) {
1239 adapter->recvpriv.bIsAnyNonBEPkts = true;
1242 pattrib->priority = 0;
1243 pattrib->ack_policy = 0;
1247 if (pattrib->order) { /* HT-CTRL 11n */
1248 pattrib->hdrlen += 4;
1251 precv_frame->preorder_ctrl = &psta->recvreorder_ctrl[pattrib->priority];
1253 /* decache, drop duplicate recv packets */
1254 if (recv_decache(precv_frame, bretry, &psta->sta_recvpriv.rxcache) ==
1256 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1257 "decache : drop pkt\n");
1262 if (pattrib->privacy) {
1263 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1264 "validate_recv_data_frame:pattrib->privacy =%x\n",
1266 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1267 "^^^^^^^^^^^is_multicast_ether_addr(pattrib->ra(0x%02x)) =%d^^^^^^^^^^^^^^^6\n",
1269 is_multicast_ether_addr(pattrib->ra));
1271 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt,
1272 is_multicast_ether_addr(pattrib->ra));
1274 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1275 "pattrib->encrypt =%d\n", pattrib->encrypt);
1277 switch (pattrib->encrypt) {
1278 case WLAN_CIPHER_SUITE_WEP40:
1279 case WLAN_CIPHER_SUITE_WEP104:
1280 pattrib->iv_len = IEEE80211_WEP_IV_LEN;
1281 pattrib->icv_len = IEEE80211_WEP_ICV_LEN;
1283 case WLAN_CIPHER_SUITE_TKIP:
1284 pattrib->iv_len = IEEE80211_TKIP_IV_LEN;
1285 pattrib->icv_len = IEEE80211_TKIP_ICV_LEN;
1287 case WLAN_CIPHER_SUITE_CCMP:
1288 pattrib->iv_len = IEEE80211_CCMP_HDR_LEN;
1289 pattrib->icv_len = IEEE80211_CCMP_MIC_LEN;
1292 pattrib->iv_len = 0;
1293 pattrib->icv_len = 0;
1297 pattrib->encrypt = 0;
1298 pattrib->iv_len = 0;
1299 pattrib->icv_len = 0;
1309 static void dump_rx_pkt(struct sk_buff *skb, u16 type, int level)
1315 ((level == 2) && (type == IEEE80211_FTYPE_MGMT)) ||
1316 ((level == 3) && (type == IEEE80211_FTYPE_DATA))) {
1320 DBG_8723A("#############################\n");
1322 for (i = 0; i < 64; i = i + 8)
1323 DBG_8723A("%*phC:\n", 8, ptr + i);
1324 DBG_8723A("#############################\n");
1328 static int validate_recv_frame(struct rtw_adapter *adapter,
1329 struct recv_frame *precv_frame)
1331 /* shall check frame subtype, to / from ds, da, bssid */
1333 /* then call check if rx seq/frag. duplicated. */
1336 int retval = _SUCCESS;
1337 struct rx_pkt_attrib *pattrib = & precv_frame->attrib;
1338 struct sk_buff *skb = precv_frame->pkt;
1339 struct ieee80211_hdr *hdr = (struct ieee80211_hdr *) skb->data;
1344 fctl = le16_to_cpu(hdr->frame_control);
1345 ver = fctl & IEEE80211_FCTL_VERS;
1346 type = fctl & IEEE80211_FCTL_FTYPE;
1347 subtype = fctl & IEEE80211_FCTL_STYPE;
1349 /* add version chk */
1351 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1352 "validate_recv_data_frame fail! (ver!= 0)\n");
1357 seq_ctrl = le16_to_cpu(hdr->seq_ctrl);
1358 pattrib->frag_num = seq_ctrl & IEEE80211_SCTL_FRAG;
1359 pattrib->seq_num = seq_ctrl >> 4;
1361 pattrib->pw_save = ieee80211_has_pm(hdr->frame_control);
1362 pattrib->mfrag = ieee80211_has_morefrags(hdr->frame_control);
1363 pattrib->mdata = ieee80211_has_moredata(hdr->frame_control);
1364 pattrib->privacy = ieee80211_has_protected(hdr->frame_control);
1365 pattrib->order = ieee80211_has_order(hdr->frame_control);
1367 GetHalDefVar8192CUsb(adapter, HAL_DEF_DBG_DUMP_RXPKT, &bDumpRxPkt);
1369 if (unlikely(bDumpRxPkt == 1))
1370 dump_rx_pkt(skb, type, bDumpRxPkt);
1373 case IEEE80211_FTYPE_MGMT:
1374 retval = validate_recv_mgnt_frame(adapter, precv_frame);
1375 if (retval == _FAIL) {
1376 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1377 "validate_recv_mgnt_frame fail\n");
1379 retval = _FAIL; /* only data frame return _SUCCESS */
1381 case IEEE80211_FTYPE_CTL:
1382 retval = validate_recv_ctrl_frame(adapter, precv_frame);
1383 if (retval == _FAIL) {
1384 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1385 "validate_recv_ctrl_frame fail\n");
1387 retval = _FAIL; /* only data frame return _SUCCESS */
1389 case IEEE80211_FTYPE_DATA:
1390 pattrib->qos = (subtype & IEEE80211_STYPE_QOS_DATA) ? 1 : 0;
1391 retval = validate_recv_data_frame(adapter, precv_frame);
1392 if (retval == _FAIL) {
1393 struct recv_priv *precvpriv = &adapter->recvpriv;
1395 precvpriv->rx_drop++;
1399 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1400 "validate_recv_data_frame fail! type = 0x%x\n", type);
1409 /* remove the wlanhdr and add the eth_hdr */
1411 static int wlanhdr_to_ethhdr (struct recv_frame *precvframe)
1413 u16 eth_type, len, hdrlen;
1416 struct rtw_adapter *adapter = precvframe->adapter;
1417 struct mlme_priv *pmlmepriv = &adapter->mlmepriv;
1419 struct sk_buff *skb = precvframe->pkt;
1421 struct rx_pkt_attrib *pattrib = &precvframe->attrib;
1426 hdrlen = pattrib->hdrlen;
1427 psnap = ptr + hdrlen;
1428 eth_type = (psnap[6] << 8) | psnap[7];
1429 /* convert hdr + possible LLC headers into Ethernet header */
1430 if ((ether_addr_equal(psnap, rfc1042_header) &&
1431 eth_type != ETH_P_AARP && eth_type != ETH_P_IPX) ||
1432 ether_addr_equal(psnap, bridge_tunnel_header)) {
1433 /* remove RFC1042 or Bridge-Tunnel encapsulation
1434 and replace EtherType */
1436 hdrlen += SNAP_SIZE;
1438 /* Leave Ethernet header part of hdr and full payload */
1440 eth_type = (psnap[0] << 8) | psnap[1];
1443 len = skb->len - hdrlen;
1445 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1446 "=== pattrib->hdrlen: %x, pattrib->iv_len:%x ===\n",
1447 pattrib->hdrlen, pattrib->iv_len);
1449 pattrib->eth_type = eth_type;
1450 if (check_fwstate(pmlmepriv, WIFI_MP_STATE)) {
1456 /* append rx status for mp test packets */
1458 ptr = skb_pull(skb, (hdrlen - sizeof(struct ethhdr) + 2) - 24);
1459 memcpy(ptr, skb->head, 24);
1462 ptr = skb_pull(skb, (hdrlen - sizeof(struct ethhdr) +
1466 ether_addr_copy(ptr, pattrib->dst);
1467 ether_addr_copy(ptr + ETH_ALEN, pattrib->src);
1470 put_unaligned_be16(len, ptr + 12);
1477 /* perform defrag */
1478 struct recv_frame *recvframe_defrag(struct rtw_adapter *adapter,
1479 struct rtw_queue *defrag_q);
1480 struct recv_frame *recvframe_defrag(struct rtw_adapter *adapter,
1481 struct rtw_queue *defrag_q)
1483 struct list_head *phead;
1486 struct recv_frame *pnfhdr, *ptmp;
1487 struct recv_frame *prframe, *pnextrframe;
1488 struct rtw_queue *pfree_recv_queue;
1489 struct sk_buff *skb;
1492 pfree_recv_queue = &adapter->recvpriv.free_recv_queue;
1494 phead = get_list_head(defrag_q);
1495 prframe = list_first_entry(phead, struct recv_frame, list);
1496 list_del_init(&prframe->list);
1499 if (curfragnum != prframe->attrib.frag_num) {
1500 /* the first fragment number must be 0 */
1501 /* free the whole queue */
1502 rtw_free_recvframe23a(prframe);
1503 rtw_free_recvframe23a_queue(defrag_q);
1510 list_for_each_entry_safe(pnfhdr, ptmp, phead, list) {
1511 pnextrframe = (struct recv_frame *)pnfhdr;
1512 /* check the fragment sequence (2nd ~n fragment frame) */
1514 if (curfragnum != pnfhdr->attrib.frag_num) {
1515 /* the fragment number must be increasing
1517 /* release the defrag_q & prframe */
1518 rtw_free_recvframe23a(prframe);
1519 rtw_free_recvframe23a_queue(defrag_q);
1525 /* copy the 2nd~n fragment frame's payload to the
1527 /* get the 2nd~last fragment frame's payload */
1529 wlanhdr_offset = pnfhdr->attrib.hdrlen + pnfhdr->attrib.iv_len;
1531 skb_pull(pnfhdr->pkt, wlanhdr_offset);
1533 /* append to first fragment frame's tail
1534 (if privacy frame, pull the ICV) */
1536 skb_trim(skb, skb->len - prframe->attrib.icv_len);
1538 memcpy(skb_tail_pointer(skb), pnfhdr->pkt->data,
1541 skb_put(skb, pnfhdr->pkt->len);
1543 prframe->attrib.icv_len = pnfhdr->attrib.icv_len;
1546 /* free the defrag_q queue and return the prframe */
1547 rtw_free_recvframe23a_queue(defrag_q);
1549 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1550 "Performance defrag!!!!!\n");
1555 /* check if need to defrag, if needed queue the frame to defrag_q */
1556 struct recv_frame *recvframe_chk_defrag23a(struct rtw_adapter *padapter,
1557 struct recv_frame *precv_frame)
1562 struct recv_frame *pfhdr;
1563 struct sta_info *psta;
1564 struct sta_priv *pstapriv;
1565 struct list_head *phead;
1566 struct recv_frame *prtnframe = NULL;
1567 struct rtw_queue *pfree_recv_queue, *pdefrag_q;
1571 pstapriv = &padapter->stapriv;
1573 pfhdr = precv_frame;
1575 pfree_recv_queue = &padapter->recvpriv.free_recv_queue;
1577 /* need to define struct of wlan header frame ctrl */
1578 ismfrag = pfhdr->attrib.mfrag;
1579 fragnum = pfhdr->attrib.frag_num;
1581 psta_addr = pfhdr->attrib.ta;
1582 psta = rtw_get_stainfo23a(pstapriv, psta_addr);
1584 struct ieee80211_hdr *hdr =
1585 (struct ieee80211_hdr *) pfhdr->pkt->data;
1586 if (!ieee80211_is_data(hdr->frame_control)) {
1587 psta = rtw_get_bcmc_stainfo23a(padapter);
1588 pdefrag_q = &psta->sta_recvpriv.defrag_q;
1592 pdefrag_q = &psta->sta_recvpriv.defrag_q;
1594 if ((ismfrag == 0) && (fragnum == 0)) {
1595 prtnframe = precv_frame;/* isn't a fragment frame */
1599 /* 0~(n-1) fragment frame */
1600 /* enqueue to defraf_g */
1601 if (pdefrag_q != NULL) {
1603 /* the first fragment */
1604 if (!list_empty(&pdefrag_q->queue)) {
1605 /* free current defrag_q */
1606 rtw_free_recvframe23a_queue(pdefrag_q);
1610 /* Then enqueue the 0~(n-1) fragment into the
1613 /* spin_lock(&pdefrag_q->lock); */
1614 phead = get_list_head(pdefrag_q);
1615 list_add_tail(&pfhdr->list, phead);
1616 /* spin_unlock(&pdefrag_q->lock); */
1618 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1619 "Enqueuq: ismfrag = %d, fragnum = %d\n",
1625 /* can't find this ta's defrag_queue,
1626 so free this recv_frame */
1627 rtw_free_recvframe23a(precv_frame);
1629 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1630 "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
1635 if ((ismfrag == 0) && (fragnum != 0)) {
1636 /* the last fragment frame */
1637 /* enqueue the last fragment */
1638 if (pdefrag_q != NULL) {
1639 /* spin_lock(&pdefrag_q->lock); */
1640 phead = get_list_head(pdefrag_q);
1641 list_add_tail(&pfhdr->list, phead);
1642 /* spin_unlock(&pdefrag_q->lock); */
1644 /* call recvframe_defrag to defrag */
1645 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
1646 "defrag: ismfrag = %d, fragnum = %d\n",
1648 precv_frame = recvframe_defrag(padapter, pdefrag_q);
1649 prtnframe = precv_frame;
1651 /* can't find this ta's defrag_queue,
1652 so free this recv_frame */
1653 rtw_free_recvframe23a(precv_frame);
1655 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1656 "Free because pdefrag_q == NULL: ismfrag = %d, fragnum = %d\n",
1662 if ((prtnframe != NULL) && (prtnframe->attrib.privacy)) {
1663 /* after defrag we must check tkip mic code */
1664 if (recvframe_chkmic(padapter, prtnframe) == _FAIL) {
1665 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1666 "recvframe_chkmic(padapter, prtnframe) ==_FAIL\n");
1667 rtw_free_recvframe23a(prtnframe);
1677 int amsdu_to_msdu(struct rtw_adapter *padapter, struct recv_frame *prframe);
1678 int amsdu_to_msdu(struct rtw_adapter *padapter, struct recv_frame *prframe)
1680 struct rx_pkt_attrib *pattrib;
1681 struct sk_buff *skb, *sub_skb;
1682 struct sk_buff_head skb_list;
1684 pattrib = &prframe->attrib;
1687 skb_pull(skb, prframe->attrib.hdrlen);
1688 __skb_queue_head_init(&skb_list);
1690 ieee80211_amsdu_to_8023s(skb, &skb_list, NULL, 0, 0, false);
1692 while (!skb_queue_empty(&skb_list)) {
1693 sub_skb = __skb_dequeue(&skb_list);
1695 sub_skb->protocol = eth_type_trans(sub_skb, padapter->pnetdev);
1696 sub_skb->dev = padapter->pnetdev;
1698 sub_skb->ip_summed = CHECKSUM_NONE;
1703 prframe->pkt = NULL;
1704 rtw_free_recvframe23a(prframe);
1708 int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num);
1709 int check_indicate_seq(struct recv_reorder_ctrl *preorder_ctrl, u16 seq_num)
1711 u8 wsize = preorder_ctrl->wsize_b;
1712 u16 wend = (preorder_ctrl->indicate_seq + wsize -1) & 0xFFF;
1714 /* Rx Reorder initialize condition. */
1715 if (preorder_ctrl->indicate_seq == 0xFFFF)
1716 preorder_ctrl->indicate_seq = seq_num;
1718 /* Drop out the packet which SeqNum is smaller than WinStart */
1719 if (SN_LESS(seq_num, preorder_ctrl->indicate_seq))
1723 /* Sliding window manipulation. Conditions includes: */
1724 /* 1. Incoming SeqNum is equal to WinStart =>Window shift 1 */
1725 /* 2. Incoming SeqNum is larger than the WinEnd => Window shift N */
1727 if (SN_EQUAL(seq_num, preorder_ctrl->indicate_seq)) {
1728 preorder_ctrl->indicate_seq =
1729 (preorder_ctrl->indicate_seq + 1) & 0xFFF;
1730 } else if (SN_LESS(wend, seq_num)) {
1731 /* boundary situation, when seq_num cross 0xFFF */
1732 if (seq_num >= (wsize - 1))
1733 preorder_ctrl->indicate_seq = seq_num + 1 -wsize;
1735 preorder_ctrl->indicate_seq = 0xFFF - (wsize - (seq_num + 1)) + 1;
1740 static int enqueue_reorder_recvframe23a(struct recv_reorder_ctrl *preorder_ctrl,
1741 struct recv_frame *prframe)
1743 struct rx_pkt_attrib *pattrib = &prframe->attrib;
1744 struct rtw_queue *ppending_recvframe_queue;
1745 struct list_head *phead, *plist, *ptmp;
1746 struct recv_frame *hdr;
1747 struct rx_pkt_attrib *pnextattrib;
1749 ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1750 phead = get_list_head(ppending_recvframe_queue);
1752 list_for_each_safe(plist, ptmp, phead) {
1753 hdr = container_of(plist, struct recv_frame, list);
1754 pnextattrib = &hdr->attrib;
1756 if (SN_LESS(pnextattrib->seq_num, pattrib->seq_num)) {
1758 } else if (SN_EQUAL(pnextattrib->seq_num, pattrib->seq_num)) {
1759 /* Duplicate entry is found!! Do not insert current entry. */
1767 list_del_init(&prframe->list);
1769 list_add_tail(&prframe->list, plist);
1774 int recv_indicatepkts_in_order(struct rtw_adapter *padapter,
1775 struct recv_reorder_ctrl *preorder_ctrl,
1777 int recv_indicatepkts_in_order(struct rtw_adapter *padapter,
1778 struct recv_reorder_ctrl *preorder_ctrl,
1781 struct list_head *phead, *plist;
1782 struct recv_frame *prframe;
1783 struct rx_pkt_attrib *pattrib;
1784 int bPktInBuf = false;
1785 struct recv_priv *precvpriv;
1786 struct rtw_queue *ppending_recvframe_queue;
1788 precvpriv = &padapter->recvpriv;
1789 ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1790 phead = get_list_head(ppending_recvframe_queue);
1791 plist = phead->next;
1793 /* Handling some condition for forced indicate case. */
1795 if (list_empty(phead)) {
1799 prframe = container_of(plist, struct recv_frame, list);
1800 pattrib = &prframe->attrib;
1801 preorder_ctrl->indicate_seq = pattrib->seq_num;
1804 /* Prepare indication list and indication. */
1805 /* Check if there is any packet need indicate. */
1806 while (!list_empty(phead)) {
1808 prframe = container_of(plist, struct recv_frame, list);
1809 pattrib = &prframe->attrib;
1811 if (!SN_LESS(preorder_ctrl->indicate_seq, pattrib->seq_num)) {
1812 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1813 "recv_indicatepkts_in_order: indicate =%d seq =%d amsdu =%d\n",
1814 preorder_ctrl->indicate_seq,
1815 pattrib->seq_num, pattrib->amsdu);
1817 plist = plist->next;
1818 list_del_init(&prframe->list);
1820 if (SN_EQUAL(preorder_ctrl->indicate_seq,
1821 pattrib->seq_num)) {
1822 preorder_ctrl->indicate_seq =
1823 (preorder_ctrl->indicate_seq + 1)&0xFFF;
1826 if (!pattrib->amsdu) {
1827 if ((padapter->bDriverStopped == false) &&
1828 (padapter->bSurpriseRemoved == false)) {
1829 rtw_recv_indicatepkt23a(padapter, prframe);
1832 if (amsdu_to_msdu(padapter, prframe) !=
1834 rtw_free_recvframe23a(prframe);
1837 /* Update local variables. */
1850 int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
1851 struct recv_frame *prframe);
1852 int recv_indicatepkt_reorder(struct rtw_adapter *padapter,
1853 struct recv_frame *prframe)
1855 int retval = _SUCCESS;
1856 struct rx_pkt_attrib *pattrib;
1857 struct recv_reorder_ctrl *preorder_ctrl;
1858 struct rtw_queue *ppending_recvframe_queue;
1860 pattrib = &prframe->attrib;
1861 preorder_ctrl = prframe->preorder_ctrl;
1862 ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1864 if (!pattrib->amsdu) {
1866 wlanhdr_to_ethhdr(prframe);
1868 if ((pattrib->qos!= 1) || (pattrib->eth_type == ETH_P_ARP) ||
1869 (pattrib->ack_policy != 0)) {
1870 if ((padapter->bDriverStopped == false) &&
1871 (padapter->bSurpriseRemoved == false)) {
1872 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1873 "@@@@ recv_indicatepkt_reorder -recv_func recv_indicatepkt\n");
1875 rtw_recv_indicatepkt23a(padapter, prframe);
1882 if (preorder_ctrl->enable == false) {
1883 /* indicate this recv_frame */
1884 preorder_ctrl->indicate_seq = pattrib->seq_num;
1885 rtw_recv_indicatepkt23a(padapter, prframe);
1887 preorder_ctrl->indicate_seq =
1888 (preorder_ctrl->indicate_seq + 1) % 4096;
1892 /* temp filter -> means didn't support A-MSDUs in a A-MPDU */
1893 if (preorder_ctrl->enable == false) {
1894 preorder_ctrl->indicate_seq = pattrib->seq_num;
1895 retval = amsdu_to_msdu(padapter, prframe);
1897 preorder_ctrl->indicate_seq =
1898 (preorder_ctrl->indicate_seq + 1) % 4096;
1903 spin_lock_bh(&ppending_recvframe_queue->lock);
1905 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
1906 "recv_indicatepkt_reorder: indicate =%d seq =%d\n",
1907 preorder_ctrl->indicate_seq, pattrib->seq_num);
1909 /* s2. check if winstart_b(indicate_seq) needs to been updated */
1910 if (!check_indicate_seq(preorder_ctrl, pattrib->seq_num)) {
1914 /* s3. Insert all packet into Reorder Queue to maintain its ordering. */
1915 if (!enqueue_reorder_recvframe23a(preorder_ctrl, prframe)) {
1920 /* Indication process. */
1921 /* After Packet dropping and Sliding Window shifting as above,
1922 we can now just indicate the packets */
1923 /* with the SeqNum smaller than latest WinStart and buffer
1926 /* For Rx Reorder condition: */
1927 /* 1. All packets with SeqNum smaller than WinStart => Indicate */
1928 /* 2. All packets with SeqNum larger than or equal to WinStart =>
1932 if (recv_indicatepkts_in_order(padapter, preorder_ctrl, false) == true) {
1933 mod_timer(&preorder_ctrl->reordering_ctrl_timer,
1934 jiffies + msecs_to_jiffies(REORDER_WAIT_TIME));
1935 spin_unlock_bh(&ppending_recvframe_queue->lock);
1937 spin_unlock_bh(&ppending_recvframe_queue->lock);
1938 del_timer_sync(&preorder_ctrl->reordering_ctrl_timer);
1944 spin_unlock_bh(&ppending_recvframe_queue->lock);
1948 void rtw_reordering_ctrl_timeout_handler23a(unsigned long pcontext)
1950 struct recv_reorder_ctrl *preorder_ctrl;
1951 struct rtw_adapter *padapter;
1952 struct rtw_queue *ppending_recvframe_queue;
1954 preorder_ctrl = (struct recv_reorder_ctrl *)pcontext;
1955 padapter = preorder_ctrl->padapter;
1956 ppending_recvframe_queue = &preorder_ctrl->pending_recvframe_queue;
1958 if (padapter->bDriverStopped || padapter->bSurpriseRemoved) {
1962 spin_lock_bh(&ppending_recvframe_queue->lock);
1964 if (recv_indicatepkts_in_order(padapter, preorder_ctrl, true) == true) {
1965 mod_timer(&preorder_ctrl->reordering_ctrl_timer,
1966 jiffies + msecs_to_jiffies(REORDER_WAIT_TIME));
1969 spin_unlock_bh(&ppending_recvframe_queue->lock);
1972 int process_recv_indicatepkts(struct rtw_adapter *padapter,
1973 struct recv_frame *prframe);
1974 int process_recv_indicatepkts(struct rtw_adapter *padapter,
1975 struct recv_frame *prframe)
1977 int retval = _SUCCESS;
1978 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1979 struct ht_priv *phtpriv = &pmlmepriv->htpriv;
1981 if (phtpriv->ht_option == true) { /* B/G/N Mode */
1982 /* including perform A-MPDU Rx Ordering Buffer Control */
1983 if (recv_indicatepkt_reorder(padapter, prframe) != _SUCCESS) {
1984 if ((padapter->bDriverStopped == false) &&
1985 (padapter->bSurpriseRemoved == false)) {
1990 } else { /* B/G mode */
1991 retval = wlanhdr_to_ethhdr(prframe);
1992 if (retval != _SUCCESS) {
1993 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
1994 "wlanhdr_to_ethhdr: drop pkt\n");
1998 if ((padapter->bDriverStopped == false) &&
1999 (padapter->bSurpriseRemoved == false)) {
2000 /* indicate this recv_frame */
2001 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
2002 "@@@@ process_recv_indicatepkts- recv_func recv_indicatepkt\n");
2003 rtw_recv_indicatepkt23a(padapter, prframe);
2005 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
2006 "@@@@ process_recv_indicatepkts- recv_func free_indicatepkt\n");
2008 RT_TRACE(_module_rtl871x_recv_c_, _drv_notice_,
2009 "recv_func:bDriverStopped(%d) OR bSurpriseRemoved(%d)\n",
2010 padapter->bDriverStopped,
2011 padapter->bSurpriseRemoved);
2021 static int recv_func_prehandle(struct rtw_adapter *padapter,
2022 struct recv_frame *rframe)
2026 /* check the frame crtl field and decache */
2027 ret = validate_recv_frame(padapter, rframe);
2028 if (ret != _SUCCESS) {
2029 RT_TRACE(_module_rtl871x_recv_c_, _drv_info_,
2030 "recv_func: validate_recv_frame fail! drop pkt\n");
2031 rtw_free_recvframe23a(rframe);
2039 static int recv_func_posthandle(struct rtw_adapter *padapter,
2040 struct recv_frame *prframe)
2043 struct recv_frame *orig_prframe = prframe;
2044 struct recv_priv *precvpriv = &padapter->recvpriv;
2047 prframe = decryptor(padapter, prframe);
2048 if (prframe == NULL) {
2049 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2050 "decryptor: drop pkt\n");
2052 goto _recv_data_drop;
2055 prframe = recvframe_chk_defrag23a(padapter, prframe);
2057 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2058 "recvframe_chk_defrag23a: drop pkt\n");
2059 goto _recv_data_drop;
2063 * Pull off crypto headers
2065 if (prframe->attrib.iv_len > 0) {
2066 skb_pull(prframe->pkt, prframe->attrib.iv_len);
2069 if (prframe->attrib.icv_len > 0) {
2070 skb_trim(prframe->pkt,
2071 prframe->pkt->len - prframe->attrib.icv_len);
2074 prframe = portctrl(padapter, prframe);
2076 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2077 "portctrl: drop pkt\n");
2079 goto _recv_data_drop;
2082 count_rx_stats(padapter, prframe, NULL);
2084 ret = process_recv_indicatepkts(padapter, prframe);
2085 if (ret != _SUCCESS) {
2086 RT_TRACE(_module_rtl871x_recv_c_, _drv_err_,
2087 "recv_func: process_recv_indicatepkts fail!\n");
2088 rtw_free_recvframe23a(orig_prframe);/* free this recv_frame */
2089 goto _recv_data_drop;
2094 precvpriv->rx_drop++;
2098 int rtw_recv_entry23a(struct recv_frame *rframe)
2101 struct rtw_adapter *padapter = rframe->adapter;
2102 struct rx_pkt_attrib *prxattrib = &rframe->attrib;
2103 struct recv_priv *recvpriv = &padapter->recvpriv;
2104 struct security_priv *psecuritypriv = &padapter->securitypriv;
2105 struct mlme_priv *mlmepriv = &padapter->mlmepriv;
2107 /* check if need to handle uc_swdec_pending_queue*/
2108 if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
2109 psecuritypriv->busetkipkey) {
2110 struct recv_frame *pending_frame;
2112 while ((pending_frame = rtw_alloc_recvframe23a(&padapter->recvpriv.uc_swdec_pending_queue))) {
2113 r = recv_func_posthandle(padapter, pending_frame);
2115 DBG_8723A("%s: dequeue uc_swdec_pending_queue\n", __func__);
2119 ret = recv_func_prehandle(padapter, rframe);
2121 if (ret == _SUCCESS) {
2122 /* check if need to enqueue into uc_swdec_pending_queue*/
2123 if (check_fwstate(mlmepriv, WIFI_STATION_STATE) &&
2124 !is_multicast_ether_addr(prxattrib->ra) &&
2125 prxattrib->encrypt > 0 &&
2126 (prxattrib->bdecrypted == 0) &&
2127 !is_wep_enc(psecuritypriv->dot11PrivacyAlgrthm) &&
2128 !psecuritypriv->busetkipkey) {
2129 rtw_enqueue_recvframe23a(rframe, &padapter->recvpriv.uc_swdec_pending_queue);
2130 DBG_8723A("%s: no key, enqueue uc_swdec_pending_queue\n", __func__);
2134 ret = recv_func_posthandle(padapter, rframe);
2136 recvpriv->rx_pkts++;
2143 void rtw_signal_stat_timer_hdl23a(unsigned long data)
2145 struct rtw_adapter *adapter = (struct rtw_adapter *)data;
2146 struct recv_priv *recvpriv = &adapter->recvpriv;
2149 u8 avg_signal_strength = 0;
2150 u8 avg_signal_qual = 0;
2151 u32 num_signal_strength = 0;
2152 u32 num_signal_qual = 0;
2153 u8 _alpha = 3; /* this value is based on converging_constant = 5000 */
2154 /* and sampling_interval = 1000 */
2156 if (recvpriv->signal_strength_data.update_req == 0) {
2157 /* update_req is clear, means we got rx */
2158 avg_signal_strength = recvpriv->signal_strength_data.avg_val;
2159 num_signal_strength = recvpriv->signal_strength_data.total_num;
2160 /* after avg_vals are acquired, we can re-stat */
2161 /* the signal values */
2162 recvpriv->signal_strength_data.update_req = 1;
2165 if (recvpriv->signal_qual_data.update_req == 0) {
2166 /* update_req is clear, means we got rx */
2167 avg_signal_qual = recvpriv->signal_qual_data.avg_val;
2168 num_signal_qual = recvpriv->signal_qual_data.total_num;
2169 /* after avg_vals are acquired, we can re-stat */
2170 /*the signal values */
2171 recvpriv->signal_qual_data.update_req = 1;
2174 /* update value of signal_strength, rssi, signal_qual */
2175 if (!check_fwstate(&adapter->mlmepriv, _FW_UNDER_SURVEY)) {
2176 tmp_s = avg_signal_strength + (_alpha - 1) *
2177 recvpriv->signal_strength;
2179 tmp_s = tmp_s / _alpha + 1;
2181 tmp_s = tmp_s / _alpha;
2185 tmp_q = avg_signal_qual + (_alpha - 1) * recvpriv->signal_qual;
2187 tmp_q = tmp_q / _alpha + 1;
2189 tmp_q = tmp_q / _alpha;
2193 recvpriv->signal_strength = tmp_s;
2194 recvpriv->signal_qual = tmp_q;
2196 DBG_8723A("%s signal_strength:%3u, signal_qual:%3u, "
2197 "num_signal_strength:%u, num_signal_qual:%u\n",
2198 __func__, recvpriv->signal_strength,
2199 recvpriv->signal_qual, num_signal_strength,
2203 rtw_set_signal_stat_timer(recvpriv);