2 * Copyright (c) 2007-2008 Atheros Communications Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 /* Module Name : htr.c */
20 /* This module contains Tx and Rx functions. */
25 /************************************************************************/
28 u16_t
zfWlanRxValidate(zdev_t
* dev
, zbuf_t
* buf
);
29 u16_t
zfWlanRxFilter(zdev_t
* dev
, zbuf_t
* buf
);
33 const u8_t zgSnapBridgeTunnel
[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8 };
34 const u8_t zgSnap8021h
[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 };
35 /* Table for converting IP DSCP P2-P0 bits to 802.11e Access Category */
36 const u8_t zcUpToAc
[8] = {0, 1, 1, 0, 2, 2, 3, 3}; //WMM default
37 //const u8_t zcUpToAc[8] = {0, 1, 1, 0, 0, 0, 0, 0}; //For 2 TxQ
38 //const u8_t zcUpToAc[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //For single TxQ
39 const u8_t zcMaxspToPktNum
[4] = {8, 2, 4, 6};
41 u8_t
zfGetEncryModeFromRxStatus(struct zsAdditionInfo
* addInfo
)
46 securityByte
= (addInfo
->Tail
.Data
.SAIndex
& 0xc0) >> 4; /* byte4 */
47 securityByte
|= (addInfo
->Tail
.Data
.DAIndex
& 0xc0) >> 6; /* byte5 */
49 switch( securityByte
)
57 #endif //ZM_ENABLE_CENC
61 encryMode
= securityByte
;
66 if ( (securityByte
& 0xf8) == 0x08 )
68 // decrypted by software
71 encryMode
= ZM_NO_WEP
;
78 void zfGetRxIvIcvLength(zdev_t
* dev
, zbuf_t
* buf
, u8_t vap
, u16_t
* pIvLen
,
79 u16_t
* pIcvLen
, struct zsAdditionInfo
* addInfo
)
84 zmw_get_wlan_dev(dev
);
89 encryMode
= zfGetEncryModeFromRxStatus(addInfo
);
91 if ( wd
->wlanMode
== ZM_MODE_AP
)
93 if (vap
< ZM_MAX_AP_SUPPORT
)
95 if (( wd
->ap
.encryMode
[vap
] == ZM_WEP64
) ||
96 ( wd
->ap
.encryMode
[vap
] == ZM_WEP128
) ||
97 ( wd
->ap
.encryMode
[vap
] == ZM_WEP256
))
107 addr
[0] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
);
108 addr
[1] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+2);
109 addr
[2] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+4);
111 /* Find STA's information */
112 id
= zfApFindSta(dev
, addr
);
115 if (wd
->ap
.staTable
[id
].encryMode
== ZM_TKIP
)
120 else if (wd
->ap
.staTable
[id
].encryMode
== ZM_AES
)
123 *pIcvLen
= 8; // AES MIC
126 #ifdef ZM_ENABLE_CENC
127 else if (wd
->ap
.staTable
[id
].encryMode
== ZM_CENC
)
132 #endif //ZM_ENABLE_CENC
135 /* WDS port checking */
136 wdsPort
= vap
- 0x20;
137 if (wdsPort
>= ZM_MAX_WDS_SUPPORT
)
142 switch (wd
->ap
.wds
.encryMode
[wdsPort
])
158 #ifdef ZM_ENABLE_CENC
163 #endif //ZM_ENABLE_CENC
167 else if ( wd
->wlanMode
== ZM_MODE_PSEUDO
)
169 /* test: 6518 for QA auto test */
186 #ifdef ZM_ENABLE_CENC
190 #endif //ZM_ENABLE_CENC
195 if ( (encryMode
== ZM_WEP64
)||
196 (encryMode
== ZM_WEP128
)||
197 (encryMode
== ZM_WEP256
) )
202 else if ( encryMode
== ZM_TKIP
)
207 else if ( encryMode
== ZM_AES
)
210 *pIcvLen
= 8; // AES MIC
212 #ifdef ZM_ENABLE_CENC
213 else if ( encryMode
== ZM_CENC
)
218 #endif //ZM_ENABLE_CENC
223 /************************************************************************/
225 /* FUNCTION DESCRIPTION zfAgingDefragList */
226 /* Force flushing whole defrag list or aging the buffer */
227 /* in the defrag list. */
230 /* dev : device pointer */
231 /* flushFlag : 1=>flushing, 0=>Aging */
237 /* Stephen Chen Atheros Communications, INC. 2007.1 */
239 /************************************************************************/
240 void zfAgingDefragList(zdev_t
* dev
, u16_t flushFlag
)
243 zmw_get_wlan_dev(dev
);
244 zmw_declare_for_critical_section();
246 zmw_enter_critical_section(dev
);
248 for(i
=0; i
<ZM_MAX_DEFRAG_ENTRIES
; i
++)
250 if (wd
->defragTable
.defragEntry
[i
].fragCount
!= 0 )
252 if (((wd
->tick
- wd
->defragTable
.defragEntry
[i
].tick
) >
253 (ZM_DEFRAG_AGING_TIME_SEC
* ZM_TICK_PER_SECOND
))
256 zm_msg1_rx(ZM_LV_2
, "Aging defrag list :", i
);
257 /* Free the buffers in the defrag list */
258 for (j
=0; j
<wd
->defragTable
.defragEntry
[i
].fragCount
; j
++)
260 zfwBufFree(dev
, wd
->defragTable
.defragEntry
[i
].fragment
[j
], 0);
264 wd
->defragTable
.defragEntry
[i
].fragCount
= 0;
267 zmw_leave_critical_section(dev
);
273 /************************************************************************/
275 /* FUNCTION DESCRIPTION zfAddFirstFragToDefragList */
276 /* Add first fragment to defragment list, the first empty entry */
277 /* will be selected. If the list is full, sequentially select */
278 /* one entry for replacement. */
281 /* dev : device pointer */
282 /* buf : first fragment buffer */
283 /* addr : address of first fragment buffer */
284 /* seqNum : sequence of first fragment buffer */
290 /* Stephen Chen Atheros Communications, INC. 2007.1 */
292 /************************************************************************/
293 void zfAddFirstFragToDefragList(zdev_t
* dev
, zbuf_t
* buf
, u8_t
* addr
, u16_t seqNum
)
296 zmw_get_wlan_dev(dev
);
297 zmw_declare_for_critical_section();
299 zmw_enter_critical_section(dev
);
301 /* Find an empty one in defrag list */
302 for(i
=0; i
<ZM_MAX_DEFRAG_ENTRIES
; i
++)
304 if ( wd
->defragTable
.defragEntry
[i
].fragCount
== 0 )
310 /* If full, sequentially replace existing one */
311 if (i
== ZM_MAX_DEFRAG_ENTRIES
)
313 i
= wd
->defragTable
.replaceNum
++ & (ZM_MAX_DEFRAG_ENTRIES
-1);
314 /* Free the buffers in the defrag list to be replaced */
315 for (j
=0; j
<wd
->defragTable
.defragEntry
[i
].fragCount
; j
++)
317 zfwBufFree(dev
, wd
->defragTable
.defragEntry
[i
].fragment
[j
], 0);
321 wd
->defragTable
.defragEntry
[i
].fragCount
= 1;
322 wd
->defragTable
.defragEntry
[i
].fragment
[0] = buf
;
323 wd
->defragTable
.defragEntry
[i
].seqNum
= seqNum
;
324 wd
->defragTable
.defragEntry
[i
].tick
= wd
->tick
;
328 wd
->defragTable
.defragEntry
[i
].addr
[j
] = addr
[j
];
331 zmw_leave_critical_section(dev
);
337 /************************************************************************/
339 /* FUNCTION DESCRIPTION zfAddFragToDefragList */
340 /* Add middle or last fragment to defragment list. */
343 /* dev : device pointer */
344 /* buf : first fragment buffer */
345 /* addr : address of fragment buffer */
346 /* seqNum : sequence fragment buffer */
347 /* fragNum : fragment number of fragment buffer */
348 /* moreFrag : more frag bit of fragment buffer */
349 /* addInfo : addition info of fragment buffer */
355 /* Stephen Chen Atheros Communications, INC. 2007.1 */
357 /************************************************************************/
358 zbuf_t
* zfAddFragToDefragList(zdev_t
* dev
, zbuf_t
* buf
, u8_t
* addr
,
359 u16_t seqNum
, u8_t fragNum
, u8_t moreFrag
,
360 struct zsAdditionInfo
* addInfo
)
363 zbuf_t
* returnBuf
= NULL
;
364 u16_t defragDone
= 0;
366 u16_t startAddr
, fragHead
, frameLen
, ivLen
, icvLen
;
367 zmw_get_wlan_dev(dev
);
368 zmw_declare_for_critical_section();
370 zmw_enter_critical_section(dev
);
372 /* Find frag in the defrag list */
373 for(i
=0; i
<ZM_MAX_DEFRAG_ENTRIES
; i
++)
375 if ( wd
->defragTable
.defragEntry
[i
].fragCount
!= 0 )
377 /* Compare address */
380 if (addr
[j
] != wd
->defragTable
.defragEntry
[i
].addr
[j
])
387 /* Compare sequence and fragment number */
388 if (seqNum
== wd
->defragTable
.defragEntry
[i
].seqNum
)
390 if ((fragNum
== wd
->defragTable
.defragEntry
[i
].fragCount
)
393 /* Add frag frame to defrag list */
394 wd
->defragTable
.defragEntry
[i
].fragment
[fragNum
] = buf
;
395 wd
->defragTable
.defragEntry
[i
].fragCount
++;
400 /* merge all fragment if more data bit is cleared */
401 returnBuf
= wd
->defragTable
.defragEntry
[i
].fragment
[0];
402 startAddr
= zfwBufGetSize(dev
, returnBuf
);
403 /* skip WLAN header 24(Data) or 26(QoS Data) */
404 fragHead
= 24 + ((zmw_rx_buf_readh(dev
, returnBuf
, 0) & 0x80) >> 6);
405 zfGetRxIvIcvLength(dev
, returnBuf
, 0, &ivLen
, &icvLen
, addInfo
);
406 fragHead
+= ivLen
; /* skip IV */
407 for(k
=1; k
<wd
->defragTable
.defragEntry
[i
].fragCount
; k
++)
409 frameLen
= zfwBufGetSize(dev
,
410 wd
->defragTable
.defragEntry
[i
].fragment
[k
]);
411 if ((startAddr
+frameLen
-fragHead
) < 1560)
413 zfRxBufferCopy(dev
, returnBuf
, wd
->defragTable
.defragEntry
[i
].fragment
[k
],
414 startAddr
, fragHead
, frameLen
-fragHead
);
415 startAddr
+= (frameLen
-fragHead
);
421 zfwBufFree(dev
, wd
->defragTable
.defragEntry
[i
].fragment
[k
], 0);
424 wd
->defragTable
.defragEntry
[i
].fragCount
= 0;
425 zfwBufSetSize(dev
, returnBuf
, startAddr
);
434 zmw_leave_critical_section(dev
);
438 zfwBufFree(dev
, returnBuf
, 0);
443 zfwBufFree(dev
, buf
, 0);
451 /* return value = NULL => save or free this frame */
452 zbuf_t
* zfDefragment(zdev_t
* dev
, zbuf_t
* buf
, u8_t
* pbIsDefrag
,
453 struct zsAdditionInfo
* addInfo
)
460 zmw_get_wlan_dev(dev
);
462 ZM_BUFFER_TRACE(dev
, buf
)
465 seqNum
= zmw_buf_readh(dev
, buf
, 22);
466 fragNum
= (u8_t
)(seqNum
& 0xf);
467 moreFragBit
= (zmw_buf_readb(dev
, buf
, 1) & ZM_BIT_2
) >> 2;
469 if ((fragNum
== 0) && (moreFragBit
== 0))
471 /* Not part of a fragmentation */
477 wd
->commTally
.swRxFragmentCount
++;
478 seqNum
= seqNum
>> 4;
481 addr
[i
] = zmw_rx_buf_readb(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+i
);
487 /* First part of a fragmentation */
488 zm_msg1_rx(ZM_LV_2
, "First Frag, seq=", seqNum
);
489 zfAddFirstFragToDefragList(dev
, buf
, addr
, seqNum
);
494 /* Middle or last part of a fragmentation */
495 zm_msg1_rx(ZM_LV_2
, "Frag seq=", seqNum
);
496 zm_msg1_rx(ZM_LV_2
, "Frag moreFragBit=", moreFragBit
);
497 buf
= zfAddFragToDefragList(dev
, buf
, addr
, seqNum
, fragNum
, moreFragBit
, addInfo
);
509 #if ZM_PROTOCOL_RESPONSE_SIMULATION
510 u16_t
zfSwap(u16_t num
)
512 return ((num
>> 8) + ((num
& 0xff) << 8));
516 void zfProtRspSim(zdev_t
* dev
, zbuf_t
* buf
)
527 ethType
= zmw_rx_buf_readh(dev
, buf
, 12);
528 zm_msg2_rx(ZM_LV_2
, "ethType=", ethType
);
531 if (ethType
== 0x0608)
533 arpOp
= zmw_rx_buf_readh(dev
, buf
, 20);
534 dip
[0] = zmw_rx_buf_readh(dev
, buf
, 38);
535 dip
[1] = zmw_rx_buf_readh(dev
, buf
, 40);
536 zm_msg2_rx(ZM_LV_2
, "arpOp=", arpOp
);
537 zm_msg2_rx(ZM_LV_2
, "ip0=", dip
[0]);
538 zm_msg2_rx(ZM_LV_2
, "ip1=", dip
[1]);
540 //ARP request to 192.168.1.15
541 if ((arpOp
== 0x0100) && (dip
[0] == 0xa8c0) && (dip
[1] == 0x0f01)) {
542 zm_msg0_rx(ZM_LV_2
, "ARP");
544 zmw_rx_buf_writeh(dev
, buf
, 20, 0x0200);
546 /* dst hardware address */
548 /* src hardware address */
549 //zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
550 //zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
551 //zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
556 temp
= zmw_rx_buf_readh(dev
, buf
, 22+(i
*2));
557 zmw_rx_buf_writeh(dev
, buf
, 32+(i
*2), temp
);
560 /* src hardware address */
561 zmw_rx_buf_writeh(dev
, buf
, 22, 0xa000);
562 zmw_rx_buf_writeh(dev
, buf
, 24, 0x0000);
563 zmw_rx_buf_writeh(dev
, buf
, 26, 0x0000);
566 zmw_rx_buf_writeh(dev
, buf
, 28, 0xa8c0);
567 zmw_rx_buf_writeh(dev
, buf
, 30, 0x0f01);
571 else if (ethType
== 0x0008)
573 zm_msg0_rx(ZM_LV_2
, "IP");
574 prot
= zmw_rx_buf_readb(dev
, buf
, 23);
575 dip
[0] = zmw_rx_buf_readh(dev
, buf
, 30);
576 dip
[1] = zmw_rx_buf_readh(dev
, buf
, 32);
577 zm_msg2_rx(ZM_LV_2
, "prot=", prot
);
578 zm_msg2_rx(ZM_LV_2
, "ip0=", dip
[0]);
579 zm_msg2_rx(ZM_LV_2
, "ip1=", dip
[1]);
581 /* PING request to 192.168.1.15 */
582 if ((prot
== 0x1) && (dip
[0] == 0xa8c0) && (dip
[1] == 0x0f01))
584 zm_msg0_rx(ZM_LV_2
, "ICMP");
588 temp
= zmw_rx_buf_readh(dev
, buf
, 6+(i
*2));
589 zmw_rx_buf_writeh(dev
, buf
, i
*2, temp
);
592 zmw_rx_buf_writeh(dev
, buf
, 6, 0xa000);
593 zmw_rx_buf_writeh(dev
, buf
, 8, 0x0000);
594 zmw_rx_buf_writeh(dev
, buf
, 10, 0x0000);
596 /* exchange src ip and dst ip */
599 temp
= zmw_rx_buf_readh(dev
, buf
, 26+(i
*2));
600 zmw_rx_buf_writeh(dev
, buf
, 30+(i
*2), temp
);
602 zmw_rx_buf_writeh(dev
, buf
, 26, 0xa8c0);
603 zmw_rx_buf_writeh(dev
, buf
, 28, 0x0f01);
605 /* change icmp type to echo reply */
606 zmw_rx_buf_writeb(dev
, buf
, 34, 0x0);
608 /* update icmp checksum */
609 temp
= zmw_rx_buf_readh(dev
, buf
, 36);
611 zmw_rx_buf_writeh(dev
, buf
, 36, temp
);
613 else if (prot
== 0x6)
615 zm_msg0_rx(ZM_LV_2
, "TCP");
616 srcPort
= zmw_rx_buf_readh(dev
, buf
, 34);
617 dstPort
= zmw_rx_buf_readh(dev
, buf
, 36);
618 zm_msg2_rx(ZM_LV_2
, "Src Port=", srcPort
);
619 zm_msg2_rx(ZM_LV_2
, "Dst Port=", dstPort
);
620 if ((dstPort
== 0x1500) || (srcPort
== 0x1500))
622 zm_msg0_rx(ZM_LV_2
, "FTP");
627 temp
= zmw_rx_buf_readh(dev
, buf
, 6+(i
*2));
628 zmw_rx_buf_writeh(dev
, buf
, i
*2, temp
);
631 zmw_rx_buf_writeh(dev
, buf
, 6, 0xa000);
632 zmw_rx_buf_writeh(dev
, buf
, 8, 0x0000);
633 zmw_rx_buf_writeh(dev
, buf
, 10, 0x0000);
635 /* exchange src ip and dst ip */
638 temp
= zmw_rx_buf_readh(dev
, buf
, 26+(i
*2));
639 zmw_rx_buf_writeh(dev
, buf
, 30+(i
*2), temp
);
641 zmw_rx_buf_writeh(dev
, buf
, 26, 0xa8c0);
642 zmw_rx_buf_writeh(dev
, buf
, 28, 0x0f01);
646 else if (prot
== 0x11)
651 temp
= zmw_rx_buf_readh(dev
, buf
, 6+(i
*2));
652 zmw_rx_buf_writeh(dev
, buf
, i
*2, temp
);
655 zmw_rx_buf_writeh(dev
, buf
, 6, 0xa000);
656 zmw_rx_buf_writeh(dev
, buf
, 8, 0x0000);
657 zmw_rx_buf_writeh(dev
, buf
, 10, 0x0000);
659 zm_msg0_rx(ZM_LV_2
, "UDP");
660 srcPort
= zmw_rx_buf_readh(dev
, buf
, 34);
661 dstPort
= zmw_rx_buf_readh(dev
, buf
, 36);
662 zm_msg2_rx(ZM_LV_2
, "Src Port=", srcPort
);
663 zm_msg2_rx(ZM_LV_2
, "Dst Port=", dstPort
);
665 /* exchange src ip and dst ip */
668 temp
= zmw_rx_buf_readh(dev
, buf
, 26+(i
*2));
669 zmw_rx_buf_writeh(dev
, buf
, 30+(i
*2), temp
);
671 zmw_rx_buf_writeh(dev
, buf
, 26, 0xa8c0);
672 zmw_rx_buf_writeh(dev
, buf
, 28, 0x0f01);
675 zmw_rx_buf_writeh(dev
, buf
, 34, srcPort
+1);
676 zmw_rx_buf_writeh(dev
, buf
, 36, dstPort
);
679 zmw_rx_buf_writeh(dev
, buf
, 40, 0);
683 else if (ethType
== 0x0060) /* =>0x0060 is port */
685 /* change src for Evl tool loop back receive */
686 zmw_rx_buf_writeh(dev
, buf
, 6, 0xa000);
687 zmw_rx_buf_writeh(dev
, buf
, 8, 0x0000);
688 zmw_rx_buf_writeh(dev
, buf
, 10, 0x0000);
694 /************************************************************************/
696 /* FUNCTION DESCRIPTION zfiTxSendEth */
697 /* Called to native 802.11 management frames */
700 /* dev : device pointer */
701 /* buf : buffer pointer */
702 /* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */
708 /* Ray ZyDAS Technology Corporation 2005.5 */
710 /************************************************************************/
711 u16_t
zfiTxSend80211Mgmt(zdev_t
* dev
, zbuf_t
* buf
, u16_t port
)
714 //u16_t addrTblSize = 0;
715 //struct zsAddrTbl addrTbl;
717 u16_t header
[(24+25+1)/2];
722 header
[i
] = zmw_buf_readh(dev
, buf
, i
);
726 zfwBufRemoveHead(dev
, buf
, 24);
728 err
= zfHpSend(dev
, header
, hlen
, NULL
, 0, NULL
, 0, buf
, 0,
729 ZM_EXTERNAL_ALLOC_BUF
, 0, 0);
730 if (err
!= ZM_SUCCESS
)
739 zfwBufFree(dev
, buf
, 0);
743 u8_t
zfiIsTxQueueFull(zdev_t
* dev
)
745 zmw_get_wlan_dev(dev
);
746 zmw_declare_for_critical_section();
748 zmw_enter_critical_section(dev
);
749 if ((((wd
->vtxqHead
[0] + 1) & ZM_VTXQ_SIZE_MASK
) != wd
->vtxqTail
[0]) )
751 zmw_leave_critical_section(dev
);
756 zmw_leave_critical_section(dev
);
761 /************************************************************************/
763 /* FUNCTION DESCRIPTION zfiTxSendEth */
764 /* Called to transmit Ethernet frame from upper layer. */
767 /* dev : device pointer */
768 /* buf : buffer pointer */
769 /* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */
775 /* Stephen ZyDAS Technology Corporation 2005.5 */
777 /************************************************************************/
778 u16_t
zfiTxSendEth(zdev_t
* dev
, zbuf_t
* buf
, u16_t port
)
782 zmw_get_wlan_dev(dev
);
784 ZM_PERFORMANCE_TX_MSDU(dev
, wd
->tick
);
785 zm_msg1_tx(ZM_LV_2
, "zfiTxSendEth(), port=", port
);
786 /* Return error if port is disabled */
787 err
= zfTxPortControl(dev
, buf
, port
);
788 if (err
== ZM_PORT_DISABLED
)
790 err
= ZM_ERR_TX_PORT_DISABLED
;
794 if ((wd
->wlanMode
== ZM_MODE_AP
) && (port
< 0x20))
796 /* AP : Buffer frame for power saving STA */
797 ret
= zfApBufferPsFrame(dev
, buf
, port
);
804 if (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
806 if ( zfPowerSavingMgrIsSleeping(dev
) )
808 /*check ZM_ENABLE_POWER_SAVE flag*/
809 zfPowerSavingMgrWakeup(dev
);
812 #ifdef ZM_ENABLE_IBSS_PS
813 /* IBSS power-saving mode */
814 else if ( wd
->wlanMode
== ZM_MODE_IBSS
)
816 if ( zfStaIbssPSQueueData(dev
, buf
) )
823 //if ( wd->bQoSEnable )
826 /* Put to VTXQ[ac] */
827 ret
= zfPutVtxq(dev
, buf
);
834 ret
= zfTxSendEth(dev
, buf
, port
, ZM_EXTERNAL_ALLOC_BUF
, 0);
840 zm_msg2_tx(ZM_LV_1
, "Tx Comp err=", err
);
842 zfwBufFree(dev
, buf
, err
);
847 /************************************************************************/
849 /* FUNCTION DESCRIPTION zfTxSendEth */
850 /* Called to transmit Ethernet frame from upper layer. */
853 /* dev : device pointer */
854 /* buf : buffer pointer */
855 /* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */
861 /* Stephen ZyDAS Technology Corporation 2005.5 */
863 /************************************************************************/
864 u16_t
zfTxSendEth(zdev_t
* dev
, zbuf_t
* buf
, u16_t port
, u16_t bufType
, u16_t flag
)
867 //struct zsAddrTbl addrTbl;
869 u16_t header
[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
884 u8_t qosType
, keyIdx
= 0;
887 u8_t tkipFrameOffset
= 0;
889 zmw_get_wlan_dev(dev
);
891 zmw_declare_for_critical_section();
893 newFlag
= flag
& 0xff00;
896 zm_msg1_tx(ZM_LV_2
, "zfTxSendEth(), port=", port
);
898 /* Get IP TOS for QoS AC and IP frag offset */
899 zfTxGetIpTosAndFrag(dev
, buf
, &up
, &fragOff
);
907 #ifdef ZM_ENABLE_NATIVE_WIFI
908 if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
911 da
[0] = zmw_tx_buf_readh(dev
, buf
, 16);
912 da
[1] = zmw_tx_buf_readh(dev
, buf
, 18);
913 da
[2] = zmw_tx_buf_readh(dev
, buf
, 20);
915 sa
[0] = zmw_tx_buf_readh(dev
, buf
, 10);
916 sa
[1] = zmw_tx_buf_readh(dev
, buf
, 12);
917 sa
[2] = zmw_tx_buf_readh(dev
, buf
, 14);
919 else if ( wd
->wlanMode
== ZM_MODE_IBSS
)
922 da
[0] = zmw_tx_buf_readh(dev
, buf
, 4);
923 da
[1] = zmw_tx_buf_readh(dev
, buf
, 6);
924 da
[2] = zmw_tx_buf_readh(dev
, buf
, 8);
926 sa
[0] = zmw_tx_buf_readh(dev
, buf
, 10);
927 sa
[1] = zmw_tx_buf_readh(dev
, buf
, 12);
928 sa
[2] = zmw_tx_buf_readh(dev
, buf
, 14);
930 else if ( wd
->wlanMode
== ZM_MODE_AP
)
933 da
[0] = zmw_tx_buf_readh(dev
, buf
, 4);
934 da
[1] = zmw_tx_buf_readh(dev
, buf
, 6);
935 da
[2] = zmw_tx_buf_readh(dev
, buf
, 8);
937 sa
[0] = zmw_tx_buf_readh(dev
, buf
, 16);
938 sa
[1] = zmw_tx_buf_readh(dev
, buf
, 18);
939 sa
[2] = zmw_tx_buf_readh(dev
, buf
, 20);
947 da
[0] = zmw_tx_buf_readh(dev
, buf
, 0);
948 da
[1] = zmw_tx_buf_readh(dev
, buf
, 2);
949 da
[2] = zmw_tx_buf_readh(dev
, buf
, 4);
951 sa
[0] = zmw_tx_buf_readh(dev
, buf
, 6);
952 sa
[1] = zmw_tx_buf_readh(dev
, buf
, 8);
953 sa
[2] = zmw_tx_buf_readh(dev
, buf
, 10);
955 //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m)
956 if (wd
->wlanMode
== ZM_MODE_AP
)
958 keyIdx
= wd
->ap
.bcHalKeyIdx
[port
];
959 id
= zfApFindSta(dev
, da
);
962 switch (wd
->ap
.staTable
[id
].encryMode
)
966 #ifdef ZM_ENABLE_CENC
968 #endif //ZM_ENABLE_CENC
969 keyIdx
= wd
->ap
.staTable
[id
].keyIdx
;
976 switch (wd
->sta
.encryMode
)
981 keyIdx
= wd
->sta
.keyId
;
990 #ifdef ZM_ENABLE_CENC
992 keyIdx
= wd
->sta
.cencKeyId
;
994 #endif //ZM_ENABLE_CENC
999 removeLen
= zfTxGenWlanSnap(dev
, buf
, snap
, &snapLen
);
1000 //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff);
1003 /* ********************************************************************************************** */
1004 /* Add 20071025 Mxzeng */
1005 /* ********************************************************************************************** */
1006 /* ---------------------------------------------------------------------------------------------- */
1007 /* Ethernet : frameLen = zfwBufGetSize(dev, buf); */
1008 /* ---+--6--+--6--+--2--+-----20-----+-------------------------+------ Variable -------+--------- */
1009 /* | DA | SA | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */
1010 /* ---+-----+-----+-----+------------+-------------------------+-----------------------+--------- */
1011 /* MSDU = 6 + 6 + 2 + ( Network Layer header ) + ( Transport Layer header ) + L */
1013 /* MSDU - DA - SA : frameLen -= removeLen; */
1014 /* ---+--2--+-----20-----+-------------------------+------ Variable -------+--------------------- */
1015 /* | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */
1016 /* ---+-----+------------+-------------------------+-----------------------+--------------------- */
1018 /* MPDU : frameLen + mpduLengthOffset ; */
1019 /* -+---2---+----2---+-6-+-6-+--6--+---2----+--1--+--1-+---1---+-------3------+-frameLen-+---4--+- */
1020 /* | frame |duration| DA|SA |BSSID|sequence|SNAP |SNAP|Control| RFC 1042 | | FCS | */
1021 /* |Control| | | | | number |DSAP |SSAP| | encapsulation| | | */
1022 /* -+-------+--------+---+---+-----+--------+-----+----+-------+--------------+----------+------+- */
1023 /* ----------------------------------------------------------------------------------------------- */
1025 if ( wd
->sta
.encryMode
== ZM_TKIP
)
1026 tkipFrameOffset
= 8;
1028 fragLen
= wd
->fragThreshold
+ tkipFrameOffset
; // Fragmentation threshold for MPDU Lengths
1029 frameLen
= zfwBufGetSize(dev
, buf
); // MSDU Lengths
1030 frameLen
-= removeLen
; // MSDU Lengths - DA - SA
1032 /* #1st create MIC Length manually */
1035 /* Access Category */
1036 if (wd
->wlanMode
== ZM_MODE_AP
)
1038 zfApGetStaQosType(dev
, da
, &qosType
);
1044 else if (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
1046 if (wd
->sta
.wmeConnected
== 0)
1053 /* TODO : STA QoS control field */
1057 /* #2nd Assign sequence number */
1058 zmw_enter_critical_section(dev
);
1059 frag
.seq
[0] = ((wd
->seq
[zcUpToAc
[up
&0x7]]++) << 4);
1060 zmw_leave_critical_section(dev
);
1062 /* #3rd Pass the total payload to generate MPDU length ! */
1064 frag
.bufType
[0] = bufType
;
1065 frag
.flag
[0] = (u8_t
)flag
;
1068 headerLen
= zfTxGenWlanHeader(dev
, frag
.buf
[0], header
, frag
.seq
[0],
1069 frag
.flag
[0], snapLen
+micLen
, removeLen
, port
, da
, sa
,
1070 up
, &micLen
, snap
, snapLen
, NULL
);
1072 //zm_debug_msg1("#1 headerLen = ", headerLen);
1074 /* #4th Check the HeaderLen and determine whether the MPDU Lengths bigger than Fragmentation threshold */
1075 /* If MPDU Lengths large than fragmentation threshold --> headerLen = 0 */
1076 if( headerLen
!= 0 )
1078 zf80211FrameSend(dev
, frag
.buf
[0], header
, snapLen
, da
, sa
, up
,
1079 headerLen
, snap
, mic
, micLen
, removeLen
, frag
.bufType
[0],
1080 zcUpToAc
[up
&0x7], keyIdx
);
1082 else //if( headerLen == 0 ) // Need to be fragmented
1084 u16_t mpduLengthOffset
;
1085 u16_t pseudSnapLen
= 0;
1087 mpduLengthOffset
= header
[0] - frameLen
; // For fragmentation threshold !
1089 micLen
= zfTxGenWlanTail(dev
, buf
, snap
, snapLen
, mic
); // Get snap and mic information
1091 fragLen
= fragLen
- mpduLengthOffset
;
1093 //zm_debug_msg1("#2 frameLen = ", frameLen);
1094 //zm_debug_msg1("#3 fragThreshold = ", fragLen);
1097 if (frameLen
>= fragLen
)
1099 //copy fragLen to frag
1101 while( frameLen
> 0 )
1103 frag
.buf
[i
] = zfwBufAllocate(dev
, fragLen
+32);
1104 if (frag
.buf
[i
] != NULL
)
1106 frag
.bufType
[i
] = ZM_INTERNAL_ALLOC_BUF
;
1107 frag
.seq
[i
] = frag
.seq
[0] + i
;
1108 offset
= removeLen
+ i
*fragLen
;
1110 /* Consider the offset if we consider snap length to the other fragmented frame */
1112 offset
= offset
+ pseudSnapLen
*(i
-1);
1114 if (frameLen
> fragLen
+ pseudSnapLen
)
1116 frag
.flag
[i
] = flag
| 0x4; /* More data */
1117 /* First fragment */
1121 for (j
=0; j
<snapLen
; j
+=2)
1123 zmw_tx_buf_writeh(dev
, frag
.buf
[i
], j
, snap
[(j
>>1)]);
1125 zfTxBufferCopy(dev
, frag
.buf
[i
], buf
, snapLen
, offset
, fragLen
);
1126 zfwBufSetSize(dev
, frag
.buf
[i
], snapLen
+fragLen
);
1128 /* Add pseud snap length to the other fragmented frame */
1129 pseudSnapLen
= snapLen
;
1131 frameLen
-= fragLen
;
1133 /* Intermediate Fragment */
1136 //zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen);
1137 //zfwBufSetSize(dev, frag.buf[i], fragLen);
1139 zfTxBufferCopy(dev
, frag
.buf
[i
], buf
, 0, offset
, fragLen
+pseudSnapLen
);
1140 zfwBufSetSize(dev
, frag
.buf
[i
], fragLen
+pseudSnapLen
);
1142 frameLen
-= (fragLen
+pseudSnapLen
);
1144 //frameLen -= fragLen;
1149 zfTxBufferCopy(dev
, frag
.buf
[i
], buf
, 0, offset
, frameLen
);
1150 /* Add MIC if need */
1153 zfCopyToRxBuffer(dev
, frag
.buf
[i
], (u8_t
*) mic
, frameLen
, micLen
);
1155 zfwBufSetSize(dev
, frag
.buf
[i
], frameLen
+micLen
);
1157 frag
.flag
[i
] = (u8_t
)flag
; /* No more data */
1166 // Please pay attention to the index of the buf !!!
1167 // If write to null buf , the OS will crash !!!
1168 zfwCopyBufContext(dev
, buf
, frag
.buf
[i
-1]);
1171 snapLen
= micLen
= removeLen
= 0;
1173 zfwBufFree(dev
, buf
, 0);
1176 for (i
=0; i
<fragNum
; i
++)
1178 /* Create WLAN header(Control Setting + 802.11 header + IV) */
1179 headerLen
= zfTxGenWlanHeader(dev
, frag
.buf
[i
], header
, frag
.seq
[i
],
1180 frag
.flag
[i
], snapLen
+micLen
, removeLen
, port
, da
, sa
, up
, &micLen
,
1181 snap
, snapLen
, NULL
);
1183 zf80211FrameSend(dev
, frag
.buf
[i
], header
, snapLen
, da
, sa
, up
,
1184 headerLen
, snap
, mic
, micLen
, removeLen
, frag
.bufType
[i
],
1185 zcUpToAc
[up
&0x7], keyIdx
);
1187 } /* for (i=0; i<fragNum; i++) */
1194 /************************************************************************/
1196 /* FUNCTION DESCRIPTION zfTxPortControl */
1197 /* Check port status. */
1200 /* buf : buffer pointer */
1201 /* port : port number, 0=>standard, 10-17=>Virtual AP, 20-25=>WDS */
1204 /* ZM_PORT_ENABLED or ZM_PORT_DISABLE */
1207 /* Signature ZyDAS Technology Corporation 2005.4 */
1209 /************************************************************************/
1210 u16_t
zfTxPortControl(zdev_t
* dev
, zbuf_t
* buf
, u16_t port
)
1212 zmw_get_wlan_dev(dev
);
1214 if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
1216 if ( wd
->sta
.adapterState
== ZM_STA_STATE_DISCONNECT
)
1218 zm_msg0_tx(ZM_LV_3
, "Packets dropped due to disconnect state");
1219 return ZM_PORT_DISABLED
;
1223 return ZM_PORT_ENABLED
;
1228 /************************************************************************/
1230 /* FUNCTION DESCRIPTION zfIdlRecv */
1231 /* Do frame validation and filtering then pass to zfwRecv80211(). */
1234 /* dev : device pointer */
1235 /* buf : received 802.11 frame buffer. */
1241 /* Stephen ZyDAS Technology Corporation 2005.10 */
1243 /************************************************************************/
1244 void zfCoreRecv(zdev_t
* dev
, zbuf_t
* buf
, struct zsAdditionInfo
* addInfo
)
1248 struct agg_tid_rx
*tid_rx
;
1249 zmw_get_wlan_dev(dev
);
1251 ZM_BUFFER_TRACE(dev
, buf
)
1254 wd
->commTally
.DriverRxFrmCnt
++;
1256 bssid
[0] = zmw_buf_readh(dev
, buf
, 16);
1257 bssid
[1] = zmw_buf_readh(dev
, buf
, 18);
1258 bssid
[2] = zmw_buf_readh(dev
, buf
, 20);
1260 /* Validate Rx frame */
1261 ret
= zfWlanRxValidate(dev
, buf
);
1262 if (ret
!= ZM_SUCCESS
)
1264 zm_msg1_rx(ZM_LV_1
, "Rx invalid:", ret
);
1268 #ifdef ZM_ENABLE_AGGREGATION
1269 //#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION
1273 tid_rx
= zfAggRxEnabled(dev
, buf
);
1274 if (tid_rx
&& wd
->reorder
)
1276 zfAggRx(dev
, buf
, addInfo
, tid_rx
);
1281 * end of add by honda
1286 /* Filter Rx frame */
1287 ret
= zfWlanRxFilter(dev
, buf
);
1288 if (ret
!= ZM_SUCCESS
)
1290 zm_msg1_rx(ZM_LV_1
, "Rx duplicated:", ret
);
1294 /* Discard error frame except mic failure */
1295 if ((addInfo
->Tail
.Data
.ErrorIndication
& 0x3f) != 0)
1297 if ( wd
->XLinkMode
&& ((addInfo
->Tail
.Data
.ErrorIndication
& 0x3f)==0x10) &&
1298 zfCompareWithBssid(dev
, bssid
) )
1300 // Bypass frames !!!
1309 /* OTUS command-8212 dump rx packet */
1310 if (wd
->rxPacketDump
)
1312 zfwDumpBuf(dev
, buf
);
1315 /* Call zfwRecv80211() wrapper function to deliver Rx packet */
1316 /* to driver framework. */
1318 if (wd
->zfcbRecv80211
!= NULL
)
1320 wd
->zfcbRecv80211(dev
, buf
, addInfo
); //CWYang(m)
1324 zfiRecv80211(dev
, buf
, addInfo
);
1329 zm_msg1_rx(ZM_LV_1
, "Free packet, error code:", ret
);
1331 wd
->commTally
.DriverDiscardedFrm
++;
1333 /* Free Rx buffer */
1334 zfwBufFree(dev
, buf
, 0);
1340 void zfShowRxEAPOL(zdev_t
* dev
, zbuf_t
* buf
, u16_t offset
)
1342 u8_t packetType
, keyType
, code
, identifier
, type
, flags
;
1343 u16_t packetLen
, keyInfo
, keyLen
, keyDataLen
, length
, Op_Code
;
1344 u32_t replayCounterH
, replayCounterL
, vendorId
, VendorType
;
1346 /* EAPOL packet type */
1347 packetType
= zmw_rx_buf_readb(dev
, buf
, offset
+1); // 0: EAP-Packet
1351 // 4: EAPOL-Encapsulated-ASF-Alert
1353 /* EAPOL frame format */
1354 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1355 /* ----------------------------------------------- */
1356 /* PAE Ethernet Type (0x888e) */
1357 /* ----------------------------------------------- 2 */
1358 /* Protocol Version | Type */
1359 /* ----------------------------------------------- 4 */
1361 /* ----------------------------------------------- 6 */
1363 /* ----------------------------------------------- N */
1365 /* EAPOL body length */
1366 packetLen
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+2)) << 8) +
1367 zmw_rx_buf_readb(dev
, buf
, offset
+3);
1369 if( packetType
== 0 )
1372 /* EAP-Packet Code */
1373 code
= zmw_rx_buf_readb(dev
, buf
, offset
+4); // 1 : Request
1377 // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4.
1379 /* EAP Packet format */
1380 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1381 /* ----------------------------------------------- */
1382 /* Code | Identifier */
1383 /* ----------------------------------------------- 2 */
1385 /* ----------------------------------------------- 4 */
1387 /* ----------------------------------------------- N */
1389 zm_debug_msg0("EAP-Packet");
1390 zm_debug_msg1("Packet Length = ", packetLen
);
1391 zm_debug_msg1("EAP-Packet Code = ", code
);
1395 zm_debug_msg0("EAP-Packet Request");
1397 /* EAP-Packet Identifier */
1398 identifier
= zmw_rx_buf_readb(dev
, buf
, offset
+5);
1399 /* EAP-Packet Length */
1400 length
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1401 zmw_rx_buf_readb(dev
, buf
, offset
+7);
1402 /* EAP-Packet Type */
1403 type
= zmw_rx_buf_readb(dev
, buf
, offset
+8); // 1 : Identity
1405 // 3 : Nak (Response Only)
1406 // 4 : MD5-Challenge
1407 // 5 : One Time Password (OTP)
1408 // 6 : Generic Token Card (GTC)
1409 // 254 : (Expanded Types)Wi-Fi Protected Setup
1410 // 255 : Experimental Use
1412 /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */
1413 /* 0 1 2 3 4 5 6 7 N */
1414 /* ----------------------------------------------- */
1415 /* Type | Type Data */
1416 /* ----------------------------------------------- */
1418 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1419 zm_debug_msg1("EAP-Packet Length = ", length
);
1420 zm_debug_msg1("EAP-Packet Type = ", type
);
1424 zm_debug_msg0("EAP-Packet Request Identity");
1426 else if( type
== 2 )
1428 zm_debug_msg0("EAP-Packet Request Notification");
1430 else if( type
== 4 )
1432 zm_debug_msg0("EAP-Packet Request MD5-Challenge");
1434 else if( type
== 5 )
1436 zm_debug_msg0("EAP-Packet Request One Time Password");
1438 else if( type
== 6 )
1440 zm_debug_msg0("EAP-Packet Request Generic Token Card");
1442 else if( type
== 254 )
1444 zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup");
1447 /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
1448 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
1449 /*| Type | Vendor-Id |*/
1450 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
1452 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
1453 /*| Vendor data... */
1454 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
1456 /* EAP-Packet Vendor ID */
1457 vendorId
= (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+9)) << 16) +
1458 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+10)) << 8) +
1459 zmw_rx_buf_readb(dev
, buf
, offset
+11);
1460 /* EAP-Packet Vendor Type */
1461 VendorType
= (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+12)) << 24) +
1462 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+13)) << 16) +
1463 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+14)) << 8) +
1464 zmw_rx_buf_readb(dev
, buf
, offset
+15);
1465 /* EAP-Packet Op Code */
1466 Op_Code
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+16)) << 8) +
1467 zmw_rx_buf_readb(dev
, buf
, offset
+17);
1468 /* EAP-Packet Flags */
1469 flags
= zmw_rx_buf_readb(dev
, buf
, offset
+18);
1471 zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId
);
1472 zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType
);
1473 zm_debug_msg1("EAP-Packet Op Code = ", Op_Code
);
1474 zm_debug_msg1("EAP-Packet Flags = ", flags
);
1477 else if( code
== 2 )
1479 zm_debug_msg0("EAP-Packet Response");
1481 /* EAP-Packet Identifier */
1482 identifier
= zmw_rx_buf_readb(dev
, buf
, offset
+5);
1483 /* EAP-Packet Length */
1484 length
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1485 zmw_rx_buf_readb(dev
, buf
, offset
+7);
1486 /* EAP-Packet Type */
1487 type
= zmw_rx_buf_readb(dev
, buf
, offset
+8);
1489 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1490 zm_debug_msg1("EAP-Packet Length = ", length
);
1491 zm_debug_msg1("EAP-Packet Type = ", type
);
1495 zm_debug_msg0("EAP-Packet Response Identity");
1497 else if( type
== 2 )
1499 zm_debug_msg0("EAP-Packet Request Notification");
1501 else if( type
== 3 )
1503 zm_debug_msg0("EAP-Packet Request Nak");
1505 else if( type
== 4 )
1507 zm_debug_msg0("EAP-Packet Request MD5-Challenge");
1509 else if( type
== 5 )
1511 zm_debug_msg0("EAP-Packet Request One Time Password");
1513 else if( type
== 6 )
1515 zm_debug_msg0("EAP-Packet Request Generic Token Card");
1517 else if( type
== 254 )
1519 zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup");
1521 /* EAP-Packet Vendor ID */
1522 vendorId
= (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+9)) << 16) +
1523 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+10)) << 8) +
1524 zmw_rx_buf_readb(dev
, buf
, offset
+11);
1525 /* EAP-Packet Vendor Type */
1526 VendorType
= (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+12)) << 24) +
1527 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+13)) << 16) +
1528 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+14)) << 8) +
1529 zmw_rx_buf_readb(dev
, buf
, offset
+15);
1530 /* EAP-Packet Op Code */
1531 Op_Code
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+16)) << 8) +
1532 zmw_rx_buf_readb(dev
, buf
, offset
+17);
1533 /* EAP-Packet Flags */
1534 flags
= zmw_rx_buf_readb(dev
, buf
, offset
+18);
1536 zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId
);
1537 zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType
);
1538 zm_debug_msg1("EAP-Packet Op Code = ", Op_Code
);
1539 zm_debug_msg1("EAP-Packet Flags = ", flags
);
1542 else if( code
== 3 )
1544 zm_debug_msg0("EAP-Packet Success");
1546 /* EAP-Packet Identifier */
1547 identifier
= zmw_rx_buf_readb(dev
, buf
, offset
+5);
1548 /* EAP-Packet Length */
1549 length
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1550 zmw_rx_buf_readb(dev
, buf
, offset
+7);
1552 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1553 zm_debug_msg1("EAP-Packet Length = ", length
);
1555 else if( code
== 4 )
1557 zm_debug_msg0("EAP-Packet Failure");
1559 /* EAP-Packet Identifier */
1560 identifier
= zmw_rx_buf_readb(dev
, buf
, offset
+5);
1561 /* EAP-Packet Length */
1562 length
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1563 zmw_rx_buf_readb(dev
, buf
, offset
+7);
1565 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1566 zm_debug_msg1("EAP-Packet Length = ", length
);
1569 else if( packetType
== 1 )
1571 zm_debug_msg0("EAPOL-Start");
1573 else if( packetType
== 2 )
1575 zm_debug_msg0("EAPOL-Logoff");
1577 else if( packetType
== 3 )
1579 /* EAPOL-Key type */
1580 keyType
= zmw_rx_buf_readb(dev
, buf
, offset
+4);
1581 /* EAPOL-Key information */
1582 keyInfo
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+5)) << 8) +
1583 zmw_rx_buf_readb(dev
, buf
, offset
+6);
1584 /* EAPOL-Key length */
1585 keyLen
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+7)) << 8) +
1586 zmw_rx_buf_readb(dev
, buf
, offset
+8);
1587 /* EAPOL-Key replay counter (high double word) */
1588 replayCounterH
= (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+9)) << 24) +
1589 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+10)) << 16) +
1590 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+11)) << 8) +
1591 zmw_rx_buf_readb(dev
, buf
, offset
+12);
1592 /* EAPOL-Key replay counter (low double word) */
1593 replayCounterL
= (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+13)) << 24) +
1594 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+14)) << 16) +
1595 (((u32_t
) zmw_rx_buf_readb(dev
, buf
, offset
+15)) << 8) +
1596 zmw_rx_buf_readb(dev
, buf
, offset
+16);
1597 /* EAPOL-Key data length */
1598 keyDataLen
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+97)) << 8) +
1599 zmw_rx_buf_readb(dev
, buf
, offset
+98);
1601 zm_debug_msg0("EAPOL-Key");
1602 zm_debug_msg1("packet length = ", packetLen
);
1604 if ( keyType
== 254 )
1606 zm_debug_msg0("key type = 254 (SSN key descriptor)");
1610 zm_debug_msg2("key type = 0x", keyType
);
1613 zm_debug_msg2("replay counter(L) = ", replayCounterL
);
1615 zm_debug_msg2("key information = ", keyInfo
);
1617 if ( keyInfo
& ZM_BIT_3
)
1619 zm_debug_msg0(" - pairwise key");
1623 zm_debug_msg0(" - group key");
1626 if ( keyInfo
& ZM_BIT_6
)
1628 zm_debug_msg0(" - Tx key installed");
1632 zm_debug_msg0(" - Tx key not set");
1635 if ( keyInfo
& ZM_BIT_7
)
1637 zm_debug_msg0(" - Ack needed");
1641 zm_debug_msg0(" - Ack not needed");
1644 if ( keyInfo
& ZM_BIT_8
)
1646 zm_debug_msg0(" - MIC set");
1650 zm_debug_msg0(" - MIC not set");
1653 if ( keyInfo
& ZM_BIT_9
)
1655 zm_debug_msg0(" - packet encrypted");
1659 zm_debug_msg0(" - packet not encrypted");
1662 zm_debug_msg1("keyLen = ", keyLen
);
1663 zm_debug_msg1("keyDataLen = ", keyDataLen
);
1665 else if( packetType
== 4 )
1667 zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert");
1671 void zfShowTxEAPOL(zdev_t
* dev
, zbuf_t
* buf
, u16_t offset
)
1673 u8_t packetType
, keyType
, code
, identifier
, type
, flags
;
1674 u16_t packetLen
, keyInfo
, keyLen
, keyDataLen
, length
, Op_Code
;
1675 u32_t replayCounterH
, replayCounterL
, vendorId
, VendorType
;
1677 zm_debug_msg1("EAPOL Packet size = ", zfwBufGetSize(dev
, buf
));
1679 /* EAPOL packet type */
1684 // 4: EAPOL-Encapsulated-ASF-Alert
1686 /* EAPOL frame format */
1687 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1688 /* ----------------------------------------------- */
1689 /* PAE Ethernet Type (0x888e) */
1690 /* ----------------------------------------------- 2 */
1691 /* Protocol Version | Type */
1692 /* ----------------------------------------------- 4 */
1694 /* ----------------------------------------------- 6 */
1696 /* ----------------------------------------------- N */
1698 packetType
= zmw_tx_buf_readb(dev
, buf
, offset
+1);
1699 /* EAPOL body length */
1700 packetLen
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+2)) << 8) +
1701 zmw_tx_buf_readb(dev
, buf
, offset
+3);
1703 if( packetType
== 0 )
1705 /* EAP-Packet Code */
1706 code
= zmw_tx_buf_readb(dev
, buf
, offset
+4); // 1 : Request
1711 // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4.
1713 /* EAP Packet format */
1714 /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
1715 /* ----------------------------------------------- */
1716 /* Code | Identifier */
1717 /* ----------------------------------------------- 2 */
1719 /* ----------------------------------------------- 4 */
1721 /* ----------------------------------------------- N */
1723 zm_debug_msg0("EAP-Packet");
1724 zm_debug_msg1("Packet Length = ", packetLen
);
1725 zm_debug_msg1("EAP-Packet Code = ", code
);
1729 zm_debug_msg0("EAP-Packet Request");
1731 /* EAP-Packet Identifier */
1732 identifier
= zmw_tx_buf_readb(dev
, buf
, offset
+5);
1733 /* EAP-Packet Length */
1734 length
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1735 zmw_tx_buf_readb(dev
, buf
, offset
+7);
1736 /* EAP-Packet Type */
1737 type
= zmw_tx_buf_readb(dev
, buf
, offset
+8); // 1 : Identity
1739 // 3 : Nak (Response Only)
1740 // 4 : MD5-Challenge
1741 // 5 : One Time Password (OTP)
1742 // 6 : Generic Token Card (GTC)
1743 // 254 : (Expanded Types)Wi-Fi Protected Setup
1744 // 255 : Experimental Use
1746 /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */
1747 /* 0 1 2 3 4 5 6 7 N */
1748 /* ----------------------------------------------- */
1749 /* Type | Type Data */
1750 /* ----------------------------------------------- */
1752 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1753 zm_debug_msg1("EAP-Packet Length = ", length
);
1754 zm_debug_msg1("EAP-Packet Type = ", type
);
1758 zm_debug_msg0("EAP-Packet Request Identity");
1760 else if( type
== 2 )
1762 zm_debug_msg0("EAP-Packet Request Notification");
1764 else if( type
== 4 )
1766 zm_debug_msg0("EAP-Packet Request MD5-Challenge");
1768 else if( type
== 5 )
1770 zm_debug_msg0("EAP-Packet Request One Time Password");
1772 else if( type
== 6 )
1774 zm_debug_msg0("EAP-Packet Request Generic Token Card");
1776 else if( type
== 254 )
1778 zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup");
1781 /* 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 */
1782 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
1783 /*| Type | Vendor-Id |*/
1784 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
1786 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
1787 /*| Vendor data... */
1788 /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
1790 /* EAP-Packet Vendor ID */
1791 vendorId
= (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+9)) << 16) +
1792 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+10)) << 8) +
1793 zmw_tx_buf_readb(dev
, buf
, offset
+11);
1794 /* EAP-Packet Vendor Type */
1795 VendorType
= (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+12)) << 24) +
1796 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+13)) << 16) +
1797 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+14)) << 8) +
1798 zmw_tx_buf_readb(dev
, buf
, offset
+15);
1799 /* EAP-Packet Op Code */
1800 Op_Code
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+16)) << 8) +
1801 zmw_tx_buf_readb(dev
, buf
, offset
+17);
1802 /* EAP-Packet Flags */
1803 flags
= zmw_tx_buf_readb(dev
, buf
, offset
+18);
1805 zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId
);
1806 zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType
);
1807 zm_debug_msg1("EAP-Packet Op Code = ", Op_Code
);
1808 zm_debug_msg1("EAP-Packet Flags = ", flags
);
1811 else if( code
== 2 )
1813 zm_debug_msg0("EAP-Packet Response");
1815 /* EAP-Packet Identifier */
1816 identifier
= zmw_tx_buf_readb(dev
, buf
, offset
+5);
1817 /* EAP-Packet Length */
1818 length
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1819 zmw_tx_buf_readb(dev
, buf
, offset
+7);
1820 /* EAP-Packet Type */
1821 type
= zmw_tx_buf_readb(dev
, buf
, offset
+8);
1823 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1824 zm_debug_msg1("EAP-Packet Length = ", length
);
1825 zm_debug_msg1("EAP-Packet Type = ", type
);
1829 zm_debug_msg0("EAP-Packet Response Identity");
1831 else if( type
== 2 )
1833 zm_debug_msg0("EAP-Packet Request Notification");
1835 else if( type
== 3 )
1837 zm_debug_msg0("EAP-Packet Request Nak");
1839 else if( type
== 4 )
1841 zm_debug_msg0("EAP-Packet Request MD5-Challenge");
1843 else if( type
== 5 )
1845 zm_debug_msg0("EAP-Packet Request One Time Password");
1847 else if( type
== 6 )
1849 zm_debug_msg0("EAP-Packet Request Generic Token Card");
1851 else if( type
== 254 )
1853 zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup");
1855 /* EAP-Packet Vendor ID */
1856 vendorId
= (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+9)) << 16) +
1857 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+10)) << 8) +
1858 zmw_tx_buf_readb(dev
, buf
, offset
+11);
1859 /* EAP-Packet Vendor Type */
1860 VendorType
= (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+12)) << 24) +
1861 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+13)) << 16) +
1862 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+14)) << 8) +
1863 zmw_tx_buf_readb(dev
, buf
, offset
+15);
1864 /* EAP-Packet Op Code */
1865 Op_Code
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+16)) << 8) +
1866 zmw_tx_buf_readb(dev
, buf
, offset
+17);
1867 /* EAP-Packet Flags */
1868 flags
= zmw_tx_buf_readb(dev
, buf
, offset
+18);
1870 zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId
);
1871 zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType
);
1872 zm_debug_msg1("EAP-Packet Op Code = ", Op_Code
);
1873 zm_debug_msg1("EAP-Packet Flags = ", flags
);
1876 else if( code
== 3 )
1878 zm_debug_msg0("EAP-Packet Success");
1880 /* EAP-Packet Identifier */
1881 identifier
= zmw_rx_buf_readb(dev
, buf
, offset
+5);
1882 /* EAP-Packet Length */
1883 length
= (((u16_t
) zmw_rx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1884 zmw_rx_buf_readb(dev
, buf
, offset
+7);
1886 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1887 zm_debug_msg1("EAP-Packet Length = ", length
);
1889 else if( code
== 4 )
1891 zm_debug_msg0("EAP-Packet Failure");
1893 /* EAP-Packet Identifier */
1894 identifier
= zmw_tx_buf_readb(dev
, buf
, offset
+5);
1895 /* EAP-Packet Length */
1896 length
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+6)) << 8) +
1897 zmw_tx_buf_readb(dev
, buf
, offset
+7);
1899 zm_debug_msg1("EAP-Packet Identifier = ", identifier
);
1900 zm_debug_msg1("EAP-Packet Length = ", length
);
1903 else if( packetType
== 1 )
1905 zm_debug_msg0("EAPOL-Start");
1907 else if( packetType
== 2 )
1909 zm_debug_msg0("EAPOL-Logoff");
1911 else if( packetType
== 3 )
1913 /* EAPOL-Key type */
1914 keyType
= zmw_tx_buf_readb(dev
, buf
, offset
+4);
1915 /* EAPOL-Key information */
1916 keyInfo
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+5)) << 8) +
1917 zmw_tx_buf_readb(dev
, buf
, offset
+6);
1918 /* EAPOL-Key length */
1919 keyLen
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+7)) << 8) +
1920 zmw_tx_buf_readb(dev
, buf
, offset
+8);
1921 /* EAPOL-Key replay counter (high double word) */
1922 replayCounterH
= (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+9)) << 24) +
1923 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+10)) << 16) +
1924 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+11)) << 8) +
1925 zmw_tx_buf_readb(dev
, buf
, offset
+12);
1926 /* EAPOL-Key replay counter (low double word) */
1927 replayCounterL
= (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+13)) << 24) +
1928 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+14)) << 16) +
1929 (((u32_t
) zmw_tx_buf_readb(dev
, buf
, offset
+15)) << 8) +
1930 zmw_tx_buf_readb(dev
, buf
, offset
+16);
1931 /* EAPOL-Key data length */
1932 keyDataLen
= (((u16_t
) zmw_tx_buf_readb(dev
, buf
, offset
+97)) << 8) +
1933 zmw_tx_buf_readb(dev
, buf
, offset
+98);
1935 zm_debug_msg0("EAPOL-Key");
1936 zm_debug_msg1("packet length = ", packetLen
);
1938 if ( keyType
== 254 )
1940 zm_debug_msg0("key type = 254 (SSN key descriptor)");
1944 zm_debug_msg2("key type = 0x", keyType
);
1947 zm_debug_msg2("replay counter(L) = ", replayCounterL
);
1949 zm_debug_msg2("key information = ", keyInfo
);
1951 if ( keyInfo
& ZM_BIT_3
)
1953 zm_debug_msg0(" - pairwise key");
1957 zm_debug_msg0(" - group key");
1960 if ( keyInfo
& ZM_BIT_6
)
1962 zm_debug_msg0(" - Tx key installed");
1966 zm_debug_msg0(" - Tx key not set");
1969 if ( keyInfo
& ZM_BIT_7
)
1971 zm_debug_msg0(" - Ack needed");
1975 zm_debug_msg0(" - Ack not needed");
1978 if ( keyInfo
& ZM_BIT_8
)
1980 zm_debug_msg0(" - MIC set");
1984 zm_debug_msg0(" - MIC not set");
1987 if ( keyInfo
& ZM_BIT_9
)
1989 zm_debug_msg0(" - packet encrypted");
1993 zm_debug_msg0(" - packet not encrypted");
1996 zm_debug_msg1("keyLen = ", keyLen
);
1997 zm_debug_msg1("keyDataLen = ", keyDataLen
);
1999 else if( packetType
== 4 )
2001 zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert");
2006 /************************************************************************/
2008 /* FUNCTION DESCRIPTION zfiRecv80211 */
2009 /* Called to receive 802.11 frame. */
2012 /* dev : device pointer */
2013 /* buf : received 802.11 frame buffer. */
2019 /* Stephen ZyDAS Technology Corporation 2005.5 */
2021 /************************************************************************/
2022 void zfiRecv80211(zdev_t
* dev
, zbuf_t
* buf
, struct zsAdditionInfo
* addInfo
)
2024 u8_t snapCase
=0, encryMode
;
2025 u16_t frameType
, typeLengthField
;
2031 u16_t offset
, tailLen
;
2037 #ifdef ZM_ENABLE_NATIVE_WIFI
2041 zmw_get_wlan_dev(dev
);
2043 ZM_BUFFER_TRACE(dev
, buf
)
2045 //zm_msg2_rx(ZM_LV_2, "zfiRecv80211(), buf=", buf);
2047 //zm_msg2_rx(ZM_LV_0, "h[0]=", zmw_rx_buf_readh(dev, buf, 0));
2048 //zm_msg2_rx(ZM_LV_0, "h[2]=", zmw_rx_buf_readh(dev, buf, 2));
2049 //zm_msg2_rx(ZM_LV_0, "h[4]=", zmw_rx_buf_readh(dev, buf, 4));
2051 frameCtrl
= zmw_rx_buf_readb(dev
, buf
, 0);
2052 frameType
= frameCtrl
& 0xf;
2053 frameSubtype
= frameCtrl
& 0xf0;
2057 if (frameType
== ZM_WLAN_DATA_FRAME
)
2059 wd
->sta
.TotalNumberOfReceivePackets
++;
2060 wd
->sta
.TotalNumberOfReceiveBytes
+= zfwBufGetSize(dev
, buf
);
2061 //zm_debug_msg1("Receive packets = ", wd->sta.TotalNumberOfReceivePackets);
2063 //zm_msg0_rx(ZM_LV_0, "Rx data");
2064 if (wd
->wlanMode
== ZM_MODE_AP
)
2066 ret
= zfApUpdatePsBit(dev
, buf
, &vap
, &uapsdTrig
);
2067 if (ret
!= ZM_SUCCESS
)
2069 zfwBufFree(dev
, buf
, 0);
2073 if (((uapsdTrig
&0xf) != 0) && ((frameSubtype
& 0x80) != 0))
2075 u8_t ac
= zcUpToAc
[zmw_buf_readb(dev
, buf
, 24)&0x7];
2081 //printk("QoS ctrl=%d\n", zmw_buf_readb(dev, buf, 24));
2082 //printk("UAPSD trigger, ac=%d\n", ac);
2084 if (((0x8>>ac
) & uapsdTrig
) != 0)
2086 pktNum
= zcMaxspToPktNum
[(uapsdTrig
>>4) & 0x3];
2088 for (ii
=0; ii
<6; ii
++)
2090 src
[ii
] = zmw_buf_readb(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+ii
);
2093 for (ii
=0; ii
<pktNum
; ii
++)
2095 //if ((psBuf = zfQueueGet(dev, wd->ap.uapsdQ)) != NULL)
2096 psBuf
= zfQueueGetWithMac(dev
, wd
->ap
.uapsdQ
, src
, &mb
);
2099 if ((ii
+1) == pktNum
)
2102 flag
= 0x100 | (mb
<<5);
2108 //more data, not EOSP
2113 //no more data, EOSP
2117 zfTxSendEth(dev
, psBuf
, 0, ZM_EXTERNAL_ALLOC_BUF
, flag
);
2120 if ((psBuf
== NULL
) || (mb
== 0))
2122 if ((ii
== 0) && (psBuf
== NULL
))
2124 zfSendMmFrame(dev
, ZM_WLAN_FRAME_TYPE_QOS_NULL
, (u16_t
*)src
, 0, 0, 0);
2133 else if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
2138 /* Check Is RIFS frame and decide to enable RIFS or not */
2139 if( wd
->sta
.EnableHT
)
2140 zfCheckIsRIFSFrame(dev
, buf
, frameSubtype
);
2142 if ( zfPowerSavingMgrIsSleeping(dev
) || wd
->sta
.psMgr
.tempWakeUp
== 1)
2144 frameCtrlMSB
= zmw_rx_buf_readb(dev
, buf
, 1);
2146 /* check more data */
2147 if ( frameCtrlMSB
& ZM_BIT_5
)
2149 //if rx frame's AC is not delivery-enabled
2150 if ((wd
->sta
.qosInfo
&0xf) != 0xf)
2153 if ((frameSubtype
& 0x80) != 0)
2155 rxAc
= zcUpToAc
[zmw_buf_readb(dev
, buf
, 24)&0x7];
2158 if (((0x8>>rxAc
) & wd
->sta
.qosInfo
) == 0)
2161 wd
->sta
.psMgr
.tempWakeUp
= 0;
2166 /*increase beacon count when receive vaild data frame from AP*/
2167 ZM_MAC_WORD_TO_BYTE(wd
->sta
.bssid
, bssid
);
2169 if (zfStaIsConnected(dev
)&&
2170 zfRxBufferEqualToStr(dev
, buf
, bssid
, ZM_WLAN_HEADER_A2_OFFSET
, 6))
2172 wd
->sta
.rxBeaconCount
++;
2176 zm_msg1_rx(ZM_LV_2
, "Rx VAP=", vap
);
2178 /* handle IV, EXT-IV, ICV, and EXT-ICV */
2179 zfGetRxIvIcvLength(dev
, buf
, vap
, &offset
, &tailLen
, addInfo
);
2181 zfStaIbssPSCheckState(dev
, buf
);
2183 if ((frameSubtype
& 0x80) == 0x80)
2188 len
= zfwBufGetSize(dev
, buf
);
2195 zfwBufSetSize(dev
, buf
, len
);
2199 /* Filter NULL data */
2200 if (((frameSubtype
&0x40) != 0) || ((len
= zfwBufGetSize(dev
, buf
))<=24))
2202 zm_msg1_rx(ZM_LV_1
, "Free Rx NULL data, len=", len
);
2203 zfwBufFree(dev
, buf
, 0);
2207 /* check and handle defragmentation */
2208 if ( wd
->sta
.bSafeMode
&& (wd
->sta
.wepStatus
== ZM_ENCRYPTION_AES
) && wd
->sta
.SWEncryptEnable
)
2210 zm_msg0_rx(ZM_LV_1
, "Bypass defragmentation packets in safe mode");
2214 buf
= zfDefragment(dev
, buf
, &bIsDefrag
, addInfo
);
2217 /* In this case, the buffer has been freed in zfDefragment */
2222 ret
= ZM_MIC_SUCCESS
;
2224 /* If SW WEP/TKIP are not turned on */
2225 if ((wd
->sta
.SWEncryptEnable
& ZM_SW_TKIP_DECRY_EN
) == 0 &&
2226 (wd
->sta
.SWEncryptEnable
& ZM_SW_WEP_DECRY_EN
) == 0)
2228 encryMode
= zfGetEncryModeFromRxStatus(addInfo
);
2231 if ( encryMode
== ZM_TKIP
)
2235 ret
= zfMicRxVerify(dev
, buf
);
2239 /* check MIC failure bit */
2240 if ( ZM_RX_STATUS_IS_MIC_FAIL(addInfo
) )
2242 ret
= ZM_MIC_FAILURE
;
2246 if ( ret
== ZM_MIC_FAILURE
)
2248 u8_t Unicast_Pkt
= 0x0;
2250 if ((zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
) & 0x1) == 0)
2252 wd
->commTally
.swRxUnicastMicFailCount
++;
2255 else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
2257 wd->commTally.swRxMulticastMicFailCount++;
2261 wd
->commTally
.swRxMulticastMicFailCount
++;
2263 if ( wd
->wlanMode
== ZM_MODE_AP
)
2268 for (idx
=0; idx
<6; idx
++)
2270 addr
[idx
] = zmw_rx_buf_readb(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+idx
);
2273 if (wd
->zfcbApMicFailureNotify
!= NULL
)
2275 wd
->zfcbApMicFailureNotify(dev
, addr
, buf
);
2282 zm_debug_msg0("Countermeasure : Unicast_Pkt ");
2286 zm_debug_msg0("Countermeasure : Non-Unicast_Pkt ");
2289 if((wd
->TKIP_Group_KeyChanging
== 0x0) || (Unicast_Pkt
== 0x1))
2291 zm_debug_msg0("Countermeasure : Do MIC Check ");
2292 zfStaMicFailureHandling(dev
, buf
);
2296 zm_debug_msg0("Countermeasure : SKIP MIC Check due to Group Keychanging ");
2299 /* Discard MIC failed frame */
2300 zfwBufFree(dev
, buf
, 0);
2309 /* TODO: Check whether WEP bit is turned on in MAC header */
2310 encryMode
= ZM_NO_WEP
;
2312 IsEncryFrame
= (zmw_rx_buf_readb(dev
, buf
, 1) & 0x40);
2316 /* Software decryption for TKIP */
2317 if (wd
->sta
.SWEncryptEnable
& ZM_SW_TKIP_DECRY_EN
)
2323 struct zsTkipSeed
*rxSeed
;
2325 IvOffset
= offset
+ ZM_SIZE_OF_WLAN_DATA_HEADER
;
2327 rxSeed
= zfStaGetRxSeed(dev
, buf
);
2331 zm_debug_msg0("rxSeed is NULL");
2333 /* Discard this frame */
2334 zfwBufFree(dev
, buf
, 0);
2338 iv16
= (zmw_rx_buf_readb(dev
, buf
, IvOffset
) << 8) + zmw_rx_buf_readb(dev
, buf
, IvOffset
+2);
2339 iv32
= zmw_rx_buf_readb(dev
, buf
, IvOffset
+4) +
2340 (zmw_rx_buf_readb(dev
, buf
, IvOffset
+5) << 8) +
2341 (zmw_rx_buf_readb(dev
, buf
, IvOffset
+6) << 16) +
2342 (zmw_rx_buf_readb(dev
, buf
, IvOffset
+7) << 24);
2344 /* TKIP Key Mixing */
2345 zfTkipPhase1KeyMix(iv32
, rxSeed
);
2346 zfTkipPhase2KeyMix(iv16
, rxSeed
);
2347 zfTkipGetseeds(iv16
, RC4Key
, rxSeed
);
2350 ret
= zfTKIPDecrypt(dev
, buf
, IvOffset
+ZM_SIZE_OF_IV
+ZM_SIZE_OF_EXT_IV
, 16, RC4Key
);
2352 if (ret
== ZM_ICV_FAILURE
)
2354 zm_debug_msg0("TKIP ICV fail");
2356 /* Discard ICV failed frame */
2357 zfwBufFree(dev
, buf
, 0);
2361 /* Remove ICV from buffer */
2362 zfwBufSetSize(dev
, buf
, len
-4);
2365 ret
= zfMicRxVerify(dev
, buf
);
2367 if (ret
== ZM_MIC_FAILURE
)
2369 if ((zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
) & 0x1) == 0)
2371 wd
->commTally
.swRxUnicastMicFailCount
++;
2373 else if (zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
) == 0xffff)
2375 wd
->commTally
.swRxMulticastMicFailCount
++;
2379 wd
->commTally
.swRxMulticastMicFailCount
++;
2381 if ( wd
->wlanMode
== ZM_MODE_AP
)
2386 for (idx
=0; idx
<6; idx
++)
2388 addr
[idx
] = zmw_rx_buf_readb(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+idx
);
2391 if (wd
->zfcbApMicFailureNotify
!= NULL
)
2393 wd
->zfcbApMicFailureNotify(dev
, addr
, buf
);
2398 zfStaMicFailureHandling(dev
, buf
);
2401 zm_debug_msg0("MIC fail");
2402 /* Discard MIC failed frame */
2403 zfwBufFree(dev
, buf
, 0);
2407 encryMode
= ZM_TKIP
;
2408 offset
+= ZM_SIZE_OF_IV
+ ZM_SIZE_OF_EXT_IV
;
2410 else if(wd
->sta
.SWEncryptEnable
& ZM_SW_WEP_DECRY_EN
)
2417 IvOffset
= offset
+ ZM_SIZE_OF_WLAN_DATA_HEADER
;
2420 iv
[0] = zmw_rx_buf_readb(dev
, buf
, IvOffset
);
2421 iv
[1] = zmw_rx_buf_readb(dev
, buf
, IvOffset
+1);
2422 iv
[2] = zmw_rx_buf_readb(dev
, buf
, IvOffset
+2);
2424 keyIdx
= ((zmw_rx_buf_readb(dev
, buf
, IvOffset
+3) >> 6) & 0x03);
2426 IvOffset
+= ZM_SIZE_OF_IV
;
2428 if (wd
->sta
.SWEncryMode
[keyIdx
] == ZM_WEP64
)
2432 else if (wd
->sta
.SWEncryMode
[keyIdx
] == ZM_WEP128
)
2436 else if (wd
->sta
.SWEncryMode
[keyIdx
] == ZM_WEP256
)
2441 zfWEPDecrypt(dev
, buf
, IvOffset
, keyLen
, wd
->sta
.wepKey
[keyIdx
], iv
);
2443 if (ret
== ZM_ICV_FAILURE
)
2445 zm_debug_msg0("WEP ICV fail");
2447 /* Discard ICV failed frame */
2448 zfwBufFree(dev
, buf
, 0);
2452 encryMode
= wd
->sta
.SWEncryMode
[keyIdx
];
2454 /* Remove ICV from buffer */
2455 zfwBufSetSize(dev
, buf
, len
-4);
2457 offset
+= ZM_SIZE_OF_IV
;
2462 #ifdef ZM_ENABLE_CENC
2463 //else if ( encryMode == ZM_CENC ) /* check if CENC */
2464 if ( encryMode
== ZM_CENC
)
2468 rxIV
[0] = (zmw_rx_buf_readh(dev
, buf
, 28) << 16)
2469 + zmw_rx_buf_readh(dev
, buf
, 26);
2470 rxIV
[1] = (zmw_rx_buf_readh(dev
, buf
, 32) << 16)
2471 + zmw_rx_buf_readh(dev
, buf
, 30);
2472 rxIV
[2] = (zmw_rx_buf_readh(dev
, buf
, 36) << 16)
2473 + zmw_rx_buf_readh(dev
, buf
, 34);
2474 rxIV
[3] = (zmw_rx_buf_readh(dev
, buf
, 40) << 16)
2475 + zmw_rx_buf_readh(dev
, buf
, 38);
2477 //zm_debug_msg2("rxIV[0] = 0x", rxIV[0]);
2478 //zm_debug_msg2("rxIV[1] = 0x", rxIV[1]);
2479 //zm_debug_msg2("rxIV[2] = 0x", rxIV[2]);
2480 //zm_debug_msg2("rxIV[3] = 0x", rxIV[3]);
2482 /* destination address*/
2483 da
[0] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
);
2484 da
[1] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
+2);
2485 da
[2] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
+4);
2487 if ( wd
->wlanMode
== ZM_MODE_AP
)
2494 /* Accumlate the PN sequence */
2495 wd
->sta
.rxivGK
[0] ++;
2497 if (wd
->sta
.rxivGK
[0] == 0)
2499 wd
->sta
.rxivGK
[1]++;
2502 if (wd
->sta
.rxivGK
[1] == 0)
2504 wd
->sta
.rxivGK
[2]++;
2507 if (wd
->sta
.rxivGK
[2] == 0)
2509 wd
->sta
.rxivGK
[3]++;
2512 if (wd
->sta
.rxivGK
[3] == 0)
2514 wd
->sta
.rxivGK
[0] = 0;
2515 wd
->sta
.rxivGK
[1] = 0;
2516 wd
->sta
.rxivGK
[2] = 0;
2519 //zm_debug_msg2("wd->sta.rxivGK[0] = 0x", wd->sta.rxivGK[0]);
2520 //zm_debug_msg2("wd->sta.rxivGK[1] = 0x", wd->sta.rxivGK[1]);
2521 //zm_debug_msg2("wd->sta.rxivGK[2] = 0x", wd->sta.rxivGK[2]);
2522 //zm_debug_msg2("wd->sta.rxivGK[3] = 0x", wd->sta.rxivGK[3]);
2524 if ( !((wd
->sta
.rxivGK
[0] == rxIV
[0])
2525 && (wd
->sta
.rxivGK
[1] == rxIV
[1])
2526 && (wd
->sta
.rxivGK
[2] == rxIV
[2])
2527 && (wd
->sta
.rxivGK
[3] == rxIV
[3])))
2529 u8_t PacketDiscard
= 0;
2530 /* Discard PN Code Error frame */
2531 if (rxIV
[0] < wd
->sta
.rxivGK
[0])
2535 if (wd
->sta
.rxivGK
[0] > 0xfffffff0)
2537 if ((rxIV
[0] < 0xfffffff0)
2538 && (((0xffffffff - wd
->sta
.rxivGK
[0]) + rxIV
[0]) > 16))
2545 if ((rxIV
[0] - wd
->sta
.rxivGK
[0]) > 16)
2550 // sync sta pn code with ap because of losting some packets
2551 wd
->sta
.rxivGK
[0] = rxIV
[0];
2552 wd
->sta
.rxivGK
[1] = rxIV
[1];
2553 wd
->sta
.rxivGK
[2] = rxIV
[2];
2554 wd
->sta
.rxivGK
[3] = rxIV
[3];
2557 zm_debug_msg0("Discard PN Code lost too much multicast frame");
2558 zfwBufFree(dev
, buf
, 0);
2565 /* Accumlate the PN sequence */
2566 wd
->sta
.rxiv
[0] += 2;
2568 if (wd
->sta
.rxiv
[0] == 0 || wd
->sta
.rxiv
[0] == 1)
2573 if (wd
->sta
.rxiv
[1] == 0)
2578 if (wd
->sta
.rxiv
[2] == 0)
2583 if (wd
->sta
.rxiv
[3] == 0)
2585 wd
->sta
.rxiv
[0] = 0;
2586 wd
->sta
.rxiv
[1] = 0;
2587 wd
->sta
.rxiv
[2] = 0;
2590 //zm_debug_msg2("wd->sta.rxiv[0] = 0x", wd->sta.rxiv[0]);
2591 //zm_debug_msg2("wd->sta.rxiv[1] = 0x", wd->sta.rxiv[1]);
2592 //zm_debug_msg2("wd->sta.rxiv[2] = 0x", wd->sta.rxiv[2]);
2593 //zm_debug_msg2("wd->sta.rxiv[3] = 0x", wd->sta.rxiv[3]);
2595 if ( !((wd
->sta
.rxiv
[0] == rxIV
[0])
2596 && (wd
->sta
.rxiv
[1] == rxIV
[1])
2597 && (wd
->sta
.rxiv
[2] == rxIV
[2])
2598 && (wd
->sta
.rxiv
[3] == rxIV
[3])))
2600 zm_debug_msg0("PN Code mismatch, lost unicast frame, sync pn code to recv packet");
2601 // sync sta pn code with ap because of losting some packets
2602 wd
->sta
.rxiv
[0] = rxIV
[0];
2603 wd
->sta
.rxiv
[1] = rxIV
[1];
2604 wd
->sta
.rxiv
[2] = rxIV
[2];
2605 wd
->sta
.rxiv
[3] = rxIV
[3];
2606 /* Discard PN Code Error frame */
2607 //zm_debug_msg0("Discard PN Code mismatch unicast frame");
2608 //zfwBufFree(dev, buf, 0);
2614 #endif //ZM_ENABLE_CENC
2617 if ((zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
) & 0x1) == 0)
2619 /* for ACU to display RxRate */
2620 zfWlanUpdateRxRate(dev
, addInfo
);
2622 wd
->commTally
.rxUnicastFrm
++;
2623 wd
->commTally
.rxUnicastOctets
+= (len
-24);
2625 else if (zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
) == 0xffff)
2627 wd
->commTally
.rxBroadcastFrm
++;
2628 wd
->commTally
.rxBroadcastOctets
+= (len
-24);
2632 wd
->commTally
.rxMulticastFrm
++;
2633 wd
->commTally
.rxMulticastOctets
+= (len
-24);
2635 wd
->ledStruct
.rxTraffic
++;
2637 if ((frameSubtype
& 0x80) == 0x80)
2639 /* if QoS control bit-7 is 1 => A-MSDU frame */
2640 if ((zmw_rx_buf_readh(dev
, buf
, 24) & 0x80) != 0)
2642 zfDeAmsdu(dev
, buf
, vap
, encryMode
);
2647 // Remove MIC of TKIP
2648 if ( encryMode
== ZM_TKIP
)
2650 zfwBufSetSize(dev
, buf
, zfwBufGetSize(dev
, buf
) - 8);
2653 /* Convert 802.11 and SNAP header to ethernet header */
2654 if ( (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)||
2655 (wd
->wlanMode
== ZM_MODE_IBSS
) )
2657 /* destination address*/
2658 da
[0] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
);
2659 da
[1] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
+2);
2660 da
[2] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A1_OFFSET
+4);
2662 /* check broadcast frame */
2663 if ( (da
[0] == 0xffff) && (da
[1] == 0xffff) && (da
[2] == 0xffff) )
2665 // Ap send broadcast frame to the DUT !
2667 /* check multicast frame */
2668 /* TODO : Remove these code, hardware should be able to block */
2669 /* multicast frame on the multicast address list */
2670 /* or bypass all multicast packet by flag bAllMulticast */
2671 else if ((da
[0] & 0x01) && (wd
->sta
.bAllMulticast
== 0))
2673 for(ii
=0; ii
<wd
->sta
.multicastList
.size
; ii
++)
2675 if ( zfMemoryIsEqual(wd
->sta
.multicastList
.macAddr
[ii
].addr
,
2682 if ( ii
== wd
->sta
.multicastList
.size
)
2684 zm_debug_msg0("discard unknown multicast frame");
2686 zfwBufFree(dev
, buf
, 0);
2691 #ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0
2695 for (i
=12; i
>0; i
--)
2697 zmw_rx_buf_writeh(dev
, buf
, ((i
-1)*2)+offset
,
2698 zmw_rx_buf_readh(dev
, buf
, (i
-1)*2));
2700 zfwBufRemoveHead(dev
, buf
, offset
);
2704 if (zfRxBufferEqualToStr(dev
, buf
, zgSnapBridgeTunnel
,
2709 else if ( zfRxBufferEqualToStr(dev
, buf
, zgSnap8021h
,
2713 (((u16_t
) zmw_rx_buf_readb(dev
, buf
, 30+offset
)) << 8) +
2714 zmw_rx_buf_readb(dev
, buf
, 31+offset
);
2716 //zm_debug_msg2("tpyeLengthField = ", typeLengthField);
2718 //8137 : IPX, 80F3 : Appletalk
2719 if ( (typeLengthField
!= 0x8137)&&
2720 (typeLengthField
!= 0x80F3) )
2725 if ( typeLengthField
== 0x888E )
2727 zfShowRxEAPOL(dev
, buf
, 32);
2732 //zfwDumpBuf(dev, buf);
2735 /* source address */
2736 if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
2738 /* SA = Address 3 */
2739 sa
[0] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A3_OFFSET
);
2740 sa
[1] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A3_OFFSET
+2);
2741 sa
[2] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A3_OFFSET
+4);
2745 /* SA = Address 2 */
2746 sa
[0] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
);
2747 sa
[1] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+2);
2748 sa
[2] = zmw_rx_buf_readh(dev
, buf
, ZM_WLAN_HEADER_A2_OFFSET
+4);
2754 zmw_rx_buf_writeh(dev
, buf
, 24+offset
, sa
[0]);
2755 zmw_rx_buf_writeh(dev
, buf
, 26+offset
, sa
[1]);
2756 zmw_rx_buf_writeh(dev
, buf
, 28+offset
, sa
[2]);
2758 /* DA = Address 1 */
2759 zmw_rx_buf_writeh(dev
, buf
, 18+offset
, da
[0]);
2760 zmw_rx_buf_writeh(dev
, buf
, 20+offset
, da
[1]);
2761 zmw_rx_buf_writeh(dev
, buf
, 22+offset
, da
[2]);
2762 zfwBufRemoveHead(dev
, buf
, 18+offset
);
2767 zmw_rx_buf_writeh(dev
, buf
, 16+offset
, sa
[0]);
2768 zmw_rx_buf_writeh(dev
, buf
, 18+offset
, sa
[1]);
2769 zmw_rx_buf_writeh(dev
, buf
, 20+offset
, sa
[2]);
2771 /* DA = Address 1 */
2772 zmw_rx_buf_writeh(dev
, buf
, 10+offset
, da
[0]);
2773 zmw_rx_buf_writeh(dev
, buf
, 12+offset
, da
[1]);
2774 zmw_rx_buf_writeh(dev
, buf
, 14+offset
, da
[2]);
2775 zfwBufRemoveHead(dev
, buf
, 10+offset
);
2776 /* Ethernet payload length */
2777 typeLengthField
= zfwBufGetSize(dev
, buf
) - 14;
2778 zmw_rx_buf_writeh(dev
, buf
, 12, (typeLengthField
<<8)+(typeLengthField
>>8));
2780 #endif // ZM_ENABLE_NATIVE_WIFI
2782 else if (wd
->wlanMode
== ZM_MODE_AP
)
2784 //if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3)
2785 if (vap
< ZM_MAX_AP_SUPPORT
)
2788 #ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0
2792 for (i
=12; i
>0; i
--)
2794 zmw_rx_buf_writeh(dev
, buf
, ((i
-1)*2)+offset
,
2795 zmw_rx_buf_readh(dev
, buf
, (i
-1)*2));
2797 zfwBufRemoveHead(dev
, buf
, offset
);
2800 /* SA = Address 2 */
2801 zmw_rx_buf_writeh(dev
, buf
, 24+offset
, zmw_rx_buf_readh(dev
, buf
,
2802 ZM_WLAN_HEADER_A2_OFFSET
));
2803 zmw_rx_buf_writeh(dev
, buf
, 26+offset
, zmw_rx_buf_readh(dev
, buf
,
2804 ZM_WLAN_HEADER_A2_OFFSET
+2));
2805 zmw_rx_buf_writeh(dev
, buf
, 28+offset
, zmw_rx_buf_readh(dev
, buf
,
2806 ZM_WLAN_HEADER_A2_OFFSET
+4));
2807 /* DA = Address 3 */
2808 /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */
2809 /* sequence must not be inverted */
2810 zmw_rx_buf_writeh(dev
, buf
, 22+offset
, zmw_rx_buf_readh(dev
, buf
,
2811 ZM_WLAN_HEADER_A3_OFFSET
+4));
2812 zmw_rx_buf_writeh(dev
, buf
, 20+offset
, zmw_rx_buf_readh(dev
, buf
,
2813 ZM_WLAN_HEADER_A3_OFFSET
+2));
2814 zmw_rx_buf_writeh(dev
, buf
, 18+offset
, zmw_rx_buf_readh(dev
, buf
,
2815 ZM_WLAN_HEADER_A3_OFFSET
));
2816 zfwBufRemoveHead(dev
, buf
, 18+offset
);
2817 #endif // ZM_ENABLE_NATIVE_WIFI
2818 ret
= zfIntrabssForward(dev
, buf
, vap
);
2821 /* Free Rx buffer if intra-BSS unicast frame */
2822 zm_msg0_rx(ZM_LV_2
, "Free intra-BSS unicast frame");
2823 zfwBufFree(dev
, buf
, 0);
2830 zm_msg0_rx(ZM_LV_2
, "Rx WDS data");
2832 /* SA = Address 4 */
2833 zmw_rx_buf_writeh(dev
, buf
, 30+offset
, zmw_rx_buf_readh(dev
, buf
,
2834 ZM_WLAN_HEADER_A4_OFFSET
));
2835 zmw_rx_buf_writeh(dev
, buf
, 32+offset
, zmw_rx_buf_readh(dev
, buf
,
2836 ZM_WLAN_HEADER_A4_OFFSET
+2));
2837 zmw_rx_buf_writeh(dev
, buf
, 34+offset
, zmw_rx_buf_readh(dev
, buf
,
2838 ZM_WLAN_HEADER_A4_OFFSET
+4));
2839 /* DA = Address 3 */
2840 /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */
2841 /* sequence must not be inverted */
2842 zmw_rx_buf_writeh(dev
, buf
, 28+offset
, zmw_rx_buf_readh(dev
, buf
,
2843 ZM_WLAN_HEADER_A3_OFFSET
+4));
2844 zmw_rx_buf_writeh(dev
, buf
, 26+offset
, zmw_rx_buf_readh(dev
, buf
,
2845 ZM_WLAN_HEADER_A3_OFFSET
+2));
2846 zmw_rx_buf_writeh(dev
, buf
, 24+offset
, zmw_rx_buf_readh(dev
, buf
,
2847 ZM_WLAN_HEADER_A3_OFFSET
));
2848 zfwBufRemoveHead(dev
, buf
, 24+offset
);
2851 else if (wd
->wlanMode
== ZM_MODE_PSEUDO
)
2853 /* WDS test: remove add4 */
2859 /* SA = Address 2 */
2860 zmw_rx_buf_writeh(dev
, buf
, 24+offset
, zmw_rx_buf_readh(dev
, buf
,
2861 ZM_WLAN_HEADER_A2_OFFSET
));
2862 zmw_rx_buf_writeh(dev
, buf
, 26+offset
, zmw_rx_buf_readh(dev
, buf
,
2863 ZM_WLAN_HEADER_A2_OFFSET
+2));
2864 zmw_rx_buf_writeh(dev
, buf
, 28+offset
, zmw_rx_buf_readh(dev
, buf
,
2865 ZM_WLAN_HEADER_A2_OFFSET
+4));
2866 /* DA = Address 1 */
2867 zmw_rx_buf_writeh(dev
, buf
, 18+offset
, zmw_rx_buf_readh(dev
, buf
,
2868 ZM_WLAN_HEADER_A1_OFFSET
));
2869 zmw_rx_buf_writeh(dev
, buf
, 20+offset
, zmw_rx_buf_readh(dev
, buf
,
2870 ZM_WLAN_HEADER_A1_OFFSET
+2));
2871 zmw_rx_buf_writeh(dev
, buf
, 22+offset
, zmw_rx_buf_readh(dev
, buf
,
2872 ZM_WLAN_HEADER_A1_OFFSET
+4));
2873 zfwBufRemoveHead(dev
, buf
, 18+offset
);
2880 /* Call zfwRecvEth() to notify upper layer */
2881 //zm_msg2_rx(ZM_LV_2, "Call zfwRecvEth(), buf=", buf);
2882 //zfwDumpBuf(dev, buf);
2884 #if ZM_PROTOCOL_RESPONSE_SIMULATION == 1
2885 zfProtRspSim(dev
, buf
);
2887 //zfwDumpBuf(dev, buf);
2890 wd
->commTally
.NotifyNDISRxFrmCnt
++;
2892 if (wd
->zfcbRecvEth
!= NULL
)
2894 wd
->zfcbRecvEth(dev
, buf
, vap
);
2895 ZM_PERFORMANCE_RX_MSDU(dev
, wd
->tick
)
2898 /* if management frame */
2899 else if (frameType
== ZM_WLAN_MANAGEMENT_FRAME
)
2901 zm_msg2_rx(ZM_LV_2
, "Rx management,FC=", frameCtrl
);
2902 /* Call zfProcessManagement() to handle management frame */
2903 zfProcessManagement(dev
, buf
, addInfo
); //CWYang(m)
2904 zfwBufFree(dev
, buf
, 0);
2907 else if ((wd
->wlanMode
== ZM_MODE_AP
) && (frameCtrl
== 0xa4))
2909 zm_msg0_rx(ZM_LV_0
, "Rx PsPoll");
2910 zfApProcessPsPoll(dev
, buf
);
2911 zfwBufFree(dev
, buf
, 0);
2915 zm_msg0_rx(ZM_LV_1
, "Rx discard!!");
2916 wd
->commTally
.DriverDiscardedFrm
++;
2918 zfwBufFree(dev
, buf
, 0);
2924 /************************************************************************/
2926 /* FUNCTION DESCRIPTION zfWlanRxValidate */
2927 /* Validate Rx frame. */
2930 /* dev : device pointer */
2931 /* buf : received 802.11 frame buffer. */
2937 /* Stephen ZyDAS Technology Corporation 2005.10 */
2939 /************************************************************************/
2940 u16_t
zfWlanRxValidate(zdev_t
* dev
, zbuf_t
* buf
)
2948 zmw_get_wlan_dev(dev
);
2950 frameCtrl
= zmw_rx_buf_readh(dev
, buf
, 0);
2951 frameType
= frameCtrl
& 0xC;
2952 frameSubType
= (frameCtrl
& 0xF0) >> 4;
2954 frameLen
= zfwBufGetSize(dev
, buf
);
2956 /* Accept Data/Management frame with protocol version = 0 */
2957 if ((frameType
== 0x8) || (frameType
== 0x0))
2960 /* TODO : check rx status => erro bit */
2962 /* Check Minimum Length with Wep */
2963 if ((frameCtrl
& 0x4000) != 0)
2965 /* Minimum Length = */
2966 /* PLCP(5)+Header(24)+IV(4)+ICV(4)+CRC(4)+RxStatus(8) */
2969 return ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH
;
2972 else if ( frameSubType
== 0x5 || frameSubType
== 0x8 )
2974 /* Minimum Length = PLCP(5)+MACHeader(24)+Timestamp(8)+BeaconInterval(2)+Cap(2)+CRC(4)+RxStatus(8) */
2977 return ZM_ERR_MIN_RX_FRAME_LENGTH
;
2982 /* Minimum Length = PLCP(5)+MACHeader(24)+CRC(4)+RxStatus(8) */
2985 return ZM_ERR_MIN_RX_FRAME_LENGTH
;
2989 /* Check if frame Length > ZM_WLAN_MAX_RX_SIZE. */
2990 if (frameLen
> ZM_WLAN_MAX_RX_SIZE
)
2992 return ZM_ERR_MAX_RX_FRAME_LENGTH
;
2995 else if ((frameCtrl
&0xff) == 0xa4)
2998 //zm_msg0_rx(ZM_LV_0, "rx pspoll");
3000 else if ((frameCtrl
&0xff) == ZM_WLAN_FRAME_TYPE_BAR
)
3002 if (wd
->sta
.enableDrvBA
== 1)
3004 zfAggRecvBAR(dev
, buf
);
3007 return ZM_ERR_RX_BAR_FRAME
;
3011 return ZM_ERR_RX_FRAME_TYPE
;
3014 if ( wd
->wlanMode
== ZM_MODE_AP
)
3017 else if ( wd
->wlanMode
!= ZM_MODE_PSEUDO
)
3019 ret
= zfStaRxValidateFrame(dev
, buf
);
3020 if (ret
!= ZM_SUCCESS
)
3022 //zm_debug_msg1("discard frame, code = ", ret);
3031 /************************************************************************/
3033 /* FUNCTION DESCRIPTION zfWlanRxFilter */
3034 /* Filter duplicated frame. */
3037 /* dev : device pointer */
3038 /* buf : received 802.11 frame buffer. */
3044 /* Stephen ZyDAS Technology Corporation 2005.10 */
3046 /************************************************************************/
3047 u16_t
zfWlanRxFilter(zdev_t
* dev
, zbuf_t
* buf
)
3057 u8_t up
= 0; /* User priority */
3059 zmw_get_wlan_dev(dev
);
3061 zmw_declare_for_critical_section();
3063 ZM_BUFFER_TRACE(dev
, buf
)
3068 frameType
= zmw_rx_buf_readh(dev
, buf
, offset
);
3070 // Don't divide 2^4 because we don't want the fragmentation pkt to be treated as
3071 // duplicated frames
3072 seq
= zmw_rx_buf_readh(dev
, buf
, offset
+22);
3073 dst0
= zmw_rx_buf_readh(dev
, buf
, offset
+4);
3074 src
[0] = zmw_rx_buf_readh(dev
, buf
, offset
+10);
3075 src
[1] = zmw_rx_buf_readh(dev
, buf
, offset
+12);
3076 src
[2] = zmw_rx_buf_readh(dev
, buf
, offset
+14);
3078 /* QoS data frame */
3079 if ((frameType
& 0x88) == 0x88)
3081 up
= zmw_rx_buf_readb(dev
, buf
, offset
+24);
3085 index
= (src
[2]+up
) & (ZM_FILTER_TABLE_ROW
-1);
3087 /* TBD : filter frame with source address == own MAC address */
3088 if ((wd
->macAddr
[0] == src
[0]) && (wd
->macAddr
[1] == src
[1])
3089 && (wd
->macAddr
[2] == src
[2]))
3091 //zm_msg0_rx(ZM_LV_0, "Rx filter=>src is own MAC");
3092 wd
->trafTally
.rxSrcIsOwnMac
++;
3095 zm_msg2_rx(ZM_LV_2
, "Rx seq=", seq
);
3097 /* Filter unicast frame only */
3098 if ((dst0
& 0x1) == 0)
3100 zmw_enter_critical_section(dev
);
3102 for(i
=0; i
<ZM_FILTER_TABLE_COL
; i
++)
3104 if ((wd
->rxFilterTbl
[i
][index
].addr
[0] == src
[0])
3105 && (wd
->rxFilterTbl
[i
][index
].addr
[1] == src
[1])
3106 && (wd
->rxFilterTbl
[i
][index
].addr
[2] == src
[2])
3107 && (wd
->rxFilterTbl
[i
][index
].up
== up
))
3109 if (((frameType
&0x800)==0x800)
3110 &&(wd
->rxFilterTbl
[i
][index
].seq
==seq
))
3112 zmw_leave_critical_section(dev
);
3113 /* hit : duplicated frame */
3114 zm_msg0_rx(ZM_LV_1
, "Rx filter hit=>duplicated");
3115 wd
->trafTally
.rxDuplicate
++;
3116 return ZM_ERR_RX_DUPLICATE
;
3120 /* hit : not duplicated frame, update sequence number */
3121 wd
->rxFilterTbl
[i
][index
].seq
= seq
;
3122 zmw_leave_critical_section(dev
);
3123 zm_msg0_rx(ZM_LV_2
, "Rx filter hit");
3127 } /* for(i=0; i<ZM_FILTER_TABLE_COL; i++) */
3129 /* miss : add to table */
3130 zm_msg0_rx(ZM_LV_1
, "Rx filter miss");
3131 /* TODO : Random select a column */
3132 col
= (u16_t
)(wd
->tick
& (ZM_FILTER_TABLE_COL
-1));
3133 wd
->rxFilterTbl
[col
][index
].addr
[0] = src
[0];
3134 wd
->rxFilterTbl
[col
][index
].addr
[1] = src
[1];
3135 wd
->rxFilterTbl
[col
][index
].addr
[2] = src
[2];
3136 wd
->rxFilterTbl
[col
][index
].seq
= seq
;
3137 wd
->rxFilterTbl
[col
][index
].up
= up
;
3139 zmw_leave_critical_section(dev
);
3140 } /* if ((dst0 & 0x1) == 0) */
3147 u16_t
zfTxGenWlanTail(zdev_t
* dev
, zbuf_t
* buf
, u16_t
* snap
, u16_t snaplen
,
3150 struct zsMicVar
* pMicKey
;
3151 u16_t i
, length
, payloadOffset
;
3152 u8_t bValue
, qosType
= 0;
3155 zmw_get_wlan_dev(dev
);
3157 if ( wd
->wlanMode
== ZM_MODE_AP
)
3159 pMicKey
= zfApGetTxMicKey(dev
, buf
, &qosType
);
3161 if ( pMicKey
== NULL
)
3166 else if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
3168 pMicKey
= zfStaGetTxMicKey(dev
, buf
);
3170 if ( pMicKey
== NULL
)
3180 length
= zfwBufGetSize(dev
, buf
);
3182 zfMicClear(pMicKey
);
3184 /* append DA and SA */
3185 #ifdef ZM_ENABLE_NATIVE_WIFI
3186 for(i
=16; i
<22; i
++)
3188 bValue
= zmw_tx_buf_readb(dev
, buf
, i
);
3189 zfMicAppendByte(bValue
, pMicKey
);
3191 for(i
=10; i
<16; i
++)
3193 bValue
= zmw_tx_buf_readb(dev
, buf
, i
);
3194 zfMicAppendByte(bValue
, pMicKey
);
3199 bValue
= zmw_tx_buf_readb(dev
, buf
, i
);
3200 zfMicAppendByte(bValue
, pMicKey
);
3204 /* append for alignment */
3205 if ( wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
)
3207 if (wd
->sta
.wmeConnected
!= 0)
3208 zfMicAppendByte(zmw_tx_buf_readb(dev
, buf
, ZM_80211_FRAME_IP_OFFSET
+ 1) >> 5, pMicKey
);
3210 zfMicAppendByte(0, pMicKey
);
3212 else if ( wd
->wlanMode
== ZM_MODE_AP
)
3215 zfMicAppendByte(zmw_tx_buf_readb(dev
, buf
, ZM_80211_FRAME_IP_OFFSET
+ 1) >> 5, pMicKey
);
3217 zfMicAppendByte(0, pMicKey
);
3221 /* TODO : Qos Software MIC in IBSS Mode */
3222 zfMicAppendByte(0, pMicKey
);
3224 zfMicAppendByte(0, pMicKey
);
3225 zfMicAppendByte(0, pMicKey
);
3226 zfMicAppendByte(0, pMicKey
);
3230 payloadOffset
= ZM_80211_FRAME_IP_OFFSET
;
3234 payloadOffset
= ZM_80211_FRAME_TYPE_OFFSET
;
3236 for(i
=0; i
<(snaplen
>>1); i
++)
3238 snapByte
[i
*2] = (u8_t
) (snap
[i
] & 0xff);
3239 snapByte
[i
*2+1] = (u8_t
) ((snap
[i
] >> 8) & 0xff);
3242 for(i
=0; i
<snaplen
; i
++)
3244 zfMicAppendByte(snapByte
[i
], pMicKey
);
3248 for(i
=payloadOffset
; i
<length
; i
++)
3250 bValue
= zmw_tx_buf_readb(dev
, buf
, i
);
3251 zfMicAppendByte(bValue
, pMicKey
);
3254 zfMicGetMic( (u8_t
*) mic
, pMicKey
);
3256 return ZM_SIZE_OF_MIC
;
3260 /************************************************************************/
3262 /* FUNCTION DESCRIPTION zfTxGetIpTosAndFrag */
3263 /* Get IP TOS and frag offset from Tx buffer */
3266 /* dev : device pointer */
3267 /* buf : Tx buffer pointer */
3268 /* up : pointer for returning user priority */
3269 /* fragOff : pointer for returning ip frag offset */
3275 /* Stephen Chen ZyDAS Technology Corporation 2006.6 */
3277 /************************************************************************/
3278 void zfTxGetIpTosAndFrag(zdev_t
* dev
, zbuf_t
* buf
, u8_t
* up
, u16_t
* fragOff
)
3288 len
= zfwBufGetSize(dev
, buf
);
3290 if (len
>= 34) //Minimum IPv4 packet size, 14(Ether header)+20(IPv4 header)
3292 etherType
= (((u16_t
)zmw_tx_buf_readb(dev
, buf
, ZM_80211_FRAME_TYPE_OFFSET
))<<8)
3293 + zmw_tx_buf_readb(dev
, buf
, ZM_80211_FRAME_TYPE_OFFSET
+ 1);
3295 /* protocol type = IP */
3296 if (etherType
== 0x0800)
3298 ipv
= zmw_tx_buf_readb(dev
, buf
, ZM_80211_FRAME_IP_OFFSET
) >> 4;
3299 if (ipv
== 0x4) //IPv4
3301 tos
= zmw_tx_buf_readb(dev
, buf
, ZM_80211_FRAME_IP_OFFSET
+ 1);
3303 *fragOff
= zmw_tx_buf_readh(dev
, buf
, ZM_80211_FRAME_IP_OFFSET
+ 6);
3305 /* TODO : handle VLAN tag and IPv6 packet */
3311 #ifdef ZM_ENABLE_NATIVE_WIFI
3312 u16_t
zfTxGenWlanSnap(zdev_t
* dev
, zbuf_t
* buf
, u16_t
* snap
, u16_t
* snaplen
)
3314 snap
[0] = zmw_buf_readh(dev
, buf
, ZM_80211_FRAME_HEADER_LEN
+ 0);
3315 snap
[1] = zmw_buf_readh(dev
, buf
, ZM_80211_FRAME_HEADER_LEN
+ 2);
3316 snap
[2] = zmw_buf_readh(dev
, buf
, ZM_80211_FRAME_HEADER_LEN
+ 4);
3319 return ZM_80211_FRAME_HEADER_LEN
+ *snaplen
;
3322 u16_t
zfTxGenWlanSnap(zdev_t
* dev
, zbuf_t
* buf
, u16_t
* snap
, u16_t
* snaplen
)
3328 len
= zfwBufGetSize(dev
, buf
);
3329 if (len
< 14) //Minimum Ethernet packet size, 14(Ether header)
3331 /* TODO : Assert? */
3336 /* Generate RFC1042 header */
3337 etherType
= (((u16_t
)zmw_tx_buf_readb(dev
, buf
, 12))<<8)
3338 + zmw_tx_buf_readb(dev
, buf
, 13);
3340 //zm_debug_msg2("ethernet type or length = ", etherType);
3342 if (etherType
> 1500)
3344 /* ETHERNET format */
3348 if ((etherType
==0x8137) || (etherType
== 0x80f3))
3360 if ( etherType
== 0x888E )
3362 zfShowTxEAPOL(dev
, buf
, 14);
3376 u8_t
zfIsVtxqEmpty(zdev_t
* dev
)
3378 u8_t isEmpty
= TRUE
;
3381 zmw_get_wlan_dev(dev
);
3383 zmw_declare_for_critical_section();
3385 zmw_enter_critical_section(dev
);
3387 if (wd
->vmmqHead
!= wd
->vmmqTail
)
3393 for(i
=0; i
< 4; i
++)
3395 if (wd
->vtxqHead
[i
] != wd
->vtxqTail
[i
])
3403 zmw_leave_critical_section(dev
);
3407 /************************************************************************/
3409 /* FUNCTION DESCRIPTION zfPutVtxq */
3410 /* Put Tx buffer to virtual TxQ */
3413 /* dev : device pointer */
3414 /* buf : Tx buffer pointer */
3417 /* ZM_SUCCESS or error code */
3420 /* Stephen Chen ZyDAS Technology Corporation 2006.6 */
3422 /************************************************************************/
3423 u16_t
zfPutVtxq(zdev_t
* dev
, zbuf_t
* buf
)
3429 struct aggTally
*agg_tal
;
3431 #ifdef ZM_ENABLE_AGGREGATION
3432 #ifndef ZM_BYPASS_AGGR_SCHEDULING
3438 zmw_get_wlan_dev(dev
);
3440 zmw_declare_for_critical_section();
3442 zfTxGetIpTosAndFrag(dev
, buf
, &up
, &fragOff
);
3444 if ( wd
->zfcbClassifyTxPacket
!= NULL
)
3446 ac
= wd
->zfcbClassifyTxPacket(dev
, buf
);
3450 ac
= zcUpToAc
[up
&0x7] & 0x3;
3455 * main A-MPDU aggregation function
3458 agg_tal
= &wd
->agg_tal
;
3459 agg_tal
->got_packets_sum
++;
3463 #ifdef ZM_ENABLE_AGGREGATION
3464 #ifndef ZM_BYPASS_AGGR_SCHEDULING
3466 if(wd
->enableAggregation
==0)
3468 if( (wd
->wlanMode
== ZM_MODE_AP
) ||
3469 (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
&& wd
->sta
.EnableHT
) ||
3470 (wd
->wlanMode
== ZM_MODE_PSEUDO
) ) {
3471 // (infrastructure_mode && connect_to_11n_ap) || (ap_mode && is_11n_ap)
3472 //ret = zfAggPutVtxq(dev, buf);
3475 ret
= zfAggTx(dev
, buf
, tid
);
3476 if (ZM_SUCCESS
== ret
)
3478 //zfwBufFree(dev, buf, ZM_SUCCESS);
3482 if (ZM_ERR_EXCEED_PRIORITY_THRESHOLD
== ret
)
3484 wd
->commTally
.txQosDropCount
[ac
]++;
3485 zfwBufFree(dev
, buf
, ZM_SUCCESS
);
3487 zm_msg1_tx(ZM_LV_1
, "Packet discarded, VTXQ full, ac=", ac
);
3489 return ZM_ERR_EXCEED_PRIORITY_THRESHOLD
;
3491 if (ZM_ERR_TX_BUFFER_UNAVAILABLE
== ret
)
3495 * continue following procession, put into VTXQ
3496 * return ZM_SUCCESS;
3504 * end of add by honda
3508 if ((fragOff
& 0xff3f) == 0x0020)
3510 /* Don't let ip frag in if VTXQ unable to hold */
3511 /* whole ip frag burst(assume 20 frag) */
3512 zmw_enter_critical_section(dev
);
3513 if (((wd
->vtxqHead
[ac
] - wd
->vtxqTail
[ac
])& ZM_VTXQ_SIZE_MASK
)
3514 > (ZM_VTXQ_SIZE
-20))
3516 wd
->qosDropIpFrag
[ac
] = 1;
3520 wd
->qosDropIpFrag
[ac
] = 0;
3522 zmw_leave_critical_section(dev
);
3524 if (wd
->qosDropIpFrag
[ac
] == 1)
3526 //zm_debug_msg2("vtQ full, drop buf = ", buf);
3527 wd
->commTally
.txQosDropCount
[ac
]++;
3528 zfwBufFree(dev
, buf
, ZM_SUCCESS
);
3529 zm_msg1_tx(ZM_LV_1
, "Packet discarded, first ip frag, ac=", ac
);
3530 //VTXQ[] can not hold whold ip frag burst(assume 20 frags)
3531 return ZM_ERR_EXCEED_PRIORITY_THRESHOLD
;
3534 else if ((fragOff
& 0xff3f) == 0)
3536 wd
->qosDropIpFrag
[ac
] = 0;
3539 if (((fragOff
&= 0xff1f) != 0) && (wd
->qosDropIpFrag
[ac
] == 1))
3541 wd
->commTally
.txQosDropCount
[ac
]++;
3542 zfwBufFree(dev
, buf
, ZM_SUCCESS
);
3543 zm_msg1_tx(ZM_LV_1
, "Packet discarded, ip frag, ac=", ac
);
3544 //Discard following ip frags
3545 return ZM_ERR_EXCEED_PRIORITY_THRESHOLD
;
3548 zmw_enter_critical_section(dev
);
3549 if (((wd
->vtxqHead
[ac
] + 1) & ZM_VTXQ_SIZE_MASK
) != wd
->vtxqTail
[ac
])
3551 wd
->vtxq
[ac
][wd
->vtxqHead
[ac
]] = buf
;
3552 wd
->vtxqHead
[ac
] = ((wd
->vtxqHead
[ac
] + 1) & ZM_VTXQ_SIZE_MASK
);
3553 zmw_leave_critical_section(dev
);
3558 zmw_leave_critical_section(dev
);
3560 wd
->commTally
.txQosDropCount
[ac
]++;
3561 zfwBufFree(dev
, buf
, ZM_SUCCESS
);
3562 zm_msg1_tx(ZM_LV_1
, "Packet discarded, VTXQ full, ac=", ac
);
3563 return ZM_ERR_EXCEED_PRIORITY_THRESHOLD
; //VTXQ[] Full
3568 /************************************************************************/
3570 /* FUNCTION DESCRIPTION zfGetVtxq */
3571 /* Get Tx buffer from virtual TxQ */
3574 /* dev : device pointer */
3577 /* Tx buffer pointer */
3580 /* Stephen Chen ZyDAS Technology Corporation 2006.6 */
3582 /************************************************************************/
3583 zbuf_t
* zfGetVtxq(zdev_t
* dev
, u8_t ac
)
3587 zmw_get_wlan_dev(dev
);
3589 zmw_declare_for_critical_section();
3592 zmw_enter_critical_section(dev
);
3593 if (wd
->vtxqHead
[ac
] != wd
->vtxqTail
[ac
])
3595 buf
= wd
->vtxq
[ac
][wd
->vtxqTail
[ac
]];
3596 wd
->vtxqTail
[ac
] = ((wd
->vtxqTail
[ac
] + 1) & ZM_VTXQ_SIZE_MASK
);
3597 zmw_leave_critical_section(dev
);
3602 zmw_leave_critical_section(dev
);
3603 return 0; //VTXQ[] empty
3607 /************************************************************************/
3609 /* FUNCTION DESCRIPTION zfPutVmmq */
3610 /* Put Tx buffer to virtual MmQ */
3613 /* dev : device pointer */
3614 /* buf : Tx buffer pointer */
3617 /* ZM_SUCCESS or error code */
3620 /* Stephen Chen ZyDAS Technology Corporation 2006.12 */
3622 /************************************************************************/
3623 u16_t
zfPutVmmq(zdev_t
* dev
, zbuf_t
* buf
)
3625 zmw_get_wlan_dev(dev
);
3626 zmw_declare_for_critical_section();
3628 zmw_enter_critical_section(dev
);
3629 if (((wd
->vmmqHead
+ 1) & ZM_VMMQ_SIZE_MASK
) != wd
->vmmqTail
)
3631 wd
->vmmq
[wd
->vmmqHead
] = buf
;
3632 wd
->vmmqHead
= ((wd
->vmmqHead
+ 1) & ZM_VMMQ_SIZE_MASK
);
3633 zmw_leave_critical_section(dev
);
3638 zmw_leave_critical_section(dev
);
3640 zfwBufFree(dev
, buf
, ZM_SUCCESS
);
3641 zm_msg0_mm(ZM_LV_0
, "Packet discarded, VMmQ full");
3642 return ZM_ERR_VMMQ_FULL
; //VTXQ[] Full
3647 /************************************************************************/
3649 /* FUNCTION DESCRIPTION zfGetVmmq */
3650 /* Get Tx buffer from virtual MmQ */
3653 /* dev : device pointer */
3656 /* Tx buffer pointer */
3659 /* Stephen Chen ZyDAS Technology Corporation 2006.12 */
3661 /************************************************************************/
3662 zbuf_t
* zfGetVmmq(zdev_t
* dev
)
3665 zmw_get_wlan_dev(dev
);
3666 zmw_declare_for_critical_section();
3668 zmw_enter_critical_section(dev
);
3669 if (wd
->vmmqHead
!= wd
->vmmqTail
)
3671 buf
= wd
->vmmq
[wd
->vmmqTail
];
3672 wd
->vmmqTail
= ((wd
->vmmqTail
+ 1) & ZM_VMMQ_SIZE_MASK
);
3673 zmw_leave_critical_section(dev
);
3678 zmw_leave_critical_section(dev
);
3679 return 0; //VTXQ[] empty
3683 /************************************************************************/
3685 /* FUNCTION DESCRIPTION zfPushVtxq */
3686 /* Service Virtual TxQ (weighted round robin) */
3687 /* Get Tx buffer form virtual TxQ and put to hardware TxD queue */
3690 /* dev : device pointer */
3696 /* Stephen Chen ZyDAS Technology Corporation 2006.6 */
3698 /************************************************************************/
3699 void zfPushVtxq(zdev_t
* dev
)
3707 zmw_get_wlan_dev(dev
);
3708 zmw_declare_for_critical_section();
3712 //zm_debug_msg1("zfHpGetFreeTxdCount = ", zfHpGetFreeTxdCount(dev));
3714 if (wd
->halState
== ZM_HAL_STATE_INIT
)
3716 if (!wd
->modeMDKEnable
)
3718 zm_debug_msg0("HAL is not ready for Tx");
3722 else if (wd
->sta
.DFSDisableTx
)
3724 zm_debug_msg0("return because 802.11h DFS Disable Tx");
3727 else if (wd
->sta
.flagFreqChanging
!= 0)
3729 //Hold until RF frequency changed
3732 else if (( wd
->sta
.flagKeyChanging
) && ( wd
->wlanMode
!= ZM_MODE_AP
))
3736 #ifdef ZM_ENABLE_POWER_SAVE
3737 else if ( zfPowerSavingMgrIsSleeping(dev
) )
3739 //zm_debug_msg0("Packets queued since the MAC is in power-saving mode\n");
3744 zmw_enter_critical_section(dev
);
3745 if (wd
->vtxqPushing
!= 0)
3751 wd
->vtxqPushing
= 1;
3753 zmw_leave_critical_section(dev
);
3764 /* 2006.12.20, Serve Management queue */
3765 while( zfHpGetFreeTxdCount(dev
) > 0 )
3767 buf
= zfGetVmmq(dev
);
3771 //zm_debug_msg2("send buf = ", buf);
3772 err
= zfHpSend(dev
, NULL
, 0, NULL
, 0, NULL
, 0, buf
, 0,
3773 ZM_INTERNAL_ALLOC_BUF
, 0, 0xff);
3774 if (err
!= ZM_SUCCESS
)
3776 zfwBufFree(dev
, buf
, 0);
3784 if ((wd
->sta
.bScheduleScan
) || ((wd
->sta
.bChannelScan
== TRUE
) && (zfStaIsConnected(dev
))))
3786 //Hold until Scan Stop
3787 wd
->vtxqPushing
= 0;
3791 #ifdef ZM_ENABLE_AGGREGATION
3792 #ifndef ZM_BYPASS_AGGR_SCHEDULING
3793 if( (wd
->wlanMode
== ZM_MODE_AP
) ||
3794 (wd
->wlanMode
== ZM_MODE_INFRASTRUCTURE
&& wd
->sta
.EnableHT
) ||
3795 (wd
->wlanMode
== ZM_MODE_PSEUDO
) ) {
3797 zfAggTxScheduler(dev
, 0);
3800 wd
->vtxqPushing
= 0;
3810 /* Service VTxQ[3] */
3813 freeTxd
= zfHpGetFreeTxdCount(dev
);
3816 buf
= zfGetVtxq(dev
, 3);
3820 //zm_debug_msg2("send buf = ", buf);
3821 zfTxSendEth(dev
, buf
, 0, ZM_EXTERNAL_ALLOC_BUF
, 0);
3822 ZM_PERFORMANCE_TX_MPDU(dev
, wd
->tick
);
3831 /* Service VTxQ[2] */
3834 freeTxd
= zfHpGetFreeTxdCount(dev
);
3835 if (freeTxd
>= (zfHpGetMaxTxdCount(dev
)*1/4))
3837 buf
= zfGetVtxq(dev
, 2);
3841 zfTxSendEth(dev
, buf
, 0, ZM_EXTERNAL_ALLOC_BUF
, 0);
3842 ZM_PERFORMANCE_TX_MPDU(dev
, wd
->tick
);
3844 if (wd
->sta
.ac0PriorityHigherThanAc2
== 1)
3846 buf
= zfGetVtxq(dev
, 0);
3850 zfTxSendEth(dev
, buf
, 0, ZM_EXTERNAL_ALLOC_BUF
, 0);
3851 ZM_PERFORMANCE_TX_MPDU(dev
, wd
->tick
);
3861 /* Service VTxQ[0] */
3864 freeTxd
= zfHpGetFreeTxdCount(dev
);
3865 if (freeTxd
>= (zfHpGetMaxTxdCount(dev
)*2/4))
3867 buf
= zfGetVtxq(dev
, 0);
3871 zfTxSendEth(dev
, buf
, 0, ZM_EXTERNAL_ALLOC_BUF
, 0);
3872 ZM_PERFORMANCE_TX_MPDU(dev
, wd
->tick
);
3882 /* Service VTxQ[1] */
3883 freeTxd
= zfHpGetFreeTxdCount(dev
);
3884 if (freeTxd
>= (zfHpGetMaxTxdCount(dev
)*3/4))
3886 buf
= zfGetVtxq(dev
, 1);
3890 zfTxSendEth(dev
, buf
, 0, ZM_EXTERNAL_ALLOC_BUF
, 0);
3891 ZM_PERFORMANCE_TX_MPDU(dev
, wd
->tick
);
3895 /* All VTxQs are either empty or exceed their threshold */
3898 wd
->vtxqPushing
= 0;
3905 /************************************************************************/
3907 /* FUNCTION DESCRIPTION zfFlushVtxq */
3908 /* Flush Virtual TxQ and MmQ */
3911 /* dev : device pointer */
3917 /* Stephen Chen Atheros Communications, INC. 2007.1 */
3919 /************************************************************************/
3920 void zfFlushVtxq(zdev_t
* dev
)
3924 zmw_get_wlan_dev(dev
);
3927 while ((buf
= zfGetVmmq(dev
)) != 0)
3929 zfwBufFree(dev
, buf
, 0);
3930 zm_debug_msg0("zfFlushVtxq: [Vmmq]");
3931 wd
->queueFlushed
|= 0x10;
3937 while ((buf
= zfGetVtxq(dev
, i
)) != 0)
3939 zfwBufFree(dev
, buf
, 0);
3940 zm_debug_msg1("zfFlushVtxq: [zfGetVtxq]- ", i
);
3941 wd
->queueFlushed
|= (1<<i
);
3946 void zf80211FrameSend(zdev_t
* dev
, zbuf_t
* buf
, u16_t
* header
, u16_t snapLen
,
3947 u16_t
* da
, u16_t
* sa
, u8_t up
, u16_t headerLen
, u16_t
* snap
,
3948 u16_t
* tail
, u16_t tailLen
, u16_t offset
, u16_t bufType
,
3949 u8_t ac
, u8_t keyIdx
)
3954 zmw_get_wlan_dev(dev
);
3956 fragLen
= zfwBufGetSize(dev
, buf
);
3957 if ((da
[0]&0x1) == 0)
3959 wd
->commTally
.txUnicastFrm
++;
3960 wd
->commTally
.txUnicastOctets
+= (fragLen
+snapLen
);
3962 else if (da
[0] == 0xffff)
3964 wd
->commTally
.txBroadcastFrm
++;
3965 wd
->commTally
.txBroadcastOctets
+= (fragLen
+snapLen
);
3969 wd
->commTally
.txMulticastFrm
++;
3970 wd
->commTally
.txMulticastOctets
+= (fragLen
+snapLen
);
3972 wd
->ledStruct
.txTraffic
++;
3974 err
= zfHpSend(dev
, header
, headerLen
, snap
, snapLen
,
3975 tail
, tailLen
, buf
, offset
,
3976 bufType
, ac
, keyIdx
);
3977 if (err
!= ZM_SUCCESS
)
3979 if (bufType
== ZM_EXTERNAL_ALLOC_BUF
)
3981 zfwBufFree(dev
, buf
, err
);
3983 else if (bufType
== ZM_INTERNAL_ALLOC_BUF
)
3985 zfwBufFree(dev
, buf
, 0);
3994 void zfCheckIsRIFSFrame(zdev_t
* dev
, zbuf_t
* buf
, u16_t frameSubtype
)
3996 zmw_get_wlan_dev(dev
);
3998 /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */
3999 if (frameSubtype
& 0x80)
4002 u16_t qosControlField
;
4004 sequenceNum
= ( zmw_buf_readh(dev
, buf
, 22) >> 4 ); // Discard fragment number !
4005 qosControlField
= zmw_buf_readh(dev
, buf
, 24); // Don't consider WDS (Wireless Distribution System)
4006 //DbgPrint("The QoS Control Field : %d", qosControlField);
4007 //DbgPrint("The RIFS Count : %d", wd->sta.rifsCount);
4009 if( qosControlField
& ZM_BIT_5
)
4010 {// ACK policy is "No ACK"
4011 /* RIFS-Like frame */
4012 wd
->sta
.rifsLikeFrameSequence
[wd
->sta
.rifsLikeFrameCnt
] = sequenceNum
;
4014 if( wd
->sta
.rifsState
== ZM_RIFS_STATE_DETECTING
)
4016 if( wd
->sta
.rifsLikeFrameSequence
[2] != 0 )
4017 {// RIFS-like Pattern collected
4018 if( ( wd
->sta
.rifsLikeFrameSequence
[2] - wd
->sta
.rifsLikeFrameSequence
[1] == 2 ) &&
4019 ( wd
->sta
.rifsLikeFrameSequence
[1] - wd
->sta
.rifsLikeFrameSequence
[0] == 2 ) )
4021 /* RIFS pattern matched */
4023 /* #3 Enable RIFS function if the RIFS pattern matched */
4024 zfHpEnableRifs(dev
, ((wd
->sta
.currentFrequency
<3000)?1:0), wd
->sta
.EnableHT
, wd
->sta
.HT2040
);
4027 wd
->sta
.rifsTimer
= wd
->tick
;
4029 wd
->sta
.rifsCount
++;
4031 // Set state to be Detected
4032 wd
->sta
.rifsState
= ZM_RIFS_STATE_DETECTED
;
4037 {// state = Detected
4039 if( (wd
->tick
- wd
->sta
.rifsTimer
) < ZM_RIFS_TIMER_TIMEOUT
)
4040 wd
->sta
.rifsTimer
= wd
->tick
;
4043 //DbgPrint("SN1 = %d, SN2 = %d, SN3 = %d\n", wd->sta.rifsLikeFrameSequence[0],
4044 // wd->sta.rifsLikeFrameSequence[1],
4045 // wd->sta.rifsLikeFrameSequence[2]);
4047 // Update RIFS-like sequence number
4048 if( wd
->sta
.rifsLikeFrameSequence
[2] != 0 )
4050 wd
->sta
.rifsLikeFrameSequence
[0] = wd
->sta
.rifsLikeFrameSequence
[1];
4051 wd
->sta
.rifsLikeFrameSequence
[1] = wd
->sta
.rifsLikeFrameSequence
[2];
4052 wd
->sta
.rifsLikeFrameSequence
[2] = 0;
4055 // Only record three adjacent frame
4056 if( wd
->sta
.rifsLikeFrameCnt
< 2 )
4057 wd
->sta
.rifsLikeFrameCnt
++;
4061 /* #4 Disable RIFS function if the timer TIMEOUT */
4062 if( wd
->sta
.rifsState
== ZM_RIFS_STATE_DETECTED
)
4064 if( ( wd
->tick
- wd
->sta
.rifsTimer
) > ZM_RIFS_TIMER_TIMEOUT
)
4067 zfHpDisableRifs(dev
);
4069 // Reset RIFS-like sequence number FIFO
4070 wd
->sta
.rifsLikeFrameSequence
[0] = 0;
4071 wd
->sta
.rifsLikeFrameSequence
[1] = 0;
4072 wd
->sta
.rifsLikeFrameSequence
[2] = 0;
4073 wd
->sta
.rifsLikeFrameCnt
= 0;
4075 // Set state to be Detecting
4076 wd
->sta
.rifsState
= ZM_RIFS_STATE_DETECTING
;