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
447 #ifdef CONFIG_80211AC_VHT
448 if (psta->vhtpriv.vht_option) {
449 sgi_80m= psta->vhtpriv.sgi_80m;
451 #endif //CONFIG_80211AC_VHT
453 sgi_20m = psta->htpriv.sgi_20m;
454 sgi_40m = psta->htpriv.sgi_40m;
458 switch(psta->bw_mode){
459 case CHANNEL_WIDTH_80:
462 case CHANNEL_WIDTH_40:
465 case CHANNEL_WIDTH_20:
474 static void update_attrib_vcs_info(_adapter *padapter, struct xmit_frame *pxmitframe)
477 struct pkt_attrib *pattrib = &pxmitframe->attrib;
478 //struct sta_info *psta = pattrib->psta;
479 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
480 struct mlme_ext_info *pmlmeinfo = &(pmlmeext->mlmext_info);
485 psta = pattrib->psta;
489 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
490 psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0] );
495 DBG_871X("%s, psta==NUL\n", __func__);
499 if(!(psta->state &_FW_LINKED))
501 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
506 if (pattrib->nr_frags != 1)
508 sz = padapter->xmitpriv.frag_len;
512 sz = pattrib->last_txcmdsz;
515 // (1) RTS_Threshold is compared to the MPDU, not MSDU.
516 // (2) If there are more than one frag in this MSDU, only the first frag uses protection frame.
517 // Other fragments are protected by previous fragment.
518 // So we only need to check the length of first fragment.
519 if(pmlmeext->cur_wireless_mode < WIRELESS_11_24N || padapter->registrypriv.wifi_spec)
521 if(sz > padapter->registrypriv.rts_thresh)
523 pattrib->vcs_mode = RTS_CTS;
528 pattrib->vcs_mode = RTS_CTS;
529 else if(pattrib->cts2self)
530 pattrib->vcs_mode = CTS_TO_SELF;
532 pattrib->vcs_mode = NONE_VCS;
541 if(pHTInfo->IOTAction & HT_IOT_ACT_FORCED_CTS2SELF)
543 pattrib->vcs_mode = CTS_TO_SELF;
544 pattrib->rts_rate = MGN_24M;
547 else if(pHTInfo->IOTAction & (HT_IOT_ACT_FORCED_RTS|HT_IOT_ACT_PURE_N_MODE))
549 pattrib->vcs_mode = RTS_CTS;
550 pattrib->rts_rate = MGN_24M;
556 if((pmlmeinfo->assoc_AP_vendor == HT_IOT_PEER_ATHEROS) && (pattrib->ampdu_en==_TRUE) &&
557 (padapter->securitypriv.dot11PrivacyAlgrthm == _AES_ ))
559 pattrib->vcs_mode = CTS_TO_SELF;
564 //check ERP protection
565 if(pattrib->rtsen || pattrib->cts2self)
568 pattrib->vcs_mode = RTS_CTS;
569 else if(pattrib->cts2self)
570 pattrib->vcs_mode = CTS_TO_SELF;
578 u8 HTOpMode = pmlmeinfo->HT_protection;
579 if((pmlmeext->cur_bwmode && (HTOpMode == 2 || HTOpMode == 3)) ||
580 (!pmlmeext->cur_bwmode && HTOpMode == 3) )
582 pattrib->vcs_mode = RTS_CTS;
588 if(sz > padapter->registrypriv.rts_thresh)
590 pattrib->vcs_mode = RTS_CTS;
594 //to do list: check MIMO power save condition.
596 //check AMPDU aggregation for TXOP
597 if((pattrib->ampdu_en==_TRUE) && (!IS_HARDWARE_TYPE_8812(padapter)))
599 pattrib->vcs_mode = RTS_CTS;
603 pattrib->vcs_mode = NONE_VCS;
608 //for debug : force driver control vrtl_carrier_sense.
609 if(padapter->driver_vcs_en==1)
611 //u8 driver_vcs_en; //Enable=1, Disable=0 driver control vrtl_carrier_sense.
612 //u8 driver_vcs_type;//force 0:disable VCS, 1:RTS-CTS, 2:CTS-to-self when vcs_en=1.
613 pattrib->vcs_mode = padapter->driver_vcs_type;
618 static void update_attrib_phy_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
620 struct mlme_ext_priv *mlmeext = &padapter->mlmeextpriv;
622 pattrib->rtsen = psta->rtsen;
623 pattrib->cts2self = psta->cts2self;
627 pattrib->triggered=0;
628 pattrib->ampdu_spacing = 0;
630 //qos_en, ht_en, init rate, ,bw, ch_offset, sgi
631 pattrib->qos_en = psta->qos_option;
633 pattrib->raid = psta->raid;
635 if (mlmeext->cur_bwmode < psta->bw_mode)
636 pattrib->bwmode = mlmeext->cur_bwmode;
638 pattrib->bwmode = psta->bw_mode;
640 pattrib->sgi = query_ra_short_GI(psta);
642 pattrib->ldpc = psta->ldpc;
643 pattrib->stbc = psta->stbc;
645 #ifdef CONFIG_80211N_HT
646 pattrib->ht_en = psta->htpriv.ht_option;
647 pattrib->ch_offset = psta->htpriv.ch_offset;
648 pattrib->ampdu_en = _FALSE;
650 if(padapter->driver_ampdu_spacing != 0xFF) //driver control AMPDU Density for peer sta's rx
651 pattrib->ampdu_spacing = padapter->driver_ampdu_spacing;
653 pattrib->ampdu_spacing = psta->htpriv.rx_ampdu_min_spacing;
654 #endif //CONFIG_80211N_HT
655 //if(pattrib->ht_en && psta->htpriv.ampdu_enable)
657 // if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
658 // pattrib->ampdu_en = _TRUE;
662 if (pattrib->direct_link==_TRUE) {
663 psta = pattrib->ptdls_sta;
665 pattrib->raid = psta->raid;
666 #ifdef CONFIG_80211N_HT
667 pattrib->bwmode = psta->bw_mode;
668 pattrib->ht_en = psta->htpriv.ht_option;
669 pattrib->ch_offset = psta->htpriv.ch_offset;
670 pattrib->sgi= query_ra_short_GI(psta);
671 #endif /* CONFIG_80211N_HT */
673 #endif /* CONFIG_TDLS */
675 pattrib->retry_ctrl = _FALSE;
677 #ifdef CONFIG_AUTO_AP_MODE
678 if(psta->isrc && psta->pid>0)
679 pattrib->pctrl = _TRUE;
684 static s32 update_attrib_sec_info(_adapter *padapter, struct pkt_attrib *pattrib, struct sta_info *psta)
687 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
688 struct security_priv *psecuritypriv = &padapter->securitypriv;
689 sint bmcast = IS_MCAST(pattrib->ra);
691 _rtw_memset(pattrib->dot118021x_UncstKey.skey, 0, 16);
692 _rtw_memset(pattrib->dot11tkiptxmickey.skey, 0, 16);
693 pattrib->mac_id = psta->mac_id;
695 if (psta->ieee8021x_blocked == _TRUE)
697 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\n psta->ieee8021x_blocked == _TRUE \n"));
699 pattrib->encrypt = 0;
701 if((pattrib->ether_type != 0x888e) && (check_fwstate(pmlmepriv, WIFI_MP_STATE) == _FALSE))
703 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("\npsta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%.4x) != 0x888e\n",pattrib->ether_type));
704 #ifdef DBG_TX_DROP_FRAME
705 DBG_871X("DBG_TX_DROP_FRAME %s psta->ieee8021x_blocked == _TRUE, pattrib->ether_type(%04x) != 0x888e\n", __FUNCTION__,pattrib->ether_type);
713 GET_ENCRY_ALGO(psecuritypriv, psta, pattrib->encrypt, bmcast);
715 #ifdef CONFIG_WAPI_SUPPORT
716 if(pattrib->ether_type == 0x88B4)
717 pattrib->encrypt=_NO_PRIVACY_;
720 switch(psecuritypriv->dot11AuthAlgrthm)
722 case dot11AuthAlgrthm_Open:
723 case dot11AuthAlgrthm_Shared:
724 case dot11AuthAlgrthm_Auto:
725 pattrib->key_idx = (u8)psecuritypriv->dot11PrivacyKeyIndex;
727 case dot11AuthAlgrthm_8021X:
729 pattrib->key_idx = (u8)psecuritypriv->dot118021XGrpKeyid;
731 pattrib->key_idx = 0;
734 pattrib->key_idx = 0;
738 //For WPS 1.0 WEP, driver should not encrypt EAPOL Packet for WPS handshake.
739 if (((pattrib->encrypt ==_WEP40_)||(pattrib->encrypt ==_WEP104_)) && (pattrib->ether_type == 0x888e))
740 pattrib->encrypt=_NO_PRIVACY_;
745 if (pattrib->direct_link == _TRUE) {
746 if (pattrib->encrypt > 0)
747 pattrib->encrypt = _AES_;
751 switch (pattrib->encrypt)
756 pattrib->icv_len = 4;
757 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
762 pattrib->icv_len = 4;
764 if(psecuritypriv->busetkipkey==_FAIL)
766 #ifdef DBG_TX_DROP_FRAME
767 DBG_871X("DBG_TX_DROP_FRAME %s psecuritypriv->busetkipkey(%d)==_FAIL drop packet\n", __FUNCTION__, psecuritypriv->busetkipkey);
774 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
776 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
779 _rtw_memcpy(pattrib->dot11tkiptxmickey.skey, psta->dot11tkiptxmickey.skey, 16);
786 pattrib->icv_len = 8;
789 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
791 AES_IV(pattrib->iv, psta->dot11txpn, 0);
795 #ifdef CONFIG_WAPI_SUPPORT
797 pattrib->iv_len = 18;
798 pattrib->icv_len = 16;
799 rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);
804 pattrib->icv_len = 0;
808 if(pattrib->encrypt>0)
809 _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
811 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_,
812 ("update_attrib: encrypt=%d securitypriv.sw_encrypt=%d\n",
813 pattrib->encrypt, padapter->securitypriv.sw_encrypt));
815 if (pattrib->encrypt &&
816 ((padapter->securitypriv.sw_encrypt == _TRUE) || (psecuritypriv->hw_decrypted == _FALSE)))
818 pattrib->bswenc = _TRUE;
819 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,
820 ("update_attrib: encrypt=%d securitypriv.hw_decrypted=%d bswenc=_TRUE\n",
821 pattrib->encrypt, padapter->securitypriv.sw_encrypt));
823 pattrib->bswenc = _FALSE;
824 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("update_attrib: bswenc=_FALSE\n"));
827 #if defined(CONFIG_CONCURRENT_MODE) && !defined(DYNAMIC_CAMID_ALLOC)
828 if((pattrib->encrypt && bmcast) || (pattrib->encrypt ==_WEP40_) || (pattrib->encrypt ==_WEP104_))
830 pattrib->bswenc = _TRUE;//force using sw enc.
833 #ifdef DYNAMIC_CAMID_ALLOC
834 if (pattrib->encrypt && bmcast && _rtw_camctl_chk_flags(padapter, SEC_STATUS_STA_PK_GK_CONFLICT_DIS_BMC_SEARCH))
835 pattrib->bswenc = _TRUE;
838 #ifdef CONFIG_WAPI_SUPPORT
839 if(pattrib->encrypt == _SMS4_)
840 pattrib->bswenc = _FALSE;
849 u8 qos_acm(u8 acm_mask, u8 priority)
851 u8 change_priority = priority;
857 if(acm_mask & BIT(1))
865 if(acm_mask & BIT(2))
870 if(acm_mask & BIT(3))
874 DBG_871X("qos_acm(): invalid pattrib->priority: %d!!!\n", priority);
878 return change_priority;
881 static void set_qos(struct pkt_file *ppktfile, struct pkt_attrib *pattrib)
883 struct ethhdr etherhdr;
885 s32 UserPriority = 0;
888 _rtw_open_pktfile(ppktfile->pkt, ppktfile);
889 _rtw_pktfile_read(ppktfile, (unsigned char*)ðerhdr, ETH_HLEN);
891 // get UserPriority from IP hdr
892 if (pattrib->ether_type == 0x0800) {
893 _rtw_pktfile_read(ppktfile, (u8*)&ip_hdr, sizeof(ip_hdr));
894 // UserPriority = (ntohs(ip_hdr.tos) >> 5) & 0x3;
895 UserPriority = ip_hdr.tos >> 5;
898 else if (pattrib->ether_type == 0x888e) {
899 // "When priority processing of data frames is supported,
900 // a STA's SME should send EAPOL-Key frames at the highest priority."
904 pattrib->priority = UserPriority;
905 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
906 pattrib->subtype = WIFI_QOS_DATA_TYPE;
910 u8 rtw_check_tdls_established(_adapter *padapter, struct pkt_attrib *pattrib)
912 pattrib->ptdls_sta = NULL;
914 pattrib->direct_link = _FALSE;
915 if (padapter->tdlsinfo.link_established == _TRUE) {
916 pattrib->ptdls_sta = rtw_get_stainfo(&padapter->stapriv, pattrib->dst);
918 if((pattrib->ptdls_sta!=NULL)&&
919 (pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE)&&
920 (pattrib->ether_type!=0x0806)){
921 pattrib->direct_link = _TRUE;
922 //DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
925 if (pattrib->ptdls_sta != NULL &&
926 pattrib->ptdls_sta->tdls_sta_state & TDLS_LINKED_STATE) {
927 pattrib->direct_link = _TRUE;
929 DBG_871X("send ptk to "MAC_FMT" using direct link\n", MAC_ARG(pattrib->dst));
933 /* ARP frame may be helped by AP*/
934 if (pattrib->ether_type != 0x0806) {
935 pattrib->direct_link = _FALSE;
940 return pattrib->direct_link;
943 s32 update_tdls_attrib(_adapter *padapter, struct pkt_attrib *pattrib)
946 struct sta_info *psta = NULL;
947 struct sta_priv *pstapriv = &padapter->stapriv;
948 struct security_priv *psecuritypriv = &padapter->securitypriv;
949 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
950 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
954 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
960 pattrib->mac_id = psta->mac_id;
961 pattrib->psta = psta;
962 pattrib->ack_policy = 0;
964 pattrib->pkt_hdrlen = ETH_HLEN;
966 // [TDLS] TODO: setup req/rsp should be AC_BK
967 if (pqospriv->qos_option && psta->qos_option) {
968 pattrib->priority = 4; //tdls management frame should be AC_VI
969 pattrib->hdrlen = WLAN_HDR_A3_QOS_LEN;
970 pattrib->subtype = WIFI_QOS_DATA_TYPE;
972 pattrib->priority = 0;
973 pattrib->hdrlen = WLAN_HDR_A3_LEN;
974 pattrib->subtype = WIFI_DATA_TYPE;
978 if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
984 update_attrib_phy_info(padapter, pattrib, psta);
994 //get non-qos hw_ssn control register,mapping to REG_HW_SEQ0,1,2,3
995 inline u8 rtw_get_hwseq_no(_adapter *padapter)
998 #ifdef CONFIG_CONCURRENT_MODE
999 if(padapter->adapter_type == SECONDARY_ADAPTER)
1003 #endif //CONFIG_CONCURRENT_MODE
1006 static s32 update_attrib(_adapter *padapter, _pkt *pkt, struct pkt_attrib *pattrib)
1009 struct pkt_file pktfile;
1010 struct sta_info *psta = NULL;
1011 struct ethhdr etherhdr;
1014 struct sta_priv *pstapriv = &padapter->stapriv;
1015 struct security_priv *psecuritypriv = &padapter->securitypriv;
1016 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1017 struct qos_priv *pqospriv= &pmlmepriv->qospriv;
1018 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1019 sint res = _SUCCESS;
1023 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib);
1025 _rtw_open_pktfile(pkt, &pktfile);
1026 i = _rtw_pktfile_read(&pktfile, (u8*)ðerhdr, ETH_HLEN);
1028 pattrib->ether_type = ntohs(etherhdr.h_proto);
1031 _rtw_memcpy(pattrib->dst, ðerhdr.h_dest, ETH_ALEN);
1032 _rtw_memcpy(pattrib->src, ðerhdr.h_source, ETH_ALEN);
1035 if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
1036 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
1037 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1038 _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
1039 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_adhoc);
1041 else if (check_fwstate(pmlmepriv, WIFI_STATION_STATE)) {
1043 if (rtw_check_tdls_established(padapter, pattrib) == _TRUE)
1044 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN); /* For TDLS direct link Tx, set ra to be same to dst */
1047 _rtw_memcpy(pattrib->ra, get_bssid(pmlmepriv), ETH_ALEN);
1048 _rtw_memcpy(pattrib->ta, adapter_mac_addr(padapter), ETH_ALEN);
1049 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_sta);
1051 else if (check_fwstate(pmlmepriv, WIFI_AP_STATE)) {
1052 _rtw_memcpy(pattrib->ra, pattrib->dst, ETH_ALEN);
1053 _rtw_memcpy(pattrib->ta, get_bssid(pmlmepriv), ETH_ALEN);
1054 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_ap);
1057 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_unknown);
1059 bmcast = IS_MCAST(pattrib->ra);
1061 psta = rtw_get_bcmc_stainfo(padapter);
1062 if (psta == NULL) { /* if we cannot get psta => drop the pkt */
1063 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sta);
1064 RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT "\n", MAC_ARG(pattrib->ra)));
1065 #ifdef DBG_TX_DROP_FRAME
1066 DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra));
1072 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
1073 if (psta == NULL) { /* if we cannot get psta => drop the pkt */
1074 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_sta);
1075 RT_TRACE(_module_rtl871x_xmit_c_, _drv_alert_, ("\nupdate_attrib => get sta_info fail, ra:" MAC_FMT"\n", MAC_ARG(pattrib->ra)));
1076 #ifdef DBG_TX_DROP_FRAME
1077 DBG_871X("DBG_TX_DROP_FRAME %s get sta_info fail, ra:" MAC_FMT"\n", __func__, MAC_ARG(pattrib->ra));
1081 } else if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE && !(psta->state & _FW_LINKED)) {
1082 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_ucast_ap_link);
1088 if (!(psta->state & _FW_LINKED)) {
1089 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_link);
1090 DBG_871X("%s, psta("MAC_FMT")->state(0x%x) != _FW_LINKED\n", __func__, MAC_ARG(psta->hwaddr), psta->state);
1095 pattrib->pktlen = pktfile.pkt_len;
1097 /* TODO: 802.1Q VLAN header */
1100 if (ETH_P_IP == pattrib->ether_type) {
1103 _rtw_pktfile_read(&pktfile, ip, 20);
1105 if (GET_IPV4_IHL(ip) * 4 > 20)
1106 _rtw_pktfile_read(&pktfile, NULL, GET_IPV4_IHL(ip) - 20);
1108 pattrib->icmp_pkt = 0;
1109 pattrib->dhcp_pkt = 0;
1111 if (GET_IPV4_PROTOCOL(ip) == 0x01) { /* ICMP */
1112 pattrib->icmp_pkt = 1;
1113 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_icmp);
1115 } else if (GET_IPV4_PROTOCOL(ip) == 0x11) { /* UDP */
1118 _rtw_pktfile_read(&pktfile, udp, 8);
1120 if ((GET_UDP_SRC(udp) == 68 && GET_UDP_DST(udp) == 67)
1121 || (GET_UDP_SRC(udp) == 67 && GET_UDP_DST(udp) == 68)
1123 /* 67 : UDP BOOTP server, 68 : UDP BOOTP client */
1124 if (pattrib->pktlen > 282) { /* MINIMUM_DHCP_PACKET_SIZE */
1125 pattrib->dhcp_pkt = 1;
1126 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_dhcp);
1128 DBG_871X("send DHCP packet\n");
1132 } else if (GET_IPV4_PROTOCOL(ip) == 0x06 /* TCP */
1133 && rtw_st_ctl_chk_reg_s_proto(&psta->st_ctl, 0x06) == _TRUE
1137 _rtw_pktfile_read(&pktfile, tcp, 20);
1139 if (rtw_st_ctl_chk_reg_rule(&psta->st_ctl, padapter, IPV4_SRC(ip), TCP_SRC(tcp), IPV4_DST(ip), TCP_DST(tcp)) == _TRUE) {
1140 if (GET_TCP_SYN(tcp) && GET_TCP_ACK(tcp)) {
1141 session_tracker_add_cmd(padapter, psta
1142 , IPV4_SRC(ip), TCP_SRC(tcp)
1143 , IPV4_SRC(ip), TCP_DST(tcp));
1144 if (DBG_SESSION_TRACKER)
1145 DBG_871X(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" SYN-ACK\n"
1146 , FUNC_ADPT_ARG(padapter)
1147 , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp))
1148 , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp)));
1150 if (GET_TCP_FIN(tcp)) {
1151 session_tracker_del_cmd(padapter, psta
1152 , IPV4_SRC(ip), TCP_SRC(tcp)
1153 , IPV4_SRC(ip), TCP_DST(tcp));
1154 if (DBG_SESSION_TRACKER)
1155 DBG_871X(FUNC_ADPT_FMT" local:"IP_FMT":"PORT_FMT", remote:"IP_FMT":"PORT_FMT" FIN\n"
1156 , FUNC_ADPT_ARG(padapter)
1157 , IP_ARG(IPV4_SRC(ip)), PORT_ARG(TCP_SRC(tcp))
1158 , IP_ARG(IPV4_DST(ip)), PORT_ARG(TCP_DST(tcp)));
1163 } else if (0x888e == pattrib->ether_type) {
1164 DBG_871X_LEVEL(_drv_always_, "send eapol packet\n");
1167 if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1))
1168 rtw_set_scan_deny(padapter, 3000);
1171 // If EAPOL , ARP , OR DHCP packet, driver must be in active mode.
1172 #ifdef CONFIG_WAPI_SUPPORT
1173 if ( (pattrib->ether_type == 0x88B4) || (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1174 #else //!CONFIG_WAPI_SUPPORT
1176 if ( (pattrib->ether_type == 0x0806) || (pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1177 #else // only ICMP/DHCP packets is as SPECIAL_PACKET, and leave LPS when tx IMCP/DHCP packets.
1178 //if ((pattrib->ether_type == 0x888e) || (pattrib->dhcp_pkt == 1) )
1179 if (pattrib->icmp_pkt==1)
1181 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_LEAVE, 1);
1183 else if(pattrib->dhcp_pkt==1)
1187 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_active);
1188 rtw_lps_ctrl_wk_cmd(padapter, LPS_CTRL_SPECIAL_PACKET, 1);
1192 #ifdef CONFIG_BEAMFORMING
1193 update_attrib_txbf_info(padapter, pattrib, psta);
1197 if(update_attrib_sec_info(padapter, pattrib, psta) == _FAIL)
1199 DBG_COUNTER(padapter->tx_logs.core_tx_upd_attrib_err_sec);
1204 update_attrib_phy_info(padapter, pattrib, psta);
1206 //DBG_8192C("%s ==> mac_id(%d)\n",__FUNCTION__,pattrib->mac_id );
1208 pattrib->psta = psta;
1213 pattrib->ack_policy = 0;
1214 // get ether_hdr_len
1215 pattrib->pkt_hdrlen = ETH_HLEN;//(pattrib->ether_type == 0x8100) ? (14 + 4 ): 14; //vlan tag
1217 pattrib->hdrlen = WLAN_HDR_A3_LEN;
1218 pattrib->subtype = WIFI_DATA_TYPE;
1219 pattrib->priority = 0;
1221 if (check_fwstate(pmlmepriv, WIFI_AP_STATE|WIFI_ADHOC_STATE|WIFI_ADHOC_MASTER_STATE))
1224 set_qos(&pktfile, pattrib);
1229 if (pattrib->direct_link == _TRUE) {
1230 if (pattrib->qos_en)
1231 set_qos(&pktfile, pattrib);
1235 if (pqospriv->qos_option) {
1236 set_qos(&pktfile, pattrib);
1238 if (pmlmepriv->acm_mask != 0)
1239 pattrib->priority = qos_acm(pmlmepriv->acm_mask, pattrib->priority);
1244 //pattrib->priority = 5; //force to used VI queue, for testing
1245 pattrib->hw_ssn_sel = pxmitpriv->hw_ssn_seq_no;
1246 rtw_set_tx_chksum_offload(pkt, pattrib);
1255 static s32 xmitframe_addmic(_adapter *padapter, struct xmit_frame *pxmitframe){
1256 sint curfragnum,length;
1257 u8 *pframe, *payload,mic[8];
1258 struct mic_data micdata;
1259 //struct sta_info *stainfo;
1260 struct qos_priv *pqospriv= &(padapter->mlmepriv.qospriv);
1261 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1262 struct security_priv *psecuritypriv=&padapter->securitypriv;
1263 struct xmit_priv *pxmitpriv=&padapter->xmitpriv;
1264 u8 priority[4]={0x0,0x0,0x0,0x0};
1265 u8 hw_hdr_offset = 0;
1266 sint bmcst = IS_MCAST(pattrib->ra);
1271 stainfo = pattrib->psta;
1275 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
1276 stainfo=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
1281 DBG_871X("%s, psta==NUL\n", __func__);
1285 if(!(stainfo->state &_FW_LINKED))
1287 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, stainfo->state);
1294 #ifdef CONFIG_USB_TX_AGGREGATION
1295 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);;
1297 #ifdef CONFIG_TX_EARLY_MODE
1298 hw_hdr_offset = TXDESC_OFFSET+ EARLY_MODE_INFO_SIZE;
1300 hw_hdr_offset = TXDESC_OFFSET;
1304 if(pattrib->encrypt ==_TKIP_)//if(psecuritypriv->dot11PrivacyAlgrthm==_TKIP_PRIVACY_)
1307 //if(stainfo!= NULL)
1309 u8 null_key[16]={0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0};
1311 pframe = pxmitframe->buf_addr + hw_hdr_offset;
1315 if(_rtw_memcmp(psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey, null_key, 16)==_TRUE){
1316 //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
1317 //rtw_msleep_os(10);
1320 //start to calculate the mic code
1321 rtw_secmicsetkey(&micdata, psecuritypriv->dot118021XGrptxmickey[psecuritypriv->dot118021XGrpKeyid].skey);
1325 if(_rtw_memcmp(&pattrib->dot11tkiptxmickey.skey[0],null_key, 16)==_TRUE){
1326 //DbgPrint("\nxmitframe_addmic:stainfo->dot11tkiptxmickey==0\n");
1327 //rtw_msleep_os(10);
1330 //start to calculate the mic code
1331 rtw_secmicsetkey(&micdata, &pattrib->dot11tkiptxmickey.skey[0]);
1334 if(pframe[1]&1){ //ToDS==1
1335 rtw_secmicappend(&micdata, &pframe[16], 6); //DA
1336 if(pframe[1]&2) //From Ds==1
1337 rtw_secmicappend(&micdata, &pframe[24], 6);
1339 rtw_secmicappend(&micdata, &pframe[10], 6);
1342 rtw_secmicappend(&micdata, &pframe[4], 6); //DA
1343 if(pframe[1]&2) //From Ds==1
1344 rtw_secmicappend(&micdata, &pframe[16], 6);
1346 rtw_secmicappend(&micdata, &pframe[10], 6);
1350 //if(pqospriv->qos_option==1)
1352 priority[0]=(u8)pxmitframe->attrib.priority;
1355 rtw_secmicappend(&micdata, &priority[0], 4);
1359 for(curfragnum=0;curfragnum<pattrib->nr_frags;curfragnum++){
1360 payload=(u8 *)RND4((SIZE_PTR)(payload));
1361 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",
1362 curfragnum,*payload, *(payload+1),*(payload+2),*(payload+3),*(payload+4),*(payload+5),*(payload+6),*(payload+7)));
1364 payload=payload+pattrib->hdrlen+pattrib->iv_len;
1365 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d pattrib->hdrlen=%d pattrib->iv_len=%d",curfragnum,pattrib->hdrlen,pattrib->iv_len));
1366 if((curfragnum+1)==pattrib->nr_frags){
1367 length=pattrib->last_txcmdsz-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
1368 rtw_secmicappend(&micdata, payload,length);
1369 payload=payload+length;
1372 length=pxmitpriv->frag_len-pattrib->hdrlen-pattrib->iv_len-( (pattrib->bswenc) ? pattrib->icv_len : 0);
1373 rtw_secmicappend(&micdata, payload, length);
1374 payload=payload+length+pattrib->icv_len;
1375 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("curfragnum=%d length=%d pattrib->icv_len=%d",curfragnum,length,pattrib->icv_len));
1378 rtw_secgetmic(&micdata,&(mic[0]));
1379 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: before add mic code!!!\n"));
1380 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: pattrib->last_txcmdsz=%d!!!\n",pattrib->last_txcmdsz));
1381 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\
1382 mic[4]=0x%.2x ,mic[5]=0x%.2x ,mic[6]=0x%.2x ,mic[7]=0x%.2x !!!!\n",
1383 mic[0],mic[1],mic[2],mic[3],mic[4],mic[5],mic[6],mic[7]));
1384 //add mic code and add the mic code length in last_txcmdsz
1386 _rtw_memcpy(payload, &(mic[0]),8);
1387 pattrib->last_txcmdsz+=8;
1389 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("\n ========last pkt========\n"));
1390 payload=payload-pattrib->last_txcmdsz+8;
1391 for(curfragnum=0;curfragnum<pattrib->last_txcmdsz;curfragnum=curfragnum+8)
1392 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,(" %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x, %.2x ",
1393 *(payload+curfragnum), *(payload+curfragnum+1), *(payload+curfragnum+2),*(payload+curfragnum+3),
1394 *(payload+curfragnum+4),*(payload+curfragnum+5),*(payload+curfragnum+6),*(payload+curfragnum+7)));
1398 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("xmitframe_addmic: rtw_get_stainfo==NULL!!!\n"));
1408 static s32 xmitframe_swencrypt(_adapter *padapter, struct xmit_frame *pxmitframe){
1410 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1411 //struct security_priv *psecuritypriv=&padapter->securitypriv;
1415 //if((psecuritypriv->sw_encrypt)||(pattrib->bswenc))
1418 //DBG_871X("start xmitframe_swencrypt\n");
1419 RT_TRACE(_module_rtl871x_xmit_c_,_drv_alert_,("### xmitframe_swencrypt\n"));
1420 switch(pattrib->encrypt){
1423 rtw_wep_encrypt(padapter, (u8 *)pxmitframe);
1426 rtw_tkip_encrypt(padapter, (u8 *)pxmitframe);
1429 rtw_aes_encrypt(padapter, (u8 * )pxmitframe);
1431 #ifdef CONFIG_WAPI_SUPPORT
1433 rtw_sms4_encrypt(padapter, (u8 * )pxmitframe);
1440 RT_TRACE(_module_rtl871x_xmit_c_,_drv_notice_,("### xmitframe_hwencrypt\n"));
1448 s32 rtw_make_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib)
1452 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
1453 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1454 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1455 u8 qos_option = _FALSE;
1456 sint res = _SUCCESS;
1457 u16 *fctrl = &pwlanhdr->frame_ctl;
1459 //struct sta_info *psta;
1461 //sint bmcst = IS_MCAST(pattrib->ra);
1466 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1467 if(pattrib->psta != psta)
1469 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1475 DBG_871X("%s, psta==NUL\n", __func__);
1479 if(!(psta->state &_FW_LINKED))
1481 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1486 _rtw_memset(hdr, 0, WLANHDR_OFFSET);
1488 SetFrameSubType(fctrl, pattrib->subtype);
1490 if (pattrib->subtype & WIFI_DATA_TYPE)
1492 if ((check_fwstate(pmlmepriv, WIFI_STATION_STATE) == _TRUE)) {
1494 if(pattrib->direct_link == _TRUE){
1495 //TDLS data transfer, ToDS=0, FrDs=0
1496 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1497 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1498 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1500 if (pattrib->qos_en)
1504 #endif //CONFIG_TDLS
1506 //to_ds = 1, fr_ds = 0;
1507 // 1.Data transfer to AP
1508 // 2.Arp pkt will relayed by AP
1510 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1511 _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
1512 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1514 if (pqospriv->qos_option)
1518 else if ((check_fwstate(pmlmepriv, WIFI_AP_STATE) == _TRUE) ) {
1519 //to_ds = 0, fr_ds = 1;
1521 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1522 _rtw_memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
1523 _rtw_memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
1528 else if ((check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) == _TRUE) ||
1529 (check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE) == _TRUE)) {
1530 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1531 _rtw_memcpy(pwlanhdr->addr2, pattrib->ta, ETH_ALEN);
1532 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1538 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv)));
1546 if (pattrib->encrypt)
1551 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
1553 if (pattrib->priority)
1554 SetPriority(qc, pattrib->priority);
1556 SetEOSP(qc, pattrib->eosp);
1558 SetAckpolicy(qc, pattrib->ack_policy);
1561 //TODO: fill HT Control Field
1563 //Update Seq Num will be handled by f/w
1565 struct sta_info *psta;
1566 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1567 if(pattrib->psta != psta)
1569 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1575 DBG_871X("%s, psta==NUL\n", __func__);
1579 if(!(psta->state &_FW_LINKED))
1581 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1588 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1589 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1590 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
1592 SetSeqNum(hdr, pattrib->seqnum);
1594 #ifdef CONFIG_80211N_HT
1595 //check if enable ampdu
1596 if(pattrib->ht_en && psta->htpriv.ampdu_enable)
1598 if(psta->htpriv.agg_enable_bitmap & BIT(pattrib->priority))
1599 pattrib->ampdu_en = _TRUE;
1602 //re-check if enable ampdu by BA_starting_seqctrl
1603 if(pattrib->ampdu_en == _TRUE)
1607 tx_seq = psta->BA_starting_seqctrl[pattrib->priority & 0x0f];
1609 //check BA_starting_seqctrl
1610 if(SN_LESS(pattrib->seqnum, tx_seq))
1612 //DBG_871X("tx ampdu seqnum(%d) < tx_seq(%d)\n", pattrib->seqnum, tx_seq);
1613 pattrib->ampdu_en = _FALSE;//AGG BK
1615 else if(SN_EQUAL(pattrib->seqnum, tx_seq))
1617 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (tx_seq+1)&0xfff;
1619 pattrib->ampdu_en = _TRUE;//AGG EN
1623 //DBG_871X("tx ampdu over run\n");
1624 psta->BA_starting_seqctrl[pattrib->priority & 0x0f] = (pattrib->seqnum+1)&0xfff;
1625 pattrib->ampdu_en = _TRUE;//AGG EN
1629 #endif //CONFIG_80211N_HT
1646 s32 rtw_txframes_pending(_adapter *padapter)
1648 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
1650 return ((_rtw_queue_empty(&pxmitpriv->be_pending) == _FALSE) ||
1651 (_rtw_queue_empty(&pxmitpriv->bk_pending) == _FALSE) ||
1652 (_rtw_queue_empty(&pxmitpriv->vi_pending) == _FALSE) ||
1653 (_rtw_queue_empty(&pxmitpriv->vo_pending) == _FALSE));
1656 s32 rtw_txframes_sta_ac_pending(_adapter *padapter, struct pkt_attrib *pattrib)
1658 struct sta_info *psta;
1659 struct tx_servq *ptxservq;
1660 int priority = pattrib->priority;
1664 psta = pattrib->psta;
1668 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
1669 psta=rtw_get_stainfo(&padapter->stapriv ,&pattrib->ra[0]);
1672 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1673 if(pattrib->psta != psta)
1675 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
1681 DBG_871X("%s, psta==NUL\n", __func__);
1685 if(!(psta->state &_FW_LINKED))
1687 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
1695 ptxservq = &(psta->sta_xmitpriv.bk_q);
1699 ptxservq = &(psta->sta_xmitpriv.vi_q);
1703 ptxservq = &(psta->sta_xmitpriv.vo_q);
1708 ptxservq = &(psta->sta_xmitpriv.be_q);
1713 return ptxservq->qcnt;
1718 int rtw_build_tdls_ies(_adapter * padapter, struct xmit_frame * pxmitframe, u8 *pframe, struct tdls_txmgmt *ptxmgmt)
1722 switch(ptxmgmt->action_code){
1723 case TDLS_SETUP_REQUEST:
1724 rtw_build_tdls_setup_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1726 case TDLS_SETUP_RESPONSE:
1727 rtw_build_tdls_setup_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1729 case TDLS_SETUP_CONFIRM:
1730 rtw_build_tdls_setup_cfm_ies(padapter, pxmitframe, pframe, ptxmgmt);
1733 rtw_build_tdls_teardown_ies(padapter, pxmitframe, pframe, ptxmgmt);
1735 case TDLS_DISCOVERY_REQUEST:
1736 rtw_build_tdls_dis_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1738 case TDLS_PEER_TRAFFIC_INDICATION:
1739 rtw_build_tdls_peer_traffic_indication_ies(padapter, pxmitframe, pframe, ptxmgmt);
1741 #ifdef CONFIG_TDLS_CH_SW
1742 case TDLS_CHANNEL_SWITCH_REQUEST:
1743 rtw_build_tdls_ch_switch_req_ies(padapter, pxmitframe, pframe, ptxmgmt);
1745 case TDLS_CHANNEL_SWITCH_RESPONSE:
1746 rtw_build_tdls_ch_switch_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1749 case TDLS_PEER_TRAFFIC_RESPONSE:
1750 rtw_build_tdls_peer_traffic_rsp_ies(padapter, pxmitframe, pframe, ptxmgmt);
1753 case TUNNELED_PROBE_REQ:
1754 rtw_build_tunneled_probe_req_ies(padapter, pxmitframe, pframe);
1756 case TUNNELED_PROBE_RSP:
1757 rtw_build_tunneled_probe_rsp_ies(padapter, pxmitframe, pframe);
1768 s32 rtw_make_tdls_wlanhdr (_adapter *padapter , u8 *hdr, struct pkt_attrib *pattrib, struct tdls_txmgmt *ptxmgmt)
1771 struct rtw_ieee80211_hdr *pwlanhdr = (struct rtw_ieee80211_hdr *)hdr;
1772 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1773 struct qos_priv *pqospriv = &pmlmepriv->qospriv;
1774 struct sta_priv *pstapriv = &padapter->stapriv;
1775 struct sta_info *psta=NULL, *ptdls_sta=NULL;
1776 u8 tdls_seq=0, baddr[ETH_ALEN] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0xff };
1778 sint res = _SUCCESS;
1779 u16 *fctrl = &pwlanhdr->frame_ctl;
1783 _rtw_memset(hdr, 0, WLANHDR_OFFSET);
1785 SetFrameSubType(fctrl, pattrib->subtype);
1787 switch(ptxmgmt->action_code){
1788 case TDLS_SETUP_REQUEST:
1789 case TDLS_SETUP_RESPONSE:
1790 case TDLS_SETUP_CONFIRM:
1791 case TDLS_PEER_TRAFFIC_INDICATION:
1792 case TDLS_PEER_PSM_REQUEST:
1793 case TUNNELED_PROBE_REQ:
1794 case TUNNELED_PROBE_RSP:
1795 case TDLS_DISCOVERY_REQUEST:
1797 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1798 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1799 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1801 case TDLS_CHANNEL_SWITCH_REQUEST:
1802 case TDLS_CHANNEL_SWITCH_RESPONSE:
1803 case TDLS_PEER_PSM_RESPONSE:
1804 case TDLS_PEER_TRAFFIC_RESPONSE:
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);
1811 if(ptxmgmt->status_code == _RSON_TDLS_TEAR_UN_RSN_)
1813 _rtw_memcpy(pwlanhdr->addr1, pattrib->dst, ETH_ALEN);
1814 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1815 _rtw_memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
1821 _rtw_memcpy(pwlanhdr->addr1, get_bssid(pmlmepriv), ETH_ALEN);
1822 _rtw_memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
1823 _rtw_memcpy(pwlanhdr->addr3, pattrib->dst, ETH_ALEN);
1828 if (pattrib->encrypt)
1831 if(ptxmgmt->action_code == TDLS_PEER_TRAFFIC_RESPONSE)
1836 if (pqospriv->qos_option)
1838 qc = (unsigned short *)(hdr + pattrib->hdrlen - 2);
1839 if (pattrib->priority)
1840 SetPriority(qc, pattrib->priority);
1841 SetAckpolicy(qc, pattrib->ack_policy);
1844 psta = pattrib->psta;
1846 // 1. update seq_num per link by sta_info
1847 // 2. rewrite encrypt to _AES_, also rewrite iv_len, icv_len
1849 ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
1851 ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1852 ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1853 pattrib->seqnum = ptdls_sta->sta_xmitpriv.txseq_tid[pattrib->priority];
1854 SetSeqNum(hdr, pattrib->seqnum);
1856 if (pattrib->encrypt){
1857 pattrib->encrypt= _AES_;
1860 pattrib->bswenc = _FALSE;
1862 pattrib->mac_id = ptdls_sta->mac_id;
1868 psta->sta_xmitpriv.txseq_tid[pattrib->priority]++;
1869 psta->sta_xmitpriv.txseq_tid[pattrib->priority] &= 0xFFF;
1870 pattrib->seqnum = psta->sta_xmitpriv.txseq_tid[pattrib->priority];
1871 SetSeqNum(hdr, pattrib->seqnum);
1882 s32 rtw_xmit_tdls_coalesce(_adapter * padapter, struct xmit_frame * pxmitframe, struct tdls_txmgmt *ptxmgmt)
1886 u8 *pframe, *mem_start;
1888 struct sta_info *psta;
1889 struct sta_priv *pstapriv = &padapter->stapriv;
1890 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
1891 struct pkt_attrib *pattrib = &pxmitframe->attrib;
1893 s32 bmcst = IS_MCAST(pattrib->ra);
1898 if (pattrib->psta) {
1899 psta = pattrib->psta;
1902 psta = rtw_get_bcmc_stainfo(padapter);
1904 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
1913 if (pxmitframe->buf_addr == NULL) {
1918 pbuf_start = pxmitframe->buf_addr;
1919 mem_start = pbuf_start + TXDESC_OFFSET;
1921 if (rtw_make_tdls_wlanhdr(padapter, mem_start, pattrib, ptxmgmt) == _FAIL) {
1927 pframe += pattrib->hdrlen;
1929 //adding icv, if necessary...
1930 if (pattrib->iv_len)
1934 switch(pattrib->encrypt)
1938 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1942 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1944 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
1948 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
1950 AES_IV(pattrib->iv, psta->dot11txpn, 0);
1955 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
1956 pframe += pattrib->iv_len;
1960 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
1963 //pattrib->pktlen will be counted in rtw_build_tdls_ies
1964 pattrib->pktlen = 0;
1966 rtw_build_tdls_ies(padapter, pxmitframe, pframe, ptxmgmt);
1968 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
1969 pframe += pattrib->pktlen;
1970 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
1971 pframe += pattrib->icv_len;
1974 pattrib->nr_frags = 1;
1975 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + llc_sz +
1976 ((pattrib->bswenc) ? pattrib->icv_len : 0) + pattrib->pktlen;
1978 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
1984 xmitframe_swencrypt(padapter, pxmitframe);
1986 update_attrib_vcs_info(padapter, pxmitframe);
1994 #endif //CONFIG_TDLS
1997 * Calculate wlan 802.11 packet MAX size from pkt_attrib
1998 * This function doesn't consider fragment case
2000 u32 rtw_calculate_wlan_pkt_size_by_attribue(struct pkt_attrib *pattrib)
2004 len = pattrib->hdrlen + pattrib->iv_len; // WLAN Header and IV
2005 len += SNAP_SIZE + sizeof(u16); // LLC
2006 len += pattrib->pktlen;
2007 if (pattrib->encrypt == _TKIP_) len += 8; // MIC
2008 len += ((pattrib->bswenc) ? pattrib->icv_len : 0); // ICV
2015 This sub-routine will perform all the following:
2017 1. remove 802.3 header.
2018 2. create wlan_header, based on the info in pxmitframe
2019 3. append sta's iv/ext-iv
2021 5. move frag chunk from pframe to pxmitframe->mem
2022 6. apply sw-encrypt, if necessary.
2025 s32 rtw_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
2027 struct pkt_file pktfile;
2029 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
2033 u8 *pframe, *mem_start;
2036 //struct sta_info *psta;
2037 //struct sta_priv *pstapriv = &padapter->stapriv;
2038 //struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2039 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2041 struct pkt_attrib *pattrib = &pxmitframe->attrib;
2045 s32 bmcst = IS_MCAST(pattrib->ra);
2053 psta = pattrib->psta;
2056 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
2057 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
2063 DBG_871X("%s, psta==NUL\n", __func__);
2068 if(!(psta->state &_FW_LINKED))
2070 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
2074 if (pxmitframe->buf_addr == NULL){
2075 DBG_8192C("==> %s buf_addr==NULL \n",__FUNCTION__);
2079 pbuf_start = pxmitframe->buf_addr;
2081 #ifdef CONFIG_USB_TX_AGGREGATION
2082 hw_hdr_offset = TXDESC_SIZE + (pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
2084 #ifdef CONFIG_TX_EARLY_MODE //for SDIO && Tx Agg
2085 hw_hdr_offset = TXDESC_OFFSET + EARLY_MODE_INFO_SIZE;
2087 hw_hdr_offset = TXDESC_OFFSET;
2091 mem_start = pbuf_start + hw_hdr_offset;
2093 if (rtw_make_wlanhdr(padapter, mem_start, pattrib) == _FAIL) {
2094 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n"));
2095 DBG_8192C("rtw_xmitframe_coalesce: rtw_make_wlanhdr fail; drop pkt\n");
2100 _rtw_open_pktfile(pkt, &pktfile);
2101 _rtw_pktfile_read(&pktfile, NULL, pattrib->pkt_hdrlen);
2104 frg_len = pxmitpriv->frag_len - 4;//2346-4 = 2342
2114 SetMFrag(mem_start);
2116 pframe += pattrib->hdrlen;
2117 mpdu_len -= pattrib->hdrlen;
2119 //adding icv, if necessary...
2120 if (pattrib->iv_len)
2123 //if (check_fwstate(pmlmepriv, WIFI_MP_STATE))
2124 // psta = rtw_get_stainfo(pstapriv, get_bssid(pmlmepriv));
2126 // psta = rtw_get_stainfo(pstapriv, pattrib->ra);
2130 switch(pattrib->encrypt)
2134 WEP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2138 TKIP_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2140 TKIP_IV(pattrib->iv, psta->dot11txpn, 0);
2144 AES_IV(pattrib->iv, psta->dot11txpn, pattrib->key_idx);
2146 AES_IV(pattrib->iv, psta->dot11txpn, 0);
2148 #ifdef CONFIG_WAPI_SUPPORT
2150 rtw_wapi_get_iv(padapter,pattrib->ra,pattrib->iv);
2156 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
2158 RT_TRACE(_module_rtl871x_xmit_c_, _drv_notice_,
2159 ("rtw_xmitframe_coalesce: keyid=%d pattrib->iv[3]=%.2x pframe=%.2x %.2x %.2x %.2x\n",
2160 padapter->securitypriv.dot11PrivacyKeyIndex, pattrib->iv[3], *pframe, *(pframe+1), *(pframe+2), *(pframe+3)));
2162 pframe += pattrib->iv_len;
2164 mpdu_len -= pattrib->iv_len;
2168 llc_sz = rtw_put_snap(pframe, pattrib->ether_type);
2173 if ((pattrib->icv_len >0) && (pattrib->bswenc)) {
2174 mpdu_len -= pattrib->icv_len;
2179 // don't do fragment to broadcat/multicast packets
2180 mem_sz = _rtw_pktfile_read(&pktfile, pframe, pattrib->pktlen);
2182 mem_sz = _rtw_pktfile_read(&pktfile, pframe, mpdu_len);
2187 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
2188 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
2189 pframe += pattrib->icv_len;
2194 if (bmcst || (rtw_endofpktfile(&pktfile) == _TRUE))
2196 pattrib->nr_frags = frg_inx;
2198 pattrib->last_txcmdsz = pattrib->hdrlen + pattrib->iv_len + ((pattrib->nr_frags==1)? llc_sz:0) +
2199 ((pattrib->bswenc) ? pattrib->icv_len : 0) + mem_sz;
2201 ClearMFrag(mem_start);
2205 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("%s: There're still something in packet!\n", __FUNCTION__));
2208 addr = (SIZE_PTR)(pframe);
2210 mem_start = (unsigned char *)RND4(addr) + hw_hdr_offset;
2211 _rtw_memcpy(mem_start, pbuf_start + hw_hdr_offset, pattrib->hdrlen);
2215 if (xmitframe_addmic(padapter, pxmitframe) == _FAIL)
2217 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n"));
2218 DBG_8192C("xmitframe_addmic(padapter, pxmitframe)==_FAIL\n");
2223 xmitframe_swencrypt(padapter, pxmitframe);
2226 update_attrib_vcs_info(padapter, pxmitframe);
2228 pattrib->vcs_mode = NONE_VCS;
2237 #ifdef CONFIG_IEEE80211W
2238 //broadcast or multicast management pkt use BIP, unicast management pkt use CCMP encryption
2239 s32 rtw_mgmt_xmitframe_coalesce(_adapter *padapter, _pkt *pkt, struct xmit_frame *pxmitframe)
2241 struct pkt_file pktfile;
2242 s32 frg_inx, frg_len, mpdu_len, llc_sz, mem_sz;
2244 u8 *pframe, *mem_start = NULL, *tmp_buf=NULL;
2245 u8 hw_hdr_offset, subtype ;
2246 struct sta_info *psta = NULL;
2247 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2248 struct pkt_attrib *pattrib = &pxmitframe->attrib;
2250 s32 bmcst = IS_MCAST(pattrib->ra);
2255 struct mlme_ext_priv *pmlmeext = &padapter->mlmeextpriv;
2256 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2257 struct rtw_ieee80211_hdr *pwlanhdr;
2258 u8 MME[_MME_IE_LENGTH_];
2262 mem_start = pframe = (u8 *)(pxmitframe->buf_addr) + TXDESC_OFFSET;
2263 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
2266 ori_len = BIP_AAD_SIZE+pattrib->pktlen;
2267 tmp_buf = BIP_AAD = rtw_zmalloc(ori_len);
2268 subtype = GetFrameSubType(pframe); //bit(7)~bit(2)
2273 _enter_critical_bh(&padapter->security_key_mutex, &irqL);
2276 //IGTK key is not install, it may not support 802.11w
2277 if(padapter->securitypriv.binstallBIPkey != _TRUE)
2279 DBG_871X("no instll BIP key\n");
2280 goto xmitframe_coalesce_success;
2282 //station mode doesn't need TX BIP, just ready the code
2288 _rtw_memset(MME, 0, _MME_IE_LENGTH_);
2290 //other types doesn't need the BIP
2291 if(GetFrameSubType(pframe) != WIFI_DEAUTH && GetFrameSubType(pframe) != WIFI_DISASSOC)
2292 goto xmitframe_coalesce_fail;
2294 MGMT_body = pframe + sizeof(struct rtw_ieee80211_hdr_3addr);
2295 pframe += pattrib->pktlen;
2297 //octent 0 and 1 is key index ,BIP keyid is 4 or 5, LSB only need octent 0
2298 MME[0]=padapter->securitypriv.dot11wBIPKeyid;
2299 //copy packet number
2300 _rtw_memcpy(&MME[2], &pmlmeext->mgnt_80211w_IPN, 6);
2301 //increase the packet number
2302 pmlmeext->mgnt_80211w_IPN++;
2304 //add MME IE with MIC all zero, MME string doesn't include element id and length
2305 pframe = rtw_set_ie(pframe, _MME_IE_ , 16 , MME, &(pattrib->pktlen));
2306 pattrib->last_txcmdsz = pattrib->pktlen;
2307 // total frame length - header length
2308 frame_body_len = pattrib->pktlen - sizeof(struct rtw_ieee80211_hdr_3addr);
2310 //conscruct AAD, copy frame control field
2311 _rtw_memcpy(BIP_AAD, &pwlanhdr->frame_ctl, 2);
2312 ClearRetry(BIP_AAD);
2313 ClearPwrMgt(BIP_AAD);
2314 ClearMData(BIP_AAD);
2315 //conscruct AAD, copy address 1 to address 3
2316 _rtw_memcpy(BIP_AAD+2, pwlanhdr->addr1, 18);
2317 //copy management fram body
2318 _rtw_memcpy(BIP_AAD+BIP_AAD_SIZE, MGMT_body, frame_body_len);
2319 /*//dump total packet include MME with zero MIC
2322 printk("Total packet: ");
2323 for(i=0; i < BIP_AAD_SIZE+frame_body_len; i++)
2324 printk(" %02x ", BIP_AAD[i]);
2328 if(omac1_aes_128(padapter->securitypriv.dot11wBIPKey[padapter->securitypriv.dot11wBIPKeyid].skey
2329 , BIP_AAD, BIP_AAD_SIZE+frame_body_len, mic))
2330 goto xmitframe_coalesce_fail;
2332 /*//dump calculated mic result
2335 printk("Calculated mic result: ");
2337 printk(" %02x ", mic[i]);
2340 //copy right BIP mic value, total is 128bits, we use the 0~63 bits
2341 _rtw_memcpy(pframe-8, mic, 8);
2342 /*/dump all packet after mic ok
2345 printk("pattrib->pktlen = %d \n", pattrib->pktlen);
2346 for(pp=0;pp< pattrib->pktlen; pp++)
2347 printk(" %02x ", mem_start[pp]);
2351 else //unicast mgmt frame TX
2353 //start to encrypt mgmt frame
2354 if(subtype == WIFI_DEAUTH || subtype == WIFI_DISASSOC ||
2355 subtype == WIFI_REASSOCREQ || subtype == WIFI_ACTION)
2358 psta = pattrib->psta;
2361 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
2367 DBG_871X("%s, psta==NUL\n", __func__);
2368 goto xmitframe_coalesce_fail;
2371 if (pxmitframe->buf_addr == NULL) {
2372 DBG_871X("%s, pxmitframe->buf_addr\n", __func__);
2373 goto xmitframe_coalesce_fail;
2376 //DBG_871X("%s, action frame category=%d \n", __func__, pframe[WLAN_HDR_A3_LEN]);
2377 //according 802.11-2012 standard, these five types are not robust types
2378 if(subtype == WIFI_ACTION &&
2379 (pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_PUBLIC ||
2380 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_HT ||
2381 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_UNPROTECTED_WNM ||
2382 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_SELF_PROTECTED ||
2383 pframe[WLAN_HDR_A3_LEN] == RTW_WLAN_CATEGORY_P2P))
2384 goto xmitframe_coalesce_fail;
2385 //before encrypt dump the management packet content
2388 printk("Management pkt: ");
2389 for(i=0; i<pattrib->pktlen; i++)
2390 printk(" %02x ", pframe[i]);
2391 printk("=======\n");
2393 if(pattrib->encrypt>0)
2394 _rtw_memcpy(pattrib->dot118021x_UncstKey.skey, psta->dot118021x_UncstKey.skey, 16);
2396 /* To use wrong key */
2397 if (pattrib->key_type == IEEE80211W_WRONG_KEY) {
2398 DBG_871X("use wrong key\n");
2399 pattrib->dot118021x_UncstKey.skey[0] = 0xff;
2402 //bakeup original management packet
2403 _rtw_memcpy(tmp_buf, pframe, pattrib->pktlen);
2404 //move to data portion
2405 pframe += pattrib->hdrlen;
2407 //802.11w unicast management packet must be _AES_
2408 pattrib->iv_len = 8;
2410 pattrib->icv_len = 8;
2412 switch(pattrib->encrypt)
2416 AES_IV(pattrib->iv, psta->dot11wtxpn, 0);
2419 goto xmitframe_coalesce_fail;
2421 //insert iv header into management frame
2422 _rtw_memcpy(pframe, pattrib->iv, pattrib->iv_len);
2423 pframe += pattrib->iv_len;
2424 //copy mgmt data portion after CCMP header
2425 _rtw_memcpy(pframe, tmp_buf+pattrib->hdrlen, pattrib->pktlen-pattrib->hdrlen);
2426 //move pframe to end of mgmt pkt
2427 pframe += pattrib->pktlen-pattrib->hdrlen;
2428 //add 8 bytes CCMP IV header to length
2429 pattrib->pktlen += pattrib->iv_len;
2430 /*//dump management packet include AES IV header
2433 printk("Management pkt + IV: ");
2434 //for(i=0; i<pattrib->pktlen; i++)
2435 //printk(" %02x ", mem_start[i]);
2436 printk("@@@@@@@@@@@@@\n");
2439 if ((pattrib->icv_len >0 )&& (pattrib->bswenc)) {
2440 _rtw_memcpy(pframe, pattrib->icv, pattrib->icv_len);
2441 pframe += pattrib->icv_len;
2444 pattrib->pktlen += pattrib->icv_len;
2445 //set final tx command size
2446 pattrib->last_txcmdsz = pattrib->pktlen;
2448 //set protected bit must be beofre SW encrypt
2449 SetPrivacy(mem_start);
2450 /*//dump management packet include AES header
2453 printk("prepare to enc Management pkt + IV: ");
2454 for(i=0; i<pattrib->pktlen; i++)
2455 printk(" %02x ", mem_start[i]);
2456 printk("@@@@@@@@@@@@@\n");
2459 xmitframe_swencrypt(padapter, pxmitframe);
2463 xmitframe_coalesce_success:
2464 _exit_critical_bh(&padapter->security_key_mutex, &irqL);
2465 rtw_mfree(BIP_AAD, ori_len);
2469 xmitframe_coalesce_fail:
2470 _exit_critical_bh(&padapter->security_key_mutex, &irqL);
2471 rtw_mfree(BIP_AAD, ori_len);
2476 #endif //CONFIG_IEEE80211W
2478 /* Logical Link Control(LLC) SubNetwork Attachment Point(SNAP) header
2479 * IEEE LLC/SNAP header contains 8 octets
2480 * First 3 octets comprise the LLC portion
2481 * SNAP portion, 5 octets, is divided into two fields:
2482 * Organizationally Unique Identifier(OUI), 3 octets,
2483 * type, defined by that organization, 2 octets.
2485 s32 rtw_put_snap(u8 *data, u16 h_proto)
2487 struct ieee80211_snap_hdr *snap;
2492 snap = (struct ieee80211_snap_hdr *)data;
2497 if (h_proto == 0x8137 || h_proto == 0x80f3)
2502 snap->oui[0] = oui[0];
2503 snap->oui[1] = oui[1];
2504 snap->oui[2] = oui[2];
2506 *(u16 *)(data + SNAP_SIZE) = htons(h_proto);
2510 return SNAP_SIZE + sizeof(u16);
2513 void rtw_update_protection(_adapter *padapter, u8 *ie, uint ie_len)
2519 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2520 struct registry_priv *pregistrypriv = &padapter->registrypriv;
2524 switch(pxmitpriv->vcs_setting)
2527 pxmitpriv->vcs = NONE_VCS;
2535 perp = rtw_get_ie(ie, _ERPINFO_IE_, &erp_len, ie_len);
2538 pxmitpriv->vcs = NONE_VCS;
2542 protection = (*(perp + 2)) & BIT(1);
2545 if(pregistrypriv->vcs_type == RTS_CTS)
2546 pxmitpriv->vcs = RTS_CTS;
2548 pxmitpriv->vcs = CTS_TO_SELF;
2551 pxmitpriv->vcs = NONE_VCS;
2562 void rtw_count_tx_stats(PADAPTER padapter, struct xmit_frame *pxmitframe, int sz)
2564 struct sta_info *psta = NULL;
2565 struct stainfo_stats *pstats = NULL;
2566 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
2567 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
2570 if ((pxmitframe->frame_tag&0x0f) == DATA_FRAMETAG)
2572 #if defined(CONFIG_USB_TX_AGGREGATION) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2573 pkt_num = pxmitframe->agg_num;
2575 pmlmepriv->LinkDetectInfo.NumTxOkInPeriod += pkt_num;
2577 pxmitpriv->tx_pkts += pkt_num;
2579 pxmitpriv->tx_bytes += sz;
2581 psta = pxmitframe->attrib.psta;
2584 pstats = &psta->sta_stats;
2586 pstats->tx_pkts += pkt_num;
2588 pstats->tx_bytes += sz;
2590 if(pxmitframe->attrib.ptdls_sta != NULL)
2592 pstats = &(pxmitframe->attrib.ptdls_sta->sta_stats);
2593 pstats->tx_pkts += pkt_num;
2594 pstats->tx_bytes += sz;
2596 #endif //CONFIG_TDLS
2599 #ifdef CONFIG_CHECK_LEAVE_LPS
2600 //traffic_check_for_leave_lps(padapter, _TRUE);
2606 static struct xmit_buf *__rtw_alloc_cmd_xmitbuf(struct xmit_priv *pxmitpriv,
2607 enum cmdbuf_type buf_type)
2609 struct xmit_buf *pxmitbuf = NULL;
2613 pxmitbuf = &pxmitpriv->pcmd_xmitbuf[buf_type];
2614 if (pxmitbuf != NULL) {
2615 pxmitbuf->priv_data = NULL;
2617 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2619 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2620 pxmitbuf->agg_num = 0;
2621 pxmitbuf->pg_num = 0;
2623 #ifdef CONFIG_PCI_HCI
2625 pxmitbuf->desc = NULL;
2628 if (pxmitbuf->sctx) {
2629 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2630 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2633 DBG_871X("%s fail, no xmitbuf available !!!\n", __func__);
2643 struct xmit_frame *__rtw_alloc_cmdxmitframe(struct xmit_priv *pxmitpriv,
2644 enum cmdbuf_type buf_type)
2646 struct xmit_frame *pcmdframe;
2647 struct xmit_buf *pxmitbuf;
2649 if ((pcmdframe = rtw_alloc_xmitframe(pxmitpriv)) == NULL)
2651 DBG_871X("%s, alloc xmitframe fail\n", __FUNCTION__);
2655 if ((pxmitbuf = __rtw_alloc_cmd_xmitbuf(pxmitpriv, buf_type)) == NULL) {
2656 DBG_871X("%s, alloc xmitbuf fail\n", __FUNCTION__);
2657 rtw_free_xmitframe(pxmitpriv, pcmdframe);
2661 pcmdframe->frame_tag = MGNT_FRAMETAG;
2663 pcmdframe->pxmitbuf = pxmitbuf;
2665 pcmdframe->buf_addr = pxmitbuf->pbuf;
2667 pxmitbuf->priv_data = pcmdframe;
2673 struct xmit_buf *rtw_alloc_xmitbuf_ext(struct xmit_priv *pxmitpriv)
2676 struct xmit_buf *pxmitbuf = NULL;
2677 _list *plist, *phead;
2678 _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
2682 _enter_critical(&pfree_queue->lock, &irqL);
2684 if(_rtw_queue_empty(pfree_queue) == _TRUE) {
2688 phead = get_list_head(pfree_queue);
2690 plist = get_next(phead);
2692 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
2694 rtw_list_delete(&(pxmitbuf->list));
2697 if (pxmitbuf != NULL)
2699 pxmitpriv->free_xmit_extbuf_cnt--;
2700 #ifdef DBG_XMIT_BUF_EXT
2701 DBG_871X("DBG_XMIT_BUF_EXT ALLOC no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmit_extbuf_cnt);
2705 pxmitbuf->priv_data = NULL;
2707 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2709 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2710 pxmitbuf->agg_num = 1;
2712 #ifdef CONFIG_PCI_HCI
2714 pxmitbuf->desc = NULL;
2717 if (pxmitbuf->sctx) {
2718 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2719 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2724 _exit_critical(&pfree_queue->lock, &irqL);
2731 s32 rtw_free_xmitbuf_ext(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
2734 _queue *pfree_queue = &pxmitpriv->free_xmit_extbuf_queue;
2743 _enter_critical(&pfree_queue->lock, &irqL);
2745 rtw_list_delete(&pxmitbuf->list);
2747 rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_queue));
2748 pxmitpriv->free_xmit_extbuf_cnt++;
2749 #ifdef DBG_XMIT_BUF_EXT
2750 DBG_871X("DBG_XMIT_BUF_EXT FREE no=%d, free_xmit_extbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmit_extbuf_cnt);
2753 _exit_critical(&pfree_queue->lock, &irqL);
2760 struct xmit_buf *rtw_alloc_xmitbuf(struct xmit_priv *pxmitpriv)
2763 struct xmit_buf *pxmitbuf = NULL;
2764 _list *plist, *phead;
2765 _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
2769 //DBG_871X("+rtw_alloc_xmitbuf\n");
2771 _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
2773 if(_rtw_queue_empty(pfree_xmitbuf_queue) == _TRUE) {
2777 phead = get_list_head(pfree_xmitbuf_queue);
2779 plist = get_next(phead);
2781 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
2783 rtw_list_delete(&(pxmitbuf->list));
2786 if (pxmitbuf != NULL)
2788 pxmitpriv->free_xmitbuf_cnt--;
2790 DBG_871X("DBG_XMIT_BUF ALLOC no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no, pxmitpriv->free_xmitbuf_cnt);
2792 //DBG_871X("alloc, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
2794 pxmitbuf->priv_data = NULL;
2796 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2798 pxmitbuf->pdata = pxmitbuf->ptail = pxmitbuf->phead;
2799 pxmitbuf->agg_num = 0;
2800 pxmitbuf->pg_num = 0;
2802 #ifdef CONFIG_PCI_HCI
2804 pxmitbuf->desc = NULL;
2807 if (pxmitbuf->sctx) {
2808 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2809 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_ALLOC);
2815 DBG_871X("DBG_XMIT_BUF rtw_alloc_xmitbuf return NULL\n");
2819 _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
2826 s32 rtw_free_xmitbuf(struct xmit_priv *pxmitpriv, struct xmit_buf *pxmitbuf)
2829 _queue *pfree_xmitbuf_queue = &pxmitpriv->free_xmitbuf_queue;
2833 //DBG_871X("+rtw_free_xmitbuf\n");
2840 if (pxmitbuf->sctx) {
2841 DBG_871X("%s pxmitbuf->sctx is not NULL\n", __func__);
2842 rtw_sctx_done_err(&pxmitbuf->sctx, RTW_SCTX_DONE_BUF_FREE);
2845 if(pxmitbuf->buf_tag == XMITBUF_CMD) {
2847 else if(pxmitbuf->buf_tag == XMITBUF_MGNT) {
2848 rtw_free_xmitbuf_ext(pxmitpriv, pxmitbuf);
2852 _enter_critical(&pfree_xmitbuf_queue->lock, &irqL);
2854 rtw_list_delete(&pxmitbuf->list);
2856 rtw_list_insert_tail(&(pxmitbuf->list), get_list_head(pfree_xmitbuf_queue));
2858 pxmitpriv->free_xmitbuf_cnt++;
2859 //DBG_871X("FREE, free_xmitbuf_cnt=%d\n", pxmitpriv->free_xmitbuf_cnt);
2861 DBG_871X("DBG_XMIT_BUF FREE no=%d, free_xmitbuf_cnt=%d\n",pxmitbuf->no ,pxmitpriv->free_xmitbuf_cnt);
2863 _exit_critical(&pfree_xmitbuf_queue->lock, &irqL);
2871 void rtw_init_xmitframe(struct xmit_frame *pxframe)
2873 if (pxframe != NULL)//default value setting
2875 pxframe->buf_addr = NULL;
2876 pxframe->pxmitbuf = NULL;
2878 _rtw_memset(&pxframe->attrib, 0, sizeof(struct pkt_attrib));
2879 //pxframe->attrib.psta = NULL;
2881 pxframe->frame_tag = DATA_FRAMETAG;
2883 #ifdef CONFIG_USB_HCI
2884 pxframe->pkt = NULL;
2885 #ifdef USB_PACKET_OFFSET_SZ
2886 pxframe->pkt_offset = (PACKET_OFFSET_SZ/8);
2888 pxframe->pkt_offset = 1;//default use pkt_offset to fill tx desc
2891 #ifdef CONFIG_USB_TX_AGGREGATION
2892 pxframe->agg_num = 1;
2895 #endif //#ifdef CONFIG_USB_HCI
2897 #if defined(CONFIG_SDIO_HCI) || defined(CONFIG_GSPI_HCI)
2898 pxframe->pg_num = 1;
2899 pxframe->agg_num = 1;
2902 #ifdef CONFIG_XMIT_ACK
2903 pxframe->ack_report = 0;
2912 2. RXENTRY (rx_thread or RX_ISR/RX_CallBack)
2914 If we turn on USE_RXTHREAD, then, no need for critical section.
2915 Otherwise, we must use _enter/_exit critical to protect free_xmit_queue...
2917 Must be very very cautious...
2920 struct xmit_frame *rtw_alloc_xmitframe(struct xmit_priv *pxmitpriv)//(_queue *pfree_xmit_queue)
2923 Please remember to use all the osdep_service api,
2924 and lock/unlock or _enter/_exit critical to protect
2929 struct xmit_frame *pxframe = NULL;
2930 _list *plist, *phead;
2931 _queue *pfree_xmit_queue = &pxmitpriv->free_xmit_queue;
2935 _enter_critical_bh(&pfree_xmit_queue->lock, &irqL);
2937 if (_rtw_queue_empty(pfree_xmit_queue) == _TRUE) {
2938 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe:%d\n", pxmitpriv->free_xmitframe_cnt));
2941 phead = get_list_head(pfree_xmit_queue);
2943 plist = get_next(phead);
2945 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
2947 rtw_list_delete(&(pxframe->list));
2948 pxmitpriv->free_xmitframe_cnt--;
2949 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
2952 _exit_critical_bh(&pfree_xmit_queue->lock, &irqL);
2954 rtw_init_xmitframe(pxframe);
2961 struct xmit_frame *rtw_alloc_xmitframe_ext(struct xmit_priv *pxmitpriv)
2964 struct xmit_frame *pxframe = NULL;
2965 _list *plist, *phead;
2966 _queue *queue = &pxmitpriv->free_xframe_ext_queue;
2970 _enter_critical_bh(&queue->lock, &irqL);
2972 if (_rtw_queue_empty(queue) == _TRUE) {
2973 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_alloc_xmitframe_ext:%d\n", pxmitpriv->free_xframe_ext_cnt));
2976 phead = get_list_head(queue);
2977 plist = get_next(phead);
2978 pxframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
2980 rtw_list_delete(&(pxframe->list));
2981 pxmitpriv->free_xframe_ext_cnt--;
2982 RT_TRACE(_module_rtl871x_xmit_c_, _drv_info_, ("rtw_alloc_xmitframe_ext():free_xmitframe_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
2985 _exit_critical_bh(&queue->lock, &irqL);
2987 rtw_init_xmitframe(pxframe);
2994 struct xmit_frame *rtw_alloc_xmitframe_once(struct xmit_priv *pxmitpriv)
2996 struct xmit_frame *pxframe = NULL;
2999 alloc_addr = rtw_zmalloc(sizeof(struct xmit_frame) + 4);
3001 if (alloc_addr == NULL)
3004 pxframe = (struct xmit_frame *)N_BYTE_ALIGMENT((SIZE_PTR)(alloc_addr), 4);
3005 pxframe->alloc_addr = alloc_addr;
3007 pxframe->padapter = pxmitpriv->adapter;
3008 pxframe->frame_tag = NULL_FRAMETAG;
3010 pxframe->pkt = NULL;
3012 pxframe->buf_addr = NULL;
3013 pxframe->pxmitbuf = NULL;
3015 rtw_init_xmitframe(pxframe);
3017 DBG_871X("################## %s ##################\n", __func__);
3023 s32 rtw_free_xmitframe(struct xmit_priv *pxmitpriv, struct xmit_frame *pxmitframe)
3026 _queue *queue = NULL;
3027 _adapter *padapter = pxmitpriv->adapter;
3028 _pkt *pndis_pkt = NULL;
3032 if (pxmitframe == NULL) {
3033 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("======rtw_free_xmitframe():pxmitframe==NULL!!!!!!!!!!\n"));
3037 if (pxmitframe->pkt){
3038 pndis_pkt = pxmitframe->pkt;
3039 pxmitframe->pkt = NULL;
3042 if (pxmitframe->alloc_addr) {
3043 DBG_871X("################## %s with alloc_addr ##################\n", __func__);
3044 rtw_mfree(pxmitframe->alloc_addr, sizeof(struct xmit_frame) + 4);
3045 goto check_pkt_complete;
3048 if (pxmitframe->ext_tag == 0)
3049 queue = &pxmitpriv->free_xmit_queue;
3050 else if(pxmitframe->ext_tag == 1)
3051 queue = &pxmitpriv->free_xframe_ext_queue;
3055 _enter_critical_bh(&queue->lock, &irqL);
3057 rtw_list_delete(&pxmitframe->list);
3058 rtw_list_insert_tail(&pxmitframe->list, get_list_head(queue));
3059 if (pxmitframe->ext_tag == 0) {
3060 pxmitpriv->free_xmitframe_cnt++;
3061 RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xmitframe_cnt=%d\n", pxmitpriv->free_xmitframe_cnt));
3062 } else if(pxmitframe->ext_tag == 1) {
3063 pxmitpriv->free_xframe_ext_cnt++;
3064 RT_TRACE(_module_rtl871x_xmit_c_, _drv_debug_, ("rtw_free_xmitframe():free_xframe_ext_cnt=%d\n", pxmitpriv->free_xframe_ext_cnt));
3068 _exit_critical_bh(&queue->lock, &irqL);
3073 rtw_os_pkt_complete(padapter, pndis_pkt);
3082 void rtw_free_xmitframe_queue(struct xmit_priv *pxmitpriv, _queue *pframequeue)
3085 _list *plist, *phead;
3086 struct xmit_frame *pxmitframe;
3090 _enter_critical_bh(&(pframequeue->lock), &irqL);
3092 phead = get_list_head(pframequeue);
3093 plist = get_next(phead);
3095 while (rtw_end_of_queue_search(phead, plist) == _FALSE)
3098 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
3100 plist = get_next(plist);
3102 rtw_free_xmitframe(pxmitpriv,pxmitframe);
3105 _exit_critical_bh(&(pframequeue->lock), &irqL);
3110 s32 rtw_xmitframe_enqueue(_adapter *padapter, struct xmit_frame *pxmitframe)
3112 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue);
3113 if (rtw_xmit_classifier(padapter, pxmitframe) == _FAIL)
3115 RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_,
3116 ("rtw_xmitframe_enqueue: drop xmit pkt for classifier fail\n"));
3117 // pxmitframe->pkt = NULL;
3124 static struct xmit_frame *dequeue_one_xmitframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit, struct tx_servq *ptxservq, _queue *pframe_queue)
3126 _list *xmitframe_plist, *xmitframe_phead;
3127 struct xmit_frame *pxmitframe=NULL;
3129 xmitframe_phead = get_list_head(pframe_queue);
3130 xmitframe_plist = get_next(xmitframe_phead);
3132 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
3134 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
3136 /* xmitframe_plist = get_next(xmitframe_plist); */
3138 /*#ifdef RTK_DMP_PLATFORM
3139 #ifdef CONFIG_USB_TX_AGGREGATION
3140 if((ptxservq->qcnt>0) && (ptxservq->qcnt<=2))
3144 tasklet_schedule(&pxmitpriv->xmit_tasklet);
3150 rtw_list_delete(&pxmitframe->list);
3154 //rtw_list_insert_tail(&pxmitframe->list, &phwxmit->pending);
3160 //pxmitframe = NULL;
3167 struct xmit_frame* rtw_dequeue_xframe(struct xmit_priv *pxmitpriv, struct hw_xmit *phwxmit_i, sint entry)
3170 _list *sta_plist, *sta_phead;
3171 struct hw_xmit *phwxmit;
3172 struct tx_servq *ptxservq = NULL;
3173 _queue *pframe_queue = NULL;
3174 struct xmit_frame *pxmitframe = NULL;
3175 _adapter *padapter = pxmitpriv->adapter;
3176 struct registry_priv *pregpriv = &padapter->registrypriv;
3178 #ifdef CONFIG_USB_HCI
3179 // int j, tmp, acirp_cnt[4];
3184 inx[0] = 0; inx[1] = 1; inx[2] = 2; inx[3] = 3;
3186 if(pregpriv->wifi_spec==1)
3188 int j, tmp, acirp_cnt[4];
3190 if(flags<XMIT_QUEUE_ENTRY)
3192 //priority exchange according to the completed xmitbuf flags.
3198 #if defined(CONFIG_USB_HCI) || defined(CONFIG_SDIO_HCI) || defined(CONFIG_PCI_HCI)
3200 inx[j] = pxmitpriv->wmm_para_seq[j];
3204 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
3206 for(i = 0; i < entry; i++)
3208 phwxmit = phwxmit_i + inx[i];
3210 //_enter_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3212 sta_phead = get_list_head(phwxmit->sta_queue);
3213 sta_plist = get_next(sta_phead);
3215 while ((rtw_end_of_queue_search(sta_phead, sta_plist)) == _FALSE)
3218 ptxservq= LIST_CONTAINOR(sta_plist, struct tx_servq, tx_pending);
3220 pframe_queue = &ptxservq->sta_pending;
3222 pxmitframe = dequeue_one_xmitframe(pxmitpriv, phwxmit, ptxservq, pframe_queue);
3228 //Remove sta node when there is no pending packets.
3229 if(_rtw_queue_empty(pframe_queue)) //must be done after get_next and before break
3230 rtw_list_delete(&ptxservq->tx_pending);
3232 //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3237 sta_plist = get_next(sta_plist);
3241 //_exit_critical_ex(&phwxmit->sta_queue->lock, &irqL0);
3247 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
3255 struct tx_servq *rtw_get_sta_pending(_adapter *padapter, struct sta_info *psta, sint up, u8 *ac)
3257 struct tx_servq *ptxservq=NULL;
3265 ptxservq = &(psta->sta_xmitpriv.bk_q);
3267 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
3272 ptxservq = &(psta->sta_xmitpriv.vi_q);
3274 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
3279 ptxservq = &(psta->sta_xmitpriv.vo_q);
3281 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
3287 ptxservq = &(psta->sta_xmitpriv.be_q);
3289 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
3299 __inline static struct tx_servq *rtw_get_sta_pending
3300 (_adapter *padapter, _queue **ppstapending, struct sta_info *psta, sint up)
3302 struct tx_servq *ptxservq;
3303 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
3307 #ifdef CONFIG_RTL8711
3309 if(IS_MCAST(psta->hwaddr))
3311 ptxservq = &(psta->sta_xmitpriv.be_q); // we will use be_q to queue bc/mc frames in BCMC_stainfo
3312 *ppstapending = &padapter->xmitpriv.bm_pending;
3321 ptxservq = &(psta->sta_xmitpriv.bk_q);
3322 *ppstapending = &padapter->xmitpriv.bk_pending;
3323 (phwxmits+3)->accnt++;
3324 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BK \n"));
3329 ptxservq = &(psta->sta_xmitpriv.vi_q);
3330 *ppstapending = &padapter->xmitpriv.vi_pending;
3331 (phwxmits+1)->accnt++;
3332 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VI\n"));
3337 ptxservq = &(psta->sta_xmitpriv.vo_q);
3338 *ppstapending = &padapter->xmitpriv.vo_pending;
3339 (phwxmits+0)->accnt++;
3340 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : VO \n"));
3346 ptxservq = &(psta->sta_xmitpriv.be_q);
3347 *ppstapending = &padapter->xmitpriv.be_pending;
3348 (phwxmits+2)->accnt++;
3349 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("rtw_get_sta_pending : BE \n"));
3363 * Will enqueue pxmitframe to the proper queue,
3364 * and indicate it to xx_pending list.....
3366 s32 rtw_xmit_classifier(_adapter *padapter, struct xmit_frame *pxmitframe)
3370 struct sta_info *psta;
3371 struct tx_servq *ptxservq;
3372 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3373 struct sta_priv *pstapriv = &padapter->stapriv;
3374 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
3375 sint res = _SUCCESS;
3379 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class);
3382 if (pattrib->psta) {
3383 psta = pattrib->psta;
3385 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
3386 psta = rtw_get_stainfo(pstapriv, pattrib->ra);
3390 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
3391 if(pattrib->psta != psta)
3393 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_sta);
3394 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
3399 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_nosta);
3401 DBG_8192C("rtw_xmit_classifier: psta == NULL\n");
3402 RT_TRACE(_module_rtl871x_xmit_c_,_drv_err_,("rtw_xmit_classifier: psta == NULL\n"));
3406 if(!(psta->state &_FW_LINKED))
3408 DBG_COUNTER(padapter->tx_logs.core_tx_enqueue_class_err_fwlink);
3409 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
3413 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
3415 //_enter_critical(&pstapending->lock, &irqL0);
3417 if (rtw_is_list_empty(&ptxservq->tx_pending)) {
3418 rtw_list_insert_tail(&ptxservq->tx_pending, get_list_head(phwxmits[ac_index].sta_queue));
3421 //_enter_critical(&ptxservq->sta_pending.lock, &irqL1);
3423 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptxservq->sta_pending));
3425 phwxmits[ac_index].accnt++;
3427 //_exit_critical(&ptxservq->sta_pending.lock, &irqL1);
3429 //_exit_critical(&pstapending->lock, &irqL0);
3438 void rtw_alloc_hwxmits(_adapter *padapter)
3440 struct hw_xmit *hwxmits;
3441 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3443 pxmitpriv->hwxmit_entry = HWXMIT_ENTRY;
3445 pxmitpriv->hwxmits = NULL;
3447 pxmitpriv->hwxmits = (struct hw_xmit *)rtw_zmalloc(sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry);
3449 if(pxmitpriv->hwxmits == NULL)
3451 DBG_871X("alloc hwxmits fail!...\n");
3455 hwxmits = pxmitpriv->hwxmits;
3457 if(pxmitpriv->hwxmit_entry == 5)
3459 //pxmitpriv->bmc_txqueue.head = 0;
3460 //hwxmits[0] .phwtxqueue = &pxmitpriv->bmc_txqueue;
3461 hwxmits[0] .sta_queue = &pxmitpriv->bm_pending;
3463 //pxmitpriv->vo_txqueue.head = 0;
3464 //hwxmits[1] .phwtxqueue = &pxmitpriv->vo_txqueue;
3465 hwxmits[1] .sta_queue = &pxmitpriv->vo_pending;
3467 //pxmitpriv->vi_txqueue.head = 0;
3468 //hwxmits[2] .phwtxqueue = &pxmitpriv->vi_txqueue;
3469 hwxmits[2] .sta_queue = &pxmitpriv->vi_pending;
3471 //pxmitpriv->bk_txqueue.head = 0;
3472 //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
3473 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
3475 //pxmitpriv->be_txqueue.head = 0;
3476 //hwxmits[4] .phwtxqueue = &pxmitpriv->be_txqueue;
3477 hwxmits[4] .sta_queue = &pxmitpriv->be_pending;
3480 else if(pxmitpriv->hwxmit_entry == 4)
3483 //pxmitpriv->vo_txqueue.head = 0;
3484 //hwxmits[0] .phwtxqueue = &pxmitpriv->vo_txqueue;
3485 hwxmits[0] .sta_queue = &pxmitpriv->vo_pending;
3487 //pxmitpriv->vi_txqueue.head = 0;
3488 //hwxmits[1] .phwtxqueue = &pxmitpriv->vi_txqueue;
3489 hwxmits[1] .sta_queue = &pxmitpriv->vi_pending;
3491 //pxmitpriv->be_txqueue.head = 0;
3492 //hwxmits[2] .phwtxqueue = &pxmitpriv->be_txqueue;
3493 hwxmits[2] .sta_queue = &pxmitpriv->be_pending;
3495 //pxmitpriv->bk_txqueue.head = 0;
3496 //hwxmits[3] .phwtxqueue = &pxmitpriv->bk_txqueue;
3497 hwxmits[3] .sta_queue = &pxmitpriv->bk_pending;
3508 void rtw_free_hwxmits(_adapter *padapter)
3510 struct hw_xmit *hwxmits;
3511 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3513 hwxmits = pxmitpriv->hwxmits;
3515 rtw_mfree((u8 *)hwxmits, (sizeof (struct hw_xmit) * pxmitpriv->hwxmit_entry));
3518 void rtw_init_hwxmits(struct hw_xmit *phwxmit, sint entry)
3522 for(i = 0; i < entry; i++, phwxmit++)
3524 //_rtw_spinlock_init(&phwxmit->xmit_lock);
3525 //_rtw_init_listhead(&phwxmit->pending);
3526 //phwxmit->txcmdcnt = 0;
3532 #ifdef CONFIG_BR_EXT
3533 int rtw_br_client_tx(_adapter *padapter, struct sk_buff **pskb)
3535 struct sk_buff *skb = *pskb;
3536 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3538 //if(check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
3540 void dhcp_flag_bcast(_adapter *priv, struct sk_buff *skb);
3541 int res, is_vlan_tag=0, i, do_nat25=1;
3542 unsigned short vlan_hdr=0;
3543 void *br_port = NULL;
3545 //mac_clone_handle_frame(priv, skb);
3547 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3548 br_port = padapter->pnetdev->br_port;
3549 #else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3551 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
3553 #endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3554 _enter_critical_bh(&padapter->br_ext_lock, &irqL);
3555 if ( !(skb->data[0] & 1) &&
3557 memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
3558 *((unsigned short *)(skb->data+MACADDRLEN*2)) != __constant_htons(ETH_P_8021Q) &&
3559 *((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP) &&
3560 !memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN) && padapter->scdb_entry) {
3561 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3562 padapter->scdb_entry->ageing_timer = jiffies;
3563 _exit_critical_bh(&padapter->br_ext_lock, &irqL);
3566 //if (!priv->pmib->ethBrExtInfo.nat25_disable)
3568 // if (priv->dev->br_port &&
3569 // !memcmp(skb->data+MACADDRLEN, priv->br_mac, MACADDRLEN)) {
3571 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
3573 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
3575 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
3578 //if SA == br_mac && skb== IP => copy SIP to br_ip ?? why
3579 if (!memcmp(skb->data+MACADDRLEN, padapter->br_mac, MACADDRLEN) &&
3580 (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)))
3581 memcpy(padapter->br_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
3583 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_IP)) {
3584 if (memcmp(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN)) {
3585 void *scdb_findEntry(_adapter *priv, unsigned char *macAddr, unsigned char *ipAddr);
3587 if ((padapter->scdb_entry = (struct nat25_network_db_entry *)scdb_findEntry(padapter,
3588 skb->data+MACADDRLEN, skb->data+WLAN_ETHHDR_LEN+12)) != NULL) {
3589 memcpy(padapter->scdb_mac, skb->data+MACADDRLEN, MACADDRLEN);
3590 memcpy(padapter->scdb_ip, skb->data+WLAN_ETHHDR_LEN+12, 4);
3591 padapter->scdb_entry->ageing_timer = jiffies;
3596 if (padapter->scdb_entry) {
3597 padapter->scdb_entry->ageing_timer = jiffies;
3601 memset(padapter->scdb_mac, 0, MACADDRLEN);
3602 memset(padapter->scdb_ip, 0, 4);
3606 _exit_critical_bh(&padapter->br_ext_lock, &irqL);
3610 int nat25_db_handle(_adapter *priv, struct sk_buff *skb, int method);
3611 if (nat25_db_handle(padapter, skb, NAT25_CHECK) == 0) {
3612 struct sk_buff *newskb;
3617 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
3618 *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
3619 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
3622 newskb = rtw_skb_copy(skb);
3623 if (newskb == NULL) {
3624 //priv->ext_stats.tx_drops++;
3625 DEBUG_ERR("TX DROP: rtw_skb_copy fail!\n");
3631 *pskb = skb = newskb;
3633 vlan_hdr = *((unsigned short *)(skb->data+MACADDRLEN*2+2));
3635 *((unsigned short *)(skb->data+MACADDRLEN*2+2-i*2)) = *((unsigned short *)(skb->data+MACADDRLEN*2-2-i*2));
3640 if (skb_is_nonlinear(skb))
3641 DEBUG_ERR("%s(): skb_is_nonlinear!!\n", __FUNCTION__);
3644 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3645 res = skb_linearize(skb, GFP_ATOMIC);
3646 #else // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3647 res = skb_linearize(skb);
3648 #endif // (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 18))
3650 DEBUG_ERR("TX DROP: skb_linearize fail!\n");
3651 //goto free_and_stop;
3655 res = nat25_db_handle(padapter, skb, NAT25_INSERT);
3658 //priv->ext_stats.tx_drops++;
3659 DEBUG_ERR("TX DROP: nat25_db_handle fail!\n");
3660 //goto free_and_stop;
3664 // we just print warning message and let it go
3665 //DEBUG_WARN("%s()-%d: nat25_db_handle INSERT Warning!\n", __FUNCTION__, __LINE__);
3666 //return -1; // return -1 will cause system crash on 2011/08/30!
3671 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3673 dhcp_flag_bcast(padapter, skb);
3678 *((unsigned short *)(skb->data+i*2)) = *((unsigned short *)(skb->data+4+i*2));
3679 *((unsigned short *)(skb->data+MACADDRLEN*2)) = __constant_htons(ETH_P_8021Q);
3680 *((unsigned short *)(skb->data+MACADDRLEN*2+2)) = vlan_hdr;
3685 if (*((unsigned short *)(skb->data+MACADDRLEN*2)) == __constant_htons(ETH_P_8021Q)) {
3690 if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A_VALN(skb->data)){
3691 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3695 if(ICMPV6_MCAST_MAC(skb->data) && ICMPV6_PROTO1A(skb->data)){
3696 memcpy(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN);
3702 // check if SA is equal to our MAC
3703 if (memcmp(skb->data+MACADDRLEN, GET_MY_HWADDR(padapter), MACADDRLEN)) {
3704 //priv->ext_stats.tx_drops++;
3705 DEBUG_ERR("TX DROP: untransformed frame SA:%02X%02X%02X%02X%02X%02X!\n",
3706 skb->data[6],skb->data[7],skb->data[8],skb->data[9],skb->data[10],skb->data[11]);
3707 //goto free_and_stop;
3713 #endif // CONFIG_BR_EXT
3715 u32 rtw_get_ff_hwaddr(struct xmit_frame *pxmitframe)
3718 struct pkt_attrib *pattrib = &pxmitframe->attrib;
3720 switch(pattrib->qsel)
3724 addr = BE_QUEUE_INX;
3728 addr = BK_QUEUE_INX;
3732 addr = VI_QUEUE_INX;
3736 addr = VO_QUEUE_INX;
3739 addr = BCN_QUEUE_INX;
3741 case 0x11://BC/MC in PS (HIQ)
3742 addr = HIGH_QUEUE_INX;
3746 addr = MGT_QUEUE_INX;
3755 static void do_queue_select(_adapter *padapter, struct pkt_attrib *pattrib)
3759 qsel = pattrib->priority;
3760 RT_TRACE(_module_rtl871x_xmit_c_,_drv_info_,("### do_queue_select priority=%d ,qsel = %d\n",pattrib->priority ,qsel));
3762 #ifdef CONFIG_CONCURRENT_MODE
3763 // if (check_fwstate(&padapter->mlmepriv, WIFI_AP_STATE) == _TRUE)
3767 pattrib->qsel = qsel;
3771 * The main transmit(tx) entry
3775 * 0 success, hardware will handle this xmit frame(packet)
3778 s32 rtw_monitor_xmit_entry(struct sk_buff *skb, struct net_device *ndev)
3783 int dot11_hdr_len = 24;
3785 unsigned char *pdata;
3787 unsigned char src_mac_addr[6];
3788 unsigned char dst_mac_addr[6];
3789 struct rtw_ieee80211_hdr *dot11_hdr;
3790 struct ieee80211_radiotap_header *rtap_hdr;
3791 _adapter *padapter = (_adapter *)rtw_netdev_priv(ndev);
3794 rtw_mstat_update(MSTAT_TYPE_SKB, MSTAT_ALLOC_SUCCESS, skb->truesize);
3796 if (unlikely(skb->len < sizeof(struct ieee80211_radiotap_header)))
3799 rtap_hdr = (struct ieee80211_radiotap_header *)skb->data;
3800 if (unlikely(rtap_hdr->it_version))
3803 rtap_len = ieee80211_get_radiotap_len(skb->data);
3804 if (unlikely(skb->len < rtap_len))
3807 if (rtap_len != 12) {
3808 DBG_8192C("radiotap len (should be 14): %d\n", rtap_len);
3812 /* Skip the ratio tap header */
3813 skb_pull(skb, rtap_len);
3815 dot11_hdr = (struct rtw_ieee80211_hdr *)skb->data;
3816 frame_ctl = le16_to_cpu(dot11_hdr->frame_ctl);
3817 /* Check if the QoS bit is set */
3819 if ((frame_ctl & RTW_IEEE80211_FCTL_FTYPE) == RTW_IEEE80211_FTYPE_DATA) {
3821 struct xmit_frame *pmgntframe;
3822 struct pkt_attrib *pattrib;
3823 unsigned char *pframe;
3824 struct rtw_ieee80211_hdr *pwlanhdr;
3825 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
3826 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3827 u8 *buf = skb->data;
3829 u8 category, action;
3832 pmgntframe = alloc_mgtxmitframe(pxmitpriv);
3833 if (pmgntframe == NULL) {
3837 pattrib = &pmgntframe->attrib;
3839 update_monitor_frame_attrib(padapter, pattrib);
3841 pattrib->retry_ctrl = _FALSE;
3843 _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
3845 pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
3847 _rtw_memcpy(pframe, (void *)buf, len);
3849 pattrib->pktlen = len;
3851 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3853 if (is_broadcast_mac_addr(pwlanhdr->addr3) || is_broadcast_mac_addr(pwlanhdr->addr1))
3854 pattrib->rate = MGN_24M;
3856 pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
3857 pattrib->seqnum = pmlmeext->mgnt_seq;
3858 pmlmeext->mgnt_seq++;
3860 pattrib->last_txcmdsz = pattrib->pktlen;
3862 dump_mgntframe(padapter, pmgntframe);
3865 struct xmit_frame *pmgntframe;
3866 struct pkt_attrib *pattrib;
3867 unsigned char *pframe;
3868 struct rtw_ieee80211_hdr *pwlanhdr;
3869 struct xmit_priv *pxmitpriv = &(padapter->xmitpriv);
3870 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
3871 u8 *buf = skb->data;
3873 u8 category, action;
3876 pmgntframe = alloc_mgtxmitframe(pxmitpriv);
3877 if (pmgntframe == NULL)
3880 pattrib = &pmgntframe->attrib;
3881 update_mgntframe_attrib(padapter, pattrib);
3882 pattrib->retry_ctrl = _FALSE;
3884 _rtw_memset(pmgntframe->buf_addr, 0, WLANHDR_OFFSET + TXDESC_OFFSET);
3886 pframe = (u8 *)(pmgntframe->buf_addr) + TXDESC_OFFSET;
3888 _rtw_memcpy(pframe, (void *)buf, len);
3890 pattrib->pktlen = len;
3892 pwlanhdr = (struct rtw_ieee80211_hdr *)pframe;
3894 pmlmeext->mgnt_seq = GetSequence(pwlanhdr);
3895 pattrib->seqnum = pmlmeext->mgnt_seq;
3896 pmlmeext->mgnt_seq++;
3898 pattrib->last_txcmdsz = pattrib->pktlen;
3900 dump_mgntframe(padapter, pmgntframe);
3912 * The main transmit(tx) entry
3916 * 0 success, hardware will handle this xmit frame(packet)
3919 s32 rtw_xmit(_adapter *padapter, _pkt **ppkt)
3921 static u32 start = 0;
3922 static u32 drop_cnt = 0;
3923 #ifdef CONFIG_AP_MODE
3926 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
3927 struct xmit_frame *pxmitframe = NULL;
3928 #ifdef CONFIG_BR_EXT
3929 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
3930 void *br_port = NULL;
3931 #endif // CONFIG_BR_EXT
3935 DBG_COUNTER(padapter->tx_logs.core_tx);
3938 start = rtw_get_current_time();
3940 pxmitframe = rtw_alloc_xmitframe(pxmitpriv);
3942 if (rtw_get_passing_time_ms(start) > 2000) {
3944 DBG_871X("DBG_TX_DROP_FRAME %s no more pxmitframe, drop_cnt:%u\n", __FUNCTION__, drop_cnt);
3945 start = rtw_get_current_time();
3949 if (pxmitframe == NULL) {
3951 RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: no more pxmitframe\n"));
3952 DBG_COUNTER(padapter->tx_logs.core_tx_err_pxmitframe);
3956 #ifdef CONFIG_BR_EXT
3958 #if (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3959 br_port = padapter->pnetdev->br_port;
3960 #else // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3962 br_port = rcu_dereference(padapter->pnetdev->rx_handler_data);
3964 #endif // (LINUX_VERSION_CODE <= KERNEL_VERSION(2, 6, 35))
3966 if( br_port && check_fwstate(pmlmepriv, WIFI_STATION_STATE|WIFI_ADHOC_STATE) == _TRUE)
3968 res = rtw_br_client_tx(padapter, ppkt);
3971 rtw_free_xmitframe(pxmitpriv, pxmitframe);
3972 DBG_COUNTER(padapter->tx_logs.core_tx_err_brtx);
3977 #endif // CONFIG_BR_EXT
3979 res = update_attrib(padapter, *ppkt, &pxmitframe->attrib);
3981 #ifdef CONFIG_WAPI_SUPPORT
3982 if(pxmitframe->attrib.ether_type != 0x88B4)
3984 if(rtw_wapi_drop_for_key_absent(padapter, pxmitframe->attrib.ra))
3986 WAPI_TRACE(WAPI_RX,"drop for key absend when tx \n");
3992 RT_TRACE(_module_xmit_osdep_c_, _drv_err_, ("rtw_xmit: update attrib fail\n"));
3993 #ifdef DBG_TX_DROP_FRAME
3994 DBG_871X("DBG_TX_DROP_FRAME %s update attrib fail\n", __FUNCTION__);
3996 rtw_free_xmitframe(pxmitpriv, pxmitframe);
3999 pxmitframe->pkt = *ppkt;
4001 rtw_led_control(padapter, LED_CTL_TX);
4003 do_queue_select(padapter, &pxmitframe->attrib);
4005 #ifdef CONFIG_AP_MODE
4006 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
4007 if(xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe) == _TRUE)
4009 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4010 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue);
4013 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4017 if (rtw_hal_xmit(padapter, pxmitframe) == _FALSE)
4024 sint xmitframe_enqueue_for_tdls_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
4029 struct sta_info *ptdls_sta=NULL;
4030 struct sta_priv *pstapriv = &padapter->stapriv;
4031 struct pkt_attrib *pattrib = &pxmitframe->attrib;
4032 struct mlme_ext_priv *pmlmeext = &(padapter->mlmeextpriv);
4035 ptdls_sta=rtw_get_stainfo(pstapriv, pattrib->dst);
4036 if(ptdls_sta==NULL){
4038 }else if(ptdls_sta->tdls_sta_state&TDLS_LINKED_STATE){
4040 if(pattrib->triggered==1)
4046 _enter_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
4048 if(ptdls_sta->state&WIFI_SLEEP_STATE)
4050 rtw_list_delete(&pxmitframe->list);
4052 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4054 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&ptdls_sta->sleep_q));
4056 ptdls_sta->sleepq_len++;
4057 ptdls_sta->sleepq_ac_len++;
4059 //indicate 4-AC queue bit in TDLS peer traffic indication
4060 switch(pattrib->priority)
4064 ptdls_sta->uapsd_bk |= BIT(1);
4068 ptdls_sta->uapsd_vi |= BIT(1);
4072 ptdls_sta->uapsd_vo |= BIT(1);
4077 ptdls_sta->uapsd_be |= BIT(1);
4081 /* Transmit TDLS PTI via AP */
4082 if(ptdls_sta->sleepq_len==1)
4083 rtw_tdls_cmd(padapter, ptdls_sta->hwaddr, TDLS_ISSUE_PTI);
4088 _exit_critical_bh(&ptdls_sta->sleep_q.lock, &irqL);
4094 #endif //CONFIG_TDLS
4096 #define RTW_HIQ_FILTER_ALLOW_ALL 0
4097 #define RTW_HIQ_FILTER_ALLOW_SPECIAL 1
4098 #define RTW_HIQ_FILTER_DENY_ALL 2
4100 inline bool xmitframe_hiq_filter(struct xmit_frame *xmitframe)
4102 bool allow = _FALSE;
4103 _adapter *adapter = xmitframe->padapter;
4104 struct registry_priv *registry = &adapter->registrypriv;
4106 if (rtw_get_intf_type(adapter) != RTW_PCIE) {
4108 if (adapter->registrypriv.wifi_spec == 1) {
4110 } else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_SPECIAL) {
4112 struct pkt_attrib *attrib = &xmitframe->attrib;
4114 if (attrib->ether_type == 0x0806
4115 || attrib->ether_type == 0x888e
4116 #ifdef CONFIG_WAPI_SUPPORT
4117 || attrib->ether_type == 0x88B4
4122 DBG_871X(FUNC_ADPT_FMT" ether_type:0x%04x%s\n", FUNC_ADPT_ARG(xmitframe->padapter)
4123 , attrib->ether_type, attrib->dhcp_pkt?" DHCP":"");
4127 else if (registry->hiq_filter == RTW_HIQ_FILTER_ALLOW_ALL) {
4130 else if (registry->hiq_filter == RTW_HIQ_FILTER_DENY_ALL) {
4139 #if defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS)
4141 sint xmitframe_enqueue_for_sleeping_sta(_adapter *padapter, struct xmit_frame *pxmitframe)
4145 struct sta_info *psta=NULL;
4146 struct sta_priv *pstapriv = &padapter->stapriv;
4147 struct pkt_attrib *pattrib = &pxmitframe->attrib;
4148 struct mlme_priv *pmlmepriv = &padapter->mlmepriv;
4149 sint bmcst = IS_MCAST(pattrib->ra);
4150 bool update_tim = _FALSE;
4153 if( padapter->tdlsinfo.link_established == _TRUE )
4155 ret = xmitframe_enqueue_for_tdls_sleeping_sta(padapter, pxmitframe);
4157 #endif //CONFIG_TDLS
4159 if (check_fwstate(pmlmepriv, WIFI_AP_STATE) == _FALSE)
4161 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_fwstate);
4167 psta = pattrib->psta;
4171 DBG_871X("%s, call rtw_get_stainfo()\n", __func__);
4172 psta=rtw_get_stainfo(pstapriv, pattrib->ra);
4175 psta = rtw_get_stainfo(&padapter->stapriv, pattrib->ra);
4176 if(pattrib->psta != psta)
4178 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_sta);
4179 DBG_871X("%s, pattrib->psta(%p) != psta(%p)\n", __func__, pattrib->psta, psta);
4185 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_nosta);
4186 DBG_871X("%s, psta==NUL\n", __func__);
4190 if(!(psta->state &_FW_LINKED))
4192 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_link);
4193 DBG_871X("%s, psta->state(0x%x) != _FW_LINKED\n", __func__, psta->state);
4197 if(pattrib->triggered==1)
4199 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_warn_trigger);
4200 //DBG_871X("directly xmit pspoll_triggered packet\n");
4202 //pattrib->triggered=0;
4203 if (bmcst && xmitframe_hiq_filter(pxmitframe) == _TRUE)
4204 pattrib->qsel = QSLT_HIGH;//HIQ
4212 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4214 if(pstapriv->sta_dz_bitmap)//if anyone sta is in ps mode
4216 //pattrib->qsel = QSLT_HIGH;//HIQ
4218 rtw_list_delete(&pxmitframe->list);
4220 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4222 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
4226 if (!(pstapriv->tim_bitmap & BIT(0)))
4229 pstapriv->tim_bitmap |= BIT(0);//
4230 pstapriv->sta_dz_bitmap |= BIT(0);
4232 //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
4233 if (padapter->registrypriv.wifi_spec == 1) {
4235 *if (update_tim == _TRUE)
4236 * rtw_chk_hi_queue_cmd(padapter);
4240 if (update_tim == _TRUE) {
4241 if (is_broadcast_mac_addr(pattrib->ra))
4242 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer BC");
4244 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer MC");
4246 chk_bmc_sleepq_cmd(padapter);
4250 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4254 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_mcast);
4258 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4265 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4267 if(psta->state&WIFI_SLEEP_STATE)
4271 if(pstapriv->sta_dz_bitmap&BIT(psta->aid))
4273 rtw_list_delete(&pxmitframe->list);
4275 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4277 rtw_list_insert_tail(&pxmitframe->list, get_list_head(&psta->sleep_q));
4281 switch(pattrib->priority)
4285 wmmps_ac = psta->uapsd_bk&BIT(0);
4289 wmmps_ac = psta->uapsd_vi&BIT(0);
4293 wmmps_ac = psta->uapsd_vo&BIT(0);
4298 wmmps_ac = psta->uapsd_be&BIT(0);
4303 psta->sleepq_ac_len++;
4305 if(((psta->has_legacy_ac) && (!wmmps_ac)) ||((!psta->has_legacy_ac)&&(wmmps_ac)))
4307 if (!(pstapriv->tim_bitmap & BIT(psta->aid)))
4310 pstapriv->tim_bitmap |= BIT(psta->aid);
4312 //DBG_871X("enqueue, sq_len=%d, tim=%x\n", psta->sleepq_len, pstapriv->tim_bitmap);
4314 if(update_tim == _TRUE)
4316 //DBG_871X("sleepq_len==1, update BCNTIM\n");
4317 //upate BCN for TIM IE
4318 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "buffer UC");
4322 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4324 //if(psta->sleepq_len > (NR_XMITFRAME>>3))
4326 // wakeup_sta_to_xmit(padapter, psta);
4331 DBG_COUNTER(padapter->tx_logs.core_tx_ap_enqueue_ucast);
4336 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4342 static void dequeue_xmitframes_to_sleeping_queue(_adapter *padapter, struct sta_info *psta, _queue *pframequeue)
4345 _list *plist, *phead;
4347 struct tx_servq *ptxservq;
4348 struct pkt_attrib *pattrib;
4349 struct xmit_frame *pxmitframe;
4350 struct hw_xmit *phwxmits = padapter->xmitpriv.hwxmits;
4352 phead = get_list_head(pframequeue);
4353 plist = get_next(phead);
4355 while (rtw_end_of_queue_search(phead, plist) == _FALSE)
4357 pxmitframe = LIST_CONTAINOR(plist, struct xmit_frame, list);
4359 plist = get_next(plist);
4361 pattrib = &pxmitframe->attrib;
4363 pattrib->triggered = 0;
4365 ret = xmitframe_enqueue_for_sleeping_sta(padapter, pxmitframe);
4369 ptxservq = rtw_get_sta_pending(padapter, psta, pattrib->priority, (u8 *)(&ac_index));
4372 phwxmits[ac_index].accnt--;
4376 //DBG_871X("xmitframe_enqueue_for_sleeping_sta return _FALSE\n");
4383 void stop_sta_xmit(_adapter *padapter, struct sta_info *psta)
4386 struct sta_info *psta_bmc;
4387 struct sta_xmit_priv *pstaxmitpriv;
4388 struct sta_priv *pstapriv = &padapter->stapriv;
4389 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4391 pstaxmitpriv = &psta->sta_xmitpriv;
4394 psta_bmc = rtw_get_bcmc_stainfo(padapter);
4397 _enter_critical_bh(&pxmitpriv->lock, &irqL0);
4399 psta->state |= WIFI_SLEEP_STATE;
4402 if( !(psta->tdls_sta_state & TDLS_LINKED_STATE) )
4403 #endif //CONFIG_TDLS
4404 pstapriv->sta_dz_bitmap |= BIT(psta->aid);
4408 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vo_q.sta_pending);
4409 rtw_list_delete(&(pstaxmitpriv->vo_q.tx_pending));
4412 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->vi_q.sta_pending);
4413 rtw_list_delete(&(pstaxmitpriv->vi_q.tx_pending));
4416 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->be_q.sta_pending);
4417 rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
4420 dequeue_xmitframes_to_sleeping_queue(padapter, psta, &pstaxmitpriv->bk_q.sta_pending);
4421 rtw_list_delete(&(pstaxmitpriv->bk_q.tx_pending));
4424 if (!(psta->tdls_sta_state & TDLS_LINKED_STATE) && (psta_bmc != NULL)) {
4425 #endif //CONFIG_TDLS
4429 pstaxmitpriv = &psta_bmc->sta_xmitpriv;
4430 dequeue_xmitframes_to_sleeping_queue(padapter, psta_bmc, &pstaxmitpriv->be_q.sta_pending);
4431 rtw_list_delete(&(pstaxmitpriv->be_q.tx_pending));
4436 #endif //CONFIG_TDLS
4437 _exit_critical_bh(&pxmitpriv->lock, &irqL0);
4442 void wakeup_sta_to_xmit(_adapter *padapter, struct sta_info *psta)
4445 u8 update_mask=0, wmmps_ac=0;
4446 struct sta_info *psta_bmc;
4447 _list *xmitframe_plist, *xmitframe_phead;
4448 struct xmit_frame *pxmitframe=NULL;
4449 struct sta_priv *pstapriv = &padapter->stapriv;
4450 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4452 psta_bmc = rtw_get_bcmc_stainfo(padapter);
4455 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4456 _enter_critical_bh(&pxmitpriv->lock, &irqL);
4458 xmitframe_phead = get_list_head(&psta->sleep_q);
4459 xmitframe_plist = get_next(xmitframe_phead);
4461 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4463 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4465 xmitframe_plist = get_next(xmitframe_plist);
4467 rtw_list_delete(&pxmitframe->list);
4469 switch(pxmitframe->attrib.priority)
4473 wmmps_ac = psta->uapsd_bk&BIT(1);
4477 wmmps_ac = psta->uapsd_vi&BIT(1);
4481 wmmps_ac = psta->uapsd_vo&BIT(1);
4486 wmmps_ac = psta->uapsd_be&BIT(1);
4491 if(psta->sleepq_len>0)
4492 pxmitframe->attrib.mdata = 1;
4494 pxmitframe->attrib.mdata = 0;
4498 psta->sleepq_ac_len--;
4499 if(psta->sleepq_ac_len>0)
4501 pxmitframe->attrib.mdata = 1;
4502 pxmitframe->attrib.eosp = 0;
4506 pxmitframe->attrib.mdata = 0;
4507 pxmitframe->attrib.eosp = 1;
4511 pxmitframe->attrib.triggered = 1;
4514 _exit_critical_bh(&psta->sleep_q.lock, &irqL);
4515 if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
4517 rtw_os_xmit_complete(padapter, pxmitframe);
4519 _enter_critical_bh(&psta->sleep_q.lock, &irqL);
4521 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4526 if(psta->sleepq_len==0)
4529 if( psta->tdls_sta_state & TDLS_LINKED_STATE )
4531 if(psta->state&WIFI_SLEEP_STATE)
4532 psta->state ^= WIFI_SLEEP_STATE;
4534 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4537 #endif //CONFIG_TDLS
4539 if (pstapriv->tim_bitmap & BIT(psta->aid)) {
4540 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4541 //upate BCN for TIM IE
4542 //update_BCNTIM(padapter);
4543 update_mask = BIT(0);
4546 pstapriv->tim_bitmap &= ~BIT(psta->aid);
4548 if(psta->state&WIFI_SLEEP_STATE)
4549 psta->state ^= WIFI_SLEEP_STATE;
4551 if(psta->state & WIFI_STA_ALIVE_CHK_STATE)
4553 DBG_871X("%s alive check\n", __func__);
4554 psta->expire_to = pstapriv->expire_to;
4555 psta->state ^= WIFI_STA_ALIVE_CHK_STATE;
4558 pstapriv->sta_dz_bitmap &= ~BIT(psta->aid);
4565 if((pstapriv->sta_dz_bitmap&0xfffe) == 0x0)//no any sta in ps mode
4567 xmitframe_phead = get_list_head(&psta_bmc->sleep_q);
4568 xmitframe_plist = get_next(xmitframe_phead);
4570 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4572 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4574 xmitframe_plist = get_next(xmitframe_plist);
4576 rtw_list_delete(&pxmitframe->list);
4578 psta_bmc->sleepq_len--;
4579 if(psta_bmc->sleepq_len>0)
4580 pxmitframe->attrib.mdata = 1;
4582 pxmitframe->attrib.mdata = 0;
4585 pxmitframe->attrib.triggered = 1;
4587 _exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4588 if(rtw_hal_xmit(padapter, pxmitframe) == _TRUE)
4590 rtw_os_xmit_complete(padapter, pxmitframe);
4592 _enter_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4595 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4599 if(psta_bmc->sleepq_len==0)
4601 if (pstapriv->tim_bitmap & BIT(0)) {
4602 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4603 //upate BCN for TIM IE
4604 //update_BCNTIM(padapter);
4605 update_mask |= BIT(1);
4607 pstapriv->tim_bitmap &= ~BIT(0);
4608 pstapriv->sta_dz_bitmap &= ~BIT(0);
4615 //_exit_critical_bh(&psta_bmc->sleep_q.lock, &irqL);
4616 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4620 //update_BCNTIM(padapter);
4621 if ((update_mask & (BIT(0)|BIT(1))) == (BIT(0)|BIT(1)))
4622 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC&BMC");
4623 else if ((update_mask & BIT(1)) == BIT(1))
4624 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear BMC");
4626 _update_beacon(padapter, _TIM_IE_, NULL, _TRUE, "clear UC");
4631 void xmit_delivery_enabled_frames(_adapter *padapter, struct sta_info *psta)
4635 _list *xmitframe_plist, *xmitframe_phead;
4636 struct xmit_frame *pxmitframe=NULL;
4637 struct sta_priv *pstapriv = &padapter->stapriv;
4638 struct xmit_priv *pxmitpriv = &padapter->xmitpriv;
4641 //_enter_critical_bh(&psta->sleep_q.lock, &irqL);
4642 _enter_critical_bh(&pxmitpriv->lock, &irqL);
4644 xmitframe_phead = get_list_head(&psta->sleep_q);
4645 xmitframe_plist = get_next(xmitframe_phead);
4647 while ((rtw_end_of_queue_search(xmitframe_phead, xmitframe_plist)) == _FALSE)
4649 pxmitframe = LIST_CONTAINOR(xmitframe_plist, struct xmit_frame, list);
4651 xmitframe_plist = get_next(xmitframe_plist);
4653 switch(pxmitframe->attrib.priority)
4657 wmmps_ac = psta->uapsd_bk&BIT(1);
4661 wmmps_ac = psta->uapsd_vi&BIT(1);
4665 wmmps_ac = psta->uapsd_vo&BIT(1);
4670 wmmps_ac = psta->uapsd_be&BIT(1);
4677 rtw_list_delete(&pxmitframe->list);
4680 psta->sleepq_ac_len--;
4682 if(psta->sleepq_ac_len>0)
4684 pxmitframe->attrib.mdata = 1;
4685 pxmitframe->attrib.eosp = 0;
4689 pxmitframe->attrib.mdata = 0;
4690 pxmitframe->attrib.eosp = 1;
4693 pxmitframe->attrib.triggered = 1;
4694 rtw_hal_xmitframe_enqueue(padapter, pxmitframe);
4696 if((psta->sleepq_ac_len==0) && (!psta->has_legacy_ac) && (wmmps_ac))
4699 if(psta->tdls_sta_state & TDLS_LINKED_STATE )
4701 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4704 #endif //CONFIG_TDLS
4705 pstapriv->tim_bitmap &= ~BIT(psta->aid);
4707 //DBG_871X("wakeup to xmit, qlen==0, update_BCNTIM, tim=%x\n", pstapriv->tim_bitmap);
4708 //upate BCN for TIM IE
4709 //update_BCNTIM(padapter);
4710 update_beacon(padapter, _TIM_IE_, NULL, _TRUE);
4711 //update_mask = BIT(0);
4717 //_exit_critical_bh(&psta->sleep_q.lock, &irqL);
4718 _exit_critical_bh(&pxmitpriv->lock, &irqL);
4723 #endif /* defined(CONFIG_AP_MODE) || defined(CONFIG_TDLS) */
4725 #ifdef CONFIG_XMIT_THREAD_MODE
4726 void enqueue_pending_xmitbuf(
4727 struct xmit_priv *pxmitpriv,
4728 struct xmit_buf *pxmitbuf)
4732 _adapter *pri_adapter = pxmitpriv->adapter;
4734 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4736 _enter_critical_bh(&pqueue->lock, &irql);
4737 rtw_list_delete(&pxmitbuf->list);
4738 rtw_list_insert_tail(&pxmitbuf->list, get_list_head(pqueue));
4739 _exit_critical_bh(&pqueue->lock, &irql);
4743 #if defined(CONFIG_SDIO_HCI) && defined(CONFIG_CONCURRENT_MODE)
4744 if (pri_adapter->adapter_type > PRIMARY_ADAPTER)
4745 pri_adapter = pri_adapter->pbuddy_adapter;
4746 #endif //SDIO_HCI + CONCURRENT
4747 _rtw_up_sema(&(pri_adapter->xmitpriv.xmit_sema));
4751 void enqueue_pending_xmitbuf_to_head(
4752 struct xmit_priv *pxmitpriv,
4753 struct xmit_buf *pxmitbuf)
4757 _adapter *pri_adapter = pxmitpriv->adapter;
4759 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4761 _enter_critical_bh(&pqueue->lock, &irql);
4762 rtw_list_delete(&pxmitbuf->list);
4763 rtw_list_insert_head(&pxmitbuf->list, get_list_head(pqueue));
4764 _exit_critical_bh(&pqueue->lock, &irql);
4767 struct xmit_buf* dequeue_pending_xmitbuf(
4768 struct xmit_priv *pxmitpriv)
4771 struct xmit_buf *pxmitbuf;
4776 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4778 _enter_critical_bh(&pqueue->lock, &irql);
4780 if (_rtw_queue_empty(pqueue) == _FALSE)
4782 _list *plist, *phead;
4784 phead = get_list_head(pqueue);
4785 plist = get_next(phead);
4786 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
4787 rtw_list_delete(&pxmitbuf->list);
4790 _exit_critical_bh(&pqueue->lock, &irql);
4795 struct xmit_buf* dequeue_pending_xmitbuf_under_survey(
4796 struct xmit_priv *pxmitpriv)
4799 struct xmit_buf *pxmitbuf;
4800 #ifdef CONFIG_USB_HCI
4801 struct xmit_frame *pxmitframe;
4807 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4809 _enter_critical_bh(&pqueue->lock, &irql);
4811 if (_rtw_queue_empty(pqueue) == _FALSE)
4813 _list *plist, *phead;
4816 phead = get_list_head(pqueue);
4819 plist = get_next(plist);
4820 if (plist == phead) break;
4822 pxmitbuf = LIST_CONTAINOR(plist, struct xmit_buf, list);
4824 #ifdef CONFIG_USB_HCI
4825 pxmitframe = (struct xmit_frame*)pxmitbuf->priv_data;
4828 type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_SIZE + pxmitframe->pkt_offset * PACKET_OFFSET_SZ);
4832 DBG_871X("%s, !!!ERROR!!! For USB, TODO ITEM \n", __FUNCTION__);
4835 type = GetFrameSubType(pxmitbuf->pbuf + TXDESC_OFFSET);
4838 if ((type == WIFI_PROBEREQ) ||
4839 (type == WIFI_DATA_NULL) ||
4840 (type == WIFI_QOS_DATA_NULL))
4842 rtw_list_delete(&pxmitbuf->list);
4849 _exit_critical_bh(&pqueue->lock, &irql);
4854 sint check_pending_xmitbuf(
4855 struct xmit_priv *pxmitpriv)
4861 pqueue = &pxmitpriv->pending_xmitbuf_queue;
4863 _enter_critical_bh(&pqueue->lock, &irql);
4865 if(_rtw_queue_empty(pqueue) == _FALSE)
4868 _exit_critical_bh(&pqueue->lock, &irql);
4873 thread_return rtw_xmit_thread(thread_context context)
4880 padapter = (PADAPTER)context;
4882 thread_enter("RTW_XMIT_THREAD");
4885 err = rtw_hal_xmit_thread_handler(padapter);
4886 flush_signals_thread();
4887 } while (_SUCCESS == err);
4889 _rtw_up_sema(&padapter->xmitpriv.terminate_xmitthread_sema);
4895 bool rtw_xmit_ac_blocked(_adapter *adapter)
4897 struct dvobj_priv *dvobj = adapter_to_dvobj(adapter);
4899 struct mlme_ext_priv *mlmeext;
4900 struct mlme_ext_info *mlmeextinfo;
4901 bool blocked = _FALSE;
4904 for (i = 0; i < dvobj->iface_nums; i++) {
4905 iface = dvobj->padapters[i];
4906 mlmeext = &iface->mlmeextpriv;
4908 /* check scan state */
4909 if (mlmeext_scan_state(mlmeext) != SCAN_DISABLE
4910 && mlmeext_scan_state(mlmeext) != SCAN_BACK_OP
4916 if (mlmeext_scan_state(mlmeext) == SCAN_BACK_OP
4917 && !mlmeext_chk_scan_backop_flags(mlmeext, SS_BACKOP_TX_RESUME)
4928 void rtw_sctx_init(struct submit_ctx *sctx, int timeout_ms)
4930 sctx->timeout_ms = timeout_ms;
4931 sctx->submit_time= rtw_get_current_time();
4932 #ifdef PLATFORM_LINUX /* TODO: add condition wating interface for other os */
4933 init_completion(&sctx->done);
4935 sctx->status = RTW_SCTX_SUBMITTED;
4938 int rtw_sctx_wait(struct submit_ctx *sctx, const char *msg)
4941 unsigned long expire;
4944 #ifdef PLATFORM_LINUX
4945 expire= sctx->timeout_ms ? msecs_to_jiffies(sctx->timeout_ms) : MAX_SCHEDULE_TIMEOUT;
4946 if (!wait_for_completion_timeout(&sctx->done, expire)) {
4947 /* timeout, do something?? */
4948 status = RTW_SCTX_DONE_TIMEOUT;
4949 DBG_871X("%s timeout: %s\n", __func__, msg);
4951 status = sctx->status;
4955 if (status == RTW_SCTX_DONE_SUCCESS) {
4962 bool rtw_sctx_chk_waring_status(int status)
4965 case RTW_SCTX_DONE_UNKNOWN:
4966 case RTW_SCTX_DONE_BUF_ALLOC:
4967 case RTW_SCTX_DONE_BUF_FREE:
4969 case RTW_SCTX_DONE_DRV_STOP:
4970 case RTW_SCTX_DONE_DEV_REMOVE:
4977 void rtw_sctx_done_err(struct submit_ctx **sctx, int status)
4980 if (rtw_sctx_chk_waring_status(status))
4981 DBG_871X("%s status:%d\n", __func__, status);
4982 (*sctx)->status = status;
4983 #ifdef PLATFORM_LINUX
4984 complete(&((*sctx)->done));
4990 void rtw_sctx_done(struct submit_ctx **sctx)
4992 rtw_sctx_done_err(sctx, RTW_SCTX_DONE_SUCCESS);
4995 #ifdef CONFIG_XMIT_ACK
4997 #ifdef CONFIG_XMIT_ACK_POLLING
4998 s32 c2h_evt_hdl(_adapter *adapter, u8 *c2h_evt, c2h_id_filter filter);
5001 * rtw_ack_tx_polling -
5002 * @pxmitpriv: xmit_priv to address ack_tx_ops
5003 * @timeout_ms: timeout msec
5005 * Init ack_tx_ops and then do c2h_evt_hdl() and polling ack_tx_ops repeatedly
5006 * till tx report or timeout
5007 * Returns: _SUCCESS if TX report ok, _FAIL for others
5009 int rtw_ack_tx_polling(struct xmit_priv *pxmitpriv, u32 timeout_ms)
5012 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
5013 _adapter *adapter = container_of(pxmitpriv, _adapter, xmitpriv);
5015 pack_tx_ops->submit_time = rtw_get_current_time();
5016 pack_tx_ops->timeout_ms = timeout_ms;
5017 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
5020 c2h_evt_hdl(adapter, NULL, rtw_hal_c2h_id_filter_ccx(adapter));
5021 if (pack_tx_ops->status != RTW_SCTX_SUBMITTED)
5024 if (rtw_is_drv_stopped(adapter)) {
5025 pack_tx_ops->status = RTW_SCTX_DONE_DRV_STOP;
5028 if (rtw_is_surprise_removed(adapter)) {
5029 pack_tx_ops->status = RTW_SCTX_DONE_DEV_REMOVE;
5034 } while (rtw_get_passing_time_ms(pack_tx_ops->submit_time) < timeout_ms);
5036 if (pack_tx_ops->status == RTW_SCTX_SUBMITTED) {
5037 pack_tx_ops->status = RTW_SCTX_DONE_TIMEOUT;
5038 DBG_871X("%s timeout\n", __func__);
5041 if (pack_tx_ops->status == RTW_SCTX_DONE_SUCCESS)
5048 int rtw_ack_tx_wait(struct xmit_priv *pxmitpriv, u32 timeout_ms)
5050 #ifdef CONFIG_XMIT_ACK_POLLING
5051 return rtw_ack_tx_polling(pxmitpriv, timeout_ms);
5053 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
5055 pack_tx_ops->submit_time = rtw_get_current_time();
5056 pack_tx_ops->timeout_ms = timeout_ms;
5057 pack_tx_ops->status = RTW_SCTX_SUBMITTED;
5059 return rtw_sctx_wait(pack_tx_ops, __func__);
5063 void rtw_ack_tx_done(struct xmit_priv *pxmitpriv, int status)
5065 struct submit_ctx *pack_tx_ops = &pxmitpriv->ack_tx_ops;
5067 if (pxmitpriv->ack_tx) {
5068 rtw_sctx_done_err(&pack_tx_ops, status);
5070 DBG_871X("%s ack_tx not set\n", __func__);
5073 #endif //CONFIG_XMIT_ACK