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 * You should have received a copy of the GNU General Public License along with
15 * this program; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
19 ******************************************************************************/
22 #include <drv_types.h>
24 #if defined (PLATFORM_LINUX) && defined (PLATFORM_WINDOWS)
25 #error "Shall be Linux or Windows, but not both!\n"
29 static u8 P802_1H_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0xf8 };
30 static u8 RFC1042_OUI[P80211_OUI_LEN] = { 0x00, 0x00, 0x00 };
32 static void _init_txservq(struct tx_servq *ptxservq)
35 _rtw_init_listhead(&ptxservq->tx_pending);
36 _rtw_init_queue(&ptxservq->sta_pending);
42 void _rtw_init_sta_xmit_priv(struct sta_xmit_priv *psta_xmitpriv)
47 _rtw_memset((unsigned char *)psta_xmitpriv, 0, sizeof (struct sta_xmit_priv));
49 _rtw_spinlock_init(&psta_xmitpriv->lock);
51 //for(i = 0 ; i < MAX_NUMBLKS; i++)
52 // _init_txservq(&(psta_xmitpriv->blk_q[i]));
54 _init_txservq(&psta_xmitpriv->be_q);
55 _init_txservq(&psta_xmitpriv->bk_q);
56 _init_txservq(&psta_xmitpriv->vi_q);
57 _init_txservq(&psta_xmitpriv->vo_q);
58 _rtw_init_listhead(&psta_xmitpriv->legacy_dz);
59 _rtw_init_listhead(&psta_xmitpriv->apsd);
65 s32 _rtw_init_xmit_priv(struct xmit_priv *pxmitpriv, _adapter *padapter)
68 struct xmit_buf *pxmitbuf;
69 struct xmit_frame *pxframe;
74 // We don't need to memset padapter->XXX to zero, because adapter is allocated by rtw_zvmalloc().
75 //_rtw_memset((unsigned char *)pxmitpriv, 0, sizeof(struct xmit_priv));
77 _rtw_spinlock_init(&pxmitpriv->lock);
78 _rtw_spinlock_init(&pxmitpriv->lock_sctx);
79 _rtw_init_sema(&pxmitpriv->xmit_sema, 0);
80 _rtw_init_sema(&pxmitpriv->terminate_xmitthread_sema, 0);
83 Please insert all the queue initializaiton using _rtw_init_queue below
86 pxmitpriv->adapter = padapter;
88 //for(i = 0 ; i < MAX_NUMBLKS; i++)
89 // _rtw_init_queue(&pxmitpriv->blk_strms[i]);
91 _rtw_init_queue(&pxmitpriv->be_pending);
92 _rtw_init_queue(&pxmitpriv->bk_pending);
93 _rtw_init_queue(&pxmitpriv->vi_pending);
94 _rtw_init_queue(&pxmitpriv->vo_pending);
95 _rtw_init_queue(&pxmitpriv->bm_pending);
97 //_rtw_init_queue(&pxmitpriv->legacy_dz_queue);
98 //_rtw_init_queue(&pxmitpriv->apsd_queue);
100 _rtw_init_queue(&pxmitpriv->free_xmit_queue);
103 Please allocate memory with the sz = (struct xmit_frame) * NR_XMITFRAME,
104 and initialize free_xmit_frame below.
105 Please also apply free_txobj to link_up all the xmit_frames...
108 pxmitpriv->pallocated_frame_buf = rtw_zvmalloc(NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
110 if (pxmitpriv->pallocated_frame_buf == NULL){
111 pxmitpriv->pxmit_frame_buf =NULL;
112 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_frame fail!\n"));
116 pxmitpriv->pxmit_frame_buf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_frame_buf), 4);
117 //pxmitpriv->pxmit_frame_buf = pxmitpriv->pallocated_frame_buf + 4 -
118 // ((SIZE_PTR) (pxmitpriv->pallocated_frame_buf) &3);
120 pxframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
122 for (i = 0; i < NR_XMITFRAME; i++)
124 _rtw_init_listhead(&(pxframe->list));
126 pxframe->padapter = padapter;
127 pxframe->frame_tag = NULL_FRAMETAG;
131 pxframe->buf_addr = NULL;
132 pxframe->pxmitbuf = NULL;
134 rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xmit_queue.queue));
139 pxmitpriv->free_xmitframe_cnt = NR_XMITFRAME;
141 pxmitpriv->frag_len = MAX_FRAG_THRESHOLD;
145 _rtw_init_queue(&pxmitpriv->free_xmitbuf_queue);
146 _rtw_init_queue(&pxmitpriv->pending_xmitbuf_queue);
148 pxmitpriv->pallocated_xmitbuf = rtw_zvmalloc(NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
150 if (pxmitpriv->pallocated_xmitbuf == NULL){
151 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_buf fail!\n"));
156 pxmitpriv->pxmitbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmitbuf), 4);
157 //pxmitpriv->pxmitbuf = pxmitpriv->pallocated_xmitbuf + 4 -
158 // ((SIZE_PTR) (pxmitpriv->pallocated_xmitbuf) &3);
160 pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmitbuf;
162 for (i = 0; i < NR_XMITBUFF; i++)
164 _rtw_init_listhead(&pxmitbuf->list);
166 pxmitbuf->priv_data = NULL;
167 pxmitbuf->padapter = padapter;
168 pxmitbuf->buf_tag = XMITBUF_DATA;
170 /* Tx buf allocation may fail sometimes, so sleep and retry. */
171 if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE)) == _FAIL) {
173 res = rtw_os_xmit_resource_alloc(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
179 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
180 pxmitbuf->phead = pxmitbuf->pbuf;
181 pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMITBUF_SZ;
183 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
186 pxmitbuf->flags = XMIT_VO_QUEUE;
188 rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmitbuf_queue.queue));
197 pxmitpriv->free_xmitbuf_cnt = NR_XMITBUFF;
199 /* init xframe_ext queue, the same count as extbuf */
200 _rtw_init_queue(&pxmitpriv->free_xframe_ext_queue);
202 pxmitpriv->xframe_ext_alloc_addr = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
204 if (pxmitpriv->xframe_ext_alloc_addr == NULL){
205 pxmitpriv->xframe_ext = NULL;
206 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xframe_ext fail!\n"));
210 pxmitpriv->xframe_ext = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->xframe_ext_alloc_addr), 4);
211 pxframe = (struct xmit_frame*)pxmitpriv->xframe_ext;
213 for (i = 0; i < NR_XMIT_EXTBUFF; i++) {
214 _rtw_init_listhead(&(pxframe->list));
216 pxframe->padapter = padapter;
217 pxframe->frame_tag = NULL_FRAMETAG;
221 pxframe->buf_addr = NULL;
222 pxframe->pxmitbuf = NULL;
224 pxframe->ext_tag = 1;
226 rtw_list_insert_tail(&(pxframe->list), &(pxmitpriv->free_xframe_ext_queue.queue));
230 pxmitpriv->free_xframe_ext_cnt = NR_XMIT_EXTBUFF;
232 // Init xmit extension buff
233 _rtw_init_queue(&pxmitpriv->free_xmit_extbuf_queue);
235 pxmitpriv->pallocated_xmit_extbuf = rtw_zvmalloc(NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
237 if (pxmitpriv->pallocated_xmit_extbuf == NULL){
238 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("alloc xmit_extbuf fail!\n"));
243 pxmitpriv->pxmit_extbuf = (u8 *)N_BYTE_ALIGMENT((SIZE_PTR)(pxmitpriv->pallocated_xmit_extbuf), 4);
245 pxmitbuf = (struct xmit_buf*)pxmitpriv->pxmit_extbuf;
247 for (i = 0; i < NR_XMIT_EXTBUFF; i++)
249 _rtw_init_listhead(&pxmitbuf->list);
251 pxmitbuf->priv_data = NULL;
252 pxmitbuf->padapter = padapter;
253 pxmitbuf->buf_tag = XMITBUF_MGNT;
255 if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf,MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
260 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
261 pxmitbuf->phead = pxmitbuf->pbuf;
262 pxmitbuf->pend = pxmitbuf->pbuf + MAX_XMIT_EXTBUF_SZ;
264 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
267 rtw_list_insert_tail(&pxmitbuf->list, &(pxmitpriv->free_xmit_extbuf_queue.queue));
268 #ifdef DBG_XMIT_BUF_EXT
275 pxmitpriv->free_xmit_extbuf_cnt = NR_XMIT_EXTBUFF;
277 for (i = 0; i<CMDBUF_MAX; i++) {
278 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
280 _rtw_init_listhead(&pxmitbuf->list);
282 pxmitbuf->priv_data = NULL;
283 pxmitbuf->padapter = padapter;
284 pxmitbuf->buf_tag = XMITBUF_CMD;
286 if((res=rtw_os_xmit_resource_alloc(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ, _TRUE)) == _FAIL) {
291 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
292 pxmitbuf->phead = pxmitbuf->pbuf;
293 pxmitbuf->pend = pxmitbuf->pbuf + MAX_CMDBUF_SZ;
295 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
297 pxmitbuf->alloc_sz = MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ;
301 rtw_alloc_hwxmits(padapter);
302 rtw_init_hwxmits(pxmitpriv->hwxmits, pxmitpriv->hwxmit_entry);
304 for (i = 0; i < 4; i ++)
306 pxmitpriv->wmm_para_seq[i] = i;
309 #ifdef CONFIG_USB_HCI
310 pxmitpriv->txirp_cnt=1;
312 _rtw_init_sema(&(pxmitpriv->tx_retevt), 0);
315 pxmitpriv->beq_cnt = 0;
316 pxmitpriv->bkq_cnt = 0;
317 pxmitpriv->viq_cnt = 0;
318 pxmitpriv->voq_cnt = 0;
322 #ifdef CONFIG_XMIT_ACK
323 pxmitpriv->ack_tx = _FALSE;
324 _rtw_mutex_init(&pxmitpriv->ack_tx_mutex);
325 rtw_sctx_init(&pxmitpriv->ack_tx_ops, 0);
328 rtw_hal_init_xmit_priv(padapter);
337 void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv);
338 void rtw_mfree_xmit_priv_lock (struct xmit_priv *pxmitpriv)
340 _rtw_spinlock_free(&pxmitpriv->lock);
341 _rtw_free_sema(&pxmitpriv->xmit_sema);
342 _rtw_free_sema(&pxmitpriv->terminate_xmitthread_sema);
344 _rtw_spinlock_free(&pxmitpriv->be_pending.lock);
345 _rtw_spinlock_free(&pxmitpriv->bk_pending.lock);
346 _rtw_spinlock_free(&pxmitpriv->vi_pending.lock);
347 _rtw_spinlock_free(&pxmitpriv->vo_pending.lock);
348 _rtw_spinlock_free(&pxmitpriv->bm_pending.lock);
350 //_rtw_spinlock_free(&pxmitpriv->legacy_dz_queue.lock);
351 //_rtw_spinlock_free(&pxmitpriv->apsd_queue.lock);
353 _rtw_spinlock_free(&pxmitpriv->free_xmit_queue.lock);
354 _rtw_spinlock_free(&pxmitpriv->free_xmitbuf_queue.lock);
355 _rtw_spinlock_free(&pxmitpriv->pending_xmitbuf_queue.lock);
359 void _rtw_free_xmit_priv (struct xmit_priv *pxmitpriv)
362 _adapter *padapter = pxmitpriv->adapter;
363 struct xmit_frame *pxmitframe = (struct xmit_frame*) pxmitpriv->pxmit_frame_buf;
364 struct xmit_buf *pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmitbuf;
368 rtw_hal_free_xmit_priv(padapter);
370 rtw_mfree_xmit_priv_lock(pxmitpriv);
372 if(pxmitpriv->pxmit_frame_buf==NULL)
375 for(i=0; i<NR_XMITFRAME; i++)
377 rtw_os_xmit_complete(padapter, pxmitframe);
382 for(i=0; i<NR_XMITBUFF; i++)
384 rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMITBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
389 if(pxmitpriv->pallocated_frame_buf) {
390 rtw_vmfree(pxmitpriv->pallocated_frame_buf, NR_XMITFRAME * sizeof(struct xmit_frame) + 4);
394 if(pxmitpriv->pallocated_xmitbuf) {
395 rtw_vmfree(pxmitpriv->pallocated_xmitbuf, NR_XMITBUFF * sizeof(struct xmit_buf) + 4);
398 /* free xframe_ext queue, the same count as extbuf */
399 if ((pxmitframe = (struct xmit_frame*)pxmitpriv->xframe_ext)) {
400 for (i=0; i<NR_XMIT_EXTBUFF; i++) {
401 rtw_os_xmit_complete(padapter, pxmitframe);
405 if (pxmitpriv->xframe_ext_alloc_addr)
406 rtw_vmfree(pxmitpriv->xframe_ext_alloc_addr, NR_XMIT_EXTBUFF * sizeof(struct xmit_frame) + 4);
407 _rtw_spinlock_free(&pxmitpriv->free_xframe_ext_queue.lock);
409 // free xmit extension buff
410 _rtw_spinlock_free(&pxmitpriv->free_xmit_extbuf_queue.lock);
412 pxmitbuf = (struct xmit_buf *)pxmitpriv->pxmit_extbuf;
413 for(i=0; i<NR_XMIT_EXTBUFF; i++)
415 rtw_os_xmit_resource_free(padapter, pxmitbuf,(MAX_XMIT_EXTBUF_SZ + XMITBUF_ALIGN_SZ), _TRUE);
420 if(pxmitpriv->pallocated_xmit_extbuf) {
421 rtw_vmfree(pxmitpriv->pallocated_xmit_extbuf, NR_XMIT_EXTBUFF * sizeof(struct xmit_buf) + 4);
424 for (i=0; i<CMDBUF_MAX; i++) {
425 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[i];
427 rtw_os_xmit_resource_free(padapter, pxmitbuf, MAX_CMDBUF_SZ+XMITBUF_ALIGN_SZ , _TRUE);
430 rtw_free_hwxmits(padapter);
432 #ifdef CONFIG_XMIT_ACK
433 _rtw_mutex_free(&pxmitpriv->ack_tx_mutex);
442 u8 query_ra_short_GI(struct sta_info *psta)
444 u8 sgi = _FALSE, sgi_20m = _FALSE, sgi_40m = _FALSE, sgi_80m = _FALSE;
446 #ifdef CONFIG_80211N_HT
448 sgi_20m = psta->htpriv.sgi_20m;
449 sgi_40m = psta->htpriv.sgi_40m;
453 switch(psta->bw_mode){
454 case CHANNEL_WIDTH_80:
457 case CHANNEL_WIDTH_40:
460 case CHANNEL_WIDTH_20:
469 static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe)
472 struct pkt_attrib *pattrib = &pxmitframe->attrib;
473 //struct sta_info *psta = pattrib->psta;
474 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
475 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
480 psta = pattrib->psta;
484 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
485 psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
490 DBG_871X("%s, psta==NUL\n", __func__);
494 if(!(psta->state &_FW_LINKED))
496 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
501 if (pattrib->nr_frags != 1)
503 sz = padapter->xmitpriv.frag_len;
507 sz = pattrib->last_txcmdsz;
510 // (1) RTS_Threshold is compared to the MPDU, not MSDU.
511 // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame.
512 // Other fragments are protected by previous fragment.
513 // So we only need to check the length of first fragment.
514 if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec)
516 if(sz > padapter->registrypriv.rts_thresh)
518 pattrib->vcs_mode = RTS_CTS;
523 pattrib->vcs_mode = RTS_CTS;
524 else if(pattrib->cts2self)
525 pattrib->vcs_mode = CTS_TO_SELF;
527 pattrib->vcs_mode = NONE_VCS;
536 if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
538 pattrib->vcs_mode = CTS_TO_SELF;
539 pattrib->rts_rate = MGN_24M;
542 else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))
544 pattrib->vcs_mode = RTS_CTS;
545 pattrib->rts_rate = MGN_24M;
551 if((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en==_TRUE) &&
552 (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
554 pattrib->vcs_mode = CTS_TO_SELF;
559 //check ERP protection
560 if(pattrib->rtsen || pattrib->cts2self)
563 pattrib->vcs_mode = RTS_CTS;
564 else if(pattrib->cts2self)
565 pattrib->vcs_mode = CTS_TO_SELF;
573 u8 HTOpMode = pmlmeinfo->HT_protection;
574 if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) ||
575 (!pmlmeext->cur_bwmode && HTOpMode == 3) )
577 pattrib->vcs_mode = RTS_CTS;
583 if(sz > padapter->registrypriv.rts_thresh)
585 pattrib->vcs_mode = RTS_CTS;
589 //to do list: check MIMO power save condition.
591 //check AMPDU aggregation for TXOP
592 if((pattrib->ampdu_en==_TRUE) && (!IS_HARDWARE_TYPE_8812(padapter)))
594 pattrib->vcs_mode = RTS_CTS;
598 pattrib->vcs_mode = NONE_VCS;
603 //for debug : force driver control vrtl_carrier_sense.
604 if(padapter->driver_vcs_en==1)
606 //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
607 //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
608 pattrib->vcs_mode = padapter->driver_vcs_type;
613 static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
615 struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
617 pattrib->rtsen = psta->rtsen;
618 pattrib->cts2self = psta->cts2self;
622 pattrib->triggered=0;
623 pattrib->ampdu_spacing = 0;
625 //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
626 pattrib->qos_en = psta->qos_option;
628 pattrib->raid = psta->raid;
630 if (mlmeext->cur_bwmode < psta->bw_mode)
631 pattrib->bwmode = mlmeext->cur_bwmode;
633 pattrib->bwmode = psta->bw_mode;
635 pattrib->sgi = query_ra_short_GI(psta);
637 pattrib->ldpc = psta->ldpc;
638 pattrib->stbc = psta->stbc;
640 #ifdef CONFIG_80211N_HT
641 pattrib->ht_en = psta->htpriv.ht_option;
642 pattrib->ch_offset = psta->htpriv.ch_offset;
643 pattrib->ampdu_en = _FALSE;
645 if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx
646 pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
648 pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
649 #endif //CONFIG_80211N_HT
650 //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
652 // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
653 // pattrib->ampdu_en = _TRUE;
657 if (pattrib->direct_link==_TRUE) {
658 psta = pattrib->ptdls_sta;
660 pattrib->raid = psta->raid;
661 #ifdef CONFIG_80211N_HT
662 pattrib->bwmode = psta->bw_mode;
663 pattrib->ht_en = psta->htpriv.ht_option;
664 pattrib->ch_offset = psta->htpriv.ch_offset;
665 pattrib->sgi= query_ra_short_GI(psta);
666 #endif /* CONFIG_80211N_HT */
668 #endif /* CONFIG_TDLS */
670 pattrib->retry_ctrl = _FALSE;
672 #ifdef CONFIG_AUTO_AP_MODE
673 if(psta->isrc && psta->pid>0)
674 pattrib->pctrl = _TRUE;
679 static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
682 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
683 struct security_priv *psecuritypriv = &padapter->securitypriv;
684 sint bmcast = IS_MCAST(pattrib->ra);
686 _rtw_memset(pattrib->dot118021x_UncstKey.skey, 0, 16);
687 _rtw_memset(pattrib->dot11tkiptxmickey.skey, 0, 16);
688 pattrib->mac_id = psta->mac_id;
690 if (psta->ieee8021x_blocked == _TRUE)
692 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n"));
694 pattrib->encrypt = 0;
696 if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE))
698 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type));
699 #ifdef DBG_TX_DROP_FRAME
700 DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%04x) != 0x888e\n", __FUNCTION__,pattrib->ether_type);
708 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
710 #ifdef CONFIG_WAPI_SUPPORT
711 if(pattrib->ether_type == 0x88B4)
712 pattrib->encrypt=_NO_PRIVACY_;
715 switch(psecuritypriv->dot11AuthAlgrthm)
717 case dot11AuthAlgrthm_Open:
718 case dot11AuthAlgrthm_Shared:
719 case dot11AuthAlgrthm_Auto:
720 pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
722 case dot11AuthAlgrthm_8021X:
724 pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;
726 pattrib->key_idx = 0;
729 pattrib->key_idx = 0;
733 //For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake.
734 if (((pattrib->encrypt ==_WEP40_)||(pattrib->encrypt ==_WEP104_)) && (pattrib->ether_type == 0x888e))
735 pattrib->encrypt=_NO_PRIVACY_;
740 if (pattrib->direct_link == _TRUE) {
741 if (pattrib->encrypt > 0)
742 pattrib->encrypt = _AES_;
746 switch (pattrib->encrypt)
751 pattrib->icv_len = 4;
752 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
757 pattrib->icv_len = 4;
759 if(psecuritypriv->busetkipkey==_FAIL)
761 #ifdef DBG_TX_DROP_FRAME
762 DBG_871X("DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, psecuritypriv->busetkipkey);
769 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
771 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
774 _rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16);
781 pattrib->icv_len = 8;
784 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
786 AES_IV(pattrib->iv, psta->dot11txpn, 0);
790 #ifdef CONFIG_WAPI_SUPPORT
792 pattrib->iv_len = 18;
793 pattrib->icv_len = 16;
794 rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);
799 pattrib->icv_len = 0;
803 if(pattrib->encrypt>0)
804 _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
806 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
807 ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n",
808 pattrib->encrypt, padapter->securitypriv.sw_encrypt));
810 if (pattrib->encrypt &&
811 ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))
813 pattrib->bswenc = _TRUE;
814 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,
815 ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n",
816 pattrib->encrypt, padapter->securitypriv.sw_encrypt));
818 pattrib->bswenc = _FALSE;
819 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
822 #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
823 if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
825 pattrib->bswenc = _TRUE;//force using sw enc.
828 #ifdef DYNAMIC_CAMID_ALLOC
829 if (pattrib->encrypt && bmcast && _rtw_camctl_chk_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))
830 pattrib->bswenc = _TRUE;
833 #ifdef CONFIG_WAPI_SUPPORT
834 if(pattrib->encrypt == _SMS4_)
835 pattrib->bswenc = _FALSE;
844 u8 qos_acm(u8 acm_mask, u8 priority)
846 u8 change_priority = priority;
852 if(acm_mask & BIT(1))
860 if(acm_mask & BIT(2))
865 if(acm_mask & BIT(3))
869 DBG_871X("qos_acm(): invalid pattrib->priority: %d!!!\n", priority);
873 return change_priority;
876 static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
878 struct ethhdr etherhdr;
880 s32 UserPriority = 0;
883 _rtw_open_pktfile(ppktfile->pkt, ppktfile);
884 _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN);
886 // get UserPriority from IP hdr
887 if (pattrib->ether_type == 0x0800) {
888 _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));
889 // UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3;
890 UserPriority = ip_hdr.tos >> 5;
893 else if (pattrib->ether_type == 0x888e) {
894 // "When priority processing of data frames is supported,
895 // a STA's SME should send EAPOL-Key frames at the highest priority."
899 pattrib->priority = UserPriority;
900 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
901 pattrib->subtype = WIFI_QOS_DATA_TYPE;
905 u8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib)
907 pattrib->ptdls_sta = NULL;
909 pattrib->direct_link = _FALSE;
910 if (padapter->tdlsinfo.link_established == _TRUE) {
911 pattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);
913 if((pattrib->ptdls_sta!=NULL)&&
914 (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&
915 (pattrib->ether_type!=0x0806)){
916 pattrib->direct_link = _TRUE;
917 //DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
920 if (pattrib->ptdls_sta != NULL &&
921 pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
922 pattrib->direct_link = _TRUE;
924 DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
928 /* ARP frame may be helped by AP*/
929 if (pattrib->ether_type != 0x0806) {
930 pattrib->direct_link = _FALSE;
935 return pattrib->direct_link;
938 s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
941 struct sta_info *psta = NULL;
942 struct sta_priv *pstapriv = &padapter->stapriv;
943 struct security_priv *psecuritypriv = &padapter->securitypriv;
944 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
945 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
949 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
955 pattrib->mac_id = psta->mac_id;
956 pattrib->psta = psta;
957 pattrib->ack_policy = 0;
959 pattrib->pkt_hdrlen = ETH_HLEN;
961 // [TDLS] TODO: setup req/rsp should be AC_BK
962 if (pqospriv->qos_option && psta->qos_option) {
963 pattrib->priority = 4; //tdls management frame should be AC_VI
964 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
965 pattrib->subtype = WIFI_QOS_DATA_TYPE;
967 pattrib->priority = 0;
968 pattrib->hdrlen = WLAN_HDR_A3_LEN;
969 pattrib->subtype = WIFI_DATA_TYPE;
973 if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
979 update_attrib_phy_info(padapter, pattrib, psta);
989 //get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3
990 inline u8 rtw_get_hwseq_no(_adapter *padapter)
993 #ifdef CONFIG_CONCURRENT_MODE
994 if(padapter->adapter_type == SECONDARY_ADAPTER)
998 #endif //CONFIG_CONCURRENT_MODE
1001 static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
1004 struct pkt_file pktfile;
1005 struct sta_info *psta = NULL;
1006 struct ethhdr etherhdr;
1009 struct sta_priv *pstapriv = &padapter->stapriv;
1010 struct security_priv *psecuritypriv = &padapter->securitypriv;
1011 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1012 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
1013 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1014 sint res = _SUCCESS;
1018 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
1020 _rtw_open_pktfile(pkt, &pktfile);
1021 i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN);
1023 pattrib->ether_type = ntohs(etherhdr.h_proto);
1026 _rtw_memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN);
1027 _rtw_memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN);
1030 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
1031 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
1032 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1033 _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
1034 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
1036 else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
1038 if (rtw_check_tdls_established(padapter, pattrib) == _TRUE)
1039 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); /* For TDLS direct link Tx, set ra to be same to dst */
1042 _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
1043 _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
1044 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
1046 else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
1047 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1048 _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
1049 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
1052 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
1054 bmcast = IS_MCAST(pattrib->ra);
1056 psta = rtw_get_bcmc_stainfo(padapter);
1057 if (psta == NULL) { /* if we cannot get psta => drop the pkt */
1058 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
1059 RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
1060 #ifdef DBG_TX_DROP_FRAME
1061 DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra));
1067 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
1068 if (psta == NULL) { /* if we cannot get psta => drop the pkt */
1069 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
1070 RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
1071 #ifdef DBG_TX_DROP_FRAME
1072 DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra));
1076 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && !(psta->state & _FW_LINKED)) {
1077 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
1083 if (!(psta->state & _FW_LINKED)) {
1084 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
1085 DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state);
1090 pattrib->pktlen = pktfile.pkt_len;
1092 /* TODO: 802.1Q VLAN header */
1095 if (ETH_P_IP == pattrib->ether_type) {
1098 _rtw_pktfile_read(&pktfile, ip, 20);
1100 if (GET_IPV4_IHL(ip) * 4 > 20)
1101 _rtw_pktfile_read(&pktfile, NULL, GET_IPV4_IHL(ip) - 20);
1103 pattrib->icmp_pkt = 0;
1104 pattrib->dhcp_pkt = 0;
1106 if (GET_IPV4_PROTOCOL(ip) == 0x01) { /* ICMP */
1107 pattrib->icmp_pkt = 1;
1108 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
1110 } else if (GET_IPV4_PROTOCOL(ip) == 0x11) { /* UDP */
1113 _rtw_pktfile_read(&pktfile, udp, 8);
1115 if ((GET_UDP_SRC(udp) == 68 && GET_UDP_DST(udp) == 67)
1116 || (GET_UDP_SRC(udp) == 67 && GET_UDP_DST(udp) == 68)
1118 /* 67 : UDP BOOTP server, 68 : UDP BOOTP client */
1119 if (pattrib->pktlen > 282) { /* MINIMUM_DHCP_PACKET_SIZE */
1120 pattrib->dhcp_pkt = 1;
1121 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
1123 DBG_871X("send DHCP packet\n");
1127 } else if (GET_IPV4_PROTOCOL(ip) == 0x06 /* TCP */
1128 && rtw_st_ctl_chk_reg_s_proto(&psta->st_ctl, 0x06) == _TRUE
1132 _rtw_pktfile_read(&pktfile, tcp, 20);
1134 if (rtw_st_ctl_chk_reg_rule(&psta->st_ctl, padapter, IPV4_SRC(ip), TCP_SRC(tcp), IPV4_DST(ip), TCP_DST(tcp)) == _TRUE) {
1135 if (GET_TCP_SYN(tcp) && GET_TCP_ACK(tcp)) {
1136 session_tracker_add_cmd(padapter, psta
1137 , IPV4_SRC(ip), TCP_SRC(tcp)
1138 , IPV4_SRC(ip), TCP_DST(tcp));
1139 if (DBG_SESSION_TRACKER)
1140 DBG_871X(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" SYN-ACK\n"
1141 , FUNC_ADPT_ARG(padapter)
1142 , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp))
1143 , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp)));
1145 if (GET_TCP_FIN(tcp)) {
1146 session_tracker_del_cmd(padapter, psta
1147 , IPV4_SRC(ip), TCP_SRC(tcp)
1148 , IPV4_SRC(ip), TCP_DST(tcp));
1149 if (DBG_SESSION_TRACKER)
1150 DBG_871X(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" FIN\n"
1151 , FUNC_ADPT_ARG(padapter)
1152 , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp))
1153 , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp)));
1158 } else if (0x888e == pattrib->ether_type) {
1159 DBG_871X_LEVEL(_drv_always_, "send eapol packet\n");
1162 if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1))
1163 rtw_set_scan_deny(padapter, 3000);
1166 // If EAPOL , ARP , OR DHCP packet, driver must be in active mode.
1167 #ifdef CONFIG_WAPI_SUPPORT
1168 if ( (pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1169 #else //!CONFIG_WAPI_SUPPORT
1171 if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1172 #else // only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets.
1173 //if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1174 if (pattrib->icmp_pkt==1)
1176 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);
1178 else if(pattrib->dhcp_pkt==1)
1182 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
1183 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
1189 if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
1191 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
1196 update_attrib_phy_info(padapter, pattrib, psta);
1198 //DBG_8192C("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id );
1200 pattrib->psta = psta;
1205 pattrib->ack_policy = 0;
1206 // get ether_hdr_len
1207 pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag
1209 pattrib->hdrlen = WLAN_HDR_A3_LEN;
1210 pattrib->subtype = WIFI_DATA_TYPE;
1211 pattrib->priority = 0;
1213 if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
1216 set_qos(&pktfile, pattrib);
1221 if (pattrib->direct_link == _TRUE) {
1222 if (pattrib->qos_en)
1223 set_qos(&pktfile, pattrib);
1227 if (pqospriv->qos_option) {
1228 set_qos(&pktfile, pattrib);
1230 if (pmlmepriv->acm_mask != 0)
1231 pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority);
1236 //pattrib->priority = 5; //force to used VI queue, for testing
1237 pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;
1238 rtw_set_tx_chksum_offload(pkt, pattrib);
1247 static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){
1248 sint curfragnum,length;
1249 u8 *pframe, *payload,mic[8];
1250 struct mic_data micdata;
1251 //struct sta_info *stainfo;
1252 struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv);
1253 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1254 struct security_priv *psecuritypriv=&padapter->securitypriv;
1255 struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
1256 u8 priority[4]={0x0,0x0,0x0,0x0};
1257 u8 hw_hdr_offset = 0;
1258 sint bmcst = IS_MCAST(pattrib->ra);
1263 stainfo = pattrib->psta;
1267 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
1268 stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
1273 DBG_871X("%s, psta==NUL\n", __func__);
1277 if(!(stainfo->state &_FW_LINKED))
1279 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
1286 #ifdef CONFIG_USB_TX_AGGREGATION
1287 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);;
1289 #ifdef CONFIG_TX_EARLY_MODE
1290 hw_hdr_offset = TXDESC_OFFSET+ EARLY_MODE_INFO_SIZE;
1292 hw_hdr_offset = TXDESC_OFFSET;
1296 if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_)
1299 //if(stainfo!= NULL)
1301 u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
1303 pframe = pxmitframe->buf_addr + hw_hdr_offset;
1307 if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){
1308 //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
1309 //rtw_msleep_os(10);
1312 //start to calculate the mic code
1313 rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);
1317 if(_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){
1318 //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
1319 //rtw_msleep_os(10);
1322 //start to calculate the mic code
1323 rtw_secmicsetkey(&micdata, &pattrib->dot11tkiptxmickey.skey[0]);
1326 if(pframe[1]&1){ //ToDS==1
1327 rtw_secmicappend(&micdata, &pframe[16], 6); //DA
1328 if(pframe[1]&2) //From Ds==1
1329 rtw_secmicappend(&micdata, &pframe[24], 6);
1331 rtw_secmicappend(&micdata, &pframe[10], 6);
1334 rtw_secmicappend(&micdata, &pframe[4], 6); //DA
1335 if(pframe[1]&2) //From Ds==1
1336 rtw_secmicappend(&micdata, &pframe[16], 6);
1338 rtw_secmicappend(&micdata, &pframe[10], 6);
1342 //if(pqospriv->qos_option==1)
1344 priority[0]=(u8)pxmitframe->attrib.priority;
1347 rtw_secmicappend(&micdata, &priority[0], 4);
1351 for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){
1352 payload=(u8 *)RND4((SIZE_PTR)(payload));
1353 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("===curfragnum=%d, pframe= 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x, 0x%.2x,!!!\n",
1354 curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7)));
1356 payload=payload+pattrib->hdrlen+pattrib->iv_len;
1357 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len));
1358 if((curfragnum+1)==pattrib->nr_frags){
1359 length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
1360 rtw_secmicappend(&micdata, payload,length);
1361 payload=payload+length;
1364 length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
1365 rtw_secmicappend(&micdata, payload, length);
1366 payload=payload+length+pattrib->icv_len;
1367 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len));
1370 rtw_secgetmic(&micdata,&(mic[0]));
1371 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n"));
1372 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz));
1373 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: mic[0]=0x%.2x ,mic[1]=0x%.2x ,mic[2]=0x%.2x ,mic[3]=0x%.2x \n\
1374 mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n",
1375 mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7]));
1376 //add mic code and add the mic code length in last_txcmdsz
1378 _rtw_memcpy(payload, &(mic[0]),8);
1379 pattrib->last_txcmdsz+=8;
1381 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n"));
1382 payload=payload-pattrib->last_txcmdsz+8;
1383 for(curfragnum=0;curfragnum<pattrib->last_txcmdsz;curfragnum=curfragnum+8)
1384 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ",
1385 *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3),
1386 *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7)));
1390 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n"));
1400 static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){
1402 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1403 //struct security_priv *psecuritypriv=&padapter->securitypriv;
1407 //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc))
1410 //DBG_871X("start xmitframe_swencrypt\n");
1411 RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n"));
1412 switch(pattrib->encrypt){
1415 rtw_wep_encrypt(padapter, (u8 *)pxmitframe);
1418 rtw_tkip_encrypt(padapter, (u8 *)pxmitframe);
1421 rtw_aes_encrypt(padapter, (u8 * )pxmitframe);
1423 #ifdef CONFIG_WAPI_SUPPORT
1425 rtw_sms4_encrypt(padapter, (u8 * )pxmitframe);
1432 RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n"));
1440 s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)
1444 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
1445 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1446 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1447 u8 qos_option = _FALSE;
1448 sint res = _SUCCESS;
1449 u16 *fctrl = &pwlanhdr->frame_ctl;
1451 //struct sta_info *psta;
1453 //sint bmcst = IS_MCAST(pattrib->ra);
1458 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1459 if(pattrib->psta != psta)
1461 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1467 DBG_871X("%s, psta==NUL\n", __func__);
1471 if(!(psta->state &_FW_LINKED))
1473 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1478 _rtw_memset(hdr, 0, WLANHDR_OFFSET);
1480 SetFrameSubType(fctrl, pattrib->subtype);
1482 if (pattrib->subtype & WIFI_DATA_TYPE)
1484 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) {
1486 if(pattrib->direct_link == _TRUE){
1487 //TDLS data transfer, ToDS=0, FrDs=0
1488 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1489 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1490 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1492 if (pattrib->qos_en)
1496 #endif //CONFIG_TDLS
1498 //to_ds = 1, fr_ds = 0;
1499 // 1.Data transfer to AP
1500 // 2.Arp pkt will relayed by AP
1502 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1503 _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
1504 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1506 if (pqospriv->qos_option)
1510 else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) {
1511 //to_ds = 0, fr_ds = 1;
1513 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1514 _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
1515 _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
1520 else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
1521 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
1522 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1523 _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
1524 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1530 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv)));
1538 if (pattrib->encrypt)
1543 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
1545 if (pattrib->priority)
1546 SetPriority(qc, pattrib->priority);
1548 SetEOSP(qc, pattrib->eosp);
1550 SetAckpolicy(qc, pattrib->ack_policy);
1553 //TODO: fill HT Control Field
1555 //Update Seq Num will be handled by f/w
1557 struct sta_info *psta;
1558 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1559 if(pattrib->psta != psta)
1561 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1567 DBG_871X("%s, psta==NUL\n", __func__);
1571 if(!(psta->state &_FW_LINKED))
1573 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1580 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1581 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1582 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
1584 SetSeqNum(hdr, pattrib->seqnum);
1586 #ifdef CONFIG_80211N_HT
1587 //check if enable ampdu
1588 if(pattrib->ht_en && psta->htpriv.ampdu_enable)
1590 if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
1591 pattrib->ampdu_en = _TRUE;
1594 //re-check if enable ampdu by BA_starting_seqctrl
1595 if(pattrib->ampdu_en == _TRUE)
1599 tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];
1601 //check BA_starting_seqctrl
1602 if(SN_LESS(pattrib->seqnum, tx_seq))
1604 //DBG_871X("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq);
1605 pattrib->ampdu_en = _FALSE;//AGG BK
1607 else if(SN_EQUAL(pattrib->seqnum, tx_seq))
1609 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;
1611 pattrib->ampdu_en = _TRUE;//AGG EN
1615 //DBG_871X("tx ampdu over run\n");
1616 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;
1617 pattrib->ampdu_en = _TRUE;//AGG EN
1621 #endif //CONFIG_80211N_HT
1638 s32 rtw_txframes_pending(_adapter *padapter)
1640 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1642 return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) ||
1643 (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) ||
1644 (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) ||
1645 (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE));
1648 s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)
1650 struct sta_info *psta;
1651 struct tx_servq *ptxservq;
1652 int priority = pattrib->priority;
1656 psta = pattrib->psta;
1660 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
1661 psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
1664 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1665 if(pattrib->psta != psta)
1667 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1673 DBG_871X("%s, psta==NUL\n", __func__);
1677 if(!(psta->state &_FW_LINKED))
1679 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1687 ptxservq = &(psta->sta_xmitpriv.bk_q);
1691 ptxservq = &(psta->sta_xmitpriv.vi_q);
1695 ptxservq = &(psta->sta_xmitpriv.vo_q);
1700 ptxservq = &(psta->sta_xmitpriv.be_q);
1705 return ptxservq->qcnt;
1710 int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
1714 switch(ptxmgmt->action_code){
1715 case TDLS_SETUP_REQUEST:
1716 rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1718 case TDLS_SETUP_RESPONSE:
1719 rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1721 case TDLS_SETUP_CONFIRM:
1722 rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt);
1725 rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt);
1727 case TDLS_DISCOVERY_REQUEST:
1728 rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1730 case TDLS_PEER_TRAFFIC_INDICATION:
1731 rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe, ptxmgmt);
1733 #ifdef CONFIG_TDLS_CH_SW
1734 case TDLS_CHANNEL_SWITCH_REQUEST:
1735 rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1737 case TDLS_CHANNEL_SWITCH_RESPONSE:
1738 rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1741 case TDLS_PEER_TRAFFIC_RESPONSE:
1742 rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1745 case TUNNELED_PROBE_REQ:
1746 rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);
1748 case TUNNELED_PROBE_RSP:
1749 rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe);
1760 s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
1763 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
1764 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1765 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1766 struct sta_priv *pstapriv = &padapter->stapriv;
1767 struct sta_info *psta=NULL, *ptdls_sta=NULL;
1768 u8 tdls_seq=0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1770 sint res = _SUCCESS;
1771 u16 *fctrl = &pwlanhdr->frame_ctl;
1775 _rtw_memset(hdr, 0, WLANHDR_OFFSET);
1777 SetFrameSubType(fctrl, pattrib->subtype);
1779 switch(ptxmgmt->action_code){
1780 case TDLS_SETUP_REQUEST:
1781 case TDLS_SETUP_RESPONSE:
1782 case TDLS_SETUP_CONFIRM:
1783 case TDLS_PEER_TRAFFIC_INDICATION:
1784 case TDLS_PEER_PSM_REQUEST:
1785 case TUNNELED_PROBE_REQ:
1786 case TUNNELED_PROBE_RSP:
1787 case TDLS_DISCOVERY_REQUEST:
1789 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1790 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1791 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1793 case TDLS_CHANNEL_SWITCH_REQUEST:
1794 case TDLS_CHANNEL_SWITCH_RESPONSE:
1795 case TDLS_PEER_PSM_RESPONSE:
1796 case TDLS_PEER_TRAFFIC_RESPONSE:
1797 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1798 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1799 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1803 if(ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_)
1805 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1806 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1807 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1813 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1814 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1815 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1820 if (pattrib->encrypt)
1823 if(ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE)
1828 if (pqospriv->qos_option)
1830 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
1831 if (pattrib->priority)
1832 SetPriority(qc, pattrib->priority);
1833 SetAckpolicy(qc, pattrib->ack_policy);
1836 psta = pattrib->psta;
1838 // 1. update seq_num per link by sta_info
1839 // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len
1841 ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
1843 ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1844 ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1845 pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];
1846 SetSeqNum(hdr, pattrib->seqnum);
1848 if (pattrib->encrypt){
1849 pattrib->encrypt= _AES_;
1852 pattrib->bswenc = _FALSE;
1854 pattrib->mac_id = ptdls_sta->mac_id;
1860 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1861 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1862 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
1863 SetSeqNum(hdr, pattrib->seqnum);
1874 s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, struct tdls_txmgmt *ptxmgmt)
1878 u8 *pframe, *mem_start;
1880 struct sta_info *psta;
1881 struct sta_priv *pstapriv = &padapter->stapriv;
1882 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1883 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1885 s32 bmcst = IS_MCAST(pattrib->ra);
1890 if (pattrib->psta) {
1891 psta = pattrib->psta;
1894 psta = rtw_get_bcmc_stainfo(padapter);
1896 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1905 if (pxmitframe->buf_addr == NULL) {
1910 pbuf_start = pxmitframe->buf_addr;
1911 mem_start = pbuf_start + TXDESC_OFFSET;
1913 if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, ptxmgmt) == _FAIL) {
1919 pframe += pattrib->hdrlen;
1921 //adding icv, if necessary...
1922 if (pattrib->iv_len)
1926 switch(pattrib->encrypt)
1930 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1934 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1936 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
1940 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1942 AES_IV(pattrib->iv, psta->dot11txpn, 0);
1947 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
1948 pframe += pattrib->iv_len;
1952 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
1955 //pattrib->pktlen will be counted in rtw_build_tdls_ies
1956 pattrib->pktlen = 0;
1958 rtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt);
1960 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
1961 pframe += pattrib->pktlen;
1962 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
1963 pframe += pattrib->icv_len;
1966 pattrib->nr_frags = 1;
1967 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz +
1968 ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen;
1970 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
1976 xmitframe_swencrypt(padapter, pxmitframe);
1978 update_attrib_vcs_info(padapter, pxmitframe);
1986 #endif //CONFIG_TDLS
1989 * Calculate wlan 802.11 packet MAX size from pkt_attrib
1990 * This function doesn't consider fragment case
1992 u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)
1996 len = pattrib->hdrlen + pattrib->iv_len; // WLAN Header and IV
1997 len += SNAP_SIZE + sizeof(u16); // LLC
1998 len += pattrib->pktlen;
1999 if (pattrib->encrypt == _TKIP_) len += 8; // MIC
2000 len += ((pattrib->bswenc) ? pattrib->icv_len : 0); // ICV
2007 This sub-routine will perform all the following:
2009 1. remove 802.3 header.
2010 2. create wlan_header, based on the info in pxmitframe
2011 3. append sta's iv/ext-iv
2013 5. move frag chunk from pframe to pxmitframe->mem
2014 6. apply sw-encrypt, if necessary.
2017 s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
2019 struct pkt_file pktfile;
2021 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
2025 u8 *pframe, *mem_start;
2028 //struct sta_info *psta;
2029 //struct sta_priv *pstapriv = &padapter->stapriv;
2030 //struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2031 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2033 struct pkt_attrib *pattrib = &pxmitframe->attrib;
2037 s32 bmcst = IS_MCAST(pattrib->ra);
2045 psta = pattrib->psta;
2048 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
2049 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
2055 DBG_871X("%s, psta==NUL\n", __func__);
2060 if(!(psta->state &_FW_LINKED))
2062 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
2066 if (pxmitframe->buf_addr == NULL){
2067 DBG_8192C("==> %s buf_addr==NULL \n",__FUNCTION__);
2071 pbuf_start = pxmitframe->buf_addr;
2073 #ifdef CONFIG_USB_TX_AGGREGATION
2074 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
2076 #ifdef CONFIG_TX_EARLY_MODE //for SDIO && Tx Agg
2077 hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
2079 hw_hdr_offset = TXDESC_OFFSET;
2083 mem_start = pbuf_start + hw_hdr_offset;
2085 if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
2086 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"));
2087 DBG_8192C("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
2092 _rtw_open_pktfile(pkt, &pktfile);
2093 _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
2096 frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342
2106 SetMFrag(mem_start);
2108 pframe += pattrib->hdrlen;
2109 mpdu_len -= pattrib->hdrlen;
2111 //adding icv, if necessary...
2112 if (pattrib->iv_len)
2115 //if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
2116 // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
2118 // psta = rtw_get_stainfo(pstapriv, pattrib->ra);
2122 switch(pattrib->encrypt)
2126 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2130 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2132 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
2136 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2138 AES_IV(pattrib->iv, psta->dot11txpn, 0);
2140 #ifdef CONFIG_WAPI_SUPPORT
2142 rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);
2148 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
2150 RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_,
2151 ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n",
2152 padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3)));
2154 pframe += pattrib->iv_len;
2156 mpdu_len -= pattrib->iv_len;
2160 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
2165 if ((pattrib->icv_len >0) && (pattrib->bswenc)) {
2166 mpdu_len -= pattrib->icv_len;
2171 // don't do fragment to broadcat/multicast packets
2172 mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
2174 mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);
2179 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
2180 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
2181 pframe += pattrib->icv_len;
2186 if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE))
2188 pattrib->nr_frags = frg_inx;
2190 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) +
2191 ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;
2193 ClearMFrag(mem_start);
2197 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __FUNCTION__));
2200 addr = (SIZE_PTR)(pframe);
2202 mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;
2203 _rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
2207 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
2209 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"));
2210 DBG_8192C("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n");
2215 xmitframe_swencrypt(padapter, pxmitframe);
2218 update_attrib_vcs_info(padapter, pxmitframe);
2220 pattrib->vcs_mode = NONE_VCS;
2229 #ifdef CONFIG_IEEE80211W
2230 //broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption
2231 s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
2233 struct pkt_file pktfile;
2234 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
2236 u8 *pframe, *mem_start = NULL, *tmp_buf=NULL;
2237 u8 hw_hdr_offset, subtype ;
2238 struct sta_info *psta = NULL;
2239 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2240 struct pkt_attrib *pattrib = &pxmitframe->attrib;
2242 s32 bmcst = IS_MCAST(pattrib->ra);
2247 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2248 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2249 struct rtw_ieee80211_hdr *pwlanhdr;
2250 u8 MME[_MME_IE_LENGTH_];
2254 mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
2255 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2258 ori_len = BIP_AAD_SIZE+pattrib->pktlen;
2259 tmp_buf = BIP_AAD = rtw_zmalloc(ori_len);
2260 subtype = GetFrameSubType(pframe); //bit(7)~bit(2)
2265 _enter_critical_bh(&padapter->security_key_mutex, &irqL);
2268 //IGTK key is not install, it may not support 802.11w
2269 if(padapter->securitypriv.binstallBIPkey != _TRUE)
2271 DBG_871X("no instll BIP key\n");
2272 goto xmitframe_coalesce_success;
2274 //station mode doesn't need TX BIP, just ready the code
2280 _rtw_memset(MME, 0, _MME_IE_LENGTH_);
2282 //other types doesn't need the BIP
2283 if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC)
2284 goto xmitframe_coalesce_fail;
2286 MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
2287 pframe += pattrib->pktlen;
2289 //octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0
2290 MME[0]=padapter->securitypriv.dot11wBIPKeyid;
2291 //copy packet number
2292 _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6);
2293 //increase the packet number
2294 pmlmeext->mgnt_80211w_IPN++;
2296 //add MME IE with MIC all zero, MME string doesn't include element id and length
2297 pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen));
2298 pattrib->last_txcmdsz = pattrib->pktlen;
2299 // total frame length - header length
2300 frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr);
2302 //conscruct AAD, copy frame control field
2303 _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
2304 ClearRetry(BIP_AAD);
2305 ClearPwrMgt(BIP_AAD);
2306 ClearMData(BIP_AAD);
2307 //conscruct AAD, copy address 1 to address 3
2308 _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);
2309 //copy management fram body
2310 _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len);
2311 /*//dump total packet include MME with zero MIC
2314 printk("Total packet: ");
2315 for(i=0; i < BIP_AAD_SIZE+frame_body_len; i++)
2316 printk(" %02x ", BIP_AAD[i]);
2320 if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
2321 , BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic))
2322 goto xmitframe_coalesce_fail;
2324 /*//dump calculated mic result
2327 printk("Calculated mic result: ");
2329 printk(" %02x ", mic[i]);
2332 //copy right BIP mic value, total is 128bits, we use the 0~63 bits
2333 _rtw_memcpy(pframe-8, mic, 8);
2334 /*/dump all packet after mic ok
2337 printk("pattrib->pktlen = %d \n", pattrib->pktlen);
2338 for(pp=0;pp< pattrib->pktlen; pp++)
2339 printk(" %02x ", mem_start[pp]);
2343 else //unicast mgmt frame TX
2345 //start to encrypt mgmt frame
2346 if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||
2347 subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION)
2350 psta = pattrib->psta;
2353 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
2359 DBG_871X("%s, psta==NUL\n", __func__);
2360 goto xmitframe_coalesce_fail;
2363 if (pxmitframe->buf_addr == NULL) {
2364 DBG_871X("%s, pxmitframe->buf_addr\n", __func__);
2365 goto xmitframe_coalesce_fail;
2368 //DBG_871X("%s, action frame category=%d \n", __func__, pframe[WLAN_HDR_A3_LEN]);
2369 //according 802.11-2012 standard, these five types are not robust types
2370 if(subtype == WIFI_ACTION &&
2371 (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC ||
2372 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT ||
2373 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM ||
2374 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED ||
2375 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P))
2376 goto xmitframe_coalesce_fail;
2377 //before encrypt dump the management packet content
2380 printk("Management pkt: ");
2381 for(i=0; i<pattrib->pktlen; i++)
2382 printk(" %02x ", pframe[i]);
2383 printk("=======\n");
2385 if(pattrib->encrypt>0)
2386 _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
2388 /* To use wrong key */
2389 if (pattrib->key_type == IEEE80211W_WRONG_KEY) {
2390 DBG_871X("use wrong key\n");
2391 pattrib->dot118021x_UncstKey.skey[0] = 0xff;
2394 //bakeup original management packet
2395 _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen);
2396 //move to data portion
2397 pframe += pattrib->hdrlen;
2399 //802.11w unicast management packet must be _AES_
2400 pattrib->iv_len = 8;
2402 pattrib->icv_len = 8;
2404 switch(pattrib->encrypt)
2408 AES_IV(pattrib->iv, psta->dot11wtxpn, 0);
2411 goto xmitframe_coalesce_fail;
2413 //insert iv header into management frame
2414 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
2415 pframe += pattrib->iv_len;
2416 //copy mgmt data portion after CCMP header
2417 _rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen);
2418 //move pframe to end of mgmt pkt
2419 pframe += pattrib->pktlen-pattrib->hdrlen;
2420 //add 8 bytes CCMP IV header to length
2421 pattrib->pktlen += pattrib->iv_len;
2422 /*//dump management packet include AES IV header
2425 printk("Management pkt + IV: ");
2426 //for(i=0; i<pattrib->pktlen; i++)
2427 //printk(" %02x ", mem_start[i]);
2428 printk("@@@@@@@@@@@@@\n");
2431 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
2432 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
2433 pframe += pattrib->icv_len;
2436 pattrib->pktlen += pattrib->icv_len;
2437 //set final tx command size
2438 pattrib->last_txcmdsz = pattrib->pktlen;
2440 //set protected bit must be beofre SW encrypt
2441 SetPrivacy(mem_start);
2442 /*//dump management packet include AES header
2445 printk("prepare to enc Management pkt + IV: ");
2446 for(i=0; i<pattrib->pktlen; i++)
2447 printk(" %02x ", mem_start[i]);
2448 printk("@@@@@@@@@@@@@\n");
2451 xmitframe_swencrypt(padapter, pxmitframe);
2455 xmitframe_coalesce_success:
2456 _exit_critical_bh(&padapter->security_key_mutex, &irqL);
2457 rtw_mfree(BIP_AAD, ori_len);
2461 xmitframe_coalesce_fail:
2462 _exit_critical_bh(&padapter->security_key_mutex, &irqL);
2463 rtw_mfree(BIP_AAD, ori_len);
2468 #endif //CONFIG_IEEE80211W
2470 /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
2471 * IEEE LLC/SNAP header contains 8 octets
2472 * First 3 octets comprise the LLC portion
2473 * SNAP portion, 5 octets, is divided into two fields:
2474 * Organizationally Unique Identifier(OUI), 3 octets,
2475 * type, defined by that organization, 2 octets.
2477 s32 rtw_put_snap(u8 *data, u16 h_proto)
2479 struct ieee80211_snap_hdr *snap;
2484 snap = (struct ieee80211_snap_hdr *)data;
2489 if (h_proto == 0x8137 || h_proto == 0x80f3)
2494 snap->oui[0] = oui[0];
2495 snap->oui[1] = oui[1];
2496 snap->oui[2] = oui[2];
2498 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
2502 return SNAP_SIZE + sizeof(u16);
2505 void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len)
2511 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2512 struct registry_priv *pregistrypriv = &padapter->registrypriv;
2516 switch(pxmitpriv->vcs_setting)
2519 pxmitpriv->vcs = NONE_VCS;
2527 perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
2530 pxmitpriv->vcs = NONE_VCS;
2534 protection = (*(perp + 2)) & BIT(1);
2537 if(pregistrypriv->vcs_type == RTS_CTS)
2538 pxmitpriv->vcs = RTS_CTS;
2540 pxmitpriv->vcs = CTS_TO_SELF;
2543 pxmitpriv->vcs = NONE_VCS;
2554 void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz)
2556 struct sta_info *psta = NULL;
2557 struct stainfo_stats *pstats = NULL;
2558 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2559 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2562 if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)
2564 #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2565 pkt_num = pxmitframe->agg_num;
2567 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pkt_num;
2569 pxmitpriv->tx_pkts += pkt_num;
2571 pxmitpriv->tx_bytes += sz;
2573 psta = pxmitframe->attrib.psta;
2576 pstats = &psta->sta_stats;
2578 pstats->tx_pkts += pkt_num;
2580 pstats->tx_bytes += sz;
2582 if(pxmitframe->attrib.ptdls_sta != NULL)
2584 pstats = &(pxmitframe->attrib.ptdls_sta->sta_stats);
2585 pstats->tx_pkts += pkt_num;
2586 pstats->tx_bytes += sz;
2588 #endif //CONFIG_TDLS
2591 #ifdef CONFIG_CHECK_LEAVE_LPS
2592 //traffic_check_for_leave_lps(padapter, _TRUE);
2598 static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
2599 enum cmdbuf_type buf_type)
2601 struct xmit_buf *pxmitbuf = NULL;
2605 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
2606 if (pxmitbuf != NULL) {
2607 pxmitbuf->priv_data = NULL;
2609 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2611 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2612 pxmitbuf->agg_num = 0;
2613 pxmitbuf->pg_num = 0;
2615 #ifdef CONFIG_PCI_HCI
2617 pxmitbuf->desc = NULL;
2620 if (pxmitbuf->sctx) {
2621 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2622 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2625 DBG_871X("%s fail, no xmitbuf available !!!\n", __func__);
2635 struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
2636 enum cmdbuf_type buf_type)
2638 struct xmit_frame *pcmdframe;
2639 struct xmit_buf *pxmitbuf;
2641 if ((pcmdframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL)
2643 DBG_871X("%s, alloc xmitframe fail\n", __FUNCTION__);
2647 if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {
2648 DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__);
2649 rtw_free_xmitframe(pxmitpriv, pcmdframe);
2653 pcmdframe->frame_tag = MGNT_FRAMETAG;
2655 pcmdframe->pxmitbuf = pxmitbuf;
2657 pcmdframe->buf_addr = pxmitbuf->pbuf;
2659 pxmitbuf->priv_data = pcmdframe;
2665 struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)
2668 struct xmit_buf *pxmitbuf = NULL;
2669 _list *plist, *phead;
2670 _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
2674 _enter_critical(&pfree_queue->lock, &irqL);
2676 if(_rtw_queue_empty(pfree_queue) == _TRUE) {
2680 phead = get_list_head(pfree_queue);
2682 plist = get_next(phead);
2684 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
2686 rtw_list_delete(&(pxmitbuf->list));
2689 if (pxmitbuf != NULL)
2691 pxmitpriv->free_xmit_extbuf_cnt--;
2692 #ifdef DBG_XMIT_BUF_EXT
2693 DBG_871X("DBG_XMIT_BUF_EXT ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt);
2697 pxmitbuf->priv_data = NULL;
2699 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2701 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2702 pxmitbuf->agg_num = 1;
2704 #ifdef CONFIG_PCI_HCI
2706 pxmitbuf->desc = NULL;
2709 if (pxmitbuf->sctx) {
2710 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2711 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2716 _exit_critical(&pfree_queue->lock, &irqL);
2723 s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
2726 _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
2735 _enter_critical(&pfree_queue->lock, &irqL);
2737 rtw_list_delete(&pxmitbuf->list);
2739 rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue));
2740 pxmitpriv->free_xmit_extbuf_cnt++;
2741 #ifdef DBG_XMIT_BUF_EXT
2742 DBG_871X("DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt);
2745 _exit_critical(&pfree_queue->lock, &irqL);
2752 struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
2755 struct xmit_buf *pxmitbuf = NULL;
2756 _list *plist, *phead;
2757 _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
2761 //DBG_871X("+rtw_alloc_xmitbuf\n");
2763 _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
2765 if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) {
2769 phead = get_list_head(pfree_xmitbuf_queue);
2771 plist = get_next(phead);
2773 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
2775 rtw_list_delete(&(pxmitbuf->list));
2778 if (pxmitbuf != NULL)
2780 pxmitpriv->free_xmitbuf_cnt--;
2782 DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt);
2784 //DBG_871X("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
2786 pxmitbuf->priv_data = NULL;
2788 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2790 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2791 pxmitbuf->agg_num = 0;
2792 pxmitbuf->pg_num = 0;
2794 #ifdef CONFIG_PCI_HCI
2796 pxmitbuf->desc = NULL;
2799 if (pxmitbuf->sctx) {
2800 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2801 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2807 DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n");
2811 _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
2818 s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
2821 _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
2825 //DBG_871X("+rtw_free_xmitbuf\n");
2832 if (pxmitbuf->sctx) {
2833 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2834 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);
2837 if(pxmitbuf->buf_tag == XMITBUF_CMD) {
2839 else if(pxmitbuf->buf_tag == XMITBUF_MGNT) {
2840 rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);
2844 _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
2846 rtw_list_delete(&pxmitbuf->list);
2848 rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
2850 pxmitpriv->free_xmitbuf_cnt++;
2851 //DBG_871X("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
2853 DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt);
2855 _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
2863 void rtw_init_xmitframe(struct xmit_frame *pxframe)
2865 if (pxframe != NULL)//default value setting
2867 pxframe->buf_addr = NULL;
2868 pxframe->pxmitbuf = NULL;
2870 _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));
2871 //pxframe->attrib.psta = NULL;
2873 pxframe->frame_tag = DATA_FRAMETAG;
2875 #ifdef CONFIG_USB_HCI
2876 pxframe->pkt = NULL;
2877 #ifdef USB_PACKET_OFFSET_SZ
2878 pxframe->pkt_offset = (PACKET_OFFSET_SZ/8);
2880 pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc
2883 #ifdef CONFIG_USB_TX_AGGREGATION
2884 pxframe->agg_num = 1;
2887 #endif //#ifdef CONFIG_USB_HCI
2889 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2890 pxframe->pg_num = 1;
2891 pxframe->agg_num = 1;
2894 #ifdef CONFIG_XMIT_ACK
2895 pxframe->ack_report = 0;
2904 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
2906 If we turn on USE_RXTHREAD, then, no need for critical section.
2907 Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
2909 Must be very very cautious...
2912 struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue)
2915 Please remember to use all the osdep_service api,
2916 and lock/unlock or _enter/_exit critical to protect
2921 struct xmit_frame *pxframe = NULL;
2922 _list *plist, *phead;
2923 _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
2927 _enter_critical_bh(&pfree_xmit_queue->lock, &irqL);
2929 if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) {
2930 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt));
2933 phead = get_list_head(pfree_xmit_queue);
2935 plist = get_next(phead);
2937 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
2939 rtw_list_delete(&(pxframe->list));
2940 pxmitpriv->free_xmitframe_cnt--;
2941 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
2944 _exit_critical_bh(&pfree_xmit_queue->lock, &irqL);
2946 rtw_init_xmitframe(pxframe);
2953 struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv)
2956 struct xmit_frame *pxframe = NULL;
2957 _list *plist, *phead;
2958 _queue *queue = &pxmitpriv->free_xframe_ext_queue;
2962 _enter_critical_bh(&queue->lock, &irqL);
2964 if (_rtw_queue_empty(queue) == _TRUE) {
2965 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe_ext:%d\n", pxmitpriv->free_xframe_ext_cnt));
2968 phead = get_list_head(queue);
2969 plist = get_next(phead);
2970 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
2972 rtw_list_delete(&(pxframe->list));
2973 pxmitpriv->free_xframe_ext_cnt--;
2974 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe_ext():free_xmitframe_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
2977 _exit_critical_bh(&queue->lock, &irqL);
2979 rtw_init_xmitframe(pxframe);
2986 struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv)
2988 struct xmit_frame *pxframe = NULL;
2991 alloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4);
2993 if (alloc_addr == NULL)
2996 pxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4);
2997 pxframe->alloc_addr = alloc_addr;
2999 pxframe->padapter = pxmitpriv->adapter;
3000 pxframe->frame_tag = NULL_FRAMETAG;
3002 pxframe->pkt = NULL;
3004 pxframe->buf_addr = NULL;
3005 pxframe->pxmitbuf = NULL;
3007 rtw_init_xmitframe(pxframe);
3009 DBG_871X("################## %s ##################\n", __func__);
3015 s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)
3018 _queue *queue = NULL;
3019 _adapter *padapter = pxmitpriv->adapter;
3020 _pkt *pndis_pkt = NULL;
3024 if (pxmitframe == NULL) {
3025 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n"));
3029 if (pxmitframe->pkt){
3030 pndis_pkt = pxmitframe->pkt;
3031 pxmitframe->pkt = NULL;
3034 if (pxmitframe->alloc_addr) {
3035 DBG_871X("################## %s with alloc_addr ##################\n", __func__);
3036 rtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4);
3037 goto check_pkt_complete;
3040 if (pxmitframe->ext_tag == 0)
3041 queue = &pxmitpriv->free_xmit_queue;
3042 else if(pxmitframe->ext_tag == 1)
3043 queue = &pxmitpriv->free_xframe_ext_queue;
3047 _enter_critical_bh(&queue->lock, &irqL);
3049 rtw_list_delete(&pxmitframe->list);
3050 rtw_list_insert_tail(&pxmitframe->list, get_list_head(queue));
3051 if (pxmitframe->ext_tag == 0) {
3052 pxmitpriv->free_xmitframe_cnt++;
3053 RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
3054 } else if(pxmitframe->ext_tag == 1) {
3055 pxmitpriv->free_xframe_ext_cnt++;
3056 RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xframe_ext_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
3060 _exit_critical_bh(&queue->lock, &irqL);
3065 rtw_os_pkt_complete(padapter, pndis_pkt);
3074 void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue)
3077 _list *plist, *phead;
3078 struct xmit_frame *pxmitframe;
3082 _enter_critical_bh(&(pframequeue->lock), &irqL);
3084 phead = get_list_head(pframequeue);
3085 plist = get_next(phead);
3087 while (rtw_end_of_queue_search(phead, plist) == _FALSE)
3090 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
3092 plist = get_next(plist);
3094 rtw_free_xmitframe(pxmitpriv,pxmitframe);
3097 _exit_critical_bh(&(pframequeue->lock), &irqL);
3102 s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
3104 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
3105 if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
3107 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
3108 ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n"));
3109 // pxmitframe->pkt = NULL;
3116 static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)
3118 _list *xmitframe_plist, *xmitframe_phead;
3119 struct xmit_frame *pxmitframe=NULL;
3121 xmitframe_phead = get_list_head(pframe_queue);
3122 xmitframe_plist = get_next(xmitframe_phead);
3124 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
3126 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
3128 /* xmitframe_plist = get_next(xmitframe_plist); */
3130 /*#ifdef RTK_DMP_PLATFORM
3131 #ifdef CONFIG_USB_TX_AGGREGATION
3132 if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2))
3136 tasklet_schedule(&pxmitpriv->xmit_tasklet);
3142 rtw_list_delete(&pxmitframe->list);
3146 //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending);
3152 //pxmitframe = NULL;
3159 struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry)
3162 _list *sta_plist, *sta_phead;
3163 struct hw_xmit *phwxmit;
3164 struct tx_servq *ptxservq = NULL;
3165 _queue *pframe_queue = NULL;
3166 struct xmit_frame *pxmitframe = NULL;
3167 _adapter *padapter = pxmitpriv->adapter;
3168 struct registry_priv *pregpriv = &padapter->registrypriv;
3170 #ifdef CONFIG_USB_HCI
3171 // int j, tmp, acirp_cnt[4];
3176 inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;
3178 if(pregpriv->wifi_spec==1)
3180 int j, tmp, acirp_cnt[4];
3182 if(flags<XMIT_QUEUE_ENTRY)
3184 //priority exchange according to the completed xmitbuf flags.
3190 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
3192 inx[j] = pxmitpriv->wmm_para_seq[j];
3196 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
3198 for(i = 0; i < entry; i++)
3200 phwxmit = phwxmit_i + inx[i];
3202 //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3204 sta_phead = get_list_head(phwxmit->sta_queue);
3205 sta_plist = get_next(sta_phead);
3207 while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE)
3210 ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);
3212 pframe_queue = &ptxservq->sta_pending;
3214 pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
3220 //Remove sta node when there is no pending packets.
3221 if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break
3222 rtw_list_delete(&ptxservq->tx_pending);
3224 //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3229 sta_plist = get_next(sta_plist);
3233 //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3239 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
3247 struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac)
3249 struct tx_servq *ptxservq=NULL;
3257 ptxservq = &(psta->sta_xmitpriv.bk_q);
3259 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
3264 ptxservq = &(psta->sta_xmitpriv.vi_q);
3266 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
3271 ptxservq = &(psta->sta_xmitpriv.vo_q);
3273 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
3279 ptxservq = &(psta->sta_xmitpriv.be_q);
3281 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
3291 __inline static struct tx_servq *rtw_get_sta_pending
3292 (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up)
3294 struct tx_servq *ptxservq;
3295 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
3299 #ifdef CONFIG_RTL8711
3301 if(IS_MCAST(psta->hwaddr))
3303 ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo
3304 *ppstapending = &padapter->xmitpriv.bm_pending;
3313 ptxservq = &(psta->sta_xmitpriv.bk_q);
3314 *ppstapending = &padapter->xmitpriv.bk_pending;
3315 (phwxmits+3)->accnt++;
3316 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
3321 ptxservq = &(psta->sta_xmitpriv.vi_q);
3322 *ppstapending = &padapter->xmitpriv.vi_pending;
3323 (phwxmits+1)->accnt++;
3324 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
3329 ptxservq = &(psta->sta_xmitpriv.vo_q);
3330 *ppstapending = &padapter->xmitpriv.vo_pending;
3331 (phwxmits+0)->accnt++;
3332 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
3338 ptxservq = &(psta->sta_xmitpriv.be_q);
3339 *ppstapending = &padapter->xmitpriv.be_pending;
3340 (phwxmits+2)->accnt++;
3341 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
3355 * Will enqueue pxmitframe to the proper queue,
3356 * and indicate it to xx_pending list.....
3358 s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
3362 struct sta_info *psta;
3363 struct tx_servq *ptxservq;
3364 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3365 struct sta_priv *pstapriv = &padapter->stapriv;
3366 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
3367 sint res = _SUCCESS;
3371 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
3374 if (pattrib->psta) {
3375 psta = pattrib->psta;
3377 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
3378 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
3382 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
3383 if(pattrib->psta != psta)
3385 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
3386 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
3391 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
3393 DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
3394 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
3398 if(!(psta->state &_FW_LINKED))
3400 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
3401 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
3405 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
3407 //_enter_critical(&pstapending->lock, &irqL0);
3409 if (rtw_is_list_empty(&ptxservq->tx_pending)) {
3410 rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
3413 //_enter_critical(&ptxservq->sta_pending.lock, &irqL1);
3415 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
3417 phwxmits[ac_index].accnt++;
3419 //_exit_critical(&ptxservq->sta_pending.lock, &irqL1);
3421 //_exit_critical(&pstapending->lock, &irqL0);
3430 void rtw_alloc_hwxmits(_adapter *padapter)
3432 struct hw_xmit *hwxmits;
3433 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3435 pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
3437 pxmitpriv->hwxmits = NULL;
3439 pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry);
3441 if(pxmitpriv->hwxmits == NULL)
3443 DBG_871X("alloc hwxmits fail!...\n");
3447 hwxmits = pxmitpriv->hwxmits;
3449 if(pxmitpriv->hwxmit_entry == 5)
3451 //pxmitpriv->bmc_txqueue.head = 0;
3452 //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;
3453 hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
3455 //pxmitpriv->vo_txqueue.head = 0;
3456 //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;
3457 hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
3459 //pxmitpriv->vi_txqueue.head = 0;
3460 //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;
3461 hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
3463 //pxmitpriv->bk_txqueue.head = 0;
3464 //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
3465 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
3467 //pxmitpriv->be_txqueue.head = 0;
3468 //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;
3469 hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
3472 else if(pxmitpriv->hwxmit_entry == 4)
3475 //pxmitpriv->vo_txqueue.head = 0;
3476 //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;
3477 hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
3479 //pxmitpriv->vi_txqueue.head = 0;
3480 //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;
3481 hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
3483 //pxmitpriv->be_txqueue.head = 0;
3484 //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;
3485 hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
3487 //pxmitpriv->bk_txqueue.head = 0;
3488 //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
3489 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
3500 void rtw_free_hwxmits(_adapter *padapter)
3502 struct hw_xmit *hwxmits;
3503 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3505 hwxmits = pxmitpriv->hwxmits;
3507 rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry));
3510 void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry)
3514 for(i = 0; i < entry; i++, phwxmit++)
3516 //_rtw_spinlock_init(&phwxmit->xmit_lock);
3517 //_rtw_init_listhead(&phwxmit->pending);
3518 //phwxmit->txcmdcnt = 0;
3524 #ifdef CONFIG_BR_EXT
3525 int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb)
3527 struct sk_buff *skb = *pskb;
3528 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3530 //if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
3532 void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb);
3533 int res, is_vlan_tag=0, i, do_nat25=1;
3534 unsigned short vlan_hdr=0;
3535 void *br_port = NULL;
3537 //mac_clone_handle_frame(priv, skb);
3539 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3540 br_port = padapter->pnetdev->br_port;
3541 #else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3543 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
3545 #endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3546 _enter_critical_bh(&padapter->br_ext_lock, &irqL);
3547 if ( !(skb->data[0] & 1) &&
3549 memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
3550 *((unsigned short *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) &&
3551 *((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) &&
3552 !memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {
3553 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3554 padapter->scdb_entry->ageing_timer = jiffies;
3555 _exit_critical_bh(&padapter->br_ext_lock, &irqL);
3558 //if (!priv->pmib->ethBrExtInfo.nat25_disable)
3560 // if (priv->dev->br_port &&
3561 // !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) {
3563 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
3565 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
3567 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
3570 //if SA == br_mac && skb== IP => copy SIP to br_ip ?? why
3571 if (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
3572 (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)))
3573 memcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
3575 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) {
3576 if (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) {
3577 void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr);
3579 if ((padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,
3580 skb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12)) != NULL) {
3581 memcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN);
3582 memcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
3583 padapter->scdb_entry->ageing_timer = jiffies;
3588 if (padapter->scdb_entry) {
3589 padapter->scdb_entry->ageing_timer = jiffies;
3593 memset(padapter->scdb_mac, 0, MACADDRLEN);
3594 memset(padapter->scdb_ip, 0, 4);
3598 _exit_critical_bh(&padapter->br_ext_lock, &irqL);
3602 int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method);
3603 if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {
3604 struct sk_buff *newskb;
3609 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
3610 *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
3611 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
3614 newskb = rtw_skb_copy(skb);
3615 if (newskb == NULL) {
3616 //priv->ext_stats.tx_drops++;
3617 DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n");
3623 *pskb = skb = newskb;
3625 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
3627 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
3632 if (skb_is_nonlinear(skb))
3633 DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __FUNCTION__);
3636 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3637 res = skb_linearize(skb, GFP_ATOMIC);
3638 #else // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3639 res = skb_linearize(skb);
3640 #endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3642 DEBUG_ERR("TX DROP: skb_linearize fail!\n");
3643 //goto free_and_stop;
3647 res = nat25_db_handle(padapter, skb, NAT25_INSERT);
3650 //priv->ext_stats.tx_drops++;
3651 DEBUG_ERR("TX DROP: nat25_db_handle fail!\n");
3652 //goto free_and_stop;
3656 // we just print warning message and let it go
3657 //DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__);
3658 //return -1; // return -1 will cause system crash on 2011/08/30!
3663 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3665 dhcp_flag_bcast(padapter, skb);
3670 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
3671 *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
3672 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
3677 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
3682 if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)){
3683 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3687 if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)){
3688 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3694 // check if SA is equal to our MAC
3695 if (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {
3696 //priv->ext_stats.tx_drops++;
3697 DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n",
3698 skb->data[6],skb->data[7],skb->data[8],skb->data[9],skb->data[10],skb->data[11]);
3699 //goto free_and_stop;
3705 #endif // CONFIG_BR_EXT
3707 u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)
3710 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3712 switch(pattrib->qsel)
3716 addr = BE_QUEUE_INX;
3720 addr = BK_QUEUE_INX;
3724 addr = VI_QUEUE_INX;
3728 addr = VO_QUEUE_INX;
3731 addr = BCN_QUEUE_INX;
3733 case 0x11://BC/MC in PS (HIQ)
3734 addr = HIGH_QUEUE_INX;
3738 addr = MGT_QUEUE_INX;
3747 static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib)
3751 qsel = pattrib->priority;
3752 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel));
3754 #ifdef CONFIG_CONCURRENT_MODE
3755 // if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
3759 pattrib->qsel = qsel;
3763 * The main transmit(tx) entry
3767 * 0 success, hardware will handle this xmit frame(packet)
3770 s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev)
3775 int dot11_hdr_len = 24;
3777 unsigned char *pdata;
3779 unsigned char src_mac_addr[6];
3780 unsigned char dst_mac_addr[6];
3781 struct rtw_ieee80211_hdr *dot11_hdr;
3782 struct ieee80211_radiotap_header *rtap_hdr;
3783 _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
3786 rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize);
3788 if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
3791 rtap_hdr = (struct ieee80211_radiotap_header *)skb->data;
3792 if (unlikely(rtap_hdr->it_version))
3795 rtap_len = ieee80211_get_radiotap_len(skb->data);
3796 if (unlikely(skb->len < rtap_len))
3799 if (rtap_len != 12) {
3800 DBG_8192C("radiotap len (should be 14): %d\n", rtap_len);
3804 /* Skip the ratio tap header */
3805 skb_pull(skb, rtap_len);
3807 dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data;
3808 frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl);
3809 /* Check if the QoS bit is set */
3811 if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) {
3813 struct xmit_frame *pmgntframe;
3814 struct pkt_attrib *pattrib;
3815 unsigned char *pframe;
3816 struct rtw_ieee80211_hdr *pwlanhdr;
3817 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
3818 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3819 u8 *buf = skb->data;
3821 u8 category, action;
3824 pmgntframe = alloc_mgtxmitframe(pxmitpriv);
3825 if (pmgntframe == NULL) {
3829 pattrib = &pmgntframe->attrib;
3831 update_monitor_frame_attrib(padapter, pattrib);
3833 pattrib->retry_ctrl = _FALSE;
3835 _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
3837 pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
3839 _rtw_memcpy(pframe, (void *)buf, len);
3841 pattrib->pktlen = len;
3843 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3845 if (is_broadcast_mac_addr(pwlanhdr->addr3) || is_broadcast_mac_addr(pwlanhdr->addr1))
3846 pattrib->rate = MGN_24M;
3848 pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
3849 pattrib->seqnum = pmlmeext->mgnt_seq;
3850 pmlmeext->mgnt_seq++;
3852 pattrib->last_txcmdsz = pattrib->pktlen;
3854 dump_mgntframe(padapter, pmgntframe);
3857 struct xmit_frame *pmgntframe;
3858 struct pkt_attrib *pattrib;
3859 unsigned char *pframe;
3860 struct rtw_ieee80211_hdr *pwlanhdr;
3861 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
3862 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3863 u8 *buf = skb->data;
3865 u8 category, action;
3868 pmgntframe = alloc_mgtxmitframe(pxmitpriv);
3869 if (pmgntframe == NULL)
3872 pattrib = &pmgntframe->attrib;
3873 update_mgntframe_attrib(padapter, pattrib);
3874 pattrib->retry_ctrl = _FALSE;
3876 _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
3878 pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
3880 _rtw_memcpy(pframe, (void *)buf, len);
3882 pattrib->pktlen = len;
3884 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3886 pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
3887 pattrib->seqnum = pmlmeext->mgnt_seq;
3888 pmlmeext->mgnt_seq++;
3890 pattrib->last_txcmdsz = pattrib->pktlen;
3892 dump_mgntframe(padapter, pmgntframe);
3904 * The main transmit(tx) entry
3908 * 0 success, hardware will handle this xmit frame(packet)
3911 s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
3913 static u32 start = 0;
3914 static u32 drop_cnt = 0;
3915 #ifdef CONFIG_AP_MODE
3918 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3919 struct xmit_frame *pxmitframe = NULL;
3920 #ifdef CONFIG_BR_EXT
3921 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3922 void *br_port = NULL;
3923 #endif // CONFIG_BR_EXT
3927 DBG_COUNTER(padapter->tx_logs.core_tx);
3930 start = rtw_get_current_time();
3932 pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
3934 if (rtw_get_passing_time_ms(start) > 2000) {
3936 DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt);
3937 start = rtw_get_current_time();
3941 if (pxmitframe == NULL) {
3943 RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
3944 DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
3948 #ifdef CONFIG_BR_EXT
3950 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3951 br_port = padapter->pnetdev->br_port;
3952 #else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3954 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
3956 #endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3958 if( br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
3960 res = rtw_br_client_tx(padapter, ppkt);
3963 rtw_free_xmitframe(pxmitpriv, pxmitframe);
3964 DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
3969 #endif // CONFIG_BR_EXT
3971 res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
3973 #ifdef CONFIG_WAPI_SUPPORT
3974 if(pxmitframe->attrib.ether_type != 0x88B4)
3976 if(rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra))
3978 WAPI_TRACE(WAPI_RX,"drop for key absend when tx \n");
3984 RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n"));
3985 #ifdef DBG_TX_DROP_FRAME
3986 DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__);
3988 rtw_free_xmitframe(pxmitpriv, pxmitframe);
3991 pxmitframe->pkt = *ppkt;
3993 rtw_led_control(padapter, LED_CTL_TX);
3995 do_queue_select(padapter, &pxmitframe->attrib);
3997 #ifdef CONFIG_AP_MODE
3998 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
3999 if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
4001 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4002 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
4005 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4009 if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
4016 sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
4021 struct sta_info *ptdls_sta=NULL;
4022 struct sta_priv *pstapriv = &padapter->stapriv;
4023 struct pkt_attrib *pattrib = &pxmitframe->attrib;
4024 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
4027 ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
4028 if(ptdls_sta==NULL){
4030 }else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE){
4032 if(pattrib->triggered==1)
4038 _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
4040 if(ptdls_sta->state&WIFI_SLEEP_STATE)
4042 rtw_list_delete(&pxmitframe->list);
4044 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4046 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q));
4048 ptdls_sta->sleepq_len++;
4049 ptdls_sta->sleepq_ac_len++;
4051 //indicate 4-AC queue bit in TDLS peer traffic indication
4052 switch(pattrib->priority)
4056 ptdls_sta->uapsd_bk |= BIT(1);
4060 ptdls_sta->uapsd_vi |= BIT(1);
4064 ptdls_sta->uapsd_vo |= BIT(1);
4069 ptdls_sta->uapsd_be |= BIT(1);
4073 /* Transmit TDLS PTI via AP */
4074 if(ptdls_sta->sleepq_len==1)
4075 rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI);
4080 _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
4086 #endif //CONFIG_TDLS
4088 #define RTW_HIQ_FILTER_ALLOW_ALL 0
4089 #define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
4090 #define RTW_HIQ_FILTER_DENY_ALL 2
4092 inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
4094 bool allow = _FALSE;
4095 _adapter *adapter = xmitframe->padapter;
4096 struct registry_priv *registry = &adapter->registrypriv;
4098 if (adapter->registrypriv.wifi_spec == 1) {
4100 } else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
4102 struct pkt_attrib *attrib = &xmitframe->attrib;
4104 if (attrib->ether_type == 0x0806
4105 || attrib->ether_type == 0x888e
4106 #ifdef CONFIG_WAPI_SUPPORT
4107 || attrib->ether_type == 0x88B4
4112 DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
4113 , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
4117 else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
4120 else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
4128 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
4130 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
4134 struct sta_info *psta=NULL;
4135 struct sta_priv *pstapriv = &padapter->stapriv;
4136 struct pkt_attrib *pattrib = &pxmitframe->attrib;
4137 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
4138 sint bmcst = IS_MCAST(pattrib->ra);
4139 bool update_tim = _FALSE;
4142 if( padapter->tdlsinfo.link_established == _TRUE )
4144 ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);
4146 #endif //CONFIG_TDLS
4148 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
4150 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
4156 psta = pattrib->psta;
4160 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
4161 psta=rtw_get_stainfo(pstapriv, pattrib->ra);
4164 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
4165 if(pattrib->psta != psta)
4167 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
4168 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
4174 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
4175 DBG_871X("%s, psta==NUL\n", __func__);
4179 if(!(psta->state &_FW_LINKED))
4181 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
4182 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
4186 if(pattrib->triggered==1)
4188 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
4189 //DBG_871X("directly xmit pspoll_triggered packet\n");
4191 //pattrib->triggered=0;
4192 if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
4193 pattrib->qsel = QSLT_HIGH;//HIQ
4201 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4203 if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode
4205 //pattrib->qsel = QSLT_HIGH;//HIQ
4207 rtw_list_delete(&pxmitframe->list);
4209 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4211 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
4215 if (!(pstapriv->tim_bitmap & BIT(0)))
4218 pstapriv->tim_bitmap |= BIT(0);//
4219 pstapriv->sta_dz_bitmap |= BIT(0);
4221 //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
4222 if (padapter->registrypriv.wifi_spec == 1) {
4224 *if (update_tim == _TRUE)
4225 * rtw_chk_hi_queue_cmd(padapter);
4229 if (update_tim == _TRUE) {
4230 if (is_broadcast_mac_addr(pattrib->ra))
4231 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC");
4233 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC");
4235 chk_bmc_sleepq_cmd(padapter);
4239 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4243 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
4247 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4254 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4256 if(psta->state&WIFI_SLEEP_STATE)
4260 if(pstapriv->sta_dz_bitmap&BIT(psta->aid))
4262 rtw_list_delete(&pxmitframe->list);
4264 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4266 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
4270 switch(pattrib->priority)
4274 wmmps_ac = psta->uapsd_bk&BIT(0);
4278 wmmps_ac = psta->uapsd_vi&BIT(0);
4282 wmmps_ac = psta->uapsd_vo&BIT(0);
4287 wmmps_ac = psta->uapsd_be&BIT(0);
4292 psta->sleepq_ac_len++;
4294 if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))
4296 if (!(pstapriv->tim_bitmap & BIT(psta->aid)))
4299 pstapriv->tim_bitmap |= BIT(psta->aid);
4301 //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
4303 if(update_tim == _TRUE)
4305 //DBG_871X("sleepq_len==1, update BCNTIM\n");
4306 //upate BCN for TIM IE
4307 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC");
4311 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4313 //if(psta->sleepq_len > (NR_XMITFRAME>>3))
4315 // wakeup_sta_to_xmit(padapter, psta);
4320 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
4325 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4331 static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue)
4334 _list *plist, *phead;
4336 struct tx_servq *ptxservq;
4337 struct pkt_attrib *pattrib;
4338 struct xmit_frame *pxmitframe;
4339 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
4341 phead = get_list_head(pframequeue);
4342 plist = get_next(phead);
4344 while (rtw_end_of_queue_search(phead, plist) == _FALSE)
4346 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
4348 plist = get_next(plist);
4350 pattrib = &pxmitframe->attrib;
4352 pattrib->triggered = 0;
4354 ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
4358 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
4361 phwxmits[ac_index].accnt--;
4365 //DBG_871X("xmitframe_enqueue_for_sleeping_sta return _FALSE\n");
4372 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta)
4375 struct sta_info *psta_bmc;
4376 struct sta_xmit_priv *pstaxmitpriv;
4377 struct sta_priv *pstapriv = &padapter->stapriv;
4378 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4380 pstaxmitpriv = &psta->sta_xmitpriv;
4383 psta_bmc = rtw_get_bcmc_stainfo(padapter);
4386 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
4388 psta->state |= WIFI_SLEEP_STATE;
4391 if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) )
4392 #endif //CONFIG_TDLS
4393 pstapriv->sta_dz_bitmap |= BIT(psta->aid);
4397 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);
4398 rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
4401 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);
4402 rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
4405 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);
4406 rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
4409 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);
4410 rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
4413 if (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) {
4414 #endif //CONFIG_TDLS
4418 pstaxmitpriv = &psta_bmc->sta_xmitpriv;
4419 dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);
4420 rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
4425 #endif //CONFIG_TDLS
4426 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4431 void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
4434 u8 update_mask=0, wmmps_ac=0;
4435 struct sta_info *psta_bmc;
4436 _list *xmitframe_plist, *xmitframe_phead;
4437 struct xmit_frame *pxmitframe=NULL;
4438 struct sta_priv *pstapriv = &padapter->stapriv;
4439 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4441 psta_bmc = rtw_get_bcmc_stainfo(padapter);
4444 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4445 _enter_critical_bh(&pxmitpriv->lock, &irqL);
4447 xmitframe_phead = get_list_head(&psta->sleep_q);
4448 xmitframe_plist = get_next(xmitframe_phead);
4450 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4452 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4454 xmitframe_plist = get_next(xmitframe_plist);
4456 rtw_list_delete(&pxmitframe->list);
4458 switch(pxmitframe->attrib.priority)
4462 wmmps_ac = psta->uapsd_bk&BIT(1);
4466 wmmps_ac = psta->uapsd_vi&BIT(1);
4470 wmmps_ac = psta->uapsd_vo&BIT(1);
4475 wmmps_ac = psta->uapsd_be&BIT(1);
4480 if(psta->sleepq_len>0)
4481 pxmitframe->attrib.mdata = 1;
4483 pxmitframe->attrib.mdata = 0;
4487 psta->sleepq_ac_len--;
4488 if(psta->sleepq_ac_len>0)
4490 pxmitframe->attrib.mdata = 1;
4491 pxmitframe->attrib.eosp = 0;
4495 pxmitframe->attrib.mdata = 0;
4496 pxmitframe->attrib.eosp = 1;
4500 pxmitframe->attrib.triggered = 1;
4503 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4504 if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
4506 rtw_os_xmit_complete(padapter, pxmitframe);
4508 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4510 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4515 if(psta->sleepq_len==0)
4518 if( psta->tdls_sta_state & TDLS_LINKED_STATE )
4520 if(psta->state&WIFI_SLEEP_STATE)
4521 psta->state ^= WIFI_SLEEP_STATE;
4523 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4526 #endif //CONFIG_TDLS
4528 if (pstapriv->tim_bitmap & BIT(psta->aid)) {
4529 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4530 //upate BCN for TIM IE
4531 //update_BCNTIM(padapter);
4532 update_mask = BIT(0);
4535 pstapriv->tim_bitmap &= ~BIT(psta->aid);
4537 if(psta->state&WIFI_SLEEP_STATE)
4538 psta->state ^= WIFI_SLEEP_STATE;
4540 if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
4542 DBG_871X("%s alive check\n", __func__);
4543 psta->expire_to = pstapriv->expire_to;
4544 psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
4547 pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
4554 if((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode
4556 xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
4557 xmitframe_plist = get_next(xmitframe_phead);
4559 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4561 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4563 xmitframe_plist = get_next(xmitframe_plist);
4565 rtw_list_delete(&pxmitframe->list);
4567 psta_bmc->sleepq_len--;
4568 if(psta_bmc->sleepq_len>0)
4569 pxmitframe->attrib.mdata = 1;
4571 pxmitframe->attrib.mdata = 0;
4574 pxmitframe->attrib.triggered = 1;
4576 _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4577 if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
4579 rtw_os_xmit_complete(padapter, pxmitframe);
4581 _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4584 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4588 if(psta_bmc->sleepq_len==0)
4590 if (pstapriv->tim_bitmap & BIT(0)) {
4591 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4592 //upate BCN for TIM IE
4593 //update_BCNTIM(padapter);
4594 update_mask |= BIT(1);
4596 pstapriv->tim_bitmap &= ~BIT(0);
4597 pstapriv->sta_dz_bitmap &= ~BIT(0);
4604 //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4605 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4609 //update_BCNTIM(padapter);
4610 if ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
4611 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC");
4612 else if ((update_mask & BIT(1)) == BIT(1))
4613 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC");
4615 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC");
4620 void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
4624 _list *xmitframe_plist, *xmitframe_phead;
4625 struct xmit_frame *pxmitframe=NULL;
4626 struct sta_priv *pstapriv = &padapter->stapriv;
4627 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4630 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4631 _enter_critical_bh(&pxmitpriv->lock, &irqL);
4633 xmitframe_phead = get_list_head(&psta->sleep_q);
4634 xmitframe_plist = get_next(xmitframe_phead);
4636 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4638 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4640 xmitframe_plist = get_next(xmitframe_plist);
4642 switch(pxmitframe->attrib.priority)
4646 wmmps_ac = psta->uapsd_bk&BIT(1);
4650 wmmps_ac = psta->uapsd_vi&BIT(1);
4654 wmmps_ac = psta->uapsd_vo&BIT(1);
4659 wmmps_ac = psta->uapsd_be&BIT(1);
4666 rtw_list_delete(&pxmitframe->list);
4669 psta->sleepq_ac_len--;
4671 if(psta->sleepq_ac_len>0)
4673 pxmitframe->attrib.mdata = 1;
4674 pxmitframe->attrib.eosp = 0;
4678 pxmitframe->attrib.mdata = 0;
4679 pxmitframe->attrib.eosp = 1;
4682 pxmitframe->attrib.triggered = 1;
4683 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4685 if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac))
4688 if(psta->tdls_sta_state & TDLS_LINKED_STATE )
4690 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4693 #endif //CONFIG_TDLS
4694 pstapriv->tim_bitmap &= ~BIT(psta->aid);
4696 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4697 //upate BCN for TIM IE
4698 //update_BCNTIM(padapter);
4699 update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
4700 //update_mask = BIT(0);
4706 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4707 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4712 #endif /* defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) */
4714 #ifdef CONFIG_XMIT_THREAD_MODE
4715 void enqueue_pending_xmitbuf(
4716 struct xmit_priv *pxmitpriv,
4717 struct xmit_buf *pxmitbuf)
4721 _adapter *pri_adapter = pxmitpriv->adapter;
4723 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4725 _enter_critical_bh(&pqueue->lock, &irql);
4726 rtw_list_delete(&pxmitbuf->list);
4727 rtw_list_insert_tail(&pxmitbuf->list, get_list_head(pqueue));
4728 _exit_critical_bh(&pqueue->lock, &irql);
4732 #if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE)
4733 if (pri_adapter->adapter_type > PRIMARY_ADAPTER)
4734 pri_adapter = pri_adapter->pbuddy_adapter;
4735 #endif //SDIO_HCI + CONCURRENT
4736 _rtw_up_sema(&(pri_adapter->xmitpriv.xmit_sema));
4740 void enqueue_pending_xmitbuf_to_head(
4741 struct xmit_priv *pxmitpriv,
4742 struct xmit_buf *pxmitbuf)
4746 _adapter *pri_adapter = pxmitpriv->adapter;
4748 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4750 _enter_critical_bh(&pqueue->lock, &irql);
4751 rtw_list_delete(&pxmitbuf->list);
4752 rtw_list_insert_head(&pxmitbuf->list, get_list_head(pqueue));
4753 _exit_critical_bh(&pqueue->lock, &irql);
4756 struct xmit_buf* dequeue_pending_xmitbuf(
4757 struct xmit_priv *pxmitpriv)
4760 struct xmit_buf *pxmitbuf;
4765 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4767 _enter_critical_bh(&pqueue->lock, &irql);
4769 if (_rtw_queue_empty(pqueue) == _FALSE)
4771 _list *plist, *phead;
4773 phead = get_list_head(pqueue);
4774 plist = get_next(phead);
4775 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
4776 rtw_list_delete(&pxmitbuf->list);
4779 _exit_critical_bh(&pqueue->lock, &irql);
4784 struct xmit_buf* dequeue_pending_xmitbuf_under_survey(
4785 struct xmit_priv *pxmitpriv)
4788 struct xmit_buf *pxmitbuf;
4789 #ifdef CONFIG_USB_HCI
4790 struct xmit_frame *pxmitframe;
4796 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4798 _enter_critical_bh(&pqueue->lock, &irql);
4800 if (_rtw_queue_empty(pqueue) == _FALSE)
4802 _list *plist, *phead;
4805 phead = get_list_head(pqueue);
4808 plist = get_next(plist);
4809 if (plist == phead) break;
4811 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
4813 #ifdef CONFIG_USB_HCI
4814 pxmitframe = (struct xmit_frame*)pxmitbuf->priv_data;
4817 type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_SIZE + pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
4821 DBG_871X("%s, !!!ERROR!!! For USB, TODO ITEM \n", __FUNCTION__);
4824 type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_OFFSET);
4827 if ((type == WIFI_PROBEREQ) ||
4828 (type == WIFI_DATA_NULL) ||
4829 (type == WIFI_QOS_DATA_NULL))
4831 rtw_list_delete(&pxmitbuf->list);
4838 _exit_critical_bh(&pqueue->lock, &irql);
4843 sint check_pending_xmitbuf(
4844 struct xmit_priv *pxmitpriv)
4850 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4852 _enter_critical_bh(&pqueue->lock, &irql);
4854 if(_rtw_queue_empty(pqueue) == _FALSE)
4857 _exit_critical_bh(&pqueue->lock, &irql);
4862 thread_return rtw_xmit_thread(thread_context context)
4869 padapter = (PADAPTER)context;
4871 thread_enter("RTW_XMIT_THREAD");
4874 err = rtw_hal_xmit_thread_handler(padapter);
4875 flush_signals_thread();
4876 } while (_SUCCESS == err);
4878 _rtw_up_sema(&padapter->xmitpriv.terminate_xmitthread_sema);
4884 bool rtw_xmit_ac_blocked(_adapter *adapter)
4886 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4888 struct mlme_ext_priv *mlmeext;
4889 struct mlme_ext_info *mlmeextinfo;
4890 bool blocked = _FALSE;
4893 for (i = 0; i < dvobj->iface_nums; i++) {
4894 iface = dvobj->padapters[i];
4895 mlmeext = &iface->mlmeextpriv;
4897 /* check scan state */
4898 if (mlmeext_scan_state(mlmeext) != SCAN_DISABLE
4899 && mlmeext_scan_state(mlmeext) != SCAN_BACK_OP
4905 if (mlmeext_scan_state(mlmeext) == SCAN_BACK_OP
4906 && !mlmeext_chk_scan_backop_flags(mlmeext, SS_BACKOP_TX_RESUME)
4917 void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)
4919 sctx->timeout_ms = timeout_ms;
4920 sctx->submit_time= rtw_get_current_time();
4921 #ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */
4922 init_completion(&sctx->done);
4924 sctx->status = RTW_SCTX_SUBMITTED;
4927 int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg)
4930 unsigned long expire;
4933 #ifdef PLATFORM_LINUX
4934 expire= sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;
4935 if (!wait_for_completion_timeout(&sctx->done, expire)) {
4936 /* timeout, do something?? */
4937 status = RTW_SCTX_DONE_TIMEOUT;
4938 DBG_871X("%s timeout: %s\n", __func__, msg);
4940 status = sctx->status;
4944 if (status == RTW_SCTX_DONE_SUCCESS) {
4951 bool rtw_sctx_chk_waring_status(int status)
4954 case RTW_SCTX_DONE_UNKNOWN:
4955 case RTW_SCTX_DONE_BUF_ALLOC:
4956 case RTW_SCTX_DONE_BUF_FREE:
4958 case RTW_SCTX_DONE_DRV_STOP:
4959 case RTW_SCTX_DONE_DEV_REMOVE:
4966 void rtw_sctx_done_err(struct submit_ctx **sctx, int status)
4969 if (rtw_sctx_chk_waring_status(status))
4970 DBG_871X("%s status:%d\n", __func__, status);
4971 (*sctx)->status = status;
4972 #ifdef PLATFORM_LINUX
4973 complete(&((*sctx)->done));
4979 void rtw_sctx_done(struct submit_ctx **sctx)
4981 rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);
4984 #ifdef CONFIG_XMIT_ACK
4986 #ifdef CONFIG_XMIT_ACK_POLLING
4987 s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter);
4990 * rtw_ack_tx_polling -
4991 * @pxmitpriv: xmit_priv to address ack_tx_ops
4992 * @timeout_ms: timeout msec
4994 * Init ack_tx_ops and then do c2h_evt_hdl() and polling ack_tx_ops repeatedly
4995 * till tx report or timeout
4996 * Returns: _SUCCESS if TX report ok, _FAIL for others
4998 int rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms)
5001 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
5002 _adapter *adapter = container_of(pxmitpriv, _adapter, xmitpriv);
5004 pack_tx_ops->submit_time = rtw_get_current_time();
5005 pack_tx_ops->timeout_ms = timeout_ms;
5006 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
5009 c2h_evt_hdl(adapter, NULL, rtw_hal_c2h_id_filter_ccx(adapter));
5010 if (pack_tx_ops->status != RTW_SCTX_SUBMITTED)
5013 if (rtw_is_drv_stopped(adapter)) {
5014 pack_tx_ops->status = RTW_SCTX_DONE_DRV_STOP;
5017 if (rtw_is_surprise_removed(adapter)) {
5018 pack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE;
5023 } while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms);
5025 if (pack_tx_ops->status == RTW_SCTX_SUBMITTED) {
5026 pack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT;
5027 DBG_871X("%s timeout\n", __func__);
5030 if (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS)
5037 int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)
5039 #ifdef CONFIG_XMIT_ACK_POLLING
5040 return rtw_ack_tx_polling(pxmitpriv, timeout_ms);
5042 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
5044 pack_tx_ops->submit_time = rtw_get_current_time();
5045 pack_tx_ops->timeout_ms = timeout_ms;
5046 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
5048 return rtw_sctx_wait(pack_tx_ops, __func__);
5052 void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)
5054 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
5056 if (pxmitpriv->ack_tx) {
5057 rtw_sctx_done_err(&pack_tx_ops, status);
5059 DBG_871X("%s ack_tx not set\n", __func__);
5062 #endif //CONFIG_XMIT_ACK