summaryrefslogtreecommitdiffstats
path: root/drivers/staging/otus/80211core
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/otus/80211core')
-rw-r--r--drivers/staging/otus/80211core/amsdu.c129
-rw-r--r--drivers/staging/otus/80211core/cagg.c3621
-rw-r--r--drivers/staging/otus/80211core/cagg.h435
-rw-r--r--drivers/staging/otus/80211core/ccmd.c1766
-rw-r--r--drivers/staging/otus/80211core/cfunc.c1226
-rw-r--r--drivers/staging/otus/80211core/cfunc.h449
-rw-r--r--drivers/staging/otus/80211core/chb.c200
-rw-r--r--drivers/staging/otus/80211core/cic.c499
-rw-r--r--drivers/staging/otus/80211core/cinit.c1912
-rw-r--r--drivers/staging/otus/80211core/cmm.c2183
-rw-r--r--drivers/staging/otus/80211core/cmmap.c2435
-rw-r--r--drivers/staging/otus/80211core/cmmsta.c5817
-rw-r--r--drivers/staging/otus/80211core/coid.c2696
-rw-r--r--drivers/staging/otus/80211core/cprecomp.h32
-rw-r--r--drivers/staging/otus/80211core/cpsmgr.c730
-rw-r--r--drivers/staging/otus/80211core/cscanmgr.c533
-rw-r--r--drivers/staging/otus/80211core/ctkip.c599
-rw-r--r--drivers/staging/otus/80211core/ctxrx.c4115
-rw-r--r--drivers/staging/otus/80211core/cwep.c299
-rw-r--r--drivers/staging/otus/80211core/cwm.c131
-rw-r--r--drivers/staging/otus/80211core/cwm.h45
-rw-r--r--drivers/staging/otus/80211core/freqctrl.c259
-rw-r--r--drivers/staging/otus/80211core/ledmgr.c556
-rw-r--r--drivers/staging/otus/80211core/performance.c431
-rw-r--r--drivers/staging/otus/80211core/performance.h97
-rw-r--r--drivers/staging/otus/80211core/pub_usb.h102
-rw-r--r--drivers/staging/otus/80211core/pub_zfi.h820
-rw-r--r--drivers/staging/otus/80211core/pub_zfw.h93
-rw-r--r--drivers/staging/otus/80211core/queue.c304
-rw-r--r--drivers/staging/otus/80211core/queue.h37
-rw-r--r--drivers/staging/otus/80211core/ratectrl.c875
-rw-r--r--drivers/staging/otus/80211core/ratectrl.h37
-rw-r--r--drivers/staging/otus/80211core/struct.h1315
-rw-r--r--drivers/staging/otus/80211core/wlan.h595
34 files changed, 0 insertions, 35373 deletions
diff --git a/drivers/staging/otus/80211core/amsdu.c b/drivers/staging/otus/80211core/amsdu.c
deleted file mode 100644
index 0321288..0000000
--- a/drivers/staging/otus/80211core/amsdu.c
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfGetAmsduSubFrame */
-/* Get a subframe from a-MSDU. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : A-MSDU frame buffer */
-/* offset : offset of subframe in the A-MSDU */
-/* */
-/* OUTPUTS */
-/* NULL or subframe */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-zbuf_t *zfGetAmsduSubFrame(zdev_t *dev, zbuf_t *buf, u16_t *offset)
-{
- u16_t subframeLen;
- u16_t amsduLen = zfwBufGetSize(dev, buf);
- zbuf_t *newBuf;
-
- ZM_PERFORMANCE_RX_AMSDU(dev, buf, amsduLen);
-
- /* Verify A-MSDU length */
- if (amsduLen < (*offset + 14))
- return NULL;
-
- /* Locate A-MSDU subframe by offset and verify subframe length */
- subframeLen = (zmw_buf_readb(dev, buf, *offset + 12) << 8) +
- zmw_buf_readb(dev, buf, *offset + 13);
-
- if (subframeLen == 0)
- return NULL;
-
- /* Verify A-MSDU subframe length */
- if ((*offset+14+subframeLen) <= amsduLen) {
- /* Allocate a new buffer */
- newBuf = zfwBufAllocate(dev, 24+2+subframeLen);
- if (newBuf != NULL) {
- #ifdef ZM_ENABLE_NATIVE_WIFI
- /* Copy and convert subframe to wlan frame format
- * SHALL NOT INCLUDE QOS and AMSDU header.
- * Ray 20070807 For Vista
- */
- zfRxBufferCopy(dev, newBuf, buf, 0, 0, 24);
- zfRxBufferCopy(dev, newBuf, buf, 24, *offset+14,
- subframeLen);
- zfwBufSetSize(dev, newBuf, 24+subframeLen);
- #else
- /* Copy subframe to new buffer */
- zfRxBufferCopy(dev, newBuf, buf, 0, *offset,
- 14+subframeLen);
- zfwBufSetSize(dev, newBuf, 14+subframeLen);
- #endif
- /* Update offset */
- *offset += (((14+subframeLen)+3) & 0xfffc);
-
- /* Return buffer pointer */
- return newBuf;
- }
- }
- return NULL;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfDeAmsdu */
-/* De-AMSDU. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : A-MSDU frame buffer */
-/* vap : VAP port */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-void zfDeAmsdu(zdev_t *dev, zbuf_t *buf, u16_t vap, u8_t encryMode)
-{
- u16_t offset = ZM_SIZE_OF_WLAN_DATA_HEADER+ZM_SIZE_OF_QOS_CTRL;
- zbuf_t *subframeBuf;
- zmw_get_wlan_dev(dev);
-
- ZM_BUFFER_TRACE(dev, buf)
-
- if (encryMode == ZM_AES || encryMode == ZM_TKIP)
- offset += (ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV);
- else if (encryMode == ZM_WEP64 || encryMode == ZM_WEP128)
- offset += ZM_SIZE_OF_IV;
-
-
- /* Repeatly calling zfGetAmsduSubFrame() until NULL returned */
- while ((subframeBuf = zfGetAmsduSubFrame(dev, buf, &offset)) != NULL) {
- wd->commTally.NotifyNDISRxFrmCnt++;
- if (wd->zfcbRecvEth != NULL) {
- wd->zfcbRecvEth(dev, subframeBuf, (u8_t)vap);
- ZM_PERFORMANCE_RX_MSDU(dev, wd->tick);
- }
- }
- zfwBufFree(dev, buf, 0);
-
- return;
-}
diff --git a/drivers/staging/otus/80211core/cagg.c b/drivers/staging/otus/80211core/cagg.c
deleted file mode 100644
index c3cef1a..0000000
--- a/drivers/staging/otus/80211core/cagg.c
+++ /dev/null
@@ -1,3621 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : cagg.c */
-/* */
-/* Abstract */
-/* This module contains A-MPDU aggregation related functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-
-#include "cprecomp.h"
-
-extern u8_t zcUpToAc[8];
-const u8_t pri[] = {3,3,2,3,2,1,3,2,1,0};
-
-
-u16_t aggr_count;
-u32_t success_mpdu;
-u32_t total_mpdu;
-
-void zfAggInit(zdev_t* dev)
-{
- u16_t i,j;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
- /*
- * reset sta information
- */
-
- zmw_enter_critical_section(dev);
- wd->aggInitiated = 0;
- wd->addbaComplete = 0;
- wd->addbaCount = 0;
- wd->reorder = 1;
- for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
- {
- for (j=0; j<ZM_AC; j++)
- {
- //wd->aggSta[i].aggQNumber[j] = ZM_AGG_POOL_SIZE;
- wd->aggSta[i].aggFlag[j] = wd->aggSta[i].count[j] = 0;
- wd->aggSta[i].tid_tx[j] = NULL;
- wd->aggSta[i].tid_tx[j+1] = NULL;
-
- }
- }
-
- /*
- * reset Tx/Rx aggregation queue information
- */
- wd->aggState = 0;
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- /*
- * reset tx aggregation queue
- */
- wd->aggQPool[i] = zfwMemAllocate(dev, sizeof(struct aggQueue));
- if(!wd->aggQPool[i])
- {
- zmw_leave_critical_section(dev);
- return;
- }
- wd->aggQPool[i]->aggHead = wd->aggQPool[i]->aggTail =
- wd->aggQPool[i]->aggQEnabled = wd->aggQPool[i]->aggReady =
- wd->aggQPool[i]->clearFlag = wd->aggQPool[i]->deleteFlag = 0;
- //wd->aggQPool[i]->aggSize = 16;
-
- /*
- * reset rx aggregation queue
- */
- wd->tid_rx[i] = zfwMemAllocate(dev, sizeof(struct agg_tid_rx));
- if (!wd->tid_rx[i])
- {
- zmw_leave_critical_section(dev);
- return;
- }
- wd->tid_rx[i]->aid = ZM_MAX_STA_SUPPORT;
- wd->tid_rx[i]->seq_start = wd->tid_rx[i]->baw_head = \
- wd->tid_rx[i]->baw_tail = 0;
- wd->tid_rx[i]->sq_exceed_count = wd->tid_rx[i]->sq_behind_count = 0;
- for (j=0; j<=ZM_AGG_BAW_SIZE; j++)
- wd->tid_rx[i]->frame[j].buf = 0;
- /*
- * reset ADDBA exchange status code
- * 0: NULL
- * 1: ADDBA Request sent/received
- * 2: ACK for ADDBA Request sent/received
- * 3: ADDBA Response sent/received
- * 4: ACK for ADDBA Response sent/received
- */
- wd->tid_rx[i]->addBaExchangeStatusCode = 0;
-
- }
- zmw_leave_critical_section(dev);
- zfAggTallyReset(dev);
- DESTQ.init = zfAggDestInit;
- DESTQ.init(dev);
- wd->aggInitiated = 1;
- aggr_count = 0;
- success_mpdu = 0;
- total_mpdu = 0;
-#ifdef ZM_ENABLE_AGGREGATION
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
- BAW = zfwMemAllocate(dev, sizeof(struct baw_enabler));
- if(!BAW)
- {
- return;
- }
- BAW->init = zfBawInit;
- BAW->init(dev);
-#endif //disable BAW
-#endif
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggGetSta */
-/* return STA AID. */
-/* take buf as input, use the dest address of buf as index to */
-/* search STA AID. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer for one particular packet */
-/* */
-/* OUTPUTS */
-/* AID */
-/* */
-/* AUTHOR */
-/* Honda ZyDAS Technology Corporation 2006.11 */
-/* */
-/************************************************************************/
-
-
-
-u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf)
-{
- u16_t id;
- u16_t dst[3];
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- dst[0] = zmw_rx_buf_readh(dev, buf, 0);
- dst[1] = zmw_rx_buf_readh(dev, buf, 2);
- dst[2] = zmw_rx_buf_readh(dev, buf, 4);
-
- zmw_enter_critical_section(dev);
-
- if(wd->wlanMode == ZM_MODE_AP) {
- id = zfApFindSta(dev, dst);
- }
- else {
- id = 0;
- }
- zmw_leave_critical_section(dev);
-
-#if ZM_AGG_FPGA_DEBUG
- id = 0;
-#endif
-
- return id;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxGetQueue */
-/* return Queue Pool index. */
-/* take aid as input, look for the queue index associated */
-/* with this aid. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* aid : associated id */
-/* */
-/* OUTPUTS */
-/* Queue number */
-/* */
-/* AUTHOR */
-/* Honda ZyDAS Technology Corporation 2006.11 */
-/* */
-/************************************************************************/
-TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid)
-{
- //u16_t i;
- TID_TX tid_tx;
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- /*
- * not a STA aid
- */
- if (0xffff == aid)
- return NULL;
-
- //zmw_enter_critical_section(dev);
-
- tid_tx = wd->aggSta[aid].tid_tx[tid];
- if (!tid_tx) return NULL;
- if (0 == tid_tx->aggQEnabled)
- return NULL;
-
- //zmw_leave_critical_section(dev);
-
- return tid_tx;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxNewQueue */
-/* return Queue Pool index. */
-/* take aid as input, find a new queue for this aid. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* aid : associated id */
-/* */
-/* OUTPUTS */
-/* Queue number */
-/* */
-/* AUTHOR */
-/* Honda ZyDAS Technology Corporation 2006.12 */
-/* */
-/************************************************************************/
-TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf)
-{
- u16_t i;
- TID_TX tid_tx=NULL;
- u16_t ac = zcUpToAc[tid&0x7] & 0x3;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /*
- * not a STA aid
- */
- if (0xffff == aid)
- return NULL;
-
- zmw_enter_critical_section(dev);
-
- /*
- * find one new queue for sta
- */
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- if (wd->aggQPool[i]->aggQEnabled)
- {
- /*
- * this q is enabled
- */
- }
- else
- {
- tid_tx = wd->aggQPool[i];
- tid_tx->aggQEnabled = 1;
- tid_tx->aggQSTA = aid;
- tid_tx->ac = ac;
- tid_tx->tid = tid;
- tid_tx->aggHead = tid_tx->aggTail = tid_tx->size = 0;
- tid_tx->aggReady = 0;
- wd->aggSta[aid].tid_tx[tid] = tid_tx;
- tid_tx->dst[0] = zmw_rx_buf_readh(dev, buf, 0);
- tid_tx->dst[1] = zmw_rx_buf_readh(dev, buf, 2);
- tid_tx->dst[2] = zmw_rx_buf_readh(dev, buf, 4);
- break;
- }
- }
-
- zmw_leave_critical_section(dev);
-
- return tid_tx;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxEnqueue */
-/* return Status code ZM_SUCCESS or error code */
-/* take (aid,ac,qnum,buf) as input */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* aid : associated id */
-/* ac : access category */
-/* qnum: the queue number to which will be enqueued */
-/* buf : the packet to be queued */
-/* */
-/* OUTPUTS */
-/* status code */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx)
-{
- //u16_t qlen, frameLen;
- u32_t time;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
-
- if (tid_tx->size < (ZM_AGGQ_SIZE - 2))
- {
- /* Queue not full */
-
-
- /*
- * buffer copy
- * in zfwBufFree will return a ndismsendcomplete
- * to resolve the synchronize problem in aggregate
- */
-
- u8_t sendComplete = 0;
-
- tid_tx->aggvtxq[tid_tx->aggHead].buf = buf;
- time = zm_agg_GetTime();
- tid_tx->aggvtxq[tid_tx->aggHead].arrivalTime = time;
- tid_tx->aggvtxq[tid_tx->aggHead].baw_retransmit = 0;
-
- tid_tx->aggHead = ((tid_tx->aggHead + 1) & ZM_AGGQ_SIZE_MASK);
- tid_tx->lastArrival = time;
- tid_tx->size++;
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- if (buf && (tid_tx->size < (ZM_AGGQ_SIZE - 10))) {
- tid_tx->complete = tid_tx->aggHead;
- sendComplete = 1;
- }
- zmw_leave_critical_section(dev);
-
- if (!DESTQ.exist(dev, 0, tid_tx->ac, tid_tx, NULL)) {
- DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL);
- }
-
- zm_msg1_agg(ZM_LV_0, "tid_tx->size=", tid_tx->size);
- //zm_debug_msg1("tid_tx->size=", tid_tx->size);
-
- if (buf && sendComplete && wd->zfcbSendCompleteIndication) {
- //zmw_leave_critical_section(dev);
- wd->zfcbSendCompleteIndication(dev, buf);
- }
-
- /*if (tid_tx->size >= 16 && zfHpGetFreeTxdCount(dev) > 20)
- zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx);
- */
- return ZM_SUCCESS;
- }
- else
- {
- zm_msg1_agg(ZM_LV_0, "can't enqueue, tid_tx->size=", tid_tx->size);
- /*
- * Queue Full
- */
-
- /*
- * zm_msg1_agg(ZM_LV_0, "Queue full, qnum = ", qnum);
- * wd->commTally.txQosDropCount[ac]++;
- * zfwBufFree(dev, buf, ZM_SUCCESS);
- * zm_msg1_agg(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac);
- *
- * return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
- */
- }
-
- zmw_leave_critical_section(dev);
-
- if (!DESTQ.exist(dev, 0, tid_tx->ac, tid_tx, NULL)) {
- DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL);
- }
-
- return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
-}
-
-u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq) {
- struct dest* dest;
- u16_t exist = 0;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (!DESTQ.Head[ac]) {
- exist = 0;
- }
- else {
- dest = DESTQ.Head[ac];
- if (dest->tid_tx == tid_tx) {
- exist = 1;
- }
- else {
- while (dest->next != DESTQ.Head[ac]) {
- dest = dest->next;
- if (dest->tid_tx == tid_tx){
- exist = 1;
- break;
- }
- }
- }
- }
-
- zmw_leave_critical_section(dev);
-
- return exist;
-}
-
-void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq)
-{
- struct dest* new_dest;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- new_dest = zfwMemAllocate(dev, sizeof(struct dest));
- if(!new_dest)
- {
- return;
- }
- new_dest->Qtype = Qtype;
- new_dest->tid_tx = tid_tx;
- if (0 == Qtype)
- new_dest->tid_tx = tid_tx;
- else
- new_dest->vtxq = vtxq;
- if (!DESTQ.Head[ac]) {
-
- zmw_enter_critical_section(dev);
- new_dest->next = new_dest;
- DESTQ.Head[ac] = DESTQ.dest[ac] = new_dest;
- zmw_leave_critical_section(dev);
- }
- else {
-
- zmw_enter_critical_section(dev);
- new_dest->next = DESTQ.dest[ac]->next;
- DESTQ.dest[ac]->next = new_dest;
- zmw_leave_critical_section(dev);
- }
-
-
- //DESTQ.size[ac]++;
- return;
-}
-
-void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq)
-{
- struct dest* dest, *temp;
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (wd->destLock) {
- zmw_leave_critical_section(dev);
- return;
- }
-
-
- //zmw_declare_for_critical_section();
- for (i=0; i<4; i++) {
- if (!DESTQ.Head[i]) continue;
- dest = DESTQ.Head[i];
- if (!dest) continue;
-
-
- while (dest && (dest->next != DESTQ.Head[i])) {
- if (Qtype == 0 && dest->next->tid_tx == tid_tx){
- break;
- }
- if (Qtype == 1 && dest->next->vtxq == vtxq) {
- break;
- }
- dest = dest->next;
- }
-
- if ((Qtype == 0 && dest->next->tid_tx == tid_tx) || (Qtype == 1 && dest->next->vtxq == vtxq)) {
-
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- if (tid_tx->size) {
- zmw_leave_critical_section(dev);
- return;
- }
- if (!DESTQ.Head[i]) {
- temp = NULL;
- }
- else {
- temp = dest->next;
- if (temp == dest) {
- DESTQ.Head[i] = DESTQ.dest[i] = NULL;
- //DESTQ.size[i] = 0;
- }
- else {
- dest->next = dest->next->next;
- }
- }
-
- if (temp == NULL)
- {/* do nothing */} //zfwMemFree(dev, temp, sizeof(struct dest));
- else
- zfwMemFree(dev, temp, sizeof(struct dest));
-
- /*zmw_enter_critical_section(dev);
- if (DESTQ.size[i] > 0)
- DESTQ.size[i]--;
- zmw_leave_critical_section(dev);
- */
- }
-
- }
- zmw_leave_critical_section(dev);
- return;
-}
-
-void zfAggDestInit(zdev_t* dev)
-{
- u16_t i;
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- for (i=0; i<4; i++) {
- //wd->destQ.Head[i].next = wd->destQ.Head[i];
- //wd->destQ.dest[i] = wd->destQ.Head[i];
- //DESTQ.size[i] = 0;
- DESTQ.Head[i] = NULL;
- }
- DESTQ.insert = zfAggDestInsert;
- DESTQ.delete = zfAggDestDelete;
- DESTQ.init = zfAggDestInit;
- DESTQ.getNext = zfAggDestGetNext;
- DESTQ.exist = zfAggDestExist;
- DESTQ.ppri = 0;
- return;
-}
-
-struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac)
-{
- struct dest *dest = NULL;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (DESTQ.dest[ac]) {
- dest = DESTQ.dest[ac];
- DESTQ.dest[ac] = DESTQ.dest[ac]->next;
- }
- else {
- dest = NULL;
- }
- zmw_leave_critical_section(dev);
-
- return dest;
-}
-
-#ifdef ZM_ENABLE_AGGREGATION
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo *buf_info,TID_TX tid_tx)
-{
- zbuf_t* buf;
- u32_t time;
- struct baw_header *baw_header;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
-
- buf = buf_info->buf;
-
- zmw_enter_critical_section(dev);
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- zmw_leave_critical_section(dev);
-
- if (tid_tx->size >= (ZM_AGGQ_SIZE - 2)) {
- zfwBufFree(dev, buf, ZM_SUCCESS);
- return 0;
- }
-
- zmw_enter_critical_section(dev);
- tid_tx->aggTail = (tid_tx->aggTail == 0)? ZM_AGGQ_SIZE_MASK: tid_tx->aggTail - 1;
- tid_tx->aggvtxq[tid_tx->aggTail].buf = buf;
- //time = zm_agg_GetTime();
- tid_tx->aggvtxq[tid_tx->aggTail].arrivalTime = buf_info->timestamp;
- tid_tx->aggvtxq[tid_tx->aggTail].baw_retransmit = buf_info->baw_retransmit;
-
- baw_header = &tid_tx->aggvtxq[tid_tx->aggTail].baw_header;
- baw_header->headerLen = buf_info->baw_header->headerLen;
- baw_header->micLen = buf_info->baw_header->micLen;
- baw_header->snapLen = buf_info->baw_header->snapLen;
- baw_header->removeLen = buf_info->baw_header->removeLen;
- baw_header->keyIdx = buf_info->baw_header->keyIdx;
- zfwMemoryCopy((u8_t *)baw_header->header, (u8_t *)buf_info->baw_header->header, 58);
- zfwMemoryCopy((u8_t *)baw_header->mic , (u8_t *)buf_info->baw_header->mic , 8);
- zfwMemoryCopy((u8_t *)baw_header->snap , (u8_t *)buf_info->baw_header->snap , 8);
-
- tid_tx->size++;
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- zmw_leave_critical_section(dev);
-
- //tid_tx->lastArrival = time;
- if (1 == tid_tx->size) {
- DESTQ.insert(dev, 0, tid_tx->ac, tid_tx, NULL);
- }
-
-
- zm_msg1_agg(ZM_LV_0, "0xC2:insertHead, tid_tx->size=", tid_tx->size);
-
- return TRUE;
-}
-#endif //disable BAW
-#endif
-
-void zfiTxComplete(zdev_t* dev)
-{
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- if( (wd->wlanMode == ZM_MODE_AP) ||
- (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
- (wd->wlanMode == ZM_MODE_PSEUDO) ) {
- zfAggTxScheduler(dev, 0);
- }
-
- return;
-}
-
-TID_TX zfAggTxReady(zdev_t* dev) {
- //struct dest* dest;
- u16_t i;
- TID_TX tid_tx = NULL;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- if (wd->aggQPool[i]->aggQEnabled)
- {
- if (wd->aggQPool[i]->size >= 16) {
- tid_tx = wd->aggQPool[i];
- break;
- }
- }
- else {
- }
- }
- zmw_leave_critical_section(dev);
- return tid_tx;
-}
-
-u16_t zfAggValidTidTx(zdev_t* dev, TID_TX tid_tx) {
- u16_t i, valid = 0;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- if (wd->aggQPool[i] == tid_tx)
- {
- valid = 1;
- break;
- }
- else {
- }
- }
- zmw_leave_critical_section(dev);
-
- return valid;
-}
-
-void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear)
-{
- TID_TX tid_tx = NULL;
- void* vtxq;
- struct dest* dest;
- zbuf_t* buf;
- u32_t txql, min_txql;
- //u16_t aggr_size = 1;
- u16_t txq_threshold;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if (!wd->aggInitiated)
- {
- return;
- }
-
- /* debug */
- txql = TXQL;
- min_txql = AGG_MIN_TXQL;
-
- if(wd->txq_threshold)
- txq_threshold = wd->txq_threshold;
- else
- txq_threshold = AGG_MIN_TXQL;
-
- tid_tx = zfAggTxReady(dev);
- if (tid_tx) ScanAndClear = 0;
- while (zfHpGetFreeTxdCount(dev) > 20 && (TXQL < txq_threshold || tid_tx)) {
- //while (zfHpGetFreeTxdCount(dev) > 20 && (ScanAndClear || tid_tx)) {
- //while (TXQL < txq_threshold) {
- u16_t i;
- u8_t ac;
- s8_t destQ_count = 0;
- //while ((zfHpGetFreeTxdCount(dev)) > 32) {
-
- //DbgPrint("zfAggTxScheduler: in while loop");
- for (i=0; i<4; i++) {
- if (DESTQ.Head[i]) destQ_count++;
- }
- if (0 >= destQ_count) break;
-
- zmw_enter_critical_section(dev);
- ac = pri[DESTQ.ppri]; DESTQ.ppri = (DESTQ.ppri + 1) % 10;
- zmw_leave_critical_section(dev);
-
- for (i=0; i<10; i++){
- if(DESTQ.Head[ac]) break;
-
- zmw_enter_critical_section(dev);
- ac = pri[DESTQ.ppri]; DESTQ.ppri = (DESTQ.ppri + 1) % 10;
- zmw_leave_critical_section(dev);
- }
- if (i == 10) break;
- //DbgPrint("zfAggTxScheduler: have dest Q");
- zmw_enter_critical_section(dev);
- wd->destLock = 1;
- zmw_leave_critical_section(dev);
-
- dest = DESTQ.getNext(dev, ac);
- if (!dest) {
- zmw_enter_critical_section(dev);
- wd->destLock = 0;
- zmw_leave_critical_section(dev);
-
- DbgPrint("bug report! DESTQ.getNext got nothing!");
- break;
- }
- if (dest->Qtype == 0) {
- tid_tx = dest->tid_tx;
-
- //DbgPrint("zfAggTxScheduler: have tid_tx Q");
-
- if(tid_tx && zfAggValidTidTx(dev, tid_tx))
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- else {
- zmw_enter_critical_section(dev);
- wd->destLock = 0;
- zmw_leave_critical_section(dev);
-
- tid_tx = zfAggTxReady(dev);
- continue;
- }
-
- zmw_enter_critical_section(dev);
- wd->destLock = 0;
- zmw_leave_critical_section(dev);
- //zmw_enter_critical_section(dev);
- if (tid_tx && !tid_tx->size) {
-
- //zmw_leave_critical_section(dev);
- //DESTQ.delete(dev, 0, tid_tx, NULL);
- }
- else if(wd->aggState == 0){
- //wd->aggState = 1;
- //zmw_leave_critical_section(dev);
- zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx);
- //wd->aggState = 0;
- }
- else {
- //zmw_leave_critical_section(dev);
- break;
- }
- }
- else {
- vtxq = dest->vtxq;
- buf = zfGetVtxq(dev, ac);
- zm_assert( buf != 0 );
-
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
-
- }
- /*flush all but < 16 frames in tid_tx to TXQ*/
- tid_tx = zfAggTxReady(dev);
- }
-
- /*while ((zfHpGetFreeTxdCount(dev)) > 32) {
- //while ((zfHpGetFreeTxdCount(dev)) > 32) {
-
- destQ_count = 0;
- for (i=0; i<4; i++) destQ_count += wd->destQ.size[i];
- if (0 >= destQ_count) break;
-
- ac = pri[wd->destQ.ppri]; wd->destQ.ppri = (wd->destQ.ppri + 1) % 10;
- for (i=0; i<10; i++){
- if(wd->destQ.size[ac]!=0) break;
- ac = pri[wd->destQ.ppri]; wd->destQ.ppri = (wd->destQ.ppri + 1) % 10;
- }
- if (i == 10) break;
- dest = wd->destQ.getNext(dev, ac);
- if (dest->Qtype == 0) {
- tid_tx = dest->tid_tx;
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- if (!tid_tx->size) {
- wd->destQ.delete(dev, 0, tid_tx, NULL);
- break;
- }
- else if((wd->aggState == 0) && (tid_tx->size >= 16)){
- zfAggTxSend(dev, zfHpGetFreeTxdCount(dev), tid_tx);
- }
- else {
- break;
- }
- }
-
- }
- */
- return;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTx */
-/* return Status code ZM_SUCCESS or error code */
-/* management A-MPDU aggregation function, */
-/* management aggregation queue, calculate arrivalrate, */
-/* add/delete an aggregation queue of a stream, */
-/* enqueue packets into responsible aggregate queue. */
-/* take (dev, buf, ac) as input */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : packet buff */
-/* ac : access category */
-/* */
-/* OUTPUTS */
-/* status code */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid)
-{
- u16_t aid;
- //u16_t qnum;
- //u16_t aggflag = 0;
- //u16_t arrivalrate = 0;
- TID_TX tid_tx;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if(!wd->aggInitiated)
- {
- return ZM_ERR_TX_BUFFER_UNAVAILABLE;
- }
-
- aid = zfAggGetSta(dev, buf);
-
- //arrivalrate = zfAggTxArrivalRate(dev, aid, tid);
-
- if (0xffff == aid)
- {
- /*
- * STA not associated, this is a BC/MC or STA->AP packet
- */
-
- return ZM_ERR_TX_BUFFER_UNAVAILABLE;
- }
-
- /*
- * STA associated, a unicast packet
- */
-
- tid_tx = zfAggTxGetQueue(dev, aid, tid);
-
- /*tid_q.tid_tx = tid_tx;
- wd->destQ.insert = zfAggDestInsert;
- wd->destQ.insert(dev, 0, tid_q);
- */
- if (tid_tx != NULL)
- {
- /*
- * this (aid, ac) is aggregated
- */
-
- //if (arrivalrate < ZM_AGG_LOW_THRESHOLD)
- if (0)
- {
- /*
- * arrival rate too low
- * delete this aggregate queue
- */
-
- zmw_enter_critical_section(dev);
-
- //wd->aggQPool[qnum]->clearFlag = wd->aggQPool[qnum]->deleteFlag =1;
-
- zmw_leave_critical_section(dev);
-
- }
-
- return zfAggTxEnqueue(dev, buf, aid, tid_tx);
-
- }
- else
- {
- /*
- * this (aid, ac) not yet aggregated
- * queue not found
- */
-
- //if (arrivalrate > ZM_AGG_HIGH_THRESHOLD)
- if (1)
- {
- /*
- * arrivalrate high enough to get a new agg queue
- */
-
- tid_tx = zfAggTxNewQueue(dev, aid, tid, buf);
-
- //zm_msg1_agg(ZM_LV_0, "get new AggQueue qnum = ", tid_tx->);
-
- if (tid_tx)
- {
- /*
- * got a new aggregate queue
- */
-
- //zmw_enter_critical_section(dev);
-
- //wd->aggSta[aid].aggFlag[ac] = 1;
-
- //zmw_leave_critical_section(dev);
-
- /*
- * add ADDBA functions here
- * return ZM_ERR_TX_BUFFER_UNAVAILABLE;
- */
-
-
- //zfAggSendAddbaRequest(dev, tid_tx->dst, tid_tx->ac, tid_tx->tid);
- //zmw_enter_critical_section(dev);
-
- //wd->aggSta[aid].aggFlag[ac] = 0;
-
- //zmw_leave_critical_section(dev);
-
- return zfAggTxEnqueue(dev, buf, aid, tid_tx);
-
- }
- else
- {
- /*
- * just can't get a new aggregate queue
- */
-
- return ZM_ERR_TX_BUFFER_UNAVAILABLE;
- }
- }
- else
- {
- /*
- * arrival rate is not high enough to get a new agg queue
- */
-
- return ZM_ERR_TX_BUFFER_UNAVAILABLE;
- }
- }
-
-
-
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxReadyCount */
-/* return counter of ready to aggregate queues. */
-/* take (dev, ac) as input, only calculate the ready to aggregate */
-/* queues of one particular ac. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* ac : access category */
-/* */
-/* OUTPUTS */
-/* counter of ready to aggregate queues */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac)
-{
- u16_t i;
- u16_t readycount = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- for (i=0 ; i<ZM_AGG_POOL_SIZE; i++)
- {
- if (wd->aggQPool[i]->aggQEnabled && (wd->aggQPool[i]->aggReady || \
- wd->aggQPool[i]->clearFlag) && ac == wd->aggQPool[i]->ac)
- readycount++;
- }
-
- zmw_leave_critical_section(dev);
-
- return readycount;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxPartial */
-/* return the number that Vtxq has to send. */
-/* take (dev, ac, readycount) as input, calculate the ratio of */
-/* Vtxq length to (Vtxq length + readycount) of a particular ac, */
-/* and returns the Vtxq length * the ratio */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* ac : access category */
-/* readycount: the number of ready to aggregate queues of this ac */
-/* */
-/* OUTPUTS */
-/* Vtxq length * ratio */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount)
-{
- u16_t qlen;
- u16_t partial;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- qlen = zm_agg_qlen(dev, wd->vtxqHead[ac], wd->vtxqTail[ac]);
-
- if ((qlen + readycount) > 0)
- {
- partial = (u16_t)( zm_agg_weight(ac) * ((u16_t)qlen/(qlen + \
- readycount)) );
- }
- else
- {
- partial = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- if (partial > qlen)
- partial = qlen;
-
- return partial;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxSend */
-/* return sentcount */
-/* take (dev, ac, n) as input, n is the number of scheduled agg */
-/* queues to be sent of the particular ac. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* ac : access category */
-/* n : the number of scheduled aggregation queues to be sent */
-/* */
-/* OUTPUTS */
-/* sentcount */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx)
-{
- //u16_t qnum;
- //u16_t qlen;
- u16_t j;
- //u16_t sentcount = 0;
- zbuf_t* buf;
- struct aggControl aggControl;
- u16_t aggLen;
- //zbuf_t* newBuf;
- //u16_t bufLen;
- //TID_BAW tid_baw = NULL;
- //struct bufInfo *buf_info;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- //while (tid_tx->size > 0)
-
- zmw_enter_critical_section(dev);
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- aggLen = zm_agg_min(16, zm_agg_min(tid_tx->size, (u16_t)(freeTxd - 2)));
- zmw_leave_critical_section(dev);
-
- /*
- * why there have to be 2 free Txd?
- */
- if (aggLen <=0 )
- return 0;
-
-
- if (aggLen == 1) {
- buf = zfAggTxGetVtxq(dev, tid_tx);
- if (buf)
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- if (tid_tx->size == 0) {
- //DESTQ.delete(dev, 0, tid_tx, NULL);
- }
-
- return 1;
- }
- /*
- * Free Txd queue is big enough to put aggregation
- */
- zmw_enter_critical_section(dev);
- if (wd->aggState == 1) {
- zmw_leave_critical_section(dev);
- return 0;
- }
- wd->aggState = 1;
- zmw_leave_critical_section(dev);
-
-
- zm_msg1_agg(ZM_LV_0, "aggLen=", aggLen);
- tid_tx->aggFrameSize = 0;
- for (j=0; j < aggLen; j++) {
- buf = zfAggTxGetVtxq(dev, tid_tx);
-
- zmw_enter_critical_section(dev);
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- zmw_leave_critical_section(dev);
-
- if ( buf ) {
- //struct aggTally *agg_tal;
- u16_t completeIndex;
-
- if (0 == j) {
- aggControl.ampduIndication = ZM_AGG_FIRST_MPDU;
-
- }
- else if ((j == (aggLen - 1)) || tid_tx->size == 0)
- {
- aggControl.ampduIndication = ZM_AGG_LAST_MPDU;
- //wd->aggState = 0;
-
- }
- else
- {
- aggControl.ampduIndication = ZM_AGG_MIDDLE_MPDU;
- /* the packet is delayed more than 500 ms, drop it */
-
- }
- tid_tx->aggFrameSize += zfwBufGetSize(dev, buf);
- aggControl.addbaIndication = 0;
- aggControl.aggEnabled = 1;
-
-#ifdef ZM_AGG_TALLY
- agg_tal = &wd->agg_tal;
- agg_tal->sent_packets_sum++;
-
-#endif
-
- zfAggTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0, &aggControl, tid_tx);
-
- zmw_enter_critical_section(dev);
- completeIndex = tid_tx->complete;
- if(zm_agg_inQ(tid_tx, tid_tx->complete))
- zm_agg_plus(tid_tx->complete);
- zmw_leave_critical_section(dev);
-
- if(zm_agg_inQ(tid_tx, completeIndex) && wd->zfcbSendCompleteIndication
- && tid_tx->aggvtxq[completeIndex].buf) {
- wd->zfcbSendCompleteIndication(dev, tid_tx->aggvtxq[completeIndex].buf);
- zm_debug_msg0("in queue complete worked!");
- }
-
- }
- else {
- /*
- * this aggregation queue is empty
- */
- zm_msg1_agg(ZM_LV_0, "aggLen not reached, but no more frame, j=", j);
-
- break;
- }
- }
- zmw_enter_critical_section(dev);
- wd->aggState = 0;
- zmw_leave_critical_section(dev);
-
- //zm_acquire_agg_spin_lock(Adapter);
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- //zm_release_agg_spin_lock(Adapter);
-
- if (tid_tx->size == 0) {
- //DESTQ.delete(dev, 0, tid_tx, NULL);
- }
-
-
-
- //zfAggInvokeBar(dev, tid_tx);
- if(j>0) {
- aggr_count++;
- zm_msg1_agg(ZM_LV_0, "0xC2:sent 1 aggr, aggr_count=", aggr_count);
- zm_msg1_agg(ZM_LV_0, "0xC2:sent 1 aggr, aggr_size=", j);
- }
- return j;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxGetReadyQueue */
-/* return the number of the aggregation queue */
-/* take (dev, ac) as input, find the agg queue with smallest */
-/* arrival time (waited longest) among those ready or clearFlag */
-/* set queues. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* ac : access category */
-/* */
-/* OUTPUTS */
-/* aggregation queue number */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac)
-{
- //u16_t qnum = ZM_AGG_POOL_SIZE;
- u16_t i;
- u32_t time = 0;
- TID_TX tid_tx = NULL;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- for (i=0 ;i<ZM_AGG_POOL_SIZE; i++)
- {
- if (1 == wd->aggQPool[i]->aggQEnabled && ac == wd->aggQPool[i]->ac &&
- (wd->aggQPool[i]->size > 0))
- {
- if (0 == time || time > wd->aggQPool[i]->aggvtxq[ \
- wd->aggQPool[i]->aggHead ].arrivalTime)
- {
- tid_tx = wd->aggQPool[i];
- time = tid_tx->aggvtxq[ tid_tx->aggHead ].arrivalTime;
- }
- }
- }
-
- zmw_leave_critical_section(dev);
-
- return tid_tx;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxGetVtxq */
-/* return an MSDU */
-/* take (dev, qnum) as input, return an MSDU out of the agg queue. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* qnum: queue number */
-/* */
-/* OUTPUTS */
-/* a MSDU */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx)
-{
- zbuf_t* buf = NULL;
-
- zmw_declare_for_critical_section();
-
- if (tid_tx->aggHead != tid_tx->aggTail)
- {
- buf = tid_tx->aggvtxq[ tid_tx->aggTail ].buf;
-
- tid_tx->aggvtxq[tid_tx->aggTail].buf = NULL;
-
- zmw_enter_critical_section(dev);
- tid_tx->aggTail = ((tid_tx->aggTail + 1) & ZM_AGGQ_SIZE_MASK);
- if(tid_tx->size > 0) tid_tx->size--;
- tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail);
- if (NULL == buf) {
- //tid_tx->aggTail = tid_tx->aggHead = tid_tx->size = 0;
- //zm_msg1_agg(ZM_LV_0, "GetVtxq buf == NULL, tid_tx->size=", tid_tx->size);
- }
- zmw_leave_critical_section(dev);
- }
- else
- {
- /*
- * queue is empty
- */
- zm_msg1_agg(ZM_LV_0, "tid_tx->aggHead == tid_tx->aggTail, tid_tx->size=", tid_tx->size);
-
- }
-
- if (zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail) != tid_tx->size)
- zm_msg1_agg(ZM_LV_0, "qlen!=tid_tx->size! tid_tx->size=", tid_tx->size);
- return buf;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxDeleteQueue */
-/* return ZM_SUCCESS (can't fail) */
-/* take (dev, qnum) as input, reset (delete) this aggregate queue, */
-/* this queue is virtually returned to the aggregate queue pool. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* qnum: queue number */
-/* */
-/* OUTPUTS */
-/* ZM_SUCCESS */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum)
-{
- u16_t ac, tid;
- struct aggQueue *tx_tid;
- struct aggSta *agg_sta;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- tx_tid = wd->aggQPool[qnum];
- agg_sta = &wd->aggSta[tx_tid->aggQSTA];
- ac = tx_tid->ac;
- tid = tx_tid->tid;
-
- zmw_enter_critical_section(dev);
-
- tx_tid->aggQEnabled = 0;
- tx_tid->aggHead = tx_tid->aggTail = 0;
- tx_tid->aggReady = 0;
- tx_tid->clearFlag = tx_tid->deleteFlag = 0;
- tx_tid->size = 0;
- agg_sta->count[ac] = 0;
-
- agg_sta->tid_tx[tid] = NULL;
- agg_sta->aggFlag[ac] = 0;
-
- zmw_leave_critical_section(dev);
-
- zm_msg1_agg(ZM_LV_0, "queue deleted! qnum=", qnum);
-
- return ZM_SUCCESS;
-}
-
-#ifdef ZM_ENABLE_AGGREGATION
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen) {
- TID_BAW tid_baw;
- s16_t i;
- zbuf_t* buf;
- struct bufInfo *buf_info;
-
- zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
- tid_baw = BAW->getQ(dev, baw_seq);
- //tid_baw = NULL;
- if (NULL == tid_baw)
- return;
-
- total_mpdu += aggLen;
- for (i = aggLen - 1; i>=0; i--) {
- if (((bitmap >> i) & 0x1) == 0) {
- buf_info = BAW->pop(dev, i, tid_baw);
- buf = buf_info->buf;
- if (buf) {
- //wd->zfcbSetBawQ(dev, buf, 0);
- zfAggTidTxInsertHead(dev, buf_info, tid_baw->tid_tx);
- }
- }
- else {
- success_mpdu++;
- }
- }
- BAW->disable(dev, tid_baw);
- zfAggTxScheduler(dev);
- zm_debug_msg1("success_mpdu = ", success_mpdu);
- zm_debug_msg1(" total_mpdu = ", total_mpdu);
-}
-
-void zfBawInit(zdev_t* dev) {
- TID_BAW tid_baw;
- u16_t i,j;
- zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
-
- for (i=0; i<ZM_BAW_POOL_SIZE; i++){
- tid_baw = &BAW->tid_baw[i];
- for (j=0; j<ZM_VTXQ_SIZE; j++) {
- tid_baw->frame[j].buf = NULL;
- }
- tid_baw->enabled = tid_baw->head = tid_baw->tail = tid_baw->size = 0;
- tid_baw->start_seq = 0;
- }
- BAW->delPoint = 0;
- BAW->core = zfBawCore;
- BAW->getNewQ = zfBawGetNewQ;
- BAW->insert = zfBawInsert;
- BAW->pop = zfBawPop;
- BAW->enable = zfBawEnable;
- BAW->disable = zfBawDisable;
- BAW->getQ = zfBawGetQ;
-}
-
-
-
-TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx) {
- TID_BAW tid_baw=NULL;
- TID_BAW next_baw=NULL;
- u16_t i;
- zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
-
- /*
- for (i=0; i<ZM_BAW_POOL_SIZE; i++){
- tid_baw = &BAW->tid_baw[i];
- if (FALSE == tid_baw->enabled)
- break;
- }
- */
-
- tid_baw = &BAW->tid_baw[BAW->delPoint];
- i = BAW->delPoint;
- //if (ZM_BAW_POOL_SIZE == i) {
- //return NULL;
- // u8_t temp = BAW->delPoint;
- // tid_baw = &BAW->tid_baw[BAW->delPoint];
- // BAW->disable(dev, tid_baw);
- // BAW->delPoint = (BAW->delPoint < (ZM_BAW_POOL_SIZE - 1))? (BAW->delPoint + 1): 0;
- // temp = BAW->delPoint;
- //}
-
- zm_msg1_agg(ZM_LV_0, "get new tid_baw, index=", i);
- BAW->delPoint = (i < (ZM_BAW_POOL_SIZE -1))? (i + 1): 0;
- next_baw = &BAW->tid_baw[BAW->delPoint];
- if (1 == next_baw->enabled) BAW->disable(dev, next_baw);
-
- BAW->enable(dev, tid_baw, start_seq);
- tid_baw->tid_tx = tid_tx;
-
- return tid_baw;
-}
-
-u16_t zfBawInsert(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r) {
- //TID_BAW tid_baw;
- //u16_t bufLen;
-
- //zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
-
- if(tid_baw->size < (ZM_VTXQ_SIZE - 1)) {
- struct baw_header *baw_header = &tid_baw->frame[tid_baw->head].baw_header;
-
- baw_header->headerLen = header_r->headerLen;
- baw_header->micLen = header_r->micLen;
- baw_header->snapLen = header_r->snapLen;
- baw_header->removeLen = header_r->removeLen;
- baw_header->keyIdx = header_r->keyIdx;
- zfwMemoryCopy((u8_t *)baw_header->header, (u8_t *)header_r->header, 58);
- zfwMemoryCopy((u8_t *)baw_header->mic , (u8_t *)header_r->mic , 8);
- zfwMemoryCopy((u8_t *)baw_header->snap , (u8_t *)header_r->snap , 8);
- //wd->zfcbSetBawQ(dev, buf, 1);
- tid_baw->frame[tid_baw->head].buf = buf;
- tid_baw->frame[tid_baw->head].baw_seq = baw_seq;
- tid_baw->frame[tid_baw->head].baw_retransmit = baw_retransmit + 1;
-
- //tid_baw->frame[tid_baw->head].data = pBuf->data;
- tid_baw->head++;
- tid_baw->size++;
- }
- else {
- //wd->zfcbSetBawQ(dev, buf, 0);
- zfwBufFree(dev, buf, ZM_SUCCESS);
- return FALSE;
- }
- return TRUE;
-}
-
-struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw) {
- //TID_BAW tid_baw;
- //zbuf_t* buf;
- struct bufInfo *buf_info;
- zmw_get_wlan_dev(dev);
-
- buf_info = &wd->buf_info;
- buf_info->baw_header = NULL;
-
- if (NULL == (buf_info->buf = tid_baw->frame[index].buf))
- return buf_info;
-
- buf_info->baw_retransmit = tid_baw->frame[index].baw_retransmit;
- buf_info->baw_header = &tid_baw->frame[index].baw_header;
- buf_info->timestamp = tid_baw->frame[index].timestamp;
- //pBuf->data = pBuf->buffer;
- //wd->zfcbRestoreBufData(dev, buf);
- tid_baw->frame[index].buf = NULL;
-
- return buf_info;
-}
-
-void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq) {
- //TID_BAW tid_baw;
-
- //zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
-
- tid_baw->enabled = TRUE;
- tid_baw->head = tid_baw->tail = tid_baw->size = 0;
- tid_baw->start_seq = start_seq;
-}
-
-void zfBawDisable(zdev_t* dev, TID_BAW tid_baw) {
- //TID_BAW tid_baw;
- u16_t i;
-
- //zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
- for (i=0; i<ZM_VTXQ_SIZE; i++) {
- if (tid_baw->frame[i].buf) {
-
- //wd->zfcbSetBawQ(dev, tid_baw->frame[i].buf, 0);
- zfwBufFree(dev, tid_baw->frame[i].buf, ZM_SUCCESS);
- tid_baw->frame[i].buf = NULL;
- }
- }
-
- tid_baw->enabled = FALSE;
-}
-
-TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq) {
- TID_BAW tid_baw=NULL;
- u16_t i;
-
- zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
- for (i=0; i<ZM_BAW_POOL_SIZE; i++){
- tid_baw = &BAW->tid_baw[i];
- if (TRUE == tid_baw->enabled)
- {
- zm_msg1_agg(ZM_LV_0, "get an old tid_baw, baw_seq=", baw_seq);
- zm_msg1_agg(ZM_LV_0, "check a tid_baw->start_seq=", tid_baw->start_seq);
- if(baw_seq == tid_baw->start_seq)
- break;
- }
-
- }
- if (ZM_BAW_POOL_SIZE == i)
- return NULL;
- return tid_baw;
-}
-#endif //disable BAW
-#endif
-
-u16_t zfAggTallyReset(zdev_t* dev)
-{
- struct aggTally* agg_tal;
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- agg_tal = &wd->agg_tal;
- agg_tal->got_packets_sum = 0;
- agg_tal->got_bytes_sum = 0;
- agg_tal->sent_bytes_sum = 0;
- agg_tal->sent_packets_sum = 0;
- agg_tal->avg_got_packets = 0;
- agg_tal->avg_got_bytes = 0;
- agg_tal->avg_sent_packets = 0;
- agg_tal->avg_sent_bytes = 0;
- agg_tal->time = 0;
- return 0;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggScanAndClear */
-/* If the packets in a queue have waited for too long, clear and */
-/* delete this aggregation queue. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* time : current time */
-/* */
-/* OUTPUTS */
-/* ZM_SUCCESS */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggScanAndClear(zdev_t* dev, u32_t time)
-{
- u16_t i;
- u16_t head;
- u16_t tail;
- u32_t tick;
- u32_t arrivalTime;
- //u16_t aid, ac;
- TID_TX tid_tx;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if(!(wd->state == ZM_WLAN_STATE_ENABLED)) return 0;
- zfAggTxScheduler(dev, 1);
- tick = zm_agg_GetTime();
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- if (!wd->aggQPool[i]) return 0;
- if (1 == wd->aggQPool[i]->aggQEnabled)
- {
- tid_tx = wd->aggQPool[i];
- zmw_enter_critical_section(dev);
-
- head = tid_tx->aggHead;
- tail = tid_tx->aggTail;
-
- arrivalTime = (u32_t)tid_tx->aggvtxq[tid_tx->aggTail].arrivalTime;
-
-
- if((tick - arrivalTime) <= ZM_AGG_CLEAR_TIME)
- {
-
- }
- else if((tid_tx->size = zm_agg_qlen(dev, tid_tx->aggHead, tid_tx->aggTail)) > 0)
- {
-
- tid_tx->clearFlag = 1;
-
- //zm_msg1_agg(ZM_LV_0, "clear queue tick =", tick);
- //zm_msg1_agg(ZM_LV_0, "clear queue arrival =", arrivalTime);
-
-
- //zmw_leave_critical_section(dev);
- //zfAggTxScheduler(dev);
- //zmw_enter_critical_section(dev);
-
- }
-
- if (tid_tx->size == 0)
- {
- /*
- * queue empty
- */
- if (tick - tid_tx->lastArrival > ZM_AGG_DELETE_TIME)
- {
- zm_msg1_agg(ZM_LV_0, "delete queue, idle for n sec. n = ", \
- ZM_AGG_DELETE_TIME/10);
-
- zmw_leave_critical_section(dev);
- zfAggTxDeleteQueue(dev, i);
- zmw_enter_critical_section(dev);
- }
- }
-
- zmw_leave_critical_section(dev);
- }
- }
-
- zfAggRxClear(dev, time);
-
-#ifdef ZM_AGG_TALLY
- if((wd->tick % 100) == 0) {
- zfAggPrintTally(dev);
- }
-#endif
-
- return ZM_SUCCESS;
-}
-
-u16_t zfAggPrintTally(zdev_t* dev)
-{
- struct aggTally* agg_tal;
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- agg_tal = &wd->agg_tal;
-
- if(agg_tal->got_packets_sum < 10)
- {
- zfAggTallyReset(dev);
- return 0;
- }
-
- agg_tal->time++;
- agg_tal->avg_got_packets = (agg_tal->avg_got_packets * (agg_tal->time - 1) +
- agg_tal->got_packets_sum) / agg_tal->time;
- agg_tal->avg_got_bytes = (agg_tal->avg_got_bytes * (agg_tal->time - 1) +
- agg_tal->got_bytes_sum) / agg_tal->time;
- agg_tal->avg_sent_packets = (agg_tal->avg_sent_packets * (agg_tal->time - 1)
- + agg_tal->sent_packets_sum) / agg_tal->time;
- agg_tal->avg_sent_bytes = (agg_tal->avg_sent_bytes * (agg_tal->time - 1) +
- agg_tal->sent_bytes_sum) / agg_tal->time;
- zm_msg1_agg(ZM_LV_0, "got_packets_sum =", agg_tal->got_packets_sum);
- zm_msg1_agg(ZM_LV_0, " got_bytes_sum =", agg_tal->got_bytes_sum);
- zm_msg1_agg(ZM_LV_0, "sent_packets_sum=", agg_tal->sent_packets_sum);
- zm_msg1_agg(ZM_LV_0, " sent_bytes_sum =", agg_tal->sent_bytes_sum);
- agg_tal->got_packets_sum = agg_tal->got_bytes_sum =agg_tal->sent_packets_sum
- = agg_tal->sent_bytes_sum = 0;
- zm_msg1_agg(ZM_LV_0, "avg_got_packets =", agg_tal->avg_got_packets);
- zm_msg1_agg(ZM_LV_0, " avg_got_bytes =", agg_tal->avg_got_bytes);
- zm_msg1_agg(ZM_LV_0, "avg_sent_packets=", agg_tal->avg_sent_packets);
- zm_msg1_agg(ZM_LV_0, " avg_sent_bytes =", agg_tal->avg_sent_bytes);
- if ((wd->commTally.BA_Fail == 0) || (wd->commTally.Hw_Tx_MPDU == 0))
- {
- zm_msg1_agg(ZM_LV_0, "Hardware Tx MPDU=", wd->commTally.Hw_Tx_MPDU);
- zm_msg1_agg(ZM_LV_0, " BA Fail number=", wd->commTally.BA_Fail);
- }
- else
- zm_msg1_agg(ZM_LV_0, "1/(BA fail rate)=", wd->commTally.Hw_Tx_MPDU/wd->commTally.BA_Fail);
-
- return 0;
-}
-
-u16_t zfAggRxClear(zdev_t* dev, u32_t time)
-{
- u16_t i;
- struct agg_tid_rx *tid_rx;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- zmw_enter_critical_section(dev);
- tid_rx = wd->tid_rx[i];
- if (tid_rx->baw_head != tid_rx->baw_tail)
- {
- u16_t j = tid_rx->baw_tail;
- while ((j != tid_rx->baw_head) && !tid_rx->frame[j].buf) {
- j = (j + 1) & ZM_AGG_BAW_MASK;
- }
- if ((j != tid_rx->baw_head) && (time - tid_rx->frame[j].arrivalTime) >
- (ZM_AGG_CLEAR_TIME - 5))
- {
- zmw_leave_critical_section(dev);
- zm_msg0_agg(ZM_LV_1, "queue RxFlush by RxClear");
- zfAggRxFlush(dev, 0, tid_rx);
- zmw_enter_critical_section(dev);
- }
- }
- zmw_leave_critical_section(dev);
- }
-
- return ZM_SUCCESS;
-}
-
-struct agg_tid_rx* zfAggRxEnabled(zdev_t* dev, zbuf_t* buf)
-{
- u16_t dst0, src[3], aid;
- u16_t offset = 0;
- u16_t seq_no;
- u16_t frameType;
- u16_t frameCtrl;
- u16_t frameSubtype;
- //struct aggSta *agg_sta;
-#if ZM_AGG_FPGA_REORDERING
- struct agg_tid_rx *tid_rx;
-#endif
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
- seq_no = zmw_rx_buf_readh(dev, buf, 22) >> 4;
- //DbgPrint("Rx seq=%d\n", seq_no);
- if (wd->sta.EnableHT == 0)
- {
- return NULL;
- }
-
- frameCtrl = zmw_rx_buf_readb(dev, buf, 0);
- frameType = frameCtrl & 0xf;
- frameSubtype = frameCtrl & 0xf0;
-
-
- if (frameType != ZM_WLAN_DATA_FRAME) //non-Qos Data? (frameSubtype&0x80)
- {
- return NULL;
- }
-#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
- {
- u32_t tcp_seq;
-
- tcp_seq = zmw_rx_buf_readb(dev, buf, 22+36) << 24;
- tcp_seq += zmw_rx_buf_readb(dev, buf, 22+37) << 16;
- tcp_seq += zmw_rx_buf_readb(dev, buf, 22+38) << 8;
- tcp_seq += zmw_rx_buf_readb(dev, buf, 22+39);
- ZM_SEQ_DEBUG("In %5d, %12u\n", seq_no, tcp_seq);
- }
-#endif
-
- dst0 = zmw_rx_buf_readh(dev, buf, offset+4);
-
- src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
- src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
- src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
-
-#if ZM_AGG_FPGA_DEBUG
- aid = 0;
-#else
- aid = zfApFindSta(dev, src);
-#endif
-
- //agg_sta = &wd->aggSta[aid];
- //zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
- //ac = zcUpToAc[up&0x7] & 0x3;
-
- /*
- * Filter unicast frame only, aid == 0 is for debug only
- */
- if ((dst0 & 0x1) == 0 && aid == 0)
- {
-#if ZM_AGG_FPGA_REORDERING
- tid_rx = zfAggRxGetQueue(dev, buf) ;
- if(!tid_rx)
- return NULL;
- else
- {
- //if (tid_rx->addBaExchangeStatusCode == ZM_AGG_ADDBA_RESPONSE)
- return tid_rx;
- }
-#else
- return NULL;
-#endif
- }
-
- return NULL;
-}
-
-u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx)
-{
- u16_t seq_no;
- s16_t index;
- u16_t offset = 0;
- zbuf_t* pbuf;
- u8_t frameSubType;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- ZM_BUFFER_TRACE(dev, buf)
-
- ZM_PERFORMANCE_RX_REORDER(dev);
-
- seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
-
- index = seq_no - tid_rx->seq_start;
- /*
- * for debug
- */
-
- /* zm_msg2_agg(ZM_LV_0, "queue seq = ", seq_no);
- * DbgPrint("%s:%s%lxh %s%lxh\n", __func__, "queue seq=", seq_no,
- * "; seq_start=", tid_rx->seq_start);
- */
-
- //DbgPrint("seq_no=%d, seq_start=%d\n", seq_no, tid_rx->seq_start);
-
- /* In some APs, we found that it might transmit NULL data whose sequence number
- is out or order. In order to avoid this problem, we ignore these NULL data.
- */
-
- frameSubType = (zmw_rx_buf_readh(dev, buf, 0) & 0xF0) >> 4;
-
- /* If this is a NULL data instead of Qos NULL data */
- if ((frameSubType & 0x0C) == 0x04)
- {
- s16_t seq_diff;
-
- seq_diff = (seq_no > tid_rx->seq_start) ?
- seq_no - tid_rx->seq_start : tid_rx->seq_start - seq_no;
-
- if (seq_diff > ZM_AGG_BAW_SIZE)
- {
- zm_debug_msg0("Free Rx NULL data in zfAggRx");
-
- /* Free Rx buffer */
- zfwBufFree(dev, buf, 0);
- return ZM_ERR_OUT_OF_ORDER_NULL_DATA;
- }
- }
-
- /*
- * sequence number wrap at 4k
- */
- if (tid_rx->seq_start > seq_no)
- {
- //index += 4096;
-
- zmw_enter_critical_section(dev);
- if (tid_rx->seq_start >= 4096) {
- tid_rx->seq_start = 0;
- }
- zmw_leave_critical_section(dev);
-
- }
-
- if (tid_rx->seq_start == seq_no) {
- zmw_enter_critical_section(dev);
- if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) > 0) {
- //DbgPrint("head=%d, tail=%d", tid_rx->baw_head, tid_rx->baw_tail);
- tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
- }
- tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1);
- zmw_leave_critical_section(dev);
-
- ZM_PERFORMANCE_RX_SEQ(dev, buf);
-
- if (wd->zfcbRecv80211 != NULL) {
- //seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
- //DbgPrint("Recv indicate seq=%d\n", seq_no);
- //DbgPrint("1. seq=%d\n", seq_no);
-
- wd->zfcbRecv80211(dev, buf, addInfo);
- }
- else {
- zfiRecv80211(dev, buf, addInfo);
- }
- }
- else if (!zfAggRxEnqueue(dev, buf, tid_rx, addInfo))
- {
- /*
- * duplicated packet
- */
- return 1;
- }
-
- while (tid_rx->baw_head != tid_rx->baw_tail) {// && tid_rx->frame[tid_rx->baw_tail].buf)
- u16_t tailIndex;
-
- zmw_enter_critical_section(dev);
-
- tailIndex = tid_rx->baw_tail;
- pbuf = tid_rx->frame[tailIndex].buf;
- tid_rx->frame[tailIndex].buf = 0;
- if (!pbuf)
- {
- zmw_leave_critical_section(dev);
- break;
- }
-
- tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
- tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1);
-
-
- //if(pbuf && tid_rx->baw_size > 0)
- // tid_rx->baw_size--;
-
- zmw_leave_critical_section(dev);
-
- ZM_PERFORMANCE_RX_SEQ(dev, pbuf);
-
- if (wd->zfcbRecv80211 != NULL)
- {
- //seq_no = zmw_rx_buf_readh(dev, pbuf, offset+22) >> 4;
- //DbgPrint("Recv indicate seq=%d\n", seq_no);
- //DbgPrint("1. seq=%d\n", seq_no);
- wd->zfcbRecv80211(dev, pbuf, addInfo);
- }
- else
- {
- //seq_no = zmw_rx_buf_readh(dev, pbuf, offset+22) >> 4;
- //DbgPrint("Recv indicate seq=%d\n", seq_no);
- zfiRecv80211(dev, pbuf, addInfo);
- }
- }
-
- return 1;
-}
-
-struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf)
-{
- u16_t src[3];
- u16_t aid, ac, i;
- u16_t offset = 0;
- struct agg_tid_rx *tid_rx = NULL;
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
- src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
- src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
- aid = zfApFindSta(dev, src);
-
- ac = (zmw_rx_buf_readh(dev, buf, 24) & 0xF);
-
- // mark by spin lock debug
- //zmw_enter_critical_section(dev);
-
- for (i=0; i<ZM_AGG_POOL_SIZE ; i++)
- {
- if((wd->tid_rx[i]->aid == aid) && (wd->tid_rx[i]->ac == ac))
- {
- tid_rx = wd->tid_rx[i];
- break;
- }
- }
-
- // mark by spin lock debug
- //zmw_leave_critical_section(dev);
- return tid_rx;
-}
-
-
-u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo)
-{
- u16_t seq_no, offset = 0;
- u16_t q_index;
- s16_t index;
- u8_t bdropframe = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- ZM_BUFFER_TRACE(dev, buf)
-
- seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
- index = seq_no - tid_rx->seq_start;
-
- /*
- * sequence number wrap at 4k
- * -1000: check for duplicate past packet
- */
- bdropframe = 0;
- if (tid_rx->seq_start > seq_no) {
- if ((tid_rx->seq_start > 3967) && (seq_no < 128)) {
- index += 4096;
- } else if (tid_rx->seq_start - seq_no > 70) {
- zmw_enter_critical_section(dev);
- tid_rx->sq_behind_count++;
- if (tid_rx->sq_behind_count > 3) {
- tid_rx->sq_behind_count = 0;
- } else {
- bdropframe = 1;
- }
- zmw_leave_critical_section(dev);
- } else {
- bdropframe = 1;
- }
- } else {
- if (seq_no - tid_rx->seq_start > 70) {
- zmw_enter_critical_section(dev);
- tid_rx->sq_exceed_count++;
- if (tid_rx->sq_exceed_count > 3) {
- tid_rx->sq_exceed_count = 0;
- } else {
- bdropframe = 1;
- }
- zmw_leave_critical_section(dev);
- }
- }
-
- if (bdropframe == 1) {
- /*if (wd->zfcbRecv80211 != NULL) {
- wd->zfcbRecv80211(dev, buf, addInfo);
- }
- else {
- zfiRecv80211(dev, buf, addInfo);
- }*/
-
- ZM_PERFORMANCE_FREE(dev, buf);
-
- zfwBufFree(dev, buf, 0);
- /*zfAggRxFlush(dev, seq_no, tid_rx);
- tid_rx->seq_start = seq_no;
- index = seq_no - tid_rx->seq_start;
- */
-
- //DbgPrint("Free an old packet, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
-
- /*
- * duplicate past packet
- * happens only in simulated aggregation environment
- */
- return 0;
- } else {
- zmw_enter_critical_section(dev);
- if (tid_rx->sq_exceed_count > 0){
- tid_rx->sq_exceed_count--;
- }
-
- if (tid_rx->sq_behind_count > 0) {
- tid_rx->sq_behind_count--;
- }
- zmw_leave_critical_section(dev);
- }
-
- if (index < 0) {
- zfAggRxFlush(dev, seq_no, tid_rx);
- tid_rx->seq_start = seq_no;
- index = 0;
- }
-
- //if (index >= (ZM_AGG_BAW_SIZE - 1))
- if (index >= (ZM_AGG_BAW_MASK))
- {
- /*
- * queue full
- */
- //DbgPrint("index >= 64, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
- zfAggRxFlush(dev, seq_no, tid_rx);
- //tid_rx->seq_start = seq_no;
- index = seq_no - tid_rx->seq_start;
- if ((tid_rx->seq_start > seq_no) && (tid_rx->seq_start > 1000) && (tid_rx->seq_start - 1000) > seq_no)
- {
- //index = seq_no - tid_rx->seq_start;
- index += 4096;
- }
- //index = seq_no - tid_rx->seq_start;
- while (index >= (ZM_AGG_BAW_MASK)) {
- //DbgPrint("index >= 64, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
- tid_rx->seq_start = (tid_rx->seq_start + ZM_AGG_BAW_MASK) & (4096 - 1);
- index = seq_no - tid_rx->seq_start;
- if ((tid_rx->seq_start > seq_no) && (tid_rx->seq_start > 1000) && (tid_rx->seq_start - 1000) > seq_no)
- {
- index += 4096;
- }
- }
- }
-
-
- q_index = (tid_rx->baw_tail + index) & ZM_AGG_BAW_MASK;
- if (tid_rx->frame[q_index].buf && (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) >
- (((q_index) - tid_rx->baw_tail) & ZM_AGG_BAW_MASK)))
- {
-
- ZM_PERFORMANCE_DUP(dev, tid_rx->frame[q_index].buf, buf);
- zfwBufFree(dev, buf, 0);
- //DbgPrint("Free a duplicate packet, seq_start=%d, seq_no=%d\n", tid_rx->seq_start, seq_no);
- //DbgPrint("head=%d, tail=%d", tid_rx->baw_head, tid_rx->baw_tail);
- /*
- * duplicate packet
- */
- return 0;
- }
-
- zmw_enter_critical_section(dev);
- if(tid_rx->frame[q_index].buf) {
- zfwBufFree(dev, tid_rx->frame[q_index].buf, 0);
- tid_rx->frame[q_index].buf = 0;
- }
-
- tid_rx->frame[q_index].buf = buf;
- tid_rx->frame[q_index].arrivalTime = zm_agg_GetTime();
- zfwMemoryCopy((void*)&tid_rx->frame[q_index].addInfo, (void*)addInfo, sizeof(struct zsAdditionInfo));
-
- /*
- * for debug simulated aggregation only,
- * should be done in rx of ADDBA Request
- */
- //tid_rx->addInfo = addInfo;
-
-
- if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) <= index)
- {
- //tid_rx->baw_size = index + 1;
- if (((tid_rx->baw_head - tid_rx->baw_tail) & ZM_AGG_BAW_MASK) <=
- //((q_index + 1) & ZM_AGG_BAW_MASK))
- (((q_index) - tid_rx->baw_tail) & ZM_AGG_BAW_MASK))//tid_rx->baw_size )
- tid_rx->baw_head = (q_index + 1) & ZM_AGG_BAW_MASK;
- }
- zmw_leave_critical_section(dev);
-
- /*
- * success
- */
- //DbgPrint("head=%d, tail=%d, start=%d", tid_rx->baw_head, tid_rx->baw_tail, tid_rx->seq_start);
- return 1;
-}
-
-u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx)
-{
- zbuf_t* pbuf;
- u16_t seq;
- struct zsAdditionInfo addInfo;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- ZM_PERFORMANCE_RX_FLUSH(dev);
-
- while (1)
- {
- zmw_enter_critical_section(dev);
- if (tid_rx->baw_tail == tid_rx->baw_head) {
- zmw_leave_critical_section(dev);
- break;
- }
-
- pbuf = tid_rx->frame[tid_rx->baw_tail].buf;
- zfwMemoryCopy((void*)&addInfo, (void*)&tid_rx->frame[tid_rx->baw_tail].addInfo, sizeof(struct zsAdditionInfo));
- tid_rx->frame[tid_rx->baw_tail].buf = 0;
- //if(pbuf && tid_rx->baw_size > 0) tid_rx->baw_size--;
- tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
- tid_rx->seq_start = (tid_rx->seq_start + 1) & (4096 - 1);
- zmw_leave_critical_section(dev);
-
- if (pbuf)
- {
-
- ZM_PERFORMANCE_RX_SEQ(dev, pbuf);
-
- if (wd->zfcbRecv80211 != NULL)
- {
- seq = zmw_rx_buf_readh(dev, pbuf, 22) >> 4;
- //DbgPrint("Recv indicate seq=%d\n", seq);
- //DbgPrint("2. seq=%d\n", seq);
- wd->zfcbRecv80211(dev, pbuf, &addInfo);
- }
- else
- {
- seq = zmw_rx_buf_readh(dev, pbuf, 22) >> 4;
- //DbgPrint("Recv indicate seq=%d\n", seq);
- zfiRecv80211(dev, pbuf, &addInfo);
- }
- }
- }
-
- zmw_enter_critical_section(dev);
- tid_rx->baw_head = tid_rx->baw_tail = 0;
- zmw_leave_critical_section(dev);
- return 1;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggRxFreeBuf */
-/* Frees all queued packets in buffer when the driver is down. */
-/* The zfFreeResource() will check if the buffer is all freed. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* ZM_SUCCESS */
-/* */
-/* AUTHOR */
-/* Honda Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy)
-{
- u16_t i;
- zbuf_t* buf;
- struct agg_tid_rx *tid_rx;
-
- TID_TX tid_tx;
- //struct bufInfo *buf_info;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- u16_t j;
-
- tid_rx = wd->tid_rx[i];
-
- for(j=0; j <= ZM_AGG_BAW_SIZE; j++)
- {
- zmw_enter_critical_section(dev);
- buf = tid_rx->frame[j].buf;
- tid_rx->frame[j].buf = 0;
- zmw_leave_critical_section(dev);
-
- if (buf)
- {
- zfwBufFree(dev, buf, 0);
- }
- }
-
- #if 0
- if ( tid_rx->baw_head != tid_rx->baw_tail )
- {
- while (tid_rx->baw_head != tid_rx->baw_tail)
- {
- buf = tid_rx->frame[tid_rx->baw_tail].buf;
- tid_rx->frame[tid_rx->baw_tail].buf = 0;
- if (buf)
- {
- zfwBufFree(dev, buf, 0);
-
- zmw_enter_critical_section(dev);
- tid_rx->frame[tid_rx->baw_tail].buf = 0;
- zmw_leave_critical_section(dev);
- }
- zmw_enter_critical_section(dev);
- //if (tid_rx->baw_size > 0)tid_rx->baw_size--;
- tid_rx->baw_tail = (tid_rx->baw_tail + 1) & ZM_AGG_BAW_MASK;
- tid_rx->seq_start++;
- zmw_leave_critical_section(dev);
- }
- }
- #endif
-
- zmw_enter_critical_section(dev);
- tid_rx->seq_start = 0;
- tid_rx->baw_head = tid_rx->baw_tail = 0;
- tid_rx->aid = ZM_MAX_STA_SUPPORT;
- zmw_leave_critical_section(dev);
-
- #ifdef ZM_ENABLE_AGGREGATION
- #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
- if (tid_baw->enabled) {
- zm_msg1_agg(ZM_LV_0, "Device down, clear BAW queue:", i);
- BAW->disable(dev, tid_baw);
- }
- #endif
- #endif
- if (1 == wd->aggQPool[i]->aggQEnabled) {
- tid_tx = wd->aggQPool[i];
- buf = zfAggTxGetVtxq(dev, tid_tx);
- while (buf) {
- zfwBufFree(dev, buf, 0);
- buf = zfAggTxGetVtxq(dev, tid_tx);
- }
- }
-
- if(destroy) {
- zfwMemFree(dev, wd->aggQPool[i], sizeof(struct aggQueue));
- zfwMemFree(dev, wd->tid_rx[i], sizeof(struct agg_tid_rx));
- }
- }
- #ifdef ZM_ENABLE_AGGREGATION
- #ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
- if(destroy) zfwMemFree(dev, BAW, sizeof(struct baw_enabler));
- #endif
- #endif
- return ZM_SUCCESS;
-}
-
-
-void zfAggRecvBAR(zdev_t* dev, zbuf_t *buf) {
- u16_t start_seq, len;
- u8_t i, bitmap[8];
- len = zfwBufGetSize(dev, buf);
- start_seq = zmw_rx_buf_readh(dev, buf, len-2);
- DbgPrint("Received a BAR Control frame, start_seq=%d", start_seq>>4);
- /* todo: set the bitmap by reordering buffer! */
- for (i=0; i<8; i++) bitmap[i]=0;
- zfSendBA(dev, start_seq, bitmap);
-}
-
-#ifdef ZM_ENABLE_AGGREGATION
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx) {
- u16_t removeLen;
- u16_t err;
-
- zmw_get_wlan_dev(dev);
- if (aggControl && (ZM_AGG_FIRST_MPDU == aggControl->ampduIndication) ) {
- tid_tx->bar_ssn = buf_info->baw_header->header[15];
- aggControl->tid_baw->start_seq = tid_tx->bar_ssn >> 4;
- zm_msg1_agg(ZM_LV_0, "start seq=", tid_tx->bar_ssn >> 4);
- }
- buf_info->baw_header->header[4] |= (1 << 11);
- if (aggControl && aggControl->aggEnabled) {
- //if (wd->enableAggregation==0 && !(buf_info->baw_header->header[6]&0x1))
- //{
- //if (((buf_info->baw_header->header[2] & 0x3) == 2))
- //{
- /* Enable aggregation */
- buf_info->baw_header->header[1] |= 0x20;
- if (ZM_AGG_LAST_MPDU == aggControl->ampduIndication) {
- buf_info->baw_header->header[1] |= 0x4000;
- }
- else {
- buf_info->baw_header->header[1] &= ~0x4000;
- //zm_debug_msg0("ZM_AGG_LAST_MPDU");
- }
- //}
- //else {
- // zm_debug_msg1("no aggr, header[2]&0x3 = ",buf_info->baw_header->header[2] & 0x3)
- // aggControl->aggEnabled = 0;
- //}
- //}
- //else {
- // zm_debug_msg1("no aggr, wd->enableAggregation = ", wd->enableAggregation);
- // zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(buf_info->baw_header->header[6]&0x1));
- // aggControl->aggEnabled = 0;
- //}
- }
-
- /*if (aggControl->tid_baw) {
- struct baw_header_r header_r;
-
- header_r.header = buf_info->baw_header->header;
- header_r.mic = buf_info->baw_header->mic;
- header_r.snap = buf_info->baw_header->snap;
- header_r.headerLen = buf_info->baw_header->headerLen;
- header_r.micLen = buf_info->baw_header->micLen;
- header_r.snapLen = buf_info->baw_header->snapLen;
- header_r.removeLen = buf_info->baw_header->removeLen;
- header_r.keyIdx = buf_info->baw_header->keyIdx;
-
- BAW->insert(dev, buf_info->buf, tid_tx->bar_ssn >> 4, aggControl->tid_baw, buf_info->baw_retransmit, &header_r);
- }*/
-
- err = zfHpSend(dev,
- buf_info->baw_header->header,
- buf_info->baw_header->headerLen,
- buf_info->baw_header->snap,
- buf_info->baw_header->snapLen,
- buf_info->baw_header->mic,
- buf_info->baw_header->micLen,
- buf_info->buf,
- buf_info->baw_header->removeLen,
- ZM_EXTERNAL_ALLOC_BUF,
- (u8_t)tid_tx->ac,
- buf_info->baw_header->keyIdx);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
-
- return;
-
-zlError:
- zfwBufFree(dev, buf_info->buf, 0);
- return;
-
-}
-#endif //disable BAW
-#endif
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAggTxSendEth */
-/* Called to transmit Ethernet frame from upper elayer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer pointer */
-/* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */
-/* */
-/* OUTPUTS */
-/* error code */
-/* */
-/* AUTHOR */
-/* Stephen, Honda Atheros Communications, Inc. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfAggTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u8_t flag, struct aggControl *aggControl, TID_TX tid_tx)
-{
- u16_t err;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- u16_t removeLen;
- u16_t header[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
- u16_t headerLen;
- u16_t mic[8/2];
- u16_t micLen;
- u16_t snap[8/2];
- u16_t snapLen;
- u16_t fragLen;
- u16_t frameLen;
- u16_t fragNum;
- struct zsFrag frag;
- u16_t i, id;
- u16_t da[3];
- u16_t sa[3];
- u8_t up;
- u8_t qosType, keyIdx = 0;
- u16_t fragOff;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zm_msg1_tx(ZM_LV_2, "zfTxSendEth(), port=", port);
-
- /* Get IP TOS for QoS AC and IP frag offset */
- zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
-
-#ifdef ZM_ENABLE_NATIVE_WIFI
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 16);
- da[1] = zmw_tx_buf_readh(dev, buf, 18);
- da[2] = zmw_tx_buf_readh(dev, buf, 20);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 10);
- sa[1] = zmw_tx_buf_readh(dev, buf, 12);
- sa[2] = zmw_tx_buf_readh(dev, buf, 14);
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 4);
- da[1] = zmw_tx_buf_readh(dev, buf, 6);
- da[2] = zmw_tx_buf_readh(dev, buf, 8);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 10);
- sa[1] = zmw_tx_buf_readh(dev, buf, 12);
- sa[2] = zmw_tx_buf_readh(dev, buf, 14);
- }
- else if ( wd->wlanMode == ZM_MODE_AP )
- {
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 4);
- da[1] = zmw_tx_buf_readh(dev, buf, 6);
- da[2] = zmw_tx_buf_readh(dev, buf, 8);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 16);
- sa[1] = zmw_tx_buf_readh(dev, buf, 18);
- sa[2] = zmw_tx_buf_readh(dev, buf, 20);
- }
- else
- {
- //
- }
-#else
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 0);
- da[1] = zmw_tx_buf_readh(dev, buf, 2);
- da[2] = zmw_tx_buf_readh(dev, buf, 4);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 6);
- sa[1] = zmw_tx_buf_readh(dev, buf, 8);
- sa[2] = zmw_tx_buf_readh(dev, buf, 10);
-#endif
- //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m)
- if (wd->wlanMode == ZM_MODE_AP)
- {
- keyIdx = wd->ap.bcHalKeyIdx[port];
- id = zfApFindSta(dev, da);
- if (id != 0xffff)
- {
- switch (wd->ap.staTable[id].encryMode)
- {
- case ZM_AES:
- case ZM_TKIP:
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
-#endif //ZM_ENABLE_CENC
- keyIdx = wd->ap.staTable[id].keyIdx;
- break;
- }
- }
- }
- else
- {
- switch (wd->sta.encryMode)
- {
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
- keyIdx = wd->sta.keyId;
- break;
- case ZM_AES:
- case ZM_TKIP:
- if ((da[0]& 0x1))
- keyIdx = 5;
- else
- keyIdx = 4;
- break;
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
- keyIdx = wd->sta.cencKeyId;
- break;
-#endif //ZM_ENABLE_CENC
- }
- }
-
- /* Create SNAP */
- removeLen = zfTxGenWlanSnap(dev, buf, snap, &snapLen);
- //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff);
-
- fragLen = wd->fragThreshold;
- frameLen = zfwBufGetSize(dev, buf);
- frameLen -= removeLen;
-
-#if 0
- /* Create MIC */
- if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&
- (wd->sta.encryMode == ZM_TKIP) )
- {
- if ( frameLen > fragLen )
- {
- micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic);
- }
- else
- {
- /* append MIC by HMAC */
- micLen = 8;
- }
- }
- else
- {
- micLen = 0;
- }
-#else
- if ( frameLen > fragLen )
- {
- micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic);
- }
- else
- {
- /* append MIC by HMAC */
- micLen = 0;
- }
-#endif
-
- /* Access Category */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- zfApGetStaQosType(dev, da, &qosType);
- if (qosType == 0)
- {
- up = 0;
- }
- }
- else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- if (wd->sta.wmeConnected == 0)
- {
- up = 0;
- }
- }
- else
- {
- /* TODO : STA QoS control field */
- up = 0;
- }
-
- /* Assign sequence number */
- zmw_enter_critical_section(dev);
- frag.seq[0] = ((wd->seq[zcUpToAc[up&0x7]]++) << 4);
- if (aggControl && (ZM_AGG_FIRST_MPDU == aggControl->ampduIndication) ) {
- tid_tx->bar_ssn = frag.seq[0];
-
- zm_msg1_agg(ZM_LV_0, "start seq=", tid_tx->bar_ssn >> 4);
- }
- //tid_tx->baw_buf[tid_tx->baw_head-1].baw_seq=frag.seq[0];
- zmw_leave_critical_section(dev);
-
-
- frag.buf[0] = buf;
- frag.bufType[0] = bufType;
- frag.flag[0] = flag;
- fragNum = 1;
-
- for (i=0; i<fragNum; i++)
- {
- /* Create WLAN header(Control Setting + 802.11 header + IV) */
- if (up !=0 ) zm_debug_msg1("up not 0, up=",up);
- headerLen = zfTxGenWlanHeader(dev, frag.buf[i], header, frag.seq[i],
- frag.flag[i], snapLen+micLen, removeLen,
- port, da, sa, up, &micLen, snap, snapLen,
- aggControl);
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, frag.buf[i], &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, frag.buf[i], &addrTbl)) == 0)
- //{
- // err = ZM_ERR_BUFFER_DMA_ADDR;
- // goto zlError;
- //}
-
- /* Flush buffer on cache */
- //zfwBufFlush(dev, frag.buf[i]);
-
-#if 0
- zm_msg1_tx(ZM_LV_0, "headerLen=", headerLen);
- zm_msg1_tx(ZM_LV_0, "snapLen=", snapLen);
- zm_msg1_tx(ZM_LV_0, "micLen=", micLen);
- zm_msg1_tx(ZM_LV_0, "removeLen=", removeLen);
- zm_msg1_tx(ZM_LV_0, "addrTblSize=", addrTblSize);
- zm_msg1_tx(ZM_LV_0, "frag.bufType[0]=", frag.bufType[0]);
-#endif
-
- fragLen = zfwBufGetSize(dev, frag.buf[i]);
- if ((da[0]&0x1) == 0)
- {
- wd->commTally.txUnicastFrm++;
- wd->commTally.txUnicastOctets += (fragLen+snapLen);
- }
- else if ((da[0]& 0x1))
- {
- wd->commTally.txBroadcastFrm++;
- wd->commTally.txBroadcastOctets += (fragLen+snapLen);
- }
- else
- {
- wd->commTally.txMulticastFrm++;
- wd->commTally.txMulticastOctets += (fragLen+snapLen);
- }
- wd->ledStruct.txTraffic++;
-
-#if 0 //Who care this?
- if ( (i)&&(i == (fragNum-1)) )
- {
- wd->trafTally.txDataByteCount -= micLen;
- }
-#endif
-
- /*if (aggControl->tid_baw && aggControl->aggEnabled) {
- struct baw_header_r header_r;
-
- header_r.header = header;
- header_r.mic = mic;
- header_r.snap = snap;
- header_r.headerLen = headerLen;
- header_r.micLen = micLen;
- header_r.snapLen = snapLen;
- header_r.removeLen = removeLen;
- header_r.keyIdx = keyIdx;
-
- BAW->insert(dev, buf, tid_tx->bar_ssn >> 4, aggControl->tid_baw, 0, &header_r);
- }*/
-
- err = zfHpSend(dev, header, headerLen, snap, snapLen,
- mic, micLen, frag.buf[i], removeLen,
- frag.bufType[i], zcUpToAc[up&0x7], keyIdx);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
-
-
- continue;
-
-zlError:
- if (frag.bufType[i] == ZM_EXTERNAL_ALLOC_BUF)
- {
- zfwBufFree(dev, frag.buf[i], err);
- }
- else if (frag.bufType[i] == ZM_INTERNAL_ALLOC_BUF)
- {
- zfwBufFree(dev, frag.buf[i], 0);
- }
- else
- {
- zm_assert(0);
- }
- } /* for (i=0; i<fragNum; i++) */
-
- return ZM_SUCCESS;
-}
-
-/*
- * zfAggSendADDBA() refers zfSendMmFrame() in cmm.c
- */
-u16_t zfAggSendAddbaRequest(zdev_t* dev, u16_t *dst, u16_t ac, u16_t up)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- //u16_t err;
- u16_t offset = 0;
- u16_t hlen = 32;
- u16_t header[(24+25+1)/2];
- u16_t vap = 0;
- u16_t i;
- u8_t encrypt = 0;
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
-
- /*
- * TBD : Maximum size of management frame
- */
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return ZM_SUCCESS;
- }
-
- /*
- * Reserve room for wlan header
- */
- offset = hlen;
-
- /*
- * add addba frame body
- */
- offset = zfAggSetAddbaFrameBody(dev, buf, offset, ac, up);
-
-
- zfwBufSetSize(dev, buf, offset);
-
- /*
- * Copy wlan header
- */
- zfAggGenAddbaHeader(dev, dst, header, offset-hlen, buf, vap, encrypt);
- for (i=0; i<(hlen>>1); i++)
- {
- zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
- }
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
- //{
- // goto zlError;
- //}
-
- //zm_msg2_mm(ZM_LV_2, "offset=", offset);
- //zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
- //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
- //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
-
- #if 0
- err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
- #else
- zfPutVmmq(dev, buf);
- zfPushVtxq(dev);
- #endif
-
- return ZM_SUCCESS;
-
-}
-
-u16_t zfAggSetAddbaFrameBody(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t ac, u16_t up)
-{
- u16_t ba_parameter, start_seq;
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
- /*
- * ADDBA Request frame body
- */
-
- /*
- * Category
- */
- zmw_tx_buf_writeb(dev, buf, offset++, 3);
- /*
- * Action details = 0
- */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_ADDBA_REQUEST_FRAME);
- /*
- * Dialog Token = nonzero
- * TBD: define how to get dialog token?
- */
- zmw_tx_buf_writeb(dev, buf, offset++, 2);
- /*
- * Block Ack parameter set
- * BA policy = 1 for immediate BA, 0 for delayed BA
- * TID(4bits) & buffer size(4bits) (TID=up & buffer size=0x80)
- * TBD: how to get buffer size?
- * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
- * ¢x B0 ¢x B1 ¢x B2 B5 ¢x B6 B15 ¢x
- * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
- * ¢x Reserved ¢x BA policy ¢x TID ¢x Buffer size ¢x
- * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
- */
- ba_parameter = 1 << 12; // buffer size = 0x40(64)
- ba_parameter |= up << 2; // tid = up
- ba_parameter |= 2; // ba policy = 1
- zmw_tx_buf_writeh(dev, buf, offset, ba_parameter);
- offset+=2;
- /*
- * BA timeout value
- */
- zmw_tx_buf_writeh(dev, buf, offset, 0);
- offset+=2;
- /*
- * BA starting sequence number
- * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
- * ¢x B0 B3 ¢x B4 B15 ¢x
- * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
- * ¢x Frag num(0) ¢x BA starting seq num ¢x
- * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
- */
- start_seq = ((wd->seq[ac]) << 4) & 0xFFF0;
- zmw_tx_buf_writeh(dev, buf, offset, start_seq);
- offset+=2;
-
- return offset;
-}
-
-u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst,
- u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt)
-{
- u8_t hlen = 32; // MAC ctrl + PHY ctrl + 802.11 MM header
- //u8_t frameType = ZM_WLAN_FRAME_TYPE_ACTION;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /*
- * Generate control setting
- */
- //bodyLen = zfwBufGetSize(dev, buf);
- header[0] = 24+len+4; //Length
- header[1] = 0x8; //MAC control, backoff + (ack)
-
-#if 0
- /* CCK 1M */
- header[2] = 0x0f00; //PHY control L
- header[3] = 0x0000; //PHY control H
-#else
- /* OFDM 6M */
- header[2] = 0x0f01; //PHY control L
- header[3] = 0x000B; //PHY control H
-#endif
-
- /*
- * Generate WLAN header
- * Frame control frame type and subtype
- */
- header[4+0] = ZM_WLAN_FRAME_TYPE_ACTION;
- /*
- * Duration
- */
- header[4+1] = 0;
-
- if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- header[4+8] = wd->sta.bssid[0];
- header[4+9] = wd->sta.bssid[1];
- header[4+10] = wd->sta.bssid[2];
- }
- else if (wd->wlanMode == ZM_MODE_PSEUDO)
- {
- /* Address 3 = 00:00:00:00:00:00 */
- header[4+8] = 0;
- header[4+9] = 0;
- header[4+10] = 0;
- }
- else if (wd->wlanMode == ZM_MODE_IBSS)
- {
- header[4+8] = wd->sta.bssid[0];
- header[4+9] = wd->sta.bssid[1];
- header[4+10] = wd->sta.bssid[2];
- }
- else if (wd->wlanMode == ZM_MODE_AP)
- {
- /* Address 3 = BSSID */
- header[4+8] = wd->macAddr[0];
- header[4+9] = wd->macAddr[1];
- header[4+10] = wd->macAddr[2] + (vap<<8);
- }
-
- /* Address 1 = DA */
- header[4+2] = dst[0];
- header[4+3] = dst[1];
- header[4+4] = dst[2];
-
- /* Address 2 = SA */
- header[4+5] = wd->macAddr[0];
- header[4+6] = wd->macAddr[1];
- if (wd->wlanMode == ZM_MODE_AP)
- {
- header[4+7] = wd->macAddr[2] + (vap<<8);
- }
- else
- {
- header[4+7] = wd->macAddr[2];
- }
-
- /* Sequence Control */
- zmw_enter_critical_section(dev);
- header[4+11] = ((wd->mmseq++)<<4);
- zmw_leave_critical_section(dev);
-
-
- return hlen;
-}
-
-
-u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf)
-{
- u16_t category;
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- category = zmw_rx_buf_readb(dev, buf, 24);
-
- switch (category)
- {
- case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
- zfAggBlockAckActionFrame(dev, buf);
- break;
-
- }
-
- return ZM_SUCCESS;
-}
-
-
-u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf)
-{
- u8_t action;
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- action = zmw_rx_buf_readb(dev, buf, 25);
-#ifdef ZM_ENABLE_AGGREGATION
- switch (action)
- {
- case ZM_WLAN_ADDBA_REQUEST_FRAME:
- zm_msg0_agg(ZM_LV_0, "Received BA Action frame is ADDBA request");
- zfAggRecvAddbaRequest(dev, buf);
- break;
- case ZM_WLAN_ADDBA_RESPONSE_FRAME:
- zm_msg0_agg(ZM_LV_0, "Received BA Action frame is ADDBA response");
- zfAggRecvAddbaResponse(dev, buf);
- break;
- case ZM_WLAN_DELBA_FRAME:
- zfAggRecvDelba(dev, buf);
- break;
- }
-#endif
- return ZM_SUCCESS;
-}
-
-u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf)
-{
- //u16_t dialog;
- struct aggBaFrameParameter bf;
- u16_t i;
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- bf.buf = buf;
- bf.dialog = zmw_rx_buf_readb(dev, buf, 26);
- /*
- * ba parameter set
- */
- bf.ba_parameter = zmw_rx_buf_readh(dev, buf, 27);
- bf.ba_policy = (bf.ba_parameter >> 1) & 1;
- bf.tid = (bf.ba_parameter >> 2) & 0xF;
- bf.buffer_size = (bf.ba_parameter >> 6);
- /*
- * BA timeout value
- */
- bf.ba_timeout = zmw_rx_buf_readh(dev, buf, 29);
- /*
- * BA starting sequence number
- */
- bf.ba_start_seq = zmw_rx_buf_readh(dev, buf, 31) >> 4;
-
- i=26;
- while(i < 32) {
- zm_debug_msg2("Recv ADDBA Req:", zmw_rx_buf_readb(dev,buf,i));
- i++;
- }
-
- zfAggSendAddbaResponse(dev, &bf);
-
- zfAggAddbaSetTidRx(dev, buf, &bf);
-
- return ZM_SUCCESS;
-}
-
-u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf, struct aggBaFrameParameter *bf)
-{
- u16_t i, ac, aid, fragOff;
- u16_t src[3];
- u16_t offset = 0;
- u8_t up;
- struct agg_tid_rx *tid_rx = NULL;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
- src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
- src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
- aid = zfApFindSta(dev, src);
-
- zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
- ac = zcUpToAc[up&0x7] & 0x3;
-
- ac = bf->tid;
-
- for (i=0; i<ZM_AGG_POOL_SIZE ; i++)
- {
- if((wd->tid_rx[i]->aid == aid) && (wd->tid_rx[i]->ac == ac))
- {
- tid_rx = wd->tid_rx[i];
- break;
- }
- }
-
- if (!tid_rx)
- {
- for (i=0; i<ZM_AGG_POOL_SIZE; i++)
- {
- if (wd->tid_rx[i]->aid == ZM_MAX_STA_SUPPORT)
- {
- tid_rx = wd->tid_rx[i];
- break;
- }
- }
- if (!tid_rx)
- return 0;
- }
-
- zmw_enter_critical_section(dev);
-
- tid_rx->aid = aid;
- tid_rx->ac = ac;
- tid_rx->addBaExchangeStatusCode = ZM_AGG_ADDBA_RESPONSE;
- tid_rx->seq_start = bf->ba_start_seq;
- tid_rx->baw_head = tid_rx->baw_tail = 0;
- tid_rx->sq_exceed_count = tid_rx->sq_behind_count = 0;
- zmw_leave_critical_section(dev);
-
- return 0;
-}
-
-u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf)
-{
- u16_t i,ac, aid=0;
- u16_t src[3];
- struct aggBaFrameParameter bf;
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- src[0] = zmw_rx_buf_readh(dev, buf, 10);
- src[1] = zmw_rx_buf_readh(dev, buf, 12);
- src[2] = zmw_rx_buf_readh(dev, buf, 14);
-
- if (wd->wlanMode == ZM_MODE_AP)
- aid = zfApFindSta(dev, src);
-
-
- bf.buf = buf;
- bf.dialog = zmw_rx_buf_readb(dev, buf, 26);
- bf.status_code = zmw_rx_buf_readh(dev, buf, 27);
- if (!bf.status_code)
- {
- wd->addbaComplete=1;
- }
-
- /*
- * ba parameter set
- */
- bf.ba_parameter = zmw_rx_buf_readh(dev, buf, 29);
- bf.ba_policy = (bf.ba_parameter >> 1) & 1;
- bf.tid = (bf.ba_parameter >> 2) & 0xF;
- bf.buffer_size = (bf.ba_parameter >> 6);
- /*
- * BA timeout value
- */
- bf.ba_timeout = zmw_rx_buf_readh(dev, buf, 31);
-
- i=26;
- while(i < 32) {
- zm_debug_msg2("Recv ADDBA Rsp:", zmw_rx_buf_readb(dev,buf,i));
- i++;
- }
-
- ac = zcUpToAc[bf.tid&0x7] & 0x3;
-
- //zmw_enter_critical_section(dev);
-
- //wd->aggSta[aid].aggFlag[ac] = 0;
-
- //zmw_leave_critical_section(dev);
-
- return ZM_SUCCESS;
-}
-
-u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf)
-{
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
- return ZM_SUCCESS;
-}
-
-u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- //u16_t err;
- u16_t offset = 0;
- u16_t hlen = 32;
- u16_t header[(24+25+1)/2];
- u16_t vap = 0;
- u16_t i;
- u8_t encrypt = 0;
- u16_t dst[3];
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
-
- /*
- * TBD : Maximum size of management frame
- */
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return ZM_SUCCESS;
- }
-
- /*
- * Reserve room for wlan header
- */
- offset = hlen;
-
- /*
- * add addba frame body
- */
- offset = zfAggSetAddbaResponseFrameBody(dev, buf, bf, offset);
-
-
- zfwBufSetSize(dev, buf, offset);
-
- /*
- * Copy wlan header
- */
-
- dst[0] = zmw_rx_buf_readh(dev, bf->buf, 10);
- dst[1] = zmw_rx_buf_readh(dev, bf->buf, 12);
- dst[2] = zmw_rx_buf_readh(dev, bf->buf, 14);
- zfAggGenAddbaHeader(dev, dst, header, offset-hlen, buf, vap, encrypt);
- for (i=0; i<(hlen>>1); i++)
- {
- zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
- }
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
- //{
- // goto zlError;
- //}
-
- //zm_msg2_mm(ZM_LV_2, "offset=", offset);
- //zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
- //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
- //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
-
- #if 0
- err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
- #else
- zfPutVmmq(dev, buf);
- zfPushVtxq(dev);
- #endif
-
- //zfAggSendAddbaRequest(dev, dst, zcUpToAc[bf->tid&0x7] & 0x3, bf->tid);
- return ZM_SUCCESS;
-
-}
-
-u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf,
- struct aggBaFrameParameter *bf, u16_t offset)
-{
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
- /*
- * ADDBA Request frame body
- */
-
- /*
- * Category
- */
- zmw_tx_buf_writeb(dev, buf, offset++, 3);
- /*
- * Action details = 0
- */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_ADDBA_RESPONSE_FRAME);
- /*
- * Dialog Token = nonzero
- */
- zmw_tx_buf_writeb(dev, buf, offset++, bf->dialog);
- /*
- * Status code
- */
- zmw_tx_buf_writeh(dev, buf, offset, 0);
- offset+=2;
- /*
- * Block Ack parameter set
- * BA policy = 1 for immediate BA, 0 for delayed BA
- * TID(4bits) & buffer size(4bits) (TID=0x1 & buffer size=0x80)
- * TBD: how to get TID number and buffer size?
- * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
- * ¢x B0 ¢x B1 ¢x B2 B5 ¢x B6 B15 ¢x
- * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
- * ¢x Reserved ¢x BA policy ¢x TID ¢x Buffer size ¢x
- * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
- */
- zmw_tx_buf_writeh(dev, buf, offset, bf->ba_parameter);
- offset+=2;
- /*
- * BA timeout value
- */
- zmw_tx_buf_writeh(dev, buf, offset, bf->ba_timeout);
- offset+=2;
-
- return offset;
-}
-
-void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx)
-{
- struct aggBarControl aggBarControl;
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
- //bar_control = aggBarControl->tid_info << 12 | aggBarControl->compressed_bitmap << 2
- // | aggBarControl->multi_tid << 1 | aggBarControl->bar_ack_policy;
- aggBarControl.bar_ack_policy = 0;
- aggBarControl.multi_tid = 0;
- aggBarControl.compressed_bitmap = 0;
- aggBarControl.tid_info = tid_tx->tid;
- zfAggSendBar(dev, tid_tx, &aggBarControl);
-
- return;
-
-}
-/*
- * zfAggSendBar() refers zfAggSendAddbaRequest()
- */
-u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- //u16_t err;
- u16_t offset = 0;
- u16_t hlen = 16+8; /* mac header + control headers*/
- u16_t header[(8+24+1)/2];
- u16_t vap = 0;
- u16_t i;
- u8_t encrypt = 0;
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
-
- /*
- * TBD : Maximum size of management frame
- */
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return ZM_SUCCESS;
- }
-
- /*
- * Reserve room for wlan header
- */
- offset = hlen;
-
- /*
- * add addba frame body
- */
- offset = zfAggSetBarBody(dev, buf, offset, tid_tx, aggBarControl);
-
-
- zfwBufSetSize(dev, buf, offset);
-
- /*
- * Copy wlan header
- */
- zfAggGenBarHeader(dev, tid_tx->dst, header, offset-hlen, buf, vap, encrypt);
- for (i=0; i<(hlen>>1); i++)
- {
- zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
- }
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
- //{
- // goto zlError;
- //}
-
- //zm_msg2_mm(ZM_LV_2, "offset=", offset);
- //zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
- //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
- //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
-
- #if 0
- err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
- #else
- zfPutVmmq(dev, buf);
- zfPushVtxq(dev);
- #endif
-
- return ZM_SUCCESS;
-
-}
-
-u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl)
-{
- u16_t bar_control, start_seq;
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
- /*
- * BAR Control frame body
- */
-
- /*
- * BAR Control Field
- * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
- * ¢x B0 ¢x B1 ¢x B2 ¢x B3 B11 ¢x B12 B15 ¢x
- * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
- * ¢x BAR Ack ¢x Multi-TID ¢x Compressed ¢x Reserved ¢x TID_INFO ¢x
- * ¢x Policy ¢x ¢x Bitmap ¢x ¢x ¢x
- * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
- */
- bar_control = aggBarControl->tid_info << 12 | aggBarControl->compressed_bitmap << 2
- | aggBarControl->multi_tid << 1 | aggBarControl->bar_ack_policy;
-
- zmw_tx_buf_writeh(dev, buf, offset, bar_control);
- offset+=2;
- if (0 == aggBarControl->multi_tid) {
- /*
- * BA starting sequence number
- * ¢z¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢s¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢{
- * ¢x B0 B3 ¢x B4 B15 ¢x
- * ¢u¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢q¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢t
- * ¢x Frag num(0) ¢x BA starting seq num ¢x
- * ¢|¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢r¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢w¢}
- */
- start_seq = (tid_tx->bar_ssn << 4) & 0xFFF0;
- zmw_tx_buf_writeh(dev, buf, offset, start_seq);
- offset+=2;
- }
- if (1 == aggBarControl->multi_tid && 1 == aggBarControl->compressed_bitmap) {
- /* multi-tid BlockAckReq variant, not implemented*/
- }
-
- return offset;
-}
-
-u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst,
- u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt)
-{
- u8_t hlen = 16+8; // MAC ctrl + PHY ctrl + 802.11 MM header
- //u8_t frameType = ZM_WLAN_FRAME_TYPE_ACTION;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /*
- * Generate control setting
- */
- //bodyLen = zfwBufGetSize(dev, buf);
- header[0] = 16+len+4; //Length
- header[1] = 0x8; //MAC control, backoff + (ack)
-
-#if 1
- /* CCK 1M */
- header[2] = 0x0f00; //PHY control L
- header[3] = 0x0000; //PHY control H
-#else
- /* CCK 6M */
- header[2] = 0x0f01; //PHY control L
- header[3] = 0x000B; //PHY control H
-
-#endif
- /*
- * Generate WLAN header
- * Frame control frame type and subtype
- */
- header[4+0] = ZM_WLAN_FRAME_TYPE_BAR;
- /*
- * Duration
- */
- header[4+1] = 0;
-
- /* Address 1 = DA */
- header[4+2] = dst[0];
- header[4+3] = dst[1];
- header[4+4] = dst[2];
-
- /* Address 2 = SA */
- header[4+5] = wd->macAddr[0];
- header[4+6] = wd->macAddr[1];
- if (wd->wlanMode == ZM_MODE_AP)
- {
-#ifdef ZM_VAPMODE_MULTILE_SSID
- header[4+7] = wd->macAddr[2]; //Multiple SSID
-#else
- header[4+7] = wd->macAddr[2] + (vap<<8); //VAP
-#endif
- }
- else
- {
- header[4+7] = wd->macAddr[2];
- }
-
- /* Sequence Control */
- zmw_enter_critical_section(dev);
- header[4+11] = ((wd->mmseq++)<<4);
- zmw_leave_critical_section(dev);
-
-
- return hlen;
-}
diff --git a/drivers/staging/otus/80211core/cagg.h b/drivers/staging/otus/80211core/cagg.h
deleted file mode 100644
index 1d87a56..0000000
--- a/drivers/staging/otus/80211core/cagg.h
+++ /dev/null
@@ -1,435 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : cagg.h */
-/* */
-/* Abstract */
-/* This module contains A-MPDU aggregation relatived functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/****************************************************************************/
-/*Revision History: */
-/* Who When What */
-/* -------- -------- ----------------------------------------------*/
-/* */
-/* Honda 12-4-06 created */
-/* */
-/****************************************************************************/
-
-#ifndef _CAGG_H
-#define _CAGG_H
-
-
-/*
- * the aggregation functions flag, 0 if don't do aggregate
- */
-
-#define ZM_AGG_FPGA_DEBUG 1
-#define ZM_AGG_FPGA_REORDERING 1
-
-#ifndef ZM_AGG_TALLY
-//#define ZM_AGG_TALLY
-#endif
-/*
- * Aggregate control
- */
-
-
-#define ZM_AGG_POOL_SIZE 20
-#define ZM_BAW_POOL_SIZE 32
-#define ZM_AGGQ_SIZE 64
-#define ZM_AGGQ_SIZE_MASK (ZM_AGGQ_SIZE-1)
-#define ZM_AGG_LOW_THRESHOLD 1
-#define ZM_AGG_HIGH_THRESHOLD 5
-
-/*
- * number of access categories (ac)
- */
-#define ZM_AC 4
-/*
- * the timer to clear aggregation queue, unit: 1 tick
- * if the packet is too old (current time - arrival time)
- * the packet and the aggregate queue will be cleared
- */
-#define ZM_AGG_CLEAR_TIME 10
-/*
- * delete the queue if idle for ZM_DELETE_TIME
- * unit: 10ms
- */
-#define ZM_AGG_DELETE_TIME 10000
-
-/*
- * block ack window size
- */
-#define ZM_AGG_BAW_SIZE 64
-#define ZM_AGG_BAW_MASK (ZM_AGG_BAW_SIZE-1)
-/*
- * originator ADDBA Resquest receiver
- * |----------------------------->|
- * 1| ACK |1
- * |<-----------------------------|
- * 2| ADDBA Response |2
- * |<-----------------------------|
- * 3| ACK |3
- * |----------------------------->|
- * 4 4
- */
-#define ZM_AGG_ADDBA_REQUEST 1
-#define ZM_AGG_ADDBA_REQUEST_ACK 2
-#define ZM_AGG_ADDBA_RESPONSE 3
-#define ZM_AGG_ADDBA_RESPONSE_ACK 4
-
-#define ZM_AGG_SINGLE_MPDU 00
-#define ZM_AGG_FIRST_MPDU 01
-#define ZM_AGG_MIDDLE_MPDU 11
-#define ZM_AGG_LAST_MPDU 10
-/*
- * end of Aggregate control
- */
-
-#define TID_TX struct aggQueue*
-#define TID_BAW struct baw_q*
-#define BAW wd->baw_enabler
-#define DESTQ wd->destQ
-
-/*
- * Queue access
- */
-#define zm_agg_qlen(dev, head, tail) ((head - tail) & ZM_AGGQ_SIZE_MASK)
-#define zm_agg_inQ(tid_tx, pt) ((((pt - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK) < \
- ((tid_tx->aggHead - tid_tx->aggTail) & ZM_AGGQ_SIZE_MASK))? TRUE:FALSE)
-#define zm_agg_plus(pt) pt = (pt + 1) & ZM_AGGQ_SIZE_MASK
-#define zm_agg_min(A, B) ((A>B)? B:A)
-#define zm_agg_GetTime() wd->tick
-#define TXQL (zfHpGetMaxTxdCount(dev) - zfHpGetFreeTxdCount(dev))
-
-/* don't change AGG_MIN_TXQL easily, this might cause BAW BSOD */
-#define AGG_MIN_TXQL 2
-/*
- * consider tcp,udp,ac(1234)
- */
-#define zm_agg_dynamic_threshold(dev, ar) ((ar > 16)? 11: \
- (ar > 12)? 8: \
- (ar > 8)? 5: \
- (ar > 4)? 2:1)
-#define zm_agg_weight(ac) ((3 == ac)? 4: \
- (2 == ac)? 3: \
- (0 == ac)? 2:1)
-/*
- * the required free queue ratio per ac
- */
-
-#define zm_agg_ratio(ac) ((3 == ac)? 3: \
- (2 == ac)? (zfHpGetMaxTxdCount(dev)*1/4): \
- (0 == ac)? (zfHpGetMaxTxdCount(dev)*2/4): \
- (zfHpGetMaxTxdCount(dev)*3/4))
-
-//#define zm_agg_ratio(ac) 3
-/*
- * end of Queue access
- */
-
-#define ZM_AGGMSG_LEV ZM_LV_3
-#define zm_msg0_agg(lv, msg) if (ZM_AGGMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_agg(lv, msg, val) if (ZM_AGGMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-struct baw_header_r {
- u16_t *header;
- u16_t *mic;
- u16_t *snap;
- u16_t headerLen;
- u16_t micLen;
- u16_t snapLen;
- u16_t removeLen;
- u8_t keyIdx;
-};
-
-struct baw_header {
- u16_t header[29];//[(8+30+2+18)/2]; 58 bytes /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
- u16_t headerLen;
- u16_t mic[4]; //[8/2]; 8 bytes
- u16_t micLen;
- u16_t snap[4]; //[8/2]; 8 bytes
- u16_t snapLen;
- u16_t removeLen;
- u8_t keyIdx;
-};
-
-struct bufInfo {
- zbuf_t* buf;
- u8_t baw_retransmit;
- u32_t timestamp;
- struct baw_header *baw_header;
-};
-#endif
-struct aggElement
-{
- zbuf_t* buf;
- u32_t arrivalTime;
- u8_t baw_retransmit;
- struct zsAdditionInfo addInfo;
- //struct baw_header baw_header;
-};
-
-
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-struct baw_buf
-{
- zbuf_t* buf;
- u16_t baw_seq;
- u32_t timestamp;
- u8_t baw_retransmit;
- struct baw_header baw_header;
-};
-
-struct baw_q {
- struct baw_buf frame[ZM_VTXQ_SIZE];
- u16_t enabled;
- u16_t start_seq;
- u16_t head;
- u16_t tail;
- u16_t size;
- TID_TX tid_tx;
-
- //struct baw_header *baw_header;
-};
-
-struct baw_enabler
-{
- struct baw_q tid_baw[ZM_BAW_POOL_SIZE];
- u8_t delPoint;
- void (*core)(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
- //void (*core);
- void (*init)(zdev_t* dev);
- TID_BAW (*getNewQ)(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
- TID_BAW (*getQ)(zdev_t* dev, u16_t baw_seq);
- u16_t (*insert)(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r);
- struct bufInfo* (*pop)(zdev_t* dev, u16_t index, TID_BAW tid_baw);
- void (*enable)(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
- void (*disable)(zdev_t* dev, TID_BAW tid_baw);
-
-};
-#endif
-struct aggQueue
-{
- struct aggElement aggvtxq[ZM_AGGQ_SIZE];
- u16_t aggHead;
- u16_t aggTail;
- s16_t size;
- u16_t aggQSTA;
- u16_t aggQEnabled;
- u16_t ac;
- u16_t tid;
- u16_t aggReady;
- u16_t clearFlag;
- u16_t deleteFlag;
- u32_t lastArrival;
- u16_t aggFrameSize;
- u16_t bar_ssn; /* starting sequence number in BAR */
- u16_t dst[3];
- u16_t complete; /* complete indication pointer */
-};
-
-struct aggSta
-{
- u16_t count[ZM_AC];
- TID_TX tid_tx[8];
- u16_t aggFlag[ZM_AC];
-};
-
-struct agg_tid_rx
-{
- u16_t aid;
- u16_t ac;
- u16_t addBaExchangeStatusCode;
- //struct zsAdditionInfo *addInfo;
- u16_t seq_start; /* first seq expected next */
- u16_t baw_head; /* head of valid block ack window */
- u16_t baw_tail; /* tail of valid block ack window */
- //u16_t free_count; /* block ack window size */
- u8_t sq_exceed_count;
- u8_t sq_behind_count;
- struct aggElement frame[ZM_AGG_BAW_SIZE + 1]; /* out-of-order rx frames */
-};
-
-struct aggControl
-{
- u16_t aggEnabled;
- u16_t ampduIndication;
- u16_t addbaIndication;
- //TID_BAW tid_baw;
- u32_t timestamp;
-};
-
-struct aggBaFrameParameter
-{
- zbuf_t* buf;
- u16_t ba_parameter;
- u8_t dialog;
- u16_t ba_policy;
- u16_t tid;
- u16_t buffer_size;
- u16_t ba_timeout;
- u16_t ba_start_seq;
- u16_t status_code;
-};
-
-struct aggBarControl
-{
- u16_t bar_ack_policy ;
- u16_t multi_tid ;
- u16_t compressed_bitmap ;
- u16_t tid_info ;
-};
-
-struct aggTally
-{
- u32_t got_packets_sum;
- u32_t got_bytes_sum;
- u32_t sent_packets_sum;
- u32_t sent_bytes_sum;
- u32_t avg_got_packets;
- u32_t avg_got_bytes;
- u32_t avg_sent_packets;
- u32_t avg_sent_bytes;
- u16_t time;
-};
-
-
-struct destQ {
- struct dest{
- u16_t Qtype : 1; /* 0 aggr, 1 vtxq */
- TID_TX tid_tx;
- void* vtxq;
-
- struct dest* next;
- } *dest[4];
- struct dest* Head[4];
- //s16_t size[4];
- u16_t ppri;
- void (*insert)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
- void (*delete)(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
- void (*init)(zdev_t* dev);
- struct dest* (*getNext)(zdev_t* dev, u16_t ac);
- u16_t (*exist)(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
- //void (*scan)(zdev_t* dev);
-};
-/*
- * aggregation tx
- */
-void zfAggInit(zdev_t* dev);
-u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
-u16_t zfAggGetSta(zdev_t* dev, zbuf_t* buf);
-TID_TX zfAggTxGetQueue(zdev_t* dev, u16_t aid, u16_t tid);
-TID_TX zfAggTxNewQueue(zdev_t* dev, u16_t aid, u16_t tid, zbuf_t* buf);
-u16_t zfAggTxEnqueue(zdev_t* dev, zbuf_t* buf, u16_t aid, TID_TX tid_tx);
-u16_t zfAggTx(zdev_t* dev, zbuf_t* buf, u16_t tid);
-u16_t zfAggTxReadyCount(zdev_t* dev, u16_t ac);
-u16_t zfAggTxPartial(zdev_t* dev, u16_t ac, u16_t readycount);
-u16_t zfAggTxSend(zdev_t* dev, u32_t freeTxd, TID_TX tid_tx);
-TID_TX zfAggTxGetReadyQueue(zdev_t* dev, u16_t ac);
-zbuf_t* zfAggTxGetVtxq(zdev_t* dev, TID_TX tid_tx);
-u16_t zfAggTxDeleteQueue(zdev_t* dev, u16_t qnum);
-u16_t zfAggScanAndClear(zdev_t* dev, u32_t time);
-u16_t zfAggClearQueue(zdev_t* dev);
-void zfAggTxScheduler(zdev_t* dev, u8_t ScanAndClear);
-
-/* tid_tx manipulation */
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-u16_t zfAggTidTxInsertHead(zdev_t* dev, struct bufInfo* buf_info, TID_TX tid_tx);
-#endif
-void zfAggDestInsert(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
-void zfAggDestDelete(zdev_t* dev, u16_t Qtype, TID_TX tid_tx, void* vtxq);
-void zfAggDestInit(zdev_t* dev);
-struct dest* zfAggDestGetNext(zdev_t* dev, u16_t ac);
-u16_t zfAggDestExist(zdev_t* dev, u16_t Qtype, u16_t ac, TID_TX tid_tx, void* vtxq);
-/*
- * aggregation rx
- */
-struct agg_tid_rx *zfAggRxEnabled(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggRx(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo *addInfo, struct agg_tid_rx *tid_rx);
-struct agg_tid_rx *zfAggRxGetQueue(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggRxEnqueue(zdev_t* dev, zbuf_t* buf, struct agg_tid_rx *tid_rx, struct zsAdditionInfo *addInfo);
-u16_t zfAggRxFlush(zdev_t* dev, u16_t seq_no, struct agg_tid_rx *tid_rx);
-u16_t zfAggRxFreeBuf(zdev_t* dev, u16_t destroy);
-u16_t zfAggRxClear(zdev_t* dev, u32_t time);
-void zfAggRecvBAR(zdev_t* dev, zbuf_t* buf);
-/*
- * end of aggregation rx
- */
-
-/*
- * ADDBA
- */
-u16_t zfAggSendAddbaRequest(zdev_t* dev, u16_t *dst, u16_t ac, u16_t up);
-u16_t zfAggSetAddbaFrameBody(zdev_t* dev,zbuf_t* buf, u16_t offset, u16_t ac, u16_t up);
-u16_t zfAggGenAddbaHeader(zdev_t* dev, u16_t* dst,
- u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
-u16_t zfAggProcessAction(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggBlockAckActionFrame(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggRecvAddbaRequest(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggRecvAddbaResponse(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggRecvDelba(zdev_t* dev, zbuf_t* buf);
-u16_t zfAggSendAddbaResponse(zdev_t* dev, struct aggBaFrameParameter *bf);
-u16_t zfAggSetAddbaResponseFrameBody(zdev_t* dev, zbuf_t* buf,
- struct aggBaFrameParameter *bf, u16_t offset);
-u16_t zfAggAddbaSetTidRx(zdev_t* dev, zbuf_t* buf,
- struct aggBaFrameParameter *bf);
-/*
- * zfAggTxSendEth
- */
-u16_t zfAggTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u8_t flag, struct aggControl *aggControl, TID_TX tid_tx);
-
-/*
- * statistics functions
- */
-u16_t zfAggTallyReset(zdev_t* dev);
-
-u16_t zfAggPrintTally(zdev_t* dev);
-
-/*
- * BAR
- */
-void zfAggInvokeBar(zdev_t* dev, TID_TX tid_tx);
-u16_t zfAggSendBar(zdev_t* dev, TID_TX tid_tx, struct aggBarControl *aggBarControl);
-u16_t zfAggSetBarBody(zdev_t* dev, zbuf_t* buf, u16_t offset, TID_TX tid_tx, struct aggBarControl *aggBarControl);
-u16_t zfAggGenBarHeader(zdev_t* dev, u16_t* dst,
- u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
-
-#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION //disable BAW
-/* BAW BA retransmission */
-void zfBawCore(zdev_t* dev, u16_t baw_seq, u32_t bitmap, u16_t aggLen);
-void zfBawInit(zdev_t* dev);
-TID_BAW zfBawGetNewQ(zdev_t* dev, u16_t start_seq, TID_TX tid_tx);
-u16_t zfBawInsert(zdev_t* dev, zbuf_t* buf, u16_t baw_seq, TID_BAW tid_baw, u8_t baw_retransmit, struct baw_header_r *header_r);
-struct bufInfo* zfBawPop(zdev_t* dev, u16_t index, TID_BAW tid_baw);
-void zfBawEnable(zdev_t* dev, TID_BAW tid_baw, u16_t start_seq);
-void zfBawDisable(zdev_t* dev, TID_BAW tid_baw);
-TID_BAW zfBawGetQ(zdev_t* dev, u16_t baw_seq);
-void zfAggTxRetransmit(zdev_t* dev, struct bufInfo *buf_info, struct aggControl *aggControl, TID_TX tid_tx);
-#endif
-/* extern functions */
-extern zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac);
-
-#endif /* #ifndef _CAGG_H */
-
diff --git a/drivers/staging/otus/80211core/ccmd.c b/drivers/staging/otus/80211core/ccmd.c
deleted file mode 100644
index ab300df..0000000
--- a/drivers/staging/otus/80211core/ccmd.c
+++ /dev/null
@@ -1,1766 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : cmd.c */
-/* */
-/* Abstract */
-/* This module contains command interface functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#include "../hal/hpreg.h"
-
-
-u16_t zfWlanReset(zdev_t *dev);
-u32_t zfUpdateRxRate(zdev_t *dev);
-
-
-extern void zfiUsbRecv(zdev_t *dev, zbuf_t *buf);
-extern void zfiUsbRegIn(zdev_t *dev, u32_t *rsp, u16_t rspLen);
-extern void zfiUsbOutComplete(zdev_t *dev, zbuf_t *buf, u8_t status, u8_t *hdr);
-extern void zfiUsbRegOutComplete(zdev_t *dev);
-extern u16_t zfHpReinit(zdev_t *dev, u32_t frequency);
-
-/* Get size (byte) of driver core global data structure. */
-/* This size will be used by driver wrapper to allocate */
-/* a memory space for driver core to store global variables */
-u16_t zfiGlobalDataSize(zdev_t *dev)
-{
- u32_t ret;
- ret = (sizeof(struct zsWlanDev));
- zm_assert((ret>>16) == 0);
- return (u16_t)ret;
-}
-
-
-/* Initialize WLAN hardware and software, resource will be allocated */
-/* for WLAN operation, must be called first before other function. */
-extern u16_t zfiWlanOpen(zdev_t *dev, struct zsCbFuncTbl *cbFuncTbl)
-{
- /* u16_t ret;
- u32_t i;
- u8_t* ch;
- u8_t bPassive;
- */
- u32_t devSize;
- struct zfCbUsbFuncTbl cbUsbFuncTbl;
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg0("start");
-
- devSize = sizeof(struct zsWlanDev);
- /* Zeroize zsWlanDev struct */
- zfZeroMemory((u8_t *)wd, (u16_t)devSize);
-
-#ifdef ZM_ENABLE_AGGREGATION
- zfAggInit(dev);
-#endif
-
- zfCwmInit(dev);
-
- wd->commTally.RateCtrlTxMPDU = 0;
- wd->commTally.RateCtrlBAFail = 0;
- wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
-
- if (cbFuncTbl == NULL) {
- /* zfcbRecvEth() is mandatory */
- zm_assert(0);
- } else {
- if (cbFuncTbl->zfcbRecvEth == NULL) {
- /* zfcbRecvEth() is mandatory */
- zm_assert(0);
- }
- wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
- wd->zfcbAuthNotify = cbFuncTbl->zfcbAuthNotify;
- wd->zfcbAsocNotify = cbFuncTbl->zfcbAsocNotify;
- wd->zfcbDisAsocNotify = cbFuncTbl->zfcbDisAsocNotify;
- wd->zfcbApConnectNotify = cbFuncTbl->zfcbApConnectNotify;
- wd->zfcbConnectNotify = cbFuncTbl->zfcbConnectNotify;
- wd->zfcbScanNotify = cbFuncTbl->zfcbScanNotify;
- wd->zfcbMicFailureNotify = cbFuncTbl->zfcbMicFailureNotify;
- wd->zfcbApMicFailureNotify = cbFuncTbl->zfcbApMicFailureNotify;
- wd->zfcbIbssPartnerNotify = cbFuncTbl->zfcbIbssPartnerNotify;
- wd->zfcbMacAddressNotify = cbFuncTbl->zfcbMacAddressNotify;
- wd->zfcbSendCompleteIndication =
- cbFuncTbl->zfcbSendCompleteIndication;
- wd->zfcbRecvEth = cbFuncTbl->zfcbRecvEth;
- wd->zfcbRestoreBufData = cbFuncTbl->zfcbRestoreBufData;
- wd->zfcbRecv80211 = cbFuncTbl->zfcbRecv80211;
-#ifdef ZM_ENABLE_CENC
- wd->zfcbCencAsocNotify = cbFuncTbl->zfcbCencAsocNotify;
-#endif /* ZM_ENABLE_CENC */
- wd->zfcbClassifyTxPacket = cbFuncTbl->zfcbClassifyTxPacket;
- wd->zfcbHwWatchDogNotify = cbFuncTbl->zfcbHwWatchDogNotify;
- }
-
- /* add by honda 0330 */
- cbUsbFuncTbl.zfcbUsbRecv = zfiUsbRecv;
- cbUsbFuncTbl.zfcbUsbRegIn = zfiUsbRegIn;
- cbUsbFuncTbl.zfcbUsbOutComplete = zfiUsbOutComplete;
- cbUsbFuncTbl.zfcbUsbRegOutComplete = zfiUsbRegOutComplete;
- zfwUsbRegisterCallBack(dev, &cbUsbFuncTbl);
- /* Init OWN MAC address */
- wd->macAddr[0] = 0x8000;
- wd->macAddr[1] = 0x0000;
- wd->macAddr[2] = 0x0000;
-
- wd->regulationTable.regionCode = 0xffff;
-
- zfHpInit(dev, wd->frequency);
-
- /* init region code */
- /* wd->regulationTable.regionCode = NULL1_WORLD; //Only 2.4g RegCode */
- /* zfHpGetRegulationTablefromRegionCode(dev, NULL1_WORLD); */
- /* zfiWlanSetDot11DMode(dev , 1); //Enable 802.11d */
- /* Get the first channel */
- /* wd->frequency = zfChGetFirstChannel(dev, &bPassive); */
-#ifdef ZM_AP_DEBUG
- /* wd->frequency = 2437; */
-#endif
-
- /* STA mode */
- wd->sta.mTxRate = 0x0;
- wd->sta.uTxRate = 0x3;
- wd->sta.mmTxRate = 0x0;
- wd->sta.adapterState = ZM_STA_STATE_DISCONNECT;
- wd->sta.capability[0] = 0x01;
- wd->sta.capability[1] = 0x00;
-
- wd->sta.preambleTypeHT = 0;
- wd->sta.htCtrlBandwidth = 0;
- wd->sta.htCtrlSTBC = 0;
- wd->sta.htCtrlSG = 0;
- wd->sta.defaultTA = 0;
- /*wd->sta.activescanTickPerChannel =
- *ZM_TIME_ACTIVE_SCAN/ZM_MS_PER_TICK;
- */
- {
- u8_t Dur = ZM_TIME_ACTIVE_SCAN;
- zfwGetActiveScanDur(dev, &Dur);
- wd->sta.activescanTickPerChannel = Dur / ZM_MS_PER_TICK;
-
- }
- wd->sta.passiveScanTickPerChannel = ZM_TIME_PASSIVE_SCAN/ZM_MS_PER_TICK;
- wd->sta.bAutoReconnect = TRUE;
- wd->sta.dropUnencryptedPkts = FALSE;
-
- /* set default to bypass all multicast packet for linux,
- * window XP would set 0 by wrapper initialization
- */
- wd->sta.bAllMulticast = 1;
-
- /* Initial the RIFS Status / RIFS-like frame count / RIFS count */
- wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
- wd->sta.rifsLikeFrameCnt = 0;
- wd->sta.rifsCount = 0;
-
- wd->sta.osRxFilter = 0;
- wd->sta.bSafeMode = 0;
-
- /* Common */
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
- wd->beaconInterval = 100;
- wd->rtsThreshold = 2346;
- wd->fragThreshold = 32767;
- wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
- wd->txMCS = 0xff; /* AUTO */
- wd->dtim = 1;
- /* wd->txMT = 1; *//*OFDM */
- wd->tick = 1;
- wd->maxTxPower2 = 0xff;
- wd->maxTxPower5 = 0xff;
- wd->supportMode = 0xffffffff;
- wd->ws.adhocMode = ZM_ADHOCBAND_G;
- wd->ws.autoSetFrequency = 0xff;
-
- /* AP mode */
- /* wd->bgMode = wd->ws.bgMode; */
- wd->ap.ssidLen[0] = 6;
- wd->ap.ssid[0][0] = 'Z';
- wd->ap.ssid[0][1] = 'D';
- wd->ap.ssid[0][2] = '1';
- wd->ap.ssid[0][3] = '2';
- wd->ap.ssid[0][4] = '2';
- wd->ap.ssid[0][5] = '1';
-
- /* Init the country iso name as NA */
- wd->ws.countryIsoName[0] = 0;
- wd->ws.countryIsoName[1] = 0;
- wd->ws.countryIsoName[2] = '\0';
-
- /* init fragmentation is disabled */
- /* zfiWlanSetFragThreshold(dev, 0); */
-
- /* airopeek : swSniffer 1=>on 0=>off */
- wd->swSniffer = 0;
- wd->XLinkMode = 0;
-
- /* jhlee HT 0 */
-#if 1
- /* AP Mode*/
- /* Init HT Capability Info */
- wd->ap.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
- wd->ap.HTCap.Data.Length = 26;
- /*wd->ap.HTCap.Data.SupChannelWidthSet = 0;
- wd->ap.HTCap.Data.MIMOPowerSave = 3;
- wd->ap.HTCap.Data.ShortGIfor40MHz = 0;
- wd->ap.HTCap.Data.ShortGIfor20MHz = 0;
- wd->ap.HTCap.Data.DSSSandCCKin40MHz = 0;
- */
- wd->ap.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
- wd->ap.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~ 7 */
- wd->ap.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */
-
- /* Init Extended HT Capability Info */
- wd->ap.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
- wd->ap.ExtHTCap.Data.Length = 22;
- wd->ap.ExtHTCap.Data.ControlChannel = 6;
- /* wd->ap.ExtHTCap.Data.ExtChannelOffset = 3; */
- wd->ap.ExtHTCap.Data.ChannelInfo |= ExtHtCap_RecomTxWidthSet;
- /* wd->ap.ExtHTCap.Data.RIFSMode = 1; */
- wd->ap.ExtHTCap.Data.OperatingInfo |= 1;
-
- /* STA Mode*/
- /* Init HT Capability Info */
- wd->sta.HTCap.Data.ElementID = ZM_WLAN_EID_HT_CAPABILITY;
- wd->sta.HTCap.Data.Length = 26;
-
- /* Test with 5G-AP : 7603 */
- /* wd->sta.HTCap.Data.SupChannelWidthSet = 1; */
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SMEnabled;
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_ShortGIfor40MHz;
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_DSSSandCCKin40MHz;
-#ifndef ZM_DISABLE_AMSDU8K_SUPPORT
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
-#endif
- /*wd->sta.HTCap.Data.MIMOPowerSave = 0;
- wd->sta.HTCap.Data.ShortGIfor40MHz = 0;
- wd->sta.HTCap.Data.ShortGIfor20MHz = 0;
- wd->sta.HTCap.Data.DSSSandCCKin40MHz = 0;
- */
- wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
- wd->sta.HTCap.Data.MCSSet[0] = 0xFF; /* MCS 0 ~ 7 */
- wd->sta.HTCap.Data.MCSSet[1] = 0xFF; /* MCS 8 ~ 15 */
- wd->sta.HTCap.Data.PCO |= HTCAP_TransmissionTime3;
- /* wd->sta.HTCap.Data.TransmissionTime = 0; */
- /* Init Extended HT Capability Info */
- wd->sta.ExtHTCap.Data.ElementID = ZM_WLAN_EID_EXTENDED_HT_CAPABILITY;
- wd->sta.ExtHTCap.Data.Length = 22;
- wd->sta.ExtHTCap.Data.ControlChannel = 6;
-
- /* wd->sta.ExtHTCap.Data.ExtChannelOffset |= 3; */
- wd->sta.ExtHTCap.Data.ChannelInfo |= ExtHtCap_ExtChannelOffsetBelow;
-
- /* wd->sta.ExtHTCap.Data.RecomTxWidthSet = 1; */
- /* wd->sta.ExtHTCap.Data.RIFSMode = 1; */
- wd->sta.ExtHTCap.Data.OperatingInfo |= 1;
-#endif
-
-#if 0
- /* WME test code */
- wd->ap.qosMode[0] = 1;
-#endif
-
- wd->ledStruct.ledMode[0] = 0x2221;
- wd->ledStruct.ledMode[1] = 0x2221;
-
- zfTimerInit(dev);
-
- ZM_PERFORMANCE_INIT(dev);
-
- zfBssInfoCreate(dev);
- zfScanMgrInit(dev);
- zfPowerSavingMgrInit(dev);
-
-#if 0
- /* Test code */
- {
- u32_t key[4] = {0xffffffff, 0xff, 0, 0};
- u16_t addr[3] = {0x8000, 0x01ab, 0x0000};
- /*zfSetKey(dev, 0, 0, ZM_WEP64, addr, key);
- zfSetKey(dev, 0, 0, ZM_AES, addr, key);
- zfSetKey(dev, 64, 0, 1, wd->macAddr, key);
- */
- }
-#endif
-
- /* WME settings */
- wd->ws.staWmeEnabled = 1; /* Enable WME by default */
-#define ZM_UAPSD_Q_SIZE 32 /* 2^N */
- wd->ap.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
- zm_assert(wd->ap.uapsdQ != NULL);
- wd->sta.uapsdQ = zfQueueCreate(dev, ZM_UAPSD_Q_SIZE);
- zm_assert(wd->sta.uapsdQ != NULL);
-
- /* zfHpInit(dev, wd->frequency); */
-
- /* MAC address */
- /* zfHpSetMacAddress(dev, wd->macAddr, 0); */
- zfHpGetMacAddress(dev);
-
- zfCoreSetFrequency(dev, wd->frequency);
-
-#if ZM_PCI_LOOP_BACK == 1
- zfwWriteReg(dev, ZM_REG_PCI_CONTROL, 6);
-#endif /* #if ZM_PCI_LOOP_BACK == 1 */
-
- /* zfiWlanSetDot11DMode(dev , 1); // Enable 802.11d */
- /* zfiWlanSetDot11HDFSMode(dev , 1); // Enable 802.11h DFS */
- wd->sta.DFSEnable = 1;
- wd->sta.capability[1] |= ZM_BIT_0;
-
- /* zfiWlanSetFrequency(dev, 5260000, TRUE); */
- /* zfiWlanSetAniMode(dev , 1); // Enable ANI */
-
- /* Trgger Rx DMA */
- zfHpStartRecv(dev);
-
- zm_debug_msg0("end");
-
- return 0;
-}
-
-/* WLAN hardware will be shutdown and all resource will be release */
-u16_t zfiWlanClose(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- zm_msg0_init(ZM_LV_0, "enter");
-
- wd->state = ZM_WLAN_STATE_CLOSEDED;
-
- /* zfiWlanDisable(dev, 1); */
- zfWlanReset(dev);
-
- zfHpStopRecv(dev);
-
- /* Disable MAC */
- /* Disable PHY */
- /* Disable RF */
-
- zfHpRelease(dev);
-
- zfQueueDestroy(dev, wd->ap.uapsdQ);
- zfQueueDestroy(dev, wd->sta.uapsdQ);
-
- zfBssInfoDestroy(dev);
-
-#ifdef ZM_ENABLE_AGGREGATION
- /* add by honda */
- zfAggRxFreeBuf(dev, 1); /* 1 for release structure memory */
- /* end of add by honda */
-#endif
-
- zm_msg0_init(ZM_LV_0, "exit");
-
- return 0;
-}
-
-void zfGetWrapperSetting(zdev_t *dev)
-{
- u8_t bPassive;
- u16_t vapId = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-#if 0
- if ((wd->ws.countryIsoName[0] != 0)
- || (wd->ws.countryIsoName[1] != 0)
- || (wd->ws.countryIsoName[2] != '\0')) {
- zfHpGetRegulationTablefromRegionCode(dev,
- zfHpGetRegionCodeFromIsoName(dev, wd->ws.countryIsoName));
- }
-#endif
- zmw_enter_critical_section(dev);
-
- wd->wlanMode = wd->ws.wlanMode;
-
- /* set channel */
- if (wd->ws.frequency) {
- wd->frequency = wd->ws.frequency;
- wd->ws.frequency = 0;
- } else {
- wd->frequency = zfChGetFirstChannel(dev, &bPassive);
-
- if (wd->wlanMode == ZM_MODE_IBSS) {
- if (wd->ws.adhocMode == ZM_ADHOCBAND_A)
- wd->frequency = ZM_CH_A_36;
- else
- wd->frequency = ZM_CH_G_6;
- }
- }
-#ifdef ZM_AP_DEBUG
- /* honda add for debug, 2437 channel 6, 2452 channel 9 */
- wd->frequency = 2437;
- /* end of add by honda */
-#endif
-
- /* set preamble type */
- switch (wd->ws.preambleType) {
- case ZM_PREAMBLE_TYPE_AUTO:
- case ZM_PREAMBLE_TYPE_SHORT:
- case ZM_PREAMBLE_TYPE_LONG:
- wd->preambleType = wd->ws.preambleType;
- break;
- default:
- wd->preambleType = ZM_PREAMBLE_TYPE_SHORT;
- break;
- }
- wd->ws.preambleType = 0;
-
- if (wd->wlanMode == ZM_MODE_AP) {
- vapId = zfwGetVapId(dev);
-
- if (vapId == 0xffff) {
- wd->ap.authAlgo[0] = wd->ws.authMode;
- wd->ap.encryMode[0] = wd->ws.encryMode;
- } else {
- wd->ap.authAlgo[vapId + 1] = wd->ws.authMode;
- wd->ap.encryMode[vapId + 1] = wd->ws.encryMode;
- }
- wd->ws.authMode = 0;
- wd->ws.encryMode = ZM_NO_WEP;
-
- /* Get beaconInterval from WrapperSetting */
- if ((wd->ws.beaconInterval >= 20) &&
- (wd->ws.beaconInterval <= 1000))
- wd->beaconInterval = wd->ws.beaconInterval;
- else
- wd->beaconInterval = 100; /* 100ms */
-
- if (wd->ws.dtim > 0)
- wd->dtim = wd->ws.dtim;
- else
- wd->dtim = 1;
-
-
- wd->ap.qosMode = wd->ws.apWmeEnabled & 0x1;
- wd->ap.uapsdEnabled = (wd->ws.apWmeEnabled & 0x2) >> 1;
- } else {
- wd->sta.authMode = wd->ws.authMode;
- wd->sta.currentAuthMode = wd->ws.authMode;
- wd->sta.wepStatus = wd->ws.wepStatus;
-
- if (wd->ws.beaconInterval)
- wd->beaconInterval = wd->ws.beaconInterval;
- else
- wd->beaconInterval = 0x64;
-
- if (wd->wlanMode == ZM_MODE_IBSS) {
- /* 1. Set default channel 6 (2437MHz) */
- /* wd->frequency = 2437; */
-
- /* 2. Otus support 802.11g Mode */
- if ((wd->ws.adhocMode == ZM_ADHOCBAND_G) ||
- (wd->ws.adhocMode == ZM_ADHOCBAND_BG) ||
- (wd->ws.adhocMode == ZM_ADHOCBAND_ABG))
- wd->wfc.bIbssGMode = 1;
- else
- wd->wfc.bIbssGMode = 0;
-
- /* 3. set short preamble */
- /* wd->sta.preambleType = ZM_PREAMBLE_TYPE_SHORT; */
- }
-
- /* set ATIM window */
- if (wd->ws.atimWindow)
- wd->sta.atimWindow = wd->ws.atimWindow;
- else {
- /* wd->sta.atimWindow = 0x0a; */
- wd->sta.atimWindow = 0;
- }
-
- /* wd->sta.connectingHiddenAP = 1;
- wd->ws.connectingHiddenAP;
- */
- wd->sta.dropUnencryptedPkts = wd->ws.dropUnencryptedPkts;
- wd->sta.ibssJoinOnly = wd->ws.ibssJoinOnly;
-
- if (wd->ws.bDesiredBssid) {
- zfMemoryCopy(wd->sta.desiredBssid,
- wd->ws.desiredBssid, 6);
- wd->sta.bDesiredBssid = TRUE;
- wd->ws.bDesiredBssid = FALSE;
- } else
- wd->sta.bDesiredBssid = FALSE;
-
- /* check ssid */
- if (wd->ws.ssidLen != 0) {
- if ((!zfMemoryIsEqual(wd->ws.ssid, wd->sta.ssid,
- wd->sta.ssidLen)) ||
- (wd->ws.ssidLen != wd->sta.ssidLen) ||
- (wd->sta.authMode == ZM_AUTH_MODE_WPA) ||
- (wd->sta.authMode == ZM_AUTH_MODE_WPAPSK) ||
- (wd->ws.staWmeQosInfo != 0)) {
- /* if u-APSD test(set QosInfo), clear
- connectByReasso to do association
- (not reassociation)
- */
- wd->sta.connectByReasso = FALSE;
- wd->sta.failCntOfReasso = 0;
- wd->sta.pmkidInfo.bssidCount = 0;
-
- wd->sta.ssidLen = wd->ws.ssidLen;
- zfMemoryCopy(wd->sta.ssid, wd->ws.ssid,
- wd->sta.ssidLen);
-
- if (wd->sta.ssidLen < 32)
- wd->sta.ssid[wd->sta.ssidLen] = 0;
- }
- } else {
- /* ANY BSS */
- wd->sta.ssid[0] = 0;
- wd->sta.ssidLen = 0;
- }
-
- wd->sta.wmeEnabled = wd->ws.staWmeEnabled;
- wd->sta.wmeQosInfo = wd->ws.staWmeQosInfo;
-
- }
-
- zmw_leave_critical_section(dev);
-}
-
-u16_t zfWlanEnable(zdev_t *dev)
-{
- u8_t bssid[6] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x0};
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if (wd->wlanMode == ZM_MODE_UNKNOWN) {
- zm_debug_msg0("Unknown Mode...Skip...");
- return 0;
- }
-
- if (wd->wlanMode == ZM_MODE_AP) {
- u16_t vapId;
-
- vapId = zfwGetVapId(dev);
-
- if (vapId == 0xffff) {
- /* AP mode */
- zfApInitStaTbl(dev);
-
- /* AP default parameters */
- wd->bRate = 0xf;
- wd->gRate = 0xff;
- wd->bRateBasic = 0xf;
- wd->gRateBasic = 0x0;
- /* wd->beaconInterval = 100; */
- wd->ap.apBitmap = 1;
- wd->ap.beaconCounter = 0;
- /* wd->ap.vapNumber = 1; //mark by ygwei for Vap */
-
- wd->ap.hideSsid[0] = 0;
- wd->ap.staAgingTimeSec = 10*60;
- wd->ap.staProbingTimeSec = 60;
-
- for (i = 0; i < ZM_MAX_AP_SUPPORT; i++)
- wd->ap.bcmcHead[i] = wd->ap.bcmcTail[i] = 0;
-
- /* wd->ap.uniHead = wd->ap.uniTail = 0; */
-
- /* load AP parameters */
- wd->bRateBasic = wd->ws.bRateBasic;
- wd->gRateBasic = wd->ws.gRateBasic;
- wd->bgMode = wd->ws.bgMode;
- if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0)) {
- wd->ap.ssidLen[0] = wd->ws.ssidLen;
- for (i = 0; i < wd->ws.ssidLen; i++)
- wd->ap.ssid[0][i] = wd->ws.ssid[i];
- wd->ws.ssidLen = 0; /* Reset Wrapper Variable */
- }
-
- if (wd->ap.encryMode[0] == 0)
- wd->ap.capab[0] = 0x001;
- else
- wd->ap.capab[0] = 0x011;
- /* set Short Slot Time bit if not 11b */
- if (wd->ap.wlanType[0] != ZM_WLAN_TYPE_PURE_B)
- wd->ap.capab[0] |= 0x400;
-
- /* wd->ap.vapNumber = 1; //mark by ygwei for Vap Test */
- } else {
-#if 0
- /* VAP Test Code */
- wd->ap.apBitmap = 0x3;
- wd->ap.capab[1] = 0x401;
- wd->ap.ssidLen[1] = 4;
- wd->ap.ssid[1][0] = 'v';
- wd->ap.ssid[1][1] = 'a';
- wd->ap.ssid[1][2] = 'p';
- wd->ap.ssid[1][3] = '1';
- wd->ap.authAlgo[1] = wd->ws.authMode;
- wd->ap.encryMode[1] = wd->ws.encryMode;
- wd->ap.vapNumber = 2;
-#else
- /* VAP Test Code */
- wd->ap.apBitmap = 0x1 | (0x01 << (vapId+1));
-
- if ((wd->ws.ssidLen <= 32) && (wd->ws.ssidLen != 0)) {
- wd->ap.ssidLen[vapId+1] = wd->ws.ssidLen;
- for (i = 0; i < wd->ws.ssidLen; i++)
- wd->ap.ssid[vapId+1][i] =
- wd->ws.ssid[i];
- wd->ws.ssidLen = 0; /* Reset Wrapper Variable */
- }
-
- if (wd->ap.encryMode[vapId+1] == 0)
- wd->ap.capab[vapId+1] = 0x401;
- else
- wd->ap.capab[vapId+1] = 0x411;
-
- wd->ap.authAlgo[vapId+1] = wd->ws.authMode;
- wd->ap.encryMode[vapId+1] = wd->ws.encryMode;
-
- /* Need to be modified when VAP is used */
- /* wd->ap.vapNumber = 2; */
-#endif
- }
-
- wd->ap.vapNumber++;
-
- zfCoreSetFrequency(dev, wd->frequency);
-
- zfInitMacApMode(dev);
-
- /* Disable protection mode */
- zfApSetProtectionMode(dev, 0);
-
- zfApSendBeacon(dev);
- } else { /*if (wd->wlanMode == ZM_MODE_AP) */
-
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
-
- zmw_enter_critical_section(dev);
- wd->sta.oppositeCount = 0; /* reset opposite count */
- /* wd->sta.bAutoReconnect = wd->sta.bAutoReconnectEnabled; */
- /* wd->sta.scanWithSSID = 0; */
- zfStaInitOppositeInfo(dev);
- zmw_leave_critical_section(dev);
-
- zfStaResetStatus(dev, 0);
-
- if ((wd->sta.cmDisallowSsidLength != 0) &&
- (wd->sta.ssidLen == wd->sta.cmDisallowSsidLength) &&
- (zfMemoryIsEqual(wd->sta.ssid, wd->sta.cmDisallowSsid,
- wd->sta.ssidLen)) &&
- (wd->sta.wepStatus == ZM_ENCRYPTION_TKIP)) {/*countermeasures*/
- zm_debug_msg0("countermeasures disallow association");
- } else {
- switch (wd->wlanMode) {
- case ZM_MODE_IBSS:
- /* some registers may be set here */
- if (wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK)
- zfHpSetApStaMode(dev,
- ZM_HAL_80211_MODE_IBSS_WPA2PSK);
- else
- zfHpSetApStaMode(dev,
- ZM_HAL_80211_MODE_IBSS_GENERAL);
-
- zm_msg0_mm(ZM_LV_0, "ZM_MODE_IBSS");
- zfIbssConnectNetwork(dev);
- break;
-
- case ZM_MODE_INFRASTRUCTURE:
- /* some registers may be set here */
- zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA);
-
- zfInfraConnectNetwork(dev);
- break;
-
- case ZM_MODE_PSEUDO:
- /* some registers may be set here */
- zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_STA);
-
- zfUpdateBssid(dev, bssid);
- zfCoreSetFrequency(dev, wd->frequency);
- break;
-
- default:
- break;
- }
- }
-
- }
-
-
- /* if ((wd->wlanMode != ZM_MODE_INFRASTRUCTURE) &&
- (wd->wlanMode != ZM_MODE_AP))
- */
- if (wd->wlanMode == ZM_MODE_PSEUDO) {
- /* Reset Wlan status */
- zfWlanReset(dev);
-
- if (wd->zfcbConnectNotify != NULL)
- wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT,
- wd->sta.bssid);
- zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
- }
-
-
- if (wd->wlanMode == ZM_MODE_AP) {
- if (wd->zfcbConnectNotify != NULL)
- wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT,
- wd->sta.bssid);
- /* zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED); */
- }
-
- /* Assign default Tx Rate */
- if (wd->sta.EnableHT) {
- u32_t oneTxStreamCap;
- oneTxStreamCap = (zfHpCapability(dev) &
- ZM_HP_CAP_11N_ONE_TX_STREAM);
- if (oneTxStreamCap)
- wd->CurrentTxRateKbps = 135000;
- else
- wd->CurrentTxRateKbps = 270000;
- wd->CurrentRxRateKbps = 270000;
- } else {
- wd->CurrentTxRateKbps = 54000;
- wd->CurrentRxRateKbps = 54000;
- }
-
- wd->state = ZM_WLAN_STATE_ENABLED;
-
- return 0;
-}
-
-/* Enable/disable Wlan operation */
-u16_t zfiWlanEnable(zdev_t *dev)
-{
- u16_t ret;
-
- zmw_get_wlan_dev(dev);
-
- zm_msg0_mm(ZM_LV_1, "Enable Wlan");
-
- zfGetWrapperSetting(dev);
-
- zfZeroMemory((u8_t *) &wd->trafTally, sizeof(struct zsTrafTally));
-
- /* Reset cmMicFailureCount to 0 for new association request */
- if (wd->sta.cmMicFailureCount == 1) {
- zfTimerCancel(dev, ZM_EVENT_CM_TIMER);
- wd->sta.cmMicFailureCount = 0;
- }
-
- zfFlushVtxq(dev);
- if ((wd->queueFlushed & 0x10) != 0)
- zfHpUsbReset(dev);
-
- ret = zfWlanEnable(dev);
-
- return ret;
-}
-/* Add a flag named ResetKeyCache to show if KeyCache should be cleared.
- for hostapd in AP mode, if driver receives iwconfig ioctl
- after setting group key, it shouldn't clear KeyCache.
-*/
-u16_t zfiWlanDisable(zdev_t *dev, u8_t ResetKeyCache)
-{
- u16_t i;
- u8_t isConnected;
-
- zmw_get_wlan_dev(dev);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- zmw_declare_for_critical_section();
-#endif
- wd->state = ZM_WLAN_STATE_DISABLED;
-
- zm_msg0_mm(ZM_LV_1, "Disable Wlan");
-
- if (wd->wlanMode != ZM_MODE_AP) {
- isConnected = zfStaIsConnected(dev);
-
- if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) &&
- (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2)) {
- /* send deauthentication frame */
- if (isConnected) {
- /* zfiWlanDeauth(dev, NULL, 0); */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
- wd->sta.bssid, 3, 0, 0);
- /* zmw_debug_msg0("send a Deauth frame!"); */
- }
- }
-
- /* Remove all the connected peer stations */
- if (wd->wlanMode == ZM_MODE_IBSS) {
- wd->sta.ibssBssIsCreator = 0;
- zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR);
- zfStaIbssMonitoring(dev, 1);
- }
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- zmw_enter_critical_section(dev);
- wd->sta.ibssWpa2Psk = 0;
- zmw_leave_critical_section(dev);
-#endif
-
- wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
-
- /* reset connect timeout counter */
- wd->sta.connectTimeoutCount = 0;
-
- /* reset connectState to None */
- wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
-
- /* reset leap enable variable */
- wd->sta.leapEnabled = 0;
-
- /* Disable the RIFS Status/RIFS-like frame count/RIFS count */
- if (wd->sta.rifsState == ZM_RIFS_STATE_DETECTED)
- zfHpDisableRifs(dev);
- wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
- wd->sta.rifsLikeFrameCnt = 0;
- wd->sta.rifsCount = 0;
-
- wd->sta.osRxFilter = 0;
- wd->sta.bSafeMode = 0;
-
- zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
- if (ResetKeyCache)
- zfHpResetKeyCache(dev);
-
- if (isConnected) {
- if (wd->zfcbConnectNotify != NULL)
- wd->zfcbConnectNotify(dev,
- ZM_STATUS_MEDIA_CONNECTION_DISABLED,
- wd->sta.bssid);
- } else {
- if (wd->zfcbConnectNotify != NULL)
- wd->zfcbConnectNotify(dev,
- ZM_STATUS_MEDIA_DISABLED, wd->sta.bssid);
- }
- } else { /* if (wd->wlanMode == ZM_MODE_AP) */
- for (i = 0; i < ZM_MAX_STA_SUPPORT; i++) {
- /* send deauthentication frame */
- if (wd->ap.staTable[i].valid == 1) {
- /* Reason : Sending station is leaving */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
- wd->ap.staTable[i].addr, 3, 0, 0);
- }
- }
-
- if (ResetKeyCache)
- zfHpResetKeyCache(dev);
-
- wd->ap.vapNumber--;
- }
-
- /* stop beacon */
- zfHpDisableBeacon(dev);
-
- /* Flush VTxQ and MmQ */
- zfFlushVtxq(dev);
- /* Flush AP PS queues */
- zfApFlushBufferedPsFrame(dev);
- /* Free buffer in defragment list*/
- zfAgingDefragList(dev, 1);
-
-#ifdef ZM_ENABLE_AGGREGATION
- /* add by honda */
- zfAggRxFreeBuf(dev, 0); /* 1 for release structure memory */
- /* end of add by honda */
-#endif
-
- /* Clear the information for the peer stations
- of IBSS or AP of Station mode
- */
- zfZeroMemory((u8_t *)wd->sta.oppositeInfo,
- sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT);
-
- /* Turn off Software WEP/TKIP */
- if (wd->sta.SWEncryptEnable != 0) {
- zm_debug_msg0("Disable software encryption");
- zfStaDisableSWEncryption(dev);
- }
-
- /* Improve WEP/TKIP performance with HT AP,
- detail information please look bug#32495 */
- /* zfHpSetTTSIFSTime(dev, 0x8); */
-
- return 0;
-}
-
-u16_t zfiWlanSuspend(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* Change the HAL state to init so that any packet
- can't be transmitted between resume & HAL reinit.
- This would cause the chip hang issue in OTUS.
- */
- zmw_enter_critical_section(dev);
- wd->halState = ZM_HAL_STATE_INIT;
- zmw_leave_critical_section(dev);
-
- return 0;
-}
-
-u16_t zfiWlanResume(zdev_t *dev, u8_t doReconn)
-{
- u16_t ret;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* Redownload firmware, Reinit MAC,PHY,RF */
- zfHpReinit(dev, wd->frequency);
-
- /* Set channel according to AP's configuration */
- zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40,
- wd->ExtOffset, NULL, 1);
-
- zfHpSetMacAddress(dev, wd->macAddr, 0);
-
- /* Start Rx */
- zfHpStartRecv(dev);
-
- zfFlushVtxq(dev);
-
- if (wd->wlanMode != ZM_MODE_INFRASTRUCTURE &&
- wd->wlanMode != ZM_MODE_IBSS)
- return 1;
-
- zm_msg0_mm(ZM_LV_1, "Resume Wlan");
- if ((zfStaIsConnected(dev)) || (zfStaIsConnecting(dev))) {
- if (doReconn == 1) {
- zm_msg0_mm(ZM_LV_1, "Re-connect...");
- zmw_enter_critical_section(dev);
- wd->sta.connectByReasso = FALSE;
- zmw_leave_critical_section(dev);
-
- zfWlanEnable(dev);
- } else if (doReconn == 0)
- zfHpSetRollCallTable(dev);
- }
-
- ret = 0;
-
- return ret;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiWlanFlushAllQueuedBuffers */
-/* Flush Virtual TxQ, MmQ, PS frames and defragment list */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-void zfiWlanFlushAllQueuedBuffers(zdev_t *dev)
-{
- /* Flush VTxQ and MmQ */
- zfFlushVtxq(dev);
- /* Flush AP PS queues */
- zfApFlushBufferedPsFrame(dev);
- /* Free buffer in defragment list*/
- zfAgingDefragList(dev, 1);
-}
-
-/* Do WLAN site survey */
-u16_t zfiWlanScan(zdev_t *dev)
-{
- u16_t ret = 1;
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg0("");
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (wd->wlanMode == ZM_MODE_AP) {
- wd->heartBeatNotification |= ZM_BSSID_LIST_SCAN;
- wd->sta.scanFrequency = 0;
- /* wd->sta.pUpdateBssList->bssCount = 0; */
- ret = 0;
- } else {
-#if 0
- if (!zfStaBlockWlanScan(dev)) {
- zm_debug_msg0("scan request");
- /*zfTimerSchedule(dev, ZM_EVENT_SCAN, ZM_TICK_ZERO);*/
- ret = 0;
- goto start_scan;
- }
-#else
- goto start_scan;
-#endif
- }
-
- zmw_leave_critical_section(dev);
-
- return ret;
-
-start_scan:
- zmw_leave_critical_section(dev);
-
- if (wd->ledStruct.LEDCtrlFlagFromReg & ZM_LED_CTRL_FLAG_ALPHA) {
- /* flag for Alpha */
- wd->ledStruct.LEDCtrlFlag |= ZM_LED_CTRL_FLAG_ALPHA;
- }
-
- ret = zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
-
- zm_debug_msg1("ret = ", ret);
-
- return ret;
-}
-
-
-/* rate */
-/* 0 : AUTO */
-/* 1 : CCK 1M */
-/* 2 : CCK 2M */
-/* 3 : CCK 5.5M */
-/* 4 : CCK 11M */
-/* 5 : OFDM 6M */
-/* 6 : OFDM 9M */
-/* 7 : OFDM 12M */
-/* 8 : OFDM 18M */
-/* 9 : OFDM 24M */
-/* 10 : OFDM 36M */
-/* 11 : OFDM 48M */
-/* 12 : OFDM 54M */
-/* 13 : MCS 0 */
-/* 28 : MCS 15 */
-u16_t zcRateToMCS[] =
- {0xff, 0, 1, 2, 3, 0xb, 0xf, 0xa, 0xe, 0x9, 0xd, 0x8, 0xc};
-u16_t zcRateToMT[] = {0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1};
-
-u16_t zfiWlanSetTxRate(zdev_t *dev, u16_t rate)
-{
- /* jhlee HT 0 */
- zmw_get_wlan_dev(dev);
-
- if (rate <= 12) {
- wd->txMCS = zcRateToMCS[rate];
- wd->txMT = zcRateToMT[rate];
- return ZM_SUCCESS;
- } else if ((rate <= 28) || (rate == 13 + 32)) {
- wd->txMCS = rate - 12 - 1;
- wd->txMT = 2;
- return ZM_SUCCESS;
- }
-
- return ZM_ERR_INVALID_TX_RATE;
-}
-
-const u32_t zcRateIdToKbps40M[] =
-{
- 1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M , 0 1 2 3 */
- 6000, 9000, 12000, 18000, /* 6M 9M 12M 18M , 4 5 6 7 */
- 24000, 36000, 48000, 54000, /* 24M 36M 48M 54M , 8 9 10 11 */
- 13500, 27000, 40500, 54000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15 */
- 81000, 108000, 121500, 135000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19 */
- 27000, 54000, 81000, 108000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23 */
- 162000, 216000, 243000, 270000, /*MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
- 270000, 300000, 150000 /* MCS14SG, MCS15SG, MCS7SG , 28 29 30 */
-};
-
-const u32_t zcRateIdToKbps20M[] =
-{
- 1000, 2000, 5500, 11000, /* 1M, 2M, 5M, 11M , 0 1 2 3 */
- 6000, 9000, 12000, 18000, /* 6M 9M 12M 18M , 4 5 6 7 */
- 24000, 36000, 48000, 54000, /* 24M 36M 48M 54M , 8 9 10 11 */
- 6500, 13000, 19500, 26000, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15 */
- 39000, 52000, 58500, 65000, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19 */
- 13000, 26000, 39000, 52000, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23 */
- 78000, 104000, 117000, 130000, /* MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
- 130000, 144400, 72200 /* MCS14SG, MCS15SG, MSG7SG , 28 29 30 */
-};
-
-u32_t zfiWlanQueryTxRate(zdev_t *dev)
-{
- u8_t rateId = 0xff;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* If Tx rate had not been trained, return maximum Tx rate instead */
- if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) &&
- (zfStaIsConnected(dev))) {
- zmw_enter_critical_section(dev);
- /* Not in fixed rate mode */
- if (wd->txMCS == 0xff) {
- if ((wd->sta.oppositeInfo[0].rcCell.flag &
- ZM_RC_TRAINED_BIT) == 0)
- rateId = wd->sta.oppositeInfo[0].rcCell. \
- operationRateSet[wd->sta.oppositeInfo[0]. \
- rcCell.operationRateCount-1];
- else
- rateId = wd->sta.oppositeInfo[0].rcCell. \
- operationRateSet[wd->sta.oppositeInfo[0]. \
- rcCell.currentRateIndex];
- }
- zmw_leave_critical_section(dev);
- }
-
- if (rateId != 0xff) {
- if (wd->sta.htCtrlBandwidth)
- return zcRateIdToKbps40M[rateId];
- else
- return zcRateIdToKbps20M[rateId];
- } else
- return wd->CurrentTxRateKbps;
-}
-
-void zfWlanUpdateRxRate(zdev_t *dev, struct zsAdditionInfo *addInfo)
-{
- u32_t rxRateKbps;
- zmw_get_wlan_dev(dev);
- /* zm_msg1_mm(ZM_LV_0, "addInfo->Tail.Data.RxMacStatus =",
- * addInfo->Tail.Data.RxMacStatus & 0x03);
- */
-
- /* b5~b4: MPDU indication. */
- /* 00: Single MPDU. */
- /* 10: First MPDU of A-MPDU. */
- /* 11: Middle MPDU of A-MPDU. */
- /* 01: Last MPDU of A-MPDU. */
- /* Only First MPDU and Single MPDU have PLCP header */
- /* First MPDU : (mpduInd & 0x30) == 0x00 */
- /* Single MPDU : (mpduInd & 0x30) == 0x20 */
- if ((addInfo->Tail.Data.RxMacStatus & 0x10) == 0) {
- /* Modulation type */
- wd->modulationType = addInfo->Tail.Data.RxMacStatus & 0x03;
- switch (wd->modulationType) {
- /* CCK mode */
- case 0x0:
- wd->rateField = addInfo->PlcpHeader[0] & 0xff;
- wd->rxInfo = 0;
- break;
- /* Legacy-OFDM mode */
- case 0x1:
- wd->rateField = addInfo->PlcpHeader[0] & 0x0f;
- wd->rxInfo = 0;
- break;
- /* HT-OFDM mode */
- case 0x2:
- wd->rateField = addInfo->PlcpHeader[3];
- wd->rxInfo = addInfo->PlcpHeader[6];
- break;
- default:
- break;
- }
-
- rxRateKbps = zfUpdateRxRate(dev);
- if (wd->CurrentRxRateUpdated == 1) {
- if (rxRateKbps > wd->CurrentRxRateKbps)
- wd->CurrentRxRateKbps = rxRateKbps;
- } else {
- wd->CurrentRxRateKbps = rxRateKbps;
- wd->CurrentRxRateUpdated = 1;
- }
- }
-}
-
-#if 0
-u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
- 24000, 12000, 6000, 54000, 36000, 18000, 9000};
-u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500,
- 65000, 13000, 26000, 39000, 52000, 78000, 104000,
- 117000, 130000};
-u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000,
- 72200, 14400, 28900, 43300, 57800, 86700, 115600,
- 130000, 144400};
-u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000,
- 121500, 135000, 27000, 54000, 81000, 108000,
- 162000, 216000, 243000, 270000};
-u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000,
- 135000, 150000, 30000, 60000, 90000, 120000,
- 180000, 240000, 270000, 300000};
-#endif
-
-extern u16_t zcIndextoRateBG[16];
-extern u32_t zcIndextoRateN20L[16];
-extern u32_t zcIndextoRateN20S[16];
-extern u32_t zcIndextoRateN40L[16];
-extern u32_t zcIndextoRateN40S[16];
-
-u32_t zfiWlanQueryRxRate(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->CurrentRxRateUpdated = 0;
- return wd->CurrentRxRateKbps;
-}
-
-u32_t zfUpdateRxRate(zdev_t *dev)
-{
- u8_t mcs, bandwidth;
- u32_t rxRateKbps = 130000;
- zmw_get_wlan_dev(dev);
-
- switch (wd->modulationType) {
- /* CCK mode */
- case 0x0:
- switch (wd->rateField) {
- case 0x0a:
- rxRateKbps = 1000;
- break;
- case 0x14:
- rxRateKbps = 2000;
-
- case 0x37:
- rxRateKbps = 5500;
- break;
- case 0x6e:
- rxRateKbps = 11000;
- break;
- default:
- break;
- }
- break;
- /* Legacy-OFDM mode */
- case 0x1:
- if (wd->rateField <= 15)
- rxRateKbps = zcIndextoRateBG[wd->rateField];
- break;
- /* HT-OFDM mode */
- case 0x2:
- mcs = wd->rateField & 0x7F;
- bandwidth = wd->rateField & 0x80;
- if (mcs <= 15) {
- if (bandwidth != 0) {
- if ((wd->rxInfo & 0x80) != 0) {
- /* Short GI 40 MHz MIMO Rate */
- rxRateKbps = zcIndextoRateN40S[mcs];
- } else {
- /* Long GI 40 MHz MIMO Rate */
- rxRateKbps = zcIndextoRateN40L[mcs];
- }
- } else {
- if ((wd->rxInfo & 0x80) != 0) {
- /* Short GI 20 MHz MIMO Rate */
- rxRateKbps = zcIndextoRateN20S[mcs];
- } else {
- /* Long GI 20 MHz MIMO Rate */
- rxRateKbps = zcIndextoRateN20L[mcs];
- }
- }
- }
- break;
- default:
- break;
- }
- /* zm_msg1_mm(ZM_LV_0, "wd->CurrentRxRateKbps=",
- wd->CurrentRxRateKbps);
- */
-
- /* ToDo: use bandwith field to define 40MB */
- return rxRateKbps;
-}
-
-/* Get WLAN stastics */
-u16_t zfiWlanGetStatistics(zdev_t *dev)
-{
- /* Return link statistics */
- return 0;
-}
-
-u16_t zfiWlanReset(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->state = ZM_WLAN_STATE_DISABLED;
-
- return zfWlanReset(dev);
-}
-
-/* Reset WLAN */
-u16_t zfWlanReset(zdev_t *dev)
-{
- u8_t isConnected;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zm_debug_msg0("zfWlanReset");
-
- isConnected = zfStaIsConnected(dev);
-
- /* if ( wd->wlanMode != ZM_MODE_AP ) */
- {
- if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) &&
- (wd->sta.currentAuthMode != ZM_AUTH_MODE_WPA2)) {
- /* send deauthentication frame */
- if (isConnected) {
- /* zfiWlanDeauth(dev, NULL, 0); */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
- wd->sta.bssid, 3, 0, 0);
- /* zmw_debug_msg0("send a Deauth frame!"); */
- }
- }
- }
-
- zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
- zfHpResetKeyCache(dev);
-
- if (isConnected) {
- /* zfiWlanDisable(dev); */
- if (wd->zfcbConnectNotify != NULL)
- wd->zfcbConnectNotify(dev,
- ZM_STATUS_MEDIA_CONNECTION_RESET, wd->sta.bssid);
- } else {
- if (wd->zfcbConnectNotify != NULL)
- wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_RESET,
- wd->sta.bssid);
- }
-
- /* stop beacon */
- zfHpDisableBeacon(dev);
-
- /* Free buffer in defragment list*/
- zfAgingDefragList(dev, 1);
-
- /* Flush VTxQ and MmQ */
- zfFlushVtxq(dev);
-
-#ifdef ZM_ENABLE_AGGREGATION
- /* add by honda */
- zfAggRxFreeBuf(dev, 0); /* 1 for release structure memory */
- /* end of add by honda */
-#endif
-
- zfStaRefreshBlockList(dev, 1);
-
- zmw_enter_critical_section(dev);
-
- zfTimerCancel(dev, ZM_EVENT_IBSS_MONITOR);
- zfTimerCancel(dev, ZM_EVENT_CM_BLOCK_TIMER);
- zfTimerCancel(dev, ZM_EVENT_CM_DISCONNECT);
-
- wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
- wd->sta.connectByReasso = FALSE;
- wd->sta.cmDisallowSsidLength = 0;
- wd->sta.bAutoReconnect = 0;
- wd->sta.InternalScanReq = 0;
- wd->sta.encryMode = ZM_NO_WEP;
- wd->sta.wepStatus = ZM_ENCRYPTION_WEP_DISABLED;
- wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
- wd->sta.cmMicFailureCount = 0;
- wd->sta.ibssBssIsCreator = 0;
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- wd->sta.ibssWpa2Psk = 0;
-#endif
- /* reset connect timeout counter */
- wd->sta.connectTimeoutCount = 0;
-
- /* reset leap enable variable */
- wd->sta.leapEnabled = 0;
-
- /* Reset the RIFS Status / RIFS-like frame count / RIFS count */
- if (wd->sta.rifsState == ZM_RIFS_STATE_DETECTED)
- zfHpDisableRifs(dev);
- wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
- wd->sta.rifsLikeFrameCnt = 0;
- wd->sta.rifsCount = 0;
-
- wd->sta.osRxFilter = 0;
- wd->sta.bSafeMode = 0;
-
- /* Clear the information for the peer
- stations of IBSS or AP of Station mode
- */
- zfZeroMemory((u8_t *)wd->sta.oppositeInfo,
- sizeof(struct zsOppositeInfo) * ZM_MAX_OPPOSITE_COUNT);
-
- zmw_leave_critical_section(dev);
-
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_EXTERNAL);
-
- /* Turn off Software WEP/TKIP */
- if (wd->sta.SWEncryptEnable != 0) {
- zm_debug_msg0("Disable software encryption");
- zfStaDisableSWEncryption(dev);
- }
-
- /* Improve WEP/TKIP performance with HT AP,
- detail information please look bug#32495
- */
- /* zfHpSetTTSIFSTime(dev, 0x8); */
-
- /* Keep Pseudo mode */
- if (wd->wlanMode != ZM_MODE_PSEUDO)
- wd->wlanMode = ZM_MODE_INFRASTRUCTURE;
-
- return 0;
-}
-
-/* Deauthenticate a STA */
-u16_t zfiWlanDeauth(zdev_t *dev, u16_t *macAddr, u16_t reason)
-{
- zmw_get_wlan_dev(dev);
-
- if (wd->wlanMode == ZM_MODE_AP) {
- /* u16_t id; */
-
- /*
- * we will reset all key in zfHpResetKeyCache() when call
- * zfiWlanDisable(), if we want to reset PairwiseKey for each
- * sta, need to use a nullAddr to let keyindex not match.
- * otherwise hardware will still find PairwiseKey when AP change
- * encryption mode from WPA to WEP
- */
-
- /*
- id = zfApFindSta(dev, macAddr);
- if (id != 0xffff)
- {
- u32_t key[8];
- u16_t nullAddr[3] = { 0x0, 0x0, 0x0 };
-
- if (wd->ap.staTable[i].encryMode != ZM_NO_WEP)
- {
- zfHpSetApPairwiseKey(dev, nullAddr,
- ZM_NO_WEP, &key[0], &key[4], i+1);
- }
- //zfHpSetApPairwiseKey(dev, (u16_t *)macAddr,
- // ZM_NO_WEP, &key[0], &key[4], id+1);
- wd->ap.staTable[id].encryMode = ZM_NO_WEP;
- wd->ap.staTable[id].keyIdx = 0xff;
- }
- */
-
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, macAddr,
- reason, 0, 0);
- } else
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH,
- wd->sta.bssid, 3, 0, 0);
-
- /* Issue DEAUTH command to FW */
- return 0;
-}
-
-
-/* XP packet filter feature : */
-/* 1=>enable: All multicast address packets, not just the ones */
-/* enumerated in the multicast address list. */
-/* 0=>disable */
-void zfiWlanSetAllMulticast(zdev_t *dev, u32_t setting)
-{
- zmw_get_wlan_dev(dev);
- zm_msg1_mm(ZM_LV_0, "sta.bAllMulticast = ", setting);
- wd->sta.bAllMulticast = (u8_t)setting;
-}
-
-
-/* HT configure API */
-void zfiWlanSetHTCtrl(zdev_t *dev, u32_t *setting, u32_t forceTxTPC)
-{
- zmw_get_wlan_dev(dev);
-
- wd->preambleType = (u8_t)setting[0];
- wd->sta.preambleTypeHT = (u8_t)setting[1];
- wd->sta.htCtrlBandwidth = (u8_t)setting[2];
- wd->sta.htCtrlSTBC = (u8_t)setting[3];
- wd->sta.htCtrlSG = (u8_t)setting[4];
- wd->sta.defaultTA = (u8_t)setting[5];
- wd->enableAggregation = (u8_t)setting[6];
- wd->enableWDS = (u8_t)setting[7];
-
- wd->forceTxTPC = forceTxTPC;
-}
-
-/* FB50 in OS XP, RD private test code */
-void zfiWlanQueryHTCtrl(zdev_t *dev, u32_t *setting, u32_t *forceTxTPC)
-{
- zmw_get_wlan_dev(dev);
-
- setting[0] = wd->preambleType;
- setting[1] = wd->sta.preambleTypeHT;
- setting[2] = wd->sta.htCtrlBandwidth;
- setting[3] = wd->sta.htCtrlSTBC;
- setting[4] = wd->sta.htCtrlSG;
- setting[5] = wd->sta.defaultTA;
- setting[6] = wd->enableAggregation;
- setting[7] = wd->enableWDS;
-
- *forceTxTPC = wd->forceTxTPC;
-}
-
-void zfiWlanDbg(zdev_t *dev, u8_t setting)
-{
- zmw_get_wlan_dev(dev);
-
- wd->enableHALDbgInfo = setting;
-}
-
-/* FB50 in OS XP, RD private test code */
-void zfiWlanSetRxPacketDump(zdev_t *dev, u32_t setting)
-{
- zmw_get_wlan_dev(dev);
- if (setting)
- wd->rxPacketDump = 1; /* enable */
- else
- wd->rxPacketDump = 0; /* disable */
-}
-
-
-/* FB50 in OS XP, RD private test code */
-/* Tally */
-void zfiWlanResetTally(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- wd->commTally.txUnicastFrm = 0; /* txUnicastFrames */
- wd->commTally.txMulticastFrm = 0; /* txMulticastFrames */
- wd->commTally.txUnicastOctets = 0; /* txUniOctets byte size */
- wd->commTally.txMulticastOctets = 0; /* txMultiOctets byte size */
- wd->commTally.txFrmUpperNDIS = 0;
- wd->commTally.txFrmDrvMgt = 0;
- wd->commTally.RetryFailCnt = 0;
- wd->commTally.Hw_TotalTxFrm = 0; /* Hardware total Tx Frame */
- wd->commTally.Hw_RetryCnt = 0; /* txMultipleRetriesFrames */
- wd->commTally.Hw_UnderrunCnt = 0;
- wd->commTally.DriverRxFrmCnt = 0;
- wd->commTally.rxUnicastFrm = 0; /* rxUnicastFrames */
- wd->commTally.rxMulticastFrm = 0; /* rxMulticastFrames */
- wd->commTally.NotifyNDISRxFrmCnt = 0;
- wd->commTally.rxUnicastOctets = 0; /* rxUniOctets byte size */
- wd->commTally.rxMulticastOctets = 0; /* rxMultiOctets byte size */
- wd->commTally.DriverDiscardedFrm = 0; /* Discard by ValidateFrame */
- wd->commTally.LessThanDataMinLen = 0;
- wd->commTally.GreaterThanMaxLen = 0;
- wd->commTally.DriverDiscardedFrmCauseByMulticastList = 0;
- wd->commTally.DriverDiscardedFrmCauseByFrmCtrl = 0;
- wd->commTally.rxNeedFrgFrm = 0; /* need more frg frm */
- wd->commTally.DriverRxMgtFrmCnt = 0;
- wd->commTally.rxBroadcastFrm = 0;/* Receive broadcast frame count */
- wd->commTally.rxBroadcastOctets = 0;/*Receive broadcast framebyte size*/
- wd->commTally.Hw_TotalRxFrm = 0;
- wd->commTally.Hw_CRC16Cnt = 0; /* rxPLCPCRCErrCnt */
- wd->commTally.Hw_CRC32Cnt = 0; /* rxCRC32ErrCnt */
- wd->commTally.Hw_DecrypErr_UNI = 0;
- wd->commTally.Hw_DecrypErr_Mul = 0;
- wd->commTally.Hw_RxFIFOOverrun = 0;
- wd->commTally.Hw_RxTimeOut = 0;
- wd->commTally.LossAP = 0;
-
- wd->commTally.Tx_MPDU = 0;
- wd->commTally.BA_Fail = 0;
- wd->commTally.Hw_Tx_AMPDU = 0;
- wd->commTally.Hw_Tx_MPDU = 0;
-
- wd->commTally.txQosDropCount[0] = 0;
- wd->commTally.txQosDropCount[1] = 0;
- wd->commTally.txQosDropCount[2] = 0;
- wd->commTally.txQosDropCount[3] = 0;
- wd->commTally.txQosDropCount[4] = 0;
-
- wd->commTally.Hw_RxMPDU = 0;
- wd->commTally.Hw_RxDropMPDU = 0;
- wd->commTally.Hw_RxDelMPDU = 0;
-
- wd->commTally.Hw_RxPhyMiscError = 0;
- wd->commTally.Hw_RxPhyXRError = 0;
- wd->commTally.Hw_RxPhyOFDMError = 0;
- wd->commTally.Hw_RxPhyCCKError = 0;
- wd->commTally.Hw_RxPhyHTError = 0;
- wd->commTally.Hw_RxPhyTotalCount = 0;
-
-#if (defined(GCCK) && defined(OFDM))
- wd->commTally.rx11bDataFrame = 0;
- wd->commTally.rxOFDMDataFrame = 0;
-#endif
-
- zmw_leave_critical_section(dev);
-}
-
-/* FB50 in OS XP, RD private test code */
-void zfiWlanQueryTally(zdev_t *dev, struct zsCommTally *tally)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->commTally,
- sizeof(struct zsCommTally));
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanQueryTrafTally(zdev_t *dev, struct zsTrafTally *tally)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- zfMemoryCopy((u8_t *)tally, (u8_t *)&wd->trafTally,
- sizeof(struct zsTrafTally));
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanQueryMonHalRxInfo(zdev_t *dev, struct zsMonHalRxInfo *monHalRxInfo)
-{
- zfHpQueryMonHalRxInfo(dev, (u8_t *)monHalRxInfo);
-}
-
-/* parse the modeMDKEnable to DrvCore */
-void zfiDKEnable(zdev_t *dev, u32_t enable)
-{
- zmw_get_wlan_dev(dev);
-
- wd->modeMDKEnable = enable;
- zm_debug_msg1("modeMDKEnable = ", wd->modeMDKEnable);
-}
-
-/* airoPeek */
-u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->swSniffer;
-}
-
-/* airoPeek */
-void zfiWlanSetPacketTypePromiscuous(zdev_t *dev, u32_t setValue)
-{
- zmw_get_wlan_dev(dev);
-
- wd->swSniffer = setValue;
- zm_msg1_mm(ZM_LV_0, "wd->swSniffer ", wd->swSniffer);
- if (setValue) {
- /* write register for sniffer mode */
- zfHpSetSnifferMode(dev, 1);
- zm_msg0_mm(ZM_LV_1, "enable sniffer mode");
- } else {
- zfHpSetSnifferMode(dev, 0);
- zm_msg0_mm(ZM_LV_0, "disalbe sniffer mode");
- }
-}
-
-void zfiWlanSetXLinkMode(zdev_t *dev, u32_t setValue)
-{
- zmw_get_wlan_dev(dev);
-
- wd->XLinkMode = setValue;
- if (setValue) {
- /* write register for sniffer mode */
- zfHpSetSnifferMode(dev, 1);
- } else
- zfHpSetSnifferMode(dev, 0);
-}
-
-extern void zfStaChannelManagement(zdev_t *dev, u8_t scan);
-
-void zfiSetChannelManagement(zdev_t *dev, u32_t setting)
-{
- zmw_get_wlan_dev(dev);
-
- switch (setting) {
- case 1:
- wd->sta.EnableHT = 1;
- wd->BandWidth40 = 1;
- wd->ExtOffset = 1;
- break;
- case 3:
- wd->sta.EnableHT = 1;
- wd->BandWidth40 = 1;
- wd->ExtOffset = 3;
- break;
- case 0:
- wd->sta.EnableHT = 1;
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
- break;
- default:
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
- break;
- }
-
- zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
- wd->ExtOffset, NULL);
-}
-
-void zfiSetRifs(zdev_t *dev, u16_t setting)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.ie.HtInfo.ChannelInfo |= ExtHtCap_RIFSMode;
- wd->sta.EnableHT = 1;
-
- switch (setting) {
- case 0:
- wd->sta.HT2040 = 0;
- /* zfHpSetRifs(dev, 1, 0,
- * (wd->sta.currentFrequency < 3000)? 1:0);
- */
- break;
- case 1:
- wd->sta.HT2040 = 1;
- /* zfHpSetRifs(dev, 1, 1,
- * (wd->sta.currentFrequency < 3000)? 1:0);
- */
- break;
- default:
- wd->sta.HT2040 = 0;
- /* zfHpSetRifs(dev, 1, 0,
- * (wd->sta.currentFrequency < 3000)? 1:0);
- */
- break;
- }
-}
-
-void zfiCheckRifs(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- if (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
- ;
- /* zfHpSetRifs(dev, wd->sta.EnableHT, wd->sta.HT2040,
- * (wd->sta.currentFrequency < 3000)? 1:0);
- */
-}
-
-void zfiSetReorder(zdev_t *dev, u16_t value)
-{
- zmw_get_wlan_dev(dev);
-
- wd->reorder = value;
-}
-
-void zfiSetSeqDebug(zdev_t *dev, u16_t value)
-{
- zmw_get_wlan_dev(dev);
-
- wd->seq_debug = value;
-}
diff --git a/drivers/staging/otus/80211core/cfunc.c b/drivers/staging/otus/80211core/cfunc.c
deleted file mode 100644
index 3b9341b..0000000
--- a/drivers/staging/otus/80211core/cfunc.c
+++ /dev/null
@@ -1,1226 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-
-u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType)
-{
- zmw_get_wlan_dev(dev);
-
- /* For AP's rate adaption */
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- return 0;
- }
-
- /* For STA's rate adaption */
- if ( (frameType & 0x0c) == ZM_WLAN_DATA_FRAME )
- {
- if ( ZM_IS_MULTICAST(dst_mac) )
- {
- return wd->sta.mTxRate;
- }
- else
- {
- return wd->sta.uTxRate;
- }
- }
-
- return wd->sta.mmTxRate;
-}
-
-void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
- u16_t offset, u16_t length)
-{
- u16_t i;
-
- for(i=0; i<length;i++)
- {
- zmw_tx_buf_writeb(dev, buf, offset+i, src[i]);
- }
-}
-
-void zfCopyToRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
- u16_t offset, u16_t length)
-{
- u16_t i;
-
- for(i=0; i<length;i++)
- {
- zmw_rx_buf_writeb(dev, buf, offset+i, src[i]);
- }
-}
-
-void zfCopyFromIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
- u16_t offset, u16_t length)
-{
- u16_t i;
-
- for(i=0; i<length; i++)
- {
- dst[i] = zmw_tx_buf_readb(dev, buf, offset+i);
- }
-}
-
-void zfCopyFromRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
- u16_t offset, u16_t length)
-{
- u16_t i;
-
- for(i=0; i<length; i++)
- {
- dst[i] = zmw_rx_buf_readb(dev, buf, offset+i);
- }
-}
-
-#if 1
-void zfMemoryCopy(u8_t* dst, u8_t* src, u16_t length)
-{
- zfwMemoryCopy(dst, src, length);
-}
-
-void zfMemoryMove(u8_t* dst, u8_t* src, u16_t length)
-{
- zfwMemoryMove(dst, src, length);
-}
-
-void zfZeroMemory(u8_t* va, u16_t length)
-{
- zfwZeroMemory(va, length);
-}
-
-u8_t zfMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length)
-{
- return zfwMemoryIsEqual(m1, m2, length);
-}
-#endif
-
-u8_t zfRxBufferEqualToStr(zdev_t* dev, zbuf_t* buf,
- const u8_t* str, u16_t offset, u16_t length)
-{
- u16_t i;
- u8_t ch;
-
- for(i=0; i<length; i++)
- {
- ch = zmw_rx_buf_readb(dev, buf, offset+i);
- if ( ch != str[i] )
- {
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
-void zfTxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
- u16_t dstOffset, u16_t srcOffset, u16_t length)
-{
- u16_t i;
-
- for(i=0; i<length; i++)
- {
- zmw_tx_buf_writeb(dev, dst, dstOffset+i,
- zmw_tx_buf_readb(dev, src, srcOffset+i));
- }
-}
-
-void zfRxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
- u16_t dstOffset, u16_t srcOffset, u16_t length)
-{
- u16_t i;
-
- for(i=0; i<length; i++)
- {
- zmw_rx_buf_writeb(dev, dst, dstOffset+i,
- zmw_rx_buf_readb(dev, src, srcOffset+i));
- }
-}
-
-
-void zfCollectHWTally(zdev_t*dev, u32_t* rsp, u8_t id)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (id == 0)
- {
- wd->commTally.Hw_UnderrunCnt += (0xFFFF & rsp[1]);
- wd->commTally.Hw_TotalRxFrm += rsp[2];
- wd->commTally.Hw_CRC32Cnt += rsp[3];
- wd->commTally.Hw_CRC16Cnt += rsp[4];
- #ifdef ZM_ENABLE_NATIVE_WIFI
- /* These code are here to satisfy Vista DTM */
- wd->commTally.Hw_DecrypErr_UNI += ((rsp[5]>50) && (rsp[5]<60))?50:rsp[5];
- #else
- wd->commTally.Hw_DecrypErr_UNI += rsp[5];
- #endif
- wd->commTally.Hw_RxFIFOOverrun += rsp[6];
- wd->commTally.Hw_DecrypErr_Mul += rsp[7];
- wd->commTally.Hw_RetryCnt += rsp[8];
- wd->commTally.Hw_TotalTxFrm += rsp[9];
- wd->commTally.Hw_RxTimeOut +=rsp[10];
-
- wd->commTally.Tx_MPDU += rsp[11];
- wd->commTally.BA_Fail += rsp[12];
- wd->commTally.Hw_Tx_AMPDU += rsp[13];
- wd->commTally.Hw_Tx_MPDU += rsp[14];
- wd->commTally.RateCtrlTxMPDU += rsp[11];
- wd->commTally.RateCtrlBAFail += rsp[12];
- }
- else
- {
- wd->commTally.Hw_RxMPDU += rsp[1];
- wd->commTally.Hw_RxDropMPDU += rsp[2];
- wd->commTally.Hw_RxDelMPDU += rsp[3];
-
- wd->commTally.Hw_RxPhyMiscError += rsp[4];
- wd->commTally.Hw_RxPhyXRError += rsp[5];
- wd->commTally.Hw_RxPhyOFDMError += rsp[6];
- wd->commTally.Hw_RxPhyCCKError += rsp[7];
- wd->commTally.Hw_RxPhyHTError += rsp[8];
- wd->commTally.Hw_RxPhyTotalCount += rsp[9];
- }
-
- zmw_leave_critical_section(dev);
-
- if (id == 0)
- {
- zm_msg1_mm(ZM_LV_1, "rsplen =", rsp[0]);
- zm_msg1_mm(ZM_LV_1, "Hw_UnderrunCnt = ", (0xFFFF & rsp[1]));
- zm_msg1_mm(ZM_LV_1, "Hw_TotalRxFrm = ", rsp[2]);
- zm_msg1_mm(ZM_LV_1, "Hw_CRC32Cnt = ", rsp[3]);
- zm_msg1_mm(ZM_LV_1, "Hw_CRC16Cnt = ", rsp[4]);
- zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", rsp[5]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxFIFOOverrun = ", rsp[6]);
- zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", rsp[7]);
- zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", rsp[8]);
- zm_msg1_mm(ZM_LV_1, "Hw_TotalTxFrm = ", rsp[9]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxTimeOut = ", rsp[10]);
- zm_msg1_mm(ZM_LV_1, "Tx_MPDU = ", rsp[11]);
- zm_msg1_mm(ZM_LV_1, "BA_Fail = ", rsp[12]);
- zm_msg1_mm(ZM_LV_1, "Hw_Tx_AMPDU = ", rsp[13]);
- zm_msg1_mm(ZM_LV_1, "Hw_Tx_MPDU = ", rsp[14]);
- }
- else
- {
- zm_msg1_mm(ZM_LV_1, "rsplen = ", rsp[0]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", (0xFFFF & rsp[1]));
- zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", rsp[2]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", rsp[3]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", rsp[4]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", rsp[5]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", rsp[6]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", rsp[7]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", rsp[8]);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", rsp[9]);
- }
-
-}
-
-/* Timer related functions */
-void zfTimerInit(zdev_t* dev)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg0("");
-
- wd->timerList.freeCount = ZM_MAX_TIMER_COUNT;
- wd->timerList.head = &(wd->timerList.list[0]);
- wd->timerList.tail = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-1]);
- wd->timerList.head->pre = NULL;
- wd->timerList.head->next = &(wd->timerList.list[1]);
- wd->timerList.tail->pre = &(wd->timerList.list[ZM_MAX_TIMER_COUNT-2]);
- wd->timerList.tail->next = NULL;
-
- for( i=1; i<(ZM_MAX_TIMER_COUNT-1); i++ )
- {
- wd->timerList.list[i].pre = &(wd->timerList.list[i-1]);
- wd->timerList.list[i].next = &(wd->timerList.list[i+1]);
- }
-
- wd->bTimerReady = TRUE;
-}
-
-
-u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick)
-{
- struct zsTimerEntry *pFreeEntry;
- struct zsTimerEntry *pEntry;
- u8_t i, count;
-
- zmw_get_wlan_dev(dev);
-
- if ( wd->timerList.freeCount == 0 )
- {
- zm_debug_msg0("no more timer");
- return 1;
- }
-
- //zm_debug_msg2("event = ", event);
- //zm_debug_msg1("target tick = ", wd->tick + tick);
-
- count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
-
- if ( count == 0 )
- {
- wd->timerList.freeCount--;
- wd->timerList.head->event = event;
- wd->timerList.head->timer = wd->tick + tick;
- //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
-
- return 0;
- }
-
- pFreeEntry = wd->timerList.tail;
- pFreeEntry->timer = wd->tick + tick;
- pFreeEntry->event = event;
- wd->timerList.tail = pFreeEntry->pre;
- pEntry = wd->timerList.head;
-
- for( i=0; i<count; i++ )
- {
- // prevent from the case of tick overflow
- if ( ( pEntry->timer > pFreeEntry->timer )&&
- ((pEntry->timer - pFreeEntry->timer) < 1000000000) )
- {
- if ( i != 0 )
- {
- pFreeEntry->pre = pEntry->pre;
- pFreeEntry->pre->next = pFreeEntry;
- }
- else
- {
- pFreeEntry->pre = NULL;
- }
-
- pEntry->pre = pFreeEntry;
- pFreeEntry->next = pEntry;
- break;
- }
-
- pEntry = pEntry->next;
- }
-
- if ( i == 0 )
- {
- wd->timerList.head = pFreeEntry;
- }
-
- if ( i == count )
- {
- pFreeEntry->pre = pEntry->pre;
- pFreeEntry->pre->next = pFreeEntry;
- pEntry->pre = pFreeEntry;
- pFreeEntry->next = pEntry;
- }
-
- wd->timerList.freeCount--;
- //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
-
- return 0;
-}
-
-u16_t zfTimerCancel(zdev_t* dev, u16_t event)
-{
- struct zsTimerEntry *pEntry;
- u8_t i, count;
-
- zmw_get_wlan_dev(dev);
-
- //zm_debug_msg2("event = ", event);
- //zm_debug_msg1("free timer count(b) = ", wd->timerList.freeCount);
-
- pEntry = wd->timerList.head;
- count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
-
- for( i=0; i<count; i++ )
- {
- if ( pEntry->event == event )
- {
- if ( pEntry == wd->timerList.head )
- { /* remove head entry */
- wd->timerList.head = pEntry->next;
- wd->timerList.tail->next = pEntry;
- pEntry->pre = wd->timerList.tail;
- wd->timerList.tail = pEntry;
- pEntry = wd->timerList.head;
- }
- else
- { /* remove non-head entry */
- pEntry->pre->next = pEntry->next;
- pEntry->next->pre = pEntry->pre;
- wd->timerList.tail->next = pEntry;
- pEntry->pre = wd->timerList.tail;
- wd->timerList.tail = pEntry;
- pEntry = pEntry->next;
- }
-
- wd->timerList.freeCount++;
- }
- else
- {
- pEntry = pEntry->next;
- }
- }
-
- //zm_debug_msg1("free timer count(a) = ", wd->timerList.freeCount);
-
- return 0;
-}
-
-void zfTimerClear(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->timerList.freeCount = ZM_MAX_TIMER_COUNT;
-}
-
-u16_t zfTimerCheckAndHandle(zdev_t* dev)
-{
- struct zsTimerEntry *pEntry;
- struct zsTimerEntry *pTheLastEntry = NULL;
- u16_t event[ZM_MAX_TIMER_COUNT];
- u8_t i, j=0, count;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( !wd->bTimerReady )
- {
- return 0;
- }
-
- zmw_enter_critical_section(dev);
-
- pEntry = wd->timerList.head;
- count = ZM_MAX_TIMER_COUNT - wd->timerList.freeCount;
-
- for( i=0; i<count; i++ )
- {
- // prevent from the case of tick overflow
- if ( ( pEntry->timer > wd->tick )&&
- ((pEntry->timer - wd->tick) < 1000000000) )
- {
- break;
- }
-
- event[j++] = pEntry->event;
- pTheLastEntry = pEntry;
- pEntry = pEntry->next;
- }
-
- if ( j > 0 )
- {
- wd->timerList.tail->next = wd->timerList.head;
- wd->timerList.head->pre = wd->timerList.tail;
- wd->timerList.head = pEntry;
- wd->timerList.tail = pTheLastEntry;
- wd->timerList.freeCount += j;
- //zm_debug_msg1("free timer count = ", wd->timerList.freeCount);
- }
-
- zmw_leave_critical_section(dev);
-
- zfProcessEvent(dev, event, j);
-
- return 0;
-}
-
-u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
- u16_t* mac, u32_t* key)
-{
- u32_t ret;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->sta.flagKeyChanging++;
- zm_debug_msg1(" zfCoreSetKey++++ ", wd->sta.flagKeyChanging);
- zmw_leave_critical_section(dev);
-
- ret = zfHpSetKey(dev, user, keyId, type, mac, key);
- return ret;
-}
-
-void zfCoreSetKeyComplete(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-#if 0
- wd->sta.flagKeyChanging = 0;
-#else
- if(wd->sta.flagKeyChanging)
- {
- zmw_enter_critical_section(dev);
- wd->sta.flagKeyChanging--;
- zmw_leave_critical_section(dev);
- }
-#endif
- zm_debug_msg1(" zfCoreSetKeyComplete--- ", wd->sta.flagKeyChanging);
-
- zfPushVtxq(dev);
-}
-
-void zfCoreHalInitComplete(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->halState = ZM_HAL_STATE_RUNNING;
- zmw_leave_critical_section(dev);
-
- zfPushVtxq(dev);
-}
-
-void zfCoreMacAddressNotify(zdev_t* dev, u8_t* addr)
-{
- zmw_get_wlan_dev(dev);
-
- wd->macAddr[0] = addr[0] | ((u16_t)addr[1]<<8);
- wd->macAddr[1] = addr[2] | ((u16_t)addr[3]<<8);
- wd->macAddr[2] = addr[4] | ((u16_t)addr[5]<<8);
-
-
- //zfHpSetMacAddress(dev, wd->macAddr, 0);
- if (wd->zfcbMacAddressNotify != NULL)
- {
- wd->zfcbMacAddressNotify(dev, addr);
- }
-}
-
-void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.countryIsoName[0] = isoName[0];
- wd->ws.countryIsoName[1] = isoName[1];
- wd->ws.countryIsoName[2] = '\0';
- }
-
-
-extern void zfScanMgrScanEventStart(zdev_t* dev);
-extern u8_t zfScanMgrScanEventTimeout(zdev_t* dev);
-extern void zfScanMgrScanEventRetry(zdev_t* dev);
-
-void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount)
-{
- u8_t i, j, bypass = FALSE;
- u16_t eventBypass[32];
- u8_t eventBypassCount = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zfZeroMemory((u8_t*) eventBypass, 64);
-
- for( i=0; i<eventCount; i++ )
- {
- for( j=0; j<eventBypassCount; j++ )
- {
- if ( eventBypass[j] == eventArray[i] )
- {
- bypass = TRUE;
- break;
- }
- }
-
- if ( bypass )
- {
- continue;
- }
-
- switch( eventArray[i] )
- {
- case ZM_EVENT_SCAN:
- {
- zfScanMgrScanEventStart(dev);
- eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
- eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
- }
- break;
-
- case ZM_EVENT_TIMEOUT_SCAN:
- {
- u8_t res;
-
- res = zfScanMgrScanEventTimeout(dev);
- if ( res == 0 )
- {
- eventBypass[eventBypassCount++] = ZM_EVENT_TIMEOUT_SCAN;
- }
- else if ( res == 1 )
- {
- eventBypass[eventBypassCount++] = ZM_EVENT_IN_SCAN;
- }
- }
- break;
-
- case ZM_EVENT_IBSS_MONITOR:
- {
- zfStaIbssMonitoring(dev, 0);
- }
- break;
-
- case ZM_EVENT_IN_SCAN:
- {
- zfScanMgrScanEventRetry(dev);
- }
- break;
-
- case ZM_EVENT_CM_TIMER:
- {
- zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_TIMER");
-
- wd->sta.cmMicFailureCount = 0;
- }
- break;
-
- case ZM_EVENT_CM_DISCONNECT:
- {
- zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_DISCONNECT");
-
- zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
-
- zmw_enter_critical_section(dev);
- //zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER,
- // ZM_TICK_CM_BLOCK_TIMEOUT);
-
- /* Timer Resolution on WinXP is 15/16 ms */
- /* Decrease Time offset for <XP> Counter Measure */
- zfTimerSchedule(dev, ZM_EVENT_CM_BLOCK_TIMER,
- ZM_TICK_CM_BLOCK_TIMEOUT - ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET);
-
- zmw_leave_critical_section(dev);
- wd->sta.cmMicFailureCount = 0;
- //zfiWlanDisable(dev);
- zfHpResetKeyCache(dev);
- if (wd->zfcbConnectNotify != NULL)
- {
- wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL,
- wd->sta.bssid);
- }
- }
- break;
-
- case ZM_EVENT_CM_BLOCK_TIMER:
- {
- zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER");
-
- //zmw_enter_critical_section(dev);
- wd->sta.cmDisallowSsidLength = 0;
- if ( wd->sta.bAutoReconnect )
- {
- zm_msg0_mm(ZM_LV_0, "ZM_EVENT_CM_BLOCK_TIMER:bAutoReconnect!=0");
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- }
- //zmw_leave_critical_section(dev);
- }
- break;
-
- case ZM_EVENT_TIMEOUT_ADDBA:
- {
- if (!wd->addbaComplete && (wd->addbaCount < 5))
- {
- zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
- wd->addbaCount++;
- zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
- }
- else
- {
- zfTimerCancel(dev, ZM_EVENT_TIMEOUT_ADDBA);
- }
- }
- break;
-
- #ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
- case ZM_EVENT_TIMEOUT_PERFORMANCE:
- {
- zfiPerformanceRefresh(dev);
- }
- break;
- #endif
- case ZM_EVENT_SKIP_COUNTERMEASURE:
- //enable the Countermeasure
- {
- zm_debug_msg0("Countermeasure : Enable MIC Check ");
- wd->TKIP_Group_KeyChanging = 0x0;
- }
- break;
-
- default:
- break;
- }
- }
-}
-
-void zfBssInfoCreate(zdev_t* dev)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- wd->sta.bssList.bssCount = 0;
- wd->sta.bssList.head = NULL;
- wd->sta.bssList.tail = NULL;
- wd->sta.bssInfoArrayHead = 0;
- wd->sta.bssInfoArrayTail = 0;
- wd->sta.bssInfoFreeCount = ZM_MAX_BSS;
-
- for( i=0; i< ZM_MAX_BSS; i++ )
- {
- //wd->sta.bssInfoArray[i] = &(wd->sta.bssInfoPool[i]);
- wd->sta.bssInfoArray[i] = zfwMemAllocate(dev, sizeof(struct zsBssInfo));
-
- }
-
- zmw_leave_critical_section(dev);
-}
-
-void zfBssInfoDestroy(zdev_t* dev)
-{
- u8_t i;
- zmw_get_wlan_dev(dev);
-
- zfBssInfoRefresh(dev, 1);
-
- for( i=0; i< ZM_MAX_BSS; i++ )
- {
- if (wd->sta.bssInfoArray[i] != NULL)
- {
- zfwMemFree(dev, wd->sta.bssInfoArray[i], sizeof(struct zsBssInfo));
- }
- else
- {
- zm_assert(0);
- }
- }
- return;
-}
-
-struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev)
-{
- struct zsBssInfo* pBssInfo;
-
- zmw_get_wlan_dev(dev);
-
- if (wd->sta.bssInfoFreeCount == 0)
- return NULL;
-
- pBssInfo = wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead];
- wd->sta.bssInfoArray[wd->sta.bssInfoArrayHead] = NULL;
- wd->sta.bssInfoArrayHead = (wd->sta.bssInfoArrayHead + 1) & (ZM_MAX_BSS - 1);
- wd->sta.bssInfoFreeCount--;
-
- zfZeroMemory((u8_t*)pBssInfo, sizeof(struct zsBssInfo));
-
- return pBssInfo;
-}
-
-void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo)
-{
- zmw_get_wlan_dev(dev);
-
- zm_assert(wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] == NULL);
-
- pBssInfo->signalStrength = pBssInfo->signalQuality = 0;
- pBssInfo->sortValue = 0;
-
- wd->sta.bssInfoArray[wd->sta.bssInfoArrayTail] = pBssInfo;
- wd->sta.bssInfoArrayTail = (wd->sta.bssInfoArrayTail + 1) & (ZM_MAX_BSS - 1);
- wd->sta.bssInfoFreeCount++;
-}
-
-void zfBssInfoReorderList(zdev_t* dev)
-{
- struct zsBssInfo* pBssInfo = NULL;
- struct zsBssInfo* pInsBssInfo = NULL;
- struct zsBssInfo* pNextBssInfo = NULL;
- struct zsBssInfo* pPreBssInfo = NULL;
- u8_t i = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (wd->sta.bssList.bssCount > 1)
- {
- pInsBssInfo = wd->sta.bssList.head;
- wd->sta.bssList.tail = pInsBssInfo;
- pBssInfo = pInsBssInfo->next;
- pInsBssInfo->next = NULL;
- while (pBssInfo != NULL)
- {
- i = 0;
- while (1)
- {
-// if (pBssInfo->signalStrength >= pInsBssInfo->signalStrength)
- if( pBssInfo->sortValue >= pInsBssInfo->sortValue)
- {
- if (i==0)
- {
- //Insert BssInfo to head
- wd->sta.bssList.head = pBssInfo;
- pNextBssInfo = pBssInfo->next;
- pBssInfo->next = pInsBssInfo;
- break;
- }
- else
- {
- //Insert BssInfo to neither head nor tail
- pPreBssInfo->next = pBssInfo;
- pNextBssInfo = pBssInfo->next;
- pBssInfo->next = pInsBssInfo;
- break;
- }
- }
- else
- {
- if (pInsBssInfo->next != NULL)
- {
- //Signal strength smaller than current BssInfo, check next
- pPreBssInfo = pInsBssInfo;
- pInsBssInfo = pInsBssInfo->next;
- }
- else
- {
- //Insert BssInfo to tail
- pInsBssInfo->next = pBssInfo;
- pNextBssInfo = pBssInfo->next;
- wd->sta.bssList.tail = pBssInfo;
- pBssInfo->next = NULL;
- break;
- }
- }
- i++;
- }
- pBssInfo = pNextBssInfo;
- pInsBssInfo = wd->sta.bssList.head;
- }
- } //if (wd->sta.bssList.bssCount > 1)
-
- zmw_leave_critical_section(dev);
-}
-
-void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo)
-{
- zmw_get_wlan_dev(dev);
-
- zm_assert(pBssInfo);
-
- //zm_debug_msg2("pBssInfo = ", pBssInfo);
-
- if ( wd->sta.bssList.bssCount == 0 )
- {
- wd->sta.bssList.head = pBssInfo;
- wd->sta.bssList.tail = pBssInfo;
- }
- else
- {
- wd->sta.bssList.tail->next = pBssInfo;
- wd->sta.bssList.tail = pBssInfo;
- }
-
- pBssInfo->next = NULL;
- wd->sta.bssList.bssCount++;
-
- //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount);
-}
-
-void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo)
-{
- struct zsBssInfo* pNowBssInfo;
- struct zsBssInfo* pPreBssInfo = NULL;
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- zm_assert(pBssInfo);
- zm_assert(wd->sta.bssList.bssCount);
-
- //zm_debug_msg2("pBssInfo = ", pBssInfo);
-
- pNowBssInfo = wd->sta.bssList.head;
-
- for( i=0; i<wd->sta.bssList.bssCount; i++ )
- {
- if ( pNowBssInfo == pBssInfo )
- {
- if ( i == 0 )
- { /* remove head */
- wd->sta.bssList.head = pBssInfo->next;
- }
- else
- {
- pPreBssInfo->next = pBssInfo->next;
- }
-
- if ( i == (wd->sta.bssList.bssCount - 1) )
- { /* remove tail */
- wd->sta.bssList.tail = pPreBssInfo;
- }
-
- break;
- }
-
- pPreBssInfo = pNowBssInfo;
- pNowBssInfo = pNowBssInfo->next;
- }
-
- zm_assert(i != wd->sta.bssList.bssCount);
- wd->sta.bssList.bssCount--;
-
- //zm_debug_msg2("bss count = ", wd->sta.bssList.bssCount);
-}
-
-void zfBssInfoRefresh(zdev_t* dev, u16_t mode)
-{
- struct zsBssInfo* pBssInfo;
- struct zsBssInfo* pNextBssInfo;
- u8_t i, bssCount;
-
- zmw_get_wlan_dev(dev);
-
- pBssInfo = wd->sta.bssList.head;
- bssCount = wd->sta.bssList.bssCount;
-
- for( i=0; i<bssCount; i++ )
- {
- if (mode == 1)
- {
- pNextBssInfo = pBssInfo->next;
- zfBssInfoRemoveFromList(dev, pBssInfo);
- zfBssInfoFree(dev, pBssInfo);
- pBssInfo = pNextBssInfo;
- }
- else
- {
- if ( pBssInfo->flag & ZM_BSS_INFO_VALID_BIT )
- { /* this one must be kept */
- pBssInfo->flag &= ~ZM_BSS_INFO_VALID_BIT;
- pBssInfo = pBssInfo->next;
- }
- else
- {
- #define ZM_BSS_CACHE_TIME_IN_MS 20000
- if ((wd->tick - pBssInfo->tick) > (ZM_BSS_CACHE_TIME_IN_MS/ZM_MS_PER_TICK))
- {
- pNextBssInfo = pBssInfo->next;
- zfBssInfoRemoveFromList(dev, pBssInfo);
- zfBssInfoFree(dev, pBssInfo);
- pBssInfo = pNextBssInfo;
- }
- else
- {
- pBssInfo = pBssInfo->next;
- }
- }
- }
- } //for( i=0; i<bssCount; i++ )
- return;
-}
-
-void zfDumpSSID(u8_t length, u8_t *value)
-{
- u8_t buf[50];
- u8_t tmpLength = length;
-
- if ( tmpLength > 49 )
- {
- tmpLength = 49;
- }
-
- zfMemoryCopy(buf, value, tmpLength);
- buf[tmpLength] = '\0';
- //printk("SSID: %s\n", buf);
- //zm_debug_msg_s("ssid = ", value);
-}
-
-void zfCoreReinit(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.flagKeyChanging = 0;
- wd->sta.flagFreqChanging = 0;
-}
-
-void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID)
-{
- //ULONGLONG time;
- u32_t time;
-
- zmw_get_wlan_dev(dev);
-
- time = wd->tick;
-
- //
- // Initialize the random BSSID to be the same as MAC address.
- //
-
- // RtlCopyMemory(BSSID, MACAddr, sizeof(DOT11_MAC_ADDRESS));
- zfMemoryCopy(BSSID, MACAddr, 6);
-
- //
- // Get the system time in 10 millisecond.
- //
-
- // NdisGetCurrentSystemTime((PLARGE_INTEGER)&time);
- // time /= 100000;
-
- //
- // Randomize the first 4 bytes of BSSID.
- //
-
- BSSID[0] ^= (u8_t)(time & 0xff);
- BSSID[0] &= ~0x01; // Turn off multicast bit
- BSSID[0] |= 0x02; // Turn on local bit
-
- time >>= 8;
- BSSID[1] ^= (u8_t)(time & 0xff);
-
- time >>= 8;
- BSSID[2] ^= (u8_t)(time & 0xff);
-
- time >>= 8;
- BSSID[3] ^= (u8_t)(time & 0xff);
-}
-
-u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr)
-{
-#ifdef ZM_ENABLE_NATIVE_WIFI
- zmw_get_wlan_dev(dev);
-
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- /* DA */
- macAddr[0] = zmw_tx_buf_readh(dev, buf, 16);
- macAddr[1] = zmw_tx_buf_readh(dev, buf, 18);
- macAddr[2] = zmw_tx_buf_readh(dev, buf, 20);
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- /* DA */
- macAddr[0] = zmw_tx_buf_readh(dev, buf, 4);
- macAddr[1] = zmw_tx_buf_readh(dev, buf, 6);
- macAddr[2] = zmw_tx_buf_readh(dev, buf, 8);
- }
- else if ( wd->wlanMode == ZM_MODE_AP )
- {
- /* DA */
- macAddr[0] = zmw_tx_buf_readh(dev, buf, 4);
- macAddr[1] = zmw_tx_buf_readh(dev, buf, 6);
- macAddr[2] = zmw_tx_buf_readh(dev, buf, 8);
- }
- else
- {
- return 1;
- }
-#else
- /* DA */
- macAddr[0] = zmw_tx_buf_readh(dev, buf, 0);
- macAddr[1] = zmw_tx_buf_readh(dev, buf, 2);
- macAddr[2] = zmw_tx_buf_readh(dev, buf, 4);
-#endif
-
- return 0;
-}
-
-/* Leave an empty line below to remove warning message on some compiler */
-
-u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode)
-{
- u8_t i, j;
- u16_t returnChannel;
- u16_t count_24G = 0, min24GIndex = 0;
- u16_t count_5G = 0, min5GIndex = 0;
- u16_t CombinationBssNumberIn24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- u16_t BssNumberIn24G[17] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- u16_t Array_24G[15] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- u16_t BssNumberIn5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- u16_t Array_5G[31] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
- struct zsBssInfo* pBssInfo;
-
- zmw_get_wlan_dev(dev);
-
- pBssInfo = wd->sta.bssList.head;
- if (pBssInfo == NULL)
- {
- if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
- adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
- {
- returnChannel = zfChGetFirst2GhzChannel(dev);
- }
- else
- {
- returnChannel = zfChGetFirst5GhzChannel(dev);
- }
-
- return returnChannel;
- }
-
- /* #1 Get Allowed Channel following Country Code ! */
- zmw_declare_for_critical_section();
- zmw_enter_critical_section(dev);
- for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
- {
- if (wd->regulationTable.allowChannel[i].channel < 3000)
- { // 2.4GHz
- Array_24G[count_24G] = wd->regulationTable.allowChannel[i].channel;
- count_24G++;
- }
- else
- { // 5GHz
- count_5G++;
- Array_5G[i] = wd->regulationTable.allowChannel[i].channel;
- }
- }
- zmw_leave_critical_section(dev);
-
- while( pBssInfo != NULL )
- {
- /* #2_1 Count BSS number in some specificed frequency in 2.4GHz band ! */
- if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
- adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
- {
- for( i=0; i<=(count_24G+3); i++ )
- {
- if( pBssInfo->frequency == Array_24G[i] )
- { // Array_24G[0] correspond to BssNumberIn24G[2]
- BssNumberIn24G[pBssInfo->channel+1]++;
- }
- }
- }
-
- /* #2_2 Count BSS number in some specificed frequency in 5GHz band ! */
- if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG )
- {
- for( i=0; i<count_5G; i++ )
- { // 5GHz channel is not equal to array index
- if( pBssInfo->frequency == Array_5G[i] )
- { // Array_5G[0] correspond to BssNumberIn5G[0]
- BssNumberIn5G[i]++;
- }
- }
- }
-
- pBssInfo = pBssInfo->next;
- }
-
-#if 0
- for(i=0; i<=(count_24G+3); i++)
- {
- printk("2.4GHz Before combin, %d BSS network : %d", i, BssNumberIn24G[i]);
- }
-
- for(i=0; i<count_5G; i++)
- {
- printk("5GHz Before combin, %d BSS network : %d", i, BssNumberIn5G[i]);
- }
-#endif
-
- if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G ||
- adhocMode == ZM_ADHOCBAND_BG || adhocMode == ZM_ADHOCBAND_ABG )
- {
- /* #3_1 Count BSS number that influence the specificed frequency in 2.4GHz ! */
- for( j=0; j<count_24G; j++ )
- {
- CombinationBssNumberIn24G[j] = BssNumberIn24G[j] + BssNumberIn24G[j+1] +
- BssNumberIn24G[j+2] + BssNumberIn24G[j+3] +
- BssNumberIn24G[j+4];
- //printk("After combine, the number of BSS network channel %d is %d",
- // j , CombinationBssNumberIn24G[j]);
- }
-
- /* #4_1 Find the less utilized frequency in 2.4GHz band ! */
- min24GIndex = zfFindMinimumUtilizationChannelIndex(dev, CombinationBssNumberIn24G, count_24G);
- }
-
- /* #4_2 Find the less utilized frequency in 5GHz band ! */
- if( adhocMode == ZM_ADHOCBAND_A || adhocMode == ZM_ADHOCBAND_ABG )
- {
- min5GIndex = zfFindMinimumUtilizationChannelIndex(dev, BssNumberIn5G, count_5G);
- }
-
- if( adhocMode == ZM_ADHOCBAND_B || adhocMode == ZM_ADHOCBAND_G || adhocMode == ZM_ADHOCBAND_BG )
- {
- return Array_24G[min24GIndex];
- }
- else if( adhocMode == ZM_ADHOCBAND_A )
- {
- return Array_5G[min5GIndex];
- }
- else if( adhocMode == ZM_ADHOCBAND_ABG )
- {
- if ( CombinationBssNumberIn24G[min24GIndex] <= BssNumberIn5G[min5GIndex] )
- return Array_24G[min24GIndex];
- else
- return Array_5G[min5GIndex];
- }
- else
- return 2412;
-}
-
-u16_t zfFindMinimumUtilizationChannelIndex(zdev_t* dev, u16_t* array, u16_t count)
-{
- u8_t i;
- u16_t tempMinIndex, tempMinValue;
-
- i = 1;
- tempMinIndex = 0;
- tempMinValue = array[tempMinIndex];
- while( i< count )
- {
- if( array[i] < tempMinValue )
- {
- tempMinValue = array[i];
- tempMinIndex = i;
- }
- i++;
- }
-
- return tempMinIndex;
-}
-
-u8_t zfCompareWithBssid(zdev_t* dev, u16_t* bssid)
-{
- zmw_get_wlan_dev(dev);
-
- if ( zfMemoryIsEqual((u8_t*)bssid, (u8_t*)wd->sta.bssid, 6) )
- {
- return 1;
- }
- else
- {
- return 0;
- }
-}
diff --git a/drivers/staging/otus/80211core/cfunc.h b/drivers/staging/otus/80211core/cfunc.h
deleted file mode 100644
index fc7548c..0000000
--- a/drivers/staging/otus/80211core/cfunc.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : func_extr.c */
-/* */
-/* Abstract */
-/* This module contains function prototype. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-
-#ifndef _CFUNC_H
-#define _CFUNC_H
-
-#include "queue.h"
-
-/* amsdu.c */
-void zfDeAmsdu(zdev_t* dev, zbuf_t* buf, u16_t vap, u8_t encryMode);
-
-/* cscanmgr.c */
-void zfScanMgrInit(zdev_t* dev);
-u8_t zfScanMgrScanStart(zdev_t* dev, u8_t scanType);
-void zfScanMgrScanStop(zdev_t* dev, u8_t scanType);
-void zfScanMgrScanAck(zdev_t* dev);
-
-/* cpsmgr.c */
-void zfPowerSavingMgrInit(zdev_t* dev);
-void zfPowerSavingMgrSetMode(zdev_t* dev, u8_t mode);
-void zfPowerSavingMgrMain(zdev_t* dev);
-void zfPowerSavingMgrWakeup(zdev_t* dev);
-u8_t zfPowerSavingMgrIsSleeping(zdev_t *dev);
-void zfPowerSavingMgrProcessBeacon(zdev_t* dev, zbuf_t* buf);
-void zfPowerSavingMgrAtimWinExpired(zdev_t* dev);
-void zfPowerSavingMgrConnectNotify(zdev_t *dev);
-void zfPowerSavingMgrPreTBTTInterrupt(zdev_t *dev);
-
-/* ccmd.c */
-u16_t zfWlanEnable(zdev_t* dev);
-
-/* cfunc.c */
-u8_t zfQueryOppositeRate(zdev_t* dev, u8_t dst_mac[6], u8_t frameType);
-void zfCopyToIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
- u16_t offset, u16_t length);
-void zfCopyToRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* src,
- u16_t offset, u16_t length);
-void zfCopyFromIntTxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
- u16_t offset, u16_t length);
-void zfCopyFromRxBuffer(zdev_t* dev, zbuf_t* buf, u8_t* dst,
- u16_t offset, u16_t length);
-void zfMemoryCopy(u8_t* dst, u8_t* src, u16_t length);
-void zfMemoryMove(u8_t* dst, u8_t* src, u16_t length);
-void zfZeroMemory(u8_t* va, u16_t length);
-u8_t zfMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length);
-u8_t zfRxBufferEqualToStr(zdev_t* dev, zbuf_t* buf, const u8_t* str,
- u16_t offset, u16_t length);
-void zfTxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
- u16_t dstOffset, u16_t srcOffset, u16_t length);
-void zfRxBufferCopy(zdev_t*dev, zbuf_t* dst, zbuf_t* src,
- u16_t dstOffset, u16_t srcOffset, u16_t length);
-
-void zfCollectHWTally(zdev_t*dev, u32_t* rsp, u8_t id);
-void zfTimerInit(zdev_t* dev);
-u16_t zfTimerSchedule(zdev_t* dev, u16_t event, u32_t tick);
-u16_t zfTimerCancel(zdev_t* dev, u16_t event);
-void zfTimerClear(zdev_t* dev);
-u16_t zfTimerCheckAndHandle(zdev_t* dev);
-void zfProcessEvent(zdev_t* dev, u16_t* eventArray, u8_t eventCount);
-
-void zfBssInfoCreate(zdev_t* dev);
-void zfBssInfoDestroy(zdev_t* dev);
-
-struct zsBssInfo* zfBssInfoAllocate(zdev_t* dev);
-void zfBssInfoFree(zdev_t* dev, struct zsBssInfo* pBssInfo);
-void zfBssInfoReorderList(zdev_t* dev);
-void zfBssInfoInsertToList(zdev_t* dev, struct zsBssInfo* pBssInfo);
-void zfBssInfoRemoveFromList(zdev_t* dev, struct zsBssInfo* pBssInfo);
-void zfBssInfoRefresh(zdev_t* dev, u16_t mode);
-void zfCoreSetFrequencyComplete(zdev_t* dev);
-void zfCoreSetFrequency(zdev_t* dev, u16_t frequency);
-void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency,
- zfpFreqChangeCompleteCb cb);
-void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
- u8_t extOffset, zfpFreqChangeCompleteCb cb);
-void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
- u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq);
-void zfReSetCurrentFrequency(zdev_t* dev);
-u32_t zfCoreSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
- u16_t* mac, u32_t* key);
-void zfCoreSetKeyComplete(zdev_t* dev);
-void zfCoreReinit(zdev_t* dev);
-void zfCoreMacAddressNotify(zdev_t* dev, u8_t *addr);
-void zfCoreSetIsoName(zdev_t* dev, u8_t* isoName);
-void zfGenerateRandomBSSID(zdev_t* dev, u8_t *MACAddr, u8_t *BSSID);
-void zfCoreHalInitComplete(zdev_t* dev);
-
-u16_t zfFindCleanFrequency(zdev_t* dev, u32_t adhocMode);
-u16_t zfFindMinimumUtilizationChannelIndex(zdev_t* dev, u16_t* array, u16_t count);
-u8_t zfCompareWithBssid(zdev_t* dev, u16_t* bssid);
-
-/* chb.c */
-void zfDumpBssList(zdev_t* dev);
-
-
-u16_t zfIssueCmd(zdev_t* dev, u32_t* cmd, u16_t cmdLen, u16_t src, u8_t* buf);
-
-
-/* cic.c */
-void zfUpdateBssid(zdev_t* dev, u8_t* bssid);
-void zfResetSupportRate(zdev_t* dev, u8_t type);
-void zfUpdateSupportRate(zdev_t* dev, u8_t* rateArray);
-u8_t zfIsGOnlyMode(zdev_t* dev, u16_t frequency, u8_t* rateArray);
-void zfGatherBMode(zdev_t* dev, u8_t* rateArray, u8_t* extrateArray);
-u8_t zfPSDeviceSleep(zdev_t* dev);
-u16_t zfGetRandomNumber(zdev_t* dev, u16_t initValue);
-void zfCoreEvent(zdev_t* dev, u16_t event, u8_t* rsp);
-void zfBeaconCfgInterrupt(zdev_t* dev, u8_t* rsp);
-void zfEndOfAtimWindowInterrupt(zdev_t* dev);
-
-/* cinit.c */
-u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq,
- u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port,
- u16_t* da, u16_t* sa, u8_t up, u16_t *micLen,
- u16_t* snap, u16_t snapLen, struct aggControl *aggControl);
-u16_t zfTxGenMmHeader(zdev_t* dev, u8_t frameType, u16_t* dst,
- u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt);
-void zfInitMacApMode(zdev_t* dev);
-u16_t zfChGetNextChannel(zdev_t* dev, u16_t frequency, u8_t* pbPassive);
-u16_t zfChGetFirstChannel(zdev_t* dev, u8_t* pbPassive);
-u16_t zfChGetFirst2GhzChannel(zdev_t* dev);
-u16_t zfChGetFirst5GhzChannel(zdev_t* dev);
-u16_t zfChGetLastChannel(zdev_t* dev, u8_t* pbPassive);
-u16_t zfChGetLast5GhzChannel(zdev_t* dev);
-u16_t zfChNumToFreq(zdev_t* dev, u8_t ch, u8_t freqBand);
-u8_t zfChFreqToNum(u16_t freq, u8_t* bIs5GBand);
-
-/* cmm.c */
-void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo); //CWYang(m)
-void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst,
- u32_t p1, u32_t p2, u32_t p3);
-u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid);
-u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype);
-u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type);
-u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type);
-u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid);
-u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid);
-void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src);
-void zfProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
-u16_t zfSendProbeReq(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t bWithSSID);
-u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf,
- u16_t offset, u8_t eid, u8_t rateSet);
-u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset);
-u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset);
-void zfUpdateDefaultQosParameter(zdev_t* dev, u8_t mode);
-u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId);
-u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset); //CWYang(+)
-u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset);
-u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset); //CWYang(+)
-u16_t zfFindATHExtCap(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype);
-u16_t zfFindBrdcmMrvlRlnkExtCap(zdev_t* dev, zbuf_t* buf);
-u16_t zfFindMarvelExtCap(zdev_t* dev, zbuf_t* buf);
-u16_t zfFindBroadcomExtCap(zdev_t* dev, zbuf_t* buf);
-u16_t zfFindRlnkExtCap(zdev_t* dev, zbuf_t* buf);
-
-/* cmmap.c */
-void zfMmApTimeTick(zdev_t* dev);
-void zfApAgingSta(zdev_t* dev);
-u16_t zfApAddSta(zdev_t* dev, u16_t* addr, u16_t state, u16_t apId, u8_t type,
- u8_t qosType, u8_t qosInfo);
-void zfApProtctionMonitor(zdev_t* dev);
-void zfApProcessBeacon(zdev_t* dev, zbuf_t* buf);
-void zfApProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
-void zfApProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
-void zfApProcessAsocRsp(zdev_t* dev, zbuf_t* buf);
-void zfApProcessDeauth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
-void zfApProcessDisasoc(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
-void zfApProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
-void zfApStoreAsocReqIe(zdev_t* dev, zbuf_t* buf, u16_t aid);
-u16_t zfApAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap);
-void zfApSendBeacon(zdev_t* dev);
-u16_t zfApGetSTAInfo(zdev_t* dev, u16_t* addr, u16_t* state, u8_t* vap);
-u16_t zfIntrabssForward(zdev_t* dev, zbuf_t* buf, u8_t srcVap);
-u16_t zfApBufferPsFrame(zdev_t* dev, zbuf_t* buf, u16_t port);
-void zfApInitStaTbl(zdev_t* dev);
-void zfApGetStaTxRateAndQosType(zdev_t* dev, u16_t* addr, u32_t* phyCtrl,
- u8_t* qosType, u16_t* rcProbingFlag);
-void zfApGetStaQosType(zdev_t* dev, u16_t* addr, u8_t* qosType);
-void zfApSetStaTxRate(zdev_t* dev, u16_t* addr, u32_t phyCtrl);
-struct zsMicVar* zfApGetRxMicKey(zdev_t* dev, zbuf_t* buf);
-struct zsMicVar* zfApGetTxMicKey(zdev_t* dev, zbuf_t* buf, u8_t* qosType);
-u16_t zfApAddIeWmePara(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap);
-u16_t zfApUpdatePsBit(zdev_t* dev, zbuf_t* buf, u8_t* vap, u8_t* uapsdTrig);
-void zfApProcessPsPoll(zdev_t* dev, zbuf_t* buf);
-u16_t zfApFindSta(zdev_t* dev, u16_t* addr);
-void zfApGetStaEncryType(zdev_t* dev, u16_t* addr, u8_t* encryType);
-void zfApGetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t* iv16, u32_t* iv32);
-void zfApSetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t iv16, u32_t iv32);
-void zfApClearStaKey(zdev_t* dev, u16_t* addr);
-#ifdef ZM_ENABLE_CENC
-void zfApGetStaCencIvAndKeyIdx(zdev_t* dev, u16_t* addr, u32_t *iv,
- u8_t *keyIdx);
-void zfApSetStaCencIv(zdev_t* dev, u16_t* addr, u32_t *iv);
-#endif //ZM_ENABLE_CENC
-void zfApSetProtectionMode(zdev_t* dev, u16_t mode);
-void zfApFlushBufferedPsFrame(zdev_t* dev);
-void zfApSendFailure(zdev_t* dev, u8_t* addr);
-u8_t zfApRemoveFromPsQueue(zdev_t* dev, u16_t id, u16_t* src);
-void zfApProcessAction(zdev_t* dev, zbuf_t* buf);
-/* cmmsta.c */
-void zfMmStaTimeTick(zdev_t* dev);
-void zfReWriteBeaconStartAddress(zdev_t* dev); // Mxzeng
-void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo); //CWYang(m)
-void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
-void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId);
-void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf);
-void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf);
-void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf);
-void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo);
-void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf);
-void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf);
-void zfStaChannelManagement(zdev_t* dev, u8_t scan);
-void zfIbssConnectNetwork(zdev_t* dev);
-void zfInfraConnectNetwork(zdev_t* dev);
-u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo);
-u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState);
-u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset);
-u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
-u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset);
-void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey);
-u8_t zfStaIsConnected(zdev_t* dev);
-u8_t zfStaIsConnecting(zdev_t* dev);
-u8_t zfStaIsDisconnect(zdev_t* dev);
-void zfStaSendBeacon(zdev_t* dev);
-void zfSendNullData(zdev_t* dev, u8_t type);
-void zfSendPSPoll(zdev_t* dev);
-void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap);
-void zdRateInfoCountTx(zdev_t* dev, u16_t* macAddr);
-struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf);
-struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf);
-u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf);
-void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf);
-u8_t zfStaBlockWlanScan(zdev_t* dev);
-void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf);
-u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf);
-void zfStaIbssPSSend(zdev_t* dev);
-void zfStaResetStatus(zdev_t* dev, u8_t bInit);
-u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo);
-void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event);
-void zfStaInitOppositeInfo(zdev_t* dev);
-void zfStaIbssMonitoring(zdev_t* dev, u8_t reset);
-struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader);
-u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf,
- struct zsWlanProbeRspFrameHeader *pProbeRspHeader,
- struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type);
-s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx);
-s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx);
-void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag);
-void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight);
-void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl,
- u16_t* rcProbingFlag);
-u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf);
-struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf);
-#ifdef ZM_ENABLE_CENC
-/* CENC */
-u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset);
-#endif //ZM_ENABLE_CENC
-void zfStaEnableSWEncryption(zdev_t *dev, u8_t value);
-void zfStaDisableSWEncryption(zdev_t *dev);
-u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength);
-u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset);
-
-/* ctkip.c */
-void zfTkipInit(u8_t* key, u8_t* ta, struct zsTkipSeed* pSeed, u8_t* initIv);
-void zfMicSetKey(u8_t* key, struct zsMicVar* pMic);
-void zfMicAppendByte(u8_t b, struct zsMicVar* pMic);
-void zfMicClear(struct zsMicVar* pMic);
-void zfMicAppendTxBuf(zdev_t* dev, zbuf_t* buf, u8_t* da, u8_t* sa,
- u16_t removeLen, u8_t* mic);
-u8_t zfMicRxVerify(zdev_t* dev, zbuf_t* buf);
-void zfMicGetMic(u8_t* dst, struct zsMicVar* pMic);
-void zfCalTxMic(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u16_t *da, u16_t *sa, u8_t up, u8_t *mic);
-void zfTKIPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* key, u32_t* icv);
-u16_t zfTKIPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* key);
-void zfTkipGetseeds(u16_t iv16, u8_t *RC4Key, struct zsTkipSeed *Seed);
-u8_t zfTkipPhase1KeyMix(u32_t iv32, struct zsTkipSeed* pSeed);
-u8_t zfTkipPhase2KeyMix(u16_t iv16, struct zsTkipSeed* pSeed);
-void zfWEPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv);
-u16_t zfWEPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv);
-
-/* ctxrx.c */
-u16_t zfSend80211Frame(zdev_t* dev, zbuf_t* buf);
-void zfIsrPciTxComp(zdev_t* dev);
-void zfTxPciDmaStart(zdev_t* dev);
-u16_t zfTxPortControl(zdev_t* dev, zbuf_t* buf, u16_t port);
-u16_t zfTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port,
- u16_t bufType, u16_t flag);
-u16_t zfTxGenWlanTail(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t snaplen,
- u16_t* mic);
-u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen);
-void zfTxGetIpTosAndFrag(zdev_t* dev, zbuf_t* buf, u8_t* up, u16_t* fragOff);
-u16_t zfPutVtxq(zdev_t* dev, zbuf_t* buf);
-void zfPushVtxq(zdev_t* dev);
-u8_t zfIsVtxqEmpty(zdev_t* dev);
-u16_t zfGetSeqCtrl(zdev_t* dev, zbuf_t* buf, u16_t offset);
-u8_t zfGetFragNo(zdev_t* dev, zbuf_t* buf);
-void zfShowRxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset);
-void zfShowTxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset);
-void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
-u16_t zfPutVmmq(zdev_t* dev, zbuf_t* buf);
-void zfFlushVtxq(zdev_t* dev);
-void zfAgingDefragList(zdev_t* dev, u16_t flushFlag);
-
-void zfLed100msCtrl(zdev_t* dev);
-void zf80211FrameSend(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t snapLen,
- u16_t* da, u16_t* sa, u8_t up, u16_t headerLen, u16_t* snap,
- u16_t* tail, u16_t tailLen, u16_t offset, u16_t bufType,
- u8_t ac, u8_t keyIdx);
-void zfCheckIsRIFSFrame(zdev_t* dev, zbuf_t* buf, u16_t frameSubType);
-
-/* queue.c */
-struct zsQueue* zfQueueCreate(zdev_t* dev, u16_t size);
-void zfQueueDestroy(zdev_t* dev, struct zsQueue* q);
-u16_t zfQueuePutNcs(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick);
-u16_t zfQueuePut(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick);
-zbuf_t* zfQueueGet(zdev_t* dev, struct zsQueue* q);
-zbuf_t* zfQueueGetWithMac(zdev_t* dev, struct zsQueue* q, u8_t* addr, u8_t* mb);
-void zfQueueFlush(zdev_t* dev, struct zsQueue* q);
-void zfQueueAge(zdev_t* dev, struct zsQueue* q, u32_t tick, u32_t msAge);
-void zfQueueGenerateUapsdTim(zdev_t* dev, struct zsQueue* q,
- u8_t* uniBitMap, u16_t* highestByte);
-
-/* hpmain.c */
-u16_t zfHpInit(zdev_t* dev, u32_t frequency);
-u16_t zfHpRelease(zdev_t* dev);
-void zfHpSetFrequencyEx(zdev_t* dev, u32_t frequency, u8_t bw40,
- u8_t extOffset, u8_t initRF);
-u16_t zfHpStartRecv(zdev_t* dev);
-u16_t zfHpStopRecv(zdev_t* dev);
-u16_t zfHpResetKeyCache(zdev_t* dev);
-u16_t zfHpSetApStaMode(zdev_t* dev, u8_t mode);
-u16_t zfHpSetBssid(zdev_t* dev, u8_t* bssid);
-u16_t zfHpSetSnifferMode(zdev_t* dev, u16_t on);
-u8_t zfHpUpdateQosParameter(zdev_t* dev, u16_t* cwminTbl, u16_t* cwmaxTbl,
- u16_t* aifsTbl, u16_t* txopTbl);
-void zfHpSetAtimWindow(zdev_t* dev, u16_t atimWin);
-void zfHpEnableBeacon(zdev_t* dev, u16_t mode, u16_t bcnInterval, u16_t dtim, u8_t enableAtim);
-void zfHpDisableBeacon(zdev_t* dev);
-void zfHpSetBasicRateSet(zdev_t* dev, u16_t bRateBasic, u16_t gRateBasic);
-void zfHpSetRTSCTSRate(zdev_t* dev, u32_t rate);
-void zfHpSetMacAddress(zdev_t* dev, u16_t* macAddr, u16_t macAddrId);
-u32_t zfHpGetMacAddress(zdev_t* dev);
-u32_t zfHpGetTransmitPower(zdev_t* dev);
-void zfHpSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList, u8_t bAllMulticast);
-
-u16_t zfHpRemoveKey(zdev_t* dev, u16_t user);
-u32_t zfHpSetKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t type,
- u16_t* mac, u32_t* key);
-//u32_t zfHpSetStaPairwiseKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
-// u32_t* key, u32_t* micKey);
-//u32_t zfHpSetStaGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
-// u32_t* key, u32_t* micKey);
-u32_t zfHpSetApPairwiseKey(zdev_t* dev, u16_t* staMacAddr, u8_t type,
- u32_t* key, u32_t* micKey, u16_t staAid);
-u32_t zfHpSetApGroupKey(zdev_t* dev, u16_t* apMacAddr, u8_t type,
- u32_t* key, u32_t* micKey, u16_t vapId);
-u32_t zfHpSetDefaultKey(zdev_t* dev, u8_t keyId, u8_t type, u32_t* key, u32_t* micKey);
-u32_t zfHpSetPerUserKey(zdev_t* dev, u8_t user, u8_t keyId, u8_t* mac, u8_t type, u32_t* key, u32_t* micKey);
-
-void zfHpSendBeacon(zdev_t* dev, zbuf_t* buf, u16_t len);
-u16_t zfHpGetPayloadLen(zdev_t* dev,
- zbuf_t* buf,
- u16_t len,
- u16_t plcpHdrLen,
- u32_t *rxMT,
- u32_t *rxMCS,
- u32_t *rxBW,
- u32_t *rxSG
- );
-u32_t zfHpGetFreeTxdCount(zdev_t* dev);
-u32_t zfHpGetMaxTxdCount(zdev_t* dev);
-u16_t zfHpSend(zdev_t* dev, u16_t* header, u16_t headerLen,
- u16_t* snap, u16_t snapLen, u16_t* tail, u16_t tailLen, zbuf_t* buf,
- u16_t offset, u16_t bufType, u8_t ac, u8_t keyIdx);
-void zfHpGetRegulationTablefromRegionCode(zdev_t* dev, u16_t regionCode);
-void zfHpGetRegulationTablefromCountry(zdev_t* dev, u16_t CountryCode);
-u8_t zfHpGetRegulationTablefromISO(zdev_t* dev, u8_t *countryInfo, u8_t length);
-const char* zfHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
-u16_t zfHpGetRegionCodeFromIsoName(zdev_t* dev, u8_t *countryIsoName);
-u8_t zfHpGetRegulatoryDomain(zdev_t* dev);
-void zfHpLedCtrl(zdev_t* dev, u16_t ledId, u8_t mode);
-u16_t zfHpResetTxRx(zdev_t* dev);
-u16_t zfHpDeleteAllowChannel(zdev_t* dev, u16_t freq);
-u16_t zfHpAddAllowChannel(zdev_t* dev, u16_t freq);
-u32_t zfHpCwmUpdate(zdev_t* dev);
-u32_t zfHpAniUpdate(zdev_t* dev);
-u32_t zfHpAniUpdateRssi(zdev_t* dev, u8_t rssi);
-void zfHpAniAttach(zdev_t* dev);
-void zfHpAniArPoll(zdev_t* dev, u32_t listenTime, u32_t phyCnt1, u32_t phyCnt2);
-void zfHpHeartBeat(zdev_t* dev);
-void zfHpPowerSaveSetState(zdev_t* dev, u8_t psState);
-void zfHpPowerSaveSetMode(zdev_t* dev, u8_t staMode, u8_t psMode, u16_t bcnInterval);
-u16_t zfHpIsDfsChannel(zdev_t* dev, u16_t freq);
-u16_t zfHpIsDfsChannelNCS(zdev_t* dev, u16_t freq);
-u16_t zfHpFindFirstNonDfsChannel(zdev_t* dev, u16_t aBand);
-u16_t zfHpIsAllowedChannel(zdev_t* dev, u16_t freq);
-void zfHpDisableDfsChannel(zdev_t* dev, u8_t disableFlag);
-void zfHpSetTTSIFSTime(zdev_t* dev, u8_t sifs_time);
-
-void zfHpQueryMonHalRxInfo(zdev_t* dev, u8_t *monHalRxInfo);
-
-void zfDumpSSID(u8_t length, u8_t *value);
-void zfHpSetAggPktNum(zdev_t* dev, u32_t num);
-void zfHpSetMPDUDensity(zdev_t* dev, u8_t density);
-void zfHpSetSlotTime(zdev_t* dev, u8_t type);
-void zfHpSetSlotTimeRegister(zdev_t* dev, u8_t type);
-void zfHpSetRifs(zdev_t* dev, u8_t ht_enable, u8_t ht2040, u8_t g_mode);
-void zfHpBeginSiteSurvey(zdev_t* dev, u8_t status);
-void zfHpFinishSiteSurvey(zdev_t* dev, u8_t status);
-u16_t zfHpEnableHwRetry(zdev_t* dev);
-u16_t zfHpDisableHwRetry(zdev_t* dev);
-void zfHpSWDecrypt(zdev_t* dev, u8_t enable);
-void zfHpSWEncrypt(zdev_t* dev, u8_t enable);
-u32_t zfHpCapability(zdev_t* dev);
-void zfHpSetRollCallTable(zdev_t* dev);
-u8_t zfHpregulatoryDomain(zdev_t* dev);
-u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset);
-u8_t zfHpGetMaxTxPower(zdev_t* dev);
-u8_t zfHpGetMinTxPower(zdev_t* dev);
-u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset);
-void zfHpEnableRifs(zdev_t* dev, u8_t mode24g, u8_t modeHt, u8_t modeHt2040);
-void zfHpDisableRifs(zdev_t* dev);
-u16_t zfHpUsbReset(zdev_t* dev);
-
-
-#endif /* #ifndef _CFUNC_H */
diff --git a/drivers/staging/otus/80211core/chb.c b/drivers/staging/otus/80211core/chb.c
deleted file mode 100644
index 7fac150..0000000
--- a/drivers/staging/otus/80211core/chb.c
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : hb.c */
-/* */
-/* Abstract */
-/* This module contains house keeping and timer functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-
-/* Called by wrapper every 10 msec */
-void zfiHeartBeat(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->tick++;
-
-#if 0
- /* => every 1.28 seconds */
- if (wd->cwm.cw_enable && ((wd->tick & 0x7f) == 0x3f))
- {
- zfHpCwmUpdate(dev);
- }
-#endif
- /* => every 2.56 seconds */
- if ((wd->tick & 0xff) == 0)
- {
- zfAgingDefragList(dev, 1);
- }
-
- /* Watch Dog */
- //zfWatchDog();
-
- /* LED Control (per 100ms) */
- if ((wd->tick % 10) == 9)
- {
- zfLed100msCtrl(dev);
-#ifdef ZM_ENABLE_BA_RATECTRL
- if (!wd->modeMDKEnable)
- {
- zfiDbgReadTally(dev);
- }
-#endif
- }
-
-#ifdef ZM_ENABLE_REWRITE_BEACON_START_ADDRESS
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- if ( zfStaIsConnected(dev) )
- {
- zfReWriteBeaconStartAddress(dev);
- }
- }
-#endif
-
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- if ( zfStaIsConnected(dev) )
- {
- wd->tickIbssReceiveBeacon++; // add 10ms
-
- if ( (wd->sta.ibssSiteSurveyStatus == 2) &&
- (wd->tickIbssReceiveBeacon == 300) &&
- (wd->sta.ibssReceiveBeaconCount < 3) )
- {
- zm_debug_msg0("It is happen!!! No error message");
- zfReSetCurrentFrequency(dev);
- }
- }
- }
-
- if(wd->sta.ReceivedPacketRateCounter <= 0)
- {
- wd->sta.ReceivedPktRatePerSecond = wd->sta.TotalNumberOfReceivePackets;
- //zm_debug_msg1("Receive Packet Per Second = ", wd->sta.ReceivedPktRatePerSecond);
- if (wd->sta.TotalNumberOfReceivePackets != 0)
- {
- wd->sta.avgSizeOfReceivePackets = wd->sta.TotalNumberOfReceiveBytes/wd->sta.TotalNumberOfReceivePackets;
- }
- else
- {
- wd->sta.avgSizeOfReceivePackets = 640;
- }
- wd->sta.TotalNumberOfReceivePackets = 0;
- wd->sta.TotalNumberOfReceiveBytes = 0;
- wd->sta.ReceivedPacketRateCounter = 100; /*for another 1s*/
- }
- else
- {
- wd->sta.ReceivedPacketRateCounter--;
- }
-
- /* => every 1.28 seconds */
- if((wd->tick & 0x7f) == 0x3f)
- {
- if( wd->sta.NonNAPcount > 0)
- {
- wd->sta.RTSInAGGMode = TRUE;
- wd->sta.NonNAPcount = 0;
- }
- else
- {
- wd->sta.RTSInAGGMode = FALSE;
- }
- }
-
-
-
- /* Maintain management time tick */
- zfMmApTimeTick(dev);
- zfMmStaTimeTick(dev);
-
- //zfPhyCrTuning(dev);
-
- //zfTxPowerControl(dev);
- zfHpHeartBeat(dev);
-
-}
-
-
-void zfDumpBssList(zdev_t* dev)
-{
- struct zsBssInfo* pBssInfo;
- u8_t str[33];
- u8_t i, j;
- u32_t addr1, addr2;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zm_debug_msg0("***** Bss scan result *****");
- zmw_enter_critical_section(dev);
-
- pBssInfo = wd->sta.bssList.head;
-
- for( i=0; i<wd->sta.bssList.bssCount; i++ )
- {
- if ( i )
- {
- zm_debug_msg0("---------------------------");
- }
-
- zm_debug_msg1("BSS #", i);
- for(j=0; j<pBssInfo->ssid[1]; j++)
- {
- str[j] = pBssInfo->ssid[2+j];
- }
- str[pBssInfo->ssid[1]] = 0;
- zm_debug_msg0("SSID = ");
- zm_debug_msg0(str);
-
- addr1 = (pBssInfo->bssid[0] << 16) + (pBssInfo->bssid[1] << 8 )
- + pBssInfo->bssid[2];
- addr2 = (pBssInfo->bssid[3] << 16) + (pBssInfo->bssid[4] << 8 )
- + pBssInfo->bssid[5];
- zm_debug_msg2("Bssid = ", addr1);
- zm_debug_msg2(" ", addr2);
- zm_debug_msg1("frequency = ", pBssInfo->frequency);
- zm_debug_msg1("security type = ", pBssInfo->securityType);
- zm_debug_msg1("WME = ", pBssInfo->wmeSupport);
- zm_debug_msg1("beacon interval = ", pBssInfo->beaconInterval[0]
- + (pBssInfo->beaconInterval[1] << 8));
- zm_debug_msg1("capability = ", pBssInfo->capability[0]
- + (pBssInfo->capability[1] << 8));
- if ( pBssInfo->supportedRates[1] > 0 )
- {
- for( j=0; j<pBssInfo->supportedRates[1]; j++ )
- {
- zm_debug_msg2("supported rates = ", pBssInfo->supportedRates[2+j]);
- }
- }
-
- for( j=0; j<pBssInfo->extSupportedRates[1]; j++ )
- {
- zm_debug_msg2("ext supported rates = ", pBssInfo->extSupportedRates[2+j]);
- }
-
- pBssInfo = pBssInfo->next;
- }
- zmw_leave_critical_section(dev);
-
- zm_debug_msg0("***************************");
-}
-
diff --git a/drivers/staging/otus/80211core/cic.c b/drivers/staging/otus/80211core/cic.c
deleted file mode 100644
index 53c09a0..0000000
--- a/drivers/staging/otus/80211core/cic.c
+++ /dev/null
@@ -1,499 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-#include "ratectrl.h"
-
-
-void zfUpdateBssid(zdev_t* dev, u8_t* bssid)
-{
-
- zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- //zmw_enter_critical_section(dev);
- wd->sta.bssid[0] = bssid[0] + (((u16_t) bssid[1]) << 8);
- wd->sta.bssid[1] = bssid[2] + (((u16_t) bssid[3]) << 8);
- wd->sta.bssid[2] = bssid[4] + (((u16_t) bssid[5]) << 8);
- //zmw_leave_critical_section(dev);
-
- zfHpSetBssid(dev, bssid);
-
-}
-
-/************************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfResetSupportRate */
-/* Reset support rate to default value. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* type: ZM_DEFAULT_SUPPORT_RATE_ZERO => reset to zero */
-/* ZM_DEFAULT_SUPPORT_RATE_DISCONNECT => reset to disconnect status */
-/* ZM_DEFAULT_SUPPORT_RATE_IBSS_B => reset to IBSS creator(b mode) */
-/* ZM_DEFAULT_SUPPORT_RATE_IBSS_AG => reset to IBSS creator(a/g mode) */
-/* */
-/************************************************************************************/
-void zfResetSupportRate(zdev_t* dev, u8_t type)
-{
- zmw_get_wlan_dev(dev);
-
- switch(type)
- {
- case ZM_DEFAULT_SUPPORT_RATE_ZERO:
- wd->bRate = 0;
- wd->bRateBasic = 0;
- wd->gRate = 0;
- wd->gRateBasic = 0;
- break;
- case ZM_DEFAULT_SUPPORT_RATE_DISCONNECT:
- wd->bRate = 0xf;
- wd->bRateBasic = 0xf;
- wd->gRate = 0xff;
- wd->gRateBasic = 0x15;
- break;
- case ZM_DEFAULT_SUPPORT_RATE_IBSS_B:
- wd->bRate = 0xf;
- wd->bRateBasic = 0xf;
- wd->gRate = 0;
- wd->gRateBasic = 0;
- break;
- case ZM_DEFAULT_SUPPORT_RATE_IBSS_AG:
- wd->bRate = 0xf;
- wd->bRateBasic = 0xf;
- wd->gRate = 0xff;
- wd->gRateBasic = 0;
- break;
- }
-}
-
-void zfUpdateSupportRate(zdev_t* dev, u8_t* rateArray)
-{
- u8_t bRate=0, bRateBasic=0, gRate=0, gRateBasic=0;
- u8_t length = rateArray[1];
- u8_t i, j;
-
- zmw_get_wlan_dev(dev);
-
- for(i=2; i<length+2; i++)
- {
- for(j=0; j<4; j++)
- {
- if ( (rateArray[i] & 0x7f) == zg11bRateTbl[j] )
- {
- bRate |= (1 << j);
- if ( rateArray[i] & 0x80 )
- {
- bRateBasic |= (1 << j);
- }
- }
- }
-
- if ( j == 4 )
- {
- for(j=0; j<8; j++)
- {
- if ( (rateArray[i] & 0x7f) == zg11gRateTbl[j] )
- {
- gRate |= (1 << j);
- if ( rateArray[i] & 0x80 )
- {
- gRateBasic |= (1 << j);
- }
- }
- }
- }
- }
-
-
- wd->bRate |= bRate;
- wd->bRateBasic |= bRateBasic;
- wd->gRate |= gRate;
- wd->gRateBasic |= gRateBasic;
-}
-
-u8_t zfIsGOnlyMode(zdev_t* dev, u16_t frequency, u8_t* rateArray)
-{
- u8_t length = rateArray[1];
- u8_t i, j;
-
- if (frequency < 3000) {
- for (i = 2; i < length+2; i++) {
- for (j = 0; j < 8; j++) {
- if ( ((rateArray[i] & 0x7f) == zg11gRateTbl[j])
- && (rateArray[i] & 0x80) ) {
- return 1;
- }
- }
- }
- }
-
- return 0;
-}
-
-void zfGatherBMode(zdev_t* dev, u8_t* rateArray, u8_t* extrateArray)
-{
- u8_t gatherBMode[ZM_MAX_SUPP_RATES_IE_SIZE + 2];
- u8_t i, j, k = 0;
- u8_t length;
-
- gatherBMode[0] = ZM_WLAN_EID_SUPPORT_RATE;
- gatherBMode[1] = 0;
-
- length = rateArray[1];
- for (i = 2; i < length+2; i++) {
- for (j = 0; j < 4; j++) {
- if ( (rateArray[i] & 0x7f) == zg11bRateTbl[j] ) {
- gatherBMode[2+k] = rateArray[i];
-
- gatherBMode[1]++;
- k++;
- }
- }
- }
-
- length = extrateArray[1];
- for (i = 2; i < length+2; i++) {
- for (j = 0; j < 4; j++) {
- if ( (extrateArray[i] & 0x7f) == zg11bRateTbl[j] ) {
- gatherBMode[2+k] = extrateArray[i];
-
- gatherBMode[1]++;
- k++;
- }
- }
- }
-
- extrateArray[0] = extrateArray[1] = 0;
- zfMemoryCopy(rateArray, gatherBMode, gatherBMode[1]+2);
-}
-
-u16_t zfGetRandomNumber(zdev_t* dev, u16_t initValue)
-{
-#if 0
- /* Compiler/Linker error on Linux */
- if ( initValue )
- {
- srand(initValue);
- }
-
- return ((u16_t)rand());
-#endif
- return 0;
-}
-
-u8_t zfPSDeviceSleep(zdev_t* dev)
-{
- //zmw_get_wlan_dev(dev);
-
- /* enter PS mode */
-
- return 0;
-}
-
-u8_t zcOfdmPhyCrtlToRate[] =
-{
- /* 0x8=48M, 0x9=24M, 0xa=12M, 0xb=6M, 0xc=54M, 0xd=36M, 0xe=18M, 0xf=9M */
- 10, 8, 6, 4, 11, 9, 7, 5
-};
-
-u8_t zfPhyCtrlToRate(u32_t phyCtrl)
-{
- u32_t mt, mcs, sg;
- u8_t rate = 0;
-
- mt = phyCtrl & 0x3;
- mcs = (phyCtrl>>18) & 0x3f;
- sg = (phyCtrl>>31) & 0x1;
-
- if ((mt == 0) && (mcs <=3))
- {
- rate = (u8_t)mcs;
- }
- else if ((mt == 1) && (mcs >= 0x8) && (mcs <= 0xf))
- {
- rate = zcOfdmPhyCrtlToRate[mcs-8];
- }
- else if ((mt == 2) && (mcs <= 15))
- {
- rate = (u8_t)mcs + 12;
- if(sg) {
- if (mcs != 7)
- {
- rate = (u8_t)mcs + 12 + 2;
- }
- else //MCS7-SG
- {
- rate = (u8_t)30;
- }
- }
- }
-
- return rate;
-}
-
-
-void zfCoreEvent(zdev_t* dev, u16_t event, u8_t* rsp)
-{
- u16_t i;
- zbuf_t* psBuf;
- u8_t moreData;
- u8_t vap = 0;
- u8_t peerIdx;
- s8_t res;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
- if (event == 0) //Beacon Event
- {
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- zfApSendBeacon(dev);
-
- if (wd->CurrentDtimCount == 0)
- {
- /* TODO : Send queued broadcast frames at BC/MC event */
- do
- {
- psBuf = NULL;
- moreData = 0;
- zmw_enter_critical_section(dev);
- if (wd->ap.bcmcTail[vap] != wd->ap.bcmcHead[vap])
- {
- //zm_msg0_mm(ZM_LV_0, "Send BCMC frames");
- psBuf = wd->ap.bcmcArray[vap][wd->ap.bcmcHead[vap]];
- wd->ap.bcmcHead[vap] = (wd->ap.bcmcHead[vap] + 1)
- & (ZM_BCMC_ARRAY_SIZE - 1);
- if (wd->ap.bcmcTail[vap] != wd->ap.bcmcHead[vap])
- {
- moreData = 0x20;
- }
- }
- zmw_leave_critical_section(dev);
- if (psBuf != NULL)
- {
- /* TODO : config moreData bit */
- zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF,
- moreData);
- }
- } while(psBuf != NULL);
-
- }
- }
- else
- {
- /* STA mode */
- if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
- {
- /* send queued packets */
- for(i=0; i<wd->sta.staPSDataCount; i++)
- {
- zfTxSendEth(dev, wd->sta.staPSDataQueue[i], 0,
- ZM_EXTERNAL_ALLOC_BUF, 0);
- }
-
- wd->sta.staPSDataCount = 0;
- }
-
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- zfStaSendBeacon(dev);
- wd->sta.ibssAtimTimer = ZM_BIT_15 | wd->sta.atimWindow;
- }
-
- zfPowerSavingMgrPreTBTTInterrupt(dev);
- }
- } //if (event == 0) //Beacon Event
- else if (event == 1) //Retry completed event
- {
- u32_t retryRate;
-
- retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
- + (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
- /* Degrade Tx Rate */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- zmw_enter_critical_section(dev);
- i = zfApFindSta(dev, (u16_t*)rsp);
- if (i != 0xffff)
- {
- zfRateCtrlTxFailEvent(dev, &wd->ap.staTable[i].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
- }
- zmw_leave_critical_section(dev);
- }
- else
- {
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
- if ( res == 0 )
- {
- zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
- }
- zmw_leave_critical_section(dev);
- }
- } //else if (event == 1) //Retry completed event
- else if (event == 2) //Tx Fail event
- {
- u32_t retryRate;
-
- retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
- + (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
-
- /* Degrade Tx Rate */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- zmw_enter_critical_section(dev);
- i = zfApFindSta(dev, (u16_t*)rsp);
- if (i != 0xffff)
- {
- zfRateCtrlTxFailEvent(dev, &wd->ap.staTable[i].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
- }
- zmw_leave_critical_section(dev);
-
- zfApSendFailure(dev, rsp);
- }
- else
- {
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
- if ( res == 0 )
- {
- zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, 0,(u32_t)zfPhyCtrlToRate(retryRate));
- }
- zmw_leave_critical_section(dev);
- }
- } //else if (event == 2) //Tx Fail event
- else if (event == 3) //Tx Comp event
- {
- u32_t retryRate;
-
- retryRate = (u32_t)(rsp[6]) + (((u32_t)(rsp[7]))<<8)
- + (((u32_t)(rsp[8]))<<16) + (((u32_t)(rsp[9]))<<24);
-
- /* TODO : Tx completed, used for rate control probing */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- zmw_enter_critical_section(dev);
- i = zfApFindSta(dev, (u16_t*)rsp);
- if (i != 0xffff)
- {
- zfRateCtrlTxSuccessEvent(dev, &wd->ap.staTable[i].rcCell, zfPhyCtrlToRate(retryRate));
- }
- zmw_leave_critical_section(dev);
- }
- else
- {
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, (u16_t*)rsp, &peerIdx);
- if ( res == 0 )
- {
- zfRateCtrlTxSuccessEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, zfPhyCtrlToRate(retryRate));
- }
- zmw_leave_critical_section(dev);
- }
- } //else if (event == 3) //Tx Comp event
- else if (event == 4) //BA failed count
- {
- u32_t fail;
- u32_t rate;
- peerIdx = 0;
-
- fail=((u32_t*)rsp)[0] & 0xFFFF;
- rate=((u32_t*)rsp)[0] >> 16;
-
- if (rate > 15) {
- rate = (rate & 0xF) + 12 + 2;
- }
- else {
- rate = rate + 12;
- }
-
- zmw_enter_critical_section(dev);
- zfRateCtrlTxFailEvent(dev, &wd->sta.oppositeInfo[peerIdx].rcCell, (u8_t)rate, fail);
- zmw_leave_critical_section(dev);
- }
-}
-
-void zfBeaconCfgInterrupt(zdev_t* dev, u8_t* rsp)
-{
- u32_t txBeaconCounter;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- txBeaconCounter = *((u32_t *)rsp);
- if ( wd->sta.beaconTxCnt != txBeaconCounter )
- {
- wd->sta.txBeaconInd = 1;
-
- zmw_enter_critical_section(dev);
- wd->tickIbssSendBeacon = 0;
- zmw_leave_critical_section(dev);
- }
- else
- {
- wd->sta.txBeaconInd = 0;
- }
-
-#ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION
- if ( wd->sta.txBeaconInd && wd->sta.ibssDelayedInd )
- {
- if (wd->zfcbIbssPartnerNotify != NULL)
- {
- wd->zfcbIbssPartnerNotify(dev, 1, &wd->sta.ibssDelayedIndEvent);
- }
-
- wd->sta.ibssDelayedInd = 0;
- }
-#endif
-
- wd->sta.beaconTxCnt = txBeaconCounter;
-
- // Need to check if the time is expired after ATIM window??
-
- // Check if we have buffered any data for those stations that are sleeping
- // If it's true, then transmitting ATIM pkt to notify them
-
-#ifdef ZM_ENABLE_IBSS_PS
- // TODO: Need to check if the station receive our ATIM pkt???
- zfStaIbssPSSend(dev);
-
- if ( wd->sta.atimWindow == 0 )
- {
- // We won't receive the end of ATIM isr so we fake it
- zfPowerSavingMgrAtimWinExpired(dev);
- }
-#endif
- }
-}
-
-void zfEndOfAtimWindowInterrupt(zdev_t* dev)
-{
-#ifdef ZM_ENABLE_IBSS_PS
- zmw_get_wlan_dev(dev);
-
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- // Transmit any queued pkt for the stations!!
- zfPowerSavingMgrAtimWinExpired(dev);
- }
-#endif
-}
diff --git a/drivers/staging/otus/80211core/cinit.c b/drivers/staging/otus/80211core/cinit.c
deleted file mode 100644
index 1182331..0000000
--- a/drivers/staging/otus/80211core/cinit.c
+++ /dev/null
@@ -1,1912 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : init.c */
-/* */
-/* Abstract */
-/* This module contains init functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#include "../hal/hpreg.h"
-
-extern const u8_t zcUpToAc[8];
-
-u16_t zcIndextoRateBG[16] = {1000, 2000, 5500, 11000, 0, 0, 0, 0, 48000,
- 24000, 12000, 6000, 54000, 36000, 18000, 9000};
-u32_t zcIndextoRateN20L[16] = {6500, 13000, 19500, 26000, 39000, 52000, 58500,
- 65000, 13000, 26000, 39000, 52000, 78000, 104000,
- 117000, 130000};
-u32_t zcIndextoRateN20S[16] = {7200, 14400, 21700, 28900, 43300, 57800, 65000,
- 72200, 14400, 28900, 43300, 57800, 86700, 115600,
- 130000, 144400};
-u32_t zcIndextoRateN40L[16] = {13500, 27000, 40500, 54000, 81000, 108000, 121500,
- 135000, 27000, 54000, 81000, 108000, 162000, 216000,
- 243000, 270000};
-u32_t zcIndextoRateN40S[16] = {15000, 30000, 45000, 60000, 90000, 120000, 135000,
- 150000, 30000, 60000, 90000, 120000, 180000, 240000,
- 270000, 300000};
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfTxGenWlanHeader */
-/* Generate WLAN MAC header and LLC header. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer pointer */
-/* id : Index of TxD */
-/* port : WLAN port */
-/* */
-/* OUTPUTS */
-/* length of removed Ethernet header */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.5 */
-/* */
-/************************************************************************/
-u16_t zfTxGenWlanHeader(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t seq,
- u8_t flag, u16_t plusLen, u16_t minusLen, u16_t port,
- u16_t* da, u16_t* sa, u8_t up, u16_t *micLen,
- u16_t* snap, u16_t snapLen, struct aggControl *aggControl)
-{
-
- u16_t len;
- u16_t macCtrl;
- u32_t phyCtrl;
- u16_t hlen = 16;
- u16_t icvLen = 0;
- u16_t wdsPortId;
- u16_t vap = 0;
- u16_t mcs = 0;
- u16_t mt = 0;
- u8_t qosType;
- u8_t b1, b2;
- u16_t wdsPort;
- u8_t encExemptionActionType;
- u16_t rateProbingFlag = 0;
- u8_t tkipFrameOffset = 0;
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- u8_t res, peerIdx;
- u8_t userIdx=0;
- u16_t *iv16;
- u32_t *iv32;
-#endif
-
- zmw_get_wlan_dev(dev);
-
- /* Generate WLAN header */
- /* Frame control */
- header[4] = 0x0008 | (flag<<8);
- /* Duration */
- header[5] = 0x0000;
-
- if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- /* ToDS bit */
- header[4] |= 0x0100;
-
- /*Sometimes we wake up to tx/rx but AP still think we are sleeping, so still need to set this bit*/
- if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1 )
- {
- header[4] |= 0x1000;
- }
-
- /* Address 1 = BSSID */
- header[6] = wd->sta.bssid[0];
- header[7] = wd->sta.bssid[1];
- header[8] = wd->sta.bssid[2];
- /* Address 3 = DA */
- header[12] = da[0];
- header[13] = da[1];
- header[14] = da[2];
- }
- else if (wd->wlanMode == ZM_MODE_PSEUDO)
- {
- /* Address 1 = DA */
- header[6] = da[0];
- header[7] = da[1];
- header[8] = da[2];
- /* Address 3 = 00:00:00:00:00:00 */
- header[12] = 0;
- header[13] = 0;
- header[14] = 0;
-
- /* PSEUDO test : WDS */
- if (wd->enableWDS)
- {
- /* ToDS and FromDS bit */
- header[4] |= 0x0300;
-
- /* Address 4 = SA */
- header[16] = 0;
- header[17] = 0;
- header[18] = 0;
-
- hlen = 19;
- }
- }
- else if (wd->wlanMode == ZM_MODE_IBSS)
- {
- /* Address 1 = DA */
- header[6] = da[0];
- header[7] = da[1];
- header[8] = da[2];
- /* Address 3 = BSSID */
- header[12] = wd->sta.bssid[0];
- header[13] = wd->sta.bssid[1];
- header[14] = wd->sta.bssid[2];
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, da, &peerIdx);
- if(res == 0) // Find opposite in our OppositeInfo Structure !
- {
- userIdx = peerIdx;
- }
- zmw_leave_critical_section(dev);
-#endif
- }
- else if (wd->wlanMode == ZM_MODE_AP)
- {
- if (port < 0x20)
- /* AP mode */
- {
- /* FromDS bit */
- header[4] |= 0x0200;
-
- /* Address 1 = DA */
- header[6] = da[0];
- header[7] = da[1];
- header[8] = da[2];
- /* Address 3 = SA */
- header[12] = sa[0];
- header[13] = sa[1];
- header[14] = sa[2];
-
- if (port < ZM_MAX_AP_SUPPORT)
- {
- vap = port;
- header[14] += (vap<<8);
- }
- }
- else
- /* WDS port */
- {
- /* ToDS and FromDS bit */
- header[4] |= 0x0300;
-
- wdsPortId = port - 0x20;
-
- /* Address 1 = RA */
- header[6] = wd->ap.wds.macAddr[wdsPortId][0];
- header[7] = wd->ap.wds.macAddr[wdsPortId][1];
- header[8] = wd->ap.wds.macAddr[wdsPortId][2];
- /* Address 3 = DA */
- header[12] = da[0];
- header[13] = da[1];
- header[14] = da[2];
- /* Address 4 = SA */
- header[16] = sa[0];
- header[17] = sa[1];
- header[18] = sa[2];
-
- hlen = 19;
- }
- } /* else if (wd->wlanMode == ZM_MODE_AP) */
-
- /* Address 2 = TA */
- header[9] = wd->macAddr[0];
- header[10] = wd->macAddr[1];
-#ifdef ZM_VAPMODE_MULTILE_SSID
- header[11] = wd->macAddr[2]; //Multiple SSID
-#else
- header[11] = wd->macAddr[2] + (vap<<8); //VAP
-#endif
-
- if ( (wd->wlanMode == ZM_MODE_IBSS) && (wd->XLinkMode) )
- {
- header[9] = sa[0];
- header[10] = sa[1];
- header[11] = sa[2];
- }
-
- /* Sequence Control */
- header[15] = seq;
-
-
- if (wd->wlanMode == ZM_MODE_AP)
- {
- zfApGetStaTxRateAndQosType(dev, da, &phyCtrl, &qosType, &rateProbingFlag);
- mt = (u16_t)(phyCtrl & 0x3);
- mcs = (u16_t)((phyCtrl >> 16) & 0x3f);
-#if 1
- //zfApGetStaQosType(dev, da, &qosType);
-
- /* if DA == WME STA */
- if (qosType == 1)
- {
- /* QoS data */
- header[4] |= 0x0080;
-
- /* QoS Control */
- header[hlen] = up;
- hlen += 1;
- }
-#endif
- }
-
-#if 0
- //AGG Test Code
- if (header[6] == 0x8000)
- {
- /* QoS data */
- header[4] |= 0x0080;
-
- /* QoS Control */
- header[hlen] = 0;
- hlen += 1;
- }
-#endif
-
- if (wd->wlanMode == ZM_MODE_AP) {
- /* Todo: rate control here for qos field */
- }
- else {
- /* Rate control */
- zfStaGetTxRate(dev, da, &phyCtrl, &rateProbingFlag);
- mt = (u16_t)(phyCtrl & 0x3);
- mcs = (u16_t)((phyCtrl >> 16) & 0x3f);
- }
-
- if (wd->txMCS != 0xff)
- {
- /* fixed rate */
- phyCtrl = ((u32_t)wd->txMCS<<16) + wd->txMT;
- mcs = wd->txMCS;
- mt = wd->txMT;
- }
-
- if (wd->enableAggregation)
- {
- /* force enable aggregation */
- if (wd->enableAggregation==2 && !(header[6]&0x1))
- {
- /* QoS data */
- header[4] |= 0x0080;
-
- /* QoS Control */
- header[hlen] = 0;
- hlen += 1;
- }
- /* if wd->enableAggregation=1 => force disable */
- /* if wd->enableAggregation=0 => auto */
- }
-
-#ifdef ZM_ENABLE_AGGREGATION
- /*
- * aggregation control
- */
-
- /*
- * QoS data
- */
- if (wd->wlanMode == ZM_MODE_AP) {
- if (aggControl && mt == 2) {
- if (wd->enableAggregation==0 && !(header[6]&0x1))
- {
- header[4] |= 0x0080;
-
- /*
- * QoS Control
- */
- header[hlen] = 0;
- hlen += 1;
- }
- }
- }
-#endif
-
- // MSDU Length
- len = zfwBufGetSize(dev, buf);
-
- /* Generate control setting */
- /* Backoff, Non-Burst and hardware duration */
- macCtrl = 0x208;
-
- /* ACK */
- if ((header[6] & 0x1) == 0x1)
- {
- /* multicast frame : Set NO-ACK bit */
- macCtrl |= 0x4;
- }
- else
- {
- /* unicast frame */
- #if 0
- // Enable RTS according to MPDU Lengths ( not MSDU Lengths )
- if (len >= wd->rtsThreshold)
- {
- /* Enable RTS */
- macCtrl |= 1;
- }
- #endif
- }
- /* VAP test code */
- //macCtrl |= 0x4;
-
- if (wd->wlanMode == ZM_MODE_AP)
- {
- u8_t encryType;
- u16_t iv16;
- u32_t iv32;
-
- /* Check whether this is a multicast frame */
- if ((header[6] & 0x1) == 0x1)
- {
- /* multicast frame */
- if (wd->ap.encryMode[vap] == ZM_TKIP)
- {
- wd->ap.iv16[vap]++;
-
- if(wd->ap.iv16[vap] == 0)
- {
- wd->ap.iv32[vap]++;
- }
-
- b1 = (u8_t) (wd->ap.iv16[vap] >> 8);
- b2 = (b1 | 0x20) & 0x7f;
- header[hlen] = ((u16_t)b2 << 8) + b1;
- b1 = (u8_t) wd->ap.iv16[vap];
- b2 = 0x20 | (wd->ap.bcKeyIndex[vap] << 6);
- header[hlen+1] = ((u16_t)b2 << 8) + b1;
- header[hlen+2] = (u16_t) wd->ap.iv32[vap];
- header[hlen+3] = (u16_t) (wd->ap.iv32[vap] >> 16);
-
- //macCtrl |= 0x80;
- macCtrl |= 0x40;
- icvLen = 4;
-
- /* set hardware MIC */
- if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
- {
- macCtrl |= 0x100;
- plusLen += 8;
- *micLen = 8;
- }
-
- header[4] |= 0x4000;
- hlen += 4;
- }
- else if (wd->ap.encryMode[vap] == ZM_AES)
- {
- wd->ap.iv16[vap]++;
-
- if(wd->ap.iv16[vap] == 0)
- {
- wd->ap.iv32[vap]++;
- }
-
- b1 = (u8_t) wd->ap.iv16[vap];
- b2 = (u8_t) (wd->ap.iv16[vap] >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
- header[hlen+1] = 0x2000 | (wd->ap.bcKeyIndex[vap] << 14);
- header[hlen+2] = (u16_t) (wd->ap.iv32[vap]);
- header[hlen+3] = (u16_t) (wd->ap.iv32[vap] >> 16);
-
- macCtrl |= 0xc0;
- icvLen = 8; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 4;
- }
- #ifdef ZM_ENABLE_CENC
- else if (wd->ap.encryMode[vap] == ZM_CENC)
- {
- //u32_t txiv[4];
-
- wd->ap.txiv[vap][0]++;
-
- if (wd->ap.txiv[vap][0] == 0)
- {
- wd->ap.txiv[vap][1]++;
- }
-
- if (wd->ap.txiv[vap][1] == 0)
- {
- wd->ap.txiv[vap][2]++;
- }
-
- if (wd->ap.txiv[vap][2] == 0)
- {
- wd->ap.txiv[vap][3]++;
- }
-
- if (wd->ap.txiv[vap][3] == 0)
- {
- wd->ap.txiv[vap][0] = 0;
- wd->ap.txiv[vap][1] = 0;
- wd->ap.txiv[vap][2] = 0;
- }
-
- header[hlen] = (wd->ap.bcKeyIndex[vap] & 0x0001); /* For Key Id and reserved field */
- header[hlen+1] = (u16_t)wd->ap.txiv[vap][0];
- header[hlen+2] = (u16_t)(wd->ap.txiv[vap][0] >> 16);
- header[hlen+3] = (u16_t)wd->ap.txiv[vap][1];
- header[hlen+4] = (u16_t)(wd->ap.txiv[vap][1] >> 16);
- header[hlen+5] = (u16_t)wd->ap.txiv[vap][2];
- header[hlen+6] = (u16_t)(wd->ap.txiv[vap][2] >> 16);
- header[hlen+7] = (u16_t)wd->ap.txiv[vap][3];
- header[hlen+8] = (u16_t)(wd->ap.txiv[vap][3] >> 16);
-
- macCtrl |= 0x80;
- icvLen = 16; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 9;
- }
- #endif //ZM_ENABLE_CENC
- }
- else
- {
- /* Get STA's encryption type */
- zfApGetStaEncryType(dev, da, &encryType);
-
- if (encryType == ZM_TKIP)
- {
- /* Get iv16 and iv32 */
- zfApGetStaWpaIv(dev, da, &iv16, &iv32);
-
- iv16++;
- if (iv16 == 0)
- {
- iv32++;
- }
-
- b1 = (u8_t) (iv16 >> 8);
- b2 = (b1 | 0x20) & 0x7f;
- header[hlen] = ((u16_t)b2 << 8) + b1;
- b1 = (u8_t) iv16;
- b2 = 0x20;
- header[hlen+1] = ((u16_t)b2 << 8) + b1;
- header[hlen+2] = (u16_t) iv32;
- header[hlen+3] = (u16_t) (iv32 >> 16);
-
- //macCtrl |= 0x80;
- macCtrl |= 0x40;
- icvLen = 4;
-
- /* set hardware MIC */
- if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
- {
- macCtrl |= 0x100;
- plusLen += 8;
- *micLen = 8;
- }
-
- header[4] |= 0x4000;
- hlen += 4;
-
- /* Set iv16 and iv32 */
- zfApSetStaWpaIv(dev, da, iv16, iv32);
- }
- else if (encryType == ZM_AES)
- {
- /* Get iv16 and iv32 */
- zfApGetStaWpaIv(dev, da, &iv16, &iv32);
-
- iv16++;
- if (iv16 == 0)
- {
- iv32++;
- }
-
- b1 = (u8_t) iv16;
- b2 = (u8_t) (iv16 >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
- header[hlen+1] = 0x2000;
- header[hlen+2] = (u16_t) (iv32);
- header[hlen+3] = (u16_t) (iv32 >> 16);
-
- macCtrl |= 0xc0;
- icvLen = 8; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 4;
-
- /* Set iv16 and iv32 */
- zfApSetStaWpaIv(dev, da, iv16, iv32);
- }
- #ifdef ZM_ENABLE_CENC
- else if (encryType == ZM_CENC)
- {
- u32_t txiv[4];
- u8_t keyIdx;
-
- /* Get CENC TxIV */
- zfApGetStaCencIvAndKeyIdx(dev, da, txiv, &keyIdx);
-
- txiv[0] += 2;
-
- if (txiv[0] == 0 || txiv[0] == 1)
- {
- txiv[1]++;
- }
-
- if (txiv[1] == 0)
- {
- txiv[2]++;
- }
-
- if (txiv[2] == 0)
- {
- txiv[3]++;
- }
-
- if (txiv[3] == 0)
- {
- txiv[0] = 0;
- txiv[1] = 0;
- txiv[2] = 0;
- }
-
- header[hlen] = (keyIdx & 0x0001); /* For Key Id and reserved field */
- header[hlen+1] = (u16_t)txiv[0];
- header[hlen+2] = (u16_t)(txiv[0] >> 16);
- header[hlen+3] = (u16_t)txiv[1];
- header[hlen+4] = (u16_t)(txiv[1] >> 16);
- header[hlen+5] = (u16_t)txiv[2];
- header[hlen+6] = (u16_t)(txiv[2] >> 16);
- header[hlen+7] = (u16_t)txiv[3];
- header[hlen+8] = (u16_t)(txiv[3] >> 16);
-
- macCtrl |= 0x80;
- icvLen = 16; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 9;
-
- /* Set CENC IV */
- zfApSetStaCencIv(dev, da, txiv);
- }
- #endif //ZM_ENABLE_CENC
- }
-
- /* protection mode */
- if (wd->ap.protectionMode == 1)
- {
- /* Enable Self-CTS */
- macCtrl &= 0xFFFC;
- macCtrl |= 2;
- }
-
- /* Rate Control */
- if (port < 0x20)
- {
- /* AP */
- /* IV */
- if ((wd->ap.encryMode[vap] == ZM_WEP64) ||
- (wd->ap.encryMode[vap] == ZM_WEP128) ||
- (wd->ap.encryMode[vap] == ZM_WEP256))
- {
- header[4] |= 0x4000;
- header[hlen] = 0x0; //IV
- header[hlen+1] = wd->ap.bcKeyIndex[vap] << 14; //IV with Keyid--CWYang(m)
- hlen += 2;
- icvLen = 4;
- macCtrl |= 0x40;
- }
- }
- else
- {
- /* WDS */
-
- /* TODO : Fixed rate to 54M */
- phyCtrl = 0xc0001; //PHY control L
-
- /* WDS port checking */
- wdsPort = port - 0x20;
- if (wdsPort >= ZM_MAX_WDS_SUPPORT)
- {
- wdsPort = 0;
- }
-
- #if 1
- /* IV */
- switch (wd->ap.wds.encryMode[wdsPort])
- {
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
- header[4] |= 0x4000;
- header[hlen] = 0x0; //IV
- header[hlen+1] = wd->ap.bcKeyIndex[vap] << 14; //IV with Keyid
- hlen += 2;
- icvLen = 4;
- macCtrl |= 0x40;
- break;
-
- case ZM_TKIP:
- wd->sta.iv16++;
-
- if ( wd->sta.iv16 == 0 )
- {
- wd->sta.iv32++;
- }
-
- b1 = (u8_t) (wd->sta.iv16 >> 8);
- b2 = (b1 | 0x20) & 0x7f;
- header[hlen] = ((u16_t)b2 << 8) + b1;
- b1 = (u8_t) wd->sta.iv16;
- b2 = 0x20;
- header[hlen+1] = ((u16_t)b2 << 8) + b1;
- header[hlen+2] = (u16_t) wd->sta.iv32;
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
-
- //macCtrl |= 0x80;
- macCtrl |= 0x40;
- icvLen = 4;
-
- /* set hardware MIC */
- if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
- {
- macCtrl |= 0x100;
- plusLen += 8;
- *micLen = 8;
- }
-
- header[4] |= 0x4000;
- hlen += 4;
- break;
-
- case ZM_AES:
- wd->sta.iv16++;
- if ( wd->sta.iv16 == 0 )
- {
- wd->sta.iv32++;
- }
-
- b1 = (u8_t) wd->sta.iv16;
- b2 = (u8_t) (wd->sta.iv16 >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
- header[hlen+1] = 0x2000;
- header[hlen+2] = (u16_t) (wd->sta.iv32);
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
-
- macCtrl |= 0xc0; /* Set to AES in control setting */
- icvLen = 8; /* MIC */
-
- header[4] |= 0x4000; /* Set WEP bit in wlan header */
- hlen += 4; /* plus IV length */
- break;
- }/* end of switch */
- #endif
- }
- }
- else /* wd->wlanMode != ZM_MODE_AP */
- {
- encExemptionActionType = zfwGetPktEncExemptionActionType(dev, buf);
-
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- #if 1
- /* if WME AP */
- if (wd->sta.wmeConnected != 0)
- {
- /* QoS data */
- header[4] |= 0x0080;
-
- /* QoS Control */
- header[hlen] = up;
- hlen += 1;
- }
- #endif
-
- if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
- {
- if ( wd->sta.authMode < ZM_AUTH_MODE_WPA )
- { /* non-WPA */
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
- {
- if ( (wd->sta.encryMode == ZM_WEP64)||
- (wd->sta.encryMode == ZM_WEP128)||
- (wd->sta.encryMode == ZM_WEP256) )
- {
- header[4] |= 0x4000;
- header[hlen] = 0x0; //IV
- header[hlen+1] = 0x0; //IV
- header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14);
- hlen += 2;
- icvLen = 4;
-
- /* For Software WEP */
- if ((wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) != 0)
- {
- u8_t keyLen = 5;
- u8_t iv[3];
-
- iv[0] = 0x0;
- iv[1] = 0x0;
- iv[2] = 0x0;
-
- if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP64)
- {
- keyLen = 5;
- }
- else if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP128)
- {
- keyLen = 13;
- }
- else if (wd->sta.SWEncryMode[wd->sta.keyId] == ZM_WEP256)
- {
- keyLen = 29;
- }
-
- zfWEPEncrypt(dev, buf, (u8_t*) snap, snapLen, minusLen, keyLen,
- wd->sta.wepKey[wd->sta.keyId], iv);
- }
- else
- {
- macCtrl |= 0x40;
- }
- }
- }
- }
- else
- { /* WPA */
- if ( wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK )
- {
- wd->sta.iv16++;
- if ( wd->sta.iv16 == 0 )
- {
- wd->sta.iv32++;
- }
-
- /* set encryption mode */
- if ( wd->sta.encryMode == ZM_TKIP )
- {
- b1 = (u8_t) (wd->sta.iv16 >> 8);
- b2 = (b1 | 0x20) & 0x7f;
- header[hlen] = ((u16_t)b2 << 8) + b1;
- b1 = (u8_t) wd->sta.iv16;
- b2 = 0x20;
-
- // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (((u16_t)b2 << 8) + b1);
- // STA in infrastructure mode should use keyId = 0 to transmit unicast !
- header[hlen+1] = (((u16_t)b2 << 8) + b1);
- header[hlen+2] = (u16_t) wd->sta.iv32;
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
-
- /* If software encryption enable */
- if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0)
- {
- //macCtrl |= 0x80;
- /* TKIP same to WEP */
- macCtrl |= 0x40;
- icvLen = 4;
-
- /* set hardware MIC */
- if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
- {
- macCtrl |= 0x100;
- plusLen += 8;
- *micLen = 8;
- }
- }
- else
- {
- u8_t mic[8];
- u16_t offset;
- u32_t icv;
- u8_t RC4Key[16];
-
- /* TODO: Remove the criticial section here. */
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- /* Calculate MIC */
- zfCalTxMic(dev, buf, (u8_t *)snap, snapLen, minusLen, da, sa, up, mic);
-
- offset = zfwBufGetSize(dev, buf);
-
- /* Append MIC to the buffer */
- zfCopyToIntTxBuffer(dev, buf, mic, offset, 8);
- zfwBufSetSize(dev, buf, offset+8);
- zmw_leave_critical_section(dev);
-
- /* TKIP Key Mixing */
- zfTkipPhase1KeyMix(wd->sta.iv32, &wd->sta.txSeed);
- zfTkipPhase2KeyMix(wd->sta.iv16, &wd->sta.txSeed);
- zfTkipGetseeds(wd->sta.iv16, RC4Key, &wd->sta.txSeed);
-
- /* Encrypt Data */
- zfTKIPEncrypt(dev, buf, (u8_t *)snap, snapLen, minusLen, 16, RC4Key, &icv);
-
- icvLen = 4;
- len += 8;
- }
-
- header[4] |= 0x4000;
- hlen += 4;
- }
- else if ( wd->sta.encryMode == ZM_AES )
- {
- b1 = (u8_t) wd->sta.iv16;
- b2 = (u8_t) (wd->sta.iv16 >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
- // header[hlen+1] = (((u16_t) wd->sta.keyId) << 14) | (0x2000);
- // STA in infrastructure mode should use keyId = 0 to transmit unicast !
- header[hlen+1] = 0x2000;
- header[hlen+2] = (u16_t) (wd->sta.iv32);
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
-
- macCtrl |= 0xc0;
- icvLen = 8; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 4;
- }
- #ifdef ZM_ENABLE_CENC
- else if ( wd->sta.encryMode == ZM_CENC )
- {
- /* Accumlate the PN sequence */
- wd->sta.txiv[0] += 2;
-
- if (wd->sta.txiv[0] == 0 || wd->sta.txiv[0] == 1)
- {
- wd->sta.txiv[1]++;
- }
-
- if (wd->sta.txiv[1] == 0)
- {
- wd->sta.txiv[2]++;
- }
-
- if (wd->sta.txiv[2] == 0)
- {
- wd->sta.txiv[3]++;
- }
-
- if (wd->sta.txiv[3] == 0)
- {
- wd->sta.txiv[0] = 0;
- wd->sta.txiv[1] = 0;
- wd->sta.txiv[2] = 0;
- }
-
- header[hlen] = (wd->sta.cencKeyId & 0x0001); /* For Key Id and reserved field */
- header[hlen+1] = (u16_t) wd->sta.txiv[0];
- header[hlen+2] = (u16_t) (wd->sta.txiv[0] >> 16);
- header[hlen+3] = (u16_t) wd->sta.txiv[1];
- header[hlen+4] = (u16_t) (wd->sta.txiv[1] >> 16);
- header[hlen+5] = (u16_t) wd->sta.txiv[2];
- header[hlen+6] = (u16_t) (wd->sta.txiv[2] >> 16);
- header[hlen+7] = (u16_t) wd->sta.txiv[3];
- header[hlen+8] = (u16_t) (wd->sta.txiv[3] >> 16);
-
- macCtrl |= 0x80;
- icvLen = 16; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 9;
- }
- #endif //ZM_ENABLE_CENC
- }
- }
- } // if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
- } /* if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE ) */
-
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
- {
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if( wd->sta.oppositeInfo[userIdx].wpaState >= ZM_STA_WPA_STATE_PK_OK || wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK)
- {
- int isUnicast = 1 ;
-
- if((da[0]& 0x1))
- {
- isUnicast = 0 ; // Not unicast , is broadcast
- }
-
- if( wd->sta.ibssWpa2Psk == 1 )
- { /* The IV order is not the same between unicast and broadcast ! */
- if ( isUnicast )
- {
- iv16 = &wd->sta.oppositeInfo[userIdx].iv16;
- iv32 = &wd->sta.oppositeInfo[userIdx].iv32;
- }
- else
- {
- iv16 = &wd->sta.iv16;
- iv32 = &wd->sta.iv32;
- }
- }
- else
- {
- iv16 = &wd->sta.iv16;
- iv32 = &wd->sta.iv32;
- }
-
- (*iv16)++;
- if ( *iv16 == 0 )
- {
- *iv32++;
- }
-
- if ( wd->sta.oppositeInfo[userIdx].encryMode == ZM_AES || wd->sta.encryMode == ZM_AES)
- {
- //printk("Station encryption mode is AES-CCMP\n") ;
- b1 = (u8_t) (*iv16);
- b2 = (u8_t) ((*iv16) >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
-
- if ( isUnicast )
- {
- header[hlen+1] = 0x2000;
- }
- else
- {
- header[hlen+1] = 0x2000 | (((u16_t) wd->sta.keyId) << 14);
- }
-
- header[hlen+2] = (u16_t) (*iv32);
- header[hlen+3] = (u16_t) ((*iv32) >> 16);
- macCtrl |= 0xc0;
- icvLen = 8; /* MIC */
- }
-
- header[4] |= 0x4000;
- hlen += 4;
- }
- else if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED)
- {
- if ( (wd->sta.encryMode == ZM_WEP64)||
- (wd->sta.encryMode == ZM_WEP128)||
- (wd->sta.encryMode == ZM_WEP256) )
- {
- header[4] |= 0x4000;
- header[hlen] = 0x0; //IV
- header[hlen+1] = 0x0; //IV
- header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14);
- hlen += 2;
- icvLen = 4;
- macCtrl |= 0x40;
- }
- }
-#else
- /* ----- 20070405 add by Mxzeng ----- */
- if( wd->sta.wpaState >= ZM_STA_WPA_STATE_PK_OK )
- {
- int isUnicast = 1 ;
-
- if((da[0]& 0x1))
- {
- isUnicast = 0 ; // Not unicast , is broadcast
- }
-
- wd->sta.iv16++;
- if ( wd->sta.iv16 == 0 )
- {
- wd->sta.iv32++;
- }
-
- if ( wd->sta.encryMode == ZM_AES )
- {
- //printk("Station encryption mode is AES-CCMP\n") ;
- b1 = (u8_t) wd->sta.iv16;
- b2 = (u8_t) (wd->sta.iv16 >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
-
- if ( isUnicast )
- {
- header[hlen+1] = 0x2000;
- }
- else
- {
- header[hlen+1] = 0x2000 | (((u16_t) wd->sta.keyId) << 14);
- }
-
- header[hlen+2] = (u16_t) (wd->sta.iv32);
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
- macCtrl |= 0xc0;
- icvLen = 8; /* MIC */
- }
-
- header[4] |= 0x4000;
- hlen += 4;
- }
- else if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED)
- {
- if ( (wd->sta.encryMode == ZM_WEP64)||
- (wd->sta.encryMode == ZM_WEP128)||
- (wd->sta.encryMode == ZM_WEP256) )
- {
- header[4] |= 0x4000;
- header[hlen] = 0x0; //IV
- header[hlen+1] = 0x0; //IV
- header[hlen+1] |= (((u16_t) wd->sta.keyId) << 14);
- hlen += 2;
- icvLen = 4;
- macCtrl |= 0x40;
- }
- }
-#endif
- } // End if ( encExemptionActionType == ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION )
- } // End if ( wd->wlanMode == ZM_MODE_IBSS )
- else if ( wd->wlanMode == ZM_MODE_PSEUDO )
- {
- switch (wd->sta.encryMode)
- {
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
- header[4] |= 0x4000;
- header[hlen] = 0x0; //IV
- header[hlen+1] = 0x0; //IV
- hlen += 2;
- icvLen = 4;
- macCtrl |= 0x40;
- break;
-
- case ZM_TKIP:
- {
- wd->sta.iv16++;
- if ( wd->sta.iv16 == 0 )
- {
- wd->sta.iv32++;
- }
-
- b1 = (u8_t) (wd->sta.iv16 >> 8);
- b2 = (b1 | 0x20) & 0x7f;
- header[hlen] = ((u16_t)b2 << 8) + b1;
- b1 = (u8_t) wd->sta.iv16;
- b2 = 0x20;
- header[hlen+1] = ((u16_t)b2 << 8) + b1;
- header[hlen+2] = (u16_t) wd->sta.iv32;
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
-
- //macCtrl |= 0x80;
- macCtrl |= 0x40;
- icvLen = 4;
-
- /* set hardware MIC */
- if ( (!(seq & 0xf))&&(!(flag & 0x4)) )
- {
- macCtrl |= 0x100;
- plusLen += 8;
- *micLen = 8;
- }
-
- header[4] |= 0x4000;
- hlen += 4;
- }/* end of PSEUDO TKIP */
- break;
-
- case ZM_AES:
- {
- wd->sta.iv16++;
- if ( wd->sta.iv16 == 0 )
- {
- wd->sta.iv32++;
- }
-
- b1 = (u8_t) wd->sta.iv16;
- b2 = (u8_t) (wd->sta.iv16 >> 8);
- header[hlen] = ((u16_t)b2 << 8) + b1;
- header[hlen+1] = 0x2000;
- header[hlen+2] = (u16_t) (wd->sta.iv32);
- header[hlen+3] = (u16_t) (wd->sta.iv32 >> 16);
- macCtrl |= 0xc0;
- icvLen = 8; /* MIC */
- header[4] |= 0x4000;
- hlen += 4;
- }/* end of PSEUDO AES */
- break;
-
- #ifdef ZM_ENABLE_CENC
- case ZM_CENC:
- /* Accumlate the PN sequence */
- wd->sta.txiv[0] += 2;
-
- if (wd->sta.txiv[0] == 0 || wd->sta.txiv[0] == 1)
- {
- wd->sta.txiv[1]++;
- }
-
- if (wd->sta.txiv[1] == 0)
- {
- wd->sta.txiv[2]++;
- }
-
- if (wd->sta.txiv[2] == 0)
- {
- wd->sta.txiv[3]++;
- }
-
- if (wd->sta.txiv[3] == 0)
- {
- wd->sta.txiv[0] = 0;
- wd->sta.txiv[1] = 0;
- wd->sta.txiv[2] = 0;
- }
-
- header[hlen] = 0;
- header[hlen+1] = (u16_t) wd->sta.txiv[0];
- header[hlen+2] = (u16_t) (wd->sta.txiv[0] >> 16);
- header[hlen+3] = (u16_t) wd->sta.txiv[1];
- header[hlen+4] = (u16_t) (wd->sta.txiv[1] >> 16);
- header[hlen+5] = (u16_t) wd->sta.txiv[2];
- header[hlen+6] = (u16_t) (wd->sta.txiv[2] >> 16);
- header[hlen+7] = (u16_t) wd->sta.txiv[3];
- header[hlen+8] = (u16_t) (wd->sta.txiv[3] >> 16);
-
- macCtrl |= 0x80;
- icvLen = 16; /* MIC */
-
- header[4] |= 0x4000;
- hlen += 9;
- break;
- #endif //ZM_ENABLE_CENC
- }/* end of switch */
- }
-
- /* Generate control setting */
-
- /* protection mode */
- if (wd->enableProtectionMode)
- {
- if (wd->enableProtectionMode==2)
- {
- /* Force enable protection: self cts */
- macCtrl &= 0xFFFC;
- macCtrl |= 2;
- }
- /* if wd->enableProtectionMode=1 => force disable */
- /* if wd->enableProtectionMode=0 => auto */
- }
- else
- {
-
- /* protection mode */
- if (wd->sta.bProtectionMode == TRUE)
- {
- /* Enable Self-CTS */
- macCtrl &= 0xFFFC;
- macCtrl |= 2;
- }
- }
-
- }
-
- if (wd->txMCS != 0xff)
- {
- /* fixed rate */
- phyCtrl = ((u32_t)wd->txMCS<<16) + wd->txMT;
- mcs = wd->txMCS;
- mt = wd->txMT;
- }
-
- if (mt == 2)
- {
-#if 0
- /* HT PT: 0 Mixed mode 1 Green field */
- if (wd->sta.preambleTypeHT == ZM_PREAMBLE_TYPE_GREEN_FIELD)
- {
- phyCtrl |= 0x4; /* Bit 2 */
- }
-#endif
- /* Bandwidth */
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ)
- {
- phyCtrl |= (0x80<<16); /* BIT 23 */
- }
-#if 0
- /* STBC */
- if (wd->sta.htCtrlSTBC<=0x3)
- {
- phyCtrl |= (wd->sta.htCtrlSTBC<<28); /* BIT 23 */
- }
-#endif
- /* Short GI */
- if(wd->sta.htCtrlSG)
- {
- phyCtrl |= (0x8000<<16); /* BIT 31 */
- }
-
- /* TA */
- if ( ((mcs >=0x8) && (mcs<=0xf)) || (wd->sta.htCtrlSTBC) )
- {
- phyCtrl |= 0x1800; /* BIT 11 12 */
- }
- }
- else if(mt == 1)
- {
- #if 0
- //bug that cause OFDM rate become duplicate legacy rate
- /* Bandwidth */
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ)
- {
- phyCtrl |= (0x80<<16); /* BIT 23 */
- mt = 3; /* duplicate legacy */
- phyCtrl |= mt;
- }
- #endif
- }
- else if(mt == 0)
- {
- /* CCK PT: Legcy Preamble: 1 long preamble 2 short preamble */
- if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_SHORT)
- {
- //phyCtrl |= 0x4; /* BIT 2 */
- }
- }
-
- /* TA */
- if (wd->sta.defaultTA)
- {
- phyCtrl |= 0x1000;
- }
- else
- {
- phyCtrl |= 0x0800;
- }
-
- //Get CurrentTxRate -- CWYang(+)
- if ((mt == 0) || (mt == 1)) //B,G Rate
- {
- if (mcs < 16)
- {
- wd->CurrentTxRateKbps = zcIndextoRateBG[mcs];
- }
- }
- else if (mt == 2)
- {
- if (mcs < 16)
- {
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ)
- {
- if((phyCtrl & 0x80000000) != 0)
- {
- /* Short GI 40 MHz MIMO Rate */
- wd->CurrentTxRateKbps = zcIndextoRateN40S[mcs];
- }
- else
- {
- /* Long GI 40 MHz MIMO Rate */
- wd->CurrentTxRateKbps = zcIndextoRateN40L[mcs];
- }
- }
- else
- {
- if((phyCtrl & 0x80000000) != 0)
- {
- /* Short GI 20 MHz MIMO Rate */
- wd->CurrentTxRateKbps = zcIndextoRateN20S[mcs];
- }
- else
- {
- /* Long GI 20 MHz MIMO Rate */
- wd->CurrentTxRateKbps = zcIndextoRateN20L[mcs];
- }
- }
- }
- }
-
- //802.11 header(include IV) = (hlen<<1)-8
- //ethernet frame = len
- //snap + mic = plusLen
- //ethernet header = minusLen
- //icv = icvLen
- //crc32 = 4
- //length=802.11 header+snap+(ethernet frame-ethernet header)+mic+icv+crc32
- header[0] = ((hlen<<1)-8)+plusLen+(len-minusLen)+icvLen+4; //Length
-
- // header[0] : MPDU Lengths
- if ((header[6] & 0x1) != 0x1) // Unicast Frame
- {
- if (header[0] >= wd->rtsThreshold)
- {
- /* Enable RTS */
- macCtrl |= 1;
- }
- }
-
- if ( wd->sta.encryMode == ZM_TKIP )
- tkipFrameOffset = 8;
-
- if( wd->sta.EnableHT != 1 )
- { // Aggregation should not be fragmented !
- if ( header[0] > ( wd->fragThreshold + tkipFrameOffset ) )
- {
- return 0; // Need to be fragmented ! !
- }
- }
-
- //if ( wd->sta.encryMode == ZM_TKIP )
- //{
- // zm_debug_msg1("ctrl length = ", header[0]);
- //}
-
- //MAC control
- if (rateProbingFlag != 0)
- {
- macCtrl |= 0x8000;
- }
- header[1] = macCtrl;
- //PHY control L
- header[2] = (u16_t) ((phyCtrl&0xffff) | 0x700 | (zcUpToAc[up&0x7]<<13));
- //PHY control H
- header[3] = (u16_t) ((phyCtrl>>16) | 0x700);
-
- if (wd->enableAggregation)
- {
- /* force enable aggregation */
- if (wd->enableAggregation==2 && !(header[6]&0x1))
- {
- if (((header[2] & 0x3) == 2))
- {
- /* Enable aggregation */
- header[1] |= 0x20;
- }
- }
- /* if wd->enableAggregation=1 => force disable */
- /* if wd->enableAggregation=0 => auto */
- }
-
-#ifdef ZM_ENABLE_AGGREGATION
- if (wd->addbaComplete) {
- #ifdef ZM_BYPASS_AGGR_SCHEDULING
- if (!(header[6]&0x1) && !rateProbingFlag && (wd->enableAggregation != 1))
- {
- if (((header[2] & 0x3) == 2))
- {
- /* Unicast frame with HT rate => Enable aggregation */
- /* We only support software encryption in single packet mode */
- if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 &&
- (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0)
- {
- /* Set aggregation group bits per AC */
- header[1] |= (0x20 | (zcUpToAc[up&0x7]<<10));
-
- //if (wd->sta.currentFrequency < 3000)
- {
- /* issue: -PB42 Enable RTS/CTS to prevent OWL Tx hang up */
- /* If this is Owl Ap, enable RTS/CTS protect */
- if ( (wd->sta.athOwlAp == 1) || (wd->sta.RTSInAGGMode == TRUE) )
- {
- header[1] &= 0xfffc;
- header[1] |= 0x1;
- }
-
- /* Enable RIFS : workaround 854T RTS/CTS */
- /* Bit13 : TI enable RIFS */
- //header[1] |= 0x2000;
- }
- }
- }
- }
- #else
- /*
- * aggregation ampduIndication control
- */
- if (aggControl && aggControl->aggEnabled) {
- if (wd->enableAggregation==0 && !(header[6]&0x1))
- {
- if (((header[2] & 0x3) == 2))
- {
- /* Enable aggregation */
- header[1] |= 0x20;
- if (ZM_AGG_LAST_MPDU == aggControl->ampduIndication)
- header[1] |= 0x4000;
- }
- else {
- zm_debug_msg1("no aggr, header[2]&0x3 = ",header[2] & 0x3)
- aggControl->aggEnabled = 0;
- }
- }
- else {
- zm_debug_msg1("no aggr, wd->enableAggregation = ", wd->enableAggregation);
- zm_debug_msg1("no aggr, !header[6]&0x1 = ",!(header[6]&0x1));
- aggControl->aggEnabled = 0;
- }
- }
- #endif
-
- #ifdef ZM_AGGR_BIT_ON
- if (!(header[6]&0x1) && !rateProbingFlag)
- {
- if (((header[2] & 0x3) == 2))
- {
- /* Unicast frame with HT rate => Enable aggregation */
- /* Set aggregation group bits per AC */
- header[1] |= (0x20 | (zcUpToAc[up&0x7]<<10));
-
- //if (wd->sta.currentFrequency < 3000)
- {
- /* Enable RTS/CTS to prevent OWL Tx hang up */
- header[1] &= 0xfffc;
- header[1] |= 0x1;
- }
- }
- }
- #endif
- }
-#endif
-
- return (hlen<<1);
-}
-
-
-u16_t zfTxGenMmHeader(zdev_t* dev, u8_t frameType, u16_t* dst,
- u16_t* header, u16_t len, zbuf_t* buf, u16_t vap, u8_t encrypt)
-{
- //u16_t bodyLen;
- u8_t hlen = 32; // MAC ctrl + PHY ctrl + 802.11 MM header
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /* Generate control setting */
- //bodyLen = zfwBufGetSize(dev, buf);
- header[0] = 24+len+4; //Length
- if ((dst[0] & 0x1) != 0) //Broadcast, multicast frames
- {
- header[1] = 0xc; //MAC control, backoff + noack
- }
- else
- {
- header[1] = 0x8; //MAC control, backoff + (ack)
- }
- /* Dualband Management frame tx Rate */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- if (wd->frequency < 3000)
- {
- /* CCK 1M */
- header[2] = 0x0f00; //PHY control L
- header[3] = 0x0000; //PHY control H
- }
- else
- {
- /* CCK 6M */
- header[2] = 0x0f01; //PHY control L
- header[3] = 0x000B; //PHY control H
- }
- }
- else
- {
- if (wd->sta.currentFrequency < 3000)
- {
- /* CCK 2M */
- header[2] = 0x0f00; //PHY control L
- header[3] = 0x0001; //PHY control H
- }
- else
- {
- /* CCK 6M */
- header[2] = 0x0f01; //PHY control L
- header[3] = 0x000B; //PHY control H
- }
- }
- /* Generate WLAN header */
- /* Frame control */
- header[4+0] = frameType;
- /* Duration */
- header[4+1] = 0;
-
- if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- if ( frameType == ZM_WLAN_FRAME_TYPE_PROBEREQ )
- {
- header[4+8] = 0xFFFF;
- header[4+9] = 0xFFFF;
- header[4+10] = 0xFFFF;
- }
- else if ( frameType == ZM_WLAN_FRAME_TYPE_BA ) {
- /* do nothing */
- }
- else
- {
- header[4+8] = wd->sta.bssid[0];
- header[4+9] = wd->sta.bssid[1];
- header[4+10] = wd->sta.bssid[2];
- }
- }
- else if (wd->wlanMode == ZM_MODE_PSEUDO)
- {
- /* Address 3 = 00:00:00:00:00:00 */
- header[4+8] = 0;
- header[4+9] = 0;
- header[4+10] = 0;
- }
- else if (wd->wlanMode == ZM_MODE_IBSS)
- {
- header[4+8] = wd->sta.bssid[0];
- header[4+9] = wd->sta.bssid[1];
- header[4+10] = wd->sta.bssid[2];
-
- if ( frameType == ZM_WLAN_FRAME_TYPE_ATIM )
- {
- /* put ATIM to queue 5th */
- //header[2] |= (ZM_BIT_13|ZM_BIT_14);
- header[2] |= ZM_BIT_15;
- }
- }
- else if (wd->wlanMode == ZM_MODE_AP)
- {
- /* Address 3 = BSSID */
- header[4+8] = wd->macAddr[0];
- header[4+9] = wd->macAddr[1];
-#ifdef ZM_VAPMODE_MULTILE_SSID
- header[4+10] = wd->macAddr[2]; //Multiple SSID
-#else
- header[4+10] = wd->macAddr[2] + (vap<<8); //VAP
-#endif
- //if in scan, must set address 3 to broadcast because of some ap would care this
- //if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN)
- // == ZM_BSSID_LIST_SCAN)
- //if FrameType is Probe Request, Address3 should be boradcast
- if (frameType == ZM_WLAN_FRAME_TYPE_PROBEREQ)
- {
- header[4+8] = 0xFFFF;
- header[4+9] = 0xFFFF;
- header[4+10] = 0xFFFF;
- }
- }
-
- /* Address 1 = DA */
- header[4+2] = dst[0];
- header[4+3] = dst[1];
- header[4+4] = dst[2];
-
- /* Address 2 = SA */
- header[4+5] = wd->macAddr[0];
- header[4+6] = wd->macAddr[1];
- if (wd->wlanMode == ZM_MODE_AP)
- {
-#ifdef ZM_VAPMODE_MULTILE_SSID
- header[4+7] = wd->macAddr[2]; //Multiple SSID
-#else
- header[4+7] = wd->macAddr[2] + (vap<<8); //VAP
-#endif
- }
- else
- {
- header[4+7] = wd->macAddr[2];
- }
-
- /* Sequence Control */
- zmw_enter_critical_section(dev);
- header[4+11] = ((wd->mmseq++)<<4);
- zmw_leave_critical_section(dev);
-
- if( frameType == ZM_WLAN_FRAME_TYPE_QOS_NULL )
- {
- /*Qos Control*/
- header[4+12] = 0x0;
- hlen+=2;
- header[0]+=2;
- }
-
- if ( encrypt )
- {
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
- {
- if ( (wd->sta.encryMode == ZM_WEP64)||
- (wd->sta.encryMode == ZM_WEP128)||
- (wd->sta.encryMode == ZM_WEP256) )
- {
- header[4] |= 0x4000;
- header[16] = 0x0; //IV
- header[17] = 0x0; //IV
- header[17] |= (((u16_t) wd->sta.keyId) << 14);
- hlen += 4;
-
- header[0] += 8; // icvLen = 4;
- header[1] |= 0x40; // enable encryption on macCtrl
- }
- }
- }
-
- // Enable HW duration
- if ( frameType != ZM_WLAN_FRAME_TYPE_PSPOLL )
- {
- header[1] |= 0x200;
- }
-
- return hlen;
-}
-
-void zfInitMacApMode(zdev_t* dev)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- zfHpEnableBeacon(dev, ZM_MODE_AP, (wd->beaconInterval/wd->ap.vapNumber), 1, 0);
-
- /* AP mode */
- zfHpSetApStaMode(dev, ZM_HAL_80211_MODE_AP);
-
- /* VAP test code */
- /* AP + VAP mode */
- if (wd->ap.vapNumber >= 2)
- {
- for (i=1; i<ZM_MAX_AP_SUPPORT; i++)
- {
- if (((wd->ap.apBitmap >> i) & 0x1) != 0)
- {
- u16_t mac[3];
- mac[0] = wd->macAddr[0];
- mac[1] = wd->macAddr[1];
-#ifdef ZM_VAPMODE_MULTILE_SSID
- mac[2] = wd->macAddr[2]; //Multiple SSID
-#else
- mac[2] = wd->macAddr[2] + (i<<8); //VAP
-#endif
- zfHpSetMacAddress(dev, mac, i);
-
- }
- }
- }
-
- /* basic rate setting */
- zfHpSetBasicRateSet(dev, wd->bRateBasic, wd->gRateBasic);
-
- /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME AP default. */
- zfUpdateDefaultQosParameter(dev, 1);
-
- return;
-}
-
-u16_t zfChGetNextChannel(zdev_t* dev, u16_t frequency, u8_t* pbPassive)
-{
- u8_t i;
- u8_t bPassive;
-
- zmw_get_wlan_dev(dev);
-
- /* Avoid NULL value */
- if ( pbPassive == NULL )
- {
- pbPassive = &bPassive;
- }
-
- for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
- {
- if ( wd->regulationTable.allowChannel[i].channel == frequency )
- {
- if ( i == (wd->regulationTable.allowChannelCnt-1) )
- {
- i = 0;
- }
- else
- {
- i++;
- }
-
- if ( wd->regulationTable.allowChannel[i].channelFlags
- & ZM_REG_FLAG_CHANNEL_PASSIVE )
- {
- *pbPassive = TRUE;
- }
- else
- {
- *pbPassive = FALSE;
- }
-
- return wd->regulationTable.allowChannel[i].channel;
- }
- }
-
- return 0xffff;
-}
-
-u16_t zfChGetFirstChannel(zdev_t* dev, u8_t* pbPassive)
-{
- u8_t bPassive;
-
- zmw_get_wlan_dev(dev);
-
- /* Avoid NULL value */
- if ( pbPassive == NULL )
- {
- pbPassive = &bPassive;
- }
-
- if ( wd->regulationTable.allowChannel[0].channelFlags & ZM_REG_FLAG_CHANNEL_PASSIVE )
- {
- *pbPassive = TRUE;
- }
- else
- {
- *pbPassive = FALSE;
- }
-
- return wd->regulationTable.allowChannel[0].channel;
-}
-
-u16_t zfChGetFirst2GhzChannel(zdev_t* dev)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
- {
- if ( wd->regulationTable.allowChannel[i].channel < 3000 )
- {
- /* find the first 2Ghz channel */
- return wd->regulationTable.allowChannel[i].channel;
- }
- }
-
- /* Can not find any 2Ghz channel */
- return 0;
-}
-
-u16_t zfChGetFirst5GhzChannel(zdev_t* dev)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
- {
- if ( wd->regulationTable.allowChannel[i].channel > 3000 )
- {
- /* find the first 5Ghz channel */
- return wd->regulationTable.allowChannel[i].channel;
- }
- }
-
- /* Can not find any 5Ghz channel */
- return 0;
-}
-
-u16_t zfChGetLastChannel(zdev_t* dev, u8_t* pbPassive)
-{
- u8_t bPassive;
- u8_t ChannelIndex;
-
- zmw_get_wlan_dev(dev);
-
- ChannelIndex = wd->regulationTable.allowChannelCnt-1;
-
- /* Avoid NULL value */
- if ( pbPassive == NULL )
- {
- pbPassive = &bPassive;
- }
-
- if ( wd->regulationTable.allowChannel[ChannelIndex].channelFlags
- & ZM_REG_FLAG_CHANNEL_PASSIVE )
- {
- *pbPassive = TRUE;
- }
- else
- {
- *pbPassive = FALSE;
- }
-
- return wd->regulationTable.allowChannel[ChannelIndex].channel;
-}
-
-u16_t zfChGetLast5GhzChannel(zdev_t* dev)
-{
- u8_t i;
- u16_t last5Ghzfrequency;
-
- zmw_get_wlan_dev(dev);
-
- last5Ghzfrequency = 0;
- for( i=0; i<wd->regulationTable.allowChannelCnt; i++ )
- {
- if ( wd->regulationTable.allowChannel[i].channel > 3000 )
- {
- last5Ghzfrequency = wd->regulationTable.allowChannel[i].channel;
- }
- }
-
- return last5Ghzfrequency;
-}
-
-/* freqBand = 0 => auto check */
-/* = 1 => 2.4 GHz band */
-/* = 2 => 5 GHz band */
-u16_t zfChNumToFreq(zdev_t* dev, u8_t ch, u8_t freqBand)
-{
- u16_t freq = 0xffff;
-
- if ( freqBand == 0 )
- {
- if (ch > 14)
- { /* adapter is at 5 GHz band */
- freqBand = 2;
- }
- else
- {
- freqBand = 1;
- }
- }
-
- if ( freqBand == 2 )
- { /* the channel belongs to 5 GHz band */
- if ( (ch >= 184)&&(ch <= 196) )
- {
- freq = 4000 + ch*5;
- }
- else
- {
- freq = 5000 + ch*5;
- }
- }
- else
- { /* the channel belongs to 2.4 GHz band */
- if ( ch == 14 )
- {
- freq = ZM_CH_G_14;
- }
- else
- {
- freq = ZM_CH_G_1 + (ch-1)*5;
- }
- }
-
- return freq;
-}
-
-u8_t zfChFreqToNum(u16_t freq, u8_t* pbIs5GBand)
-{
- u8_t ch;
- u8_t Is5GBand;
-
- /* to avoid NULL value */
- if ( pbIs5GBand == NULL )
- {
- pbIs5GBand = &Is5GBand;
- }
-
- *pbIs5GBand = FALSE;
-
- if ( freq == ZM_CH_G_14 )
- {
- ch = 14;
- }
- else if ( freq < 4000 )
- {
- ch = (freq - ZM_CH_G_1) / 5 + 1;
- }
- else if ( freq < 5000 )
- {
- ch = (freq - 4000) / 5;
- *pbIs5GBand = TRUE;
- }
- else
- {
- ch = (freq - 5000) / 5;
- *pbIs5GBand = TRUE;
- }
-
- return ch;
-}
diff --git a/drivers/staging/otus/80211core/cmm.c b/drivers/staging/otus/80211core/cmm.c
deleted file mode 100644
index 007ef3b..0000000
--- a/drivers/staging/otus/80211core/cmm.c
+++ /dev/null
@@ -1,2183 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : mm.c */
-/* */
-/* Abstract */
-/* This module contains common functions for handle management */
-/* frame. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#include "../hal/hpreg.h"
-
-/* TODO : put all constant tables to a file */
-const u8_t zg11bRateTbl[4] = {2, 4, 11, 22};
-const u8_t zg11gRateTbl[8] = {12, 18, 24, 36, 48, 72, 96, 108};
-
-/* 0xff => element does not exist */
-const u8_t zgElementOffsetTable[] =
-{
- 4, /* 0 : asoc req */
- 6, /* 1 : asoc rsp */
- 10, /* 2 : reasoc req*/
- 6, /* 3 : reasoc rsp */
- 0, /* 4 : probe req */
- 12, /* 5 : probe rsp */
- 0xff, /* 6 : reserved */
- 0xff, /* 7 : reserved */
- 12, /* 8 : beacon */
- 4, /* 9 : ATIM */
- 0xff, /* 10 : disasoc */
- 6, /* 11 : auth */
- 0xff, /* 12 : deauth */
- 4, /* 13 : action */
- 0xff, /* 14 : reserved */
- 0xff, /* 15 : reserved */
-};
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfFindElement */
-/* Find a specific element in management frame */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : management frame buffer */
-/* eid : target element id */
-/* */
-/* OUTPUTS */
-/* byte offset of target element */
-/* or 0xffff if not found */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfFindElement(zdev_t* dev, zbuf_t* buf, u8_t eid)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id, HTEid=0;
- u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01};
- u8_t oui11n[3] = {0x00,0x90,0x4C};
- u8_t HTType = 0;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- // jhlee HT 0
-
- if ((eid == ZM_WLAN_EID_HT_CAPABILITY) ||
- (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY))
- {
- HTEid = eid;
- eid = ZM_WLAN_EID_WPA_IE;
- HTType = 1;
- }
-
-
- bufLen = zfwBufGetSize(dev, buf);
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == eid)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 && eid != ZM_WLAN_EID_SSID)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( eid == ZM_WLAN_EID_WPA_IE )
- {
- /* avoid sta to be thought use 11n when find a WPA_IE */
- if ( (HTType == 0) && zfRxBufferEqualToStr(dev, buf, oui, offset+2, 4) )
- {
- return offset;
- }
-
- // jhlee HT 0
- // CWYang(+)
-
- if ((HTType == 1) && ( zfRxBufferEqualToStr(dev, buf, oui11n, offset+2, 3) ))
- {
- if ( zmw_rx_buf_readb(dev, buf, offset+5) == HTEid )
- {
- return offset + 5;
- }
- }
-
- }
- else
- {
- return offset;
- }
- }
- /* Advance to next element */
- #if 1
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- #else
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- #endif
-
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfFindWifiElement */
-/* Find a specific Wifi element in management frame */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : management frame buffer */
-/* type : OUI type */
-/* subType : OUI subtype */
-/* */
-/* OUTPUTS */
-/* byte offset of target element */
-/* or 0xffff if not found */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.1 */
-/* */
-/************************************************************************/
-u16_t zfFindWifiElement(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t tmp;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
-
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_WIFI_IE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0xF2)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type))
-
- {
- if ( subtype != 0xff )
- {
- tmp = zmw_rx_buf_readb(dev, buf, offset+6);
- if (tmp == subtype)
- {
- return offset;
- }
- }
- else
- {
- return offset;
- }
- }
- }
- /* Advance to next element */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-u16_t zfRemoveElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t eid)
-{
- u16_t offset = 0;
- u16_t elen;
- u8_t HTEid = 0;
- u8_t oui[4] = {0x00, 0x50, 0xf2, 0x01};
- u8_t oui11n[3] = {0x00,0x90,0x4C};
- u8_t HTType = 0;
-
- if ((eid == ZM_WLAN_EID_HT_CAPABILITY) ||
- (eid == ZM_WLAN_EID_EXTENDED_HT_CAPABILITY))
- {
- HTEid = eid;
- eid = ZM_WLAN_EID_WPA_IE;
- HTType = 1;
- }
-
- while (offset < size)
- {
- elen = *(buf+offset+1);
-
- if (*(buf+offset) == eid)
- {
- if ( eid == ZM_WLAN_EID_WPA_IE )
- {
- if ( (HTType == 0)
- && (*(buf+offset+2) == oui[0])
- && (*(buf+offset+3) == oui[1])
- && (*(buf+offset+4) == oui[2])
- && (*(buf+offset+5) == oui[3]) )
- {
- zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
- return (size-elen-2);
- }
-
- if ( (HTType == 1)
- && (*(buf+offset+2) == oui11n[0])
- && (*(buf+offset+3) == oui11n[1])
- && (*(buf+offset+4) == oui11n[2])
- && (*(buf+offset+5) == HTEid) )
- {
- zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
- return (size-elen-2);
- }
- }
- else
- {
- zfMemoryMove(buf+offset, buf+offset+elen+2, size-offset-elen-2);
- return (size-elen-2);
- }
- }
-
- offset += (elen+2);
- }
-
- return size;
-}
-
-u16_t zfUpdateElement(zdev_t* dev, u8_t* buf, u16_t size, u8_t* updateeid)
-{
- u16_t offset = 0;
- u16_t elen;
-
- while (offset < size) {
- elen = *(buf+offset+1);
-
- if (*(buf+offset) == updateeid[0]) {
- if (updateeid[1] <= elen) {
- zfMemoryMove(buf+offset, updateeid, updateeid[1]+2);
- zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2);
-
- return size-(elen-updateeid[1]);
- } else {
- zfMemoryMove(buf+offset+updateeid[1]+2, buf+offset+elen+2, size-offset-elen-2);
- zfMemoryMove(buf+offset, updateeid, updateeid[1]+2);
-
- return size+(updateeid[1]-elen);
- }
- }
-
- offset += (elen+2);
- }
-
- return size;
-}
-
-u16_t zfFindSuperGElement(zdev_t* dev, zbuf_t* buf, u8_t type)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t super_feature;
- u8_t ouiSuperG[6] = {0x00,0x03,0x7f,0x01, 0x01, 0x00};
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_VENDOR_PRIVATE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- if (zfRxBufferEqualToStr(dev, buf, ouiSuperG, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6))
- {
- /* super_feature 0:useFastFrame, 1:useCompression, 2:useTurboPrime */
- super_feature= zmw_rx_buf_readb(dev, buf, offset+8);
- if ((super_feature & 0x01) || (super_feature & 0x02) || (super_feature & 0x04))
- {
- return offset;
- }
- }
- }
- /* Advance to next element */
- #if 1
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- #else
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- #endif
-
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-u16_t zfFindXRElement(zdev_t* dev, zbuf_t* buf, u8_t type)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t ouixr[6] = {0x00,0x03,0x7f,0x03, 0x01, 0x00};
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_VENDOR_PRIVATE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- if (zfRxBufferEqualToStr(dev, buf, ouixr, offset+2, 6) && ( zmw_rx_buf_readb(dev, buf, offset+1) >= 6))
- {
- return offset;
- }
- }
- /* Advance to next element */
- #if 1
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- #else
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- #endif
-
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfMmAddIeSupportRate */
-/* Add information element Support Rate to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* eid : element ID */
-/* rateSet : CCK or OFDM */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfMmAddIeSupportRate(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t eid, u8_t rateSet)
-{
- u8_t len = 0;
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- //if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
- //{
- // return offset;
- //}
-
- /* Information : Support Rate */
- if ( rateSet == ZM_RATE_SET_CCK )
- {
- for (i=0; i<4; i++)
- {
- if ((wd->bRate & (0x1<<i)) == (0x1<<i))
- //if ((0xf & (0x1<<i)) == (0x1<<i))
- {
- zmw_tx_buf_writeb(dev, buf, offset+len+2,
- zg11bRateTbl[i]+((wd->bRateBasic & (0x1<<i))<<(7-i)));
- len++;
- }
- }
- }
- else if ( rateSet == ZM_RATE_SET_OFDM )
- {
- for (i=0; i<8; i++)
- {
- if ((wd->gRate & (0x1<<i)) == (0x1<<i))
- //if ((0xff & (0x1<<i)) == (0x1<<i))
- {
- zmw_tx_buf_writeb(dev, buf, offset+len+2,
- zg11gRateTbl[i]+((wd->gRateBasic & (0x1<<i))<<(7-i)));
- len++;
- }
- }
- }
-
- if (len > 0)
- {
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset, eid);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset+1, len);
-
- /* Return value */
- offset += (2+len);
- }
-
- return offset;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfMmAddIeDs */
-/* Add information element DS to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfMmAddIeDs(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_DS);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, 1);
-
- /* Information : DS */
- zmw_tx_buf_writeb(dev, buf, offset++,
- zfChFreqToNum(wd->frequency, NULL));
-
- return offset;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfMmAddIeErp */
-/* Add information element ERP to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfMmAddIeErp(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_ERP);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, 1);
-
- /* Information : ERP */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->erpElement);
-
- return offset;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfMmAddIeWpa */
-/* Add information element WPA to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Yuan-Gu Wei ZyDAS Technology Corporation 2006.2 */
-/* */
-/************************************************************************/
-u16_t zfMmAddIeWpa(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t apId)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- int i;
-
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- //zmw_inttx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
-
- /* Element Length */
- //zmw_inttx_buf_writeb(dev, buf, offset++, wd->ap.wpaLen);
- for(i = 0; i < wd->ap.wpaLen[apId]; i++)
- {
- /* Information : WPA */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.wpaIe[apId][i]);
- }
-
- return offset;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfMmAddHTCapability */
-/* Add HT Capability Infomation to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Chao-Wen Yang ZyDAS Technology Corporation 2006.06 */
-/* */
-/************************************************************************/
-u16_t zfMmAddHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u8_t OUI[3] = {0x0,0x90,0x4C};
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- /* Prob ID */
- zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- /* Element Length */
- zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length + 4);
-
- /* OUI Data */
- for (i = 0; i < 3; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, OUI[i]);
- }
-
- /* Element Type ID */
- zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.ElementID);
-
- /* HT Capability Data */
- for (i = 0; i < 26; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]);
- }
- }
- else
- {
- /* Element Length */
- zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length + 4);
-
- /* OUI Data */
- for (i = 0; i < 3; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, OUI[i]);
- }
-
- /* Element Type ID */
- zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.ElementID);
-
- /* HT Capability Data */
- for (i = 0; i < 26; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]);
- }
- }
-
- return offset;
-}
-
-
-u16_t zfMmAddPreNHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- //u8_t OUI[3] = {0x0,0x90,0x4C};
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- /* Prob ID */
- zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_PREN2_EID_HTCAPABILITY);
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- /* Element Length */
- zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Data.Length);
-
- /* HT Capability Data */
- for (i = 0; i < 26; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, wd->ap.HTCap.Byte[i+2]);
- }
- }
- else
- {
- /* Element Length */
- zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Data.Length);
-
- /* HT Capability Data */
- for (i = 0; i < 26; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, wd->sta.HTCap.Byte[i+2]);
- }
- }
-
- return offset;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfMmAddExtendedHTCapability */
-/* Add Extended HT Capability Infomation to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Chao-Wen Yang ZyDAS Technology Corporation 2006.06 */
-/* */
-/************************************************************************/
-u16_t zfMmAddExtendedHTCapability(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u8_t OUI[3] = {0x0,0x90,0x4C};
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- /* Prob ID */
- zmw_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WPA_IE);
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- /* Element Length */
- zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.Length + 4);
-
- /* OUI Data */
- for (i = 0; i < 3; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, OUI[i]);
- }
-
- /* Element Type ID */
- zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Data.ElementID);
-
- /* HT Capability Data */
- for (i = 0; i < 22; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, wd->ap.ExtHTCap.Byte[i+2]);
- }
- }
- else
- {
- /* Element Length */
- zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.Length + 4);
-
- /* OUI Data */
- for (i = 0; i < 3; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, OUI[i]);
- }
-
- /* Element Type ID */
- zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Data.ElementID);
-
- /* HT Capability Data */
- for (i = 0; i < 22; i++)
- {
- zmw_buf_writeb(dev, buf, offset++, wd->sta.ExtHTCap.Byte[i+2]);
- }
- }
-
- return offset;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfSendMmFrame */
-/* Send management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* frameType : management frame type */
-/* dst : destination MAC address */
-/* p1 : parameter 1 */
-/* p2 : parameter 2 */
-/* p3 : parameter 3 */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-/* probe req : p1=> bWithSSID, p2=>R, p3=>R */
-/* probe rsp : p1=>R, p2=>R, p3=>VAP ID(AP) */
-/* deauth : p1=>Reason Code, p2=>R, p3=>VAP ID(AP) */
-/* Disasoc : p1=>Reason Code, p2=>R, p3=>VAP ID(AP) */
-/* ATIM : p1=>R, p2=>R, p3=>R */
-/* (re)asoc rsp : p1=>Status Code, p2=>AID, p3=>VAP ID(AP) */
-/* asoc req : p1=>R, p2=>R, p3=>R */
-/* reasoc req : p1=>AP MAC[0], p2=>AP MAC[1], p3=>AP MAC[2] */
-/* auth : p1=>low=Algorithm, high=Transaction, p2=>Status, p3=>VAP ID */
-void zfSendMmFrame(zdev_t* dev, u8_t frameType, u16_t* dst,
- u32_t p1, u32_t p2, u32_t p3)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- u16_t offset = 0;
- u16_t hlen = 32;
- u16_t header[(24+25+1)/2];
- u16_t vap = 0;
- u16_t i;
- u8_t encrypt = 0;
- u16_t aid;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zm_msg2_mm(ZM_LV_2, "Send mm frame, type=", frameType);
- /* TBD : Maximum size of management frame */
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return;
- }
-
- //Reserve room for wlan header
- offset = hlen;
-
- switch (frameType)
- {
- case ZM_WLAN_FRAME_TYPE_PROBEREQ :
- offset = zfSendProbeReq(dev, buf, offset, (u8_t) p1);
- break;
-
- case ZM_WLAN_FRAME_TYPE_PROBERSP :
- zm_msg0_mm(ZM_LV_3, "probe rsp");
- /* 24-31 Time Stamp : hardware WON'T fill this field */
- zmw_tx_buf_writeh(dev, buf, offset, 0);
- zmw_tx_buf_writeh(dev, buf, offset+2, 0);
- zmw_tx_buf_writeh(dev, buf, offset+4, 0);
- zmw_tx_buf_writeh(dev, buf, offset+6, 0);
- offset+=8;
-
- /* Beacon Interval */
- zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
- offset+=2;
-
- if (wd->wlanMode == ZM_MODE_AP)
- {
- vap = (u16_t) p3;
- /* Capability */
- zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
- offset+=2;
- /* SSID */
- offset = zfApAddIeSsid(dev, buf, offset, vap);
- }
- else
- {
- /* Capability */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
- /* SSID */
- offset = zfStaAddIeSsid(dev, buf, offset);
- }
-
- /* Support Rate */
- if ( wd->frequency < 3000 )
- {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
- }
- else
- {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
- }
-
- /* DS parameter set */
- offset = zfMmAddIeDs(dev, buf, offset);
-
- /* TODO ¡G IBSS */
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- offset = zfStaAddIeIbss(dev, buf, offset);
-
- if (wd->frequency < 3000)
- {
- if( wd->wfc.bIbssGMode
- && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
- {
- /* ERP Information */
- wd->erpElement = 0;
- offset = zfMmAddIeErp(dev, buf, offset);
-
- /* Enable G Mode */
- /* Extended Supported Rates */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- }
- }
-
-
- if ((wd->wlanMode == ZM_MODE_AP)
- && (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B))
- {
- /* ERP Information */
- offset = zfMmAddIeErp(dev, buf, offset);
-
- /* Extended Supported Rates */
- if ( wd->frequency < 3000 )
- {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- }
-
- /* ERP Information */
- //offset = zfMmAddIeErp(dev, buf, offset);
-
- /* Extended Supported Rates */
- //offset = zfMmAddIeSupportRate(dev, buf, offset,
- // ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
-
- /* TODO : RSN */
- if (wd->wlanMode == ZM_MODE_AP && wd->ap.wpaSupport[vap] == 1)
- {
- offset = zfMmAddIeWpa(dev, buf, offset, vap);
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS && wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK)
- {
- offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
- }
-
- /* WME Parameters */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- if (wd->ap.qosMode == 1)
- {
- offset = zfApAddIeWmePara(dev, buf, offset, vap);
- }
- }
-
- if ( wd->wlanMode != ZM_MODE_IBSS )
- {
- // jhlee HT 0
- //CWYang(+)
- /* TODO : Need to check if it is ok */
- /* HT Capabilities Info */
- offset = zfMmAddHTCapability(dev, buf, offset);
- //CWYang(+)
- /* Extended HT Capabilities Info */
- offset = zfMmAddExtendedHTCapability(dev, buf, offset);
- }
-
- if ( wd->sta.ibssAdditionalIESize )
- offset = zfStaAddIbssAdditionalIE(dev, buf, offset);
- break;
-
- case ZM_WLAN_FRAME_TYPE_AUTH :
- if (p1 == 0x30001)
- {
- hlen += 4;
- offset += 4; // for reserving wep header
- encrypt = 1;
- }
-
- /* Algotrithm Number */
- zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1&0xffff));
- offset+=2;
-
- /* Transaction Number */
- zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p1>>16));
- offset+=2;
-
- /* Status Code */
- zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p2);
- offset+=2;
-
- if (wd->wlanMode == ZM_MODE_AP)
- {
- vap = (u16_t) p3;
- }
-
- /* Challenge Text => share-2 or share-3 */
- if (p1 == 0x20001)
- {
- if (p2 == 0) //Status == success
- {
- zmw_buf_writeh(dev, buf, offset, 0x8010);
- offset+=2;
- /* share-2 : AP generate challenge text */
- for (i=0; i<128; i++)
- {
- wd->ap.challengeText[i] = (u8_t)zfGetRandomNumber(dev, 0);
- }
- zfCopyToIntTxBuffer(dev, buf, wd->ap.challengeText, offset, 128);
- offset += 128;
- }
- }
- else if (p1 == 0x30001)
- {
- /* share-3 : STA return challenge Text */
- zfCopyToIntTxBuffer(dev, buf, wd->sta.challengeText, offset, wd->sta.challengeText[1]+2);
- offset += (wd->sta.challengeText[1]+2);
- }
-
- break;
-
- case ZM_WLAN_FRAME_TYPE_ASOCREQ :
- case ZM_WLAN_FRAME_TYPE_REASOCREQ :
- /* Capability */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
-
- /* Listen Interval */
- zmw_tx_buf_writeh(dev, buf, offset, 0x0005);
- offset+=2;
-
- /* Reassocaited Request : Current AP address */
- if (frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ)
- {
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]);
- offset+=2;
- }
-
- /* SSID */
- offset = zfStaAddIeSsid(dev, buf, offset);
-
-
- if ( wd->sta.currentFrequency < 3000 )
- {
- /* Support Rate */
- offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
- }
- else
- {
- /* Support Rate */
- offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
- }
-
- if ((wd->sta.capability[1] & ZM_BIT_0) == 1)
- { //spectrum management flag enable
- offset = zfStaAddIePowerCap(dev, buf, offset);
- offset = zfStaAddIeSupportCh(dev, buf, offset);
- }
-
- if (wd->sta.currentFrequency < 3000)
- {
- /* Extended Supported Rates */
- if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N))
- {
- offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- }
-
-
- //offset = zfStaAddIeWpaRsn(dev, buf, offset, frameType);
- //Move to wrapper function, for OS difference--CWYang(m)
- //for windows wrapper, zfwStaAddIeWpaRsn() should be below:
- //u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
- //{
- // return zfStaAddIeWpaRsn(dev, buf, offset, frameType);
- //}
- offset = zfwStaAddIeWpaRsn(dev, buf, offset, frameType);
-
-#ifdef ZM_ENABLE_CENC
- /* CENC */
- //if (wd->sta.encryMode == ZM_CENC)
- offset = zfStaAddIeCenc(dev, buf, offset);
-#endif //ZM_ENABLE_CENC
- if (((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled
- && ((wd->sta.apWmeCapability & 0x1) != 0)) //WME AP
- {
- if (((wd->sta.apWmeCapability & 0x80) != 0) //UAPSD AP
- && ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0)) //UAPSD enabled
- {
- offset = zfStaAddIeWmeInfo(dev, buf, offset, wd->sta.wmeQosInfo);
- }
- else
- {
- offset = zfStaAddIeWmeInfo(dev, buf, offset, 0);
- }
- }
- // jhlee HT 0
- //CWYang(+)
- if (wd->sta.EnableHT != 0)
- {
- #ifndef ZM_DISABLE_AMSDU8K_SUPPORT
- //Support 8K A-MSDU
- if (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED)
- {
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_MaxAMSDULength;
- }
- else
- {
- wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength);
- }
- #else
- //Support 4K A-MSDU
- wd->sta.HTCap.Data.HtCapInfo &= (~HTCAP_MaxAMSDULength);
- #endif
-
- /* HT Capabilities Info */
- if (wd->BandWidth40 == 1) {
- wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
- }
- else {
- wd->sta.HTCap.Data.HtCapInfo &= ~HTCAP_SupChannelWidthSet;
- //wd->sta.HTCap.Data.HtCapInfo |= HTCAP_SupChannelWidthSet;
- }
-
- wd->sta.HTCap.Data.AMPDUParam &= ~HTCAP_MaxRxAMPDU3;
- wd->sta.HTCap.Data.AMPDUParam |= HTCAP_MaxRxAMPDU3;
- wd->sta.HTCap.Data.MCSSet[1] = 0xFF; // MCS 8 ~ 15
- offset = zfMmAddHTCapability(dev, buf, offset);
- offset = zfMmAddPreNHTCapability(dev, buf, offset);
- //CWYang(+)
- /* Extended HT Capabilities Info */
- //offset = zfMmAddExtendedHTCapability(dev, buf, offset);
- }
-
-
- //Store asoc request frame body, for VISTA only
- wd->sta.asocReqFrameBodySize = ((offset - hlen) >
- ZM_CACHED_FRAMEBODY_SIZE)?
- ZM_CACHED_FRAMEBODY_SIZE:(offset - hlen);
- for (i=0; i<wd->sta.asocReqFrameBodySize; i++)
- {
- wd->sta.asocReqFrameBody[i] = zmw_tx_buf_readb(dev, buf, i + hlen);
- }
- break;
-
- case ZM_WLAN_FRAME_TYPE_ASOCRSP :
- case ZM_WLAN_FRAME_TYPE_REASOCRSP :
- vap = (u16_t) p3;
-
- /* Capability */
- zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
- offset+=2;
-
- /* Status Code */
- zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1);
- offset+=2;
-
- /* AID */
- zmw_tx_buf_writeh(dev, buf, offset, (u16_t)(p2|0xc000));
- offset+=2;
-
-
- if ( wd->frequency < 3000 )
- {
- /* Support Rate */
- offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
-
- /* Extended Supported Rates */
- offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- else
- {
- /* Support Rate */
- offset = zfMmAddIeSupportRate(dev, buf, offset, ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
- }
-
-
-
- /* WME Parameters */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- /* TODO : if WME STA then send WME parameter element */
- if (wd->ap.qosMode == 1)
- {
- offset = zfApAddIeWmePara(dev, buf, offset, vap);
- }
- }
- // jhlee HT 0
- //CWYang(+)
- /* HT Capabilities Info */
- offset = zfMmAddHTCapability(dev, buf, offset);
- //CWYang(+)
- /* Extended HT Capabilities Info */
- offset = zfMmAddExtendedHTCapability(dev, buf, offset);
- break;
-
- case ZM_WLAN_FRAME_TYPE_ATIM :
- /* NULL frame */
- /* TODO : add two dumb bytes temporarily */
- offset += 2;
- break;
-
- case ZM_WLAN_FRAME_TYPE_QOS_NULL :
- zmw_buf_writeh(dev, buf, offset, 0x0010);
- offset += 2;
- break;
-
- case ZM_WLAN_DATA_FRAME :
- break;
-
- case ZM_WLAN_FRAME_TYPE_DISASOC :
- case ZM_WLAN_FRAME_TYPE_DEAUTH :
- if (wd->wlanMode == ZM_MODE_AP)
- {
- vap = (u16_t) p3;
-
- aid = zfApFindSta(dev, dst);
- if (aid != 0xffff)
- {
- zmw_enter_critical_section(dev);
- /* Clear STA table */
- wd->ap.staTable[aid].valid = 0;
-
- zmw_leave_critical_section(dev);
-
- if (wd->zfcbDisAsocNotify != NULL)
- {
- wd->zfcbDisAsocNotify(dev, (u8_t*)dst, vap);
- }
- }
- }
- /* Reason Code */
- zmw_tx_buf_writeh(dev, buf, offset, (u16_t)p1);
- offset+=2;
- break;
- }
-
- zfwBufSetSize(dev, buf, offset);
-
- zm_msg2_mm(ZM_LV_2, "management frame body size=", offset-hlen);
-
- //Copy wlan header
- zfTxGenMmHeader(dev, frameType, dst, header, offset-hlen, buf, vap, encrypt);
- for (i=0; i<(hlen>>1); i++)
- {
- zmw_tx_buf_writeh(dev, buf, i*2, header[i]);
- }
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
- //{
- // goto zlError;
- //}
-
- zm_msg2_mm(ZM_LV_2, "offset=", offset);
- zm_msg2_mm(ZM_LV_2, "hlen=", hlen);
- //zm_msg2_mm(ZM_LV_2, "addrTblSize=", addrTblSize);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.len[0]=", addrTbl.len[0]);
- //zm_msg2_mm(ZM_LV_2, "addrTbl.physAddrl[0]=", addrTbl.physAddrl[0]);
- //zm_msg2_mm(ZM_LV_2, "buf->data=", buf->data);
-
- #if 0
- err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
- #else
- zfPutVmmq(dev, buf);
- zfPushVtxq(dev);
- #endif
-
- return;
-#if 0
-zlError:
-
- zfwBufFree(dev, buf, 0);
- return;
-#endif
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfProcessManagement */
-/* Process received management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : received management frame buffer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfProcessManagement(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m)
-{
- u8_t frameType;
- u16_t ta[3];
- u16_t ra[3];
- u16_t vap = 0, index = 0;
- //u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- ra[0] = zmw_rx_buf_readh(dev, buf, 4);
- ra[1] = zmw_rx_buf_readh(dev, buf, 6);
- ra[2] = zmw_rx_buf_readh(dev, buf, 8);
-
- ta[0] = zmw_rx_buf_readh(dev, buf, 10);
- ta[1] = zmw_rx_buf_readh(dev, buf, 12);
- ta[2] = zmw_rx_buf_readh(dev, buf, 14);
-
- frameType = zmw_rx_buf_readb(dev, buf, 0);
-
- if (wd->wlanMode == ZM_MODE_AP)
- {
-#if 1
- vap = 0;
- if ((ra[0] & 0x1) != 1)
- {
- /* AP : Find virtual AP */
- index = zfApFindSta(dev, ta);
- if (index != 0xffff)
- {
- vap = wd->ap.staTable[index].vap;
- }
- }
- zm_msg2_mm(ZM_LV_2, "vap=", vap);
-#endif
-
- /* Dispatch by frame type */
- switch (frameType)
- {
- /* Beacon */
- case ZM_WLAN_FRAME_TYPE_BEACON :
- zfApProcessBeacon(dev, buf);
- break;
- /* Authentication */
- case ZM_WLAN_FRAME_TYPE_AUTH :
- zfApProcessAuth(dev, buf, ta, vap);
- break;
- /* Association request */
- case ZM_WLAN_FRAME_TYPE_ASOCREQ :
- /* Reassociation request */
- case ZM_WLAN_FRAME_TYPE_REASOCREQ :
- zfApProcessAsocReq(dev, buf, ta, vap);
- break;
- /* Association response */
- case ZM_WLAN_FRAME_TYPE_ASOCRSP :
- //zfApProcessAsocRsp(dev, buf);
- break;
- /* Deauthentication */
- case ZM_WLAN_FRAME_TYPE_DEAUTH :
- zfApProcessDeauth(dev, buf, ta, vap);
- break;
- /* Disassociation */
- case ZM_WLAN_FRAME_TYPE_DISASOC :
- zfApProcessDisasoc(dev, buf, ta, vap);
- break;
- /* Probe request */
- case ZM_WLAN_FRAME_TYPE_PROBEREQ :
- zfProcessProbeReq(dev, buf, ta);
- break;
- /* Probe response */
- case ZM_WLAN_FRAME_TYPE_PROBERSP :
- zfApProcessProbeRsp(dev, buf, AddInfo);
- break;
- /* Action */
- case ZM_WLAN_FRAME_TYPE_ACTION :
- zfApProcessAction(dev, buf);
- break;
- }
- }
- else //if ((wd->wlanMode == ZM_MODE_INFRASTRUCTURE) || (wd->wlanMode == ZM_MODE_IBSS))
- {
- /* Dispatch by frame type */
- switch (frameType)
- {
- /* Beacon */
- case ZM_WLAN_FRAME_TYPE_BEACON :
- /* if enable 802.11h and current channel is silent but receive beacon from other AP */
- if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
- & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable)
- {
- wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
- &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE);
- }
- zfStaProcessBeacon(dev, buf, AddInfo); //CWYang(m)
- break;
- /* Authentication */
- case ZM_WLAN_FRAME_TYPE_AUTH :
- /* TODO : vap parameter is useless in STA mode, get rid of it */
- zfStaProcessAuth(dev, buf, ta, 0);
- break;
- /* Association request */
- case ZM_WLAN_FRAME_TYPE_ASOCREQ :
- /* TODO : vap parameter is useless in STA mode, get rid of it */
- zfStaProcessAsocReq(dev, buf, ta, 0);
- break;
- /* Association response */
- case ZM_WLAN_FRAME_TYPE_ASOCRSP :
- /* Reassociation request */
- case ZM_WLAN_FRAME_TYPE_REASOCRSP :
- zfStaProcessAsocRsp(dev, buf);
- break;
- /* Deauthentication */
- case ZM_WLAN_FRAME_TYPE_DEAUTH :
- zm_debug_msg0("Deauthentication received");
- zfStaProcessDeauth(dev, buf);
- break;
- /* Disassociation */
- case ZM_WLAN_FRAME_TYPE_DISASOC :
- zm_debug_msg0("Disassociation received");
- zfStaProcessDisasoc(dev, buf);
- break;
- /* Probe request */
- case ZM_WLAN_FRAME_TYPE_PROBEREQ :
- zfProcessProbeReq(dev, buf, ta);
- break;
- /* Probe response */
- case ZM_WLAN_FRAME_TYPE_PROBERSP :
- /* if enable 802.11h and current channel is silent but receive probe response from other AP */
- if (((wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
- & ZM_REG_FLAG_CHANNEL_CSA) != 0) && wd->sta.DFSEnable)
- {
- wd->regulationTable.allowChannel[wd->regulationTable.CurChIndex].channelFlags
- &= ~(ZM_REG_FLAG_CHANNEL_CSA & ZM_REG_FLAG_CHANNEL_PASSIVE);
- }
- zfStaProcessProbeRsp(dev, buf, AddInfo);
- break;
-
- case ZM_WLAN_FRAME_TYPE_ATIM:
- zfStaProcessAtim(dev, buf);
- break;
- /* Action */
- case ZM_WLAN_FRAME_TYPE_ACTION :
- zm_msg0_mm(ZM_LV_2, "ProcessActionMgtFrame");
- zfStaProcessAction(dev, buf);
- break;
- }
- }
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfProcessProbeReq */
-/* Process probe request management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : auth frame buffer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src)
-{
- u16_t offset;
- u8_t len;
- u16_t i, j;
- u8_t ch;
- u16_t sendFlag;
-
- zmw_get_wlan_dev(dev);
-
- /* check mode : AP/IBSS */
- if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS))
- {
- zm_msg0_mm(ZM_LV_3, "Ignore probe req");
- return;
- }
-
- if ((wd->wlanMode != ZM_MODE_AP) && (wd->sta.adapterState == ZM_STA_STATE_DISCONNECT))
- {
- zm_msg0_mm(ZM_LV_3, "Packets dropped due to disconnect state");
- return;
- }
-
- if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, 0, 0, 0);
-
- return;
- }
-
- /* check SSID */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID);
- if (offset == 0xffff)
- {
- zm_msg0_mm(ZM_LV_3, "probe req SSID not found");
- return;
- }
-
- len = zmw_rx_buf_readb(dev, buf, offset+1);
-
- for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
- {
- if ((wd->ap.apBitmap & (1<<i)) != 0)
- {
- zm_msg1_mm(ZM_LV_3, "len=", len);
- sendFlag = 0;
- /* boardcast SSID */
- if (len == 0)
- {
- if (wd->ap.hideSsid[i] == 0)
- {
- sendFlag = 1;
- }
- }
- /* Not broadcast SSID */
- else if (wd->ap.ssidLen[i] == len)
- {
- for (j=0; j<len; j++)
- {
- ch = zmw_rx_buf_readb(dev, buf, offset+2+j);
- if (ch != wd->ap.ssid[i][j])
- {
- break;
- }
- }
- if (j == len)
- {
- sendFlag = 1;
- }
- }
- if (sendFlag == 1)
- {
- /* Send probe response */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, i);
- }
- }
- }
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfProcessProbeRsp */
-/* Process probe response management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : auth frame buffer */
-/* AddInfo : Rx Header and Rx Mac Status */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Aress Yang ZyDAS Technology Corporation 2006.11 */
-/* */
-/************************************************************************/
-void zfProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
-{
- /* Gather scan result */
- /* Parse TIM and send PS-POLL in power saving mode */
- struct zsWlanProbeRspFrameHeader* pProbeRspHeader;
- struct zsBssInfo* pBssInfo;
- u8_t pBuf[sizeof(struct zsWlanProbeRspFrameHeader)];
- int res;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zfCopyFromRxBuffer(dev, buf, pBuf, 0,
- sizeof(struct zsWlanProbeRspFrameHeader));
- pProbeRspHeader = (struct zsWlanProbeRspFrameHeader*) pBuf;
-
- zmw_enter_critical_section(dev);
-
- //zm_debug_msg1("bss count = ", wd->sta.bssList.bssCount);
-
- pBssInfo = zfStaFindBssInfo(dev, buf, pProbeRspHeader);
-
- //if ( i == wd->sta.bssList.bssCount )
- if ( pBssInfo == NULL )
- {
- /* Allocate a new entry if BSS not in the scan list */
- pBssInfo = zfBssInfoAllocate(dev);
- if (pBssInfo != NULL)
- {
- res = zfStaInitBssInfo(dev, buf, pProbeRspHeader, pBssInfo, AddInfo, 0);
- //zfDumpSSID(pBssInfo->ssid[1], &(pBssInfo->ssid[2]));
- if ( res != 0 )
- {
- zfBssInfoFree(dev, pBssInfo);
- }
- else
- {
- zfBssInfoInsertToList(dev, pBssInfo);
- }
- }
- }
- else
- {
- res = zfStaInitBssInfo(dev, buf, pProbeRspHeader, pBssInfo, AddInfo, 1);
- if (res == 2)
- {
- zfBssInfoRemoveFromList(dev, pBssInfo);
- zfBssInfoFree(dev, pBssInfo);
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- int idx;
-
- // It would reset the alive counter if the peer station is found!
- zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx);
- }
- }
-
- zmw_leave_critical_section(dev);
-
- return;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfSendProbeReq */
-/* Send probe request management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Ji-Huang Lee ZyDAS Technology Corporation 2005.11 */
-/* */
-/************************************************************************/
-
-u16_t zfSendProbeReq(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t bWithSSID)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
- /* SSID */
- if (bWithSSID == 0) /* broadcast ssid */
- {
- //zmw_leave_critical_section(dev);
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
- zmw_tx_buf_writeb(dev, buf, offset++, 0); /* length = 0 */
- }
- else
- {
- zmw_enter_critical_section(dev);
- if (wd->ws.probingSsidList[bWithSSID-1].ssidLen == 0)
- {
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
- zmw_tx_buf_writeb(dev, buf, offset++, 0); /* length = 0 */
- }
- else
- {
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
- zmw_tx_buf_writeb(dev, buf, offset++,
- wd->ws.probingSsidList[bWithSSID-1].ssidLen);
- zfCopyToIntTxBuffer(dev, buf,
- wd->ws.probingSsidList[bWithSSID-1].ssid,
- offset,
- wd->ws.probingSsidList[bWithSSID-1].ssidLen); /* ssid */
- offset += wd->ws.probingSsidList[bWithSSID-1].ssidLen;
- }
- zmw_leave_critical_section(dev);
- }
-
- /* Supported rates */
- if ( wd->sta.currentFrequency < 3000 )
- { /* 802.11b+g */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
-
- if (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) {
- if (wd->wlanMode == ZM_MODE_IBSS) {
- if (wd->wfc.bIbssGMode) {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- } else {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- }
- }
- else
- { /* 802.11a */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
- }
-
- return offset;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfUpdateDefaultQosParameter */
-/* Update TxQs CWMIN, CWMAX, AIFS and TXO to WME default value. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* mode : 0=>STA, 1=>AP */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-void zfUpdateDefaultQosParameter(zdev_t* dev, u8_t mode)
-{
- u16_t cwmin[5];
- u16_t cwmax[5];
- u16_t aifs[5];
- u16_t txop[5];
-
- /* WMM parameter for STA */
- /* Best Effor */
- cwmin[0] = 15;
- cwmax[0] = 1023;
- aifs[0] = 3 * 9 + 10;
- txop[0] = 0;
- /* Back Ground */
- cwmin[1] = 15;
- cwmax[1] = 1023;
- aifs[1] = 7 * 9 + 10;
- txop[1] = 0;
- /* VIDEO */
- cwmin[2] = 7;
- cwmax[2] = 15;
- aifs[2] = 2 * 9 + 10;
- txop[2] = 94;
- /* VOICE */
- cwmin[3] = 3;
- cwmax[3] = 7;
- aifs[3] = 2 * 9 + 10;
- txop[3] = 47;
- /* Special TxQ */
- cwmin[4] = 3;
- cwmax[4] = 7;
- aifs[4] = 2 * 9 + 10;
- txop[4] = 0;
-
- /* WMM parameter for AP */
- if (mode == 1)
- {
- cwmax[0] = 63;
- aifs[3] = 1 * 9 + 10;
- aifs[4] = 1 * 9 + 10;
- }
- zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop);
-}
-
-u16_t zfFindATHExtCap(zdev_t* dev, zbuf_t* buf, u8_t type, u8_t subtype)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t tmp;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
-
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
-
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_WIFI_IE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x03)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x7f)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+5)) == type))
-
- {
- if ( subtype != 0xff )
- {
- tmp = zmw_rx_buf_readb(dev, buf, offset+6);
- if (tmp == subtype )
- {
- return offset;
- }
- }
- else
- {
- return offset;
- }
- }
- }
-
- /* Advance to next element */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-u16_t zfFindBrdcmMrvlRlnkExtCap(zdev_t* dev, zbuf_t* buf)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t tmp;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
-
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
-
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_WIFI_IE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x10)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x18))
-
- {
- return offset;
- }
- else if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x43))
-
- {
- return offset;
- }
- }
- else if ((id = zmw_rx_buf_readb(dev, buf, offset)) == 0x7F)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- tmp = zmw_rx_buf_readb(dev, buf, offset+2);
- if (tmp == 0x01)
-
- {
- return offset;
- }
- }
-
- /* Advance to next element */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-u16_t zfFindMarvelExtCap(zdev_t* dev, zbuf_t* buf)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t tmp;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
-
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
-
- /* Search loop */
- while ((offset+2)<bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_WIFI_IE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen>(bufLen - offset))
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- if (((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x50)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x43))
-
- {
- return offset;
- }
- }
-
- /* Advance to next element */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
- offset += (elen+2);
- }
- return 0xffff;
-}
-
-u16_t zfFindBroadcomExtCap(zdev_t* dev, zbuf_t* buf)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t tmp;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
-
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
-
- /* Search loop */
- while((offset+2) < bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == ZM_WLAN_EID_WIFI_IE)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > (bufLen - offset))
- {
- /* Element length error */
- return 0xffff;
- }
-
- if (elen == 0)
- {
- return 0xffff;
- }
-
- if ( ((tmp = zmw_rx_buf_readb(dev, buf, offset+2)) == 0x00)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+3)) == 0x10)
- && ((tmp = zmw_rx_buf_readb(dev, buf, offset+4)) == 0x18) )
- {
- return offset;
- }
- }
-
- /* Advance to next element */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
-
- offset += (elen+2);
- }
-
- return 0xffff;
-}
-
-u16_t zfFindRlnkExtCap(zdev_t* dev, zbuf_t* buf)
-{
- u8_t subType;
- u16_t offset;
- u16_t bufLen;
- u16_t elen;
- u8_t id;
- u8_t tmp;
-
- /* Get offset of first element */
- subType = (zmw_rx_buf_readb(dev, buf, 0) >> 4);
-
- offset = zgElementOffsetTable[subType];
- if (offset == 0xff)
- {
- zm_assert(0);
- }
-
- /* Plus wlan header */
- offset += 24;
-
- bufLen = zfwBufGetSize(dev, buf);
-
- /* Search loop */
- while((offset+2) < bufLen) // including element ID and length (2bytes)
- {
- /* Search target element */
- id = zmw_rx_buf_readb(dev, buf, offset);
- if (id == 0x7F)
- {
- /* Bingo */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen > bufLen - offset)
- {
- /* Element length error */
- return 0xffff;
- }
-
- if ( elen == 0 )
- {
- return 0xffff;
- }
-
- tmp = zmw_rx_buf_readb(dev, buf, offset+2);
- if (tmp == 0x01)
-
- {
- return offset;
- }
- }
-
- /* Advance to next element */
- elen = zmw_rx_buf_readb(dev, buf, offset+1);
- if (elen == 0)
- {
- return 0xffff;
- }
-
- offset += (elen+2);
- }
-
- return 0xffff;
-}
diff --git a/drivers/staging/otus/80211core/cmmap.c b/drivers/staging/otus/80211core/cmmap.c
deleted file mode 100644
index 8ec3830..0000000
--- a/drivers/staging/otus/80211core/cmmap.c
+++ /dev/null
@@ -1,2435 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : mm.c */
-/* */
-/* Abstract */
-/* This module contains common functions for handle AP */
-/* management frame. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#include "ratectrl.h"
-
-extern const u8_t zcUpToAc[];
-
-void zfMmApTimeTick(zdev_t* dev)
-{
- u32_t now;
- zmw_get_wlan_dev(dev);
-
- //zm_debug_msg1("wd->wlanMode : ", wd->wlanMode);
- if (wd->wlanMode == ZM_MODE_AP)
- {
- /* => every 1.28 seconds */
- /* AP : aging STA that does not active for wd->ap.staAgingTime */
- now = wd->tick & 0x7f;
- if (now == 0x0)
- {
- zfApAgingSta(dev);
- }
- else if (now == 0x1f)
- {
- zfQueueAge(dev, wd->ap.uapsdQ, wd->tick, 10000);
- }
- /* AP : check (wd->ap.protectedObss) and (wd->ap.bStaAssociated) */
- /* to enable NonErp and Protection mode */
- else if (now == 0x3f)
- {
- //zfApProtctionMonitor(dev);
- }
- }
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApInitStaTbl */
-/* Init AP's station table. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfApInitStaTbl(zdev_t* dev)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
- {
- wd->ap.staTable[i].valid = 0;
- wd->ap.staTable[i].state = 0;
- wd->ap.staTable[i].addr[0] = 0;
- wd->ap.staTable[i].addr[1] = 0;
- wd->ap.staTable[i].addr[2] = 0;
- wd->ap.staTable[i].time = 0;
- wd->ap.staTable[i].vap = 0;
- wd->ap.staTable[i].encryMode = ZM_NO_WEP;
- }
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApFindSta */
-/* Find a STA in station table. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* addr : Target STA address */
-/* */
-/* OUTPUTS */
-/* 0xffff : fail */
-/* other : STA table index */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfApFindSta(zdev_t* dev, u16_t* addr)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
- {
- if (wd->ap.staTable[i].valid == 1)
- {
- if ((wd->ap.staTable[i].addr[0] == addr[0])
- && (wd->ap.staTable[i].addr[1] == addr[1])
- && (wd->ap.staTable[i].addr[2] == addr[2]))
- {
- return i;
- }
- }
- }
- return 0xffff;
-}
-
-u16_t zfApGetSTAInfo(zdev_t* dev, u16_t* addr, u16_t* state, u8_t* vap)
-{
- u16_t id;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- *vap = wd->ap.staTable[id].vap;
- *state = wd->ap.staTable[id++].state;
- }
-
- zmw_leave_critical_section(dev);
-
- return id;
-}
-
-
-void zfApGetStaQosType(zdev_t* dev, u16_t* addr, u8_t* qosType)
-{
- u16_t id;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- *qosType = wd->ap.staTable[id].qosType;
- }
- else
- {
- *qosType = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- return;
-}
-
-void zfApGetStaTxRateAndQosType(zdev_t* dev, u16_t* addr, u32_t* phyCtrl,
- u8_t* qosType, u16_t* rcProbingFlag)
-{
- u16_t id;
- u8_t rate;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->ap.staTable[id].rcCell, rcProbingFlag);
-#ifdef ZM_AP_DEBUG
- //rate = 15;
-#endif
- *phyCtrl = zcRateToPhyCtrl[rate];
- *qosType = wd->ap.staTable[id].qosType;
- }
- else
- {
- if (wd->frequency < 3000)
- {
- /* CCK 1M */
- //header[2] = 0x0f00; //PHY control L
- //header[3] = 0x0000; //PHY control H
- *phyCtrl = 0x00000F00;
- }
- else
- {
- /* CCK 6M */
- //header[2] = 0x0f01; //PHY control L
- //header[3] = 0x000B; //PHY control H
- *phyCtrl = 0x000B0F01;
- }
- *qosType = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- zm_msg2_mm(ZM_LV_3, "PhyCtrl=", *phyCtrl);
- return;
-}
-
-void zfApGetStaEncryType(zdev_t* dev, u16_t* addr, u8_t* encryType)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u16_t id;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- *encryType = wd->ap.staTable[id].encryMode;
- }
- else
- {
- *encryType = ZM_NO_WEP;
- }
-
- zmw_leave_critical_section(dev);
-
- zm_msg2_mm(ZM_LV_3, "encyrType=", *encryType);
- return;
-}
-
-void zfApGetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t* iv16, u32_t* iv32)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u16_t id;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- *iv16 = wd->ap.staTable[id].iv16;
- *iv32 = wd->ap.staTable[id].iv32;
- }
- else
- {
- *iv16 = 0;
- *iv32 = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- zm_msg2_mm(ZM_LV_3, "iv16=", *iv16);
- zm_msg2_mm(ZM_LV_3, "iv32=", *iv32);
- return;
-}
-
-void zfApSetStaWpaIv(zdev_t* dev, u16_t* addr, u16_t iv16, u32_t iv32)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u16_t id;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- wd->ap.staTable[id].iv16 = iv16;
- wd->ap.staTable[id].iv32 = iv32;
- }
-
- zmw_leave_critical_section(dev);
-
- zm_msg2_mm(ZM_LV_3, "iv16=", iv16);
- zm_msg2_mm(ZM_LV_3, "iv32=", iv32);
- return;
-}
-
-void zfApClearStaKey(zdev_t* dev, u16_t* addr)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u16_t bcAddr[3] = { 0xffff, 0xffff, 0xffff };
- u16_t id;
-
- zmw_get_wlan_dev(dev);
-
- if (zfMemoryIsEqual((u8_t*)bcAddr, (u8_t*)addr, sizeof(bcAddr)) == TRUE)
- {
- /* Turn off group key information */
- // zfClearKey(dev, 0);
- }
- else
- {
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- /* Turn off STA's key information */
- zfHpRemoveKey(dev, id+1);
-
- /* Update STA's Encryption Type */
- wd->ap.staTable[id].encryMode = ZM_NO_WEP;
- }
- else
- {
- zm_msg0_mm(ZM_LV_3, "Can't find STA address\n");
- }
- zmw_leave_critical_section(dev);
- }
-}
-
-#ifdef ZM_ENABLE_CENC
-void zfApGetStaCencIvAndKeyIdx(zdev_t* dev, u16_t* addr, u32_t *iv, u8_t *keyIdx)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u16_t id;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- *iv++ = wd->ap.staTable[id].txiv[0];
- *iv++ = wd->ap.staTable[id].txiv[1];
- *iv++ = wd->ap.staTable[id].txiv[2];
- *iv = wd->ap.staTable[id].txiv[3];
- *keyIdx = wd->ap.staTable[id].cencKeyIdx;
- }
- else
- {
- *iv++ = 0x5c365c37;
- *iv++ = 0x5c365c36;
- *iv++ = 0x5c365c36;
- *iv = 0x5c365c36;
- *keyIdx = 0;
- }
-
- zmw_leave_critical_section(dev);
- return;
-}
-
-void zfApSetStaCencIv(zdev_t* dev, u16_t* addr, u32_t *iv)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u16_t id;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- wd->ap.staTable[id].txiv[0] = *iv++;
- wd->ap.staTable[id].txiv[1] = *iv++;
- wd->ap.staTable[id].txiv[2] = *iv++;
- wd->ap.staTable[id].txiv[3] = *iv;
- }
-
- zmw_leave_critical_section(dev);
-
- return;
-}
-#endif //ZM_ENABLE_CENC
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApFlushBufferedPsFrame */
-/* Free buffered PS frames. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-void zfApFlushBufferedPsFrame(zdev_t* dev)
-{
- u16_t emptyFlag;
- u16_t freeCount;
- u16_t vap;
- zbuf_t* psBuf = NULL;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- freeCount = 0;
- emptyFlag = 0;
- while (1)
- {
- psBuf = NULL;
- zmw_enter_critical_section(dev);
- if (wd->ap.uniHead != wd->ap.uniTail)
- {
- psBuf = wd->ap.uniArray[wd->ap.uniHead];
- wd->ap.uniHead = (wd->ap.uniHead + 1) & (ZM_UNI_ARRAY_SIZE - 1);
- }
- else
- {
- emptyFlag = 1;
- }
- zmw_leave_critical_section(dev);
-
- if (psBuf != NULL)
- {
- zfwBufFree(dev, psBuf, ZM_ERR_FLUSH_PS_QUEUE);
- }
- zm_assert(freeCount++ < (ZM_UNI_ARRAY_SIZE*2));
-
- if (emptyFlag != 0)
- {
- break;
- }
- }
-
- for (vap=0; vap<ZM_MAX_AP_SUPPORT; vap++)
- {
- freeCount = 0;
- emptyFlag = 0;
- while (1)
- {
- psBuf = NULL;
- zmw_enter_critical_section(dev);
- if (wd->ap.bcmcHead[vap] != wd->ap.bcmcTail[vap])
- {
- psBuf = wd->ap.bcmcArray[vap][wd->ap.bcmcHead[vap]];
- wd->ap.bcmcHead[vap] = (wd->ap.bcmcHead[vap] + 1)
- & (ZM_BCMC_ARRAY_SIZE - 1);
- }
- else
- {
- emptyFlag = 1;
- }
- zmw_leave_critical_section(dev);
-
- if (psBuf != NULL)
- {
- zfwBufFree(dev, psBuf, ZM_ERR_FLUSH_PS_QUEUE);
- }
- zm_assert(freeCount++ < (ZM_BCMC_ARRAY_SIZE*2));
-
- if (emptyFlag != 0)
- {
- break;
- }
- }
- }
- return;
-}
-
-
-u16_t zfApBufferPsFrame(zdev_t* dev, zbuf_t* buf, u16_t port)
-{
- u16_t id;
- u16_t addr[3];
- u16_t vap = 0;
- u8_t up;
- u16_t fragOff;
- u8_t ac;
- u16_t ret;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if (port < ZM_MAX_AP_SUPPORT)
- {
- vap = port;
- }
-
- addr[0] = zmw_rx_buf_readh(dev, buf, 0);
- addr[1] = zmw_rx_buf_readh(dev, buf, 2);
- addr[2] = zmw_rx_buf_readh(dev, buf, 4);
-
- if ((addr[0] & 0x1) == 0x1)
- {
- if (wd->ap.staPowerSaving > 0)
- {
- zmw_enter_critical_section(dev);
-
- /* Buffer this BC or MC frame */
- if (((wd->ap.bcmcTail[vap]+1)&(ZM_BCMC_ARRAY_SIZE-1))
- != wd->ap.bcmcHead[vap])
- {
- wd->ap.bcmcArray[vap][wd->ap.bcmcTail[vap]++] = buf;
- wd->ap.bcmcTail[vap] &= (ZM_BCMC_ARRAY_SIZE-1);
- zmw_leave_critical_section(dev);
-
- zm_msg0_tx(ZM_LV_0, "Buffer BCMC");
- }
- else
- {
- /* bcmcArray full */
- zmw_leave_critical_section(dev);
-
- zm_msg0_tx(ZM_LV_0, "BCMC buffer full");
-
- /* free buffer according to buffer type */
- zfwBufFree(dev, buf, ZM_ERR_BCMC_PS_BUFFER_UNAVAILABLE);
- }
- return 1;
- }
- }
- else
- {
- zmw_enter_critical_section(dev);
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- if (wd->ap.staTable[id].psMode == 1)
- {
-
- zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
- ac = zcUpToAc[up&0x7] & 0x3;
-
- if ((wd->ap.staTable[id].qosType == 1) &&
- ((wd->ap.staTable[id].qosInfo & (0x8>>ac)) != 0))
- {
- ret = zfQueuePutNcs(dev, wd->ap.uapsdQ, buf, wd->tick);
- zmw_leave_critical_section(dev);
- if (ret != ZM_SUCCESS)
- {
- zfwBufFree(dev, buf, ZM_ERR_AP_UAPSD_QUEUE_FULL);
- }
- }
- else
- {
- /* Buffer this unicast frame */
- if (((wd->ap.uniTail+1)&(ZM_UNI_ARRAY_SIZE-1))
- != wd->ap.uniHead)
- {
- wd->ap.uniArray[wd->ap.uniTail++] = buf;
- wd->ap.uniTail &= (ZM_UNI_ARRAY_SIZE-1);
- zmw_leave_critical_section(dev);
- zm_msg0_tx(ZM_LV_0, "Buffer UNI");
-
- }
- else
- {
- /* uniArray full */
- zmw_leave_critical_section(dev);
- zm_msg0_tx(ZM_LV_0, "UNI buffer full");
- /* free buffer according to buffer type */
- zfwBufFree(dev, buf, ZM_ERR_UNI_PS_BUFFER_UNAVAILABLE);
- }
- }
- return 1;
- } /* if (wd->ap.staTable[id++].psMode == 1) */
- } /* if ((id = zfApFindSta(dev, addr)) != 0xffff) */
- zmw_leave_critical_section(dev);
- }
-
- return 0;
-}
-
-u16_t zfApGetSTAInfoAndUpdatePs(zdev_t* dev, u16_t* addr, u16_t* state,
- u8_t* vap, u16_t psMode, u8_t* uapsdTrig)
-{
- u16_t id;
- u8_t uapsdStaAwake = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
-#ifdef ZM_AP_DEBUG
- //psMode=0;
-#endif
-
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- if (psMode != 0)
- {
- zm_msg0_mm(ZM_LV_0, "psMode = 1");
- if (wd->ap.staTable[id].psMode == 0)
- {
- wd->ap.staPowerSaving++;
- }
- else
- {
- if (wd->ap.staTable[id].qosType == 1)
- {
- zm_msg0_mm(ZM_LV_0, "UAPSD trigger");
- *uapsdTrig = wd->ap.staTable[id].qosInfo;
- }
- }
- }
- else
- {
- if (wd->ap.staTable[id].psMode != 0)
- {
- wd->ap.staPowerSaving--;
- if ((wd->ap.staTable[id].qosType == 1) && ((wd->ap.staTable[id].qosInfo&0xf)!=0))
- {
- uapsdStaAwake = 1;
- }
- }
- }
-
- wd->ap.staTable[id].psMode = (u8_t) psMode;
- wd->ap.staTable[id].time = wd->tick;
- *vap = wd->ap.staTable[id].vap;
- *state = wd->ap.staTable[id++].state;
- }
-
- zmw_leave_critical_section(dev);
-
- if (uapsdStaAwake == 1)
- {
- zbuf_t* psBuf;
- u8_t mb;
-
- while (1)
- {
- psBuf = zfQueueGetWithMac(dev, wd->ap.uapsdQ, (u8_t*)addr, &mb);
- if (psBuf != NULL)
- {
- zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- }
- else
- {
- break;
- }
- }
- }
-
- return id;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApGetNewSta */
-/* Get a new STA from station table. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* 0xffff : fail */
-/* other : STA table index */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfApGetNewSta(zdev_t* dev)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
- {
- if (wd->ap.staTable[i].valid == 0)
- {
- zm_msg2_mm(ZM_LV_0, "zfApGetNewSta=", i);
- return i;
- }
- }
- return 0xffff;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApAddSta */
-/* Add a STA to station table. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* addr : STA MAC address */
-/* state : STA state */
-/* apId : Virtual AP ID */
-/* type : 0=>11b, 1=>11g */
-/* */
-/* OUTPUTS */
-/* 0xffff : fail */
-/* Other : index */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfApAddSta(zdev_t* dev, u16_t* addr, u16_t state, u16_t apId, u8_t type,
- u8_t qosType, u8_t qosInfo)
-{
- u16_t index;
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zm_msg1_mm(ZM_LV_0, "STA type=", type);
-
- zmw_enter_critical_section(dev);
-
- index = zfApFindSta(dev, addr);
- if (index != 0xffff)
- {
- zm_msg0_mm(ZM_LV_2, "found");
- /* Update STA state */
- if ((state == ZM_STATE_AUTH) || (state == ZM_STATE_PREAUTH))
- {
- wd->ap.staTable[index].state = state;
- wd->ap.staTable[index].time = wd->tick;
- wd->ap.staTable[index].vap = (u8_t)apId;
- }
- else if (state == ZM_STATE_ASOC)
- {
- if ((wd->ap.staTable[index].state == ZM_STATE_AUTH))
- //&& (wd->ap.staTable[index].vap == apId))
- {
- wd->ap.staTable[index].state = state;
- wd->ap.staTable[index].time = wd->tick;
- wd->ap.staTable[index].qosType = qosType;
- wd->ap.staTable[index].vap = (u8_t)apId;
- wd->ap.staTable[index].staType = type;
- wd->ap.staTable[index].qosInfo = qosInfo;
-
- if (wd->frequency < 3000)
- {
- /* Init 11b/g */
- zfRateCtrlInitCell(dev, &wd->ap.staTable[index].rcCell, type, 1, 1);
- }
- else
- {
- /* Init 11a */
- zfRateCtrlInitCell(dev, &wd->ap.staTable[index].rcCell, type, 0, 1);
- }
-
- if (wd->zfcbApConnectNotify != NULL)
- {
- wd->zfcbApConnectNotify(dev, (u8_t*)addr, apId);
- }
- }
- else
- {
- index = 0xffff;
- }
- }
- }
- else
- {
- zm_msg0_mm(ZM_LV_2, "Not found");
- if ((state == ZM_STATE_AUTH) || (state == ZM_STATE_PREAUTH))
- {
- /* Get a new STA and update state */
- index = zfApGetNewSta(dev);
- zm_msg2_mm(ZM_LV_1, "new STA index=", index);
-
- if (index != 0xffff)
- {
- for (i=0; i<3; i++)
- {
- wd->ap.staTable[index].addr[i] = addr[i];
- }
- wd->ap.staTable[index].state = state;
- wd->ap.staTable[index].valid = 1;
- wd->ap.staTable[index].time = wd->tick;
- wd->ap.staTable[index].vap = (u8_t)apId;
- wd->ap.staTable[index].encryMode = ZM_NO_WEP;
- }
- }
- }
-
- zmw_leave_critical_section(dev);
-
- return index;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApAgingSta */
-/* Aging STA in station table. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* number of 11b STA in STA table */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfApAgingSta(zdev_t* dev)
-{
- u16_t i;
- u32_t deltaMs;
- u16_t addr[3];
- u16_t txFlag;
- u16_t psStaCount = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- wd->ap.gStaAssociated = wd->ap.bStaAssociated = 0;
-
- for (i=0; i<ZM_MAX_STA_SUPPORT; i++)
- {
- txFlag = 0;
- zmw_enter_critical_section(dev);
- if (wd->ap.staTable[i].valid == 1)
- {
- addr[0] = wd->ap.staTable[i].addr[0];
- addr[1] = wd->ap.staTable[i].addr[1];
- addr[2] = wd->ap.staTable[i].addr[2];
- /* millisecond */
- deltaMs = (u32_t)((u32_t)wd->tick-(u32_t)wd->ap.staTable[i].time)
- * ZM_MS_PER_TICK;
-
- /* preauth */
- if ((wd->ap.staTable[i].state == ZM_STATE_PREAUTH)
- && (deltaMs > ZM_PREAUTH_TIMEOUT_MS))
- {
- /* Aging STA */
- wd->ap.staTable[i].valid = 0;
- wd->ap.authSharing = 0;
- txFlag = 1;
- }
-
- /* auth */
- if ((wd->ap.staTable[i].state == ZM_STATE_AUTH)
- && (deltaMs > ZM_AUTH_TIMEOUT_MS))
- {
- /* Aging STA */
- wd->ap.staTable[i].valid = 0;
- txFlag = 1;
- }
-
- /* asoc */
- if (wd->ap.staTable[i].state == ZM_STATE_ASOC)
- {
- if (wd->ap.staTable[i].psMode != 0)
- {
- psStaCount++;
- }
-
- if (deltaMs > ((u32_t)wd->ap.staAgingTimeSec<<10))
- {
- /* Aging STA */
- zm_msg1_mm(ZM_LV_0, "Age STA index=", i);
- wd->ap.staTable[i].valid = 0;
- txFlag = 1;
- }
- else if (deltaMs > ((u32_t)wd->ap.staProbingTimeSec<<10))
- {
- if (wd->ap.staTable[i].psMode == 0)
- {
- /* Probing non-PS STA */
- zm_msg1_mm(ZM_LV_0, "Probing STA index=", i);
- wd->ap.staTable[i].time +=
- (wd->ap.staProbingTimeSec * ZM_TICK_PER_SECOND);
- txFlag = 2;
- }
- }
- }
-
-
- }
- zmw_leave_critical_section(dev);
-
- if (txFlag == 1)
- {
- /* Send deauthentication management frame */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, addr, 4, 0, 0);
- }
- else if (txFlag == 2)
- {
- zfSendMmFrame(dev, ZM_WLAN_DATA_FRAME, addr, 0, 0, 0);
- }
-
- }
-
- wd->ap.staPowerSaving = psStaCount;
-
- return;
-}
-
-void zfApProtctionMonitor(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- /* 11b STA associated => nonErp, Protect */
- if (wd->ap.bStaAssociated > 0)
- {
- /* Enable NonErp bit in information element */
- wd->erpElement = ZM_WLAN_NON_ERP_PRESENT_BIT
- | ZM_WLAN_USE_PROTECTION_BIT;
-
- /* Enable protection mode */
- zfApSetProtectionMode(dev, 1);
-
- }
- /* 11b STA not associated, protection OBSS present => Protect */
- else if (wd->ap.protectedObss > 2) //Threshold
- {
- if (wd->disableSelfCts == 0)
- {
- /* Disable NonErp bit in information element */
- wd->erpElement = ZM_WLAN_USE_PROTECTION_BIT;
-
- /* Enable protection mode */
- zfApSetProtectionMode(dev, 1);
- }
- }
- else
- {
- /* Disable NonErp bit in information element */
- wd->erpElement = 0;
-
- /* Disable protection mode */
- zfApSetProtectionMode(dev, 0);
- }
- wd->ap.protectedObss = 0;
-}
-
-
-void zfApProcessBeacon(zdev_t* dev, zbuf_t* buf)
-{
- u16_t offset;
- u8_t ch;
-
- zmw_get_wlan_dev(dev);
-
- zm_msg0_mm(ZM_LV_3, "Rx beacon");
-
- /* update Non-ERP flag(wd->ap.nonErpObss) */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP);
- if (offset == 0xffff)
- {
- /* 11b OBSS */
- wd->ap.protectedObss++;
- return;
- }
-
- ch = zmw_rx_buf_readb(dev, buf, offset+2);
- if ((ch & ZM_WLAN_USE_PROTECTION_BIT) == ZM_WLAN_USE_PROTECTION_BIT)
- {
- /* Protected OBSS */
- wd->ap.protectedObss = 1;
- }
-
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfProcessAuth */
-/* Process authenticate management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : auth frame buffer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-/* Note : AP allows one authenticating STA at a time, does not */
-/* support multiple authentication process. Make sure */
-/* authentication state machine will not be blocked due */
-/* to incompleted authentication handshake. */
-void zfApProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
-{
- u16_t algo, seq, status;
- u8_t authSharing;
- u16_t ret;
- u16_t i;
- u8_t challengePassed = 0;
- u8_t frameCtrl;
- u32_t retAlgoSeq;
- u32_t retStatus;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
- frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
- /* AP : Auth share 3 */
- /* shift for WEP IV */
- if ((frameCtrl & 0x40) != 0)
- {
- algo = zmw_rx_buf_readh(dev, buf, 28);
- seq = zmw_rx_buf_readh(dev, buf, 30);
- status = zmw_rx_buf_readh(dev, buf, 32);
- }
- else
- {
- algo = zmw_rx_buf_readh(dev, buf, 24);
- seq = zmw_rx_buf_readh(dev, buf, 26);
- status = zmw_rx_buf_readh(dev, buf, 28);
- }
-
- zm_msg2_mm(ZM_LV_0, "Rx Auth, seq=", seq);
-
- /* Set default to authentication algorithm not support */
- retAlgoSeq = 0x20000 | algo;
- retStatus = 13; /* authentication algorithm not support */
-
- /* AP : Auth open 1 */
- if (algo == 0)
- {
- if (wd->ap.authAlgo[apId] == 0)
- {
- retAlgoSeq = 0x20000;
- if (seq == 1)
- {
- /* AP : update STA to auth */
- ret = zfApAddSta(dev, src, ZM_STATE_AUTH, apId, 0, 0, 0);
- if (ret != 0xffff)
- {
- /* AP : call zfwAuthNotify() for host to judge */
- //zfwAuthNotify(dev, src);
-
- /* AP : response Auth seq=2, success */
- retStatus = 0;
-
- }
- else
- {
- /* AP : response Auth seq=2, unspecific error */
- retStatus = 1;
- }
- }
- else
- {
- /* AP : response Auth seq=2, sequence number out of expected */
- retStatus = 14;
- }
- }
- }
- /* AP : Auth share 1 */
- else if (algo == 1)
- {
- if (wd->ap.authAlgo[apId] == 1)
- {
- if (seq == 1)
- {
- retAlgoSeq = 0x20001;
-
- /* critical section */
- zmw_enter_critical_section(dev);
- if (wd->ap.authSharing == 1)
- {
- authSharing = 1;
- }
- else
- {
- authSharing = 0;
- wd->ap.authSharing = 1;
- }
- /* end of critical section */
- zmw_leave_critical_section(dev);
-
- if (authSharing == 1)
- {
- /* AP : response Auth seq=2, status = fail */
- retStatus = 1;
- }
- else
- {
- /* AP : update STA to preauth */
- zfApAddSta(dev, src, ZM_STATE_PREAUTH, apId, 0, 0, 0);
-
- /* AP : call zfwAuthNotify() for host to judge */
- //zfwAuthNotify(dev, src);
-
- /* AP : response Auth seq=2 */
- retStatus = 0;
- }
- }
- else if (seq == 3)
- {
- retAlgoSeq = 0x40001;
-
- if (wd->ap.authSharing == 1)
- {
- /* check challenge text */
- if (zmw_buf_readh(dev, buf, 30+4) == 0x8010)
- {
- for (i=0; i<128; i++)
- {
- if (wd->ap.challengeText[i]
- != zmw_buf_readb(dev, buf, 32+i+4))
- {
- break;
- }
- }
- if (i == 128)
- {
- challengePassed = 1;
- }
- }
-
- if (challengePassed == 1)
- {
- /* AP : update STA to auth */
- zfApAddSta(dev, src, ZM_STATE_AUTH, apId, 0, 0, 0);
-
- /* AP : response Auth seq=2 */
- retStatus = 0;
- }
- else
- {
- /* AP : response Auth seq=2, challenge failure */
- retStatus = 15;
-
- /* TODO : delete STA */
- }
-
- wd->ap.authSharing = 0;
- }
- }
- else
- {
- retAlgoSeq = 0x40001;
- retStatus = 14;
- }
- }
- }
-
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, src, retAlgoSeq,
- retStatus, apId);
- return;
-}
-
-void zfApProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
-{
- u16_t aid = 0xffff;
- u8_t frameType;
- u16_t offset;
- u8_t staType = 0;
- u8_t qosType = 0;
- u8_t qosInfo = 0;
- u8_t tmp;
- u16_t i, j, k;
- u16_t encMode = 0;
-
- zmw_get_wlan_dev(dev);
- /* AP : check SSID */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID);
- if (offset != 0xffff)
- {
- k = 0;
- for (j = 0; j < wd->ap.vapNumber; j++)
- {
- tmp = zmw_buf_readb(dev, buf, offset+1);
- if (tmp
- != wd->ap.ssidLen[j])
- {
- k++;
- }
- }
- if (k == wd->ap.vapNumber)
- {
- goto zlDeauth;
- }
-
- k = 0;
- for (j = 0; j < wd->ap.vapNumber; j++)
- {
- for (i=0; i<wd->ap.ssidLen[j]; i++)
- {
- tmp = zmw_buf_readb(dev, buf, offset+2+i);
- if (tmp
- != wd->ap.ssid[j][i])
- {
- break;
- }
- }
- if (i == wd->ap.ssidLen[j])
- {
- apId = j;
- }
- else
- {
- k++;
- }
- }
- if (k == wd->ap.vapNumber)
- {
- goto zlDeauth;
- }
- }
-
- /* TODO : check capability */
-
- /* AP : check support rate */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE);
- if (offset != 0xffff)
- {
- /* 11g STA */
- staType = 1;
- }
- //CWYang(+)
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY);
- if (offset != 0xffff)
- {
- /* 11n STA */
- staType = 2;
- }
-
- /* TODO : do not allow 11b STA to associated in Pure G mode */
- if (wd->ap.wlanType[apId] == ZM_WLAN_TYPE_PURE_G && staType == 0)
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 3, 0, 0);
- return;
- }
-
- /* In pure B mode, we set G STA into B mode */
- if (wd->ap.wlanType[apId] == ZM_WLAN_TYPE_PURE_B && staType == 1)
- {
- staType = 0;
- }
-
- /* AP : check 11i and WPA */
- /* AP : check 11h */
-
- /* AP : check WME */
- offset = zfFindWifiElement(dev, buf, 2, 0);
- if (offset != 0xffff)
- {
- /* WME STA */
- qosType = 1;
- zm_msg0_mm(ZM_LV_0, "WME STA");
-
- if (wd->ap.uapsdEnabled != 0)
- {
- qosInfo = zmw_rx_buf_readb(dev, buf, offset+8);
- }
- }
-
- if (wd->ap.wpaSupport[apId] == 1)
- {
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE);
- if (offset != 0xffff)
- {
- /* get WPA IE */
- u8_t length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length+2 < ZM_MAX_WPAIE_SIZE)
- {
- zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2);
- wd->ap.stawpaLen[apId] = length+2;
- encMode = 1;
-
-
- zm_msg1_mm(ZM_LV_0, "WPA Mode zfwAsocNotify, apId=", apId);
-
- /* AP : Call zfwAsocNotify() */
- if (wd->zfcbAsocNotify != NULL)
- {
- wd->zfcbAsocNotify(dev, src, wd->ap.stawpaIe[apId], wd->ap.stawpaLen[apId], apId);
- }
- }
- else
- {
- goto zlDeauth;
- }
- }
- else if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE)) != 0xffff )
- {
- /* get RSN IE */
- u8_t length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length+2 < ZM_MAX_WPAIE_SIZE)
- {
- zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2);
- wd->ap.stawpaLen[apId] = length+2;
- encMode = 1;
-
- zm_msg1_mm(ZM_LV_0, "RSN Mode zfwAsocNotify, apId=", apId);
-
- /* AP : Call zfwAsocNotify() */
- if (wd->zfcbAsocNotify != NULL)
- {
- wd->zfcbAsocNotify(dev, src, wd->ap.stawpaIe[apId], wd->ap.stawpaLen[apId], apId);
- }
- }
- else
- {
- goto zlDeauth;
- }
- }
-#ifdef ZM_ENABLE_CENC
- else if ( (offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE)) != 0xffff )
- {
- /* get CENC IE */
- u8_t length = zmw_rx_buf_readb(dev, buf, offset+1);
-
- if (length+2 < ZM_MAX_WPAIE_SIZE)
- {
- zfCopyFromRxBuffer(dev, buf, wd->ap.stawpaIe[apId], offset, length+2);
- wd->ap.stawpaLen[apId] = length+2;
- encMode = 1;
-
- zm_msg1_mm(ZM_LV_0, "CENC Mode zfwAsocNotify, apId=", apId);
-
- /* AP : Call zfwAsocNotify() */
- if (wd->zfcbCencAsocNotify != NULL)
- {
- wd->zfcbCencAsocNotify(dev, src, wd->ap.stawpaIe[apId],
- wd->ap.stawpaLen[apId], apId);
- }
- }
- else
- {
- goto zlDeauth;
- }
- }
-#endif //ZM_ENABLE_CENC
- else
- { /* ap is encryption but sta has no wpa/rsn ie */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0);
- return;
- }
- }
- /* sta has wpa/rsn ie but ap is no encryption */
- if ((wd->ap.wpaSupport[apId] == 0) && (encMode == 1))
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0);
- return;
- }
-
- /* AP : update STA to asoc */
- aid = zfApAddSta(dev, src, ZM_STATE_ASOC, apId, staType, qosType, qosInfo);
-
- zfApStoreAsocReqIe(dev, buf, aid);
-
-zlDeauth:
- /* AP : send asoc rsp2 */
- if (aid != 0xffff)
- {
- frameType = zmw_rx_buf_readb(dev, buf, 0);
-
- if (frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ)
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCRSP, src, 0, aid+1, apId);
- }
- else
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCRSP, src, 0, aid+1, apId);
- }
- }
- else
- {
- /* TODO : send deauthentication */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 6, 0, 0);
- }
-
- return;
-}
-
-void zfApStoreAsocReqIe(zdev_t* dev, zbuf_t* buf, u16_t aid)
-{
- //struct zsWlanAssoFrameHeader* pAssoFrame;
- //u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)];
- u16_t offset;
- u32_t i;
- u16_t length;
- u8_t *htcap;
-
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
- {
- wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
- }
- /* capability: 2 octets */
- offset = 24;
-
- /* Listen interval: 2 octets */
- offset = 26;
-
- /* SSID */
- offset = 28;
-
- /* supported rates */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE);
- if (offset == 0xffff)
- return;
- length = zmw_rx_buf_readb(dev, buf, offset + 1);
-
- /* extended supported rates */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE);
- if (offset == 0xffff)
- return;
- length = zmw_rx_buf_readb(dev, buf, offset + 1);
-
- /* power capability:4 octets */
- offset = offset + 2 + length;
-
- /* supported channels: 4 octets */
- offset = offset + 2 + 4;
-
- /* RSN */
-
- /* QoS */
-
- /* HT capabilities: 28 octets */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY);
- if (offset != 0xffff) {
- /* atheros pre n */
- htcap = (u8_t *)&wd->ap.ie[aid].HtCap;
- htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
- htcap[1] = 26;
- for (i=1; i<=26; i++)
- {
- htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
- zm_debug_msg2("ASOC: HT Capabilities, htcap=", htcap[i+1]);
- }
- return;
- }
- else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff) {
- /* pre n 2.0 standard */
- htcap = (u8_t *)&wd->ap.ie[aid].HtCap;
- for (i=0; i<28; i++)
- {
- htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
- zm_debug_msg2("ASOC: HT Capabilities, htcap=", htcap[i]);
- }
- }
- else {
- /* not 11n AP */
- return;
- }
-
-
- /* supported regulatory classes */
- offset = offset + length;
- //length = zmw_rx_buf_readb(dev, buf, offset + 1);
- {
- u8_t *htcap;
- htcap = (u8_t *)&wd->sta.ie.HtInfo;
- //zm_debug_msg2("ASOC: HT Capabilities info=", ((u16_t *)htcap)[1]);
- //zm_debug_msg2("ASOC: A-MPDU parameters=", htcap[4]);
- //zm_debug_msg2("ASOC: Supported MCS set=", ((u32_t *)htcap)[1]>>8);
- }
-
-}
-
-void zfApProcessAsocRsp(zdev_t* dev, zbuf_t* buf)
-{
-
-}
-
-void zfApProcessDeauth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
-{
- u16_t aid;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- /* AP : if SA=associated STA then deauthenticate STA */
- aid = zfApFindSta(dev, src);
- if (aid != 0xffff)
- {
- /* Clear STA table */
- wd->ap.staTable[aid].valid = 0;
- if (wd->zfcbDisAsocNotify != NULL)
- {
- wd->zfcbDisAsocNotify(dev, (u8_t*)src, apId);
- }
- }
- zmw_leave_critical_section(dev);
-
-}
-
-void zfApProcessDisasoc(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
-{
- u16_t aid;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- /* AP : if SA=associated STA then deauthenticate STA */
- aid = zfApFindSta(dev, src);
- if (aid != 0xffff)
- {
- /* Clear STA table */
- wd->ap.staTable[aid].valid = 0;
- zmw_leave_critical_section(dev);
- if (wd->zfcbDisAsocNotify != NULL)
- {
- wd->zfcbDisAsocNotify(dev, (u8_t*)src, apId);
- }
- }
- zmw_leave_critical_section(dev);
-
-}
-
-
-void zfApProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
-{
-#if 0
- zmw_get_wlan_dev(dev);
-
- zm_msg0_mm(ZM_LV_0, "Rx probersp");
-
- /* Gather scan result */
-
- //zm_debug_msg1("bssList Count = ", wd->sta.bssList.bssCount);
- /* return if not in scanning */
- if ((wd->heartBeatNotification & ZM_BSSID_LIST_SCAN)
- != ZM_BSSID_LIST_SCAN)
- {
- return;
- }
-
- //if ( wd->sta.pUpdateBssList->bssCount == ZM_MAX_BSS )
- if ( wd->sta.bssList.bssCount == ZM_MAX_BSS )
- {
- return;
- }
-
- zfProcessProbeRsp(dev, buf, AddInfo);
-
-#endif
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApAddIeSsid */
-/* Add AP information element SSID to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* vap : virtual AP ID */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
-/* */
-/************************************************************************/
-u16_t zfApAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.ssidLen[vap]);
-
- /* Information : SSID */
- for (i=0; i<wd->ap.ssidLen[vap]; i++)
- {
- zmw_tx_buf_writeb(dev, buf, offset++, wd->ap.ssid[vap][i]);
- }
-
- return offset;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApAddIeTim */
-/* Add AP information element TIM to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* vap : virtual AP ID */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
-/* */
-/************************************************************************/
-u16_t zfApAddIeTim(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap)
-{
- u8_t uniBitMap[9];
- u16_t highestByte;
- u16_t i;
- u16_t lenOffset;
- u16_t id;
- u16_t dst[3];
- u16_t aid;
- u16_t bitPosition;
- u16_t bytePosition;
- zbuf_t* psBuf;
- zbuf_t* tmpBufArray[ZM_UNI_ARRAY_SIZE];
- u16_t tmpBufArraySize = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_TIM);
-
- /* offset of Element Length */
- lenOffset = offset++;
-
- /* Information : TIM */
- /* DTIM count */
- /* TODO : Doesn't work for Virtual AP's case */
- wd->CurrentDtimCount++;
- if (wd->CurrentDtimCount >= wd->dtim)
- {
- wd->CurrentDtimCount = 0;
- }
- zmw_tx_buf_writeb(dev, buf, offset++, wd->CurrentDtimCount);
- /* DTIM period */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->dtim);
- /* bitmap offset */
- zmw_tx_buf_writeb(dev, buf, offset++, 0);
-
- /* Update BCMC bit */
- if (wd->CurrentDtimCount == 0)
- {
- zmw_enter_critical_section(dev);
- wd->ap.timBcmcBit[vap] = (wd->ap.bcmcTail[vap]!=wd->ap.bcmcHead[vap])?1:0;
- zmw_leave_critical_section(dev);
- }
- else
- {
- wd->ap.timBcmcBit[vap] = 0;
- }
-
- /* Update Unicast bitmap */
- /* reset bit map */
- for (i=0; i<9; i++)
- {
- uniBitMap[i] = 0;
- }
- highestByte = 0;
-#if 1
-
- zmw_enter_critical_section(dev);
-
- id = wd->ap.uniHead;
- while (id != wd->ap.uniTail)
- {
- psBuf = wd->ap.uniArray[id];
-
- /* TODO : Aging PS frame after queuing for more than 10 seconds */
-
- /* get destination STA's aid */
- dst[0] = zmw_tx_buf_readh(dev, psBuf, 0);
- dst[1] = zmw_tx_buf_readh(dev, psBuf, 2);
- dst[2] = zmw_tx_buf_readh(dev, psBuf, 4);
- aid = zfApFindSta(dev, dst);
- if (aid != 0xffff)
- {
- if (wd->ap.staTable[aid].psMode != 0)
- {
- zm_msg1_mm(ZM_LV_0, "aid=",aid);
- aid++;
- zm_assert(aid<=64);
- bitPosition = (1 << (aid & 0x7));
- bytePosition = (aid >> 3);
- uniBitMap[bytePosition] |= bitPosition;
-
- if (bytePosition>highestByte)
- {
- highestByte = bytePosition;
- }
- id = (id+1) & (ZM_UNI_ARRAY_SIZE-1);
- }
- else
- {
- zm_msg0_mm(ZM_LV_0, "Send PS frame which STA no longer in PS mode");
- /* Send PS frame which STA no longer in PS mode */
- zfApRemoveFromPsQueue(dev, id, dst);
- tmpBufArray[tmpBufArraySize++] = psBuf;
- }
- }
- else
- {
- zm_msg0_mm(ZM_LV_0, "Free garbage PS frame");
- /* Free garbage PS frame */
- zfApRemoveFromPsQueue(dev, id, dst);
- zfwBufFree(dev, psBuf, 0);
- }
- }
-
- zmw_leave_critical_section(dev);
-#endif
-
- zfQueueGenerateUapsdTim(dev, wd->ap.uapsdQ, uniBitMap, &highestByte);
-
- zm_msg1_mm(ZM_LV_3, "bm=",uniBitMap[0]);
- zm_msg1_mm(ZM_LV_3, "highestByte=",highestByte);
- zm_msg1_mm(ZM_LV_3, "timBcmcBit[]=",wd->ap.timBcmcBit[vap]);
-
- /* bitmap */
- zmw_tx_buf_writeb(dev, buf, offset++,
- uniBitMap[0] | wd->ap.timBcmcBit[vap]);
- for (i=0; i<highestByte; i++)
- {
- zmw_tx_buf_writeb(dev, buf, offset++, uniBitMap[i+1]);
- }
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, lenOffset, highestByte+4);
-
- for (i=0; i<tmpBufArraySize; i++)
- {
- /* Put to VTXQ[ac] */
- zfPutVtxq(dev, tmpBufArray[i]);
- }
- /* Push VTXQ[ac] */
- zfPushVtxq(dev);
-
- return offset;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApRemoveFromPsQueue */
-/* Remove zbuf from PS queue. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* id : index in ps queue */
-/* */
-/* OUTPUTS */
-/* more data bit */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-u8_t zfApRemoveFromPsQueue(zdev_t* dev, u16_t id, u16_t* addr)
-{
- u16_t dst[3];
- u16_t nid;
- u8_t moreData = 0;
- zmw_get_wlan_dev(dev);
-
- wd->ap.uniTail = (wd->ap.uniTail-1) & (ZM_UNI_ARRAY_SIZE-1);
- while (id != wd->ap.uniTail)
- {
- nid = (id + 1) & (ZM_UNI_ARRAY_SIZE - 1);
- wd->ap.uniArray[id] = wd->ap.uniArray[nid];
-
- /* Search until tail to config more data bit */
- dst[0] = zmw_buf_readh(dev, wd->ap.uniArray[id], 0);
- dst[1] = zmw_buf_readh(dev, wd->ap.uniArray[id], 2);
- dst[2] = zmw_buf_readh(dev, wd->ap.uniArray[id], 4);
- if ((addr[0] == dst[0]) && (addr[1] == dst[1])
- && (addr[2] == dst[2]))
- {
- moreData = 0x20;
- }
-
- id = nid;
- }
- return moreData;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApAddIeWmePara */
-/* Add WME Parameter Element to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* vap : virtual AP ID */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.1 */
-/* */
-/************************************************************************/
-u16_t zfApAddIeWmePara(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t vap)
-{
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, 24);
-
- /* OUI */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x50);
- zmw_tx_buf_writeb(dev, buf, offset++, 0xF2);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x02);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
-
- /* QoS Info */
- if (wd->ap.uapsdEnabled)
- {
- zmw_tx_buf_writeb(dev, buf, offset++, 0x81);
- }
- else
- {
- zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
- }
-
- /* Reserved */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
-
- /* Best Effort AC parameters */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x03);
- zmw_tx_buf_writeb(dev, buf, offset++, 0xA4);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- /* Backfround AC parameters */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x27);
- zmw_tx_buf_writeb(dev, buf, offset++, 0xA4);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- /* Video AC parameters */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x42);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x43);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x5E);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- /* Voice AC parameters */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x62);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x32);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x2F);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
-
- return offset;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApSendBeacon */
-/* Sned AP mode beacon. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.11 */
-/* */
-/************************************************************************/
-void zfApSendBeacon(zdev_t* dev)
-{
- zbuf_t* buf;
- u16_t offset;
- u16_t vap;
- u16_t seq;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- wd->ap.beaconCounter++;
- if (wd->ap.beaconCounter >= wd->ap.vapNumber)
- {
- wd->ap.beaconCounter = 0;
- }
- vap = wd->ap.beaconCounter;
-
-
- zm_msg1_mm(ZM_LV_2, "Send beacon, vap=", vap);
-
- /* TBD : Maximum size of beacon */
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc beacon buf Fail!");
- return;
- }
-
- offset = 0;
-
- /* wlan header */
- /* Frame control */
- zmw_tx_buf_writeh(dev, buf, offset, 0x0080);
- offset+=2;
- /* Duration */
- zmw_tx_buf_writeh(dev, buf, offset, 0x0000);
- offset+=2;
- /* Address 1 */
- zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
- offset+=2;
- /* Address 2 */
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
- offset+=2;
-#ifdef ZM_VAPMODE_MULTILE_SSID
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); //Multiple SSID
-#else
- zmw_tx_buf_writeh(dev, buf, offset, (wd->macAddr[2]+(vap<<8))); //VAP
-#endif
- offset+=2;
- /* Address 3 */
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
- offset+=2;
-#ifdef ZM_VAPMODE_MULTILE_SSID
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]); //Multiple SSID
-#else
- zmw_tx_buf_writeh(dev, buf, offset, (wd->macAddr[2]+(vap<<8))); //VAP
-#endif
- offset+=2;
-
- /* Sequence number */
- zmw_enter_critical_section(dev);
- seq = ((wd->mmseq++)<<4);
- zmw_leave_critical_section(dev);
- zmw_tx_buf_writeh(dev, buf, offset, seq);
- offset+=2;
-
- /* 24-31 Time Stamp : hardware will fill this field */
- zmw_tx_buf_writeh(dev, buf, offset, 0);
- zmw_tx_buf_writeh(dev, buf, offset+2, 0);
- zmw_tx_buf_writeh(dev, buf, offset+4, 0);
- zmw_tx_buf_writeh(dev, buf, offset+6, 0);
- offset+=8;
-
- /* Beacon Interval */
- zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
- offset+=2;
-
- /* Capability */
- zmw_tx_buf_writeh(dev, buf, offset, wd->ap.capab[vap]);
- offset+=2;
-
- /* SSID */
- if (wd->ap.hideSsid[vap] == 0)
- {
- offset = zfApAddIeSsid(dev, buf, offset, vap);
- }
- else
- {
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
- zmw_tx_buf_writeb(dev, buf, offset++, 0);
-
- }
-
- /* Support Rate */
- if ( wd->frequency < 3000 )
- {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
- }
- else
- {
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
- }
-
- /* DS parameter set */
- offset = zfMmAddIeDs(dev, buf, offset);
-
- /* TIM */
- offset = zfApAddIeTim(dev, buf, offset, vap);
-
- /* If WLAN Type is not PURE B */
- if (wd->ap.wlanType[vap] != ZM_WLAN_TYPE_PURE_B)
- {
- if ( wd->frequency < 3000 )
- {
- /* ERP Information */
- offset = zfMmAddIeErp(dev, buf, offset);
-
- /* Extended Supported Rates */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- }
-
- /* TODO : country information */
- /* TODO : RSN */
- if (wd->ap.wpaSupport[vap] == 1)
- {
- offset = zfMmAddIeWpa(dev, buf, offset, vap);
- }
-
- /* WME Parameters */
- if (wd->ap.qosMode == 1)
- {
- offset = zfApAddIeWmePara(dev, buf, offset, vap);
- }
-
- /* HT Capabilities Info */
- offset = zfMmAddHTCapability(dev, buf, offset);
-
- /* Extended HT Capabilities Info */
- offset = zfMmAddExtendedHTCapability(dev, buf, offset);
-
- /* 1212 : write to beacon fifo */
- /* 1221 : write to share memory */
- zfHpSendBeacon(dev, buf, offset);
-
- /* Free beacon buffer */
- /* TODO: In order to fit the madwifi beacon architecture, we need to
- free beacon buffer in the HAL layer.
- */
-
- //zfwBufFree(dev, buf, 0);
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfIntrabssForward */
-/* Called to transmit intra-BSS frame from upper layer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer pointer */
-/* vap : virtual AP */
-/* */
-/* OUTPUTS */
-/* 1 : unicast intras-BSS frame */
-/* 0 : other frames */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.11 */
-/* */
-/************************************************************************/
-u16_t zfIntrabssForward(zdev_t* dev, zbuf_t* buf, u8_t srcVap)
-{
- u16_t err;
- u16_t asocFlag = 0;
- u16_t dst[3];
- u16_t aid;
- u16_t staState;
- zbuf_t* txBuf;
- u16_t len;
- u16_t i;
- u16_t temp;
- u16_t ret;
- u8_t vap = 0;
-#ifdef ZM_ENABLE_NATIVE_WIFI
- dst[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
- dst[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
- dst[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
-#else
- dst[0] = zmw_rx_buf_readh(dev, buf, 0);
- dst[1] = zmw_rx_buf_readh(dev, buf, 2);
- dst[2] = zmw_rx_buf_readh(dev, buf, 4);
-#endif // ZM_ENABLE_NATIVE_WIFI
-
- /* Do Intra-BSS forward(data copy) if necessary*/
- if ((dst[0]&0x1) != 0x1)
- {
- aid = zfApGetSTAInfo(dev, dst, &staState, &vap);
- if ((aid != 0xffff) && (staState == ZM_STATE_ASOC) && (srcVap == vap))
- {
- asocFlag = 1;
- zm_msg0_rx(ZM_LV_2, "Intra-BSS forward : asoc STA");
- }
-
- }
- else
- {
- vap = srcVap;
- zm_msg0_rx(ZM_LV_2, "Intra-BSS forward : BCorMC");
- }
-
- /* destination address = associated STA or BC/MC */
- if ((asocFlag == 1) || ((dst[0]&0x1) == 0x1))
- {
- /* Allocate frame */
- txBuf = zfwBufAllocate(dev, ZM_RX_FRAME_SIZE);
- if (txBuf == NULL)
- {
- zm_msg0_rx(ZM_LV_1, "Alloc intra-bss buf Fail!");
- goto zlAllocError;
- }
-
- /* Copy frame */
- len = zfwBufGetSize(dev, buf);
- for (i=0; i<len; i+=2)
- {
- temp = zmw_rx_buf_readh(dev, buf, i);
- zmw_tx_buf_writeh(dev, txBuf, i, temp);
- }
- zfwBufSetSize(dev, txBuf, len);
-
-#ifdef ZM_ENABLE_NATIVE_WIFI
- /* Tx-A2 = Rx-A1, Tx-A3 = Rx-A2, Tx-A1 = Rx-A3 */
- for (i=0; i<6; i+=2)
- {
- temp = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+i);
- zmw_tx_buf_writeh(dev, txBuf, ZM_WLAN_HEADER_A2_OFFSET+i, temp);
- temp = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+i);
- zmw_tx_buf_writeh(dev, txBuf, ZM_WLAN_HEADER_A3_OFFSET+i, temp);
- temp = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+i);
- zmw_tx_buf_writeh(dev, txBuf, ZM_WLAN_HEADER_A1_OFFSET+i, temp);
- }
-
- #endif
-
- /* Transmit frame */
- /* Return error if port is disabled */
- err = zfTxPortControl(dev, txBuf, vap);
- if (err == ZM_PORT_DISABLED)
- {
- err = ZM_ERR_TX_PORT_DISABLED;
- goto zlTxError;
- }
-
-#if 1
- /* AP : Buffer frame for power saving STA */
- ret = zfApBufferPsFrame(dev, txBuf, vap);
- if (ret == 0)
- {
- /* forward frame if not been buffered */
- #if 1
- /* Put to VTXQ[ac] */
- ret = zfPutVtxq(dev, txBuf);
- /* Push VTXQ[ac] */
- zfPushVtxq(dev);
- #else
- zfTxSendEth(dev, txBuf, vap, ZM_INTERNAL_ALLOC_BUF, 0);
- #endif
-
- }
-#endif
- }
- return asocFlag;
-
-zlTxError:
- zfwBufFree(dev, txBuf, 0);
-zlAllocError:
- return asocFlag;
-}
-
-struct zsMicVar* zfApGetRxMicKey(zdev_t* dev, zbuf_t* buf)
-{
- u8_t sa[6];
- u16_t id = 0, macAddr[3];
-
- zmw_get_wlan_dev(dev);
-
- zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A2_OFFSET, 6);
-
- macAddr[0] = sa[0] + (sa[1] << 8);
- macAddr[1] = sa[2] + (sa[3] << 8);
- macAddr[2] = sa[4] + (sa[5] << 8);
-
- id = zfApFindSta(dev, macAddr);
- if (id != 0xffff)
- return (&wd->ap.staTable[id].rxMicKey);
-
- return NULL;
-}
-
-struct zsMicVar* zfApGetTxMicKey(zdev_t* dev, zbuf_t* buf, u8_t* qosType)
-{
- u8_t da[6];
- u16_t id = 0, macAddr[3];
-
- zmw_get_wlan_dev(dev);
-
- zfCopyFromIntTxBuffer(dev, buf, da, 0, 6);
-
- macAddr[0] = da[0] + (da[1] << 8);
- macAddr[1] = da[2] + (da[3] << 8);
- macAddr[2] = da[4] + (da[5] << 8);
-
- if ((macAddr[0] & 0x1))
- {
- return (&wd->ap.bcMicKey[0]);
- }
- else if ((id = zfApFindSta(dev, macAddr)) != 0xffff)
- {
- *qosType = wd->ap.staTable[id].qosType;
- return (&wd->ap.staTable[id].txMicKey);
- }
-
- return NULL;
-}
-
-u16_t zfApUpdatePsBit(zdev_t* dev, zbuf_t* buf, u8_t* vap, u8_t* uapsdTrig)
-{
- u16_t staState;
- u16_t aid;
- u16_t psBit;
- u16_t src[3];
- u16_t dst[1];
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- src[0] = zmw_rx_buf_readh(dev, buf, 10);
- src[1] = zmw_rx_buf_readh(dev, buf, 12);
- src[2] = zmw_rx_buf_readh(dev, buf, 14);
-
- if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3)
- {
- /* AP */
- dst[0] = zmw_rx_buf_readh(dev, buf, 4);
-
- psBit = (zmw_rx_buf_readb(dev, buf, 1) & 0x10) >> 4;
- /* Get AID and update STA PS mode */
- aid = zfApGetSTAInfoAndUpdatePs(dev, src, &staState, vap, psBit, uapsdTrig);
-
- /* if STA not associated, send deauth */
- if ((aid == 0xffff) || (staState != ZM_STATE_ASOC))
- {
- if ((dst[0]&0x1)==0)
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, src, 0x7,
- 0, 0);
- }
-
- return ZM_ERR_STA_NOT_ASSOCIATED;
- }
- } /* if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3) */
- else
- {
- /* WDS */
- for (i=0; i<ZM_MAX_WDS_SUPPORT; i++)
- {
- if ((wd->ap.wds.wdsBitmap & (1<<i)) != 0)
- {
- if ((src[0] == wd->ap.wds.macAddr[i][0])
- && (src[1] == wd->ap.wds.macAddr[i][1])
- && (src[2] == wd->ap.wds.macAddr[i][2]))
- {
- *vap = 0x20 + i;
- break;
- }
- }
- }
- }
- return ZM_SUCCESS;
-}
-
-void zfApProcessPsPoll(zdev_t* dev, zbuf_t* buf)
-{
- u16_t src[3];
- u16_t dst[3];
- zbuf_t* psBuf = NULL;
- u16_t id;
- u8_t moreData = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- src[0] = zmw_tx_buf_readh(dev, buf, 10);
- src[1] = zmw_tx_buf_readh(dev, buf, 12);
- src[2] = zmw_tx_buf_readh(dev, buf, 14);
-
- /* Find ps buffer for PsPoll */
- zmw_enter_critical_section(dev);
- id = wd->ap.uniHead;
- while (id != wd->ap.uniTail)
- {
- psBuf = wd->ap.uniArray[id];
-
- dst[0] = zmw_tx_buf_readh(dev, psBuf, 0);
- dst[1] = zmw_tx_buf_readh(dev, psBuf, 2);
- dst[2] = zmw_tx_buf_readh(dev, psBuf, 4);
-
- if ((src[0] == dst[0]) && (src[1] == dst[1]) && (src[2] == dst[2]))
- {
- moreData = zfApRemoveFromPsQueue(dev, id, src);
- break;
- }
- else
- {
- psBuf = NULL;
- }
- id = (id + 1) & (ZM_UNI_ARRAY_SIZE - 1);
- }
- zmw_leave_critical_section(dev);
-
- /* Send ps buffer */
- if (psBuf != NULL)
- {
- /* Send with more data bit */
- zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, moreData);
- }
-
- return;
-}
-
-void zfApSetProtectionMode(zdev_t* dev, u16_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- if (mode == 0)
- {
- if (wd->ap.protectionMode != mode)
- {
- /* Write MAC&PHY registers to disable protection */
-
- wd->ap.protectionMode = mode;
- }
-
- }
- else
- {
- if (wd->ap.protectionMode != mode)
- {
- /* Write MAC&PHY registers to enable protection */
-
- wd->ap.protectionMode = mode;
- }
- }
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfApSendFailure */
-/* Send failure. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* addr : receiver address */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-void zfApSendFailure(zdev_t* dev, u8_t* addr)
-{
- u16_t id;
- u16_t staAddr[3];
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- staAddr[0] = addr[0] + (((u16_t)addr[1])<<8);
- staAddr[1] = addr[2] + (((u16_t)addr[3])<<8);
- staAddr[2] = addr[4] + (((u16_t)addr[5])<<8);
- zmw_enter_critical_section(dev);
- id = zfApFindSta(dev, staAddr);
- if (id != 0xffff)
- {
- /* Send failture : Add 3 minutes to inactive time that will */
- /* will make STA been kicked out soon */
- wd->ap.staTable[id].time -= (3*ZM_TICK_PER_MINUTE);
- }
- zmw_leave_critical_section(dev);
-}
-
-
-void zfApProcessAction(zdev_t* dev, zbuf_t* buf)
-{
- u8_t category;
-
- //zmw_get_wlan_dev(dev);
-
- //zmw_declare_for_critical_section();
-
- category = zmw_rx_buf_readb(dev, buf, 24);
-
- switch (category)
- {
- case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
- zfAggBlockAckActionFrame(dev, buf);
- break;
- default:
- break;
- }
-
- return;
-}
diff --git a/drivers/staging/otus/80211core/cmmsta.c b/drivers/staging/otus/80211core/cmmsta.c
deleted file mode 100644
index 0fda30d..0000000
--- a/drivers/staging/otus/80211core/cmmsta.c
+++ /dev/null
@@ -1,5817 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-#include "ratectrl.h"
-#include "../hal/hpreg.h"
-
-/* TODO : change global variable to constant */
-u8_t zgWpaRadiusOui[] = { 0x00, 0x50, 0xf2, 0x01 };
-u8_t zgWpaAesOui[] = { 0x00, 0x50, 0xf2, 0x04 };
-u8_t zgWpa2RadiusOui[] = { 0x00, 0x0f, 0xac, 0x01 };
-u8_t zgWpa2AesOui[] = { 0x00, 0x0f, 0xac, 0x04 };
-
-const u16_t zcCwTlb[16] = { 0, 1, 3, 7, 15, 31, 63, 127,
- 255, 511, 1023, 2047, 4095, 4095, 4095, 4095};
-
-void zfStaStartConnectCb(zdev_t* dev);
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaPutApIntoBlockingList */
-/* Put AP into blocking AP list. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* bssid : AP's BSSID */
-/* weight : weight of AP */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-void zfStaPutApIntoBlockingList(zdev_t* dev, u8_t* bssid, u8_t weight)
-{
- u16_t i, j;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- if (weight > 0)
- {
- zmw_enter_critical_section(dev);
- /*Find same bssid entry first*/
- for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
- {
- for (j=0; j<6; j++)
- {
- if(wd->sta.blockingApList[i].addr[j]!= bssid[j])
- {
- break;
- }
- }
-
- if(j==6)
- {
- break;
- }
- }
- /*This bssid doesn't have old record.Find an empty entry*/
- if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE)
- {
- for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
- {
- if (wd->sta.blockingApList[i].weight == 0)
- {
- break;
- }
- }
- }
-
- /* If the list is full, pick one entry for replacement */
- if (i == ZM_MAX_BLOCKING_AP_LIST_SIZE)
- {
- i = bssid[5] & (ZM_MAX_BLOCKING_AP_LIST_SIZE-1);
- }
-
- /* Update AP address and weight */
- for (j=0; j<6; j++)
- {
- wd->sta.blockingApList[i].addr[j] = bssid[j];
- }
-
- wd->sta.blockingApList[i].weight = weight;
- zmw_leave_critical_section(dev);
- }
-
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaIsApInBlockingList */
-/* Is AP in blocking list. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* bssid : AP's BSSID */
-/* */
-/* OUTPUTS */
-/* TRUE : AP in blocking list */
-/* FALSE : AP not in blocking list */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfStaIsApInBlockingList(zdev_t* dev, u8_t* bssid)
-{
- u16_t i, j;
- zmw_get_wlan_dev(dev);
- //zmw_declare_for_critical_section();
-
- //zmw_enter_critical_section(dev);
- for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
- {
- if (wd->sta.blockingApList[i].weight != 0)
- {
- for (j=0; j<6; j++)
- {
- if (wd->sta.blockingApList[i].addr[j] != bssid[j])
- {
- break;
- }
- }
- if (j == 6)
- {
- //zmw_leave_critical_section(dev);
- return TRUE;
- }
- }
- }
- //zmw_leave_critical_section(dev);
- return FALSE;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaRefreshBlockList */
-/* Is AP in blocking list. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* flushFlag : flush whole blocking list */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-void zfStaRefreshBlockList(zdev_t* dev, u16_t flushFlag)
-{
- u16_t i;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- for (i=0; i<ZM_MAX_BLOCKING_AP_LIST_SIZE; i++)
- {
- if (wd->sta.blockingApList[i].weight != 0)
- {
- if (flushFlag != 0)
- {
- wd->sta.blockingApList[i].weight = 0;
- }
- else
- {
- wd->sta.blockingApList[i].weight--;
- }
- }
- }
- zmw_leave_critical_section(dev);
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaConnectFail */
-/* Handle Connect failure. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* bssid : BSSID */
-/* reason : reason of failure */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-void zfStaConnectFail(zdev_t* dev, u16_t reason, u16_t* bssid, u8_t weight)
-{
- zmw_get_wlan_dev(dev);
-
- /* Change internal state */
- zfChangeAdapterState(dev, ZM_STA_STATE_DISCONNECT);
-
- /* Improve WEP/TKIP performance with HT AP, detail information please look bug#32495 */
- //zfHpSetTTSIFSTime(dev, 0x8);
-
- /* Notify wrapper of connection status changes */
- if (wd->zfcbConnectNotify != NULL)
- {
- wd->zfcbConnectNotify(dev, reason, bssid);
- }
-
- /* Put AP into internal blocking list */
- zfStaPutApIntoBlockingList(dev, (u8_t *)bssid, weight);
-
- /* Issue another SCAN */
- if ( wd->sta.bAutoReconnect )
- {
- zm_debug_msg0("Start internal scan...");
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- zfScanMgrScanStart(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- }
-}
-
-u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->sta.oppositeCount;
-}
-
-u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx)
-{
- u8_t oppositeCount;
- u8_t i;
- u8_t index = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- oppositeCount = wd->sta.oppositeCount;
- if ( oppositeCount > numToIterate )
- {
- oppositeCount = numToIterate;
- }
-
- for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
- {
- if ( oppositeCount == 0 )
- {
- break;
- }
-
- if ( wd->sta.oppositeInfo[i].valid == 0 )
- {
- continue;
- }
-
- callback(dev, &wd->sta.oppositeInfo[i], ctx, index++);
- oppositeCount--;
-
- }
-
- zmw_leave_critical_section(dev);
-
- return index;
-}
-
-
-s8_t zfStaFindFreeOpposite(zdev_t* dev, u16_t *sa, int *pFoundIdx)
-{
- int oppositeCount;
- int i;
-
- zmw_get_wlan_dev(dev);
-
- oppositeCount = wd->sta.oppositeCount;
-
- for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
- {
- if ( oppositeCount == 0 )
- {
- break;
- }
-
- if ( wd->sta.oppositeInfo[i].valid == 0 )
- {
- continue;
- }
-
- oppositeCount--;
- if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) )
- {
- //wd->sta.oppositeInfo[i].aliveCounter++;
- wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
-
- /* it is already stored */
- return 1;
- }
- }
-
- // Check if there's still space for new comer
- if ( wd->sta.oppositeCount == ZM_MAX_OPPOSITE_COUNT )
- {
- return -1;
- }
-
- // Find an unused slot for new peer station
- for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
- {
- if ( wd->sta.oppositeInfo[i].valid == 0 )
- {
- break;
- }
- }
-
- *pFoundIdx = i;
- return 0;
-}
-
-s8_t zfStaFindOppositeByMACAddr(zdev_t* dev, u16_t *sa, u8_t *pFoundIdx)
-{
- u32_t oppositeCount;
- u32_t i;
-
- zmw_get_wlan_dev(dev);
-
- oppositeCount = wd->sta.oppositeCount;
-
- for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
- {
- if ( oppositeCount == 0 )
- {
- break;
- }
-
- if ( wd->sta.oppositeInfo[i].valid == 0 )
- {
- continue;
- }
-
- oppositeCount--;
- if ( zfMemoryIsEqual((u8_t*) sa, wd->sta.oppositeInfo[i].macAddr, 6) )
- {
- *pFoundIdx = (u8_t)i;
-
- return 0;
- }
- }
-
- *pFoundIdx = 0;
- return 1;
-}
-
-static void zfStaInitCommonOppositeInfo(zdev_t* dev, int i)
-{
- zmw_get_wlan_dev(dev);
-
- /* set the default rate to the highest rate */
- wd->sta.oppositeInfo[i].valid = 1;
- wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
- wd->sta.oppositeCount++;
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- /* Set parameters for new opposite peer station !!! */
- wd->sta.oppositeInfo[i].camIdx = 0xff; // Not set key in this location
- wd->sta.oppositeInfo[i].pkInstalled = 0;
- wd->sta.oppositeInfo[i].wpaState = ZM_STA_WPA_STATE_INIT ; // No encryption
-#endif
-}
-
-int zfStaSetOppositeInfoFromBSSInfo(zdev_t* dev, struct zsBssInfo* pBssInfo)
-{
- int i;
- u8_t* dst;
- u16_t sa[3];
- int res;
- u32_t oneTxStreamCap;
-
- zmw_get_wlan_dev(dev);
-
- zfMemoryCopy((u8_t*) sa, pBssInfo->macaddr, 6);
-
- res = zfStaFindFreeOpposite(dev, sa, &i);
- if ( res != 0 )
- {
- goto zlReturn;
- }
-
- dst = wd->sta.oppositeInfo[i].macAddr;
- zfMemoryCopy(dst, (u8_t *)sa, 6);
-
- oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
-
- if (pBssInfo->extSupportedRates[1] != 0)
- {
- /* TODO : Handle 11n */
- if (pBssInfo->frequency < 3000)
- {
- /* 2.4GHz */
- if (pBssInfo->EnableHT == 1)
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40);
- else
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, pBssInfo->SG40);
- }
- else
- {
- /* 5GHz */
- if (pBssInfo->EnableHT == 1)
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40);
- else
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40);
- }
- }
- else
- {
- /* TODO : Handle 11n */
- if (pBssInfo->frequency < 3000)
- {
- /* 2.4GHz */
- if (pBssInfo->EnableHT == 1)
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, pBssInfo->SG40);
- else
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, pBssInfo->SG40);
- }
- else
- {
- /* 5GHz */
- if (pBssInfo->EnableHT == 1)
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, pBssInfo->SG40);
- else
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, pBssInfo->SG40);
- }
- }
-
-
- zfStaInitCommonOppositeInfo(dev, i);
-zlReturn:
- return 0;
-}
-
-int zfStaSetOppositeInfoFromRxBuf(zdev_t* dev, zbuf_t* buf)
-{
- int i;
- u8_t* dst;
- u16_t sa[3];
- int res = 0;
- u16_t offset;
- u8_t bSupportExtRate;
- u32_t rtsctsRate = 0xffffffff; /* CTS:OFDM 6M, RTS:OFDM 6M */
- u32_t oneTxStreamCap;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
- sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
- sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
-
- zmw_enter_critical_section(dev);
-
- res = zfStaFindFreeOpposite(dev, sa, &i);
- if ( res != 0 )
- {
- goto zlReturn;
- }
-
- dst = wd->sta.oppositeInfo[i].macAddr;
- zfCopyFromRxBuffer(dev, buf, dst, ZM_WLAN_HEADER_A2_OFFSET, 6);
-
- if ( (wd->sta.currentFrequency < 3000) && !(wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
- {
- bSupportExtRate = 0;
- } else {
- bSupportExtRate = 1;
- }
-
- if ( (bSupportExtRate == 1)
- && (wd->sta.currentFrequency < 3000)
- && (wd->wlanMode == ZM_MODE_IBSS)
- && (wd->wfc.bIbssGMode == 0) )
- {
- bSupportExtRate = 0;
- }
-
- wd->sta.connection_11b = 0;
- oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
-
- if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE)) != 0xffff)
- && (bSupportExtRate == 1) )
- {
- /* TODO : Handle 11n */
- if (wd->sta.currentFrequency < 3000)
- {
- /* 2.4GHz */
- if (wd->sta.EnableHT == 1)
- {
- //11ng
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40);
- }
- else
- {
- //11g
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 1, wd->sta.SG40);
- }
- rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */
- }
- else
- {
- /* 5GHz */
- if (wd->sta.EnableHT == 1)
- {
- //11na
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40);
- }
- else
- {
- //11a
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40);
- }
- rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */
- }
- }
- else
- {
- /* TODO : Handle 11n */
- if (wd->sta.currentFrequency < 3000)
- {
- /* 2.4GHz */
- if (wd->sta.EnableHT == 1)
- {
- //11ng
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 1, wd->sta.SG40);
- rtsctsRate = 0x00001bb; /* CTS:CCK 1M, RTS:OFDM 6M */
- }
- else
- {
- //11b
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 0, 1, wd->sta.SG40);
- rtsctsRate = 0x0; /* CTS:CCK 1M, RTS:CCK 1M */
- wd->sta.connection_11b = 1;
- }
- }
- else
- {
- /* 5GHz */
- if (wd->sta.EnableHT == 1)
- {
- //11na
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, (oneTxStreamCap!=0)?3:2, 0, wd->sta.SG40);
- }
- else
- {
- //11a
- zfRateCtrlInitCell(dev, &wd->sta.oppositeInfo[i].rcCell, 1, 0, wd->sta.SG40);
- }
- rtsctsRate = 0x10b01bb; /* CTS:OFDM 6M, RTS:OFDM 6M */
- }
- }
-
- zfStaInitCommonOppositeInfo(dev, i);
-
-zlReturn:
- zmw_leave_critical_section(dev);
-
- if (rtsctsRate != 0xffffffff)
- {
- zfHpSetRTSCTSRate(dev, rtsctsRate);
- }
- return res;
-}
-
-void zfStaProtErpMonitor(zdev_t* dev, zbuf_t* buf)
-{
- u16_t offset;
- u8_t erp;
- u8_t bssid[6];
-
- zmw_get_wlan_dev(dev);
-
- if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)&&(zfStaIsConnected(dev)) )
- {
- ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
-
- if (zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6))
- {
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP);
- if (offset != 0xffff)
- {
- erp = zmw_rx_buf_readb(dev, buf, offset+2);
-
- if ( erp & ZM_BIT_1 )
- {
- //zm_debug_msg0("protection mode on");
- if (wd->sta.bProtectionMode == FALSE)
- {
- wd->sta.bProtectionMode = TRUE;
- zfHpSetSlotTime(dev, 0);
- }
- }
- else
- {
- //zm_debug_msg0("protection mode off");
- if (wd->sta.bProtectionMode == TRUE)
- {
- wd->sta.bProtectionMode = FALSE;
- zfHpSetSlotTime(dev, 1);
- }
- }
- }
- }
- //Check the existence of Non-N AP
- //Follow the check the "pBssInfo->EnableHT"
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY);
- if (offset != 0xffff)
- {}
- else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
- {}
- else
- {wd->sta.NonNAPcount++;}
- }
-}
-
-void zfStaUpdateWmeParameter(zdev_t* dev, zbuf_t* buf)
-{
- u16_t tmp;
- u16_t aifs[5];
- u16_t cwmin[5];
- u16_t cwmax[5];
- u16_t txop[5];
- u8_t acm;
- u8_t ac;
- u16_t len;
- u16_t i;
- u16_t offset;
- u8_t rxWmeParameterSetCount;
-
- zmw_get_wlan_dev(dev);
-
- /* Update if WME parameter set count is changed */
- /* If connect to WME AP */
- if (wd->sta.wmeConnected != 0)
- {
- /* Find WME parameter element */
- offset = zfFindWifiElement(dev, buf, 2, 1);
- if (offset != 0xffff)
- {
- len = zmw_rx_buf_readb(dev, buf, offset+1);
- if (len >= 7)
- {
- rxWmeParameterSetCount=zmw_rx_buf_readb(dev, buf, offset+8);
- if (rxWmeParameterSetCount != wd->sta.wmeParameterSetCount)
- {
- zm_msg0_mm(ZM_LV_0, "wmeParameterSetCount changed!");
- wd->sta.wmeParameterSetCount = rxWmeParameterSetCount;
- /* retrieve WME parameter and update TxQ parameters */
- acm = 0xf;
- for (i=0; i<4; i++)
- {
- if (len >= (8+(i*4)+4))
- {
- tmp=zmw_rx_buf_readb(dev, buf, offset+10+i*4);
- ac = (tmp >> 5) & 0x3;
- if ((tmp & 0x10) == 0)
- {
- acm &= (~(1<<ac));
- }
- aifs[ac] = ((tmp & 0xf) * 9) + 10;
- tmp=zmw_rx_buf_readb(dev, buf, offset+11+i*4);
- /* Convert to 2^n */
- cwmin[ac] = zcCwTlb[(tmp & 0xf)];
- cwmax[ac] = zcCwTlb[(tmp >> 4)];
- txop[ac]=zmw_rx_buf_readh(dev, buf,
- offset+12+i*4);
- }
- }
-
- if ((acm & 0x4) != 0)
- {
- cwmin[2] = cwmin[0];
- cwmax[2] = cwmax[0];
- aifs[2] = aifs[0];
- txop[2] = txop[0];
- }
- if ((acm & 0x8) != 0)
- {
- cwmin[3] = cwmin[2];
- cwmax[3] = cwmax[2];
- aifs[3] = aifs[2];
- txop[3] = txop[2];
- }
- cwmin[4] = 3;
- cwmax[4] = 7;
- aifs[4] = 28;
-
- if ((cwmin[2]+aifs[2]) > ((cwmin[0]+aifs[0])+1))
- {
- wd->sta.ac0PriorityHigherThanAc2 = 1;
- }
- else
- {
- wd->sta.ac0PriorityHigherThanAc2 = 0;
- }
- zfHpUpdateQosParameter(dev, cwmin, cwmax, aifs, txop);
- }
- }
- }
- } //if (wd->sta.wmeConnected != 0)
-}
-/* process 802.11h Dynamic Frequency Selection */
-void zfStaUpdateDot11HDFS(zdev_t* dev, zbuf_t* buf)
-{
- //u8_t length, channel, is5G;
- u16_t offset;
-
- zmw_get_wlan_dev(dev);
-
- /*
- Channel Switch Announcement Element Format
- +------+----------+------+-------------------+------------------+--------------------+
- |Format|Element ID|Length|Channel Switch Mode|New Channel Number|Channel Switch Count|
- +------+----------+------+-------------------+------------------+--------------------+
- |Bytes | 1 | 1 | 1 | 1 | 1 |
- +------+----------+------+-------------------+------------------+--------------------+
- |Value | 37 | 3 | 0 or 1 |unsigned integer |unsigned integer |
- +------+----------+------+-------------------+------------------+--------------------+
- */
-
- /* get EID(Channel Switch Announcement) */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE);
- if (offset == 0xffff)
- {
- //zm_debug_msg0("EID(Channel Switch Announcement) not found");
- return;
- }
- else if ( zmw_rx_buf_readb(dev, buf, offset+1) == 0x3 )
- {
- zm_debug_msg0("EID(Channel Switch Announcement) found");
-
- //length = zmw_rx_buf_readb(dev, buf, offset+1);
- //zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2);
-
- //Chanell Switch Mode set to 1, driver should disable transmit immediate
- //we do this by poll CCA high
- if (zmw_rx_buf_readb(dev, buf, offset+2) == 0x1 )
- {
- //use ZM_OID_INTERNAL_WRITE,ZM_CMD_RESET to notice firmware flush quene and stop dma,
- //then restart rx dma but not tx dma
- if (wd->sta.DFSDisableTx != TRUE)
- {
- /* TODO : zfHpResetTxRx would cause Rx hang */
- //zfHpResetTxRx(dev);
- wd->sta.DFSDisableTx = TRUE;
- /* Trgger Rx DMA */
- zfHpStartRecv(dev);
- }
- //Adapter->ZD80211HSetting.DisableTxBy80211H=TRUE;
- //AcquireCtrOfPhyReg(Adapter);
- //ZD1205_WRITE_REGISTER(Adapter,CR24, 0x0);
- //ReleaseDoNotSleep(Adapter);
- }
-
- if (zmw_rx_buf_readb(dev, buf, offset+4) <= 0x2 )
- {
- //Channel Switch
- //if Channel Switch Count = 0 , STA should change channel immediately.
- //if Channel Switch Count > 0 , STA should change channel after TBTT*count
- //But it won't be accurate to let driver calculate TBTT*count, and the value of
- //Channel Switch Count will decrease by one each when continue receving beacon
- //So we change channel here when we receive count <=2.
-
- zfHpDeleteAllowChannel(dev, wd->sta.currentFrequency);
- wd->frequency = zfChNumToFreq(dev, zmw_rx_buf_readb(dev, buf, offset+3), 0);
- //zfHpAddAllowChannel(dev, wd->frequency);
- zm_debug_msg1("CWY - jump to frequency = ", wd->frequency);
- zfCoreSetFrequency(dev, wd->frequency);
- wd->sta.DFSDisableTx = FALSE;
- /* Increase rxBeaconCount to prevent beacon lost */
- if (zfStaIsConnected(dev))
- {
- wd->sta.rxBeaconCount = 1 << 6; // 2 times of check would pass
- }
- //start tx dma to transmit packet
-
- //if (zmw_rx_buf_readb(dev, buf, offset+3) != wd->frequency)
- //{
- // //ZDDbgPrint(("Radar Detect by AP\n"));
- // zfCoreSetFrequency();
- // ProcessRadarDetectEvent(Adapter);
- // Set_RF_Channel(Adapter, SwRfd->Rfd->RxBuffer[index+3], (UCHAR)Adapter->RF_Mode, 1);
- // Adapter->CardSetting.Channel = SwRfd->Rfd->RxBuffer[index+3];
- // Adapter->SaveChannel = Adapter->CardSetting.Channel;
- // Adapter->UtilityChannel = Adapter->CardSetting.Channel;
- //}
- }
- }
-
-}
-/* TODO : process 802.11h Transmission Power Control */
-void zfStaUpdateDot11HTPC(zdev_t* dev, zbuf_t* buf)
-{
-}
-
-/* IBSS power-saving mode */
-void zfStaIbssPSCheckState(zdev_t* dev, zbuf_t* buf)
-{
- u8_t i, frameCtrl;
-
- zmw_get_wlan_dev(dev);
-
- if ( !zfStaIsConnected(dev) )
- {
- return;
- }
-
- if ( wd->wlanMode != ZM_MODE_IBSS )
- {
- return ;
- }
-
- /* check BSSID */
- if ( !zfRxBufferEqualToStr(dev, buf, (u8_t*) wd->sta.bssid,
- ZM_WLAN_HEADER_A3_OFFSET, 6) )
- {
- return;
- }
-
- frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
-
- /* check power management bit */
- if ( frameCtrl & ZM_BIT_4 )
- {
- for(i=1; i<ZM_MAX_PS_STA; i++)
- {
- if ( !wd->sta.staPSList.entity[i].bUsed )
- {
- continue;
- }
-
- /* check source address */
- if ( zfRxBufferEqualToStr(dev, buf,
- wd->sta.staPSList.entity[i].macAddr,
- ZM_WLAN_HEADER_A2_OFFSET, 6) )
- {
- return;
- }
- }
-
- for(i=1; i<ZM_MAX_PS_STA; i++)
- {
- if ( !wd->sta.staPSList.entity[i].bUsed )
- {
- wd->sta.staPSList.entity[i].bUsed = TRUE;
- wd->sta.staPSList.entity[i].bDataQueued = FALSE;
- break;
- }
- }
-
- if ( i == ZM_MAX_PS_STA )
- {
- /* STA list is full */
- return;
- }
-
- zfCopyFromRxBuffer(dev, buf, wd->sta.staPSList.entity[i].macAddr,
- ZM_WLAN_HEADER_A2_OFFSET, 6);
-
- if ( wd->sta.staPSList.count == 0 )
- {
- // enable ATIM window
- //zfEnableAtimWindow(dev);
- }
-
- wd->sta.staPSList.count++;
- }
- else if ( wd->sta.staPSList.count )
- {
- for(i=1; i<ZM_MAX_PS_STA; i++)
- {
- if ( wd->sta.staPSList.entity[i].bUsed )
- {
- if ( zfRxBufferEqualToStr(dev, buf,
- wd->sta.staPSList.entity[i].macAddr,
- ZM_WLAN_HEADER_A2_OFFSET, 6) )
- {
- wd->sta.staPSList.entity[i].bUsed = FALSE;
- wd->sta.staPSList.count--;
-
- if ( wd->sta.staPSList.entity[i].bDataQueued )
- {
- /* send queued data */
- }
- }
- }
- }
-
- if ( wd->sta.staPSList.count == 0 )
- {
- /* disable ATIM window */
- //zfDisableAtimWindow(dev);
- }
-
- }
-}
-
-/* IBSS power-saving mode */
-u8_t zfStaIbssPSQueueData(zdev_t* dev, zbuf_t* buf)
-{
- u8_t i;
- u16_t da[3];
-
- zmw_get_wlan_dev(dev);
-
- if ( !zfStaIsConnected(dev) )
- {
- return 0;
- }
-
- if ( wd->wlanMode != ZM_MODE_IBSS )
- {
- return 0;
- }
-
- if ( wd->sta.staPSList.count == 0 && wd->sta.powerSaveMode <= ZM_STA_PS_NONE )
- {
- return 0;
- }
-
- /* DA */
-#ifdef ZM_ENABLE_NATIVE_WIFI
- da[0] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
- da[1] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 2);
- da[2] = zmw_tx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET + 4);
-#else
- da[0] = zmw_tx_buf_readh(dev, buf, 0);
- da[1] = zmw_tx_buf_readh(dev, buf, 2);
- da[2] = zmw_tx_buf_readh(dev, buf, 4);
-#endif
-
- if ( ZM_IS_MULTICAST_OR_BROADCAST(da) )
- {
- wd->sta.staPSList.entity[0].bDataQueued = TRUE;
- wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf;
- return 1;
- }
-
- // Unicast packet...
-
- for(i=1; i<ZM_MAX_PS_STA; i++)
- {
- if ( zfMemoryIsEqual(wd->sta.staPSList.entity[i].macAddr,
- (u8_t*) da, 6) )
- {
- wd->sta.staPSList.entity[i].bDataQueued = TRUE;
- wd->sta.ibssPSDataQueue[wd->sta.ibssPSDataCount++] = buf;
-
- return 1;
- }
- }
-
-#if 0
- if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
- {
- wd->sta.staPSDataQueue[wd->sta.staPSDataCount++] = buf;
-
- return 1;
- }
-#endif
-
- return 0;
-}
-
-/* IBSS power-saving mode */
-void zfStaIbssPSSend(zdev_t* dev)
-{
- u8_t i;
- u16_t bcastAddr[3] = {0xffff, 0xffff, 0xffff};
-
- zmw_get_wlan_dev(dev);
-
- if ( !zfStaIsConnected(dev) )
- {
- return ;
- }
-
- if ( wd->wlanMode != ZM_MODE_IBSS )
- {
- return ;
- }
-
- for(i=0; i<ZM_MAX_PS_STA; i++)
- {
- if ( wd->sta.staPSList.entity[i].bDataQueued )
- {
- if ( i == 0 )
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM,
- bcastAddr,
- 0, 0, 0);
- }
- else if ( wd->sta.staPSList.entity[i].bUsed )
- {
- // Send ATIM to prevent the peer to go to sleep
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ATIM,
- (u16_t*) wd->sta.staPSList.entity[i].macAddr,
- 0, 0, 0);
- }
-
- wd->sta.staPSList.entity[i].bDataQueued = FALSE;
- }
- }
-
- for(i=0; i<wd->sta.ibssPSDataCount; i++)
- {
- zfTxSendEth(dev, wd->sta.ibssPSDataQueue[i], 0,
- ZM_EXTERNAL_ALLOC_BUF, 0);
- }
-
- wd->sta.ibssPrevPSDataCount = wd->sta.ibssPSDataCount;
- wd->sta.ibssPSDataCount = 0;
-}
-
-
-void zfStaReconnect(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE &&
- wd->wlanMode != ZM_MODE_IBSS )
- {
- return;
- }
-
- if ( (zfStaIsConnected(dev))||(zfStaIsConnecting(dev)) )
- {
- return;
- }
-
- if ( wd->sta.bChannelScan )
- {
- return;
- }
-
- /* Recover zero SSID length */
- if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) && (wd->ws.ssidLen == 0))
- {
- zm_debug_msg0("zfStaReconnect: NOT Support!! Set SSID to any BSS");
- /* ANY BSS */
- zmw_enter_critical_section(dev);
- wd->sta.ssid[0] = 0;
- wd->sta.ssidLen = 0;
- zmw_leave_critical_section(dev);
- }
-
- // RAY: To ensure no TX pending before re-connecting
- zfFlushVtxq(dev);
- zfWlanEnable(dev);
- zfScanMgrScanAck(dev);
-}
-
-void zfStaTimer100ms(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( (wd->tick % 10) == 0 )
- {
- zfPushVtxq(dev);
-// zfPowerSavingMgrMain(dev);
- }
-}
-
-
-void zfStaCheckRxBeacon(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if (( wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) && (zfStaIsConnected(dev)))
- {
- if (wd->beaconInterval == 0)
- {
- wd->beaconInterval = 100;
- }
- if ( (wd->tick % ((wd->beaconInterval * 10) / ZM_MS_PER_TICK)) == 0 )
- {
- /* Check rxBeaconCount */
- if (wd->sta.rxBeaconCount == 0)
- {
- if (wd->sta.beaconMissState == 1)
- {
- /*notify AP that we left*/
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, wd->sta.bssid, 3, 0, 0);
- /* Beacon Lost */
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS,
- wd->sta.bssid, 0);
- }
- else
- {
- wd->sta.beaconMissState = 1;
- /* Reset channel */
- zfCoreSetFrequencyExV2(dev, wd->frequency, wd->BandWidth40,
- wd->ExtOffset, NULL, 1);
- }
- }
- else
- {
- wd->sta.beaconMissState = 0;
- }
- wd->sta.rxBeaconCount = 0;
- }
- }
-}
-
-
-
-void zfStaCheckConnectTimeout(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE )
- {
- return;
- }
-
- if ( !zfStaIsConnecting(dev) )
- {
- return;
- }
-
- zmw_enter_critical_section(dev);
- if ( (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN)||
- (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1)||
- (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2)||
- (wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE) )
- {
- if ( (wd->tick - wd->sta.connectTimer) > ZM_INTERVAL_CONNECT_TIMEOUT )
- {
- if ( wd->sta.connectByReasso )
- {
- wd->sta.failCntOfReasso++;
- if ( wd->sta.failCntOfReasso > 2 )
- {
- wd->sta.connectByReasso = FALSE;
- }
- }
-
- wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
- zm_debug_msg1("connect timeout, state = ", wd->sta.connectState);
- //zfiWlanDisable(dev);
- goto failed;
- }
- }
-
- zmw_leave_critical_section(dev);
- return;
-
-failed:
- zmw_leave_critical_section(dev);
- if(wd->sta.authMode == ZM_AUTH_MODE_AUTO)
- { // Fix some AP not send authentication failed message to sta and lead to connect timeout !
- wd->sta.connectTimeoutCount++;
- }
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT, wd->sta.bssid, 2);
- return;
-}
-
-void zfMmStaTimeTick(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- /* airopeek */
- if (wd->wlanMode != ZM_MODE_AP && !wd->swSniffer)
- {
- if ( wd->tick & 1 )
- {
- zfTimerCheckAndHandle(dev);
- }
-
- zfStaCheckRxBeacon(dev);
- zfStaTimer100ms(dev);
- zfStaCheckConnectTimeout(dev);
- zfPowerSavingMgrMain(dev);
- }
-
-#ifdef ZM_ENABLE_AGGREGATION
- /*
- * add by honda
- */
- zfAggScanAndClear(dev, wd->tick);
-#endif
-}
-
-void zfStaSendBeacon(zdev_t* dev)
-{
- zbuf_t* buf;
- u16_t offset, seq;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- //zm_debug_msg0("\n");
-
- /* TBD : Maximum size of beacon */
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_debug_msg0("Allocate beacon buffer failed");
- return;
- }
-
- offset = 0;
- /* wlan header */
- /* Frame control */
- zmw_tx_buf_writeh(dev, buf, offset, 0x0080);
- offset+=2;
- /* Duration */
- zmw_tx_buf_writeh(dev, buf, offset, 0x0000);
- offset+=2;
- /* Address 1 */
- zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, 0xffff);
- offset+=2;
- /* Address 2 */
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[0]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[1]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->macAddr[2]);
- offset+=2;
- /* Address 3 */
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[0]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[1]);
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.bssid[2]);
- offset+=2;
-
- /* Sequence number */
- zmw_enter_critical_section(dev);
- seq = ((wd->mmseq++)<<4);
- zmw_leave_critical_section(dev);
- zmw_tx_buf_writeh(dev, buf, offset, seq);
- offset+=2;
-
- /* 24-31 Time Stamp : hardware will fill this field */
- offset+=8;
-
- /* Beacon Interval */
- zmw_tx_buf_writeh(dev, buf, offset, wd->beaconInterval);
- offset+=2;
-
- /* Capability */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[0]);
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.capability[1]);
-
- /* SSID */
- offset = zfStaAddIeSsid(dev, buf, offset);
-
- if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g
- {
-
- /* Support Rate */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_CCK);
-
- /* DS parameter set */
- offset = zfMmAddIeDs(dev, buf, offset);
-
- offset = zfStaAddIeIbss(dev, buf, offset);
-
- if( wd->wfc.bIbssGMode
- && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
- {
- /* ERP Information */
- wd->erpElement = 0;
- offset = zfMmAddIeErp(dev, buf, offset);
- }
-
- /* TODO : country information */
- /* RSN */
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
- {
- offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
- }
-
- if( wd->wfc.bIbssGMode
- && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) ) // Only accompany with enabling a mode .
- {
- /* Enable G Mode */
- /* Extended Supported Rates */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_EXTENDED_RATE, ZM_RATE_SET_OFDM);
- }
- }
- else // 5GHz a
- {
- /* Support Rate a Mode */
- offset = zfMmAddIeSupportRate(dev, buf, offset,
- ZM_WLAN_EID_SUPPORT_RATE, ZM_RATE_SET_OFDM);
-
- /* DS parameter set */
- offset = zfMmAddIeDs(dev, buf, offset);
-
- offset = zfStaAddIeIbss(dev, buf, offset);
-
- /* TODO : country information */
- /* RSN */
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
- {
- offset = zfwStaAddIeWpaRsn(dev, buf, offset, ZM_WLAN_FRAME_TYPE_AUTH);
- }
- }
-
- if ( wd->wlanMode != ZM_MODE_IBSS )
- {
- /* TODO : Need to check if it is ok */
- /* HT Capabilities Info */
- offset = zfMmAddHTCapability(dev, buf, offset);
-
- /* Extended HT Capabilities Info */
- offset = zfMmAddExtendedHTCapability(dev, buf, offset);
- }
-
- if ( wd->sta.ibssAdditionalIESize )
- offset = zfStaAddIbssAdditionalIE(dev, buf, offset);
-
- /* 1212 : write to beacon fifo */
- /* 1221 : write to share memory */
- zfHpSendBeacon(dev, buf, offset);
-
- /* Free beacon buffer */
- //zfwBufFree(dev, buf, 0);
-}
-
-void zfStaSignalStatistic(zdev_t* dev, u8_t SignalStrength, u8_t SignalQuality) //CWYang(+)
-{
- zmw_get_wlan_dev(dev);
-
- /* Add Your Code to Do Works Like Moving Average Here */
- wd->SignalStrength = (wd->SignalStrength * 7 + SignalStrength * 3)/10;
- wd->SignalQuality = (wd->SignalQuality * 7 + SignalQuality * 3)/10;
-
-}
-
-struct zsBssInfo* zfStaFindBssInfo(zdev_t* dev, zbuf_t* buf, struct zsWlanProbeRspFrameHeader *pProbeRspHeader)
-{
- u8_t i;
- u8_t j;
- u8_t k;
- u8_t isMatched, length, channel;
- u16_t offset, frequency;
- struct zsBssInfo* pBssInfo;
-
- zmw_get_wlan_dev(dev);
-
- pBssInfo = wd->sta.bssList.head;
- if (pBssInfo == NULL)
- {
- return NULL;
- }
-
- for( i=0; i<wd->sta.bssList.bssCount; i++ )
- {
- //zm_debug_msg2("check pBssInfo = ", pBssInfo);
-
- /* Check BSSID */
- for( j=0; j<6; j++ )
- {
- if ( pBssInfo->bssid[j] != pProbeRspHeader->bssid[j] )
- {
- break;
- }
- }
-
- /* Check SSID */
- if (j == 6)
- {
- if (pProbeRspHeader->ssid[1] <= 32)
- {
- /* compare length and ssid */
- isMatched = 1;
- if((pProbeRspHeader->ssid[1] != 0) && (pBssInfo->ssid[1] != 0))
- {
- for( k=1; k<pProbeRspHeader->ssid[1] + 1; k++ )
- {
- if ( pBssInfo->ssid[k] != pProbeRspHeader->ssid[k] )
- {
- isMatched = 0;
- break;
- }
- }
- }
- }
- else
- {
- isMatched = 0;
- }
- }
- else
- {
- isMatched = 0;
- }
-
- /* Check channel */
- /* Add check channel to solve the bug #31222 */
- if (isMatched) {
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS);
- if (offset != 0xffff) {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length == 1) {
- channel = zmw_rx_buf_readb(dev, buf, offset+2);
- if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0) {
- frequency = 0;
- } else {
- frequency = zfChNumToFreq(dev, channel, 0);;
- }
- } else {
- frequency = 0;
- }
- } else {
- frequency = wd->sta.currentFrequency;
- }
-
- if (frequency != 0) {
- if ( ((frequency > 3000) && (pBssInfo->frequency > 3000))
- || ((frequency < 3000) && (pBssInfo->frequency < 3000)) ) {
- /* redundant */
- break;
- }
- }
- }
-
- pBssInfo = pBssInfo->next;
- }
-
- if ( i == wd->sta.bssList.bssCount )
- {
- pBssInfo = NULL;
- }
-
- return pBssInfo;
-}
-
-u8_t zfStaInitBssInfo(zdev_t* dev, zbuf_t* buf,
- struct zsWlanProbeRspFrameHeader *pProbeRspHeader,
- struct zsBssInfo* pBssInfo, struct zsAdditionInfo* AddInfo, u8_t type)
-{
- u8_t length, channel, is5G;
- u16_t i, offset;
- u8_t apQosInfo;
- u16_t eachIElength = 0;
- u16_t accumulateLen = 0;
-
- zmw_get_wlan_dev(dev);
-
- if ((type == 1) && ((pBssInfo->flag & ZM_BSS_INFO_VALID_BIT) != 0))
- {
- goto zlUpdateRssi;
- }
-
- /* get SSID */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID);
- if (offset == 0xffff)
- {
- zm_debug_msg0("EID(SSID) not found");
- goto zlError;
- }
-
- length = zmw_rx_buf_readb(dev, buf, offset+1);
-
- {
- u8_t Show_Flag = 0;
- zfwGetShowZeroLengthSSID(dev, &Show_Flag);
-
- if(Show_Flag)
- {
- if (length > ZM_MAX_SSID_LENGTH )
- {
- zm_debug_msg0("EID(SSID) is invalid");
- goto zlError;
- }
- }
- else
- {
- if ( length == 0 || length > ZM_MAX_SSID_LENGTH )
- {
- zm_debug_msg0("EID(SSID) is invalid");
- goto zlError;
- }
-
- }
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->ssid, offset, length+2);
-
- /* get DS parameter */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_DS);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if ( length != 1 )
- {
- zm_msg0_mm(ZM_LV_0, "Abnormal DS Param Set IE");
- goto zlError;
- }
- channel = zmw_rx_buf_readb(dev, buf, offset+2);
-
- if (zfHpIsAllowedChannel(dev, zfChNumToFreq(dev, channel, 0)) == 0)
- {
- goto zlError2;
- }
-
- pBssInfo->frequency = zfChNumToFreq(dev, channel, 0); // auto check
- pBssInfo->channel = channel;
-
-
- }
- else
- {
- /* DS parameter not found */
- pBssInfo->frequency = wd->sta.currentFrequency;
- pBssInfo->channel = zfChFreqToNum(wd->sta.currentFrequency, &is5G);
- }
-
- /* initialize security type */
- pBssInfo->securityType = ZM_SECURITY_TYPE_NONE;
-
- /* get macaddr */
- for( i=0; i<6; i++ )
- {
- pBssInfo->macaddr[i] = pProbeRspHeader->sa[i];
- }
-
- /* get bssid */
- for( i=0; i<6; i++ )
- {
- pBssInfo->bssid[i] = pProbeRspHeader->bssid[i];
- }
-
- /* get timestamp */
- for( i=0; i<8; i++ )
- {
- pBssInfo->timeStamp[i] = pProbeRspHeader->timeStamp[i];
- }
-
- /* get beacon interval */
- pBssInfo->beaconInterval[0] = pProbeRspHeader->beaconInterval[0];
- pBssInfo->beaconInterval[1] = pProbeRspHeader->beaconInterval[1];
-
- /* get capability */
- pBssInfo->capability[0] = pProbeRspHeader->capability[0];
- pBssInfo->capability[1] = pProbeRspHeader->capability[1];
-
- /* Copy frame body */
- offset = 36; // Copy from the start of variable IE
- pBssInfo->frameBodysize = zfwBufGetSize(dev, buf)-offset;
- if (pBssInfo->frameBodysize > (ZM_MAX_PROBE_FRAME_BODY_SIZE-1))
- {
- pBssInfo->frameBodysize = ZM_MAX_PROBE_FRAME_BODY_SIZE-1;
- }
- accumulateLen = 0;
- do
- {
- eachIElength = zmw_rx_buf_readb(dev, buf, offset + accumulateLen+1) + 2; //Len+(EID+Data)
-
- if ( (eachIElength >= 2)
- && ((accumulateLen + eachIElength) <= pBssInfo->frameBodysize) )
- {
- zfCopyFromRxBuffer(dev, buf, pBssInfo->frameBody+accumulateLen, offset+accumulateLen, eachIElength);
- accumulateLen+=(u16_t)eachIElength;
- }
- else
- {
- zm_msg0_mm(ZM_LV_1, "probersp frameBodysize abnormal");
- break;
- }
- }
- while(accumulateLen < pBssInfo->frameBodysize);
- pBssInfo->frameBodysize = accumulateLen;
-
- /* get supported rates */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SUPPORT_RATE);
- if (offset == 0xffff)
- {
- zm_debug_msg0("EID(supported rates) not found");
- goto zlError;
- }
-
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if ( length == 0 || length > ZM_MAX_SUPP_RATES_IE_SIZE)
- {
- zm_msg0_mm(ZM_LV_0, "Supported rates IE length abnormal");
- goto zlError;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->supportedRates, offset, length+2);
-
-
-
- /* get Country information */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_COUNTRY);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length > ZM_MAX_COUNTRY_INFO_SIZE)
- {
- length = ZM_MAX_COUNTRY_INFO_SIZE;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->countryInfo, offset, length+2);
- /* check 802.11d support data */
- if (wd->sta.b802_11D)
- {
- zfHpGetRegulationTablefromISO(dev, (u8_t *)&pBssInfo->countryInfo, 3);
- /* only set regulatory one time */
- wd->sta.b802_11D = 0;
- }
- }
-
- /* get ERP information */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP);
- if (offset != 0xffff)
- {
- pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2);
- }
-
- /* get extended supported rates */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_RATE);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length > ZM_MAX_SUPP_RATES_IE_SIZE)
- {
- zm_msg0_mm(ZM_LV_0, "Extended rates IE length abnormal");
- goto zlError;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->extSupportedRates, offset, length+2);
- }
- else
- {
- pBssInfo->extSupportedRates[0] = 0;
- pBssInfo->extSupportedRates[1] = 0;
- }
-
- /* get WPA IE */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_WPA_IE);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length > ZM_MAX_IE_SIZE)
- {
- length = ZM_MAX_IE_SIZE;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->wpaIe, offset, length+2);
- pBssInfo->securityType = ZM_SECURITY_TYPE_WPA;
- }
- else
- {
- pBssInfo->wpaIe[1] = 0;
- }
-
- /* get WPS IE */
- offset = zfFindWifiElement(dev, buf, 4, 0xff);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length > ZM_MAX_WPS_IE_SIZE )
- {
- length = ZM_MAX_WPS_IE_SIZE;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->wscIe, offset, length+2);
- }
- else
- {
- pBssInfo->wscIe[1] = 0;
- }
-
- /* get SuperG IE */
- offset = zfFindSuperGElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE);
- if (offset != 0xffff)
- {
- pBssInfo->apCap |= ZM_SuperG_AP;
- }
-
- /* get XR IE */
- offset = zfFindXRElement(dev, buf, ZM_WLAN_EID_VENDOR_PRIVATE);
- if (offset != 0xffff)
- {
- pBssInfo->apCap |= ZM_XR_AP;
- }
-
- /* get RSN IE */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_RSN_IE);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length > ZM_MAX_IE_SIZE)
- {
- length = ZM_MAX_IE_SIZE;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->rsnIe, offset, length+2);
- pBssInfo->securityType = ZM_SECURITY_TYPE_WPA;
- }
- else
- {
- pBssInfo->rsnIe[1] = 0;
- }
-#ifdef ZM_ENABLE_CENC
- /* get CENC IE */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_CENC_IE);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
- if (length > ZM_MAX_IE_SIZE )
- {
- length = ZM_MAX_IE_SIZE;
- }
- zfCopyFromRxBuffer(dev, buf, pBssInfo->cencIe, offset, length+2);
- pBssInfo->securityType = ZM_SECURITY_TYPE_CENC;
- pBssInfo->capability[0] &= 0xffef;
- }
- else
- {
- pBssInfo->cencIe[1] = 0;
- }
-#endif //ZM_ENABLE_CENC
- /* get WME Parameter IE, probe rsp may contain WME parameter element */
- //if ( wd->bQoSEnable )
- {
- offset = zfFindWifiElement(dev, buf, 2, 1);
- if (offset != 0xffff)
- {
- apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80;
- pBssInfo->wmeSupport = 1 | apQosInfo;
- }
- else if ((offset = zfFindWifiElement(dev, buf, 2, 0)) != 0xffff)
- {
- apQosInfo = zmw_rx_buf_readb(dev, buf, offset+8) & 0x80;
- pBssInfo->wmeSupport = 1 | apQosInfo;
- }
- else
- {
- pBssInfo->wmeSupport = 0;
- }
- }
- //CWYang(+)
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY);
- if (offset != 0xffff)
- {
- /* 11n AP */
- pBssInfo->EnableHT = 1;
- if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x02)
- {
- pBssInfo->enableHT40 = 1;
- }
- else
- {
- pBssInfo->enableHT40 = 0;
- }
-
- if (zmw_rx_buf_readb(dev, buf, offset+1) & 0x40)
- {
- pBssInfo->SG40 = 1;
- }
- else
- {
- pBssInfo->SG40 = 0;
- }
- }
- else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
- {
- /* 11n AP */
- pBssInfo->EnableHT = 1;
- pBssInfo->apCap |= ZM_All11N_AP;
- if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x02)
- {
- pBssInfo->enableHT40 = 1;
- }
- else
- {
- pBssInfo->enableHT40 = 0;
- }
-
- if (zmw_rx_buf_readb(dev, buf, offset+2) & 0x40)
- {
- pBssInfo->SG40 = 1;
- }
- else
- {
- pBssInfo->SG40 = 0;
- }
- }
- else
- {
- pBssInfo->EnableHT = 0;
- }
- /* HT information */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
- if (offset != 0xffff)
- {
- /* atheros pre n */
- pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+2) & 0x03;
- }
- else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff)
- {
- /* pre n 2.0 standard */
- pBssInfo->extChOffset = zmw_rx_buf_readb(dev, buf, offset+3) & 0x03;
- }
- else
- {
- pBssInfo->extChOffset = 0;
- }
-
- if ( (pBssInfo->enableHT40 == 1)
- && ((pBssInfo->extChOffset != 1) && (pBssInfo->extChOffset != 3)) )
- {
- pBssInfo->enableHT40 = 0;
- }
-
- if (pBssInfo->enableHT40 == 1)
- {
- if (zfHpIsAllowedChannel(dev, pBssInfo->frequency+((pBssInfo->extChOffset==1)?20:-20)) == 0)
- {
- /* if extension channel is not an allowed channel, treat AP as non-HT mode */
- pBssInfo->EnableHT = 0;
- pBssInfo->enableHT40 = 0;
- pBssInfo->extChOffset = 0;
- }
- }
-
- /* get ATH Extended Capability */
- if ( ((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)&&
- ((offset = zfFindBrdcmMrvlRlnkExtCap(dev, buf)) == 0xffff))
-
- {
- pBssInfo->athOwlAp = 1;
- }
- else
- {
- pBssInfo->athOwlAp = 0;
- }
-
- /* get Broadcom Extended Capability */
- if ( (pBssInfo->EnableHT == 1) //((offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY)) != 0xffff)
- && ((offset = zfFindBroadcomExtCap(dev, buf)) != 0xffff) )
- {
- pBssInfo->broadcomHTAp = 1;
- }
- else
- {
- pBssInfo->broadcomHTAp = 0;
- }
-
- /* get Marvel Extended Capability */
- offset = zfFindMarvelExtCap(dev, buf);
- if (offset != 0xffff)
- {
- pBssInfo->marvelAp = 1;
- }
- else
- {
- pBssInfo->marvelAp = 0;
- }
-
- /* get ATIM window */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_IBSS);
- if (offset != 0xffff )
- {
- pBssInfo->atimWindow = zmw_rx_buf_readh(dev, buf,offset+2);
- }
-
- /* Fit for support mode */
- if (pBssInfo->frequency > 3000) {
- if (wd->supportMode & ZM_WIRELESS_MODE_5_N) {
-#if 0
- if (wd->supportMode & ZM_WIRELESS_MODE_5_54) {
- /* support mode: a, n */
- /* do nothing */
- } else {
- /* support mode: n */
- /* reject non-n bss info */
- if (!pBssInfo->EnableHT) {
- goto zlError2;
- }
- }
-#endif
- } else {
- if (wd->supportMode & ZM_WIRELESS_MODE_5_54) {
- /* support mode: a */
- /* delete n mode information */
- pBssInfo->EnableHT = 0;
- pBssInfo->enableHT40 = 0;
- pBssInfo->apCap &= (~ZM_All11N_AP);
- pBssInfo->extChOffset = 0;
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY);
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY);
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION);
- } else {
- /* support mode: none */
- goto zlError2;
- }
- }
- } else {
- if (wd->supportMode & ZM_WIRELESS_MODE_24_N) {
-#if 0
- if (wd->supportMode & ZM_WIRELESS_MODE_24_54) {
- if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
- /* support mode: b, g, n */
- /* do nothing */
- } else {
- /* support mode: g, n */
- /* reject b-only bss info */
- if ( (!pBssInfo->EnableHT)
- && (pBssInfo->extSupportedRates[1] == 0) ) {
- goto zlError2;
- }
- }
- } else {
- if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
- /* support mode: b, n */
- /* 1. reject g-only bss info
- * 2. if non g-only, delete g mode information
- */
- if ( !pBssInfo->EnableHT ) {
- if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates)
- || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) {
- goto zlError2;
- } else {
- zfGatherBMode(dev, pBssInfo->supportedRates,
- pBssInfo->extSupportedRates);
- pBssInfo->erp = 0;
-
- pBssInfo->frameBodysize = zfRemoveElement(dev,
- pBssInfo->frameBody, pBssInfo->frameBodysize,
- ZM_WLAN_EID_ERP);
- pBssInfo->frameBodysize = zfRemoveElement(dev,
- pBssInfo->frameBody, pBssInfo->frameBodysize,
- ZM_WLAN_EID_EXTENDED_RATE);
-
- pBssInfo->frameBodysize = zfUpdateElement(dev,
- pBssInfo->frameBody, pBssInfo->frameBodysize,
- pBssInfo->supportedRates);
- }
- }
- } else {
- /* support mode: n */
- /* reject non-n bss info */
- if (!pBssInfo->EnableHT) {
- goto zlError2;
- }
- }
- }
-#endif
- } else {
- /* delete n mode information */
- pBssInfo->EnableHT = 0;
- pBssInfo->enableHT40 = 0;
- pBssInfo->apCap &= (~ZM_All11N_AP);
- pBssInfo->extChOffset = 0;
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_EID_HT_CAPABILITY);
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTCAPABILITY);
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
- pBssInfo->frameBodysize = zfRemoveElement(dev, pBssInfo->frameBody,
- pBssInfo->frameBodysize, ZM_WLAN_PREN2_EID_HTINFORMATION);
-
- if (wd->supportMode & ZM_WIRELESS_MODE_24_54) {
-#if 0
- if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
- /* support mode: b, g */
- /* delete n mode information */
- } else {
- /* support mode: g */
- /* delete n mode information */
- /* reject b-only bss info */
- if (pBssInfo->extSupportedRates[1] == 0) {
- goto zlError2;
- }
- }
-#endif
- } else {
- if (wd->supportMode & ZM_WIRELESS_MODE_24_11) {
- /* support mode: b */
- /* delete n mode information */
- if ( zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->supportedRates)
- || zfIsGOnlyMode(dev, pBssInfo->frequency, pBssInfo->extSupportedRates) ) {
- goto zlError2;
- } else {
- zfGatherBMode(dev, pBssInfo->supportedRates,
- pBssInfo->extSupportedRates);
- pBssInfo->erp = 0;
-
- pBssInfo->frameBodysize = zfRemoveElement(dev,
- pBssInfo->frameBody, pBssInfo->frameBodysize,
- ZM_WLAN_EID_ERP);
- pBssInfo->frameBodysize = zfRemoveElement(dev,
- pBssInfo->frameBody, pBssInfo->frameBodysize,
- ZM_WLAN_EID_EXTENDED_RATE);
-
- pBssInfo->frameBodysize = zfUpdateElement(dev,
- pBssInfo->frameBody, pBssInfo->frameBodysize,
- pBssInfo->supportedRates);
- }
- } else {
- /* support mode: none */
- goto zlError2;
- }
- }
- }
- }
-
- pBssInfo->flag |= ZM_BSS_INFO_VALID_BIT;
-
-zlUpdateRssi:
- /* Update Timer information */
- pBssInfo->tick = wd->tick;
-
- /* Update ERP information */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_ERP);
- if (offset != 0xffff)
- {
- pBssInfo->erp = zmw_rx_buf_readb(dev, buf, offset+2);
- }
-
- if( (s8_t)pBssInfo->signalStrength < (s8_t)AddInfo->Tail.Data.SignalStrength1 )
- {
- /* Update signal strength */
- pBssInfo->signalStrength = (u8_t)AddInfo->Tail.Data.SignalStrength1;
- /* Update signal quality */
- pBssInfo->signalQuality = (u8_t)(AddInfo->Tail.Data.SignalStrength1 * 2);
-
- /* Update the sorting value */
- pBssInfo->sortValue = zfComputeBssInfoWeightValue(dev,
- (pBssInfo->supportedRates[6] + pBssInfo->extSupportedRates[0]),
- pBssInfo->EnableHT,
- pBssInfo->enableHT40,
- pBssInfo->signalStrength);
- }
-
- return 0;
-
-zlError:
-
- return 1;
-
-zlError2:
-
- return 2;
-}
-
-void zfStaProcessBeacon(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo) //CWYang(m)
-{
- /* Parse TIM and send PS-POLL in power saving mode */
- struct zsWlanBeaconFrameHeader* pBeaconHeader;
- struct zsBssInfo* pBssInfo;
- u8_t pBuf[sizeof(struct zsWlanBeaconFrameHeader)];
- u8_t bssid[6];
- int res;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /* sta routine jobs */
- zfStaProtErpMonitor(dev, buf); /* check protection mode */
-
- if (zfStaIsConnected(dev))
- {
- ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
-
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6) )
- {
- zfPowerSavingMgrProcessBeacon(dev, buf);
- zfStaUpdateWmeParameter(dev, buf);
- if (wd->sta.DFSEnable)
- zfStaUpdateDot11HDFS(dev, buf);
- if (wd->sta.TPCEnable)
- zfStaUpdateDot11HTPC(dev, buf);
- /* update signal strength and signal quality */
- zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1,
- AddInfo->Tail.Data.SignalQuality); //CWYang(+)
- wd->sta.rxBeaconCount++;
- }
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- if ( zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A3_OFFSET, 6) )
- {
- int res;
- struct zsPartnerNotifyEvent event;
-
- zm_debug_msg0("20070916 Receive opposite Beacon!");
- zmw_enter_critical_section(dev);
- wd->sta.ibssReceiveBeaconCount++;
- zmw_leave_critical_section(dev);
-
- res = zfStaSetOppositeInfoFromRxBuf(dev, buf);
- if ( res == 0 )
- {
- // New peer station found. Notify the wrapper now
- zfInitPartnerNotifyEvent(dev, buf, &event);
- if (wd->zfcbIbssPartnerNotify != NULL)
- {
- wd->zfcbIbssPartnerNotify(dev, 1, &event);
- }
- }
- /* update signal strength and signal quality */
- zfStaSignalStatistic(dev, AddInfo->Tail.Data.SignalStrength1,
- AddInfo->Tail.Data.SignalQuality); //CWYang(+)
- }
- //else if ( wd->sta.ibssPartnerStatus == ZM_IBSS_PARTNER_LOST )
- // Why does this happen in IBSS?? The impact of Vista since
- // we need to tell it the BSSID
-#if 0
- else if ( wd->sta.oppositeCount == 0 )
- { /* IBSS merge if SSID matched */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID);
- if (offset != 0xffff)
- {
- if ( (wd->sta.ssidLen == zmw_buf_readb(dev, buf, offset+1))&&
- (zfRxBufferEqualToStr(dev, buf, wd->sta.ssid,
- offset+2, wd->sta.ssidLen)) )
- {
- capabilityInfo = zmw_buf_readh(dev, buf, 34);
-
- if ( capabilityInfo & ZM_BIT_1 )
- {
- if ( (wd->sta.capability[0] & ZM_BIT_4) ==
- (capabilityInfo & ZM_BIT_4) )
- {
- zm_debug_msg0("IBSS merge");
- zfCopyFromRxBuffer(dev, buf, bssid,
- ZM_WLAN_HEADER_A3_OFFSET, 6);
- zfUpdateBssid(dev, bssid);
- }
- }
- }
- }
- }
-#endif
- }
- }
-
- /* return if not channel scan */
- if ( !wd->sta.bChannelScan )
- {
- goto zlReturn;
- }
-
- zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanBeaconFrameHeader));
- pBeaconHeader = (struct zsWlanBeaconFrameHeader*) pBuf;
-
- zmw_enter_critical_section(dev);
-
- //zm_debug_msg1("bss count = ", wd->sta.bssList.bssCount);
-
- pBssInfo = zfStaFindBssInfo(dev, buf, pBeaconHeader);
-
- if ( pBssInfo == NULL )
- {
- /* Allocate a new entry if BSS not in the scan list */
- pBssInfo = zfBssInfoAllocate(dev);
- if (pBssInfo != NULL)
- {
- res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 0);
- //zfDumpSSID(pBssInfo->ssid[1], &(pBssInfo->ssid[2]));
- if ( res != 0 )
- {
- zfBssInfoFree(dev, pBssInfo);
- }
- else
- {
- zfBssInfoInsertToList(dev, pBssInfo);
- }
- }
- }
- else
- {
- res = zfStaInitBssInfo(dev, buf, pBeaconHeader, pBssInfo, AddInfo, 1);
- if (res == 2)
- {
- zfBssInfoRemoveFromList(dev, pBssInfo);
- zfBssInfoFree(dev, pBssInfo);
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- int idx;
-
- // It would reset the alive counter if the peer station is found!
- zfStaFindFreeOpposite(dev, (u16_t *)pBssInfo->macaddr, &idx);
- }
- }
-
- zmw_leave_critical_section(dev);
-
-zlReturn:
-
- return;
-}
-
-
-void zfAuthFreqCompleteCb(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_COMPLETED)
- {
- zm_debug_msg0("ZM_STA_CONN_STATE_ASSOCIATE");
- wd->sta.connectTimer = wd->tick;
- wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE;
- }
-
- zmw_leave_critical_section(dev);
- return;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfProcessAuth */
-/* Process authenticate management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : auth frame buffer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-/* Note : AP allows one authenticating STA at a time, does not */
-/* support multiple authentication process. Make sure */
-/* authentication state machine will not be blocked due */
-/* to incompleted authentication handshake. */
-void zfStaProcessAuth(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
-{
- struct zsWlanAuthFrameHeader* pAuthFrame;
- u8_t pBuf[sizeof(struct zsWlanAuthFrameHeader)];
- u32_t p1, p2;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- if ( !zfStaIsConnecting(dev) )
- {
- return;
- }
-
- pAuthFrame = (struct zsWlanAuthFrameHeader*) pBuf;
- zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAuthFrameHeader));
-
- if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_OPEN )
- {
- if ( (zmw_le16_to_cpu(pAuthFrame->seq) == 2)&&
- (zmw_le16_to_cpu(pAuthFrame->algo) == 0)&&
- (zmw_le16_to_cpu(pAuthFrame->status) == 0) )
- {
-
- zmw_enter_critical_section(dev);
- wd->sta.connectTimer = wd->tick;
- zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_COMPLETED");
- wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_COMPLETED;
- zmw_leave_critical_section(dev);
-
- //Set channel according to AP's configuration
- //Move to here because of Cisco 11n AP feature
- zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
- wd->ExtOffset, zfAuthFreqCompleteCb);
-
- /* send association frame */
- if ( wd->sta.connectByReasso )
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_REASOCREQ,
- wd->sta.bssid, 0, 0, 0);
- }
- else
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ,
- wd->sta.bssid, 0, 0, 0);
- }
-
-
- }
- else
- {
- zm_debug_msg1("authentication failed, status = ",
- pAuthFrame->status);
-
- if (wd->sta.authMode == ZM_AUTH_MODE_AUTO)
- {
- wd->sta.bIsSharedKey = 1;
- zfStaStartConnect(dev, wd->sta.bIsSharedKey);
- }
- else
- {
- zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
- }
- }
- }
- else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_1 )
- {
- if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1) &&
- (zmw_le16_to_cpu(pAuthFrame->seq) == 2) &&
- (zmw_le16_to_cpu(pAuthFrame->status) == 0))
- //&& (pAuthFrame->challengeText[1] <= 255) )
- {
- zfMemoryCopy(wd->sta.challengeText, pAuthFrame->challengeText,
- pAuthFrame->challengeText[1]+2);
-
- /* send the 3rd authentication frame */
- p1 = 0x30001;
- p2 = 0;
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH,
- wd->sta.bssid, p1, p2, 0);
-
- zmw_enter_critical_section(dev);
- wd->sta.connectTimer = wd->tick;
-
- zm_debug_msg0("ZM_STA_SUB_STATE_AUTH_SHARE_2");
- wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_2;
- zmw_leave_critical_section(dev);
- }
- else
- {
- zm_debug_msg1("authentication failed, status = ",
- pAuthFrame->status);
-
- zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
- }
- }
- else if ( wd->sta.connectState == ZM_STA_CONN_STATE_AUTH_SHARE_2 )
- {
- if ( (zmw_le16_to_cpu(pAuthFrame->algo) == 1)&&
- (zmw_le16_to_cpu(pAuthFrame->seq) == 4)&&
- (zmw_le16_to_cpu(pAuthFrame->status) == 0) )
- {
- //Set channel according to AP's configuration
- //Move to here because of Cisco 11n AP feature
- zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
- wd->ExtOffset, NULL);
-
- /* send association frame */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_ASOCREQ,
- wd->sta.bssid, 0, 0, 0);
-
- zmw_enter_critical_section(dev);
- wd->sta.connectTimer = wd->tick;
-
- zm_debug_msg0("ZM_STA_SUB_STATE_ASSOCIATE");
- wd->sta.connectState = ZM_STA_CONN_STATE_ASSOCIATE;
- zmw_leave_critical_section(dev);
- }
- else
- {
- zm_debug_msg1("authentication failed, status = ",
- pAuthFrame->status);
-
- zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
- }
- }
- else
- {
- zm_debug_msg0("unknown case");
- }
-}
-
-void zfStaProcessAsocReq(zdev_t* dev, zbuf_t* buf, u16_t* src, u16_t apId)
-{
-
- return;
-}
-
-void zfStaProcessAsocRsp(zdev_t* dev, zbuf_t* buf)
-{
- struct zsWlanAssoFrameHeader* pAssoFrame;
- u8_t pBuf[sizeof(struct zsWlanAssoFrameHeader)];
- u16_t offset;
- u32_t i;
- u32_t oneTxStreamCap;
-
- zmw_get_wlan_dev(dev);
-
- if ( !zfStaIsConnecting(dev) )
- {
- return;
- }
-
- pAssoFrame = (struct zsWlanAssoFrameHeader*) pBuf;
- zfCopyFromRxBuffer(dev, buf, pBuf, 0, sizeof(struct zsWlanAssoFrameHeader));
-
- if ( wd->sta.connectState == ZM_STA_CONN_STATE_ASSOCIATE )
- {
- if ( pAssoFrame->status == 0 )
- {
- zm_debug_msg0("ZM_STA_STATE_CONNECTED");
-
- if (wd->sta.EnableHT == 1)
- {
- wd->sta.wmeConnected = 1;
- }
- if ((wd->sta.wmeEnabled & ZM_STA_WME_ENABLE_BIT) != 0) //WME enabled
- {
- /* Asoc rsp may contain WME parameter element */
- offset = zfFindWifiElement(dev, buf, 2, 1);
- if (offset != 0xffff)
- {
- zm_debug_msg0("WME enable");
- wd->sta.wmeConnected = 1;
- if ((wd->sta.wmeEnabled & ZM_STA_UAPSD_ENABLE_BIT) != 0)
- {
- if ((zmw_rx_buf_readb(dev, buf, offset+8) & 0x80) != 0)
- {
- zm_debug_msg0("UAPSD enable");
- wd->sta.qosInfo = wd->sta.wmeQosInfo;
- }
- }
-
- zfStaUpdateWmeParameter(dev, buf);
- }
- }
-
-
- //Store asoc response frame body, for VISTA only
- wd->sta.asocRspFrameBodySize = zfwBufGetSize(dev, buf)-24;
- if (wd->sta.asocRspFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
- {
- wd->sta.asocRspFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
- }
- for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
- {
- wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
- }
-
- zfStaStoreAsocRspIe(dev, buf);
- if (wd->sta.EnableHT &&
- ((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) != 0) &&
- (wd->ExtOffset != 0))
- {
- wd->sta.htCtrlBandwidth = 1;
- }
- else
- {
- wd->sta.htCtrlBandwidth = 0;
- }
-
- //Set channel according to AP's configuration
- //zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
- // wd->ExtOffset, NULL);
-
- if (wd->sta.EnableHT == 1)
- {
- wd->addbaComplete = 0;
-
- if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_ENCRY_EN) == 0 &&
- (wd->sta.SWEncryptEnable & ZM_SW_WEP_ENCRY_EN) == 0)
- {
- wd->addbaCount = 1;
- zfAggSendAddbaRequest(dev, wd->sta.bssid, 0, 0);
- zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_ADDBA, 100);
- }
- }
-
- /* set RIFS support */
- if(wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RIFSMode)
- {
- wd->sta.HT2040 = 1;
-// zfHpSetRifs(dev, wd->sta.EnableHT, 1, (wd->sta.currentFrequency < 3000)? 1:0);
- }
-
- wd->sta.aid = pAssoFrame->aid & 0x3fff;
- wd->sta.oppositeCount = 0; /* reset opposite count */
- zfStaSetOppositeInfoFromRxBuf(dev, buf);
-
- wd->sta.rxBeaconCount = 16;
-
- zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
- wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
- if (wd->zfcbConnectNotify != NULL)
- {
- if (wd->sta.EnableHT != 0) /* 11n */
- {
- oneTxStreamCap = (zfHpCapability(dev) & ZM_HP_CAP_11N_ONE_TX_STREAM);
- if (wd->sta.htCtrlBandwidth == 1) /* HT40*/
- {
- if(oneTxStreamCap) /* one Tx stream */
- {
- if (wd->sta.SG40)
- {
- wd->CurrentTxRateKbps = 150000;
- wd->CurrentRxRateKbps = 300000;
- }
- else
- {
- wd->CurrentTxRateKbps = 135000;
- wd->CurrentRxRateKbps = 270000;
- }
- }
- else /* Two Tx streams */
- {
- if (wd->sta.SG40)
- {
- wd->CurrentTxRateKbps = 300000;
- wd->CurrentRxRateKbps = 300000;
- }
- else
- {
- wd->CurrentTxRateKbps = 270000;
- wd->CurrentRxRateKbps = 270000;
- }
- }
- }
- else /* HT20 */
- {
- if(oneTxStreamCap) /* one Tx stream */
- {
- wd->CurrentTxRateKbps = 650000;
- wd->CurrentRxRateKbps = 130000;
- }
- else /* Two Tx streams */
- {
- wd->CurrentTxRateKbps = 130000;
- wd->CurrentRxRateKbps = 130000;
- }
- }
- }
- else /* 11abg */
- {
- if (wd->sta.connection_11b != 0)
- {
- wd->CurrentTxRateKbps = 11000;
- wd->CurrentRxRateKbps = 11000;
- }
- else
- {
- wd->CurrentTxRateKbps = 54000;
- wd->CurrentRxRateKbps = 54000;
- }
- }
-
-
- wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
- }
- wd->sta.connectByReasso = TRUE;
- wd->sta.failCntOfReasso = 0;
-
- zfPowerSavingMgrConnectNotify(dev);
-
- /* Disable here because fixed rate is only for test, TBD. */
- //if (wd->sta.EnableHT)
- //{
- // wd->txMCS = 7; //Rate = 65Mbps
- // wd->txMT = 2; // Ht rate
- // wd->enableAggregation = 2; // Enable Aggregation
- //}
- }
- else
- {
- zm_debug_msg1("association failed, status = ",
- pAssoFrame->status);
-
- zm_debug_msg0("ZM_STA_STATE_DISCONNECT");
- wd->sta.connectByReasso = FALSE;
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3);
- }
- }
-
-}
-
-void zfStaStoreAsocRspIe(zdev_t* dev, zbuf_t* buf)
-{
- u16_t offset;
- u32_t i;
- u16_t length;
- u8_t *htcap;
- u8_t asocBw40 = 0;
- u8_t asocExtOffset = 0;
-
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<wd->sta.asocRspFrameBodySize; i++)
- {
- wd->sta.asocRspFrameBody[i] = zmw_rx_buf_readb(dev, buf, i+24);
- }
-
- /* HT capabilities: 28 octets */
- if ( ((wd->sta.currentFrequency > 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_5_N))
- || ((wd->sta.currentFrequency < 3000) && !(wd->supportMode & ZM_WIRELESS_MODE_24_N)) )
- {
- /* not 11n AP */
- htcap = (u8_t *)&wd->sta.ie.HtCap;
- for (i=0; i<28; i++)
- {
- htcap[i] = 0;
- }
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
- return;
- }
-
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_HT_CAPABILITY);
- if (offset != 0xffff)
- {
- /* atheros pre n */
- zm_debug_msg0("atheros pre n");
- htcap = (u8_t *)&wd->sta.ie.HtCap;
- htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
- htcap[1] = 26;
- for (i=1; i<=26; i++)
- {
- htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
- zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i+1]);
- }
- }
- else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTCAPABILITY)) != 0xffff)
- {
- /* pre n 2.0 standard */
- zm_debug_msg0("pre n 2.0 standard");
- htcap = (u8_t *)&wd->sta.ie.HtCap;
- for (i=0; i<28; i++)
- {
- htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
- zm_msg2_mm(ZM_LV_1, "ASOC: HT Capabilities, htcap=", htcap[i]);
- }
- }
- else
- {
- /* not 11n AP */
- htcap = (u8_t *)&wd->sta.ie.HtCap;
- for (i=0; i<28; i++)
- {
- htcap[i] = 0;
- }
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
- return;
- }
-
- asocBw40 = (u8_t)((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) >> 1);
-
- /* HT information */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_EXTENDED_HT_CAPABILITY);
- if (offset != 0xffff)
- {
- /* atheros pre n */
- zm_debug_msg0("atheros pre n HTINFO");
- length = 22;
- htcap = (u8_t *)&wd->sta.ie.HtInfo;
- htcap[0] = zmw_rx_buf_readb(dev, buf, offset);
- htcap[1] = 22;
- for (i=1; i<=22; i++)
- {
- htcap[i+1] = zmw_rx_buf_readb(dev, buf, offset + i);
- zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i+1]);
- }
- }
- else if ((offset = zfFindElement(dev, buf, ZM_WLAN_PREN2_EID_HTINFORMATION)) != 0xffff)
- {
- /* pre n 2.0 standard */
- zm_debug_msg0("pre n 2.0 standard HTINFO");
- length = zmw_rx_buf_readb(dev, buf, offset + 1);
- htcap = (u8_t *)&wd->sta.ie.HtInfo;
- for (i=0; i<24; i++)
- {
- htcap[i] = zmw_rx_buf_readb(dev, buf, offset + i);
- zm_msg2_mm(ZM_LV_1, "ASOC: HT Info, htinfo=", htcap[i]);
- }
- }
- else
- {
- zm_debug_msg0("no HTINFO");
- htcap = (u8_t *)&wd->sta.ie.HtInfo;
- for (i=0; i<24; i++)
- {
- htcap[i] = 0;
- }
- }
- asocExtOffset = wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_ExtChannelOffsetBelow;
-
- if ((wd->sta.EnableHT == 1) && (asocBw40 == 1) && ((asocExtOffset == 1) || (asocExtOffset == 3)))
- {
- wd->BandWidth40 = asocBw40;
- wd->ExtOffset = asocExtOffset;
- }
- else
- {
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
- }
-
- return;
-}
-
-void zfStaProcessDeauth(zdev_t* dev, zbuf_t* buf)
-{
- u16_t apMacAddr[3];
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* STA : if SA=connected AP then disconnect with AP */
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
- apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
- apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
- if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2]))
- {
- if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame
- {
- if ( zfStaIsConnected(dev) )
- {
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DEAUTH, wd->sta.bssid, 2);
- }
- else if (zfStaIsConnecting(dev))
- {
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED, wd->sta.bssid, 3);
- }
- else
- {
- }
- }
- }
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- u16_t peerMacAddr[3];
- u8_t peerIdx;
- s8_t res;
-
- if ( zfStaIsConnected(dev) )
- {
- peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
- peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
- peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
-
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, peerMacAddr, &peerIdx);
- if ( res == 0 )
- {
- wd->sta.oppositeInfo[peerIdx].aliveCounter = 0;
- }
- zmw_leave_critical_section(dev);
- }
- }
-}
-
-void zfStaProcessDisasoc(zdev_t* dev, zbuf_t* buf)
-{
- u16_t apMacAddr[3];
-
- zmw_get_wlan_dev(dev);
-
- /* STA : if SA=connected AP then disconnect with AP */
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- apMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
- apMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
- apMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
-
- if ((apMacAddr[0] == wd->sta.bssid[0]) && (apMacAddr[1] == wd->sta.bssid[1]) && (apMacAddr[2] == wd->sta.bssid[2]))
- {
- if (zfwBufGetSize(dev, buf) >= 24+2) //not a malformed frame
- {
- if ( zfStaIsConnected(dev) )
- {
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_DISASOC, wd->sta.bssid, 2);
- }
- else
- {
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED, wd->sta.bssid, 3);
- }
- }
- }
- }
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfProcessProbeReq */
-/* Process probe request management frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : auth frame buffer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfStaProcessProbeReq(zdev_t* dev, zbuf_t* buf, u16_t* src)
-{
- u16_t offset;
- u8_t len;
- u16_t i, j;
- u16_t sendFlag;
-
- zmw_get_wlan_dev(dev);
-
- /* check mode : AP/IBSS */
- if ((wd->wlanMode != ZM_MODE_AP) && (wd->wlanMode != ZM_MODE_IBSS))
- {
- zm_msg0_mm(ZM_LV_3, "Ignore probe req");
- return;
- }
-
- /* check SSID */
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_SSID);
- if (offset == 0xffff)
- {
- zm_msg0_mm(ZM_LV_3, "probe req SSID not found");
- return;
- }
-
- len = zmw_rx_buf_readb(dev, buf, offset+1);
-
- for (i=0; i<ZM_MAX_AP_SUPPORT; i++)
- {
- if ((wd->ap.apBitmap & (i<<i)) != 0)
- {
- sendFlag = 0;
- /* boardcast SSID */
- if ((len == 0) && (wd->ap.hideSsid[i] == 0))
- {
- sendFlag = 1;
- }
- /* Not broadcast SSID */
- else if (wd->ap.ssidLen[i] == len)
- {
- for (j=0; j<len; j++)
- {
- if (zmw_rx_buf_readb(dev, buf, offset+1+j)
- != wd->ap.ssid[i][j])
- {
- break;
- }
- }
- if (j == len)
- {
- sendFlag = 1;
- }
- }
- if (sendFlag == 1)
- {
- /* Send probe response */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBERSP, src, i, 0, 0);
- }
- }
- }
-}
-
-void zfStaProcessProbeRsp(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* AddInfo)
-{
- /* return if not channel scan */
- // Probe response is sent with unicast. Is this required?
- // IBSS would send probe request and the code below would prevent
- // the probe response from handling.
- #if 0
- zmw_get_wlan_dev(dev);
-
- if ( !wd->sta.bChannelScan )
- {
- return;
- }
- #endif
-
- zfProcessProbeRsp(dev, buf, AddInfo);
-}
-
-void zfIBSSSetupBssDesc(zdev_t *dev)
-{
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- u8_t i;
-#endif
- struct zsBssInfo *pBssInfo;
- u16_t offset = 0;
-
- zmw_get_wlan_dev(dev);
-
- pBssInfo = &wd->sta.ibssBssDesc;
- zfZeroMemory((u8_t *)pBssInfo, sizeof(struct zsBssInfo));
-
- pBssInfo->signalStrength = 100;
-
- zfMemoryCopy((u8_t *)pBssInfo->macaddr, (u8_t *)wd->macAddr,6);
- zfMemoryCopy((u8_t *)pBssInfo->bssid, (u8_t *)wd->sta.bssid, 6);
-
- pBssInfo->beaconInterval[0] = (u8_t)(wd->beaconInterval) ;
- pBssInfo->beaconInterval[1] = (u8_t)((wd->beaconInterval) >> 8) ;
-
- pBssInfo->capability[0] = wd->sta.capability[0];
- pBssInfo->capability[1] = wd->sta.capability[1];
-
- pBssInfo->ssid[0] = ZM_WLAN_EID_SSID;
- pBssInfo->ssid[1] = wd->sta.ssidLen;
- zfMemoryCopy((u8_t *)&pBssInfo->ssid[2], (u8_t *)wd->sta.ssid, wd->sta.ssidLen);
- zfMemoryCopy((u8_t *)&pBssInfo->frameBody[offset], (u8_t *)pBssInfo->ssid,
- wd->sta.ssidLen + 2);
- offset += wd->sta.ssidLen + 2;
-
- /* support rate */
-
- /* DS parameter set */
- pBssInfo->channel = zfChFreqToNum(wd->frequency, NULL);
- pBssInfo->frequency = wd->frequency;
- pBssInfo->atimWindow = wd->sta.atimWindow;
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
- {
- u8_t rsn[64]=
- {
- /* Element ID */
- 0x30,
- /* Length */
- 0x14,
- /* Version */
- 0x01, 0x00,
- /* Group Cipher Suite, default=TKIP */
- 0x00, 0x0f, 0xac, 0x04,
- /* Pairwise Cipher Suite Count */
- 0x01, 0x00,
- /* Pairwise Cipher Suite, default=TKIP */
- 0x00, 0x0f, 0xac, 0x02,
- /* Authentication and Key Management Suite Count */
- 0x01, 0x00,
- /* Authentication type, default=PSK */
- 0x00, 0x0f, 0xac, 0x02,
- /* RSN capability */
- 0x00, 0x00
- };
-
- /* Overwrite Group Cipher Suite by AP's setting */
- zfMemoryCopy(rsn+4, zgWpa2AesOui, 4);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- /* Overwrite Pairwise Cipher Suite by AES */
- zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
- }
-
- // RSN element id
- pBssInfo->frameBody[offset++] = ZM_WLAN_EID_RSN_IE ;
-
- // RSN length
- pBssInfo->frameBody[offset++] = rsn[1] ;
-
- // RSN information
- for(i=0; i<rsn[1]; i++)
- {
- pBssInfo->frameBody[offset++] = rsn[i+2] ;
- }
-
- zfMemoryCopy(pBssInfo->rsnIe, rsn, rsn[1]+2);
- }
-#endif
-}
-
-void zfIbssConnectNetwork(zdev_t* dev)
-{
- struct zsBssInfo* pBssInfo;
- struct zsBssInfo tmpBssInfo;
- u8_t macAddr[6], bssid[6], bssNotFound = TRUE;
- u16_t i, j=100;
- u16_t k;
- struct zsPartnerNotifyEvent event;
- u32_t channelFlags;
- u16_t oppositeWepStatus;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- /* change state to CONNECTING and stop the channel scanning */
- zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
- zfPowerSavingMgrWakeup(dev);
-
- /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
- zfUpdateDefaultQosParameter(dev, 0);
-
- wd->sta.bProtectionMode = FALSE;
- zfHpSetSlotTime(dev, 1);
-
- /* ESS bit off */
- wd->sta.capability[0] &= ~ZM_BIT_0;
- /* IBSS bit on */
- wd->sta.capability[0] |= ZM_BIT_1;
- /* not not use short slot time */
- wd->sta.capability[1] &= ~ZM_BIT_2;
-
- wd->sta.wmeConnected = 0;
- wd->sta.psMgr.tempWakeUp = 0;
- wd->sta.qosInfo = 0;
- wd->sta.EnableHT = 0;
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
-
- if ( wd->sta.bssList.bssCount )
- {
- //Reorder BssList by RSSI--CWYang(+)
- zfBssInfoReorderList(dev);
-
- zmw_enter_critical_section(dev);
-
- pBssInfo = wd->sta.bssList.head;
-
- for(i=0; i<wd->sta.bssList.bssCount; i++)
- {
- // 20070806 #1 Privacy bit
- if ( pBssInfo->capability[0] & ZM_BIT_4 )
- { // Privacy Ibss network
-// zm_debug_msg0("Privacy bit on");
- oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
-
- if ( pBssInfo->rsnIe[1] != 0 )
- {
- if ( (pBssInfo->rsnIe[7] == 0x01) || (pBssInfo->rsnIe[7] == 0x05) )
- { // WEP-40 & WEP-104
-// zm_debug_msg0("WEP40 or WEP104");
- oppositeWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
- }
- else if ( pBssInfo->rsnIe[7] == 0x02 )
- { // TKIP
-// zm_debug_msg0("TKIP");
- oppositeWepStatus = ZM_ENCRYPTION_TKIP;
- }
- else if ( pBssInfo->rsnIe[7] == 0x04 )
- { // AES
-// zm_debug_msg0("CCMP-AES");
- oppositeWepStatus = ZM_ENCRYPTION_AES;
- }
- }
- }
- else
- {
-// zm_debug_msg0("Privacy bit off");
- oppositeWepStatus = ZM_ENCRYPTION_WEP_DISABLED;
- }
-
- if ( (zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid,
- wd->sta.ssidLen))&&
- (wd->sta.ssidLen == pBssInfo->ssid[1])&&
- (oppositeWepStatus == wd->sta.wepStatus) )
- {
- /* Check support mode */
- if (pBssInfo->frequency > 3000) {
- if ( (pBssInfo->EnableHT == 1)
- || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
- {
- channelFlags = CHANNEL_A_HT;
- if (pBssInfo->enableHT40 == 1) {
- channelFlags |= CHANNEL_HT40;
- }
- } else {
- channelFlags = CHANNEL_A;
- }
- } else {
- if ( (pBssInfo->EnableHT == 1)
- || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
- {
- channelFlags = CHANNEL_G_HT;
- if(pBssInfo->enableHT40 == 1) {
- channelFlags |= CHANNEL_HT40;
- }
- } else {
- if (pBssInfo->extSupportedRates[1] == 0) {
- channelFlags = CHANNEL_B;
- } else {
- channelFlags = CHANNEL_G;
- }
- }
- }
-
- if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0))
- || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1))
- || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2))
- || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) )
- {
- pBssInfo = pBssInfo->next;
- continue;
- }
-
- /* Bypass DFS channel */
- if (zfHpIsDfsChannelNCS(dev, pBssInfo->frequency))
- {
- zm_debug_msg0("Bypass DFS channel");
- continue;
- }
-
- /* check IBSS bit */
- if ( pBssInfo->capability[0] & ZM_BIT_1 )
- {
- /* may check timestamp here */
- j = i;
- break;
- }
- }
-
- pBssInfo = pBssInfo->next;
- }
-
- if ((j < wd->sta.bssList.bssCount) && (pBssInfo != NULL))
- {
- zfwMemoryCopy((u8_t*)&tmpBssInfo, (u8_t*)(pBssInfo), sizeof(struct zsBssInfo));
- pBssInfo = &tmpBssInfo;
- }
- else
- {
- pBssInfo = NULL;
- }
-
- zmw_leave_critical_section(dev);
-
- //if ( j < wd->sta.bssList.bssCount )
- if (pBssInfo != NULL)
- {
- int res;
-
- zm_debug_msg0("IBSS found");
-
- /* Found IBSS, reset bssNotFoundCount */
- zmw_enter_critical_section(dev);
- wd->sta.bssNotFoundCount = 0;
- zmw_leave_critical_section(dev);
-
- bssNotFound = FALSE;
- wd->sta.atimWindow = pBssInfo->atimWindow;
- wd->frequency = pBssInfo->frequency;
- //wd->sta.flagFreqChanging = 1;
- zfCoreSetFrequency(dev, wd->frequency);
- zfUpdateBssid(dev, pBssInfo->bssid);
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO);
- zfUpdateSupportRate(dev, pBssInfo->supportedRates);
- zfUpdateSupportRate(dev, pBssInfo->extSupportedRates);
- wd->beaconInterval = pBssInfo->beaconInterval[0] +
- (((u16_t) pBssInfo->beaconInterval[1]) << 8);
-
- if (wd->beaconInterval == 0)
- {
- wd->beaconInterval = 100;
- }
-
- /* rsn information element */
- if ( pBssInfo->rsnIe[1] != 0 )
- {
- zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe,
- pBssInfo->rsnIe[1]+2);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- /* If not use RSNA , run traditional */
- zmw_enter_critical_section(dev);
- wd->sta.ibssWpa2Psk = 1;
- zmw_leave_critical_section(dev);
-#endif
- }
- else
- {
- wd->sta.rsnIe[1] = 0;
- }
-
- /* privacy bit */
- if ( pBssInfo->capability[0] & ZM_BIT_4 )
- {
- wd->sta.capability[0] |= ZM_BIT_4;
- }
- else
- {
- wd->sta.capability[0] &= ~ZM_BIT_4;
- }
-
- /* preamble type */
- wd->preambleTypeInUsed = wd->preambleType;
- if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO )
- {
- if (pBssInfo->capability[0] & ZM_BIT_5)
- {
- wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
- }
- else
- {
- wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG;
- }
- }
-
- if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
- {
- wd->sta.capability[0] &= ~ZM_BIT_5;
- }
- else
- {
- wd->sta.capability[0] |= ZM_BIT_5;
- }
-
- wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12;
-
- if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
- {
- wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
- }
-
- for (k=0; k<8; k++)
- {
- wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k];
- }
- wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0];
- wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1];
- wd->sta.beaconFrameBody[10] = pBssInfo->capability[0];
- wd->sta.beaconFrameBody[11] = pBssInfo->capability[1];
- //for (k=12; k<wd->sta.beaconFrameBodySize; k++)
- for (k=0; k<pBssInfo->frameBodysize; k++)
- {
- wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k];
- }
-
- zmw_enter_critical_section(dev);
- res = zfStaSetOppositeInfoFromBSSInfo(dev, pBssInfo);
- if ( res == 0 )
- {
- zfMemoryCopy(event.bssid, (u8_t *)(pBssInfo->bssid), 6);
- zfMemoryCopy(event.peerMacAddr, (u8_t *)(pBssInfo->macaddr), 6);
- }
- zmw_leave_critical_section(dev);
-
- //zfwIbssPartnerNotify(dev, 1, &event);
- goto connect_done;
- }
- }
-
- /* IBSS not found */
- if ( bssNotFound )
- {
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- u16_t offset ;
-#endif
- if ( wd->sta.ibssJoinOnly )
- {
- zm_debug_msg0("IBSS join only...retry...");
- goto retry_ibss;
- }
-
- if(wd->sta.bssNotFoundCount<2)
- {
- zmw_enter_critical_section(dev);
- zm_debug_msg1("IBSS not found, do sitesurvey!! bssNotFoundCount=", wd->sta.bssNotFoundCount);
- wd->sta.bssNotFoundCount++;
- zmw_leave_critical_section(dev);
- goto retry_ibss;
- }
- else
- {
- zmw_enter_critical_section(dev);
- /* Fail IBSS found, TODO create IBSS */
- wd->sta.bssNotFoundCount = 0;
- zmw_leave_critical_section(dev);
- }
-
-
- if (zfHpIsDfsChannel(dev, wd->frequency))
- {
- wd->frequency = zfHpFindFirstNonDfsChannel(dev, wd->frequency > 3000);
- }
-
- if( wd->ws.autoSetFrequency == 0 )
- { /* Auto set frequency */
- zm_debug_msg1("Create Ad Hoc Network Band ", wd->ws.adhocMode);
- wd->frequency = zfFindCleanFrequency(dev, wd->ws.adhocMode);
- wd->ws.autoSetFrequency = 0xff;
- }
- zm_debug_msg1("IBSS not found, created one in channel ", wd->frequency);
-
- wd->sta.ibssBssIsCreator = 1;
-
- //wd->sta.flagFreqChanging = 1;
- zfCoreSetFrequency(dev, wd->frequency);
- if (wd->sta.bDesiredBssid == TRUE)
- {
- for (k=0; k<6; k++)
- {
- bssid[k] = wd->sta.desiredBssid[k];
- }
- }
- else
- {
- #if 1
- macAddr[0] = (wd->macAddr[0] & 0xff);
- macAddr[1] = (wd->macAddr[0] >> 8);
- macAddr[2] = (wd->macAddr[1] & 0xff);
- macAddr[3] = (wd->macAddr[1] >> 8);
- macAddr[4] = (wd->macAddr[2] & 0xff);
- macAddr[5] = (wd->macAddr[2] >> 8);
- zfGenerateRandomBSSID(dev, (u8_t *)wd->macAddr, (u8_t *)bssid);
- #else
- for (k=0; k<6; k++)
- {
- bssid[k] = (u8_t) zfGetRandomNumber(dev, 0);
- }
- bssid[0] &= ~ZM_BIT_0;
- bssid[0] |= ZM_BIT_1;
- #endif
- }
-
- zfUpdateBssid(dev, bssid);
- //wd->sta.atimWindow = 0x0a;
-
- /* rate information */
- if(wd->frequency <= ZM_CH_G_14) // 2.4 GHz b+g
- {
- if ( wd->wfc.bIbssGMode
- && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
- {
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG);
- }
- else
- {
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_B);
- }
- } else {
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_IBSS_AG);
- }
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED )
- {
- wd->sta.capability[0] &= ~ZM_BIT_4;
- }
- else
- {
- wd->sta.capability[0] |= ZM_BIT_4;
- }
-
- wd->preambleTypeInUsed = wd->preambleType;
- if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
- {
- wd->sta.capability[0] &= ~ZM_BIT_5;
- }
- else
- {
- wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
- wd->sta.capability[0] |= ZM_BIT_5;
- }
-
- zfIBSSSetupBssDesc(dev);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
-
- // 20070411 Add WPA2PSK information to its IBSS network !!!
- offset = 0 ;
-
- /* timestamp */
- offset += 8 ;
-
- /* beacon interval */
- wd->sta.beaconFrameBody[offset++] = (u8_t)(wd->beaconInterval) ;
- wd->sta.beaconFrameBody[offset++] = (u8_t)((wd->beaconInterval) >> 8) ;
-
- /* capability information */
- wd->sta.beaconFrameBody[offset++] = wd->sta.capability[0] ;
- wd->sta.beaconFrameBody[offset++] = wd->sta.capability[1] ;
- #if 0
- /* ssid */
- // ssid element id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SSID ;
- // ssid length
- wd->sta.beaconFrameBody[offset++] = wd->sta.ssidLen ;
- // ssid information
- for(i=0; i<wd->sta.ssidLen; i++)
- {
- wd->sta.beaconFrameBody[offset++] = wd->sta.ssid[i] ;
- }
-
- /* support rate */
- rateSet = ZM_RATE_SET_CCK ;
- if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
- {
- offset += 0 ;
- }
- else
- {
- // support rate element id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_SUPPORT_RATE ;
-
- // support rate length
- lenOffset = offset++;
-
- // support rate information
- for (i=0; i<4; i++)
- {
- if ((wd->bRate & (0x1<<i)) == (0x1<<i))
- {
- wd->sta.beaconFrameBody[offset++] =
- zg11bRateTbl[i]+((wd->bRateBasic & (0x1<<i))<<(7-i)) ;
- len++;
- }
- }
-
- // support rate length
- wd->sta.beaconFrameBody[lenOffset] = len ;
- }
-
- /* DS parameter set */
- // DS parameter set elemet id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_DS ;
-
- // DS parameter set length
- wd->sta.beaconFrameBody[offset++] = 1 ;
-
- // DS parameter set information
- wd->sta.beaconFrameBody[offset++] =
- zfChFreqToNum(wd->frequency, NULL) ;
-
- /* IBSS parameter set */
- // IBSS parameter set element id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_IBSS ;
-
- // IBSS parameter set length
- wd->sta.beaconFrameBody[offset++] = 2 ;
-
- // IBSS parameter set information
- wd->sta.beaconFrameBody[offset] = wd->sta.atimWindow ;
- offset += 2 ;
-
- /* ERP Information and Extended Supported Rates */
- if ( wd->wfc.bIbssGMode
- && (wd->supportMode & (ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)) )
- {
- /* ERP Information */
- wd->erpElement = 0;
- // ERP element id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_ERP ;
-
- // ERP length
- wd->sta.beaconFrameBody[offset++] = 1 ;
-
- // ERP information
- wd->sta.beaconFrameBody[offset++] = wd->erpElement ;
-
- /* Extended Supported Rates */
- if ( (rateSet == ZM_RATE_SET_OFDM)&&((wd->gRate & 0xff) == 0) )
- {
- offset += 0 ;
- }
- else
- {
- len = 0 ;
-
- // Extended Supported Rates element id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_EXTENDED_RATE ;
-
- // Extended Supported Rates length
- lenOffset = offset++ ;
-
- // Extended Supported Rates information
- for (i=0; i<8; i++)
- {
- if ((wd->gRate & (0x1<<i)) == (0x1<<i))
- {
- wd->sta.beaconFrameBody[offset++] =
- zg11gRateTbl[i]+((wd->gRateBasic & (0x1<<i))<<(7-i));
- len++;
- }
- }
-
- // extended support rate length
- wd->sta.beaconFrameBody[lenOffset] = len ;
- }
- }
- #endif
-
- /* RSN : important information influence the result of creating an IBSS network */
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA2PSK )
- {
- u8_t frameType = ZM_WLAN_FRAME_TYPE_AUTH ;
- u8_t rsn[64]=
- {
- /* Element ID */
- 0x30,
- /* Length */
- 0x14,
- /* Version */
- 0x01, 0x00,
- /* Group Cipher Suite, default=TKIP */
- 0x00, 0x0f, 0xac, 0x04,
- /* Pairwise Cipher Suite Count */
- 0x01, 0x00,
- /* Pairwise Cipher Suite, default=TKIP */
- 0x00, 0x0f, 0xac, 0x02,
- /* Authentication and Key Management Suite Count */
- 0x01, 0x00,
- /* Authentication type, default=PSK */
- 0x00, 0x0f, 0xac, 0x02,
- /* RSN capability */
- 0x00, 0x00
- };
-
- /* Overwrite Group Cipher Suite by AP's setting */
- zfMemoryCopy(rsn+4, zgWpa2AesOui, 4);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- /* Overwrite Pairwise Cipher Suite by AES */
- zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
- }
-
- // RSN element id
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_RSN_IE ;
-
- // RSN length
- wd->sta.beaconFrameBody[offset++] = rsn[1] ;
-
- // RSN information
- for(i=0; i<rsn[1]; i++)
- wd->sta.beaconFrameBody[offset++] = rsn[i+2] ;
-
- zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- /* If not use RSNA , run traditional */
- zmw_enter_critical_section(dev);
- wd->sta.ibssWpa2Psk = 1;
- zmw_leave_critical_section(dev);
-#endif
- }
-
- #if 0
- /* HT Capabilities Info */
- {
- u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ;
-
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ;
-
- wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.Length + 4 ;
-
- for (i = 0; i < 3; i++)
- {
- wd->sta.beaconFrameBody[offset++] = OUI[i] ;
- }
-
- wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Data.ElementID ;
-
- for (i = 0; i < 26; i++)
- {
- wd->sta.beaconFrameBody[offset++] = wd->sta.HTCap.Byte[i+2] ;
- }
- }
-
- /* Extended HT Capabilities Info */
- {
- u8_t OUI[3] = { 0x0 , 0x90 , 0x4C } ;
-
- wd->sta.beaconFrameBody[offset++] = ZM_WLAN_EID_WPA_IE ;
-
- wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.Length + 4 ;
-
- for (i = 0; i < 3; i++)
- {
- wd->sta.beaconFrameBody[offset++] = OUI[i] ;
- }
-
- wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Data.ElementID ;
-
- for (i = 0; i < 22; i++)
- {
- wd->sta.beaconFrameBody[offset++] = wd->sta.ExtHTCap.Byte[i+2] ;
- }
- }
- #endif
-
- wd->sta.beaconFrameBodySize = offset ;
-
- if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
- {
- wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
- }
-
- // 20070416 Let Create IBSS network could enter the zfwIbssPartnerNotify function
- // bssNotFound = FALSE ;
-
- printk("The capability info 1 = %02x\n", wd->sta.capability[0]) ;
- printk("The capability info 2 = %02x\n", wd->sta.capability[1]) ;
- for(k=0; k<wd->sta.beaconFrameBodySize; k++)
- {
- printk("%02x ", wd->sta.beaconFrameBody[k]) ;
- }
- #if 0
- zmw_enter_critical_section(dev);
- zfMemoryCopy(event.bssid, (u8_t *)bssid, 6);
- zfMemoryCopy(event.peerMacAddr, (u8_t *)wd->macAddr, 6);
- zmw_leave_critical_section(dev);
- #endif
-#endif
-
- //zmw_enter_critical_section(dev);
- //wd->sta.ibssPartnerStatus = ZM_IBSS_PARTNER_LOST;
- //zmw_leave_critical_section(dev);
- }
- else
- {
- wd->sta.ibssBssIsCreator = 0;
- }
-
-connect_done:
- zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow);
- zfStaSendBeacon(dev); // Refresh Beacon content for ZD1211B HalPlus
- zfHpSetAtimWindow(dev, wd->sta.atimWindow);
-
- // Start the IBSS timer to monitor for new stations
- zmw_enter_critical_section(dev);
- zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR);
- zmw_leave_critical_section(dev);
-
-
- if (wd->zfcbConnectNotify != NULL)
- {
- wd->zfcbConnectNotify(dev, ZM_STATUS_MEDIA_CONNECT, wd->sta.bssid);
- }
- zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTED);
- wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
-
-#ifdef ZM_ENABLE_IBSS_DELAYED_JOIN_INDICATION
- if ( !bssNotFound )
- {
- wd->sta.ibssDelayedInd = 1;
- zfMemoryCopy((u8_t *)&wd->sta.ibssDelayedIndEvent, (u8_t *)&event, sizeof(struct zsPartnerNotifyEvent));
- }
-#else
- if ( !bssNotFound )
- {
- if (wd->zfcbIbssPartnerNotify != NULL)
- {
- wd->zfcbIbssPartnerNotify(dev, 1, &event);
- }
- }
-#endif
-
- return;
-
-retry_ibss:
- zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0);
- return;
-}
-
-void zfStaProcessAtim(zdev_t* dev, zbuf_t* buf)
-{
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg0("Receiving Atim window notification");
-
- wd->sta.recvAtim = 1;
-}
-
-static struct zsBssInfo* zfInfraFindAPToConnect(zdev_t* dev,
- struct zsBssInfo* candidateBss)
-{
- struct zsBssInfo* pBssInfo;
- struct zsBssInfo* pNowBssInfo=NULL;
- u16_t i;
- u16_t ret, apWepStatus;
- u32_t k;
- u32_t channelFlags;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- pBssInfo = wd->sta.bssList.head;
-
- for(i=0; i<wd->sta.bssList.bssCount; i++)
- {
- if ( pBssInfo->capability[0] & ZM_BIT_4 )
- {
- apWepStatus = ZM_ENCRYPTION_WEP_ENABLED;
- }
- else
- {
- apWepStatus = ZM_ENCRYPTION_WEP_DISABLED;
- }
-
- if ( ((zfMemoryIsEqual(&(pBssInfo->ssid[2]), wd->sta.ssid,
- wd->sta.ssidLen))&&
- (wd->sta.ssidLen == pBssInfo->ssid[1]))||
- ((wd->sta.ssidLen == 0)&&
- /* connect to any BSS: AP's ans STA's WEP status must match */
- (wd->sta.wepStatus == apWepStatus )&&
- (pBssInfo->securityType != ZM_SECURITY_TYPE_WPA) ))
- {
- if ( wd->sta.ssidLen == 0 )
- {
- zm_debug_msg0("ANY BSS found");
- }
-
- if ( ((wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED && apWepStatus == ZM_ENCRYPTION_WEP_ENABLED) ||
- (wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED &&
- (apWepStatus == ZM_ENCRYPTION_WEP_DISABLED && wd->sta.dropUnencryptedPkts == 1))) &&
- (wd->sta.authMode >= ZM_AUTH_MODE_OPEN && wd->sta.authMode <= ZM_AUTH_MODE_AUTO) )
- {
- zm_debug_msg0("Privacy policy is inconsistent");
- pBssInfo = pBssInfo->next;
- continue;
- }
-
- /* for WPA negative test */
- if ( !zfCheckAuthentication(dev, pBssInfo) )
- {
- pBssInfo = pBssInfo->next;
- continue;
- }
-
- /* Check bssid */
- if (wd->sta.bDesiredBssid == TRUE)
- {
- for (k=0; k<6; k++)
- {
- if (wd->sta.desiredBssid[k] != pBssInfo->bssid[k])
- {
- zm_msg0_mm(ZM_LV_1, "desired bssid not matched 1");
- break;
- }
- }
-
- if (k != 6)
- {
- zm_msg0_mm(ZM_LV_1, "desired bssid not matched 2");
- pBssInfo = pBssInfo->next;
- continue;
- }
- }
-
- /* Check support mode */
- if (pBssInfo->frequency > 3000) {
- if ( (pBssInfo->EnableHT == 1)
- || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
- {
- channelFlags = CHANNEL_A_HT;
- if (pBssInfo->enableHT40 == 1) {
- channelFlags |= CHANNEL_HT40;
- }
- } else {
- channelFlags = CHANNEL_A;
- }
- } else {
- if ( (pBssInfo->EnableHT == 1)
- || (pBssInfo->apCap & ZM_All11N_AP) ) //11n AP
- {
- channelFlags = CHANNEL_G_HT;
- if(pBssInfo->enableHT40 == 1) {
- channelFlags |= CHANNEL_HT40;
- }
- } else {
- if (pBssInfo->extSupportedRates[1] == 0) {
- channelFlags = CHANNEL_B;
- } else {
- channelFlags = CHANNEL_G;
- }
- }
- }
-
- if ( ((channelFlags == CHANNEL_B) && (wd->connectMode & ZM_BIT_0))
- || ((channelFlags == CHANNEL_G) && (wd->connectMode & ZM_BIT_1))
- || ((channelFlags == CHANNEL_A) && (wd->connectMode & ZM_BIT_2))
- || ((channelFlags & CHANNEL_HT20) && (wd->connectMode & ZM_BIT_3)) )
- {
- pBssInfo = pBssInfo->next;
- continue;
- }
-
- /* Skip if AP in blocking list */
- ret = zfStaIsApInBlockingList(dev, pBssInfo->bssid);
- if (ret == TRUE)
- {
- zm_msg0_mm(ZM_LV_0, "Candidate AP in blocking List, skip if there's stilla choice!");
- pNowBssInfo = pBssInfo;
- pBssInfo = pBssInfo->next;
- continue;
- }
-
- if ( pBssInfo->capability[0] & ZM_BIT_0 ) // check if infra-BSS
- {
- pNowBssInfo = pBssInfo;
- wd->sta.apWmeCapability = pBssInfo->wmeSupport;
-
-
- goto done;
- }
- }
-
- pBssInfo = pBssInfo->next;
- }
-
-done:
- if (pNowBssInfo != NULL)
- {
- zfwMemoryCopy((void*)candidateBss, (void*)pNowBssInfo, sizeof(struct zsBssInfo));
- pNowBssInfo = candidateBss;
- }
-
- zmw_leave_critical_section(dev);
-
- return pNowBssInfo;
-}
-
-
-void zfInfraConnectNetwork(zdev_t* dev)
-{
- struct zsBssInfo* pBssInfo;
- struct zsBssInfo* pNowBssInfo=NULL;
- struct zsBssInfo candidateBss;
- //u16_t i, j=100, quality=10000;
- //u8_t ret=FALSE, apWepStatus;
- u8_t ret=FALSE;
- u16_t k;
- u8_t density = ZM_MPDU_DENSITY_NONE;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* Reset bssNotFoundCount for Ad-Hoc:IBSS */
- /* Need review : IbssConn -> InfraConn -> IbssConn etc, flag/counter reset? */
- zmw_enter_critical_section(dev);
- wd->sta.bssNotFoundCount = 0;
- zmw_leave_critical_section(dev);
-
- /* Set TxQs CWMIN, CWMAX, AIFS and TXO to WME STA default. */
- zfUpdateDefaultQosParameter(dev, 0);
-
- zfStaRefreshBlockList(dev, 0);
-
- /* change state to CONNECTING and stop the channel scanning */
- zfChangeAdapterState(dev, ZM_STA_STATE_CONNECTING);
- zfPowerSavingMgrWakeup(dev);
-
- wd->sta.wmeConnected = 0;
- wd->sta.psMgr.tempWakeUp = 0;
- wd->sta.qosInfo = 0;
- zfQueueFlush(dev, wd->sta.uapsdQ);
-
- wd->sta.connectState = ZM_STA_CONN_STATE_NONE;
-
- //Reorder BssList by RSSI--CWYang(+)
- zfBssInfoReorderList(dev);
-
- pNowBssInfo = zfInfraFindAPToConnect(dev, &candidateBss);
-
- if (wd->sta.SWEncryptEnable != 0)
- {
- if (wd->sta.bSafeMode == 0)
- {
- zfStaDisableSWEncryption(dev);//Quickly reboot
- }
- }
- if ( pNowBssInfo != NULL )
- {
- //zm_assert(pNowBssInfo != NULL);
-
- pBssInfo = pNowBssInfo;
- wd->sta.ssidLen = pBssInfo->ssid[1];
- zfMemoryCopy(wd->sta.ssid, &(pBssInfo->ssid[2]), pBssInfo->ssid[1]);
- wd->frequency = pBssInfo->frequency;
- //wd->sta.flagFreqChanging = 1;
-
- //zfCoreSetFrequency(dev, wd->frequency);
- zfUpdateBssid(dev, pBssInfo->bssid);
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_ZERO);
- zfUpdateSupportRate(dev, pBssInfo->supportedRates);
- zfUpdateSupportRate(dev, pBssInfo->extSupportedRates);
-
- wd->beaconInterval = pBssInfo->beaconInterval[0] +
- (((u16_t) pBssInfo->beaconInterval[1]) << 8);
- if (wd->beaconInterval == 0)
- {
- wd->beaconInterval = 100;
- }
-
- /* ESS bit on */
- wd->sta.capability[0] |= ZM_BIT_0;
- /* IBSS bit off */
- wd->sta.capability[0] &= ~ZM_BIT_1;
-
- /* 11n AP flag */
- wd->sta.EnableHT = pBssInfo->EnableHT;
- wd->sta.SG40 = pBssInfo->SG40;
-#ifdef ZM_ENABLE_CENC
- if ( pBssInfo->securityType == ZM_SECURITY_TYPE_CENC )
- {
- wd->sta.wmeEnabled = 0; //Disable WMM in CENC
- cencInit(dev);
- cencSetCENCMode(dev, NdisCENC_PSK);
- wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
- /* CENC */
- if ( pBssInfo->cencIe[1] != 0 )
- {
- //wd->sta.wepStatus = ZM_ENCRYPTION_CENC;
- //wd->sta.encryMode = ZM_CENC;
- zfwCencHandleBeaconProbrespon(dev, (u8_t *)&pBssInfo->cencIe,
- (u8_t *)&pBssInfo->ssid, (u8_t *)&pBssInfo->macaddr);
- zfMemoryCopy(wd->sta.cencIe, pBssInfo->cencIe,
- pBssInfo->cencIe[1]+2);
- }
- else
- {
- wd->sta.cencIe[1] = 0;
- }
- }
-#endif //ZM_ENABLE_CENC
- if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA )
- {
- wd->sta.wpaState = ZM_STA_WPA_STATE_INIT;
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP )
- {
- wd->sta.encryMode = ZM_TKIP;
-
- /* Turn on software encryption/decryption for TKIP */
- if (wd->sta.EnableHT == 1)
- {
- zfStaEnableSWEncryption(dev, (ZM_SW_TKIP_ENCRY_EN|ZM_SW_TKIP_DECRY_EN));
- }
-
- /* Do not support TKIP in 11n mode */
- //wd->sta.EnableHT = 0;
- //pBssInfo->enableHT40 = 0;
- }
- else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- wd->sta.encryMode = ZM_AES;
-
- /* If AP supports HT mode */
- if (wd->sta.EnableHT)
- {
- /* Set MPDU density to 8 us*/
- density = ZM_MPDU_DENSITY_8US;
- }
- }
-
- if ( pBssInfo->wpaIe[1] != 0 )
- {
- zfMemoryCopy(wd->sta.wpaIe, pBssInfo->wpaIe,
- pBssInfo->wpaIe[1]+2);
- }
- else
- {
- wd->sta.wpaIe[1] = 0;
- }
-
- if ( pBssInfo->rsnIe[1] != 0 )
- {
- zfMemoryCopy(wd->sta.rsnIe, pBssInfo->rsnIe,
- pBssInfo->rsnIe[1]+2);
- }
- else
- {
- wd->sta.rsnIe[1] = 0;
- }
- }
-
-
-
- /* check preamble bit */
- wd->preambleTypeInUsed = wd->preambleType;
- if ( wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_AUTO )
- {
- if (pBssInfo->capability[0] & ZM_BIT_5)
- {
- wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_SHORT;
- }
- else
- {
- wd->preambleTypeInUsed = ZM_PREAMBLE_TYPE_LONG;
- }
- }
-
- if (wd->preambleTypeInUsed == ZM_PREAMBLE_TYPE_LONG)
- {
- wd->sta.capability[0] &= ~ZM_BIT_5;
- }
- else
- {
- wd->sta.capability[0] |= ZM_BIT_5;
- }
-
- /* check 802.11n 40MHz Setting */
- if ((pBssInfo->enableHT40 == 1) &&
- ((pBssInfo->extChOffset == 1) || (pBssInfo->extChOffset == 3)))
- {
- wd->BandWidth40 = pBssInfo->enableHT40;
- wd->ExtOffset = pBssInfo->extChOffset;
- }
- else
- {
- wd->BandWidth40 = 0;
- wd->ExtOffset = 0;
- }
-
- /* check 802.11H support bit */
-
- /* check Owl Ap */
- if ( pBssInfo->athOwlAp & ZM_BIT_0 )
- {
- /* In this function, FW retry will be enable, ZM_MAC_REG_RETRY_MAX
- will be set to 0.
- */
- zfHpDisableHwRetry(dev);
- wd->sta.athOwlAp = 1;
- /* Set MPDU density to 8 us*/
- density = ZM_MPDU_DENSITY_8US;
- }
- else
- {
- /* In this function, FW retry will be disable, ZM_MAC_REG_RETRY_MAX
- will be set to 3.
- */
- zfHpEnableHwRetry(dev);
- wd->sta.athOwlAp = 0;
- }
- wd->reorder = 1;
-
- /* Set MPDU density */
- zfHpSetMPDUDensity(dev, density);
-
- /* check short slot time bit */
- if ( pBssInfo->capability[1] & ZM_BIT_2 )
- {
- wd->sta.capability[1] |= ZM_BIT_2;
- }
-
- if ( pBssInfo->erp & ZM_BIT_1 )
- {
- //zm_debug_msg0("protection mode on");
- wd->sta.bProtectionMode = TRUE;
- zfHpSetSlotTime(dev, 0);
- }
- else
- {
- //zm_debug_msg0("protection mode off");
- wd->sta.bProtectionMode = FALSE;
- zfHpSetSlotTime(dev, 1);
- }
-
- if (pBssInfo->marvelAp == 1)
- {
- wd->sta.enableDrvBA = 0;
- /*
- * 8701 : NetGear 3500 (MARVELL)
- * Downlink issue : set slottime to 20.
- */
- zfHpSetSlotTimeRegister(dev, 0);
- }
- else
- {
- wd->sta.enableDrvBA = 1;
-
- /*
- * This is not good for here do reset slot time.
- * I think it should reset when leave MARVELL ap
- * or enter disconnect state etc.
- */
- zfHpSetSlotTimeRegister(dev, 1);
- }
-
- //Store probe response frame body, for VISTA only
- wd->sta.beaconFrameBodySize = pBssInfo->frameBodysize + 12;
- if (wd->sta.beaconFrameBodySize > ZM_CACHED_FRAMEBODY_SIZE)
- {
- wd->sta.beaconFrameBodySize = ZM_CACHED_FRAMEBODY_SIZE;
- }
- for (k=0; k<8; k++)
- {
- wd->sta.beaconFrameBody[k] = pBssInfo->timeStamp[k];
- }
- wd->sta.beaconFrameBody[8] = pBssInfo->beaconInterval[0];
- wd->sta.beaconFrameBody[9] = pBssInfo->beaconInterval[1];
- wd->sta.beaconFrameBody[10] = pBssInfo->capability[0];
- wd->sta.beaconFrameBody[11] = pBssInfo->capability[1];
- for (k=0; k<(wd->sta.beaconFrameBodySize - 12); k++)
- {
- wd->sta.beaconFrameBody[k+12] = pBssInfo->frameBody[k];
- }
-
- if ( ( pBssInfo->capability[0] & ZM_BIT_4 )&&
- (( wd->sta.authMode == ZM_AUTH_MODE_OPEN )||
- ( wd->sta.authMode == ZM_AUTH_MODE_SHARED_KEY)||
- (wd->sta.authMode == ZM_AUTH_MODE_AUTO)) )
- { /* privacy enabled */
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_DISABLED )
- {
- zm_debug_msg0("Adapter is no WEP, try to connect to WEP AP");
- ret = FALSE;
- }
-
- /* Do not support WEP in 11n mode */
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_WEP_ENABLED )
- {
- /* Turn on software encryption/decryption for WEP */
- if (wd->sta.EnableHT == 1)
- {
- zfStaEnableSWEncryption(dev, (ZM_SW_WEP_ENCRY_EN|ZM_SW_WEP_DECRY_EN));
- }
-
- //wd->sta.EnableHT = 0;
- //wd->BandWidth40 = 0;
- //wd->ExtOffset = 0;
- }
-
- wd->sta.capability[0] |= ZM_BIT_4;
-
- if ( wd->sta.authMode == ZM_AUTH_MODE_AUTO )
- { /* Try to use open and shared-key authehtication alternatively */
- if ( (wd->sta.connectTimeoutCount % 2) == 0 )
- wd->sta.bIsSharedKey = 0;
- else
- wd->sta.bIsSharedKey = 1;
- }
- else if ( wd->sta.authMode != ZM_AUTH_MODE_SHARED_KEY )
- { /* open or auto */
- //zfStaStartConnect(dev, 0);
- wd->sta.bIsSharedKey = 0;
- }
- else if ( wd->sta.authMode != ZM_AUTH_MODE_OPEN )
- { /* shared key */
- //zfStaStartConnect(dev, 1) ;
- wd->sta.bIsSharedKey = 1;
- }
- }
- else
- {
- if ( (pBssInfo->securityType == ZM_SECURITY_TYPE_WPA)||
- (pBssInfo->capability[0] & ZM_BIT_4) )
- {
- wd->sta.capability[0] |= ZM_BIT_4;
- /* initialize WPA related parameters */
- }
- else
- {
- wd->sta.capability[0] &= (~ZM_BIT_4);
- }
-
- /* authentication with open system */
- //zfStaStartConnect(dev, 0);
- wd->sta.bIsSharedKey = 0;
- }
-
- /* Improve WEP/TKIP performance with HT AP, detail information please look bug#32495 */
- /*
- if ( (pBssInfo->broadcomHTAp == 1)
- && (wd->sta.SWEncryptEnable != 0) )
- {
- zfHpSetTTSIFSTime(dev, 0xa);
- }
- else
- {
- zfHpSetTTSIFSTime(dev, 0x8);
- }
- */
- }
- else
- {
- zm_debug_msg0("Desired SSID not found");
- goto zlConnectFailed;
- }
-
-
- zfCoreSetFrequencyV2(dev, wd->frequency, zfStaStartConnectCb);
- return;
-
-zlConnectFailed:
- zfStaConnectFail(dev, ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND, wd->sta.bssid, 0);
- return;
-}
-
-u8_t zfCheckWPAAuth(zdev_t* dev, struct zsBssInfo* pBssInfo)
-{
- u8_t ret=TRUE;
- u8_t pmkCount;
- u8_t i;
- u16_t encAlgoType = 0;
-
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_TKIP )
- {
- encAlgoType = ZM_TKIP;
- }
- else if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- encAlgoType = ZM_AES;
- }
-
- switch(wd->sta.authMode)
- {
- case ZM_AUTH_MODE_WPA:
- case ZM_AUTH_MODE_WPAPSK:
- if ( pBssInfo->wpaIe[1] == 0 )
- {
- ret = FALSE;
- break;
- }
-
- pmkCount = pBssInfo->wpaIe[12];
- for(i=0; i < pmkCount; i++)
- {
- if ( pBssInfo->wpaIe[17 + 4*i] == encAlgoType )
- {
- ret = TRUE;
- goto done;
- }
- }
-
- ret = FALSE;
- break;
-
- case ZM_AUTH_MODE_WPA2:
- case ZM_AUTH_MODE_WPA2PSK:
- if ( pBssInfo->rsnIe[1] == 0 )
- {
- ret = FALSE;
- break;
- }
-
- pmkCount = pBssInfo->rsnIe[8];
- for(i=0; i < pmkCount; i++)
- {
- if ( pBssInfo->rsnIe[13 + 4*i] == encAlgoType )
- {
- ret = TRUE;
- goto done;
- }
- }
-
- ret = FALSE;
- break;
- }
-
-done:
- return ret;
-}
-
-u8_t zfCheckAuthentication(zdev_t* dev, struct zsBssInfo* pBssInfo)
-{
- u8_t ret=TRUE;
- u16_t encAlgoType;
- u16_t UnicastCipherNum;
-
- zmw_get_wlan_dev(dev);
-
- /* Connecting to ANY has been checked */
- if ( wd->sta.ssidLen == 0 )
- {
- return ret;
- }
-
-
- switch(wd->sta.authMode)
- //switch(wd->ws.authMode)//Quickly reboot
- {
- case ZM_AUTH_MODE_WPA_AUTO:
- case ZM_AUTH_MODE_WPAPSK_AUTO:
- encAlgoType = 0;
- if(pBssInfo->rsnIe[1] != 0)
- {
- UnicastCipherNum = (pBssInfo->rsnIe[8]) +
- (pBssInfo->rsnIe[9] << 8);
-
- /* If there is only one unicast cipher */
- if (UnicastCipherNum == 1)
- {
- encAlgoType = pBssInfo->rsnIe[13];
- //encAlgoType = pBssInfo->rsnIe[7];
- }
- else
- {
- u16_t ii;
- u16_t desiredCipher = 0;
- u16_t IEOffSet = 13;
-
- /* Enumerate all the supported unicast cipher */
- for (ii = 0; ii < UnicastCipherNum; ii++)
- {
- if (pBssInfo->rsnIe[IEOffSet+ii*4] > desiredCipher)
- {
- desiredCipher = pBssInfo->rsnIe[IEOffSet+ii*4];
- }
- }
-
- encAlgoType = desiredCipher;
- }
-
- if ( encAlgoType == 0x02 )
- {
- wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
-
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2;
- }
- else //ZM_AUTH_MODE_WPAPSK_AUTO
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK;
- }
- }
- else if ( encAlgoType == 0x04 )
- {
- wd->sta.wepStatus = ZM_ENCRYPTION_AES;
-
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2;
- }
- else //ZM_AUTH_MODE_WPAPSK_AUTO
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA2PSK;
- }
- }
- else
- {
- ret = FALSE;
- }
- }
- else if(pBssInfo->wpaIe[1] != 0)
- {
- UnicastCipherNum = (pBssInfo->wpaIe[12]) +
- (pBssInfo->wpaIe[13] << 8);
-
- /* If there is only one unicast cipher */
- if (UnicastCipherNum == 1)
- {
- encAlgoType = pBssInfo->wpaIe[17];
- //encAlgoType = pBssInfo->wpaIe[11];
- }
- else
- {
- u16_t ii;
- u16_t desiredCipher = 0;
- u16_t IEOffSet = 17;
-
- /* Enumerate all the supported unicast cipher */
- for (ii = 0; ii < UnicastCipherNum; ii++)
- {
- if (pBssInfo->wpaIe[IEOffSet+ii*4] > desiredCipher)
- {
- desiredCipher = pBssInfo->wpaIe[IEOffSet+ii*4];
- }
- }
-
- encAlgoType = desiredCipher;
- }
-
- if ( encAlgoType == 0x02 )
- {
- wd->sta.wepStatus = ZM_ENCRYPTION_TKIP;
-
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA;
- }
- else //ZM_AUTH_MODE_WPAPSK_AUTO
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK;
- }
- }
- else if ( encAlgoType == 0x04 )
- {
- wd->sta.wepStatus = ZM_ENCRYPTION_AES;
-
- if ( wd->sta.authMode == ZM_AUTH_MODE_WPA_AUTO )
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPA;
- }
- else //ZM_AUTH_MODE_WPAPSK_AUTO
- {
- wd->sta.currentAuthMode = ZM_AUTH_MODE_WPAPSK;
- }
- }
- else
- {
- ret = FALSE;
- }
-
-
- }
- else
- {
- ret = FALSE;
- }
-
- break;
-
- case ZM_AUTH_MODE_WPA:
- case ZM_AUTH_MODE_WPAPSK:
- case ZM_AUTH_MODE_WPA_NONE:
- case ZM_AUTH_MODE_WPA2:
- case ZM_AUTH_MODE_WPA2PSK:
- {
- if ( pBssInfo->securityType != ZM_SECURITY_TYPE_WPA )
- {
- ret = FALSE;
- }
-
- ret = zfCheckWPAAuth(dev, pBssInfo);
- }
- break;
-
- case ZM_AUTH_MODE_OPEN:
- case ZM_AUTH_MODE_SHARED_KEY:
- case ZM_AUTH_MODE_AUTO:
- {
- if ( pBssInfo->wscIe[1] )
- {
- // If the AP is a Jumpstart AP, it's ok!! Ray
- break;
- }
- else if ( pBssInfo->securityType == ZM_SECURITY_TYPE_WPA )
- {
- ret = FALSE;
- }
- }
- break;
-
- default:
- break;
- }
-
- return ret;
-}
-
-u8_t zfStaIsConnected(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTED )
- {
- return TRUE;
- }
-
- return FALSE;
-}
-
-u8_t zfStaIsConnecting(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.adapterState == ZM_STA_STATE_CONNECTING )
- {
- return TRUE;
- }
-
- return FALSE;
-}
-
-u8_t zfStaIsDisconnect(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT )
- {
- return TRUE;
- }
-
- return FALSE;
-}
-
-u8_t zfChangeAdapterState(zdev_t* dev, u8_t newState)
-{
- u8_t ret = TRUE;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- //if ( newState == wd->sta.adapterState )
- //{
- // return FALSE;
- //}
-
- switch(newState)
- {
- case ZM_STA_STATE_DISCONNECT:
- zfResetSupportRate(dev, ZM_DEFAULT_SUPPORT_RATE_DISCONNECT);
-
- #if 1
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- #else
- if ( wd->sta.bChannelScan )
- {
- /* stop the action of channel scanning */
- wd->sta.bChannelScan = FALSE;
- ret = TRUE;
- break;
- }
- #endif
-
- break;
- case ZM_STA_STATE_CONNECTING:
- #if 1
- zfScanMgrScanStop(dev, ZM_SCAN_MGR_SCAN_INTERNAL);
- #else
- if ( wd->sta.bChannelScan )
- {
- /* stop the action of channel scanning */
- wd->sta.bChannelScan = FALSE;
- ret = TRUE;
- break;
- }
- #endif
-
- break;
- case ZM_STA_STATE_CONNECTED:
- break;
- default:
- break;
- }
-
- //if ( ret )
- //{
- zmw_enter_critical_section(dev);
- wd->sta.adapterState = newState;
- zmw_leave_critical_section(dev);
-
- zm_debug_msg1("change adapter state = ", newState);
- //}
-
- return ret;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaMmAddIeSsid */
-/* Add information element SSID to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Ji-Huang Lee ZyDAS Technology Corporation 2005.11 */
-/* */
-/************************************************************************/
-u16_t zfStaAddIeSsid(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SSID);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssidLen);
-
- /* Information : SSID */
- for (i=0; i<wd->sta.ssidLen; i++)
- {
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ssid[i]);
- }
-
- return offset;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaMmAddIeWpa */
-/* Add information element SSID to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Ji-Huang Lee ZyDAS Technology Corporation 2006.01 */
-/* */
-/************************************************************************/
-u16_t zfStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
-{
- u32_t i;
- u8_t ssn[64]={
- /* Element ID */
- 0xdd,
- /* Length */
- 0x18,
- /* OUI type */
- 0x00, 0x50, 0xf2, 0x01,
- /* Version */
- 0x01, 0x00,
- /* Group Cipher Suite, default=TKIP */
- 0x00, 0x50, 0xf2, 0x02,
- /* Pairwise Cipher Suite Count */
- 0x01, 0x00,
- /* Pairwise Cipher Suite, default=TKIP */
- 0x00, 0x50, 0xf2, 0x02,
- /* Authentication and Key Management Suite Count */
- 0x01, 0x00,
- /* Authentication type, default=PSK */
- 0x00, 0x50, 0xf2, 0x02,
- /* WPA capability */
- 0x00, 0x00
- };
-
- u8_t rsn[64]={
- /* Element ID */
- 0x30,
- /* Length */
- 0x14,
- /* Version */
- 0x01, 0x00,
- /* Group Cipher Suite, default=TKIP */
- 0x00, 0x0f, 0xac, 0x02,
- /* Pairwise Cipher Suite Count */
- 0x01, 0x00,
- /* Pairwise Cipher Suite, default=TKIP */
- 0x00, 0x0f, 0xac, 0x02,
- /* Authentication and Key Management Suite Count */
- 0x01, 0x00,
- /* Authentication type, default=PSK */
- 0x00, 0x0f, 0xac, 0x02,
- /* RSN capability */
- 0x00, 0x00
- };
-
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPAPSK )
- {
- /* Overwrite Group Cipher Suite by AP's setting */
- zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- /* Overwrite Pairwise Cipher Suite by AES */
- zfMemoryCopy(ssn+14, zgWpaAesOui, 4);
- }
-
- zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2);
- zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2);
- offset += (ssn[1]+2);
- }
- else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA )
- {
- /* Overwrite Group Cipher Suite by AP's setting */
- zfMemoryCopy(ssn+8, wd->sta.wpaIe+8, 4);
- /* Overwrite Key Management Suite by WPA-Radius */
- zfMemoryCopy(ssn+20, zgWpaRadiusOui, 4);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- /* Overwrite Pairwise Cipher Suite by AES */
- zfMemoryCopy(ssn+14, zgWpaAesOui, 4);
- }
-
- zfCopyToIntTxBuffer(dev, buf, ssn, offset, ssn[1]+2);
- zfMemoryCopy(wd->sta.wpaIe, ssn, ssn[1]+2);
- offset += (ssn[1]+2);
- }
- else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2PSK )
- {
- /* Overwrite Group Cipher Suite by AP's setting */
- zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- /* Overwrite Pairwise Cipher Suite by AES */
- zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
- }
-
- if ( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ )
- {
- for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
- {
- if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
- (u8_t*) wd->sta.bssid, 6) )
- {
- /* matched */
- break;
- }
-
- if ( i < wd->sta.pmkidInfo.bssidCount )
- {
- // Fill PMKID Count in RSN information element
- rsn[22] = 0x01;
- rsn[23] = 0x00;
-
- // Fill PMKID in RSN information element
- zfMemoryCopy(rsn+24,
- wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16);
- rsn[1] += 18;
- }
- }
- }
-
- zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2);
- zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
- offset += (rsn[1]+2);
- }
- else if ( wd->sta.currentAuthMode == ZM_AUTH_MODE_WPA2 )
- {
- /* Overwrite Group Cipher Suite by AP's setting */
- zfMemoryCopy(rsn+4, wd->sta.rsnIe+4, 4);
- /* Overwrite Key Management Suite by WPA2-Radius */
- zfMemoryCopy(rsn+16, zgWpa2RadiusOui, 4);
-
- if ( wd->sta.wepStatus == ZM_ENCRYPTION_AES )
- {
- /* Overwrite Pairwise Cipher Suite by AES */
- zfMemoryCopy(rsn+10, zgWpa2AesOui, 4);
- }
-
- if (( frameType == ZM_WLAN_FRAME_TYPE_REASOCREQ || ( frameType == ZM_WLAN_FRAME_TYPE_ASOCREQ )))
- {
-
- if (wd->sta.pmkidInfo.bssidCount != 0) {
- // Fill PMKID Count in RSN information element
- rsn[22] = 1;
- rsn[23] = 0;
- /*
- * The caller is respnsible to give us the relevant PMKID.
- * We'll only accept 1 PMKID for now.
- */
- for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
- {
- if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid, (u8_t*) wd->sta.bssid, 6) )
- {
- zfMemoryCopy(rsn+24, wd->sta.pmkidInfo.bssidInfo[i].pmkid, 16);
- break;
- }
- }
- rsn[1] += 18;
- }
-
- }
-
- zfCopyToIntTxBuffer(dev, buf, rsn, offset, rsn[1]+2);
- zfMemoryCopy(wd->sta.rsnIe, rsn, rsn[1]+2);
- offset += (rsn[1]+2);
- }
-
- return offset;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaAddIeIbss */
-/* Add information element IBSS parameter to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Ji-Huang Lee ZyDAS Technology Corporation 2005.12 */
-/* */
-/************************************************************************/
-u16_t zfStaAddIeIbss(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- zmw_get_wlan_dev(dev);
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_IBSS);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, 2);
-
- /* ATIM window */
- zmw_tx_buf_writeh(dev, buf, offset, wd->sta.atimWindow);
- offset += 2;
-
- return offset;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaAddIeWmeInfo */
-/* Add WME Information Element to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-u16_t zfStaAddIeWmeInfo(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t qosInfo)
-{
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_WIFI_IE);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, 7);
-
- /* OUI */
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x50);
- zmw_tx_buf_writeb(dev, buf, offset++, 0xF2);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x02);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x00);
- zmw_tx_buf_writeb(dev, buf, offset++, 0x01);
-
- /* QoS Info */
- zmw_tx_buf_writeb(dev, buf, offset++, qosInfo);
-
- return offset;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaAddIePowerCap */
-/* Add information element Power capability to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Sharon 2007.12 */
-/* */
-/************************************************************************/
-u16_t zfStaAddIePowerCap(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u8_t MaxTxPower;
- u8_t MinTxPower;
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_POWER_CAPABILITY);
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, 2);
-
- MinTxPower = (u8_t)(zfHpGetMinTxPower(dev)/2);
- MaxTxPower = (u8_t)(zfHpGetMaxTxPower(dev)/2);
-
- /* Min Transmit Power Cap */
- zmw_tx_buf_writeh(dev, buf, offset++, MinTxPower);
-
- /* Max Transmit Power Cap */
- zmw_tx_buf_writeh(dev, buf, offset++, MaxTxPower);
-
- return offset;
-}
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfStaAddIeSupportCh */
-/* Add information element supported channels to buffer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer to add information element */
-/* offset : add information element from this offset */
-/* */
-/* OUTPUTS */
-/* buffer offset after adding information element */
-/* */
-/* AUTHOR */
-/* Sharon 2007.12 */
-/* */
-/************************************************************************/
-u16_t zfStaAddIeSupportCh(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
-
- u8_t i;
- u16_t count_24G = 0;
- u16_t count_5G = 0;
- u16_t channelNum;
- u8_t length;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
- zmw_enter_critical_section(dev);
-
- for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
- {
- if (wd->regulationTable.allowChannel[i].channel < 3000)
- { // 2.4Hz
- count_24G++;
- }
- else
- { // 5GHz
- count_5G++;
- }
- }
-
- length = (u8_t)(count_5G * 2 + 2); //5G fill by pair, 2,4G (continuous channels) fill 2 bytes
-
- /* Element ID */
- zmw_tx_buf_writeb(dev, buf, offset++, ZM_WLAN_EID_SUPPORTED_CHANNELS );
-
- /* Element Length */
- zmw_tx_buf_writeb(dev, buf, offset++, length);
-
- // 2.4GHz (continuous channels)
- /* First channel number */
- zmw_tx_buf_writeh(dev, buf, offset++, 1); //Start from channle 1
- /* Number of channels */
- zmw_tx_buf_writeh(dev, buf, offset++, count_24G);
-
- for (i = 0; i < wd->regulationTable.allowChannelCnt ; i++)
- {
- if (wd->regulationTable.allowChannel[i].channel > 4000 && wd->regulationTable.allowChannel[i].channel < 5000)
- { // 5GHz 4000 -5000Mhz
- channelNum = (wd->regulationTable.allowChannel[i].channel-4000)/5;
- /* First channel number */
- zmw_tx_buf_writeh(dev, buf, offset++, channelNum);
- /* Number of channels */
- zmw_tx_buf_writeh(dev, buf, offset++, 1);
- }
- else if (wd->regulationTable.allowChannel[i].channel >= 5000)
- { // 5GHz >5000Mhz
- channelNum = (wd->regulationTable.allowChannel[i].channel-5000)/5;
- /* First channel number */
- zmw_tx_buf_writeh(dev, buf, offset++, channelNum);
- /* Number of channels */
- zmw_tx_buf_writeh(dev, buf, offset++, 1);
- }
- }
- zmw_leave_critical_section(dev);
-
- return offset;
-}
-
-void zfStaStartConnectCb(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zfStaStartConnect(dev, wd->sta.bIsSharedKey);
-}
-
-void zfStaStartConnect(zdev_t* dev, u8_t bIsSharedKey)
-{
- u32_t p1, p2;
- u8_t newConnState;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* p1_low = algorithm number, p1_high = transaction sequence number */
- if ( bIsSharedKey )
- {
- //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_SHARE_1;
- newConnState = ZM_STA_CONN_STATE_AUTH_SHARE_1;
- zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_SHARE_1");
- p1 = ZM_AUTH_ALGO_SHARED_KEY;
- }
- else
- {
- //wd->sta.connectState = ZM_STA_CONN_STATE_AUTH_OPEN;
- newConnState = ZM_STA_CONN_STATE_AUTH_OPEN;
- zm_debug_msg0("ZM_STA_CONN_STATE_AUTH_OPEN");
- if( wd->sta.leapEnabled )
- p1 = ZM_AUTH_ALGO_LEAP;
- else
- p1 = ZM_AUTH_ALGO_OPEN_SYSTEM;
- }
-
- /* status code */
- p2 = 0x0;
-
- zmw_enter_critical_section(dev);
- wd->sta.connectTimer = wd->tick;
- wd->sta.connectState = newConnState;
- zmw_leave_critical_section(dev);
-
- /* send the 1st authentication frame */
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_AUTH, wd->sta.bssid, p1, p2, 0);
-
- return;
-}
-
-void zfSendNullData(zdev_t* dev, u8_t type)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- u16_t err;
- u16_t hlen;
- u16_t header[(34+8+1)/2];
- u16_t bcastAddr[3] = {0xffff,0xffff,0xffff};
- u16_t *dstAddr;
-
- zmw_get_wlan_dev(dev);
-
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return;
- }
-
- zfwBufSetSize(dev, buf, 0);
-
- //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
-
- if ( wd->wlanMode == ZM_MODE_IBSS)
- {
- dstAddr = bcastAddr;
- }
- else
- {
- dstAddr = wd->sta.bssid;
- }
-
- if (wd->sta.wmeConnected != 0)
- {
- /* If connect to a WMM AP, Send QoS Null data */
- hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, dstAddr, header, 0, buf, 0, 0);
- }
- else
- {
- hlen = zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_NULL, dstAddr, header, 0, buf, 0, 0);
- }
-
- if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- header[4] |= 0x0100; //TODS bit
- }
-
- if ( type == 1 )
- {
- header[4] |= 0x1000;
- }
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
- //{
- // goto zlError;
- //}
-
- /*increase unicast frame counter*/
- wd->commTally.txUnicastFrm++;
-
- err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
-
-
- return;
-
-zlError:
-
- zfwBufFree(dev, buf, 0);
- return;
-
-}
-
-void zfSendPSPoll(zdev_t* dev)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- u16_t err;
- u16_t hlen;
- u16_t header[(8+24+1)/2];
-
- zmw_get_wlan_dev(dev);
-
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return;
- }
-
- zfwBufSetSize(dev, buf, 0);
-
- //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
-
- zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_PSPOLL, wd->sta.bssid, header, 0, buf, 0, 0);
-
- header[0] = 20;
- header[4] |= 0x1000;
- header[5] = wd->sta.aid | 0xc000; //Both bit-14 and bit-15 are 1
- hlen = 16 + 8;
-
- /* Get buffer DMA address */
- //if ((addrTblSize = zfwBufMapDma(dev, buf, &addrTbl)) == 0)
- //if ((addrTblSize = zfwMapTxDma(dev, buf, &addrTbl)) == 0)
- //{
- // goto zlError;
- //}
-
- err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
-
- return;
-
-zlError:
-
- zfwBufFree(dev, buf, 0);
- return;
-
-}
-
-void zfSendBA(zdev_t* dev, u16_t start_seq, u8_t *bitmap)
-{
- zbuf_t* buf;
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- u16_t err;
- u16_t hlen;
- u16_t header[(8+24+1)/2];
- u16_t i, offset = 0;
-
- zmw_get_wlan_dev(dev);
-
- buf = zfwBufAllocate(dev, 1024);
- if (buf == NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Alloc mm buf Fail!");
- return;
- }
-
- zfwBufSetSize(dev, buf, 12); // 28 = FC 2 + DU 2 + RA 6 + TA 6 + BAC 2 + SEQ 2 + BitMap 8
- // 12 = BAC 2 + SEQ 2 + BitMap 8
-
- //zm_msg2_mm(ZM_LV_2, "buf->len=", buf->len);
-
- zfTxGenMmHeader(dev, ZM_WLAN_FRAME_TYPE_BA, wd->sta.bssid, header, 0, buf, 0, 0);
-
- header[0] = 32; /* MAC header 16 + BA control 2 + BA info 10 + FCS 4*/
- header[1] = 0x4; /* No ACK */
-
- /* send by OFDM 6M */
- header[2] = (u16_t)(zcRateToPhyCtrl[4] & 0xffff);
- header[3] = (u16_t)(zcRateToPhyCtrl[4]>>16) & 0xffff;
-
- hlen = 16 + 8; /* MAC header 16 + control 8*/
- offset = 0;
- zmw_tx_buf_writeh(dev, buf, offset, 0x05); /*compressed bitmap on*/
- offset+=2;
- zmw_tx_buf_writeh(dev, buf, offset, start_seq);
- offset+=2;
-
- for (i=0; i<8; i++) {
- zmw_tx_buf_writeb(dev, buf, offset, bitmap[i]);
- offset++;
- }
-
- err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
-
- return;
-
-zlError:
-
- zfwBufFree(dev, buf, 0);
- return;
-
-}
-
-void zfStaGetTxRate(zdev_t* dev, u16_t* macAddr, u32_t* phyCtrl,
- u16_t* rcProbingFlag)
-{
- u8_t addr[6], i;
- u8_t rate;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- ZM_MAC_WORD_TO_BYTE(macAddr, addr);
- *phyCtrl = 0;
-
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- zmw_enter_critical_section(dev);
- rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[0].rcCell, rcProbingFlag);
-//#ifdef ZM_FB50
- //rate = 27;
-//#endif
- *phyCtrl = zcRateToPhyCtrl[rate];
- zmw_leave_critical_section(dev);
- }
- else
- {
- zmw_enter_critical_section(dev);
- for(i=0; i<wd->sta.oppositeCount; i++)
- {
- if ( addr[0] && 0x01 == 1 ) // The default beacon transmitted rate is CCK and 1 Mbps , but the a mode should use
- // OFDM modulation and 6Mbps to transmit beacon.
- {
- //rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag);
- rate = wd->sta.oppositeInfo[i].rcCell.operationRateSet[0];
- *phyCtrl = zcRateToPhyCtrl[rate];
- break;
- }
- else if ( zfMemoryIsEqual(addr, wd->sta.oppositeInfo[i].macAddr, 6) )
- {
- rate = (u8_t)zfRateCtrlGetTxRate(dev, &wd->sta.oppositeInfo[i].rcCell, rcProbingFlag);
- *phyCtrl = zcRateToPhyCtrl[rate];
- break;
- }
- }
- zmw_leave_critical_section(dev);
- }
-
- return;
-}
-
-struct zsMicVar* zfStaGetRxMicKey(zdev_t* dev, zbuf_t* buf)
-{
- u8_t keyIndex;
- u8_t da0;
-
- zmw_get_wlan_dev(dev);
-
- /* if need not check MIC, return NULL */
- if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
- (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
- {
- return NULL;
- }
-
- da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
-
- if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80)
- keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/
- else
- keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/
- keyIndex = (keyIndex & 0xc0) >> 6;
-
- return (&wd->sta.rxMicKey[keyIndex]);
-}
-
-struct zsMicVar* zfStaGetTxMicKey(zdev_t* dev, zbuf_t* buf)
-{
- zmw_get_wlan_dev(dev);
-
- /* if need not check MIC, return NULL */
- //if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
- // (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
- if ( (wd->sta.encryMode != ZM_TKIP) || (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
- {
- return NULL;
- }
-
- return (&wd->sta.txMicKey);
-}
-
-u16_t zfStaRxValidateFrame(zdev_t* dev, zbuf_t* buf)
-{
- u8_t frameType, frameCtrl;
- u8_t da0;
- //u16_t sa[3];
- u16_t ret;
- //u8_t sa0;
-
- zmw_get_wlan_dev(dev);
-
- frameType = zmw_rx_buf_readb(dev, buf, 0);
- da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
- //sa0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
-
- if ( (!zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) )
- {
- return ZM_ERR_DATA_BEFORE_CONNECTED;
- }
-
-
- if ( (zfStaIsConnected(dev))&&((frameType & 0xf) == ZM_WLAN_DATA_FRAME) )
- {
- /* check BSSID */
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- /* Big Endian and Little Endian Compatibility */
- u16_t mac[3];
- mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]);
- mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]);
- mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]);
- if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac,
- ZM_WLAN_HEADER_A2_OFFSET, 6) )
- {
-/*We will get lots of garbage data, especially in AES mode.*/
-/*To avoid sending too many deauthentication frames in STA mode, mark it.*/
-#if 0
- /* If unicast frame, send deauth to the transmitter */
- if (( da0 & 0x01 ) == 0)
- {
- for (i=0; i<3; i++)
- {
- sa[i] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+(i*2));
- }
- /* If mutilcast address, don't send deauthentication*/
- if (( sa0 & 0x01 ) == 0)
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_DEAUTH, sa, 7, 0, 0);
- }
-#endif
- return ZM_ERR_DATA_BSSID_NOT_MATCHED;
- }
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- /* Big Endian and Little Endian Compatibility */
- u16_t mac[3];
- mac[0] = zmw_cpu_to_le16(wd->sta.bssid[0]);
- mac[1] = zmw_cpu_to_le16(wd->sta.bssid[1]);
- mac[2] = zmw_cpu_to_le16(wd->sta.bssid[2]);
- if ( !zfRxBufferEqualToStr(dev, buf, (u8_t *)mac,
- ZM_WLAN_HEADER_A3_OFFSET, 6) )
- {
- return ZM_ERR_DATA_BSSID_NOT_MATCHED;
- }
- }
-
- frameCtrl = zmw_rx_buf_readb(dev, buf, 1);
-
- /* check security bit */
- if ( wd->sta.dropUnencryptedPkts &&
- (wd->sta.wepStatus != ZM_ENCRYPTION_WEP_DISABLED )&&
- ( !(frameCtrl & ZM_BIT_6) ) )
- { /* security on, but got data without encryption */
-
- #if 1
- ret = ZM_ERR_DATA_NOT_ENCRYPTED;
- if ( wd->sta.pStaRxSecurityCheckCb != NULL )
- {
- ret = wd->sta.pStaRxSecurityCheckCb(dev, buf);
- }
- else
- {
- ret = ZM_ERR_DATA_NOT_ENCRYPTED;
- }
- if (ret == ZM_ERR_DATA_NOT_ENCRYPTED)
- {
- wd->commTally.swRxDropUnencryptedCount++;
- }
- return ret;
- #else
- if ( (wd->sta.wepStatus != ZM_ENCRYPTION_TKIP)&&
- (wd->sta.wepStatus != ZM_ENCRYPTION_AES) )
- {
- return ZM_ERR_DATA_NOT_ENCRYPTED;
- }
- #endif
- }
- }
-
- return ZM_SUCCESS;
-}
-
-void zfStaMicFailureHandling(zdev_t* dev, zbuf_t* buf)
-{
- u8_t da0;
- u8_t micNotify = 1;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK )
- {
- return;
- }
-
- zmw_enter_critical_section(dev);
-
- wd->sta.cmMicFailureCount++;
-
- if ( wd->sta.cmMicFailureCount == 1 )
- {
- zm_debug_msg0("get the first MIC failure");
- //zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT);
-
- /* Timer Resolution on WinXP is 15/16 ms */
- /* Decrease Time offset for <XP> Counter Measure */
- zfTimerSchedule(dev, ZM_EVENT_CM_TIMER, ZM_TICK_CM_TIMEOUT - ZM_TICK_CM_TIMEOUT_OFFSET);
- }
- else if ( wd->sta.cmMicFailureCount == 2 )
- {
- zm_debug_msg0("get the second MIC failure");
- /* reserve 2 second for OS to send MIC failure report to AP */
- wd->sta.cmDisallowSsidLength = wd->sta.ssidLen;
- zfMemoryCopy(wd->sta.cmDisallowSsid, wd->sta.ssid, wd->sta.ssidLen);
- //wd->sta.cmMicFailureCount = 0;
- zfTimerCancel(dev, ZM_EVENT_CM_TIMER);
- //zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT);
-
- /* Timer Resolution on WinXP is 15/16 ms */
- /* Decrease Time offset for <XP> Counter Measure */
- zfTimerSchedule(dev, ZM_EVENT_CM_DISCONNECT, ZM_TICK_CM_DISCONNECT - ZM_TICK_CM_DISCONNECT_OFFSET);
- }
- else
- {
- micNotify = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- if (micNotify == 1)
- {
- da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
- if ( da0 & 0x01 )
- {
- if (wd->zfcbMicFailureNotify != NULL)
- {
- wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_GROUP_ERROR);
- }
- }
- else
- {
- if (wd->zfcbMicFailureNotify != NULL)
- {
- wd->zfcbMicFailureNotify(dev, wd->sta.bssid, ZM_MIC_PAIRWISE_ERROR);
- }
- }
- }
-}
-
-
-u8_t zfStaBlockWlanScan(zdev_t* dev)
-{
- u8_t ret=FALSE;
-
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.bChannelScan )
- {
- return TRUE;
- }
-
- return ret;
-}
-
-void zfStaResetStatus(zdev_t* dev, u8_t bInit)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- zfHpDisableBeacon(dev);
-
- wd->dtim = 1;
- wd->sta.capability[0] = 0x01;
- wd->sta.capability[1] = 0x00;
- /* 802.11h */
- if (wd->sta.DFSEnable || wd->sta.TPCEnable)
- wd->sta.capability[1] |= ZM_BIT_0;
-
- /* release queued packets */
- for(i=0; i<wd->sta.ibssPSDataCount; i++)
- {
- zfwBufFree(dev, wd->sta.ibssPSDataQueue[i], 0);
- }
-
- for(i=0; i<wd->sta.staPSDataCount; i++)
- {
- zfwBufFree(dev, wd->sta.staPSDataQueue[i], 0);
- }
-
- wd->sta.ibssPSDataCount = 0;
- wd->sta.staPSDataCount = 0;
- zfZeroMemory((u8_t*) &wd->sta.staPSList, sizeof(struct zsStaPSList));
-
- wd->sta.wmeConnected = 0;
- wd->sta.psMgr.tempWakeUp = 0;
- wd->sta.qosInfo = 0;
- zfQueueFlush(dev, wd->sta.uapsdQ);
-
- return;
-
-}
-
-void zfStaIbssMonitoring(zdev_t* dev, u8_t reset)
-{
- u16_t i;
- u16_t oppositeCount;
- struct zsPartnerNotifyEvent event;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- //zm_debug_msg1("zfStaIbssMonitoring %d", wd->sta.oppositeCount);
-
- zmw_enter_critical_section(dev);
-
- if ( wd->sta.oppositeCount == 0 )
- {
- goto done;
- }
-
- if ( wd->sta.bChannelScan )
- {
- goto done;
- }
-
- oppositeCount = wd->sta.oppositeCount;
-
- for(i=0; i < ZM_MAX_OPPOSITE_COUNT; i++)
- {
- if ( oppositeCount == 0 )
- {
- break;
- }
-
- if ( reset )
- {
- wd->sta.oppositeInfo[i].valid = 0;
- }
-
- if ( wd->sta.oppositeInfo[i].valid == 0 )
- {
- continue;
- }
-
- oppositeCount--;
-
- if ( wd->sta.oppositeInfo[i].aliveCounter )
- {
- zm_debug_msg1("Setting alive to ", wd->sta.oppositeInfo[i].aliveCounter);
-
- zmw_leave_critical_section(dev);
-
- if ( wd->sta.oppositeInfo[i].aliveCounter != ZM_IBSS_PEER_ALIVE_COUNTER )
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ,
- (u16_t*)wd->sta.oppositeInfo[i].macAddr, 1, 0, 0);
- }
-
- zmw_enter_critical_section(dev);
- wd->sta.oppositeInfo[i].aliveCounter--;
- }
- else
- {
- zm_debug_msg0("zfStaIbssMonitoring remove the peer station");
- zfMemoryCopy(event.bssid, (u8_t *)(wd->sta.bssid), 6);
- zfMemoryCopy(event.peerMacAddr, wd->sta.oppositeInfo[i].macAddr, 6);
-
- wd->sta.oppositeInfo[i].valid = 0;
- wd->sta.oppositeCount--;
- if (wd->zfcbIbssPartnerNotify != NULL)
- {
- zmw_leave_critical_section(dev);
- wd->zfcbIbssPartnerNotify(dev, 0, &event);
- zmw_enter_critical_section(dev);
- }
- }
- }
-
-done:
- if ( reset == 0 )
- {
- zfTimerSchedule(dev, ZM_EVENT_IBSS_MONITOR, ZM_TICK_IBSS_MONITOR);
- }
-
- zmw_leave_critical_section(dev);
-}
-
-void zfInitPartnerNotifyEvent(zdev_t* dev, zbuf_t* buf, struct zsPartnerNotifyEvent *event)
-{
- u16_t *peerMacAddr;
-
- zmw_get_wlan_dev(dev);
-
- peerMacAddr = (u16_t *)event->peerMacAddr;
-
- zfMemoryCopy(event->bssid, (u8_t *)(wd->sta.bssid), 6);
- peerMacAddr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
- peerMacAddr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 2);
- peerMacAddr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET + 4);
-}
-
-void zfStaInitOppositeInfo(zdev_t* dev)
-{
- int i;
-
- zmw_get_wlan_dev(dev);
-
- for(i=0; i<ZM_MAX_OPPOSITE_COUNT; i++)
- {
- wd->sta.oppositeInfo[i].valid = 0;
- wd->sta.oppositeInfo[i].aliveCounter = ZM_IBSS_PEER_ALIVE_COUNTER;
- }
-}
-#ifdef ZM_ENABLE_CENC
-u16_t zfStaAddIeCenc(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- zmw_get_wlan_dev(dev);
-
- if (wd->sta.cencIe[1] != 0)
- {
- zfCopyToIntTxBuffer(dev, buf, wd->sta.cencIe, offset, wd->sta.cencIe[1]+2);
- offset += (wd->sta.cencIe[1]+2);
- }
- return offset;
-}
-#endif //ZM_ENABLE_CENC
-u16_t zfStaProcessAction(zdev_t* dev, zbuf_t* buf)
-{
- u8_t category, actionDetails;
- zmw_get_wlan_dev(dev);
-
- category = zmw_rx_buf_readb(dev, buf, 24);
- actionDetails = zmw_rx_buf_readb(dev, buf, 25);
- switch (category)
- {
- case 0: //Spectrum Management
- switch(actionDetails)
- {
- case 0: //Measurement Request
- break;
- case 1: //Measurement Report
- //ProcessActionSpectrumFrame_MeasurementReport(Adapter,pActionBody+3);
- break;
- case 2: //TPC request
- //if (wd->sta.TPCEnable)
- // zfStaUpdateDot11HTPC(dev, buf);
- break;
- case 3: //TPC report
- //if (wd->sta.TPCEnable)
- // zfStaUpdateDot11HTPC(dev, buf);
- break;
- case 4: //Channel Switch Announcement
- if (wd->sta.DFSEnable)
- zfStaUpdateDot11HDFS(dev, buf);
- break;
- default:
- zm_debug_msg1("Action Frame contain not support action field ", actionDetails);
- break;
- }
- break;
- case ZM_WLAN_BLOCK_ACK_ACTION_FRAME:
- zfAggBlockAckActionFrame(dev, buf);
- break;
- case 17: //Qos Management
- break;
- }
-
- return 0;
-}
-
-/* Determine the time not send beacon , if more than some value ,
- re-write the beacon start address */
-void zfReWriteBeaconStartAddress(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->tickIbssSendBeacon++; // Increase 1 per 10ms .
- zmw_leave_critical_section(dev);
-
- if ( wd->tickIbssSendBeacon == 40 )
- {
-// DbgPrint("20070727");
- zfHpEnableBeacon(dev, ZM_MODE_IBSS, wd->beaconInterval, wd->dtim, (u8_t)wd->sta.atimWindow);
- zmw_enter_critical_section(dev);
- wd->tickIbssSendBeacon = 0;
- zmw_leave_critical_section(dev);
- }
-}
-
-struct zsTkipSeed* zfStaGetRxSeed(zdev_t* dev, zbuf_t* buf)
-{
- u8_t keyIndex;
- u8_t da0;
-
- zmw_get_wlan_dev(dev);
-
- /* if need not check MIC, return NULL */
- if ( ((wd->sta.encryMode != ZM_TKIP)&&(wd->sta.encryMode != ZM_AES))||
- (wd->sta.wpaState < ZM_STA_WPA_STATE_PK_OK) )
- {
- return NULL;
- }
-
- da0 = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
-
- if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) == 0x80)
- keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+5); /* Qos Packet*/
- else
- keyIndex = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_IV_OFFSET+3); /* normal Packet*/
- keyIndex = (keyIndex & 0xc0) >> 6;
-
- return (&wd->sta.rxSeed[keyIndex]);
-}
-
-void zfStaEnableSWEncryption(zdev_t *dev, u8_t value)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.SWEncryptEnable = value;
- zfHpSWDecrypt(dev, 1);
- zfHpSWEncrypt(dev, 1);
-}
-
-void zfStaDisableSWEncryption(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.SWEncryptEnable = 0;
- zfHpSWDecrypt(dev, 0);
- zfHpSWEncrypt(dev, 0);
-}
-
-u16_t zfComputeBssInfoWeightValue(zdev_t *dev, u8_t isBMode, u8_t isHT, u8_t isHT40, u8_t signalStrength)
-{
- u8_t weightOfB = 0;
- u8_t weightOfAGBelowThr = 0;
- u8_t weightOfAGUpThr = 15;
- u8_t weightOfN20BelowThr = 15;
- u8_t weightOfN20UpThr = 30;
- u8_t weightOfN40BelowThr = 16;
- u8_t weightOfN40UpThr = 32;
-
- if( isBMode == 0 )
- return (signalStrength + weightOfB); // pure b mode , do not add the weight value for this AP !
- else
- {
- if( isHT == 0 && isHT40 == 0 )
- { // a , g , b/g mode ! add the weight value 15 for this AP if it's signal strength is more than some value !
- if( signalStrength < 18 ) // -77 dBm
- return signalStrength + weightOfAGBelowThr;
- else
- return (signalStrength + weightOfAGUpThr);
- }
- else if( isHT == 1 && isHT40 == 0 )
- { // 80211n mode use 20MHz
- if( signalStrength < 23 ) // -72 dBm
- return (signalStrength + weightOfN20BelowThr);
- else
- return (signalStrength + weightOfN20UpThr);
- }
- else // isHT == 1 && isHT40 == 1
- { // 80211n mode use 40MHz
- if( signalStrength < 16 ) // -79 dBm
- return (signalStrength + weightOfN40BelowThr);
- else
- return (signalStrength + weightOfN40UpThr);
- }
- }
-}
-
-u16_t zfStaAddIbssAdditionalIE(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<wd->sta.ibssAdditionalIESize; i++)
- {
- zmw_tx_buf_writeb(dev, buf, offset++, wd->sta.ibssAdditionalIE[i]);
- }
-
- return offset;
-}
diff --git a/drivers/staging/otus/80211core/coid.c b/drivers/staging/otus/80211core/coid.c
deleted file mode 100644
index 229aed8..0000000
--- a/drivers/staging/otus/80211core/coid.c
+++ /dev/null
@@ -1,2696 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : iod.c */
-/* */
-/* Abstract */
-/* This module contains OID functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#include "../hal/hpreg.h"
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiWlanQueryMacAddress */
-/* Query OWN MAC address. */
-/* */
-/* INPUTS */
-/* addr : for return MAC address */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr)
-{
- u16_t vapId = 0;
- zmw_get_wlan_dev(dev);
-
- vapId = zfwGetVapId(dev);
-
- addr[0] = (u8_t)(wd->macAddr[0] & 0xff);
- addr[1] = (u8_t)(wd->macAddr[0] >> 8);
- addr[2] = (u8_t)(wd->macAddr[1] & 0xff);
- addr[3] = (u8_t)(wd->macAddr[1] >> 8);
- addr[4] = (u8_t)(wd->macAddr[2] & 0xff);
- if (vapId == 0xffff)
- addr[5] = (u8_t)(wd->macAddr[2] >> 8);
- else
- {
-#ifdef ZM_VAPMODE_MULTILE_SSID
- addr[5] = (u8_t)(wd->macAddr[2] >> 8); // Multiple SSID
-#else
- addr[5] = vapId + 1 + (u8_t)(wd->macAddr[2] >> 8); //VAP
-#endif
- }
-
- return;
-}
-
-void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList)
-{
- struct zsBssInfo* pBssInfo;
- struct zsBssInfo* pDstBssInfo;
- u8_t i;
- u8_t* pMemList;
- u8_t* pMemInfo;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- pMemList = (u8_t*) pBssList;
- pMemInfo = pMemList + sizeof(struct zsBssList);
- pBssList->head = (struct zsBssInfo*) pMemInfo;
-
- zmw_enter_critical_section(dev);
-
- pBssInfo = wd->sta.bssList.head;
- pDstBssInfo = (struct zsBssInfo*) pMemInfo;
- pBssList->bssCount = wd->sta.bssList.bssCount;
-
- for( i=0; i<wd->sta.bssList.bssCount; i++ )
- {
- zfMemoryCopy((u8_t*)pDstBssInfo, (u8_t*)pBssInfo,
- sizeof(struct zsBssInfo));
-
- if ( pBssInfo->next != NULL )
- {
- pBssInfo = pBssInfo->next;
- pDstBssInfo->next = pDstBssInfo + 1;
- pDstBssInfo++;
- }
- else
- {
- zm_assert(i==(wd->sta.bssList.bssCount-1));
- }
- }
-
- zmw_leave_critical_section(dev);
-
- zfScanMgrScanAck(dev);
-}
-
-void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1)
-{
- struct zsBssInfo* pBssInfo;
- //struct zsBssInfo* pDstBssInfo;
- u8_t i, j, bdrop = 0, k = 0, Same_Count = 0;
- u8_t bssid[6];
- //u8_t* pMemList;
- //u8_t* pMemInfo;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- bssListV1->bssCount = wd->sta.bssList.bssCount;
-
- pBssInfo = wd->sta.bssList.head;
- ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
-
- for( i=0; i<wd->sta.bssList.bssCount; i++ )
- {
- bdrop = 0;
- if ( zfStaIsConnected(dev)
- && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE ) )
- {
- for (j = 0; j < 6; j++)
- {
- if ( pBssInfo->bssid[j] != bssid[j] )
- {
- break;
- }
- }
-
- if ( (j == 6)
- &&((pBssInfo->ssid[1] == wd->sta.ssidLen) || (pBssInfo->ssid[1] == 0) )&& (pBssInfo->frequency == wd->frequency) )
- {
- if(pBssInfo->ssid[1] == 0)
- pBssInfo->ssid[1] = wd->sta.ssidLen;
-
- if(Same_Count == 0)
- {//First meet
- Same_Count++;
- }
- else
- {//same one
- bdrop = 1;
- bssListV1->bssCount--;
- }
-
- }
- }
-
- if (bdrop == 0)
- {
- zfMemoryCopy((u8_t*)(&bssListV1->bssInfo[k]), (u8_t*)pBssInfo,
- sizeof(struct zsBssInfo));
-
- if(Same_Count == 1)
- {
- zfMemoryCopy(&(bssListV1->bssInfo[k].ssid[2]), wd->sta.ssid, wd->sta.ssidLen);
- Same_Count++;
- }
-
- k++;
- }
-
- if ( pBssInfo->next != NULL )
- {
- pBssInfo = pBssInfo->next;
- }
- else
- {
- zm_assert(i==(wd->sta.bssList.bssCount-1));
- }
- }
-
- zmw_leave_critical_section(dev);
-
- zfScanMgrScanAck(dev);
-}
-
-void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo)
-{
- zmw_get_wlan_dev(dev);
-
- zfMemoryCopy((u8_t *)pBssInfo, (u8_t *)&wd->sta.ibssBssDesc, sizeof(struct zsBssInfo));
-}
-
-u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->sta.ibssBssIsCreator;
-}
-
-u32_t zfiWlanQuerySupportMode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->supportMode;
-}
-
-u32_t zfiWlanQueryTransmitPower(zdev_t* dev)
-{
- u32_t ret = 0;
-
- zmw_get_wlan_dev(dev);
-
- if (zfStaIsConnected(dev)) {
- ret = wd->sta.connPowerInHalfDbm;
- } else {
- ret = zfHpGetTransmitPower(dev);
- }
-
- return ret;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiWlanFlushBssList */
-/* Flush BSSID List. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* none */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2006.12 */
-/* */
-/************************************************************************/
-void zfiWlanFlushBssList(zdev_t* dev)
-{
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- /* Call zfBssInfoRefresh() twice to remove all entry */
- zfBssInfoRefresh(dev, 1);
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->ws.wlanMode = wlanMode;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->ws.authMode = authMode;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->ws.wepStatus = wepStatus;
- zmw_leave_critical_section(dev);
-
-}
-
-void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength)
-{
- u16_t i;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( ssidLength <= 32 )
- {
- zmw_enter_critical_section(dev);
-
- wd->ws.ssidLen = ssidLength;
- zfMemoryCopy(wd->ws.ssid, ssid, ssidLength);
-
- if ( ssidLength < 32 )
- {
- wd->ws.ssid[ssidLength] = 0;
- }
-
- wd->ws.probingSsidList[0].ssidLen = ssidLength;
- zfMemoryCopy(wd->ws.probingSsidList[0].ssid, ssid, ssidLength);
- for (i=1; i<ZM_MAX_PROBE_HIDDEN_SSID_SIZE; i++)
- {
- wd->ws.probingSsidList[i].ssidLen = 0;
- }
-
- zmw_leave_critical_section(dev);
- }
-}
-
-void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (fragThreshold == 0)
- { /* fragmentation is disabled */
- wd->fragThreshold = 32767;
- }
- else if (fragThreshold < 256)
- {
- /* Minimum fragment threshold */
- wd->fragThreshold = 256;
- }
- else if (fragThreshold > 2346)
- {
- wd->fragThreshold = 2346;
- }
- else
- {
- wd->fragThreshold = fragThreshold & 0xfffe;
- }
-
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->rtsThreshold = rtsThreshold;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( bImmediate )
- {
- zmw_enter_critical_section(dev);
- wd->frequency = (u16_t) (frequency/1000);
- zmw_leave_critical_section(dev);
- zfCoreSetFrequency(dev, wd->frequency);
- }
- else
- {
- zmw_enter_critical_section(dev);
- if( frequency == 0 )
- { // Auto select clean channel depend on wireless environment !
- wd->ws.autoSetFrequency = 0;
- }
- wd->ws.frequency = (u16_t) (frequency/1000);
- zmw_leave_critical_section(dev);
- }
-}
-
-void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid)
-{
- u16_t i;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- for (i=0; i<6; i++)
- {
- wd->ws.desiredBssid[i] = bssid[i];
- }
- wd->ws.bDesiredBssid = TRUE;
- zmw_leave_critical_section(dev);
-
-}
-
-void zfiWlanSetBeaconInterval(zdev_t* dev,
- u16_t beaconInterval,
- u8_t bImmediate)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( bImmediate )
- {
- zmw_enter_critical_section(dev);
- wd->beaconInterval = beaconInterval;
- zmw_leave_critical_section(dev);
-
- /* update beacon interval here */
- }
- else
- {
- zmw_enter_critical_section(dev);
- wd->ws.beaconInterval = beaconInterval;
- zmw_leave_critical_section(dev);
- }
-}
-
-
-void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (dtim > 0)
- {
- wd->ws.dtim = dtim;
- }
- zmw_leave_critical_section(dev);
-}
-
-
-void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( bImmediate )
- {
- zmw_enter_critical_section(dev);
- wd->sta.atimWindow = atimWindow;
- zmw_leave_critical_section(dev);
-
- /* atim window here */
- }
- else
- {
- zmw_enter_critical_section(dev);
- wd->ws.atimWindow = atimWindow;
- zmw_leave_critical_section(dev);
- }
-}
-
-
-void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (wd->wlanMode == ZM_MODE_AP)
- {
- /* Hostapd Issue */
- if ((wd->ws.encryMode != ZM_AES) && (wd->ws.encryMode != ZM_TKIP))
- wd->ws.encryMode = encryMode;
- }
- else
- wd->ws.encryMode = encryMode;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.keyId = keyId;
-}
-
-u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr)
-{
- u8_t isInstalled = 0;
-
-#if 1
-//#ifdef ZM_ENABLE_IBSS_WPA2PSK
- u8_t res, peerIdx;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, (u16_t *)staMacAddr, &peerIdx);
- if( res == 0 )
- {
- isInstalled = wd->sta.oppositeInfo[peerIdx].pkInstalled;
- }
- zmw_leave_critical_section(dev);
-//#endif
-#endif
-
- return isInstalled;
-}
-
-u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
-{
- u16_t broadcast[3] = {0xffff, 0xffff, 0xffff};
- u32_t* key;
- u8_t encryMode = ZM_NO_WEP;
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- u8_t encryType = ZM_NO_WEP;
-#endif
- u8_t micKey[16];
- u16_t id = 0;
- u8_t vapId, i, addr[6];
- u8_t userIdx=0;
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- /* Determine opposite exist or not */
- u8_t res, peerIdx;
-// u8_t userIdx=0;
-
- zmw_get_wlan_dev(dev);
-
- if ( wd->sta.ibssWpa2Psk == 1 )
- {
- zmw_enter_critical_section(dev);
- res = zfStaFindOppositeByMACAddr(dev, (u16_t*)keyInfo.macAddr, &peerIdx);
- if( res == 0 )
- {
- userIdx = peerIdx;
- if ( wd->sta.oppositeInfo[userIdx].camIdx == 0xff )
- wd->sta.oppositeInfo[userIdx].camIdx = userIdx;
- }
- zmw_leave_critical_section(dev);
- }
-#else
- zmw_get_wlan_dev(dev);
-#endif
-
- if ( keyInfo.flag & ZM_KEY_FLAG_AUTHENTICATOR )
- { /* set key by authenticator */
- /* set pairwise key */
- if (keyInfo.flag & ZM_KEY_FLAG_PK)
- {
- /* Find STA's information */
- id = zfApFindSta(dev, keyInfo.macAddr);
- if (id == 0xffff)
- {
- /* Can't STA in the staTable */
- return ZM_STATUS_FAILURE;
- }
-
- wd->ap.staTable[id].iv16 = 0;
- wd->ap.staTable[id].iv32 = 0;
-
- if (keyInfo.keyLength == 32)
- { /* TKIP */
- //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
-
- /* In the current AP mode, we set KeyRsc to zero */
- //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
- // &(wd->ap.staTable[id].txSeed), KeyRsc);
- //zfTkipInit(keyInfo.key, (u8_t*) keyInfo.macAddr,
- // &(wd->ap.staTable[id].rxSeed), KeyRsc);
-#ifdef ZM_ENABLE_CENC
- if (keyInfo.flag & ZM_KEY_FLAG_CENC)
- {
- zm_debug_msg0("Set CENC pairwise Key");
-
- wd->ap.staTable[id].encryMode = ZM_CENC;
-
- /* Reset txiv and rxiv */
- wd->ap.staTable[id].txiv[0] = 0x5c365c37;
- wd->ap.staTable[id].txiv[1] = 0x5c365c36;
- wd->ap.staTable[id].txiv[2] = 0x5c365c36;
- wd->ap.staTable[id].txiv[3] = 0x5c365c36;
-
- wd->ap.staTable[id].rxiv[0] = 0x5c365c36;
- wd->ap.staTable[id].rxiv[1] = 0x5c365c36;
- wd->ap.staTable[id].rxiv[2] = 0x5c365c36;
- wd->ap.staTable[id].rxiv[3] = 0x5c365c36;
-
- /* Set Key Index */
- wd->ap.staTable[id].cencKeyIdx = keyInfo.keyIndex;
-
- //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
- // (u32_t*) &keyInfo.key[16]);
- }
- else
-#endif //ZM_ENABLE_CENC
- {
- wd->ap.staTable[id].encryMode = ZM_TKIP;
-
- zfMemoryCopy(micKey, &keyInfo.key[16], 8);
- zfMemoryCopy(&micKey[8], &keyInfo.key[24], 8);
-
- //zfCoreSetKey(dev, id+1, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr,
- // (u32_t*) micKey);
-
- /* For fragmentation, we use software MIC */
- zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].txMicKey), &(keyInfo.key[16]), 8);
- zfMemoryCopy((u8_t *)&(wd->ap.staTable[id].rxMicKey), &(keyInfo.key[24]), 8);
-
- }
- }
- else if (keyInfo.keyLength == 16)
- { /* AES */
- wd->ap.staTable[id].encryMode = ZM_AES;
- }
- else if (keyInfo.keyLength == 0)
- {
- /* Clear Key Info */
- zfApClearStaKey(dev, (u16_t *)keyInfo.macAddr);
-
- return ZM_STATUS_SUCCESS;
- }
- else
- {
- return ZM_STATUS_FAILURE;
- }
-
- //zfCoreSetKey(dev, id+1, 0, wd->ap.staTable[id].encryMode,
- // (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- zfHpSetApPairwiseKey(dev, (u16_t *)keyInfo.macAddr,
- wd->ap.staTable[id].encryMode, (u32_t*) keyInfo.key,
- (u32_t*) &keyInfo.key[16], id+1);
- wd->ap.staTable[id].keyIdx = id + 1 + 4;
- }
- else if (keyInfo.flag & ZM_KEY_FLAG_GK)
- {
- vapId = keyInfo.vapId;
-
- wd->ap.iv16[vapId] = 0;
- wd->ap.iv32[vapId] = 0;
-
- if (keyInfo.keyLength == 32)
- { /* TKIP */
- //u8_t KeyRsc[6] = {0, 0, 0, 0, 0, 0};
-
- //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
- // &(wd->ap.bcSeed), KeyRsc);
-#ifdef ZM_ENABLE_CENC
- if (keyInfo.flag & ZM_KEY_FLAG_CENC)
- {
- encryMode = ZM_CENC;
- zm_debug_msg0("Set CENC group Key");
-
- /* Reset txiv and rxiv */
- wd->ap.txiv[vapId][0] = 0x5c365c36;
- wd->ap.txiv[vapId][1] = 0x5c365c36;
- wd->ap.txiv[vapId][2] = 0x5c365c36;
- wd->ap.txiv[vapId][3] = 0x5c365c36;
-
- //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
- // (u32_t*) &keyInfo.key[16]);
- key = (u32_t*) keyInfo.key;
- }
- else
-#endif //ZM_ENABLE_CENC
- {
- encryMode = ZM_TKIP;
- key = (u32_t *)keyInfo.key;
-
- /* set MIC key to HMAC */
- //zfCoreSetKey(dev, 0, 1, ZM_TKIP, broadcast,
- // (u32_t*) (&keyInfo.key[16]));
- //zfCoreSetKey(dev, 0, 1, ZM_TKIP, keyInfo.vapAddr,
- // (u32_t*) (&keyInfo.key[16]));
-
- zfMicSetKey(&(keyInfo.key[16]), &(wd->ap.bcMicKey[0]));
- key = (u32_t*) keyInfo.key;
- }
- }
- else if (keyInfo.keyLength == 16)
- { /* AES */
- encryMode = ZM_AES;
- key = (u32_t *)keyInfo.key;
- zm_debug_msg0("CWY - Set AES Group Key");
- }
- else if (keyInfo.keyLength == 0)
- {
- /* Clear Key Info */
- zfApClearStaKey(dev, broadcast);
-
- /* Turn off WEP bit in the capability field */
- wd->ap.capab[vapId] &= 0xffef;
-
- return ZM_STATUS_SUCCESS;
- }
- else
- { /* WEP */
- if (keyInfo.keyLength == 5)
- {
- encryMode = ZM_WEP64;
- }
- else if (keyInfo.keyLength == 13)
- {
- encryMode = ZM_WEP128;
- }
- else if (keyInfo.keyLength == 29)
- {
- encryMode = ZM_WEP256;
- }
-
- key = (u32_t*) keyInfo.key;
- }
-
- // Modification for CAM not support VAP search
- //zfCoreSetKey(dev, 0, 0, encryMode, broadcast, key);
- //zfCoreSetKey(dev, 0, 0, encryMode, wd->macAddr, key);
- //zfCoreSetKey(dev, 0, 0, encryMode, keyInfo.vapAddr, key);
- zfHpSetApGroupKey(dev, wd->macAddr, encryMode,
- key, (u32_t*) &keyInfo.key[16], vapId);
-
- //zfiWlanSetEncryMode(dev, encryMode);
- wd->ws.encryMode = encryMode;
-
- /* set the multicast address encryption type */
- wd->ap.encryMode[vapId] = encryMode;
-
- /* set the multicast key index */
- wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
- wd->ap.bcHalKeyIdx[vapId] = vapId + 60;
-
- /* Turn on WEP bit in the capability field */
- wd->ap.capab[vapId] |= 0x10;
- }
- }
- else
- { /* set by supplicant */
-
- if ( keyInfo.flag & ZM_KEY_FLAG_PK )
- { /* set pairwise key */
-
- //zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
- // &wd->sta.txSeed, keyInfo.initIv);
- //zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
- // &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if ( wd->sta.ibssWpa2Psk == 1 )
- {
- /* unicast -- > pairwise key */
- wd->sta.oppositeInfo[userIdx].iv16 = 0;
- wd->sta.oppositeInfo[userIdx].iv32 = 0;
- }
- else
- {
- wd->sta.iv16 = 0;
- wd->sta.iv32 = 0;
- }
-
- wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
-#else
- wd->sta.iv16 = 0;
- wd->sta.iv32 = 0;
-
- wd->sta.oppositeInfo[userIdx].pkInstalled = 1;
-#endif
-
- if ( keyInfo.keyLength == 32 )
- { /* TKIP */
- zfTkipInit(keyInfo.key, (u8_t*) wd->macAddr,
- &wd->sta.txSeed, keyInfo.initIv);
- zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
- &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
-
-#ifdef ZM_ENABLE_CENC
- if (keyInfo.flag & ZM_KEY_FLAG_CENC)
- {
- zm_debug_msg0("Set CENC pairwise Key");
-
- wd->sta.encryMode = ZM_CENC;
-
- /* Reset txiv and rxiv */
- wd->sta.txiv[0] = 0x5c365c36;
- wd->sta.txiv[1] = 0x5c365c36;
- wd->sta.txiv[2] = 0x5c365c36;
- wd->sta.txiv[3] = 0x5c365c36;
-
- wd->sta.rxiv[0] = 0x5c365c37;
- wd->sta.rxiv[1] = 0x5c365c36;
- wd->sta.rxiv[2] = 0x5c365c36;
- wd->sta.rxiv[3] = 0x5c365c36;
-
- /* Set Key Index */
- wd->sta.cencKeyId = keyInfo.keyIndex;
-
- //zfCoreSetKey(dev, id+1, 1, ZM_CENC, (u16_t *)keyInfo.macAddr,
- // (u32_t*) &keyInfo.key[16]);
- }
- else
-#endif //ZM_ENABLE_CENC
- {
- wd->sta.encryMode = ZM_TKIP;
-
- //zfCoreSetKey(dev, 0, 1, ZM_TKIP, wd->sta.bssid,
- // (u32_t*) &keyInfo.key[16]);
-
- zfMicSetKey(&keyInfo.key[16], &wd->sta.txMicKey);
- zfMicSetKey(&keyInfo.key[24],
- &wd->sta.rxMicKey[keyInfo.keyIndex]);
- }
- }
- else if ( keyInfo.keyLength == 16 )
- { /* AES */
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if ( wd->sta.ibssWpa2Psk == 1 )
- {
- wd->sta.oppositeInfo[userIdx].encryMode = ZM_AES;
- encryType = wd->sta.oppositeInfo[userIdx].encryMode;
- }
- else
- {
- wd->sta.encryMode = ZM_AES;
- encryType = wd->sta.encryMode;
- }
-#else
- wd->sta.encryMode = ZM_AES;
-#endif
- }
- else
- {
- return ZM_STATUS_FAILURE;
- }
-
- /* user 0 */
- //zfCoreSetKey(dev, 0, 0, wd->sta.encryMode,
- // wd->sta.bssid, (u32_t*) keyInfo.key);
- //zfHpSetStaPairwiseKey(dev, wd->sta.bssid, wd->sta.encryMode,
- // (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
- { /* If not AES-CCMP and ibss network , use traditional */
- zfHpSetPerUserKey(dev,
- userIdx,
- keyInfo.keyIndex, // key id == 0 ( Pairwise key = 0 )
- (u8_t*)keyInfo.macAddr, // RX need Source Address ( Address 2 )
- encryType,
-// wd->sta.encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
- wd->sta.oppositeInfo[userIdx].wpaState = ZM_STA_WPA_STATE_PK_OK ;
- }
- else
- {/* Big Endian and Little Endian Compatibility */
- for (i = 0; i < 3; i++)
- {
- addr[2 * i] = wd->sta.bssid[i] & 0xff;
- addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
- }
- zfHpSetPerUserKey(dev,
- ZM_USER_KEY_PK, // user id
- 0, // key id
- addr,//(u8_t *)wd->sta.bssid,
- wd->sta.encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
- wd->sta.keyId = 4;
- }
-#else
- /* Big Endian and Little Endian Compatibility */
- for (i = 0; i < 3; i++)
- {
- addr[2 * i] = wd->sta.bssid[i] & 0xff;
- addr[2 * i + 1] = wd->sta.bssid[i] >> 8;
- }
- zfHpSetPerUserKey(dev,
- ZM_USER_KEY_PK, // user id
- 0, // key id
- addr,//(u8_t *)wd->sta.bssid,
- wd->sta.encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
- wd->sta.keyId = 4;
-#endif
-
- wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
- }
- else if ( keyInfo.flag & ZM_KEY_FLAG_GK )
- { /* set group key */
-
- zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
- &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
-
- if ( keyInfo.keyLength == 32 )
- { /* TKIP */
-#ifdef ZM_ENABLE_CENC
- if (keyInfo.flag & ZM_KEY_FLAG_CENC)
- {
- encryMode = ZM_CENC;
- zm_debug_msg0("Set CENC group Key");
-
- /* Reset txiv and rxiv */
- wd->sta.rxivGK[0] = 0x5c365c36;
- wd->sta.rxivGK[1] = 0x5c365c36;
- wd->sta.rxivGK[2] = 0x5c365c36;
- wd->sta.rxivGK[3] = 0x5c365c36;
-
- //zfCoreSetKey(dev, 0, 1, ZM_CENC, keyInfo.vapAddr,
- // (u32_t*) &keyInfo.key[16]);
- key = (u32_t*) keyInfo.key;
- }
- else
-#endif //ZM_ENABLE_CENC
- {
- encryMode = ZM_TKIP;
- key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
-
- if ( !(keyInfo.flag & ZM_KEY_FLAG_INIT_IV) )
- {
- wd->sta.rxSeed[keyInfo.keyIndex].iv16 = 0;
- wd->sta.rxSeed[keyInfo.keyIndex].iv32 = 0;
- }
-
- /* set MIC key to HMAC */
- //zfCoreSetKey(dev, 8, 1, ZM_TKIP, broadcast,
- // (u32_t*) (&keyInfo.key[16]));
-
- zfMicSetKey(&keyInfo.key[24],
- &wd->sta.rxMicKey[keyInfo.keyIndex]);
- }
- }
- else if ( keyInfo.keyLength == 16 )
- { /* AES */
- encryMode = ZM_AES;
- //key = (u32_t*) wd->sta.rxSeed[keyInfo.keyIndex].tk;
- }
- else
- { /* WEP */
- if ( keyInfo.keyLength == 5 )
- {
- encryMode = ZM_WEP64;
- }
- else if ( keyInfo.keyLength == 13 )
- {
- encryMode = ZM_WEP128;
- }
- else if ( keyInfo.keyLength == 29 )
- {
- encryMode = ZM_WEP256;
- }
-
- key = (u32_t*) keyInfo.key;
- }
-
- /* user 8 */
- //zfCoreSetKey(dev, 8, 0, encryMode, broadcast, key);
- //zfHpSetStaGroupKey(dev, broadcast, encryMode,
- // (u32_t*) keyInfo.key, (u32_t*) (&keyInfo.key[16]));
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
- {/* If not AES-CCMP and ibss network , use traditional */
- zfHpSetPerUserKey(dev,
- userIdx,
- keyInfo.keyIndex, // key id
- // (u8_t *)broadcast, // for only 2 stations IBSS netwrl ( A2 )
- (u8_t*)keyInfo.macAddr, // for multiple ( > 2 ) stations IBSS network ( A2 )
- encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
- }
- else
- {
- zfHpSetPerUserKey(dev,
- ZM_USER_KEY_GK, // user id
- 0, // key id
- (u8_t *)broadcast,
- encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
- wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
- }
-#else
- zfHpSetPerUserKey(dev,
- ZM_USER_KEY_GK, // user id
- 0, // key id
- (u8_t *)broadcast,
- encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
- wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
-#endif
- }
- else
- { /* legacy WEP */
- zm_debug_msg0("legacy WEP");
-
- if ( keyInfo.keyIndex >= 4 )
- {
- return ZM_STATUS_FAILURE;
- }
-
- if ( keyInfo.keyLength == 5 )
- {
- zm_debug_msg0("WEP 64");
-
- encryMode = ZM_WEP64;
- }
- else if ( keyInfo.keyLength == 13 )
- {
- zm_debug_msg0("WEP 128");
-
- encryMode = ZM_WEP128;
- }
- else if ( keyInfo.keyLength == 32 )
- {
- /* TKIP */
- #if 0
- // Don't reset the IV since some AP would fail in IV check and drop our connection
- if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
- {
- wd->sta.iv16 = 0;
- wd->sta.iv32 = 0;
- }
- #endif
-
- encryMode = ZM_TKIP;
-
- zfTkipInit(keyInfo.key, (u8_t*) wd->sta.bssid,
- &wd->sta.rxSeed[keyInfo.keyIndex], keyInfo.initIv);
- zfMicSetKey(&keyInfo.key[24],
- &wd->sta.rxMicKey[keyInfo.keyIndex]);
- }
- else if ( keyInfo.keyLength == 16 )
- {
- /* AES */
- #if 0
- // Don't reset the IV since some AP would fail in IV check and drop our connection
- if ( wd->sta.wpaState != ZM_STA_WPA_STATE_PK_OK )
- {
- /* broadcast -- > group key */
- /* Only initialize when set our default key ! */
- wd->sta.iv16 = 0;
- wd->sta.iv32 = 0;
- }
- #endif
-
- encryMode = ZM_AES;
- }
- else if ( keyInfo.keyLength == 29 )
- {
- zm_debug_msg0("WEP 256");
-
- encryMode = ZM_WEP256;
- //zfCoreSetKey(dev, 64, 1, wd->sta.encryMode,
- // wd->sta.bssid, (u32_t*) (&keyInfo.key[16]));
- }
- else
- {
- return ZM_STATUS_FAILURE;
- }
-
- {
- u8_t i;
-
- zm_debug_msg0("key = ");
- for(i = 0; i < keyInfo.keyLength; i++)
- {
- zm_debug_msg2("", keyInfo.key[i]);
- }
- }
-
- if ( keyInfo.flag & ZM_KEY_FLAG_DEFAULT_KEY )
- {
- //for WEP default key 1~3 and ATOM platform--CWYang(+)
- vapId = 0;
- wd->ap.bcHalKeyIdx[vapId] = keyInfo.keyIndex;
- wd->ap.bcKeyIndex[vapId] = keyInfo.keyIndex;
- wd->sta.keyId = keyInfo.keyIndex;
- }
-
- if(encryMode == ZM_TKIP)
- {
- if(wd->TKIP_Group_KeyChanging == 0x1)
- {
- zm_debug_msg0("Countermeasure : Cancel Old Timer ");
- zfTimerCancel(dev, ZM_EVENT_SKIP_COUNTERMEASURE);
- }
- else
- {
- zm_debug_msg0("Countermeasure : Create New Timer ");
- }
-
- wd->TKIP_Group_KeyChanging = 0x1;
- zfTimerSchedule(dev, ZM_EVENT_SKIP_COUNTERMEASURE, 150);
- }
-
-
-
- //------------------------------------------------------------------------
-
- /* use default key */
- //zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyInfo.keyIndex, 0,
- // wd->sta.encryMode, wd->sta.bssid, (u32_t*) keyInfo.key);
-
- if ( encryMode == ZM_TKIP ||
- encryMode == ZM_AES )
- {
- zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
- (u32_t*) keyInfo.key, (u32_t*) &keyInfo.key[16]);
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- if ( (keyInfo.keyLength==16) && (wd->sta.ibssWpa2Psk==1) )
- {/* If not AES-CCMP and ibss network , use traditional */
- wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
- }
- else
- {
- if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
- wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
- else
- {
- wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
- wd->sta.encryMode = encryMode;
- wd->ws.encryMode = encryMode;
- }
- }
-#else
- if (wd->sta.wpaState == ZM_STA_WPA_STATE_PK_OK)
- wd->sta.wpaState = ZM_STA_WPA_STATE_GK_OK;
- else if ( wd->sta.wpaState == ZM_STA_WPA_STATE_INIT )
- {
- wd->sta.wpaState = ZM_STA_WPA_STATE_PK_OK;
- wd->sta.encryMode = encryMode;
- wd->ws.encryMode = encryMode;
- }
-#endif
- }
- else
- {
- zfHpSetDefaultKey(dev, keyInfo.keyIndex, encryMode,
- (u32_t*) keyInfo.key, NULL);
-
- /* Save key for software WEP */
- zfMemoryCopy(wd->sta.wepKey[keyInfo.keyIndex], keyInfo.key,
- keyInfo.keyLength);
-
- /* TODO: Check whether we need to save the SWEncryMode */
- wd->sta.SWEncryMode[keyInfo.keyIndex] = encryMode;
-
- wd->sta.encryMode = encryMode;
- wd->ws.encryMode = encryMode;
- }
- }
- }
-
-// wd->sta.flagKeyChanging = 1;
- return ZM_STATUS_SUCCESS;
-}
-
-/* PSEUDO test */
-u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo)
-{
- //u16_t broadcast[3] = {0xffff, 0xffff, 0xffff};
- //u32_t* key;
- u8_t micKey[16];
-
- zmw_get_wlan_dev(dev);
-
- switch (keyInfo.keyLength)
- {
- case 5:
- wd->sta.encryMode = ZM_WEP64;
- /* use default key */
- zfCoreSetKey(dev, 64, 0, ZM_WEP64, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- break;
-
- case 13:
- wd->sta.encryMode = ZM_WEP128;
- /* use default key */
- zfCoreSetKey(dev, 64, 0, ZM_WEP128, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- break;
-
- case 29:
- wd->sta.encryMode = ZM_WEP256;
- /* use default key */
- zfCoreSetKey(dev, 64, 1, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) (&keyInfo.key[16]));
- zfCoreSetKey(dev, 64, 0, ZM_WEP256, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- break;
-
- case 16:
- wd->sta.encryMode = ZM_AES;
- //zfCoreSetKey(dev, 0, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- zfCoreSetKey(dev, 64, 0, ZM_AES, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- break;
-
- case 32:
-#ifdef ZM_ENABLE_CENC
- if (keyInfo.flag & ZM_KEY_FLAG_CENC)
- {
- u16_t boardcastAddr[3] = {0xffff, 0xffff, 0xffff};
- u16_t Addr_a[] = { 0x0000, 0x0080, 0x0901};
- u16_t Addr_b[] = { 0x0000, 0x0080, 0x0902};
- /* CENC test: user0,1 and user2 for boardcast */
- wd->sta.encryMode = ZM_CENC;
- zfCoreSetKey(dev, 0, 1, ZM_CENC, (u16_t *)Addr_a, (u32_t*) (&keyInfo.key[16]));
- zfCoreSetKey(dev, 0, 0, ZM_CENC, (u16_t *)Addr_a, (u32_t*) keyInfo.key);
-
- zfCoreSetKey(dev, 1, 1, ZM_CENC, (u16_t *)Addr_b, (u32_t*) (&keyInfo.key[16]));
- zfCoreSetKey(dev, 1, 0, ZM_CENC, (u16_t *)Addr_b, (u32_t*) keyInfo.key);
-
- zfCoreSetKey(dev, 2, 1, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) (&keyInfo.key[16]));
- zfCoreSetKey(dev, 2, 0, ZM_CENC, (u16_t *)boardcastAddr, (u32_t*) keyInfo.key);
-
- /* Initialize PN sequence */
- wd->sta.txiv[0] = 0x5c365c36;
- wd->sta.txiv[1] = 0x5c365c36;
- wd->sta.txiv[2] = 0x5c365c36;
- wd->sta.txiv[3] = 0x5c365c36;
- }
- else
-#endif //ZM_ENABLE_CENC
- {
- wd->sta.encryMode = ZM_TKIP;
- zfCoreSetKey(dev, 64, 1, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) micKey);
- zfCoreSetKey(dev, 64, 0, ZM_TKIP, (u16_t *)keyInfo.macAddr, (u32_t*) keyInfo.key);
- }
- break;
- default:
- wd->sta.encryMode = ZM_NO_WEP;
- }
-
- return ZM_STATUS_SUCCESS;
-}
-
-void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode)
-{
-#if 0
- zmw_get_wlan_dev(dev);
-
- wd->sta.powerSaveMode = mode;
-
- /* send null data with PwrBit to inform AP */
- if ( mode > ZM_STA_PS_NONE )
- {
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- zfSendNullData(dev, 1);
- }
-
- /* device into PS mode */
- zfPSDeviceSleep(dev);
- }
-#endif
-
- zfPowerSavingMgrSetMode(dev, mode);
-}
-
-void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac)
-{
- zmw_get_wlan_dev(dev);
-
- wd->macAddr[0] = mac[0];
- wd->macAddr[1] = mac[1];
- wd->macAddr[2] = mac[2];
-
- zfHpSetMacAddress(dev, mac, 0);
-}
-
-u8_t zfiWlanQueryWlanMode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->wlanMode;
-}
-
-u8_t zfiWlanQueryAdapterState(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->state;
-}
-
-u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper)
-{
- u8_t authMode;
-
- zmw_get_wlan_dev(dev);
-
- if ( bWrapper )
- {
- authMode = wd->ws.authMode;
- }
- else
- {
- //authMode = wd->sta.authMode;
- authMode = wd->sta.currentAuthMode;
- }
-
- return authMode;
-}
-
-u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper)
-{
- u8_t wepStatus;
-
- zmw_get_wlan_dev(dev);
-
- if ( bWrapper )
- {
- wepStatus = wd->ws.wepStatus;
- }
- else
- {
- wepStatus = wd->sta.wepStatus;
- }
-
- return wepStatus;
-}
-
-void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength)
-{
- u16_t vapId = 0;
- zmw_get_wlan_dev(dev);
-
- if (wd->wlanMode == ZM_MODE_AP)
- {
- vapId = zfwGetVapId(dev);
-
- if (vapId == 0xffff)
- {
- *pSsidLength = wd->ap.ssidLen[0];
- zfMemoryCopy(ssid, wd->ap.ssid[0], wd->ap.ssidLen[0]);
- }
- else
- {
- *pSsidLength = wd->ap.ssidLen[vapId + 1];
- zfMemoryCopy(ssid, wd->ap.ssid[vapId + 1], wd->ap.ssidLen[vapId + 1]);
- }
- }
- else
- {
- *pSsidLength = wd->sta.ssidLen;
- zfMemoryCopy(ssid, wd->sta.ssid, wd->sta.ssidLen);
- }
-}
-
-u16_t zfiWlanQueryFragThreshold(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->fragThreshold;
-}
-
-u16_t zfiWlanQueryRtsThreshold(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->rtsThreshold;
-}
-
-u32_t zfiWlanQueryFrequency(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return (wd->frequency*1000);
-}
-
-/***********************************************************
- * Function: zfiWlanQueryCurrentFrequency
- * Return value:
- * - 0 : no validate current frequency
- * - (>0): current frequency depend on "qmode"
- * Input:
- * - qmode:
- * 0: return value depend on the support mode, this
- qmode is use to solve the bug #31223
- * 1: return the actually current frequency
- ***********************************************************/
-u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode)
-{
- u32_t frequency;
-
- zmw_get_wlan_dev(dev);
-
- switch (qmode)
- {
- case 0:
- if (wd->sta.currentFrequency > 3000)
- {
- if (wd->supportMode & ZM_WIRELESS_MODE_5)
- {
- frequency = wd->sta.currentFrequency;
- }
- else if (wd->supportMode & ZM_WIRELESS_MODE_24)
- {
- frequency = zfChGetFirst2GhzChannel(dev);
- }
- else
- {
- frequency = 0;
- }
- }
- else
- {
- if (wd->supportMode & ZM_WIRELESS_MODE_24)
- {
- frequency = wd->sta.currentFrequency;
- }
- else if (wd->supportMode & ZM_WIRELESS_MODE_5)
- {
- frequency = zfChGetLast5GhzChannel(dev);
- }
- else
- {
- frequency = 0;
- }
- }
- break;
-
- case 1:
- frequency = wd->sta.currentFrequency;
- break;
-
- default:
- frequency = 0;
- }
-
- return (frequency*1000);
-}
-
-u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t freq)
-{
- u8_t i;
- u16_t frequency = (u16_t) (freq/1000);
- u32_t ret = 0;
-
- zmw_get_wlan_dev(dev);
-
- for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
- {
- if ( wd->regulationTable.allowChannel[i].channel == frequency )
- {
- ret = wd->regulationTable.allowChannel[i].channelFlags;
- }
- }
-
- return ret;
-}
-
-/* BandWidth 0=>20 1=>40 */
-/* ExtOffset 0=>20 1=>high control 40 3=>low control 40 */
-void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset)
-{
- zmw_get_wlan_dev(dev);
-
- *bandWidth = wd->BandWidth40;
- *extOffset = wd->ExtOffset;
-}
-
-u8_t zfiWlanQueryCWMode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->cwm.cw_mode;
-}
-
-u32_t zfiWlanQueryCWEnable(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->cwm.cw_enable;
-}
-
-void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid)
-{
- u8_t addr[6];
-
- zmw_get_wlan_dev(dev);
-
- ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, addr);
- zfMemoryCopy(bssid, addr, 6);
-}
-
-u16_t zfiWlanQueryBeaconInterval(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->beaconInterval;
-}
-
-u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- wd->sta.rxBeaconTotal += wd->sta.rxBeaconCount;
-
- return wd->sta.rxBeaconTotal;
-}
-
-u16_t zfiWlanQueryAtimWindow(zdev_t* dev)
-{
- u16_t atimWindow;
-
- zmw_get_wlan_dev(dev);
-
- atimWindow = wd->sta.atimWindow;
-
- return atimWindow;
-}
-
-u8_t zfiWlanQueryEncryMode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if (wd->wlanMode == ZM_MODE_AP)
- return wd->ap.encryMode[0];
- else
- return wd->sta.encryMode;
-}
-
-u16_t zfiWlanQueryCapability(zdev_t* dev)
-{
- u16_t capability;
-
- zmw_get_wlan_dev(dev);
-
- capability = wd->sta.capability[0] +
- (((u16_t) wd->sta.capability[1]) << 8);
-
- return capability;
-
-}
-
-u16_t zfiWlanQueryAid(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->sta.aid;
-}
-
-void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
-{
- u8_t i, j=0;
-
- zmw_get_wlan_dev(dev);
-
- for( i=0; i<4; i++ )
- {
- if ( wd->bRate & (0x1 << i) )
- {
- rateArray[j] = zg11bRateTbl[i] +
- ((wd->bRateBasic & (0x1<<i))<<(7-i));
- j++;
- }
- }
-
- *pLength = j;
-}
-
-void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength)
-{
- u8_t i, j=0;
-
- zmw_get_wlan_dev(dev);
-
- for( i=0; i<8; i++ )
- {
- if ( wd->gRate & (0x1 << i) )
- {
- rateArray[j] = zg11gRateTbl[i] +
- ((wd->gRateBasic & (0x1<<i))<<(7-i));
- j++;
- }
- }
-
- *pLength = j;
-}
-
-void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
-{
- u8_t len;
-
- zmw_get_wlan_dev(dev);
-
- len = wd->sta.rsnIe[1] + 2;
- zfMemoryCopy(ie, wd->sta.rsnIe, len);
- *pLength = len;
-}
-
-void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength)
-{
- u8_t len;
-
- zmw_get_wlan_dev(dev);
-
- len = wd->sta.wpaIe[1] + 2;
- zfMemoryCopy(ie, wd->sta.wpaIe, len);
- *pLength = len;
-
-}
-
-u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- switch( wd->sta.currentAuthMode )
- {
- case ZM_AUTH_MODE_WPA2PSK:
- case ZM_AUTH_MODE_WPA2:
- if ( wd->sta.rsnIe[7] == 2 )
- {
- return ZM_TKIP;
- }
- else
- {
- return ZM_AES;
- }
- break;
-
- case ZM_AUTH_MODE_WPAPSK:
- case ZM_AUTH_MODE_WPA:
- if ( wd->sta.rsnIe[11] == 2 )
- {
- return ZM_TKIP;
- }
- else
- {
- return ZM_AES;
- }
- break;
-
- default:
- return wd->sta.encryMode;
- }
-}
-
-u8_t zfiWlanQueryHTMode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- // 0:Legancy, 1:N
- return wd->sta.EnableHT;
-}
-
-u8_t zfiWlanQueryBandWidth40(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- // 0:20M, 1:40M
- return wd->BandWidth40;
-}
-
-u16_t zfiWlanQueryRegionCode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->regulationTable.regionCode;
-}
-void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length)
-{
- u16_t vapId = 0;
- zmw_get_wlan_dev(dev);
-
- if (wd->wlanMode == ZM_MODE_AP) // AP Mode
- {
- vapId = zfwGetVapId(dev);
-
- if (vapId == 0xffff)
- vapId = 0;
- else
- vapId++;
-
- zm_assert(Length < ZM_MAX_WPAIE_SIZE);
- if (Length < ZM_MAX_WPAIE_SIZE)
- {
- wd->ap.wpaLen[vapId] = Length;
- zfMemoryCopy(wd->ap.wpaIe[vapId], ie, wd->ap.wpaLen[vapId]);
- }
-
- }
- else
- {
- wd->sta.wpaLen = Length;
- zfMemoryCopy(wd->sta.wpaIe, ie, wd->sta.wpaLen);
- }
- //zfiWlanSetWpaSupport(dev, 1);
- if (wd->wlanMode == ZM_MODE_AP) // AP Mode
- {
- wd->ap.wpaSupport[vapId] = 1;
- }
- else
- {
- wd->sta.wpaSupport = 1;
- }
-
-}
-
-void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport)
-{
- u16_t vapId = 0;
- zmw_get_wlan_dev(dev);
-
- if (wd->wlanMode == ZM_MODE_AP) // AP Mode
- {
- vapId = zfwGetVapId(dev);
-
- if (vapId == 0xffff)
- vapId = 0;
- else
- vapId++;
-
- wd->ap.wpaSupport[vapId] = WpaSupport;
- }
- else
- {
- wd->sta.wpaSupport = WpaSupport;
- }
-
-}
-
-void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.bProtectionMode = mode;
- if (wd->sta.bProtectionMode == TRUE)
- {
- zfHpSetSlotTime(dev, 0);
- }
- else
- {
- zfHpSetSlotTime(dev, 1);
- }
-
- zm_msg1_mm(ZM_LV_1, "wd->protectionMode=", wd->sta.bProtectionMode);
-}
-
-void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
- u32_t nRateSet)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.bRateBasic = bRateSet;
- wd->ws.gRateBasic = gRateSet;
- wd->ws.nRateBasic = nRateSet;
-}
-
-void zfiWlanSetBGMode(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.bgMode = mode;
-}
-
-void zfiWlanSetpreambleType(zdev_t* dev, u8_t type)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.preambleType = type;
-}
-
-u8_t zfiWlanQuerypreambleType(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->ws.preambleType;
-}
-
-u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->sta.powerSaveMode;
-}
-
-u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid)
-{
- u32_t i;
-
- zmw_get_wlan_dev(dev);
-
- for(i=0; i<wd->sta.pmkidInfo.bssidCount; i++)
- {
- if ( zfMemoryIsEqual((u8_t*) wd->sta.pmkidInfo.bssidInfo[i].bssid,
- (u8_t*) bssid, 6) )
- {
- /* matched */
- break;
- }
- }
-
- if ( i < wd->sta.pmkidInfo.bssidCount )
- {
- /* overwrite the original one */
- zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
- }
- else
- {
- if ( i < ZM_PMKID_MAX_BSS_CNT )
- {
- wd->sta.pmkidInfo.bssidInfo[i].bssid[0] = bssid[0];
- wd->sta.pmkidInfo.bssidInfo[i].bssid[1] = bssid[1];
- wd->sta.pmkidInfo.bssidInfo[i].bssid[2] = bssid[2];
-
- zfMemoryCopy(wd->sta.pmkidInfo.bssidInfo[i].pmkid, pmkid, 16);
- wd->sta.pmkidInfo.bssidCount++;
- }
- }
-
- return 0;
-}
-
-u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len)
-{
- //struct zsPmkidInfo* pPmkidInfo = ( struct zsPmkidInfo* ) buf;
- u32_t size;
-
- zmw_get_wlan_dev(dev);
-
- size = sizeof(u32_t) +
- wd->sta.pmkidInfo.bssidCount * sizeof(struct zsPmkidBssidInfo);
-
- if ( len < size )
- {
- return wd->sta.pmkidInfo.bssidCount;
- }
-
- zfMemoryCopy(buf, (u8_t*) &wd->sta.pmkidInfo, (u16_t) size);
-
- return 0;
-}
-
-void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList)
-{
- struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pList;
- u8_t i;
- u8_t bAllMulticast = 0;
- //u32_t value;
-
- zmw_get_wlan_dev(dev);
-
- wd->sta.multicastList.size = size;
- for(i=0; i<size; i++)
- {
- zfMemoryCopy(wd->sta.multicastList.macAddr[i].addr,
- pMacList[i].addr, 6);
- }
-
- if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
- bAllMulticast = 1;
- zfHpSetMulticastList(dev, size, pList, bAllMulticast);
-
-}
-
-void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId)
-{
- u16_t fakeMacAddr[3] = {0, 0, 0};
- u32_t fakeKey[4] = {0, 0, 0, 0};
-
- zmw_get_wlan_dev(dev);
-
- if ( keyType == 0 )
- {
- /* remove WEP key */
- zm_debug_msg0("remove WEP key");
- zfCoreSetKey(dev, ZM_USER_KEY_DEFAULT+keyId, 0,
- ZM_NO_WEP, fakeMacAddr, fakeKey);
- wd->sta.encryMode = ZM_NO_WEP;
- }
- else if ( keyType == 1 )
- {
- /* remove pairwise key */
- zm_debug_msg0("remove pairwise key");
- zfHpRemoveKey(dev, ZM_USER_KEY_PK);
- wd->sta.encryMode = ZM_NO_WEP;
- }
- else
- {
- /* remove group key */
- zm_debug_msg0("remove group key");
- zfHpRemoveKey(dev, ZM_USER_KEY_GK);
- }
-}
-
-
-void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry)
-{
- zmw_get_wlan_dev(dev);
-
- zfMemoryCopy((u8_t*) pEntry, (u8_t*) &wd->regulationTable,
- sizeof(struct zsRegulationTable));
-}
-
-/* parameter "time" is specified in ms */
-void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time)
-{
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg1("scan time (ms) = ", time);
-
- wd->sta.activescanTickPerChannel = time / ZM_MS_PER_TICK;
-}
-
-void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.bAutoReconnect = enable;
- //wd->sta.bAutoReconnectEnabled = enable;
-}
-
-void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.staWmeEnabled = enable & 0x3;
- if ((enable & 0x2) != 0)
- {
- wd->ws.staWmeQosInfo = uapsdInfo & 0x6f;
- }
- else
- {
- wd->ws.staWmeQosInfo = 0;
- }
-}
-
-void zfiWlanSetApWme(zdev_t* dev, u8_t enable)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.apWmeEnabled = enable;
-}
-
-u8_t zfiWlanQuerywmeEnable(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->ws.staWmeEnabled;
-}
-
-void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
- u16_t entry)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
- if ((ssidLen <= 32) && (entry < ZM_MAX_PROBE_HIDDEN_SSID_SIZE))
- {
- zmw_enter_critical_section(dev);
- wd->ws.probingSsidList[entry].ssidLen = ssidLen;
- zfMemoryCopy(wd->ws.probingSsidList[entry].ssid, ssid, ssidLen);
- zmw_leave_critical_section(dev);
- }
-
- return;
-}
-
-void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.disableProbingWithSsid = mode;
-
- return;
-}
-
-void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.dropUnencryptedPkts = enable;
-}
-
-void zfiWlanSetStaRxSecurityCheckCb(zdev_t* dev, zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.pStaRxSecurityCheckCb = pStaRxSecurityCheckCb;
-}
-
-void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.ibssJoinOnly = joinOnly;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiConfigWdsPort */
-/* Configure WDS port. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* wdsPortId : WDS port ID, start from 0 */
-/* flag : 0=>disable WDS port, 1=>enable WDS port */
-/* wdsAddr : WDS neighbor MAC address */
-/* encType : encryption type for WDS port */
-/* wdsKey : encryption key for WDS port */
-/* */
-/* OUTPUTS */
-/* Error code */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
- u16_t encType, u32_t* wdsKey)
-{
- u16_t addr[3];
- u32_t key[4];
-
- zmw_get_wlan_dev(dev);
-
- if (wdsPortId >= ZM_MAX_WDS_SUPPORT)
- {
- return ZM_ERR_WDS_PORT_ID;
- }
-
- if (flag == 1)
- {
- /* Enable WDS port */
- wd->ap.wds.macAddr[wdsPortId][0] = wdsAddr[0];
- wd->ap.wds.macAddr[wdsPortId][1] = wdsAddr[1];
- wd->ap.wds.macAddr[wdsPortId][2] = wdsAddr[2];
-
- wd->ap.wds.wdsBitmap |= (1 << wdsPortId);
- wd->ap.wds.encryMode[wdsPortId] = (u8_t) encType;
-
- zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, (u8_t) encType, wdsAddr, wdsKey);
- }
- else
- {
- /* Disable WDS port */
- addr[0] = addr[1] = addr[2] = 0;
- key[0] = key[1] = key[2] = key[3] = 0;
- wd->ap.wds.wdsBitmap &= (~(1 << wdsPortId));
- zfCoreSetKey(dev, 10+ZM_MAX_WDS_SUPPORT, 0, ZM_NO_WEP, addr, key);
- }
-
- return ZM_SUCCESS;
-}
-#ifdef ZM_ENABLE_CENC
-/* CENC */
-void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId)
-{
- //struct zsWlanDev* wd = (struct zsWlanDev*) zmw_wlan_dev(dev);
- u32_t txiv[4];
- zmw_get_wlan_dev(dev);
-
- /* convert little endian to big endian for 32 bits */
- txiv[3] = wd->ap.txiv[vapId][0];
- txiv[2] = wd->ap.txiv[vapId][1];
- txiv[1] = wd->ap.txiv[vapId][2];
- txiv[0] = wd->ap.txiv[vapId][3];
-
- zfMemoryCopy(gsn, (u8_t*)txiv, 16);
-}
-#endif //ZM_ENABLE_CENC
-//CWYang(+)
-void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer)
-{
- zmw_get_wlan_dev(dev);
-
- /*Change Signal Strength/Quality Value to Human Sense Here*/
-
- buffer[0] = wd->SignalStrength;
- buffer[1] = wd->SignalQuality;
-}
-
-/* OS-XP */
-u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType)
-{
- return zfStaAddIeWpaRsn(dev, buf, offset, frameType);
-}
-
-/* zfiDebugCmd */
-/* cmd value-description */
-/* 0 schedule timer */
-/* 1 cancel timer */
-/* 2 clear timer */
-/* 3 test timer */
-/* 4 */
-/* 5 */
-/* 6 checksum test 0/1 */
-/* 7 enableProtectionMode */
-/* 8 rx packet content dump 0/1 */
-
-u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value)
-{
- u16_t event;
- u32_t tick;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
-
- zmw_enter_critical_section(dev);
-
- if ( cmd == 0 )
- { /* schedule timer */
- event = (u16_t) ((value >> 16) & 0xffff);
- tick = value & 0xffff;
- zfTimerSchedule(dev, event, tick);
- }
- else if ( cmd == 1 )
- { /* cancel timer */
- event = (u16_t) (value & 0xffff);
- zfTimerCancel(dev, event);
- }
- else if ( cmd == 2 )
- { /* clear timer */
- zfTimerClear(dev);
- }
- else if ( cmd == 3 )
- { /* test timer */
- zfTimerSchedule(dev, 1, 500);
- zfTimerSchedule(dev, 2, 1000);
- zfTimerSchedule(dev, 3, 1000);
- zfTimerSchedule(dev, 4, 1000);
- zfTimerSchedule(dev, 5, 1500);
- zfTimerSchedule(dev, 6, 2000);
- zfTimerSchedule(dev, 7, 2200);
- zfTimerSchedule(dev, 6, 2500);
- zfTimerSchedule(dev, 8, 2800);
- }
- else if ( cmd == 4)
- {
- zfTimerSchedule(dev, 1, 500);
- zfTimerSchedule(dev, 2, 1000);
- zfTimerSchedule(dev, 3, 1000);
- zfTimerSchedule(dev, 4, 1000);
- zfTimerSchedule(dev, 5, 1500);
- zfTimerSchedule(dev, 6, 2000);
- zfTimerSchedule(dev, 7, 2200);
- zfTimerSchedule(dev, 6, 2500);
- zfTimerSchedule(dev, 8, 2800);
- zfTimerCancel(dev, 1);
- zfTimerCancel(dev, 3);
- zfTimerCancel(dev, 6);
- }
- else if ( cmd == 5 )
- {
- wd->sta.keyId = (u8_t) value;
- }
- else if ( cmd == 6 )
- {
- /* 0: normal 1: always set TCP/UDP checksum zero */
- wd->checksumTest = value;
- }
- else if ( cmd == 7 )
- {
- wd->enableProtectionMode = value;
- zm_msg1_mm(ZM_LV_1, "wd->enableProtectionMode=", wd->enableProtectionMode);
- }
- else if ( cmd == 8 )
- {
- /* rx packet content dump */
- if (value)
- {
- wd->rxPacketDump = 1;
- }
- else
- {
- wd->rxPacketDump = 0;
- }
- }
-
-
- zmw_leave_critical_section(dev);
-
- return 0;
-}
-
-#ifdef ZM_ENABLE_CENC
-u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
- u8_t *key, u8_t *mic)
-{
- struct zsKeyInfo keyInfo;
- u8_t cencKey[32];
- u8_t i;
- u16_t macAddr[3];
-
- zmw_get_wlan_dev(dev);
-
- for (i = 0; i < 16; i++)
- cencKey[i] = key[i];
- for (i = 0; i < 16; i++)
- cencKey[i + 16] = mic[i];
- keyInfo.key = cencKey;
- keyInfo.keyLength = 32;
- keyInfo.keyIndex = keyid;
- keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_PK;
- for (i = 0; i < 3; i++)
- macAddr[i] = wd->sta.bssid[i];
- keyInfo.macAddr = macAddr;
-
- zfiWlanSetKey(dev, keyInfo);
-
- /* Reset txiv and rxiv */
- //wd->sta.txiv[0] = txiv[0];
- //wd->sta.txiv[1] = txiv[1];
- //wd->sta.txiv[2] = txiv[2];
- //wd->sta.txiv[3] = txiv[3];
- //
- //wd->sta.rxiv[0] = rxiv[0];
- //wd->sta.rxiv[1] = rxiv[1];
- //wd->sta.rxiv[2] = rxiv[2];
- //wd->sta.rxiv[3] = rxiv[3];
-
- return 0;
-}
-
-u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
- u8_t *key, u8_t *mic)
-{
- struct zsKeyInfo keyInfo;
- u8_t cencKey[32];
- u8_t i;
- u16_t macAddr[6] = {0xffff, 0xffff, 0xffff};
-
- zmw_get_wlan_dev(dev);
-
- for (i = 0; i < 16; i++)
- cencKey[i] = key[i];
- for (i = 0; i < 16; i++)
- cencKey[i + 16] = mic[i];
- keyInfo.key = cencKey;
- keyInfo.keyLength = 32;
- keyInfo.keyIndex = keyid;
- keyInfo.flag = ZM_KEY_FLAG_CENC | ZM_KEY_FLAG_GK;
- keyInfo.vapId = 0;
- for (i = 0; i < 3; i++)
- keyInfo.vapAddr[i] = wd->macAddr[i];
- keyInfo.macAddr = macAddr;
-
- zfiWlanSetKey(dev, keyInfo);
-
- /* Reset txiv and rxiv */
- wd->sta.rxivGK[0] = ((rxiv[3] >> 24) & 0xFF)
- + (((rxiv[3] >> 16) & 0xFF) << 8)
- + (((rxiv[3] >> 8) & 0xFF) << 16)
- + ((rxiv[3] & 0xFF) << 24);
- wd->sta.rxivGK[1] = ((rxiv[2] >> 24) & 0xFF)
- + (((rxiv[2] >> 16) & 0xFF) << 8)
- + (((rxiv[2] >> 8) & 0xFF) << 16)
- + ((rxiv[2] & 0xFF) << 24);
- wd->sta.rxivGK[2] = ((rxiv[1] >> 24) & 0xFF)
- + (((rxiv[1] >> 16) & 0xFF) << 8)
- + (((rxiv[1] >> 8) & 0xFF) << 16)
- + ((rxiv[1] & 0xFF) << 24);
- wd->sta.rxivGK[3] = ((rxiv[0] >> 24) & 0xFF)
- + (((rxiv[0] >> 16) & 0xFF) << 8)
- + (((rxiv[0] >> 8) & 0xFF) << 16)
- + ((rxiv[0] & 0xFF) << 24);
-
- wd->sta.authMode = ZM_AUTH_MODE_CENC;
- wd->sta.currentAuthMode = ZM_AUTH_MODE_CENC;
-
- return 0;
-}
-#endif //ZM_ENABLE_CENC
-
-u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- wd->sta.b802_11D = mode;
- if (mode) //Enable 802.11d
- {
- wd->regulationTable.regionCode = NO_ENUMRD;
- for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
- wd->regulationTable.allowChannel[i].channelFlags |= ZM_REG_FLAG_CHANNEL_PASSIVE;
- }
- else //Disable
- {
- for (i = 0; i < wd->regulationTable.allowChannelCnt; i++)
- wd->regulationTable.allowChannel[i].channelFlags &= ~ZM_REG_FLAG_CHANNEL_PASSIVE;
- }
-
- return 0;
-}
-
-u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- //zm_debug_msg0("CWY - Enable 802.11h DFS");
-
- // TODO : DFS Enable in 5250 to 5350 MHz and 5470 to 5725 MHz .
- //if ( Adapter->ZD80211HSupport &&
- // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
- // ((ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ
- // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ
- //{
- // Adapter->ZD80211HSetting.DFSEnable=TRUE;
- //}
- //else
- //{
- // Adapter->ZD80211HSetting.DFSEnable=FALSE;
- //}
-
- wd->sta.DFSEnable = mode;
- if (mode)
- wd->sta.capability[1] |= ZM_BIT_0;
- else
- wd->sta.capability[1] &= (~ZM_BIT_0);
-
- return 0;
-}
-
-u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- // TODO : TPC Enable in 5150~5350 MHz and 5470~5725MHz.
- //if ( Adapter->ZD80211HSupport &&
- // Adapter->CardSetting.NetworkTypeInUse == Ndis802_11OFDM5 &&
- // ((ChannelNo == 36 || ChannelNo == 40 || ChannelNo == 44 || ChannelNo == 48) || //5150~5250 MHZ , Not Japan
- // (ChannelNo >=52 && ChannelNo <= 64) || //5250~5350 MHZ
- // (ChannelNo >=100 && ChannelNo <= 140))) //5470~5725 MHZ
- //{
- // Adapter->ZD80211HSetting.TPCEnable=TRUE;
- //}
- //else
- //{
- // Adapter->ZD80211HSetting.TPCEnable=FALSE;
- //}
-
- wd->sta.TPCEnable = mode;
- if (mode)
- wd->sta.capability[1] |= ZM_BIT_0;
- else
- wd->sta.capability[1] &= (~ZM_BIT_0);
-
- return 0;
-}
-
-u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- wd->aniEnable = mode;
- if (mode)
- zfHpAniAttach(dev);
-
- return 0;
-}
-
-#ifdef ZM_OS_LINUX_FUNC
-void zfiWlanShowTally(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zm_msg1_mm(ZM_LV_0, "Hw_UnderrunCnt = ", wd->commTally.Hw_UnderrunCnt);
- zm_msg1_mm(ZM_LV_0, "Hw_TotalRxFrm = ", wd->commTally.Hw_TotalRxFrm);
- zm_msg1_mm(ZM_LV_0, "Hw_CRC32Cnt = ", wd->commTally.Hw_CRC32Cnt);
- zm_msg1_mm(ZM_LV_0, "Hw_CRC16Cnt = ", wd->commTally.Hw_CRC16Cnt);
- zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_UNI = ", wd->commTally.Hw_DecrypErr_UNI);
- zm_msg1_mm(ZM_LV_0, "Hw_RxFIFOOverrun = ", wd->commTally.Hw_RxFIFOOverrun);
- zm_msg1_mm(ZM_LV_1, "Hw_DecrypErr_Mul = ", wd->commTally.Hw_DecrypErr_Mul);
- zm_msg1_mm(ZM_LV_1, "Hw_RetryCnt = ", wd->commTally.Hw_RetryCnt);
- zm_msg1_mm(ZM_LV_0, "Hw_TotalTxFrm = ", wd->commTally.Hw_TotalTxFrm);
- zm_msg1_mm(ZM_LV_0, "Hw_RxTimeOut = ", wd->commTally.Hw_RxTimeOut);
- zm_msg1_mm(ZM_LV_0, "Tx_MPDU = ", wd->commTally.Tx_MPDU);
- zm_msg1_mm(ZM_LV_0, "BA_Fail = ", wd->commTally.BA_Fail);
- zm_msg1_mm(ZM_LV_0, "Hw_Tx_AMPDU = ", wd->commTally.Hw_Tx_AMPDU);
- zm_msg1_mm(ZM_LV_0, "Hw_Tx_MPDU = ", wd->commTally.Hw_Tx_MPDU);
-
- zm_msg1_mm(ZM_LV_1, "Hw_RxMPDU = ", wd->commTally.Hw_RxMPDU);
- zm_msg1_mm(ZM_LV_1, "Hw_RxDropMPDU = ", wd->commTally.Hw_RxDropMPDU);
- zm_msg1_mm(ZM_LV_1, "Hw_RxDelMPDU = ", wd->commTally.Hw_RxDelMPDU);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyMiscError = ", wd->commTally.Hw_RxPhyMiscError);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyXRError = ", wd->commTally.Hw_RxPhyXRError);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyOFDMError = ", wd->commTally.Hw_RxPhyOFDMError);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyCCKError = ", wd->commTally.Hw_RxPhyCCKError);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyHTError = ", wd->commTally.Hw_RxPhyHTError);
- zm_msg1_mm(ZM_LV_1, "Hw_RxPhyTotalCount = ", wd->commTally.Hw_RxPhyTotalCount);
-
- if (!((wd->commTally.Tx_MPDU == 0) && (wd->commTally.BA_Fail == 0)))
- {
- zm_debug_msg_p("BA Fail Ratio(%) = ", wd->commTally.BA_Fail * 100,
- (wd->commTally.BA_Fail + wd->commTally.Tx_MPDU));
- }
-
- if (!((wd->commTally.Hw_Tx_MPDU == 0) && (wd->commTally.Hw_Tx_AMPDU == 0)))
- {
- zm_debug_msg_p("Avg Agg Number = ",
- wd->commTally.Hw_Tx_MPDU, wd->commTally.Hw_Tx_AMPDU);
- }
-}
-#endif
-
-void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->maxTxPower2 = power2;
- wd->maxTxPower5 = power5;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5)
-{
- zmw_get_wlan_dev(dev);
-
- *power2 = wd->maxTxPower2;
- *power5 = wd->maxTxPower5;
-}
-
-void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->connectMode = mode;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->supportMode = mode;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ws.adhocMode = mode;
-}
-
-u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper)
-{
- u32_t adhocMode;
-
- zmw_get_wlan_dev(dev);
-
- if ( bWrapper )
- {
- adhocMode = wd->ws.adhocMode;
- }
- else
- {
- adhocMode = wd->wfc.bIbssGMode;
- }
-
- return adhocMode;
-}
-
-
-u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length)
-{
- u8_t buf[5];
- zmw_get_wlan_dev(dev);
-
- if (length == 4)
- {
- buf[2] = wd->ws.countryIsoName[0] = countryIsoName[2];
- buf[3] = wd->ws.countryIsoName[1] = countryIsoName[1];
- buf[4] = wd->ws.countryIsoName[2] = countryIsoName[0];
- }
- else if (length == 3)
- {
- buf[2] = wd->ws.countryIsoName[0] = countryIsoName[1];
- buf[3] = wd->ws.countryIsoName[1] = countryIsoName[0];
- buf[4] = wd->ws.countryIsoName[2] = '\0';
- }
- else
- {
- return 1;
- }
-
- return zfHpGetRegulationTablefromISO(dev, buf, length);
-}
-
-
-const char* zfiWlanQueryCountryIsoName(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->ws.countryIsoName;
-}
-
-
-
-void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if (CCS)
- {
- /* Reset Regulation Table by Country Code */
- zfHpGetRegulationTablefromCountry(dev, Code);
- }
- else
- {
- /* Reset Regulation Table by Region Code */
- zfHpGetRegulationTablefromRegionCode(dev, Code);
- }
-
- if (bfirstChannel) {
- zmw_enter_critical_section(dev);
- wd->frequency = zfChGetFirstChannel(dev, NULL);
- zmw_leave_critical_section(dev);
- zfCoreSetFrequency(dev, wd->frequency);
- }
-}
-
-
-const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode)
-{
- return zfHpGetisoNamefromregionCode(dev, regionCode);
-}
-
-u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel)
-{
- return zfChNumToFreq(dev, channel, 0);
-}
-
-u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq)
-{
- u8_t is5GBand = 0;
-
- return zfChFreqToNum(freq, &is5GBand);
-}
-
-void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag)
-{
- zfHpDisableDfsChannel(dev, disableFlag);
- return;
-}
-
-void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- wd->ledStruct.LEDCtrlType = type;
- wd->ledStruct.LEDCtrlFlagFromReg = flag;
- zmw_leave_critical_section(dev);
-}
-
-void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.leapEnabled = leapEnabled;
-}
-
-u32_t zfiWlanQueryHwCapability(zdev_t* dev)
-{
- return zfHpCapability(dev);
-}
-
-u32_t zfiWlanQueryReceivedPacket(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->sta.ReceivedPktRatePerSecond;
-}
-
-void zfiWlanCheckSWEncryption(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if (wd->sta.SWEncryptEnable != 0)
- {
- zfHpSWDecrypt(dev, 1);
- }
-}
-
-u16_t zfiWlanQueryAllowChannels(zdev_t* dev, u16_t *channels)
-{
- u16_t ii;
- zmw_get_wlan_dev(dev);
-
- for (ii = 0; ii < wd->regulationTable.allowChannelCnt; ii++)
- {
- channels[ii] = wd->regulationTable.allowChannel[ii].channel;
- }
-
- return wd->regulationTable.allowChannelCnt;
-}
-
-void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val)
-{
- zmw_get_wlan_dev(dev);
-
- wd->dynamicSIFSEnable = val;
-
- zm_debug_msg1("wd->dynamicSIFSEnable = ", wd->dynamicSIFSEnable)
-}
-
-u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- return wd->sta.multicastList.size;
-}
-
-void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList)
-{
- struct zsMulticastAddr* pMacList = (struct zsMulticastAddr*) pMCList;
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- for ( i=0; i<wd->sta.multicastList.size; i++ )
- {
- zfMemoryCopy(pMacList[i].addr, wd->sta.multicastList.macAddr[i].addr, 6);
- }
-}
-
-void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter)
-{
- u8_t bAllMulticast = 0;
- u32_t oldFilter;
-
- zmw_get_wlan_dev(dev);
-
- oldFilter = wd->sta.osRxFilter;
-
- wd->sta.osRxFilter = PacketFilter;
-
- if ((oldFilter & ZM_PACKET_TYPE_ALL_MULTICAST) !=
- (wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST))
- {
- if ( wd->sta.osRxFilter & ZM_PACKET_TYPE_ALL_MULTICAST )
- bAllMulticast = 1;
- zfHpSetMulticastList(dev, wd->sta.multicastList.size,
- (u8_t*)wd->sta.multicastList.macAddr, bAllMulticast);
- }
-}
-
-u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr)
-{
- u8_t i;
- u8_t bIsInMCListAddr = 0;
-
- zmw_get_wlan_dev(dev);
-
- for ( i=0; i<wd->sta.multicastList.size; i++ )
- {
- if ( zfwMemoryIsEqual((u8_t*)dstMacAddr, (u8_t*)wd->sta.multicastList.macAddr[i].addr, 6) )
- {
- bIsInMCListAddr = 1;
- break;
- }
- }
-
- return bIsInMCListAddr;
-}
-
-void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.bSafeMode = safeMode;
-
- if ( safeMode )
- zfStaEnableSWEncryption(dev, 1);
- else
- zfStaDisableSWEncryption(dev);
-}
-
-void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE)
-{
- zmw_get_wlan_dev(dev);
-
- if ( ibssAdditionalIESize )
- {
- wd->sta.ibssAdditionalIESize = ibssAdditionalIESize;
- zfMemoryCopy(wd->sta.ibssAdditionalIE, ibssAdditionalIE, (u16_t)ibssAdditionalIESize);
- }
- else
- wd->sta.ibssAdditionalIESize = 0;
-}
diff --git a/drivers/staging/otus/80211core/cprecomp.h b/drivers/staging/otus/80211core/cprecomp.h
deleted file mode 100644
index 1670bfc..0000000
--- a/drivers/staging/otus/80211core/cprecomp.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _CPRECOMP_H
-#define _CPRECOMP_H
-
-#include "../oal_dt.h"
-#include "../oal_marc.h"
-#include "pub_zfi.h"
-#include "pub_zfw.h"
-#include "pub_usb.h"
-#include "wlan.h"
-#include "struct.h"
-#include "cfunc.h"
-#include "cagg.h"
-#include "cwm.h"
-#include "performance.h"
-#endif
-
diff --git a/drivers/staging/otus/80211core/cpsmgr.c b/drivers/staging/otus/80211core/cpsmgr.c
deleted file mode 100644
index 32313be..0000000
--- a/drivers/staging/otus/80211core/cpsmgr.c
+++ /dev/null
@@ -1,730 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-/**
- * The power saving manager is to save the power as much as possible.
- * Generally speaking, it controls:
- *
- * - when to sleep
- * -
- *
- */
-#include "cprecomp.h"
-
-void zfPowerSavingMgrInit(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.powerSaveMode = ZM_STA_PS_NONE;
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
- wd->sta.psMgr.isSleepAllowed = 0;
- wd->sta.psMgr.maxSleepPeriods = 1;
- wd->sta.psMgr.ticks = 0;
- wd->sta.psMgr.sleepAllowedtick = 0;
-}
-
-static u16_t zfPowerSavingMgrHandlePsNone(zdev_t* dev, u8_t *isWakeUpRequired)
-{
- u16_t ret = 0;
- zmw_get_wlan_dev(dev);
-
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- *isWakeUpRequired = 0;
- break;
-
- case ZM_PS_MSG_STATE_T1:
- case ZM_PS_MSG_STATE_T2:
- case ZM_PS_MSG_STATE_SLEEP:
- default:
- *isWakeUpRequired = 1;
-zm_debug_msg0("zfPowerSavingMgrHandlePsNone: Wake up now\n");
- if ( zfStaIsConnected(dev) )
- {
- zm_debug_msg0("zfPowerSavingMgrOnHandleT1 send Null data\n");
- //zfSendNullData(dev, 0);
- ret = 1;
- }
-
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
- break;
- }
- return ret;
-}
-
-static void zfPowerSavingMgrHandlePs(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- //zm_debug_msg0("zfPowerSavingMgrHandlePs: Prepare to sleep...\n");
- //wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
- break;
-
- case ZM_PS_MSG_STATE_T1:
- case ZM_PS_MSG_STATE_T2:
- case ZM_PS_MSG_STATE_SLEEP:
- default:
- break;
- }
-}
-
-void zfPowerSavingMgrSetMode(zdev_t* dev, u8_t mode)
-{
- u16_t sendNull = 0;
- u8_t isWakeUpRequired = 0;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zm_debug_msg1("mode = ", mode);
-
- if (mode > ZM_STA_PS_LIGHT)
- {
- zm_debug_msg0("return - wrong power save mode");
- return;
- }
-
- zmw_enter_critical_section(dev);
-
- #if 1
- switch(mode)
- {
- case ZM_STA_PS_NONE:
- sendNull = zfPowerSavingMgrHandlePsNone(dev, &isWakeUpRequired);
- break;
-
- case ZM_STA_PS_FAST:
- case ZM_STA_PS_LIGHT:
- wd->sta.psMgr.maxSleepPeriods = 1;
- zfPowerSavingMgrHandlePs(dev);
- break;
-
- case ZM_STA_PS_MAX:
- wd->sta.psMgr.maxSleepPeriods = ZM_PS_MAX_SLEEP_PERIODS;
- zfPowerSavingMgrHandlePs(dev);
- break;
- }
- #else
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- if ( mode != ZM_STA_PS_NONE )
- {
-zm_debug_msg0("zfPowerSavingMgrSetMode: switch from ZM_PS_MSG_STATE_ACTIVE to ZM_PS_MSG_STATE_T1\n");
- // Stall the TX & start to wait the pending TX to be completed
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
- }
- break;
-
- case ZM_PS_MSG_STATE_SLEEP:
- break;
- }
- #endif
-
- wd->sta.powerSaveMode = mode;
- zmw_leave_critical_section(dev);
-
- if ( isWakeUpRequired )
- {
- zfHpPowerSaveSetState(dev, 0);
- wd->sta.psMgr.tempWakeUp = 0;
- }
-
- if ( zfStaIsConnected(dev)
- && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
- {
- switch(mode)
- {
- case ZM_STA_PS_NONE:
- zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
- break;
-
- case ZM_STA_PS_FAST:
- case ZM_STA_PS_MAX:
- case ZM_STA_PS_LIGHT:
- zfHpPowerSaveSetMode(dev, 0, 1, wd->beaconInterval);
- break;
-
- default:
- zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
- break;
- }
- }
-
- if (sendNull == 1)
- {
- zfSendNullData(dev, 0);
- }
-
- return;
-}
-
-static void zfPowerSavingMgrNotifyPSToAP(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- if ( (wd->sta.psMgr.tempWakeUp != 1)&&
- (wd->sta.psMgr.lastTxUnicastFrm != wd->commTally.txUnicastFrm ||
- wd->sta.psMgr.lastTxBroadcastFrm != wd->commTally.txBroadcastFrm ||
- wd->sta.psMgr.lastTxMulticastFrm != wd->commTally.txMulticastFrm) )
- {
- zmw_enter_critical_section(dev);
- wd->sta.psMgr.lastTxUnicastFrm = wd->commTally.txUnicastFrm;
- wd->sta.psMgr.lastTxBroadcastFrm = wd->commTally.txBroadcastFrm;
- wd->sta.psMgr.lastTxMulticastFrm = wd->commTally.txMulticastFrm;
- zmw_leave_critical_section(dev);
-
- zfSendNullData(dev, 1);
- }
-}
-
-static void zfPowerSavingMgrOnHandleT1(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- // If the tx Q is not empty...return
- if ( zfIsVtxqEmpty(dev) == FALSE )
- {
- return;
- }
-
-zm_debug_msg0("VtxQ is empty now...Check if HAL TXQ is empty\n");
-
- // The the HAL TX Q is not empty...return
- if ( zfHpGetFreeTxdCount(dev) != zfHpGetMaxTxdCount(dev) )
- {
- return;
- }
-
-zm_debug_msg0("HAL TXQ is empty now...Could go to sleep...\n");
-
- zmw_enter_critical_section(dev);
-
- if (wd->sta.powerSaveMode == ZM_STA_PS_LIGHT)
- {
- if (wd->sta.ReceivedPktRatePerSecond > 200)
- {
- zmw_leave_critical_section(dev);
- return;
- }
-
- if ( zfStaIsConnected(dev)
- && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
- {
- if (wd->sta.psMgr.sleepAllowedtick) {
- wd->sta.psMgr.sleepAllowedtick--;
- zmw_leave_critical_section(dev);
- return;
- }
- }
- }
-
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_T2;
-
- zmw_leave_critical_section(dev);
-
- // Send the Null pkt to AP to notify that I'm going to sleep
- if ( zfStaIsConnected(dev) )
- {
-zm_debug_msg0("zfPowerSavingMgrOnHandleT1 send Null data\n");
- zfPowerSavingMgrNotifyPSToAP(dev);
- }
-
- // Stall the TX now
- // zfTxEngineStop(dev);
-}
-
-static void zfPowerSavingMgrOnHandleT2(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- // Wait until the Null pkt is transmitted
- if ( zfHpGetFreeTxdCount(dev) != zfHpGetMaxTxdCount(dev) )
- {
- return;
- }
-
- zmw_enter_critical_section(dev);
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_SLEEP;
- wd->sta.psMgr.lastTxUnicastFrm = wd->commTally.txUnicastFrm;
- wd->sta.psMgr.lastTxBroadcastFrm = wd->commTally.txBroadcastFrm;
- wd->sta.psMgr.lastTxMulticastFrm = wd->commTally.txMulticastFrm;
- zmw_leave_critical_section(dev);
-
- // Let CHIP sleep now
-zm_debug_msg0("zfPowerSavingMgrOnHandleT2 zzzz....\n");
- zfHpPowerSaveSetState(dev, 1);
- wd->sta.psMgr.tempWakeUp = 0;
-}
-
-u8_t zfPowerSavingMgrIsSleeping(zdev_t *dev)
-{
- u8_t isSleeping = FALSE;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if ( wd->sta.psMgr.state == ZM_PS_MSG_STATE_SLEEP ||
- wd->sta.psMgr.state == ZM_PS_MSG_STATE_T2)
- {
- isSleeping = TRUE;
- }
- zmw_leave_critical_section(dev);
- return isSleeping;
-}
-
-static u8_t zfPowerSavingMgrIsIdle(zdev_t *dev)
-{
- u8_t isIdle = 0;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if ( zfStaIsConnected(dev) && wd->sta.psMgr.isSleepAllowed == 0 )
- {
- goto done;
- }
-
- if ( wd->sta.bChannelScan )
- {
- goto done;
- }
-
- if ( zfStaIsConnecting(dev) )
- {
- goto done;
- }
-
- if (wd->sta.powerSaveMode == ZM_STA_PS_LIGHT)
- {
- if (wd->sta.ReceivedPktRatePerSecond > 200)
- {
- goto done;
- }
-
- if ( zfStaIsConnected(dev)
- && (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) )
- {
- if (wd->sta.psMgr.sleepAllowedtick) {
- wd->sta.psMgr.sleepAllowedtick--;
- goto done;
- }
- }
- }
-
- isIdle = 1;
-
-done:
- zmw_leave_critical_section(dev);
-
- if ( zfIsVtxqEmpty(dev) == FALSE )
- {
- isIdle = 0;
- }
-
- return isIdle;
-}
-
-static void zfPowerSavingMgrSleepIfIdle(zdev_t *dev)
-{
- u8_t isIdle;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- isIdle = zfPowerSavingMgrIsIdle(dev);
-
- if ( isIdle == 0 )
- {
- return;
- }
-
- zmw_enter_critical_section(dev);
-
- switch(wd->sta.powerSaveMode)
- {
- case ZM_STA_PS_NONE:
- break;
-
- case ZM_STA_PS_MAX:
- case ZM_STA_PS_FAST:
- case ZM_STA_PS_LIGHT:
- zm_debug_msg0("zfPowerSavingMgrSleepIfIdle: IDLE so slep now...\n");
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_T1;
- break;
- }
-
- zmw_leave_critical_section(dev);
-}
-
-static void zfPowerSavingMgrDisconnectMain(zdev_t* dev)
-{
-#ifdef ZM_ENABLE_DISCONNECT_PS
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- zfPowerSavingMgrSleepIfIdle(dev);
- break;
-
- case ZM_PS_MSG_STATE_SLEEP:
- break;
-
- case ZM_PS_MSG_STATE_T1:
- zfPowerSavingMgrOnHandleT1(dev);
- break;
-
- case ZM_PS_MSG_STATE_T2:
- zfPowerSavingMgrOnHandleT2(dev);
- break;
- }
-#else
- zfPowerSavingMgrWakeup(dev);
-#endif
-}
-
-static void zfPowerSavingMgrInfraMain(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- zfPowerSavingMgrSleepIfIdle(dev);
- break;
-
- case ZM_PS_MSG_STATE_SLEEP:
- break;
-
- case ZM_PS_MSG_STATE_T1:
- zfPowerSavingMgrOnHandleT1(dev);
- break;
-
- case ZM_PS_MSG_STATE_T2:
- zfPowerSavingMgrOnHandleT2(dev);
- break;
- }
-}
-
-void zfPowerSavingMgrAtimWinExpired(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
-//printk("zfPowerSavingMgrAtimWinExpired #1\n");
- if ( wd->sta.powerSaveMode == ZM_STA_PS_NONE )
- {
- return;
- }
-
-//printk("zfPowerSavingMgrAtimWinExpired #2\n");
- // if we received any ATIM window from the others to indicate we have buffered data
- // at the other station, we can't go to sleep
- if ( wd->sta.recvAtim )
- {
- wd->sta.recvAtim = 0;
- zm_debug_msg0("Can't sleep due to receving ATIM window!");
- return;
- }
-
- // if we are the one to tx beacon during last beacon interval. we can't go to sleep
- // since we need to be alive to respond the probe request!
- if ( wd->sta.txBeaconInd )
- {
- zm_debug_msg0("Can't sleep due to just transmit a beacon!");
- return;
- }
-
- // If we buffer any data for the other stations. we could not go to sleep
- if ( wd->sta.ibssPrevPSDataCount != 0 )
- {
- zm_debug_msg0("Can't sleep due to buffering data for the others!");
- return;
- }
-
- // before sleeping, we still need to notify the others by transmitting null
- // pkt with power mgmt bit turned on.
- zfPowerSavingMgrOnHandleT1(dev);
-}
-
-static void zfPowerSavingMgrIBSSMain(zdev_t* dev)
-{
- // wait for the end of
- // if need to wait to know if we are the one to transmit the beacon
- // during the beacon interval. If it's me, we can't go to sleep.
-
- zmw_get_wlan_dev(dev);
-
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- case ZM_PS_MSG_STATE_SLEEP:
- case ZM_PS_MSG_STATE_T1:
- break;
-
- case ZM_PS_MSG_STATE_T2:
- zfPowerSavingMgrOnHandleT2(dev);
- break;
- }
-
- return;
-}
-
-#if 1
-void zfPowerSavingMgrMain(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- switch (wd->sta.adapterState)
- {
- case ZM_STA_STATE_DISCONNECT:
- zfPowerSavingMgrDisconnectMain(dev);
- break;
- case ZM_STA_STATE_CONNECTED:
- {
- if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE) {
- zfPowerSavingMgrInfraMain(dev);
- } else if (wd->wlanMode == ZM_MODE_IBSS) {
- zfPowerSavingMgrIBSSMain(dev);
- }
- }
- break;
- case ZM_STA_STATE_CONNECTING:
- default:
- break;
- }
-}
-#else
-void zfPowerSavingMgrMain(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( wd->wlanMode != ZM_MODE_INFRASTRUCTURE )
- {
- return;
- }
-
- switch(wd->sta.psMgr.state)
- {
- case ZM_PS_MSG_STATE_ACTIVE:
- goto check_sleep;
- break;
-
- case ZM_PS_MSG_STATE_SLEEP:
- goto sleeping;
- break;
-
- case ZM_PS_MSG_STATE_T1:
- zfPowerSavingMgrOnHandleT1(dev);
- break;
-
- case ZM_PS_MSG_STATE_T2:
- zfPowerSavingMgrOnHandleT2(dev);
- break;
- }
-
- return;
-
-sleeping:
- return;
-
-check_sleep:
- zfPowerSavingMgrSleepIfIdle(dev);
- return;
-}
-#endif
-
-#ifdef ZM_ENABLE_POWER_SAVE
-void zfPowerSavingMgrWakeup(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-//zm_debug_msg0("zfPowerSavingMgrWakeup");
-
- //if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_ACTIVE && ( zfPowerSavingMgrIsIdle(dev) == 0 ))
- if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_ACTIVE )
- {
- zmw_enter_critical_section(dev);
-
- wd->sta.psMgr.isSleepAllowed = 0;
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_ACTIVE;
-
- if ( wd->sta.powerSaveMode > ZM_STA_PS_NONE )
- wd->sta.psMgr.tempWakeUp = 1;
-
- zmw_leave_critical_section(dev);
-
- // Wake up the CHIP now!!
- zfHpPowerSaveSetState(dev, 0);
- }
-}
-#else
-void zfPowerSavingMgrWakeup(zdev_t* dev)
-{
-}
-#endif
-
-void zfPowerSavingMgrProcessBeacon(zdev_t* dev, zbuf_t* buf)
-{
- u8_t length, bitmap;
- u16_t offset, n1, n2, q, r;
- zbuf_t* psBuf;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- if ( wd->sta.powerSaveMode == ZM_STA_PS_NONE )
- //if ( wd->sta.psMgr.state != ZM_PS_MSG_STATE_SLEEP )
- {
- return;
- }
-
- wd->sta.psMgr.isSleepAllowed = 1;
-
- offset = zfFindElement(dev, buf, ZM_WLAN_EID_TIM);
- if (offset != 0xffff)
- {
- length = zmw_rx_buf_readb(dev, buf, offset+1);
-
- if ( length > 3 )
- {
- n1 = zmw_rx_buf_readb(dev, buf, offset+4) & (~ZM_BIT_0);
- n2 = length + n1 - 4;
- q = wd->sta.aid >> 3;
- r = wd->sta.aid & 7;
-
- if ((q >= n1) && (q <= n2))
- {
- bitmap = zmw_rx_buf_readb(dev, buf, offset+5+q-n1);
-
- if ( (bitmap >> r) & ZM_BIT_0 )
- {
- //if ( wd->sta.powerSaveMode == ZM_STA_PS_FAST )
- if ( 0 )
- {
- wd->sta.psMgr.state = ZM_PS_MSG_STATE_S1;
- //zfSendPSPoll(dev);
- zfSendNullData(dev, 0);
- }
- else
- {
- if ((wd->sta.qosInfo&0xf) != 0xf)
- {
- /* send ps-poll */
- //printk("zfSendPSPoll #1\n");
-
- wd->sta.psMgr.isSleepAllowed = 0;
-
- switch (wd->sta.powerSaveMode)
- {
- case ZM_STA_PS_MAX:
- case ZM_STA_PS_FAST:
- //zm_debug_msg0("wake up and send PS-Poll\n");
- zfSendPSPoll(dev);
- break;
- case ZM_STA_PS_LIGHT:
- zm_debug_msg0("wake up and send null data\n");
-
- zmw_enter_critical_section(dev);
- wd->sta.psMgr.sleepAllowedtick = 400;
- zmw_leave_critical_section(dev);
-
- zfSendNullData(dev, 0);
- break;
- }
-
- wd->sta.psMgr.tempWakeUp = 0;
- }
- }
- }
- }
- }
- }
-
- while ((psBuf = zfQueueGet(dev, wd->sta.uapsdQ)) != NULL)
- {
- zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- }
-
- //printk("zfPowerSavingMgrProcessBeacon #1\n");
- zfPowerSavingMgrMain(dev);
-}
-
-void zfPowerSavingMgrConnectNotify(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- switch(wd->sta.powerSaveMode)
- {
- case ZM_STA_PS_NONE:
- zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
- break;
-
- case ZM_STA_PS_FAST:
- case ZM_STA_PS_MAX:
- case ZM_STA_PS_LIGHT:
- zfHpPowerSaveSetMode(dev, 0, 1, wd->beaconInterval);
- break;
-
- default:
- zfHpPowerSaveSetMode(dev, 0, 0, wd->beaconInterval);
- break;
- }
- }
-}
-
-void zfPowerSavingMgrPreTBTTInterrupt(zdev_t *dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- /* disable TBTT interrupt when change from connection to disconnect */
- if (zfStaIsDisconnect(dev)) {
- zfHpPowerSaveSetMode(dev, 0, 0, 0);
- zfPowerSavingMgrWakeup(dev);
- return;
- }
-
- zmw_enter_critical_section(dev);
- wd->sta.psMgr.ticks++;
-
- if ( wd->sta.psMgr.ticks < wd->sta.psMgr.maxSleepPeriods )
- {
- zmw_leave_critical_section(dev);
- return;
- }
- else
- {
- wd->sta.psMgr.ticks = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- zfPowerSavingMgrWakeup(dev);
-}
-
-/* Leave an empty line below to remove warning message on some compiler */
-
diff --git a/drivers/staging/otus/80211core/cscanmgr.c b/drivers/staging/otus/80211core/cscanmgr.c
deleted file mode 100644
index be7d8eb..0000000
--- a/drivers/staging/otus/80211core/cscanmgr.c
+++ /dev/null
@@ -1,533 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-
-void zfScanMgrInit(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->sta.scanMgr.scanReqs[0] = 0;
- wd->sta.scanMgr.scanReqs[1] = 0;
-
- wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
- wd->sta.scanMgr.scanStartDelay = 3;
- //wd->sta.scanMgr.scanStartDelay = 0;
-}
-
-u8_t zfScanMgrScanStart(zdev_t* dev, u8_t scanType)
-{
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg1("scanType = ", scanType);
-
- zmw_declare_for_critical_section();
-
- if ( scanType != ZM_SCAN_MGR_SCAN_INTERNAL &&
- scanType != ZM_SCAN_MGR_SCAN_EXTERNAL )
- {
- zm_debug_msg0("unknown scanType");
- return 1;
- }
- else if (zfStaIsConnecting(dev))
- {
- zm_debug_msg0("reject scan request due to connecting");
- return 1;
- }
-
- i = scanType - 1;
-
- zmw_enter_critical_section(dev);
-
- if ( wd->sta.scanMgr.scanReqs[i] == 1 )
- {
- zm_debug_msg1("scan rescheduled", scanType);
- goto scan_done;
- }
-
- wd->sta.scanMgr.scanReqs[i] = 1;
- zm_debug_msg1("scan scheduled: ", scanType);
-
- // If there's no scan pending, we do the scan right away.
- // If there's an internal scan and the new scan request is external one,
- // we will restart the scan.
- if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
- {
- goto schedule_scan;
- }
- else if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_INTERNAL &&
- scanType == ZM_SCAN_MGR_SCAN_EXTERNAL )
- {
- // Stop the internal scan & schedule external scan first
- zfTimerCancel(dev, ZM_EVENT_SCAN);
-
- /* Fix for WHQL sendrecv => we do not apply delay time in which the device
- stop transmitting packet when we already connect to some AP */
- wd->sta.bScheduleScan = FALSE;
-
- zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
- zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
-
- wd->sta.bChannelScan = FALSE;
- goto schedule_scan;
- }
- else
- {
- zm_debug_msg0("Scan is busy...waiting later to start\n");
- }
-
- zmw_leave_critical_section(dev);
- return 0;
-
-scan_done:
- zmw_leave_critical_section(dev);
- return 1;
-
-schedule_scan:
-
- wd->sta.bScheduleScan = TRUE;
-
- zfTimerSchedule(dev, ZM_EVENT_SCAN, wd->sta.scanMgr.scanStartDelay);
- wd->sta.scanMgr.scanStartDelay = 3;
- //wd->sta.scanMgr.scanStartDelay = 0;
- wd->sta.scanMgr.currScanType = scanType;
- zmw_leave_critical_section(dev);
-
- if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
- {
- zfSendNullData(dev, 1);
- }
- return 0;
-}
-
-void zfScanMgrScanStop(zdev_t* dev, u8_t scanType)
-{
- u8_t scanNotifyRequired = 0;
- u8_t theOtherScan = ZM_SCAN_MGR_SCAN_NONE;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
- {
- zm_assert(wd->sta.scanMgr.scanReqs[0] == 0);
- zm_assert(wd->sta.scanMgr.scanReqs[1] == 0);
- goto done;
- }
-
- switch(scanType)
- {
- case ZM_SCAN_MGR_SCAN_EXTERNAL:
- scanNotifyRequired = 1;
- theOtherScan = ZM_SCAN_MGR_SCAN_INTERNAL;
- break;
-
- case ZM_SCAN_MGR_SCAN_INTERNAL:
- theOtherScan = ZM_SCAN_MGR_SCAN_EXTERNAL;
- break;
-
- default:
- goto done;
- }
-
- if ( wd->sta.scanMgr.currScanType != scanType )
- {
- goto stop_done;
- }
-
- zfTimerCancel(dev, ZM_EVENT_SCAN);
-
- /* Fix for WHQL sendrecv => we do not apply delay time in which the device
- stop transmitting packet when we already connect to some AP */
- wd->sta.bScheduleScan = FALSE;
-
- zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
- zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
-
- wd->sta.bChannelScan = FALSE;
- wd->sta.scanFrequency = 0;
-
- if ( wd->sta.scanMgr.scanReqs[theOtherScan - 1] )
- {
- wd->sta.scanMgr.currScanType = theOtherScan;
-
- // Schedule the other scan after 1 second later
- zfTimerSchedule(dev, ZM_EVENT_SCAN, 100);
- }
- else
- {
- wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
- }
-
-stop_done:
- wd->sta.scanMgr.scanReqs[scanType - 1] = 0;
-
- zmw_leave_critical_section(dev);
-
- /* avoid lose receive packet when site survey */
- if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
- {
- zfSendNullData(dev, 0);
- }
-
- if ( scanNotifyRequired )
- {
- zm_debug_msg0("Scan notify after reset");
- if (wd->zfcbScanNotify != NULL)
- {
- wd->zfcbScanNotify(dev, NULL);
- }
- }
-
- return;
-
-done:
- zmw_leave_critical_section(dev);
- return;
-}
-
-void zfScanMgrScanAck(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- wd->sta.scanMgr.scanStartDelay = 3;
- //wd->sta.scanMgr.scanStartDelay = 0;
-
- zmw_leave_critical_section(dev);
- return;
-}
-
-extern void zfStaReconnect(zdev_t* dev);
-
-static void zfScanSendProbeRequest(zdev_t* dev)
-{
- u8_t k;
- u16_t dst[3] = { 0xffff, 0xffff, 0xffff };
-
- zmw_get_wlan_dev(dev);
-
- /* Increase rxBeaconCount to prevent beacon lost */
- if (zfStaIsConnected(dev))
- {
- wd->sta.rxBeaconCount++;
- }
-
- if ( wd->sta.bPassiveScan )
- {
- return;
- }
- /* enable 802.l11h and in DFS Band , disable sending probe request */
- if (wd->sta.DFSEnable)
- {
- if (zfHpIsDfsChannel(dev, wd->sta.scanFrequency))
- {
- return;
- }
- }
-
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, dst, 0, 0, 0);
-
- if ( wd->sta.disableProbingWithSsid )
- {
- return;
- }
-
- for (k=1; k<=ZM_MAX_PROBE_HIDDEN_SSID_SIZE; k++)
- {
- if ( wd->ws.probingSsidList[k-1].ssidLen != 0 )
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_PROBEREQ, dst, k, 0, 0);
- }
- }
-}
-
-static void zfScanMgrEventSetFreqCompleteCb(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
-//printk("zfScanMgrEventSetFreqCompleteCb #1\n");
-
- zmw_enter_critical_section(dev);
- zfTimerSchedule(dev, ZM_EVENT_IN_SCAN, ZM_TICK_IN_SCAN);
- if (wd->sta.bPassiveScan)
- {
- zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_SCAN, wd->sta.passiveScanTickPerChannel);
- }
- else
- {
- zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_SCAN, wd->sta.activescanTickPerChannel);
- }
- zmw_leave_critical_section(dev);
-
- zfScanSendProbeRequest(dev);
-}
-
-
-static void zfScanMgrEventScanCompleteCb(zdev_t* dev)
-{
- if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
- {
- zfSendNullData(dev, 0);
- }
- return;
-}
-
-
-void zfScanMgrScanEventRetry(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if ( !wd->sta.bChannelScan )
- {
- return;
- }
-
- if ( !wd->sta.bPassiveScan )
- {
- zfScanSendProbeRequest(dev);
- #if 0
- zmw_enter_critical_section(dev);
- zfTimerSchedule(dev, ZM_EVENT_IN_SCAN, ZM_TICK_IN_SCAN);
- zmw_leave_critical_section(dev);
- #endif
- }
-}
-
-u8_t zfScanMgrScanEventTimeout(zdev_t* dev)
-{
- u16_t nextScanFrequency = 0;
- u8_t temp;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if ( wd->sta.scanFrequency == 0 )
- {
- zmw_leave_critical_section(dev);
- return -1;
- }
-
- nextScanFrequency = zfChGetNextChannel(dev, wd->sta.scanFrequency,
- &wd->sta.bPassiveScan);
-
- if ( (nextScanFrequency == 0xffff)
- || (wd->sta.scanFrequency == zfChGetLastChannel(dev, &temp)) )
- {
- u8_t currScanType;
- u8_t isExternalScan = 0;
- u8_t isInternalScan = 0;
-
- //zm_debug_msg1("end scan = ", KeQueryInterruptTime());
- wd->sta.scanFrequency = 0;
-
- zm_debug_msg1("scan 1 type: ", wd->sta.scanMgr.currScanType);
- zm_debug_msg1("scan channel count = ", wd->regulationTable.allowChannelCnt);
-
- //zfBssInfoRefresh(dev);
- zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
-
- if ( wd->sta.bChannelScan == FALSE )
- {
- zm_debug_msg0("WOW!! scan is cancelled\n");
- zmw_leave_critical_section(dev);
- goto report_scan_result;
- }
-
-
- currScanType = wd->sta.scanMgr.currScanType;
- switch(currScanType)
- {
- case ZM_SCAN_MGR_SCAN_EXTERNAL:
- isExternalScan = 1;
-
- if ( wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_INTERNAL - 1] )
- {
- wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_INTERNAL - 1] = 0;
- isInternalScan = 1;
- }
-
- break;
-
- case ZM_SCAN_MGR_SCAN_INTERNAL:
- isInternalScan = 1;
-
- if ( wd->sta.scanMgr.scanReqs[ZM_SCAN_MGR_SCAN_EXTERNAL - 1] )
- {
- // Because the external scan should pre-empts internal scan.
- // So this shall not be happened!!
- zm_assert(0);
- }
-
- break;
-
- default:
- zm_assert(0);
- break;
- }
-
- wd->sta.scanMgr.scanReqs[currScanType - 1] = 0;
- wd->sta.scanMgr.scanStartDelay = 100;
- wd->sta.scanMgr.currScanType = ZM_SCAN_MGR_SCAN_NONE;
- zmw_leave_critical_section(dev);
-
- //Set channel according to AP's configuration
- zfCoreSetFrequencyEx(dev, wd->frequency, wd->BandWidth40,
- wd->ExtOffset, zfScanMgrEventScanCompleteCb);
-
- wd->sta.bChannelScan = FALSE;
-
- #if 1
- if (zfStaIsConnected(dev))
- { // Finish site survey, reset the variable to detect using wrong frequency !
- zfHpFinishSiteSurvey(dev, 1);
- zmw_enter_critical_section(dev);
- wd->sta.ibssSiteSurveyStatus = 2;
- wd->tickIbssReceiveBeacon = 0;
- wd->sta.ibssReceiveBeaconCount = 0;
- zmw_leave_critical_section(dev);
-
- /* #5 Re-enable RIFS function after the site survey ! */
- /* This is because switch band will reset the BB register to initial value */
- if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
- {
- zfHpEnableRifs(dev, ((wd->sta.currentFrequency<3000)?1:0), wd->sta.EnableHT, wd->sta.HT2040);
- }
- }
- else
- {
- zfHpFinishSiteSurvey(dev, 0);
- zmw_enter_critical_section(dev);
- wd->sta.ibssSiteSurveyStatus = 0;
- zmw_leave_critical_section(dev);
- }
- #endif
-
-report_scan_result:
- /* avoid lose receive packet when site survey */
- //if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
- //{
- // zfSendNullData(dev, 0);
- //}
-
- if ( isExternalScan )//Quickly reboot
- {
- if (wd->zfcbScanNotify != NULL)
- {
- wd->zfcbScanNotify(dev, NULL);
- }
- }
-
- if ( isInternalScan )
- {
- //wd->sta.InternalScanReq = 0;
- zfStaReconnect(dev);
- }
-
- return 0;
- }
- else
- {
- wd->sta.scanFrequency = nextScanFrequency;
-
- //zmw_enter_critical_section(dev);
- zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
- zmw_leave_critical_section(dev);
-
- zm_debug_msg0("scan 2");
- zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
-
- return 1;
- }
-}
-
-void zfScanMgrScanEventStart(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- if ( wd->sta.bChannelScan )
- {
- return;
- }
-
- zfPowerSavingMgrWakeup(dev);
-
- zmw_enter_critical_section(dev);
-
- if ( wd->sta.scanMgr.currScanType == ZM_SCAN_MGR_SCAN_NONE )
- {
- goto no_scan;
- }
-
- //zfBssInfoRefresh(dev);
- zfBssInfoRefresh(dev, 0);
- wd->sta.bChannelScan = TRUE;
- wd->sta.bScheduleScan = FALSE;
- zfTimerCancel(dev, ZM_EVENT_IN_SCAN);
- zfTimerCancel(dev, ZM_EVENT_TIMEOUT_SCAN);
-
- //zm_debug_msg1("start scan = ", KeQueryInterruptTime());
- wd->sta.scanFrequency = zfChGetFirstChannel(dev, &wd->sta.bPassiveScan);
- zmw_leave_critical_section(dev);
-
- /* avoid lose receive packet when site survey */
- //if ((zfStaIsConnected(dev)) && (!zfPowerSavingMgrIsSleeping(dev)))
- //{
- // zfSendNullData(dev, 1);
- //}
-// zm_debug_msg0("scan 0");
-// zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
-
- #if 1
- if (zfStaIsConnected(dev))
- {// If doing site survey !
- zfHpBeginSiteSurvey(dev, 1);
- zmw_enter_critical_section(dev);
- wd->sta.ibssSiteSurveyStatus = 1;
- zmw_leave_critical_section(dev);
- }
- else
- {
- zfHpBeginSiteSurvey(dev, 0);
- zmw_enter_critical_section(dev);
- wd->sta.ibssSiteSurveyStatus = 0;
- zmw_leave_critical_section(dev);
- }
- #endif
-
- zm_debug_msg0("scan 0");
- zfCoreSetFrequencyV2(dev, wd->sta.scanFrequency, zfScanMgrEventSetFreqCompleteCb);
-
- return;
-
-no_scan:
- zmw_leave_critical_section(dev);
- return;
-}
diff --git a/drivers/staging/otus/80211core/ctkip.c b/drivers/staging/otus/80211core/ctkip.c
deleted file mode 100644
index ca07402..0000000
--- a/drivers/staging/otus/80211core/ctkip.c
+++ /dev/null
@@ -1,599 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : ctkip.c */
-/* */
-/* Abstract */
-/* This module contains Tx and Rx functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-
-u16_t zgTkipSboxLower[256] =
- {
- 0xA5,0x84,0x99,0x8D,0x0D,0xBD,0xB1,0x54,
- 0x50,0x03,0xA9,0x7D,0x19,0x62,0xE6,0x9A,
- 0x45,0x9D,0x40,0x87,0x15,0xEB,0xC9,0x0B,
- 0xEC,0x67,0xFD,0xEA,0xBF,0xF7,0x96,0x5B,
- 0xC2,0x1C,0xAE,0x6A,0x5A,0x41,0x02,0x4F,
- 0x5C,0xF4,0x34,0x08,0x93,0x73,0x53,0x3F,
- 0x0C,0x52,0x65,0x5E,0x28,0xA1,0x0F,0xB5,
- 0x09,0x36,0x9B,0x3D,0x26,0x69,0xCD,0x9F,
- 0x1B,0x9E,0x74,0x2E,0x2D,0xB2,0xEE,0xFB,
- 0xF6,0x4D,0x61,0xCE,0x7B,0x3E,0x71,0x97,
- 0xF5,0x68,0x00,0x2C,0x60,0x1F,0xC8,0xED,
- 0xBE,0x46,0xD9,0x4B,0xDE,0xD4,0xE8,0x4A,
- 0x6B,0x2A,0xE5,0x16,0xC5,0xD7,0x55,0x94,
- 0xCF,0x10,0x06,0x81,0xF0,0x44,0xBA,0xE3,
- 0xF3,0xFE,0xC0,0x8A,0xAD,0xBC,0x48,0x04,
- 0xDF,0xC1,0x75,0x63,0x30,0x1A,0x0E,0x6D,
- 0x4C,0x14,0x35,0x2F,0xE1,0xA2,0xCC,0x39,
- 0x57,0xF2,0x82,0x47,0xAC,0xE7,0x2B,0x95,
- 0xA0,0x98,0xD1,0x7F,0x66,0x7E,0xAB,0x83,
- 0xCA,0x29,0xD3,0x3C,0x79,0xE2,0x1D,0x76,
- 0x3B,0x56,0x4E,0x1E,0xDB,0x0A,0x6C,0xE4,
- 0x5D,0x6E,0xEF,0xA6,0xA8,0xA4,0x37,0x8B,
- 0x32,0x43,0x59,0xB7,0x8C,0x64,0xD2,0xE0,
- 0xB4,0xFA,0x07,0x25,0xAF,0x8E,0xE9,0x18,
- 0xD5,0x88,0x6F,0x72,0x24,0xF1,0xC7,0x51,
- 0x23,0x7C,0x9C,0x21,0xDD,0xDC,0x86,0x85,
- 0x90,0x42,0xC4,0xAA,0xD8,0x05,0x01,0x12,
- 0xA3,0x5F,0xF9,0xD0,0x91,0x58,0x27,0xB9,
- 0x38,0x13,0xB3,0x33,0xBB,0x70,0x89,0xA7,
- 0xB6,0x22,0x92,0x20,0x49,0xFF,0x78,0x7A,
- 0x8F,0xF8,0x80,0x17,0xDA,0x31,0xC6,0xB8,
- 0xC3,0xB0,0x77,0x11,0xCB,0xFC,0xD6,0x3A
- };
-
-
-u16_t zgTkipSboxUpper[256] =
- {
- 0xC6,0xF8,0xEE,0xF6,0xFF,0xD6,0xDE,0x91,
- 0x60,0x02,0xCE,0x56,0xE7,0xB5,0x4D,0xEC,
- 0x8F,0x1F,0x89,0xFA,0xEF,0xB2,0x8E,0xFB,
- 0x41,0xB3,0x5F,0x45,0x23,0x53,0xE4,0x9B,
- 0x75,0xE1,0x3D,0x4C,0x6C,0x7E,0xF5,0x83,
- 0x68,0x51,0xD1,0xF9,0xE2,0xAB,0x62,0x2A,
- 0x08,0x95,0x46,0x9D,0x30,0x37,0x0A,0x2F,
- 0x0E,0x24,0x1B,0xDF,0xCD,0x4E,0x7F,0xEA,
- 0x12,0x1D,0x58,0x34,0x36,0xDC,0xB4,0x5B,
- 0xA4,0x76,0xB7,0x7D,0x52,0xDD,0x5E,0x13,
- 0xA6,0xB9,0x00,0xC1,0x40,0xE3,0x79,0xB6,
- 0xD4,0x8D,0x67,0x72,0x94,0x98,0xB0,0x85,
- 0xBB,0xC5,0x4F,0xED,0x86,0x9A,0x66,0x11,
- 0x8A,0xE9,0x04,0xFE,0xA0,0x78,0x25,0x4B,
- 0xA2,0x5D,0x80,0x05,0x3F,0x21,0x70,0xF1,
- 0x63,0x77,0xAF,0x42,0x20,0xE5,0xFD,0xBF,
- 0x81,0x18,0x26,0xC3,0xBE,0x35,0x88,0x2E,
- 0x93,0x55,0xFC,0x7A,0xC8,0xBA,0x32,0xE6,
- 0xC0,0x19,0x9E,0xA3,0x44,0x54,0x3B,0x0B,
- 0x8C,0xC7,0x6B,0x28,0xA7,0xBC,0x16,0xAD,
- 0xDB,0x64,0x74,0x14,0x92,0x0C,0x48,0xB8,
- 0x9F,0xBD,0x43,0xC4,0x39,0x31,0xD3,0xF2,
- 0xD5,0x8B,0x6E,0xDA,0x01,0xB1,0x9C,0x49,
- 0xD8,0xAC,0xF3,0xCF,0xCA,0xF4,0x47,0x10,
- 0x6F,0xF0,0x4A,0x5C,0x38,0x57,0x73,0x97,
- 0xCB,0xA1,0xE8,0x3E,0x96,0x61,0x0D,0x0F,
- 0xE0,0x7C,0x71,0xCC,0x90,0x06,0xF7,0x1C,
- 0xC2,0x6A,0xAE,0x69,0x17,0x99,0x3A,0x27,
- 0xD9,0xEB,0x2B,0x22,0xD2,0xA9,0x07,0x33,
- 0x2D,0x3C,0x15,0xC9,0x87,0xAA,0x50,0xA5,
- 0x03,0x59,0x09,0x1A,0x65,0xD7,0x84,0xD0,
- 0x82,0x29,0x5A,0x1E,0x7B,0xA8,0x6D,0x2C
- };
-
-u16_t zfrotr1(u16_t a)
-// rotate right by 1 bit.
-{
- u16_t b;
-
- if (a & 0x01)
- {
- b = (a >> 1) | 0x8000;
- }
- else
- {
- b = (a >> 1) & 0x7fff;
- }
- return b;
-}
-
-/*************************************************************/
-/* zfTkipSbox() */
-/* Returns a 16 bit value from a 64K entry table. The Table */
-/* is synthesized from two 256 entry byte wide tables. */
-/*************************************************************/
-u16_t zfTkipSbox(u16_t index)
-{
- u16_t low;
- u16_t high;
- u16_t left, right;
-
- low = (index & 0xFF);
- high = ((index >> 8) & 0xFF);
-
- left = zgTkipSboxLower[low] + (zgTkipSboxUpper[low] << 8 );
- right = zgTkipSboxUpper[high] + (zgTkipSboxLower[high] << 8 );
-
- return (left ^ right);
-}
-
-u8_t zfTkipPhase1KeyMix(u32_t iv32, struct zsTkipSeed* pSeed)
-{
- u16_t tsc0;
- u16_t tsc1;
- u16_t i, j;
-#if 0
- /* Need not proceed this function with the same iv32 */
- if ( iv32 == pSeed->iv32 )
- {
- return 1;
- }
-#endif
- tsc0 = (u16_t) ((iv32 >> 16) & 0xffff); /* msb */
- tsc1 = (u16_t) (iv32 & 0xffff);
-
- /* Phase 1, step 1 */
- pSeed->ttak[0] = tsc1;
- pSeed->ttak[1] = tsc0;
- pSeed->ttak[2] = (u16_t) (pSeed->ta[0] + (pSeed->ta[1] <<8));
- pSeed->ttak[3] = (u16_t) (pSeed->ta[2] + (pSeed->ta[3] <<8));
- pSeed->ttak[4] = (u16_t) (pSeed->ta[4] + (pSeed->ta[5] <<8));
-
- /* Phase 1, step 2 */
- for (i=0; i<8; i++)
- {
- j = 2*(i & 1);
- pSeed->ttak[0] =(pSeed->ttak[0] + zfTkipSbox(pSeed->ttak[4]
- ^ ZM_BYTE_TO_WORD(pSeed->tk[1+j], pSeed->tk[j])))
- & 0xffff;
- pSeed->ttak[1] =(pSeed->ttak[1] + zfTkipSbox(pSeed->ttak[0]
- ^ ZM_BYTE_TO_WORD(pSeed->tk[5+j], pSeed->tk[4+j] )))
- & 0xffff;
- pSeed->ttak[2] =(pSeed->ttak[2] + zfTkipSbox(pSeed->ttak[1]
- ^ ZM_BYTE_TO_WORD(pSeed->tk[9+j], pSeed->tk[8+j] )))
- & 0xffff;
- pSeed->ttak[3] =(pSeed->ttak[3] + zfTkipSbox(pSeed->ttak[2]
- ^ ZM_BYTE_TO_WORD(pSeed->tk[13+j], pSeed->tk[12+j])))
- & 0xffff;
- pSeed->ttak[4] =(pSeed->ttak[4] + zfTkipSbox(pSeed->ttak[3]
- ^ ZM_BYTE_TO_WORD(pSeed->tk[1+j], pSeed->tk[j] )))
- & 0xffff;
- pSeed->ttak[4] =(pSeed->ttak[4] + i) & 0xffff;
- }
-
- if ( iv32 == (pSeed->iv32+1) )
- {
- pSeed->iv32tmp = iv32;
- return 1;
- }
-
- return 0;
-}
-
-u8_t zfTkipPhase2KeyMix(u16_t iv16, struct zsTkipSeed* pSeed)
-{
- u16_t tsc2;
-
- tsc2 = iv16;
-
- /* Phase 2, Step 1 */
- pSeed->ppk[0] = pSeed->ttak[0];
- pSeed->ppk[1] = pSeed->ttak[1];
- pSeed->ppk[2] = pSeed->ttak[2];
- pSeed->ppk[3] = pSeed->ttak[3];
- pSeed->ppk[4] = pSeed->ttak[4];
- pSeed->ppk[5] = (pSeed->ttak[4] + tsc2) & 0xffff;
-
- /* Phase2, Step 2 */
- pSeed->ppk[0] = pSeed->ppk[0]
- + zfTkipSbox(pSeed->ppk[5] ^ ZM_BYTE_TO_WORD(pSeed->tk[1],pSeed->tk[0]));
- pSeed->ppk[1] = pSeed->ppk[1]
- + zfTkipSbox(pSeed->ppk[0] ^ ZM_BYTE_TO_WORD(pSeed->tk[3],pSeed->tk[2]));
- pSeed->ppk[2] = pSeed->ppk[2]
- + zfTkipSbox(pSeed->ppk[1] ^ ZM_BYTE_TO_WORD(pSeed->tk[5],pSeed->tk[4]));
- pSeed->ppk[3] = pSeed->ppk[3]
- + zfTkipSbox(pSeed->ppk[2] ^ ZM_BYTE_TO_WORD(pSeed->tk[7],pSeed->tk[6]));
- pSeed->ppk[4] = pSeed->ppk[4]
- + zfTkipSbox(pSeed->ppk[3] ^ ZM_BYTE_TO_WORD(pSeed->tk[9],pSeed->tk[8]));
- pSeed->ppk[5] = pSeed->ppk[5]
- + zfTkipSbox(pSeed->ppk[4] ^ ZM_BYTE_TO_WORD(pSeed->tk[11],pSeed->tk[10]));
-
- pSeed->ppk[0] = pSeed->ppk[0]
- + zfrotr1(pSeed->ppk[5] ^ ZM_BYTE_TO_WORD(pSeed->tk[13],pSeed->tk[12]));
- pSeed->ppk[1] = pSeed->ppk[1]
- + zfrotr1(pSeed->ppk[0] ^ ZM_BYTE_TO_WORD(pSeed->tk[15],pSeed->tk[14]));
- pSeed->ppk[2] = pSeed->ppk[2] + zfrotr1(pSeed->ppk[1]);
- pSeed->ppk[3] = pSeed->ppk[3] + zfrotr1(pSeed->ppk[2]);
- pSeed->ppk[4] = pSeed->ppk[4] + zfrotr1(pSeed->ppk[3]);
- pSeed->ppk[5] = pSeed->ppk[5] + zfrotr1(pSeed->ppk[4]);
-
- if (iv16 == 0)
- {
- if (pSeed->iv16 == 0xffff)
- {
- pSeed->iv16tmp=0;
- return 1;
- }
- else
- return 0;
- }
- else if (iv16 == (pSeed->iv16+1))
- {
- pSeed->iv16tmp = iv16;
- return 1;
- }
- else
- return 0;
-}
-
-void zfTkipInit(u8_t* key, u8_t* ta, struct zsTkipSeed* pSeed, u8_t* initIv)
-{
- u16_t iv16;
- u32_t iv32;
- u16_t i;
-
- /* clear memory */
- zfZeroMemory((u8_t*) pSeed, sizeof(struct zsTkipSeed));
- /* set key to seed */
- zfMemoryCopy(pSeed->ta, ta, 6);
- zfMemoryCopy(pSeed->tk, key, 16);
-
- iv16 = *initIv;
- initIv++;
- iv16 += *initIv<<8;
- initIv++;
-
- iv32=0;
-
- for(i=0; i<4; i++) // initiv is little endian
- {
- iv32 += *initIv<<(i*8);
- initIv++;
- }
-
- pSeed->iv32 = iv32+1; // Force Recalculating on Tkip Phase1
- zfTkipPhase1KeyMix(iv32, pSeed);
-
- pSeed->iv16 = iv16;
- pSeed->iv32 = iv32;
-}
-
-u32_t zfGetU32t(u8_t* p)
-{
- u32_t res=0;
- u16_t i;
-
- for( i=0; i<4; i++ )
- {
- res |= (*p++) << (8*i);
- }
-
- return res;
-
-}
-
-void zfPutU32t(u8_t* p, u32_t value)
-{
- u16_t i;
-
- for(i=0; i<4; i++)
- {
- *p++ = (u8_t) (value & 0xff);
- value >>= 8;
- }
-}
-
-void zfMicClear(struct zsMicVar* pMic)
-{
- pMic->left = pMic->k0;
- pMic->right = pMic->k1;
- pMic->nBytes = 0;
- pMic->m = 0;
-}
-
-void zfMicSetKey(u8_t* key, struct zsMicVar* pMic)
-{
- pMic->k0 = zfGetU32t(key);
- pMic->k1 = zfGetU32t(key+4);
- zfMicClear(pMic);
-}
-
-void zfMicAppendByte(u8_t b, struct zsMicVar* pMic)
-{
- // Append the byte to our word-sized buffer
- pMic->m |= b << (8* pMic->nBytes);
- pMic->nBytes++;
-
- // Process the word if it is full.
- if ( pMic->nBytes >= 4 )
- {
- pMic->left ^= pMic->m;
- pMic->right ^= ZM_ROL32(pMic->left, 17 );
- pMic->left += pMic->right;
- pMic->right ^= ((pMic->left & 0xff00ff00) >> 8) |
- ((pMic->left & 0x00ff00ff) << 8);
- pMic->left += pMic->right;
- pMic->right ^= ZM_ROL32( pMic->left, 3 );
- pMic->left += pMic->right;
- pMic->right ^= ZM_ROR32( pMic->left, 2 );
- pMic->left += pMic->right;
- // Clear the buffer
- pMic->m = 0;
- pMic->nBytes = 0;
- }
-}
-
-void zfMicGetMic(u8_t* dst, struct zsMicVar* pMic)
-{
- // Append the minimum padding
- zfMicAppendByte(0x5a, pMic);
- zfMicAppendByte(0, pMic);
- zfMicAppendByte(0, pMic);
- zfMicAppendByte(0, pMic);
- zfMicAppendByte(0, pMic);
-
- // and then zeroes until the length is a multiple of 4
- while( pMic->nBytes != 0 )
- {
- zfMicAppendByte(0, pMic);
- }
-
- // The appendByte function has already computed the result.
- zfPutU32t(dst, pMic->left);
- zfPutU32t(dst+4, pMic->right);
-
- // Reset to the empty message.
- zfMicClear(pMic);
-
-}
-
-u8_t zfMicRxVerify(zdev_t* dev, zbuf_t* buf)
-{
- struct zsMicVar* pMicKey;
- struct zsMicVar MyMicKey;
- u8_t mic[8];
- u8_t da[6];
- u8_t sa[6];
- u8_t bValue;
- u16_t i, payloadOffset, tailOffset;
-
- zmw_get_wlan_dev(dev);
-
- /* need not check MIC if pMicKEy is equal to NULL */
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- pMicKey = zfApGetRxMicKey(dev, buf);
-
- if ( pMicKey != NULL )
- {
- zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A2_OFFSET, 6);
- zfCopyFromRxBuffer(dev, buf, da, ZM_WLAN_HEADER_A3_OFFSET, 6);
- }
- else
- {
- return ZM_MIC_SUCCESS;
- }
- }
- else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- pMicKey = zfStaGetRxMicKey(dev, buf);
-
- if ( pMicKey != NULL )
- {
- zfCopyFromRxBuffer(dev, buf, sa, ZM_WLAN_HEADER_A3_OFFSET, 6);
- zfCopyFromRxBuffer(dev, buf, da, ZM_WLAN_HEADER_A1_OFFSET, 6);
- }
- else
- {
- return ZM_MIC_SUCCESS;
- }
- }
- else
- {
- return ZM_MIC_SUCCESS;
- }
-
- MyMicKey.k0=pMicKey->k0;
- MyMicKey.k1=pMicKey->k1;
- pMicKey = &MyMicKey;
-
- zfMicClear(pMicKey);
- tailOffset = zfwBufGetSize(dev, buf);
- tailOffset -= 8;
-
- /* append DA */
- for(i=0; i<6; i++)
- {
- zfMicAppendByte(da[i], pMicKey);
- }
- /* append SA */
- for(i=0; i<6; i++)
- {
- zfMicAppendByte(sa[i], pMicKey);
- }
-
- /* append for alignment */
- if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) != 0)
- zfMicAppendByte(zmw_rx_buf_readb(dev, buf,24)&0x7, pMicKey);
- else
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
-
- /* append payload */
- payloadOffset = ZM_SIZE_OF_WLAN_DATA_HEADER +
- ZM_SIZE_OF_IV +
- ZM_SIZE_OF_EXT_IV;
-
- if ((zmw_rx_buf_readb(dev, buf, 0) & 0x80) != 0)
- {
- /* Qos Packet, Plcpheader + 2 */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- /* TODO : Rx Qos element offset in software MIC check */
- }
- else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- if (wd->sta.wmeConnected != 0)
- {
- payloadOffset += 2;
- }
- }
- }
-
- for(i=payloadOffset; i<tailOffset; i++)
- {
- bValue = zmw_rx_buf_readb(dev, buf, i);
- zfMicAppendByte(bValue, pMicKey);
- }
-
- zfMicGetMic(mic, pMicKey);
-
- if ( !zfRxBufferEqualToStr(dev, buf, mic, tailOffset, 8) )
- {
- return ZM_MIC_FAILURE;
- }
-
- return ZM_MIC_SUCCESS;
-}
-
-void zfTkipGetseeds(u16_t iv16, u8_t *RC4Key, struct zsTkipSeed *Seed)
-{
- RC4Key[0] = ZM_HI8(iv16);
- RC4Key[1] = (ZM_HI8(iv16) | 0x20) & 0x7f;
- RC4Key[2] = ZM_LO8(iv16);
- RC4Key[3] = ((Seed->ppk[5] ^ ZM_BYTE_TO_WORD(Seed->tk[1],Seed->tk[0]))>>1) & 0xff;
- RC4Key[4] = Seed->ppk[0] & 0xff;
- RC4Key[5] = Seed->ppk[0] >> 8;
- RC4Key[6] = Seed->ppk[1] & 0xff;
- RC4Key[7] = Seed->ppk[1] >> 8;
- RC4Key[8] = Seed->ppk[2] & 0xff;
- RC4Key[9] = Seed->ppk[2] >> 8;
- RC4Key[10] = Seed->ppk[3] & 0xff;
- RC4Key[11] = Seed->ppk[3] >> 8;
- RC4Key[12] = Seed->ppk[4] & 0xff;
- RC4Key[13] = Seed->ppk[4] >> 8;
- RC4Key[14] = Seed->ppk[5] & 0xff;
- RC4Key[15] = Seed->ppk[5] >> 8;
-}
-
-void zfCalTxMic(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u16_t *da, u16_t *sa, u8_t up, u8_t *mic)
-{
- struct zsMicVar* pMicKey;
- u16_t i;
- u16_t len;
- u8_t bValue;
- u8_t qosType;
- u8_t *pDa = (u8_t *)da;
- u8_t *pSa = (u8_t *)sa;
-
- zmw_get_wlan_dev(dev);
-
- /* need not check MIC if pMicKEy is equal to NULL */
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- pMicKey = zfApGetTxMicKey(dev, buf, &qosType);
-
- if ( pMicKey == NULL )
- return;
- }
- else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- pMicKey = zfStaGetTxMicKey(dev, buf);
-
- if ( pMicKey == NULL )
- {
- zm_debug_msg0("pMicKey is NULL");
- return;
- }
- }
- else
- {
- return;
- }
-
- zfMicClear(pMicKey);
- len = zfwBufGetSize(dev, buf);
-
- /* append DA */
- for(i = 0; i < 6; i++)
- {
- zfMicAppendByte(pDa[i], pMicKey);
- }
-
- /* append SA */
- for(i = 0; i < 6; i++)
- {
- zfMicAppendByte(pSa[i], pMicKey);
- }
-
- if (up != 0)
- zfMicAppendByte((up&0x7), pMicKey);
- else
- zfMicAppendByte(0, pMicKey);
-
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
-
- /* For Snap header */
- for(i = 0; i < snapLen; i++)
- {
- zfMicAppendByte(snap[i], pMicKey);
- }
-
- for(i = offset; i < len; i++)
- {
- bValue = zmw_tx_buf_readb(dev, buf, i);
- zfMicAppendByte(bValue, pMicKey);
- }
-
- zfMicGetMic(mic, pMicKey);
-}
-
-void zfTKIPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* key, u32_t* icv)
-{
- u8_t iv[3];
-
- iv[0] = key[0];
- iv[1] = key[1];
- iv[2] = key[2];
-
- keyLen -= 3;
-
- zfWEPEncrypt(dev, buf, snap, snapLen, offset, keyLen, &key[3], iv);
-}
-
-u16_t zfTKIPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* key)
-{
- u16_t ret = ZM_ICV_SUCCESS;
- u8_t iv[3];
-
- iv[0] = key[0];
- iv[1] = key[1];
- iv[2] = key[2];
-
- keyLen -= 3;
-
- ret = zfWEPDecrypt(dev, buf, offset, keyLen, &key[3], iv);
-
- return ret;
-}
diff --git a/drivers/staging/otus/80211core/ctxrx.c b/drivers/staging/otus/80211core/ctxrx.c
deleted file mode 100644
index 135167d..0000000
--- a/drivers/staging/otus/80211core/ctxrx.c
+++ /dev/null
@@ -1,4115 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : htr.c */
-/* */
-/* Abstract */
-/* This module contains Tx and Rx functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-
-u16_t zfWlanRxValidate(zdev_t* dev, zbuf_t* buf);
-u16_t zfWlanRxFilter(zdev_t* dev, zbuf_t* buf);
-
-
-
-const u8_t zgSnapBridgeTunnel[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0xF8 };
-const u8_t zgSnap8021h[6] = { 0xAA, 0xAA, 0x03, 0x00, 0x00, 0x00 };
-/* Table for converting IP DSCP P2-P0 bits to 802.11e Access Category */
-const u8_t zcUpToAc[8] = {0, 1, 1, 0, 2, 2, 3, 3}; //WMM default
-//const u8_t zcUpToAc[8] = {0, 1, 1, 0, 0, 0, 0, 0}; //For 2 TxQ
-//const u8_t zcUpToAc[8] = {0, 0, 0, 0, 0, 0, 0, 0}; //For single TxQ
-const u8_t zcMaxspToPktNum[4] = {8, 2, 4, 6};
-
-u8_t zfGetEncryModeFromRxStatus(struct zsAdditionInfo* addInfo)
-{
- u8_t securityByte;
- u8_t encryMode;
-
- securityByte = (addInfo->Tail.Data.SAIndex & 0xc0) >> 4; /* byte4 */
- securityByte |= (addInfo->Tail.Data.DAIndex & 0xc0) >> 6; /* byte5 */
-
- switch( securityByte )
- {
- case ZM_NO_WEP:
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
-#endif //ZM_ENABLE_CENC
- case ZM_TKIP:
- case ZM_AES:
-
- encryMode = securityByte;
- break;
-
- default:
-
- if ( (securityByte & 0xf8) == 0x08 )
- {
- // decrypted by software
- }
-
- encryMode = ZM_NO_WEP;
- break;
- }
-
- return encryMode;
-}
-
-void zfGetRxIvIcvLength(zdev_t* dev, zbuf_t* buf, u8_t vap, u16_t* pIvLen,
- u16_t* pIcvLen, struct zsAdditionInfo* addInfo)
-{
- u16_t wdsPort;
- u8_t encryMode;
-
- zmw_get_wlan_dev(dev);
-
- *pIvLen = 0;
- *pIcvLen = 0;
-
- encryMode = zfGetEncryModeFromRxStatus(addInfo);
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- if (vap < ZM_MAX_AP_SUPPORT)
- {
- if (( wd->ap.encryMode[vap] == ZM_WEP64 ) ||
- ( wd->ap.encryMode[vap] == ZM_WEP128 ) ||
- ( wd->ap.encryMode[vap] == ZM_WEP256 ))
- {
- *pIvLen = 4;
- *pIcvLen = 4;
- }
- else
- {
- u16_t id;
- u16_t addr[3];
-
- addr[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
- addr[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
- addr[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
-
- /* Find STA's information */
- id = zfApFindSta(dev, addr);
- if (id != 0xffff)
- {
- if (wd->ap.staTable[id].encryMode == ZM_TKIP)
- {
- *pIvLen = 8;
- *pIcvLen = 4;
- }
- else if (wd->ap.staTable[id].encryMode == ZM_AES)
- {
- *pIvLen = 8;
- *pIcvLen = 8; // AES MIC
- //*pIcvLen = 0;
- }
-#ifdef ZM_ENABLE_CENC
- else if (wd->ap.staTable[id].encryMode == ZM_CENC)
- {
- *pIvLen = 18;
- *pIcvLen= 16;
- }
-#endif //ZM_ENABLE_CENC
- }
- }
- /* WDS port checking */
- wdsPort = vap - 0x20;
- if (wdsPort >= ZM_MAX_WDS_SUPPORT)
- {
- wdsPort = 0;
- }
-
- switch (wd->ap.wds.encryMode[wdsPort])
- {
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
- *pIvLen = 4;
- *pIcvLen = 4;
- break;
- case ZM_TKIP:
- *pIvLen = 8;
- *pIcvLen = 4;
- break;
- case ZM_AES:
- *pIvLen = 8;
- *pIcvLen = 0;
- break;
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
- *pIvLen = 18;
- *pIcvLen = 16;
- break;
-#endif //ZM_ENABLE_CENC
- }/* end of switch */
- }
- }
- else if ( wd->wlanMode == ZM_MODE_PSEUDO)
- {
- /* test: 6518 for QA auto test */
- switch (encryMode)
- {
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
- *pIvLen = 4;
- *pIcvLen = 4;
- break;
- case ZM_TKIP:
- *pIvLen = 8;
- *pIcvLen = 4;
- break;
- case ZM_AES:
- *pIvLen = 8;
- *pIcvLen = 0;
- break;
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
- *pIvLen = 18;
- *pIcvLen = 16;
-#endif //ZM_ENABLE_CENC
- }/* end of switch */
- }
- else
- {
- if ( (encryMode == ZM_WEP64)||
- (encryMode == ZM_WEP128)||
- (encryMode == ZM_WEP256) )
- {
- *pIvLen = 4;
- *pIcvLen = 4;
- }
- else if ( encryMode == ZM_TKIP )
- {
- *pIvLen = 8;
- *pIcvLen = 4;
- }
- else if ( encryMode == ZM_AES )
- {
- *pIvLen = 8;
- *pIcvLen = 8; // AES MIC
- }
-#ifdef ZM_ENABLE_CENC
- else if ( encryMode == ZM_CENC)
- {
- *pIvLen = 18;
- *pIcvLen= 16;
- }
-#endif //ZM_ENABLE_CENC
- }
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAgingDefragList */
-/* Force flushing whole defrag list or aging the buffer */
-/* in the defrag list. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* flushFlag : 1=>flushing, 0=>Aging */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-void zfAgingDefragList(zdev_t* dev, u16_t flushFlag)
-{
- u16_t i, j;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- for(i=0; i<ZM_MAX_DEFRAG_ENTRIES; i++)
- {
- if (wd->defragTable.defragEntry[i].fragCount != 0 )
- {
- if (((wd->tick - wd->defragTable.defragEntry[i].tick) >
- (ZM_DEFRAG_AGING_TIME_SEC * ZM_TICK_PER_SECOND))
- || (flushFlag != 0))
- {
- zm_msg1_rx(ZM_LV_2, "Aging defrag list :", i);
- /* Free the buffers in the defrag list */
- for (j=0; j<wd->defragTable.defragEntry[i].fragCount; j++)
- {
- zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[j], 0);
- }
- }
- }
- wd->defragTable.defragEntry[i].fragCount = 0;
- }
-
- zmw_leave_critical_section(dev);
-
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAddFirstFragToDefragList */
-/* Add first fragment to defragment list, the first empty entry */
-/* will be selected. If the list is full, sequentially select */
-/* one entry for replacement. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : first fragment buffer */
-/* addr : address of first fragment buffer */
-/* seqNum : sequence of first fragment buffer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-void zfAddFirstFragToDefragList(zdev_t* dev, zbuf_t* buf, u8_t* addr, u16_t seqNum)
-{
- u16_t i, j;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- /* Find an empty one in defrag list */
- for(i=0; i<ZM_MAX_DEFRAG_ENTRIES; i++)
- {
- if ( wd->defragTable.defragEntry[i].fragCount == 0 )
- {
- break;
- }
- }
-
- /* If full, sequentially replace existing one */
- if (i == ZM_MAX_DEFRAG_ENTRIES)
- {
- i = wd->defragTable.replaceNum++ & (ZM_MAX_DEFRAG_ENTRIES-1);
- /* Free the buffers in the defrag list to be replaced */
- for (j=0; j<wd->defragTable.defragEntry[i].fragCount; j++)
- {
- zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[j], 0);
- }
- }
-
- wd->defragTable.defragEntry[i].fragCount = 1;
- wd->defragTable.defragEntry[i].fragment[0] = buf;
- wd->defragTable.defragEntry[i].seqNum = seqNum;
- wd->defragTable.defragEntry[i].tick = wd->tick;
-
- for (j=0; j<6; j++)
- {
- wd->defragTable.defragEntry[i].addr[j] = addr[j];
- }
-
- zmw_leave_critical_section(dev);
-
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfAddFragToDefragList */
-/* Add middle or last fragment to defragment list. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : first fragment buffer */
-/* addr : address of fragment buffer */
-/* seqNum : sequence fragment buffer */
-/* fragNum : fragment number of fragment buffer */
-/* moreFrag : more frag bit of fragment buffer */
-/* addInfo : addition info of fragment buffer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-zbuf_t* zfAddFragToDefragList(zdev_t* dev, zbuf_t* buf, u8_t* addr,
- u16_t seqNum, u8_t fragNum, u8_t moreFrag,
- struct zsAdditionInfo* addInfo)
-{
- u16_t i, j, k;
- zbuf_t* returnBuf = NULL;
- u16_t defragDone = 0;
- u16_t lenErr = 0;
- u16_t startAddr, fragHead, frameLen, ivLen, icvLen;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- /* Find frag in the defrag list */
- for(i=0; i<ZM_MAX_DEFRAG_ENTRIES; i++)
- {
- if ( wd->defragTable.defragEntry[i].fragCount != 0 )
- {
- /* Compare address */
- for (j=0; j<6; j++)
- {
- if (addr[j] != wd->defragTable.defragEntry[i].addr[j])
- {
- break;
- }
- }
- if (j == 6)
- {
- /* Compare sequence and fragment number */
- if (seqNum == wd->defragTable.defragEntry[i].seqNum)
- {
- if ((fragNum == wd->defragTable.defragEntry[i].fragCount)
- && (fragNum < 8))
- {
- /* Add frag frame to defrag list */
- wd->defragTable.defragEntry[i].fragment[fragNum] = buf;
- wd->defragTable.defragEntry[i].fragCount++;
- defragDone = 1;
-
- if (moreFrag == 0)
- {
- /* merge all fragment if more data bit is cleared */
- returnBuf = wd->defragTable.defragEntry[i].fragment[0];
- startAddr = zfwBufGetSize(dev, returnBuf);
- /* skip WLAN header 24(Data) or 26(QoS Data) */
- fragHead = 24 + ((zmw_rx_buf_readh(dev, returnBuf, 0) & 0x80) >> 6);
- zfGetRxIvIcvLength(dev, returnBuf, 0, &ivLen, &icvLen, addInfo);
- fragHead += ivLen; /* skip IV */
- for(k=1; k<wd->defragTable.defragEntry[i].fragCount; k++)
- {
- frameLen = zfwBufGetSize(dev,
- wd->defragTable.defragEntry[i].fragment[k]);
- if ((startAddr+frameLen-fragHead) < 1560)
- {
- zfRxBufferCopy(dev, returnBuf, wd->defragTable.defragEntry[i].fragment[k],
- startAddr, fragHead, frameLen-fragHead);
- startAddr += (frameLen-fragHead);
- }
- else
- {
- lenErr = 1;
- }
- zfwBufFree(dev, wd->defragTable.defragEntry[i].fragment[k], 0);
- }
-
- wd->defragTable.defragEntry[i].fragCount = 0;
- zfwBufSetSize(dev, returnBuf, startAddr);
- }
- break;
- }
- }
- }
- }
- }
-
- zmw_leave_critical_section(dev);
-
- if (lenErr == 1)
- {
- zfwBufFree(dev, returnBuf, 0);
- return NULL;
- }
- if (defragDone == 0)
- {
- zfwBufFree(dev, buf, 0);
- return NULL;
- }
-
- return returnBuf;
-}
-
-
-/* return value = NULL => save or free this frame */
-zbuf_t* zfDefragment(zdev_t* dev, zbuf_t* buf, u8_t* pbIsDefrag,
- struct zsAdditionInfo* addInfo)
-{
- u8_t fragNum;
- u16_t seqNum;
- u8_t moreFragBit;
- u8_t addr[6];
- u16_t i;
- zmw_get_wlan_dev(dev);
-
- ZM_BUFFER_TRACE(dev, buf)
-
- *pbIsDefrag = FALSE;
- seqNum = zmw_buf_readh(dev, buf, 22);
- fragNum = (u8_t)(seqNum & 0xf);
- moreFragBit = (zmw_buf_readb(dev, buf, 1) & ZM_BIT_2) >> 2;
-
- if ((fragNum == 0) && (moreFragBit == 0))
- {
- /* Not part of a fragmentation */
-
- return buf;
- }
- else
- {
- wd->commTally.swRxFragmentCount++;
- seqNum = seqNum >> 4;
- for (i=0; i<6; i++)
- {
- addr[i] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+i);
- }
-
- if (fragNum == 0)
- {
- /* more frag = 1 */
- /* First part of a fragmentation */
- zm_msg1_rx(ZM_LV_2, "First Frag, seq=", seqNum);
- zfAddFirstFragToDefragList(dev, buf, addr, seqNum);
- buf = NULL;
- }
- else
- {
- /* Middle or last part of a fragmentation */
- zm_msg1_rx(ZM_LV_2, "Frag seq=", seqNum);
- zm_msg1_rx(ZM_LV_2, "Frag moreFragBit=", moreFragBit);
- buf = zfAddFragToDefragList(dev, buf, addr, seqNum, fragNum, moreFragBit, addInfo);
- if (buf != NULL)
- {
- *pbIsDefrag = TRUE;
- }
- }
- }
-
- return buf;
-}
-
-
-#if ZM_PROTOCOL_RESPONSE_SIMULATION
-u16_t zfSwap(u16_t num)
-{
- return ((num >> 8) + ((num & 0xff) << 8));
-}
-
-
-void zfProtRspSim(zdev_t* dev, zbuf_t* buf)
-{
- u16_t ethType;
- u16_t arpOp;
- u16_t prot;
- u16_t temp;
- u16_t i;
- u16_t dip[2];
- u16_t dstPort;
- u16_t srcPort;
-
- ethType = zmw_rx_buf_readh(dev, buf, 12);
- zm_msg2_rx(ZM_LV_2, "ethType=", ethType);
-
- /* ARP */
- if (ethType == 0x0608)
- {
- arpOp = zmw_rx_buf_readh(dev, buf, 20);
- dip[0] = zmw_rx_buf_readh(dev, buf, 38);
- dip[1] = zmw_rx_buf_readh(dev, buf, 40);
- zm_msg2_rx(ZM_LV_2, "arpOp=", arpOp);
- zm_msg2_rx(ZM_LV_2, "ip0=", dip[0]);
- zm_msg2_rx(ZM_LV_2, "ip1=", dip[1]);
-
- //ARP request to 192.168.1.15
- if ((arpOp == 0x0100) && (dip[0] == 0xa8c0) && (dip[1] == 0x0f01)) {
- zm_msg0_rx(ZM_LV_2, "ARP");
- /* ARP response */
- zmw_rx_buf_writeh(dev, buf, 20, 0x0200);
-
- /* dst hardware address */
-
- /* src hardware address */
- //zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
- //zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
- //zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
-
- /* dst ip address */
- for (i=0; i<5; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 22+(i*2));
- zmw_rx_buf_writeh(dev, buf, 32+(i*2), temp);
- }
-
- /* src hardware address */
- zmw_rx_buf_writeh(dev, buf, 22, 0xa000);
- zmw_rx_buf_writeh(dev, buf, 24, 0x0000);
- zmw_rx_buf_writeh(dev, buf, 26, 0x0000);
-
- /* src ip address */
- zmw_rx_buf_writeh(dev, buf, 28, 0xa8c0);
- zmw_rx_buf_writeh(dev, buf, 30, 0x0f01);
- }
- }
- /* ICMP */
- else if (ethType == 0x0008)
- {
- zm_msg0_rx(ZM_LV_2, "IP");
- prot = zmw_rx_buf_readb(dev, buf, 23);
- dip[0] = zmw_rx_buf_readh(dev, buf, 30);
- dip[1] = zmw_rx_buf_readh(dev, buf, 32);
- zm_msg2_rx(ZM_LV_2, "prot=", prot);
- zm_msg2_rx(ZM_LV_2, "ip0=", dip[0]);
- zm_msg2_rx(ZM_LV_2, "ip1=", dip[1]);
-
- /* PING request to 192.168.1.15 */
- if ((prot == 0x1) && (dip[0] == 0xa8c0) && (dip[1] == 0x0f01))
- {
- zm_msg0_rx(ZM_LV_2, "ICMP");
- /* change dst */
- for (i=0; i<3; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 6+(i*2));
- zmw_rx_buf_writeh(dev, buf, i*2, temp);
- }
- /* change src */
- zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
- zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
- zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
-
- /* exchange src ip and dst ip */
- for (i=0; i<2; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 26+(i*2));
- zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp);
- }
- zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0);
- zmw_rx_buf_writeh(dev, buf, 28, 0x0f01);
-
- /* change icmp type to echo reply */
- zmw_rx_buf_writeb(dev, buf, 34, 0x0);
-
- /* update icmp checksum */
- temp = zmw_rx_buf_readh(dev, buf, 36);
- temp += 8;
- zmw_rx_buf_writeh(dev, buf, 36, temp);
- }
- else if (prot == 0x6)
- {
- zm_msg0_rx(ZM_LV_2, "TCP");
- srcPort = zmw_rx_buf_readh(dev, buf, 34);
- dstPort = zmw_rx_buf_readh(dev, buf, 36);
- zm_msg2_rx(ZM_LV_2, "Src Port=", srcPort);
- zm_msg2_rx(ZM_LV_2, "Dst Port=", dstPort);
- if ((dstPort == 0x1500) || (srcPort == 0x1500))
- {
- zm_msg0_rx(ZM_LV_2, "FTP");
-
- /* change dst */
- for (i=0; i<3; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 6+(i*2));
- zmw_rx_buf_writeh(dev, buf, i*2, temp);
- }
- /* change src */
- zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
- zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
- zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
-
- /* exchange src ip and dst ip */
- for (i=0; i<2; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 26+(i*2));
- zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp);
- }
- zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0);
- zmw_rx_buf_writeh(dev, buf, 28, 0x0f01);
-#if 0
- /* Patch src port */
- temp = zmw_rx_buf_readh(dev, buf, 34);
- temp = zfSwap(zfSwap(temp) + 1);
- zmw_rx_buf_writeh(dev, buf, 34, temp);
- temp = zmw_rx_buf_readh(dev, buf, 38);
- temp = zfSwap(zfSwap(temp) + 1);
- zmw_rx_buf_writeh(dev, buf, 38, temp);
-
- /* Patch checksum */
- temp = zmw_rx_buf_readh(dev, buf, 50);
- temp = zfSwap(temp);
- temp = ~temp;
- temp += 2;
- temp = ~temp;
- temp = zfSwap(temp);
- zmw_rx_buf_writeh(dev, buf, 50, temp);
-#endif
- }
-
- }
- else if (prot == 0x11)
- {
- /* change dst */
- for (i=0; i<3; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 6+(i*2));
- zmw_rx_buf_writeh(dev, buf, i*2, temp);
- }
- /* change src */
- zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
- zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
- zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
-
- zm_msg0_rx(ZM_LV_2, "UDP");
- srcPort = zmw_rx_buf_readh(dev, buf, 34);
- dstPort = zmw_rx_buf_readh(dev, buf, 36);
- zm_msg2_rx(ZM_LV_2, "Src Port=", srcPort);
- zm_msg2_rx(ZM_LV_2, "Dst Port=", dstPort);
-
- /* exchange src ip and dst ip */
- for (i=0; i<2; i++)
- {
- temp = zmw_rx_buf_readh(dev, buf, 26+(i*2));
- zmw_rx_buf_writeh(dev, buf, 30+(i*2), temp);
- }
- zmw_rx_buf_writeh(dev, buf, 26, 0xa8c0);
- zmw_rx_buf_writeh(dev, buf, 28, 0x0f01);
-
- /* exchange port */
- zmw_rx_buf_writeh(dev, buf, 34, srcPort+1);
- zmw_rx_buf_writeh(dev, buf, 36, dstPort);
-
- /* checksum = 0 */
- zmw_rx_buf_writeh(dev, buf, 40, 0);
- }
-
- }
- else if (ethType == 0x0060) /* =>0x0060 is port */
- {
- /* change src for Evl tool loop back receive */
- zmw_rx_buf_writeh(dev, buf, 6, 0xa000);
- zmw_rx_buf_writeh(dev, buf, 8, 0x0000);
- zmw_rx_buf_writeh(dev, buf, 10, 0x0000);
- }
-
-}
-#endif
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiTxSendEth */
-/* Called to native 802.11 management frames */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer pointer */
-/* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */
-/* */
-/* OUTPUTS */
-/* error code */
-/* */
-/* AUTHOR */
-/* Ray ZyDAS Technology Corporation 2005.5 */
-/* */
-/************************************************************************/
-u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port)
-{
- u16_t err;
- //u16_t addrTblSize = 0;
- //struct zsAddrTbl addrTbl;
- u16_t hlen;
- u16_t header[(24+25+1)/2];
- int i;
-
- for(i=0;i<12;i++)
- {
- header[i] = zmw_buf_readh(dev, buf, i);
- }
- hlen = 24;
-
- zfwBufRemoveHead(dev, buf, 24);
-
- err = zfHpSend(dev, header, hlen, NULL, 0, NULL, 0, buf, 0,
- ZM_EXTERNAL_ALLOC_BUF, 0, 0);
- if (err != ZM_SUCCESS)
- {
- goto zlError;
- }
-
- return 0;
-
-zlError:
-
- zfwBufFree(dev, buf, 0);
- return 0;
-}
-
-u8_t zfiIsTxQueueFull(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if ((((wd->vtxqHead[0] + 1) & ZM_VTXQ_SIZE_MASK) != wd->vtxqTail[0]) )
- {
- zmw_leave_critical_section(dev);
- return 0;
- }
- else
- {
- zmw_leave_critical_section(dev);
- return 1;
- }
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiTxSendEth */
-/* Called to transmit Ethernet frame from upper layer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer pointer */
-/* port : WLAN port, 0=>standard, 0x1-0x7=>VAP, 0x20-0x25=>WDS */
-/* */
-/* OUTPUTS */
-/* error code */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.5 */
-/* */
-/************************************************************************/
-u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port)
-{
- u16_t err, ret;
-
- zmw_get_wlan_dev(dev);
-
- ZM_PERFORMANCE_TX_MSDU(dev, wd->tick);
- zm_msg1_tx(ZM_LV_2, "zfiTxSendEth(), port=", port);
- /* Return error if port is disabled */
- err = zfTxPortControl(dev, buf, port);
- if (err == ZM_PORT_DISABLED)
- {
- err = ZM_ERR_TX_PORT_DISABLED;
- goto zlError;
- }
-
-#if 1
- if ((wd->wlanMode == ZM_MODE_AP) && (port < 0x20))
- {
- /* AP : Buffer frame for power saving STA */
- ret = zfApBufferPsFrame(dev, buf, port);
- if (ret == 1)
- {
- return ZM_SUCCESS;
- }
- }
- else
-#endif
- if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- if ( zfPowerSavingMgrIsSleeping(dev) )
- {
- /*check ZM_ENABLE_POWER_SAVE flag*/
- zfPowerSavingMgrWakeup(dev);
- }
- }
-#ifdef ZM_ENABLE_IBSS_PS
- /* IBSS power-saving mode */
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- if ( zfStaIbssPSQueueData(dev, buf) )
- {
- return ZM_SUCCESS;
- }
- }
-#endif
-
-#if 1
- //if ( wd->bQoSEnable )
- if (1)
- {
- /* Put to VTXQ[ac] */
- ret = zfPutVtxq(dev, buf);
-
- /* Push VTXQ[ac] */
- zfPushVtxq(dev);
- }
- else
- {
- ret = zfTxSendEth(dev, buf, port, ZM_EXTERNAL_ALLOC_BUF, 0);
- }
-
- return ret;
-#else
- return zfTxSendEth(dev, buf, port, ZM_EXTERNAL_ALLOC_BUF, 0);
-#endif
-
-zlError:
- zm_msg2_tx(ZM_LV_1, "Tx Comp err=", err);
-
- zfwBufFree(dev, buf, err);
- return err;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfTxSendEth */
-/* Called to transmit Ethernet frame from upper layer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : buffer pointer */
-/* port : WLAN port, 0=>standard, 0x10-0x17=>VAP, 0x20-0x25=>WDS */
-/* */
-/* OUTPUTS */
-/* error code */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.5 */
-/* */
-/************************************************************************/
-u16_t zfTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port, u16_t bufType, u16_t flag)
-{
- //u16_t addrTblSize;
- //struct zsAddrTbl addrTbl;
- u16_t removeLen;
- u16_t header[(8+30+2+18)/2]; /* ctr+(4+a1+a2+a3+2+a4)+qos+iv */
- u16_t headerLen;
- u16_t mic[8/2];
- u16_t micLen;
- u16_t snap[8/2];
- u16_t snapLen;
- u16_t fragLen;
- u16_t frameLen;
- u16_t fragNum;
- struct zsFrag frag;
- u16_t i, j, id;
- u16_t offset;
- u16_t da[3];
- u16_t sa[3];
- u8_t up;
- u8_t qosType, keyIdx = 0;
- u16_t fragOff;
- u16_t newFlag;
- u8_t tkipFrameOffset = 0;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- newFlag = flag & 0xff00;
- flag = flag & 0xff;
-
- zm_msg1_tx(ZM_LV_2, "zfTxSendEth(), port=", port);
-
- /* Get IP TOS for QoS AC and IP frag offset */
- zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
-
- //EOSP bit
- if (newFlag & 0x100)
- {
- up |= 0x10;
- }
-
-#ifdef ZM_ENABLE_NATIVE_WIFI
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 16);
- da[1] = zmw_tx_buf_readh(dev, buf, 18);
- da[2] = zmw_tx_buf_readh(dev, buf, 20);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 10);
- sa[1] = zmw_tx_buf_readh(dev, buf, 12);
- sa[2] = zmw_tx_buf_readh(dev, buf, 14);
- }
- else if ( wd->wlanMode == ZM_MODE_IBSS )
- {
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 4);
- da[1] = zmw_tx_buf_readh(dev, buf, 6);
- da[2] = zmw_tx_buf_readh(dev, buf, 8);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 10);
- sa[1] = zmw_tx_buf_readh(dev, buf, 12);
- sa[2] = zmw_tx_buf_readh(dev, buf, 14);
- }
- else if ( wd->wlanMode == ZM_MODE_AP )
- {
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 4);
- da[1] = zmw_tx_buf_readh(dev, buf, 6);
- da[2] = zmw_tx_buf_readh(dev, buf, 8);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 16);
- sa[1] = zmw_tx_buf_readh(dev, buf, 18);
- sa[2] = zmw_tx_buf_readh(dev, buf, 20);
- }
- else
- {
- //
- }
-#else
- /* DA */
- da[0] = zmw_tx_buf_readh(dev, buf, 0);
- da[1] = zmw_tx_buf_readh(dev, buf, 2);
- da[2] = zmw_tx_buf_readh(dev, buf, 4);
- /* SA */
- sa[0] = zmw_tx_buf_readh(dev, buf, 6);
- sa[1] = zmw_tx_buf_readh(dev, buf, 8);
- sa[2] = zmw_tx_buf_readh(dev, buf, 10);
-#endif
- //Decide Key Index in ATOM, No meaning in OTUS--CWYang(m)
- if (wd->wlanMode == ZM_MODE_AP)
- {
- keyIdx = wd->ap.bcHalKeyIdx[port];
- id = zfApFindSta(dev, da);
- if (id != 0xffff)
- {
- switch (wd->ap.staTable[id].encryMode)
- {
- case ZM_AES:
- case ZM_TKIP:
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
-#endif //ZM_ENABLE_CENC
- keyIdx = wd->ap.staTable[id].keyIdx;
- break;
- }
- }
- }
- else
- {
- switch (wd->sta.encryMode)
- {
- case ZM_WEP64:
- case ZM_WEP128:
- case ZM_WEP256:
- keyIdx = wd->sta.keyId;
- break;
- case ZM_AES:
- case ZM_TKIP:
- if ((da[0] & 0x1))
- keyIdx = 5;
- else
- keyIdx = 4;
- break;
-#ifdef ZM_ENABLE_CENC
- case ZM_CENC:
- keyIdx = wd->sta.cencKeyId;
- break;
-#endif //ZM_ENABLE_CENC
- }
- }
-
- /* Create SNAP */
- removeLen = zfTxGenWlanSnap(dev, buf, snap, &snapLen);
- //zm_msg1_tx(ZM_LV_0, "fragOff=", fragOff);
-
-
-/* ********************************************************************************************** */
-/* Add 20071025 Mxzeng */
-/* ********************************************************************************************** */
-/* ---------------------------------------------------------------------------------------------- */
-/* Ethernet : frameLen = zfwBufGetSize(dev, buf); */
-/* ---+--6--+--6--+--2--+-----20-----+-------------------------+------ Variable -------+--------- */
-/* | DA | SA | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */
-/* ---+-----+-----+-----+------------+-------------------------+-----------------------+--------- */
-/* MSDU = 6 + 6 + 2 + ( Network Layer header ) + ( Transport Layer header ) + L */
-/* */
-/* MSDU - DA - SA : frameLen -= removeLen; */
-/* ---+--2--+-----20-----+-------------------------+------ Variable -------+--------------------- */
-/* | Type| IP Header | TCP(20) UDP(12) ICMP(8) | Application Payload L | */
-/* ---+-----+------------+-------------------------+-----------------------+--------------------- */
-/* */
-/* MPDU : frameLen + mpduLengthOffset ; */
-/* -+---2---+----2---+-6-+-6-+--6--+---2----+--1--+--1-+---1---+-------3------+-frameLen-+---4--+- */
-/* | frame |duration| DA|SA |BSSID|sequence|SNAP |SNAP|Control| RFC 1042 | | FCS | */
-/* |Control| | | | | number |DSAP |SSAP| | encapsulation| | | */
-/* -+-------+--------+---+---+-----+--------+-----+----+-------+--------------+----------+------+- */
-/* ----------------------------------------------------------------------------------------------- */
-
- if ( wd->sta.encryMode == ZM_TKIP )
- tkipFrameOffset = 8;
-
- fragLen = wd->fragThreshold + tkipFrameOffset; // Fragmentation threshold for MPDU Lengths
- frameLen = zfwBufGetSize(dev, buf); // MSDU Lengths
- frameLen -= removeLen; // MSDU Lengths - DA - SA
-
- /* #1st create MIC Length manually */
- micLen = 0;
-
- /* Access Category */
- if (wd->wlanMode == ZM_MODE_AP)
- {
- zfApGetStaQosType(dev, da, &qosType);
- if (qosType == 0)
- {
- up = 0;
- }
- }
- else if (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)
- {
- if (wd->sta.wmeConnected == 0)
- {
- up = 0;
- }
- }
- else
- {
- /* TODO : STA QoS control field */
- up = 0;
- }
-
- /* #2nd Assign sequence number */
- zmw_enter_critical_section(dev);
- frag.seq[0] = ((wd->seq[zcUpToAc[up&0x7]]++) << 4);
- zmw_leave_critical_section(dev);
-
- /* #3rd Pass the total payload to generate MPDU length ! */
- frag.buf[0] = buf;
- frag.bufType[0] = bufType;
- frag.flag[0] = (u8_t)flag;
- fragNum = 1;
-
- headerLen = zfTxGenWlanHeader(dev, frag.buf[0], header, frag.seq[0],
- frag.flag[0], snapLen+micLen, removeLen, port, da, sa,
- up, &micLen, snap, snapLen, NULL);
-
- //zm_debug_msg1("#1 headerLen = ", headerLen);
-
- /* #4th Check the HeaderLen and determine whether the MPDU Lengths bigger than Fragmentation threshold */
- /* If MPDU Lengths large than fragmentation threshold --> headerLen = 0 */
- if( headerLen != 0 )
- {
- zf80211FrameSend(dev, frag.buf[0], header, snapLen, da, sa, up,
- headerLen, snap, mic, micLen, removeLen, frag.bufType[0],
- zcUpToAc[up&0x7], keyIdx);
- }
- else //if( headerLen == 0 ) // Need to be fragmented
- {
- u16_t mpduLengthOffset;
- u16_t pseudSnapLen = 0;
-
- mpduLengthOffset = header[0] - frameLen; // For fragmentation threshold !
-
- micLen = zfTxGenWlanTail(dev, buf, snap, snapLen, mic); // Get snap and mic information
-
- fragLen = fragLen - mpduLengthOffset;
-
- //zm_debug_msg1("#2 frameLen = ", frameLen);
- //zm_debug_msg1("#3 fragThreshold = ", fragLen);
-
- /* fragmentation */
- if (frameLen >= fragLen)
- {
- //copy fragLen to frag
- i = 0;
- while( frameLen > 0 )
- {
- frag.buf[i] = zfwBufAllocate(dev, fragLen+32);
- if (frag.buf[i] != NULL)
- {
- frag.bufType[i] = ZM_INTERNAL_ALLOC_BUF;
- frag.seq[i] = frag.seq[0] + i;
- offset = removeLen + i*fragLen;
-
- /* Consider the offset if we consider snap length to the other fragmented frame */
- if ( i >= 1 )
- offset = offset + pseudSnapLen*(i-1);
-
- if (frameLen > fragLen + pseudSnapLen)
- {
- frag.flag[i] = flag | 0x4; /* More data */
- /* First fragment */
- if (i == 0)
- {
- /* Add SNAP */
- for (j=0; j<snapLen; j+=2)
- {
- zmw_tx_buf_writeh(dev, frag.buf[i], j, snap[(j>>1)]);
- }
- zfTxBufferCopy(dev, frag.buf[i], buf, snapLen, offset, fragLen);
- zfwBufSetSize(dev, frag.buf[i], snapLen+fragLen);
-
- /* Add pseud snap length to the other fragmented frame */
- pseudSnapLen = snapLen;
-
- frameLen -= fragLen;
- }
- /* Intermediate Fragment */
- else
- {
- //zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen);
- //zfwBufSetSize(dev, frag.buf[i], fragLen);
-
- zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, fragLen+pseudSnapLen );
- zfwBufSetSize(dev, frag.buf[i], fragLen+pseudSnapLen);
-
- frameLen -= (fragLen+pseudSnapLen);
- }
- //frameLen -= fragLen;
- }
- else
- {
- /* Last fragment */
- zfTxBufferCopy(dev, frag.buf[i], buf, 0, offset, frameLen);
- /* Add MIC if need */
- if ( micLen )
- {
- zfCopyToRxBuffer(dev, frag.buf[i], (u8_t*) mic, frameLen, micLen);
- }
- zfwBufSetSize(dev, frag.buf[i], frameLen+micLen);
- frameLen = 0;
- frag.flag[i] = (u8_t)flag; /* No more data */
- }
- i++;
- }
- else
- {
- break;
- }
-
- // Please pay attention to the index of the buf !!!
- // If write to null buf , the OS will crash !!!
- zfwCopyBufContext(dev, buf, frag.buf[i-1]);
- }
- fragNum = i;
- snapLen = micLen = removeLen = 0;
-
- zfwBufFree(dev, buf, 0);
- }
-
- for (i=0; i<fragNum; i++)
- {
- /* Create WLAN header(Control Setting + 802.11 header + IV) */
- headerLen = zfTxGenWlanHeader(dev, frag.buf[i], header, frag.seq[i],
- frag.flag[i], snapLen+micLen, removeLen, port, da, sa, up, &micLen,
- snap, snapLen, NULL);
-
- zf80211FrameSend(dev, frag.buf[i], header, snapLen, da, sa, up,
- headerLen, snap, mic, micLen, removeLen, frag.bufType[i],
- zcUpToAc[up&0x7], keyIdx);
-
- } /* for (i=0; i<fragNum; i++) */
- }
-
- return ZM_SUCCESS;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfTxPortControl */
-/* Check port status. */
-/* */
-/* INPUTS */
-/* buf : buffer pointer */
-/* port : port number, 0=>standard, 10-17=>Virtual AP, 20-25=>WDS */
-/* */
-/* OUTPUTS */
-/* ZM_PORT_ENABLED or ZM_PORT_DISABLE */
-/* */
-/* AUTHOR */
-/* Signature ZyDAS Technology Corporation 2005.4 */
-/* */
-/************************************************************************/
-u16_t zfTxPortControl(zdev_t* dev, zbuf_t* buf, u16_t port)
-{
- zmw_get_wlan_dev(dev);
-
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- if ( wd->sta.adapterState == ZM_STA_STATE_DISCONNECT )
- {
- zm_msg0_tx(ZM_LV_3, "Packets dropped due to disconnect state");
- return ZM_PORT_DISABLED;
- }
- }
-
- return ZM_PORT_ENABLED;
-}
-
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfIdlRecv */
-/* Do frame validation and filtering then pass to zfwRecv80211(). */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : received 802.11 frame buffer. */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-void zfCoreRecv(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo)
-{
- u16_t ret = 0;
- u16_t bssid[3];
- struct agg_tid_rx *tid_rx;
- zmw_get_wlan_dev(dev);
-
- ZM_BUFFER_TRACE(dev, buf)
-
- /* tally */
- wd->commTally.DriverRxFrmCnt++;
-
- bssid[0] = zmw_buf_readh(dev, buf, 16);
- bssid[1] = zmw_buf_readh(dev, buf, 18);
- bssid[2] = zmw_buf_readh(dev, buf, 20);
-
- /* Validate Rx frame */
- ret = zfWlanRxValidate(dev, buf);
- if (ret != ZM_SUCCESS)
- {
- zm_msg1_rx(ZM_LV_1, "Rx invalid:", ret);
- goto zlError;
- }
-
-#ifdef ZM_ENABLE_AGGREGATION
- //#ifndef ZM_ENABLE_FW_BA_RETRANSMISSION
- /*
- * add by honda
- */
- tid_rx = zfAggRxEnabled(dev, buf);
- if (tid_rx && wd->reorder)
- {
- zfAggRx(dev, buf, addInfo, tid_rx);
-
- return;
- }
- /*
- * end of add by honda
- */
- //#endif
-#endif
-
- /* Filter Rx frame */
- ret = zfWlanRxFilter(dev, buf);
- if (ret != ZM_SUCCESS)
- {
- zm_msg1_rx(ZM_LV_1, "Rx duplicated:", ret);
- goto zlError;
- }
-
- /* Discard error frame except mic failure */
- if ((addInfo->Tail.Data.ErrorIndication & 0x3f) != 0)
- {
- if ( wd->XLinkMode && ((addInfo->Tail.Data.ErrorIndication & 0x3f)==0x10) &&
- zfCompareWithBssid(dev, bssid) )
- {
- // Bypass frames !!!
- }
- else
- {
- goto zlError;
- }
- }
-
-
- /* OTUS command-8212 dump rx packet */
- if (wd->rxPacketDump)
- {
- zfwDumpBuf(dev, buf);
- }
-
- /* Call zfwRecv80211() wrapper function to deliver Rx packet */
- /* to driver framework. */
-
- if (wd->zfcbRecv80211 != NULL)
- {
- wd->zfcbRecv80211(dev, buf, addInfo); //CWYang(m)
- }
- else
- {
- zfiRecv80211(dev, buf, addInfo);
- }
- return;
-
-zlError:
- zm_msg1_rx(ZM_LV_1, "Free packet, error code:", ret);
-
- wd->commTally.DriverDiscardedFrm++;
-
- /* Free Rx buffer */
- zfwBufFree(dev, buf, 0);
-
- return;
-}
-
-
-void zfShowRxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u8_t packetType, keyType, code, identifier, type, flags;
- u16_t packetLen, keyInfo, keyLen, keyDataLen, length, Op_Code;
- u32_t replayCounterH, replayCounterL, vendorId, VendorType;
-
- /* EAPOL packet type */
- packetType = zmw_rx_buf_readb(dev, buf, offset+1); // 0: EAP-Packet
- // 1: EAPOL-Start
- // 2: EAPOL-Logoff
- // 3: EAPOL-Key
- // 4: EAPOL-Encapsulated-ASF-Alert
-
- /* EAPOL frame format */
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
- /* ----------------------------------------------- */
- /* PAE Ethernet Type (0x888e) */
- /* ----------------------------------------------- 2 */
- /* Protocol Version | Type */
- /* ----------------------------------------------- 4 */
- /* Length */
- /* ----------------------------------------------- 6 */
- /* Packet Body */
- /* ----------------------------------------------- N */
-
- /* EAPOL body length */
- packetLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+2)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+3);
-
- if( packetType == 0 )
- { // EAP-Packet
-
- /* EAP-Packet Code */
- code = zmw_rx_buf_readb(dev, buf, offset+4); // 1 : Request
- // 2 : Response
- // 3 : Success
- // 4 : Failure
- // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4.
-
- /* EAP Packet format */
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
- /* ----------------------------------------------- */
- /* Code | Identifier */
- /* ----------------------------------------------- 2 */
- /* Length */
- /* ----------------------------------------------- 4 */
- /* Data */
- /* ----------------------------------------------- N */
-
- zm_debug_msg0("EAP-Packet");
- zm_debug_msg1("Packet Length = ", packetLen);
- zm_debug_msg1("EAP-Packet Code = ", code);
-
- if( code == 1 )
- {
- zm_debug_msg0("EAP-Packet Request");
-
- /* EAP-Packet Identifier */
- identifier = zmw_rx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+7);
- /* EAP-Packet Type */
- type = zmw_rx_buf_readb(dev, buf, offset+8); // 1 : Identity
- // 2 : Notification
- // 3 : Nak (Response Only)
- // 4 : MD5-Challenge
- // 5 : One Time Password (OTP)
- // 6 : Generic Token Card (GTC)
- // 254 : (Expanded Types)Wi-Fi Protected Setup
- // 255 : Experimental Use
-
- /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */
- /* 0 1 2 3 4 5 6 7 N */
- /* ----------------------------------------------- */
- /* Type | Type Data */
- /* ----------------------------------------------- */
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- zm_debug_msg1("EAP-Packet Type = ", type);
-
- if( type == 1 )
- {
- zm_debug_msg0("EAP-Packet Request Identity");
- }
- else if( type == 2 )
- {
- zm_debug_msg0("EAP-Packet Request Notification");
- }
- else if( type == 4 )
- {
- zm_debug_msg0("EAP-Packet Request MD5-Challenge");
- }
- else if( type == 5 )
- {
- zm_debug_msg0("EAP-Packet Request One Time Password");
- }
- else if( type == 6 )
- {
- zm_debug_msg0("EAP-Packet Request Generic Token Card");
- }
- else if( type == 254 )
- {
- zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup");
-
- /* 0 1 2 3 */
- /* 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 */
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
- /*| Type | Vendor-Id |*/
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
- /*| Vendor-Type |*/
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
- /*| Vendor data... */
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
- /* EAP-Packet Vendor ID */
- vendorId = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 16) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+11);
- /* EAP-Packet Vendor Type */
- VendorType = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+12)) << 24) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 16) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+15);
- /* EAP-Packet Op Code */
- Op_Code = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+16)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+17);
- /* EAP-Packet Flags */
- flags = zmw_rx_buf_readb(dev, buf, offset+18);
-
- zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
- zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
- zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
- zm_debug_msg1("EAP-Packet Flags = ", flags);
- }
- }
- else if( code == 2 )
- {
- zm_debug_msg0("EAP-Packet Response");
-
- /* EAP-Packet Identifier */
- identifier = zmw_rx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+7);
- /* EAP-Packet Type */
- type = zmw_rx_buf_readb(dev, buf, offset+8);
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- zm_debug_msg1("EAP-Packet Type = ", type);
-
- if( type == 1 )
- {
- zm_debug_msg0("EAP-Packet Response Identity");
- }
- else if( type == 2 )
- {
- zm_debug_msg0("EAP-Packet Request Notification");
- }
- else if( type == 3 )
- {
- zm_debug_msg0("EAP-Packet Request Nak");
- }
- else if( type == 4 )
- {
- zm_debug_msg0("EAP-Packet Request MD5-Challenge");
- }
- else if( type == 5 )
- {
- zm_debug_msg0("EAP-Packet Request One Time Password");
- }
- else if( type == 6 )
- {
- zm_debug_msg0("EAP-Packet Request Generic Token Card");
- }
- else if( type == 254 )
- {
- zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup");
-
- /* EAP-Packet Vendor ID */
- vendorId = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 16) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+11);
- /* EAP-Packet Vendor Type */
- VendorType = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+12)) << 24) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 16) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+15);
- /* EAP-Packet Op Code */
- Op_Code = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+16)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+17);
- /* EAP-Packet Flags */
- flags = zmw_rx_buf_readb(dev, buf, offset+18);
-
- zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
- zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
- zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
- zm_debug_msg1("EAP-Packet Flags = ", flags);
- }
- }
- else if( code == 3 )
- {
- zm_debug_msg0("EAP-Packet Success");
-
- /* EAP-Packet Identifier */
- identifier = zmw_rx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+7);
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- }
- else if( code == 4 )
- {
- zm_debug_msg0("EAP-Packet Failure");
-
- /* EAP-Packet Identifier */
- identifier = zmw_rx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+7);
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- }
- }
- else if( packetType == 1 )
- { // EAPOL-Start
- zm_debug_msg0("EAPOL-Start");
- }
- else if( packetType == 2 )
- { // EAPOL-Logoff
- zm_debug_msg0("EAPOL-Logoff");
- }
- else if( packetType == 3 )
- { // EAPOL-Key
- /* EAPOL-Key type */
- keyType = zmw_rx_buf_readb(dev, buf, offset+4);
- /* EAPOL-Key information */
- keyInfo = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+5)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+6);
- /* EAPOL-Key length */
- keyLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+7)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+8);
- /* EAPOL-Key replay counter (high double word) */
- replayCounterH = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+9)) << 24) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+10)) << 16) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+11)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+12);
- /* EAPOL-Key replay counter (low double word) */
- replayCounterL = (((u32_t) zmw_rx_buf_readb(dev, buf, offset+13)) << 24) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+14)) << 16) +
- (((u32_t) zmw_rx_buf_readb(dev, buf, offset+15)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+16);
- /* EAPOL-Key data length */
- keyDataLen = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+97)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+98);
-
- zm_debug_msg0("EAPOL-Key");
- zm_debug_msg1("packet length = ", packetLen);
-
- if ( keyType == 254 )
- {
- zm_debug_msg0("key type = 254 (SSN key descriptor)");
- }
- else
- {
- zm_debug_msg2("key type = 0x", keyType);
- }
-
- zm_debug_msg2("replay counter(L) = ", replayCounterL);
-
- zm_debug_msg2("key information = ", keyInfo);
-
- if ( keyInfo & ZM_BIT_3 )
- {
- zm_debug_msg0(" - pairwise key");
- }
- else
- {
- zm_debug_msg0(" - group key");
- }
-
- if ( keyInfo & ZM_BIT_6 )
- {
- zm_debug_msg0(" - Tx key installed");
- }
- else
- {
- zm_debug_msg0(" - Tx key not set");
- }
-
- if ( keyInfo & ZM_BIT_7 )
- {
- zm_debug_msg0(" - Ack needed");
- }
- else
- {
- zm_debug_msg0(" - Ack not needed");
- }
-
- if ( keyInfo & ZM_BIT_8 )
- {
- zm_debug_msg0(" - MIC set");
- }
- else
- {
- zm_debug_msg0(" - MIC not set");
- }
-
- if ( keyInfo & ZM_BIT_9 )
- {
- zm_debug_msg0(" - packet encrypted");
- }
- else
- {
- zm_debug_msg0(" - packet not encrypted");
- }
-
- zm_debug_msg1("keyLen = ", keyLen);
- zm_debug_msg1("keyDataLen = ", keyDataLen);
- }
- else if( packetType == 4 )
- {
- zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert");
- }
-}
-
-void zfShowTxEAPOL(zdev_t* dev, zbuf_t* buf, u16_t offset)
-{
- u8_t packetType, keyType, code, identifier, type, flags;
- u16_t packetLen, keyInfo, keyLen, keyDataLen, length, Op_Code;
- u32_t replayCounterH, replayCounterL, vendorId, VendorType;
-
- zm_debug_msg1("EAPOL Packet size = ", zfwBufGetSize(dev, buf));
-
- /* EAPOL packet type */
- // 0: EAP-Packet
- // 1: EAPOL-Start
- // 2: EAPOL-Logoff
- // 3: EAPOL-Key
- // 4: EAPOL-Encapsulated-ASF-Alert
-
- /* EAPOL frame format */
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
- /* ----------------------------------------------- */
- /* PAE Ethernet Type (0x888e) */
- /* ----------------------------------------------- 2 */
- /* Protocol Version | Type */
- /* ----------------------------------------------- 4 */
- /* Length */
- /* ----------------------------------------------- 6 */
- /* Packet Body */
- /* ----------------------------------------------- N */
-
- packetType = zmw_tx_buf_readb(dev, buf, offset+1);
- /* EAPOL body length */
- packetLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+2)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+3);
-
- if( packetType == 0 )
- { // EAP-Packet
- /* EAP-Packet Code */
- code = zmw_tx_buf_readb(dev, buf, offset+4); // 1 : Request
- // 2 : Response
- // 3 : Success
- // 4 : Failure
-
- // An EAP packet of the type of Success and Failure has no Data field, and has a length of 4.
-
- /* EAP Packet format */
- /* 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 */
- /* ----------------------------------------------- */
- /* Code | Identifier */
- /* ----------------------------------------------- 2 */
- /* Length */
- /* ----------------------------------------------- 4 */
- /* Data */
- /* ----------------------------------------------- N */
-
- zm_debug_msg0("EAP-Packet");
- zm_debug_msg1("Packet Length = ", packetLen);
- zm_debug_msg1("EAP-Packet Code = ", code);
-
- if( code == 1 )
- {
- zm_debug_msg0("EAP-Packet Request");
-
- /* EAP-Packet Identifier */
- identifier = zmw_tx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+7);
- /* EAP-Packet Type */
- type = zmw_tx_buf_readb(dev, buf, offset+8); // 1 : Identity
- // 2 : Notification
- // 3 : Nak (Response Only)
- // 4 : MD5-Challenge
- // 5 : One Time Password (OTP)
- // 6 : Generic Token Card (GTC)
- // 254 : (Expanded Types)Wi-Fi Protected Setup
- // 255 : Experimental Use
-
- /* The data field in an EAP packet of the type of Request or Response is in the format shown bellowing */
- /* 0 1 2 3 4 5 6 7 N */
- /* ----------------------------------------------- */
- /* Type | Type Data */
- /* ----------------------------------------------- */
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- zm_debug_msg1("EAP-Packet Type = ", type);
-
- if( type == 1 )
- {
- zm_debug_msg0("EAP-Packet Request Identity");
- }
- else if( type == 2 )
- {
- zm_debug_msg0("EAP-Packet Request Notification");
- }
- else if( type == 4 )
- {
- zm_debug_msg0("EAP-Packet Request MD5-Challenge");
- }
- else if( type == 5 )
- {
- zm_debug_msg0("EAP-Packet Request One Time Password");
- }
- else if( type == 6 )
- {
- zm_debug_msg0("EAP-Packet Request Generic Token Card");
- }
- else if( type == 254 )
- {
- zm_debug_msg0("EAP-Packet Request Wi-Fi Protected Setup");
-
- /* 0 1 2 3 */
- /* 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 */
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
- /*| Type | Vendor-Id |*/
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
- /*| Vendor-Type |*/
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+*/
- /*| Vendor data... */
- /*+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */
-
- /* EAP-Packet Vendor ID */
- vendorId = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 16) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+11);
- /* EAP-Packet Vendor Type */
- VendorType = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+12)) << 24) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 16) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+15);
- /* EAP-Packet Op Code */
- Op_Code = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+16)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+17);
- /* EAP-Packet Flags */
- flags = zmw_tx_buf_readb(dev, buf, offset+18);
-
- zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
- zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
- zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
- zm_debug_msg1("EAP-Packet Flags = ", flags);
- }
- }
- else if( code == 2 )
- {
- zm_debug_msg0("EAP-Packet Response");
-
- /* EAP-Packet Identifier */
- identifier = zmw_tx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+7);
- /* EAP-Packet Type */
- type = zmw_tx_buf_readb(dev, buf, offset+8);
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- zm_debug_msg1("EAP-Packet Type = ", type);
-
- if( type == 1 )
- {
- zm_debug_msg0("EAP-Packet Response Identity");
- }
- else if( type == 2 )
- {
- zm_debug_msg0("EAP-Packet Request Notification");
- }
- else if( type == 3 )
- {
- zm_debug_msg0("EAP-Packet Request Nak");
- }
- else if( type == 4 )
- {
- zm_debug_msg0("EAP-Packet Request MD5-Challenge");
- }
- else if( type == 5 )
- {
- zm_debug_msg0("EAP-Packet Request One Time Password");
- }
- else if( type == 6 )
- {
- zm_debug_msg0("EAP-Packet Request Generic Token Card");
- }
- else if( type == 254 )
- {
- zm_debug_msg0("EAP-Packet Response Wi-Fi Protected Setup");
-
- /* EAP-Packet Vendor ID */
- vendorId = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 16) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+11);
- /* EAP-Packet Vendor Type */
- VendorType = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+12)) << 24) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 16) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+15);
- /* EAP-Packet Op Code */
- Op_Code = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+16)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+17);
- /* EAP-Packet Flags */
- flags = zmw_tx_buf_readb(dev, buf, offset+18);
-
- zm_debug_msg1("EAP-Packet Vendor ID = ", vendorId);
- zm_debug_msg1("EAP-Packet Venodr Type = ", VendorType);
- zm_debug_msg1("EAP-Packet Op Code = ", Op_Code);
- zm_debug_msg1("EAP-Packet Flags = ", flags);
- }
- }
- else if( code == 3 )
- {
- zm_debug_msg0("EAP-Packet Success");
-
- /* EAP-Packet Identifier */
- identifier = zmw_rx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_rx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_rx_buf_readb(dev, buf, offset+7);
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- }
- else if( code == 4 )
- {
- zm_debug_msg0("EAP-Packet Failure");
-
- /* EAP-Packet Identifier */
- identifier = zmw_tx_buf_readb(dev, buf, offset+5);
- /* EAP-Packet Length */
- length = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+6)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+7);
-
- zm_debug_msg1("EAP-Packet Identifier = ", identifier);
- zm_debug_msg1("EAP-Packet Length = ", length);
- }
- }
- else if( packetType == 1 )
- { // EAPOL-Start
- zm_debug_msg0("EAPOL-Start");
- }
- else if( packetType == 2 )
- { // EAPOL-Logoff
- zm_debug_msg0("EAPOL-Logoff");
- }
- else if( packetType == 3 )
- { // EAPOL-Key
- /* EAPOL-Key type */
- keyType = zmw_tx_buf_readb(dev, buf, offset+4);
- /* EAPOL-Key information */
- keyInfo = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+5)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+6);
- /* EAPOL-Key length */
- keyLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+7)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+8);
- /* EAPOL-Key replay counter (high double word) */
- replayCounterH = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+9)) << 24) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+10)) << 16) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+11)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+12);
- /* EAPOL-Key replay counter (low double word) */
- replayCounterL = (((u32_t) zmw_tx_buf_readb(dev, buf, offset+13)) << 24) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+14)) << 16) +
- (((u32_t) zmw_tx_buf_readb(dev, buf, offset+15)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+16);
- /* EAPOL-Key data length */
- keyDataLen = (((u16_t) zmw_tx_buf_readb(dev, buf, offset+97)) << 8) +
- zmw_tx_buf_readb(dev, buf, offset+98);
-
- zm_debug_msg0("EAPOL-Key");
- zm_debug_msg1("packet length = ", packetLen);
-
- if ( keyType == 254 )
- {
- zm_debug_msg0("key type = 254 (SSN key descriptor)");
- }
- else
- {
- zm_debug_msg2("key type = 0x", keyType);
- }
-
- zm_debug_msg2("replay counter(L) = ", replayCounterL);
-
- zm_debug_msg2("key information = ", keyInfo);
-
- if ( keyInfo & ZM_BIT_3 )
- {
- zm_debug_msg0(" - pairwise key");
- }
- else
- {
- zm_debug_msg0(" - group key");
- }
-
- if ( keyInfo & ZM_BIT_6 )
- {
- zm_debug_msg0(" - Tx key installed");
- }
- else
- {
- zm_debug_msg0(" - Tx key not set");
- }
-
- if ( keyInfo & ZM_BIT_7 )
- {
- zm_debug_msg0(" - Ack needed");
- }
- else
- {
- zm_debug_msg0(" - Ack not needed");
- }
-
- if ( keyInfo & ZM_BIT_8 )
- {
- zm_debug_msg0(" - MIC set");
- }
- else
- {
- zm_debug_msg0(" - MIC not set");
- }
-
- if ( keyInfo & ZM_BIT_9 )
- {
- zm_debug_msg0(" - packet encrypted");
- }
- else
- {
- zm_debug_msg0(" - packet not encrypted");
- }
-
- zm_debug_msg1("keyLen = ", keyLen);
- zm_debug_msg1("keyDataLen = ", keyDataLen);
- }
- else if( packetType == 4 )
- {
- zm_debug_msg0("EAPOL-Encapsulated-ASF-Alert");
- }
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfiRecv80211 */
-/* Called to receive 802.11 frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : received 802.11 frame buffer. */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.5 */
-/* */
-/************************************************************************/
-void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo)
-{
- u8_t snapCase=0, encryMode;
- u16_t frameType, typeLengthField;
- u16_t frameCtrl;
- u16_t frameSubtype;
- u16_t ret;
- u16_t len;
- u8_t bIsDefrag = 0;
- u16_t offset, tailLen;
- u8_t vap = 0;
- u16_t da[3], sa[3];
- u16_t ii;
- u8_t uapsdTrig = 0;
- zbuf_t* psBuf;
-#ifdef ZM_ENABLE_NATIVE_WIFI
- u8_t i;
-#endif
-
- zmw_get_wlan_dev(dev);
-
- ZM_BUFFER_TRACE(dev, buf)
-
- //zm_msg2_rx(ZM_LV_2, "zfiRecv80211(), buf=", buf);
-
- //zm_msg2_rx(ZM_LV_0, "h[0]=", zmw_rx_buf_readh(dev, buf, 0));
- //zm_msg2_rx(ZM_LV_0, "h[2]=", zmw_rx_buf_readh(dev, buf, 2));
- //zm_msg2_rx(ZM_LV_0, "h[4]=", zmw_rx_buf_readh(dev, buf, 4));
-
- frameCtrl = zmw_rx_buf_readb(dev, buf, 0);
- frameType = frameCtrl & 0xf;
- frameSubtype = frameCtrl & 0xf0;
-
-#if 0 // Move to ProcessBeacon to judge if there's a new peer station
- if ( (wd->wlanMode == ZM_MODE_IBSS)&&
- (wd->sta.ibssPartnerStatus != ZM_IBSS_PARTNER_ALIVE) )
- {
- zfStaIbssMonitoring(dev, buf);
- }
-#endif
-
- /* If data frame */
- if (frameType == ZM_WLAN_DATA_FRAME)
- {
- wd->sta.TotalNumberOfReceivePackets++;
- wd->sta.TotalNumberOfReceiveBytes += zfwBufGetSize(dev, buf);
- //zm_debug_msg1("Receive packets = ", wd->sta.TotalNumberOfReceivePackets);
-
- //zm_msg0_rx(ZM_LV_0, "Rx data");
- if (wd->wlanMode == ZM_MODE_AP)
- {
- ret = zfApUpdatePsBit(dev, buf, &vap, &uapsdTrig);
- if (ret != ZM_SUCCESS)
- {
- zfwBufFree(dev, buf, 0);
- return;
- }
-
- if (((uapsdTrig&0xf) != 0) && ((frameSubtype & 0x80) != 0))
- {
- u8_t ac = zcUpToAc[zmw_buf_readb(dev, buf, 24)&0x7];
- u8_t pktNum;
- u8_t mb;
- u16_t flag;
- u8_t src[6];
-
- //printk("QoS ctrl=%d\n", zmw_buf_readb(dev, buf, 24));
- //printk("UAPSD trigger, ac=%d\n", ac);
-
- if (((0x8>>ac) & uapsdTrig) != 0)
- {
- pktNum = zcMaxspToPktNum[(uapsdTrig>>4) & 0x3];
-
- for (ii=0; ii<6; ii++)
- {
- src[ii] = zmw_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+ii);
- }
-
- for (ii=0; ii<pktNum; ii++)
- {
- //if ((psBuf = zfQueueGet(dev, wd->ap.uapsdQ)) != NULL)
- psBuf = zfQueueGetWithMac(dev, wd->ap.uapsdQ, src, &mb);
- if (psBuf != NULL)
- {
- if ((ii+1) == pktNum)
- {
- //EOSP anyway
- flag = 0x100 | (mb<<5);
- }
- else
- {
- if (mb != 0)
- {
- //more data, not EOSP
- flag = 0x20;
- }
- else
- {
- //no more data, EOSP
- flag = 0x100;
- }
- }
- zfTxSendEth(dev, psBuf, 0, ZM_EXTERNAL_ALLOC_BUF, flag);
- }
-
- if ((psBuf == NULL) || (mb == 0))
- {
- if ((ii == 0) && (psBuf == NULL))
- {
- zfSendMmFrame(dev, ZM_WLAN_FRAME_TYPE_QOS_NULL, (u16_t*)src, 0, 0, 0);
- }
- break;
- }
- }
- }
- }
-
- }
- else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- u16_t frameCtrlMSB;
- u8_t bssid[6];
-
- /* Check Is RIFS frame and decide to enable RIFS or not */
- if( wd->sta.EnableHT )
- zfCheckIsRIFSFrame(dev, buf, frameSubtype);
-
- if ( zfPowerSavingMgrIsSleeping(dev) || wd->sta.psMgr.tempWakeUp == 1)
- {
- frameCtrlMSB = zmw_rx_buf_readb(dev, buf, 1);
-
- /* check more data */
- if ( frameCtrlMSB & ZM_BIT_5 )
- {
- //if rx frame's AC is not delivery-enabled
- if ((wd->sta.qosInfo&0xf) != 0xf)
- {
- u8_t rxAc = 0;
- if ((frameSubtype & 0x80) != 0)
- {
- rxAc = zcUpToAc[zmw_buf_readb(dev, buf, 24)&0x7];
- }
-
- if (((0x8>>rxAc) & wd->sta.qosInfo) == 0)
- {
- zfSendPSPoll(dev);
- wd->sta.psMgr.tempWakeUp = 0;
- }
- }
- }
- }
- /*increase beacon count when receive vaild data frame from AP*/
- ZM_MAC_WORD_TO_BYTE(wd->sta.bssid, bssid);
-
- if (zfStaIsConnected(dev)&&
- zfRxBufferEqualToStr(dev, buf, bssid, ZM_WLAN_HEADER_A2_OFFSET, 6))
- {
- wd->sta.rxBeaconCount++;
- }
- }
-
- zm_msg1_rx(ZM_LV_2, "Rx VAP=", vap);
-
- /* handle IV, EXT-IV, ICV, and EXT-ICV */
- zfGetRxIvIcvLength(dev, buf, vap, &offset, &tailLen, addInfo);
-
- zfStaIbssPSCheckState(dev, buf);
- //QoS data frame
- if ((frameSubtype & 0x80) == 0x80)
- {
- offset += 2;
- }
-
- len = zfwBufGetSize(dev, buf);
- /* remove ICV */
- if (tailLen > 0)
- {
- if (len > tailLen)
- {
- len -= tailLen;
- zfwBufSetSize(dev, buf, len);
- }
- }
-
- /* Filter NULL data */
- if (((frameSubtype&0x40) != 0) || ((len = zfwBufGetSize(dev, buf))<=24))
- {
- zm_msg1_rx(ZM_LV_1, "Free Rx NULL data, len=", len);
- zfwBufFree(dev, buf, 0);
- return;
- }
-
- /* check and handle defragmentation */
- if ( wd->sta.bSafeMode && (wd->sta.wepStatus == ZM_ENCRYPTION_AES) && wd->sta.SWEncryptEnable )
- {
- zm_msg0_rx(ZM_LV_1, "Bypass defragmentation packets in safe mode");
- }
- else
- {
- buf = zfDefragment(dev, buf, &bIsDefrag, addInfo);
- if (buf == NULL)
- {
- /* In this case, the buffer has been freed in zfDefragment */
- return;
- }
- }
-
- ret = ZM_MIC_SUCCESS;
-
- /* If SW WEP/TKIP are not turned on */
- if ((wd->sta.SWEncryptEnable & ZM_SW_TKIP_DECRY_EN) == 0 &&
- (wd->sta.SWEncryptEnable & ZM_SW_WEP_DECRY_EN) == 0)
- {
- encryMode = zfGetEncryModeFromRxStatus(addInfo);
-
- /* check if TKIP */
- if ( encryMode == ZM_TKIP )
- {
- if ( bIsDefrag )
- {
- ret = zfMicRxVerify(dev, buf);
- }
- else
- {
- /* check MIC failure bit */
- if ( ZM_RX_STATUS_IS_MIC_FAIL(addInfo) )
- {
- ret = ZM_MIC_FAILURE;
- }
- }
-
- if ( ret == ZM_MIC_FAILURE )
- {
- u8_t Unicast_Pkt = 0x0;
-
- if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0)
- {
- wd->commTally.swRxUnicastMicFailCount++;
- Unicast_Pkt = 0x1;
- }/*
- else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
- {
- wd->commTally.swRxMulticastMicFailCount++;
- }*/
- else
- {
- wd->commTally.swRxMulticastMicFailCount++;
- }
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- u16_t idx;
- u8_t addr[6];
-
- for (idx=0; idx<6; idx++)
- {
- addr[idx] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+idx);
- }
-
- if (wd->zfcbApMicFailureNotify != NULL)
- {
- wd->zfcbApMicFailureNotify(dev, addr, buf);
- }
- }
- else
- {
- if(Unicast_Pkt)
- {
- zm_debug_msg0("Countermeasure : Unicast_Pkt ");
- }
- else
- {
- zm_debug_msg0("Countermeasure : Non-Unicast_Pkt ");
- }
-
- if((wd->TKIP_Group_KeyChanging == 0x0) || (Unicast_Pkt == 0x1))
- {
- zm_debug_msg0("Countermeasure : Do MIC Check ");
- zfStaMicFailureHandling(dev, buf);
- }
- else
- {
- zm_debug_msg0("Countermeasure : SKIP MIC Check due to Group Keychanging ");
- }
- }
- /* Discard MIC failed frame */
- zfwBufFree(dev, buf, 0);
- return;
- }
- }
- }
- else
- {
- u8_t IsEncryFrame;
-
- /* TODO: Check whether WEP bit is turned on in MAC header */
- encryMode = ZM_NO_WEP;
-
- IsEncryFrame = (zmw_rx_buf_readb(dev, buf, 1) & 0x40);
-
- if (IsEncryFrame)
- {
- /* Software decryption for TKIP */
- if (wd->sta.SWEncryptEnable & ZM_SW_TKIP_DECRY_EN)
- {
- u16_t iv16;
- u16_t iv32;
- u8_t RC4Key[16];
- u16_t IvOffset;
- struct zsTkipSeed *rxSeed;
-
- IvOffset = offset + ZM_SIZE_OF_WLAN_DATA_HEADER;
-
- rxSeed = zfStaGetRxSeed(dev, buf);
-
- if (rxSeed == NULL)
- {
- zm_debug_msg0("rxSeed is NULL");
-
- /* Discard this frame */
- zfwBufFree(dev, buf, 0);
- return;
- }
-
- iv16 = (zmw_rx_buf_readb(dev, buf, IvOffset) << 8) + zmw_rx_buf_readb(dev, buf, IvOffset+2);
- iv32 = zmw_rx_buf_readb(dev, buf, IvOffset+4) +
- (zmw_rx_buf_readb(dev, buf, IvOffset+5) << 8) +
- (zmw_rx_buf_readb(dev, buf, IvOffset+6) << 16) +
- (zmw_rx_buf_readb(dev, buf, IvOffset+7) << 24);
-
- /* TKIP Key Mixing */
- zfTkipPhase1KeyMix(iv32, rxSeed);
- zfTkipPhase2KeyMix(iv16, rxSeed);
- zfTkipGetseeds(iv16, RC4Key, rxSeed);
-
- /* Decrypt Data */
- ret = zfTKIPDecrypt(dev, buf, IvOffset+ZM_SIZE_OF_IV+ZM_SIZE_OF_EXT_IV, 16, RC4Key);
-
- if (ret == ZM_ICV_FAILURE)
- {
- zm_debug_msg0("TKIP ICV fail");
-
- /* Discard ICV failed frame */
- zfwBufFree(dev, buf, 0);
- return;
- }
-
- /* Remove ICV from buffer */
- zfwBufSetSize(dev, buf, len-4);
-
- /* Check MIC */
- ret = zfMicRxVerify(dev, buf);
-
- if (ret == ZM_MIC_FAILURE)
- {
- if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0)
- {
- wd->commTally.swRxUnicastMicFailCount++;
- }
- else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
- {
- wd->commTally.swRxMulticastMicFailCount++;
- }
- else
- {
- wd->commTally.swRxMulticastMicFailCount++;
- }
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- u16_t idx;
- u8_t addr[6];
-
- for (idx=0; idx<6; idx++)
- {
- addr[idx] = zmw_rx_buf_readb(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+idx);
- }
-
- if (wd->zfcbApMicFailureNotify != NULL)
- {
- wd->zfcbApMicFailureNotify(dev, addr, buf);
- }
- }
- else
- {
- zfStaMicFailureHandling(dev, buf);
- }
-
- zm_debug_msg0("MIC fail");
- /* Discard MIC failed frame */
- zfwBufFree(dev, buf, 0);
- return;
- }
-
- encryMode = ZM_TKIP;
- offset += ZM_SIZE_OF_IV + ZM_SIZE_OF_EXT_IV;
- }
- else if(wd->sta.SWEncryptEnable & ZM_SW_WEP_DECRY_EN)
- {
- u16_t IvOffset;
- u8_t keyLen = 5;
- u8_t iv[3];
- u8_t keyIdx;
-
- IvOffset = offset + ZM_SIZE_OF_WLAN_DATA_HEADER;
-
- /* Retrieve IV */
- iv[0] = zmw_rx_buf_readb(dev, buf, IvOffset);
- iv[1] = zmw_rx_buf_readb(dev, buf, IvOffset+1);
- iv[2] = zmw_rx_buf_readb(dev, buf, IvOffset+2);
-
- keyIdx = ((zmw_rx_buf_readb(dev, buf, IvOffset+3) >> 6) & 0x03);
-
- IvOffset += ZM_SIZE_OF_IV;
-
- if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP64)
- {
- keyLen = 5;
- }
- else if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP128)
- {
- keyLen = 13;
- }
- else if (wd->sta.SWEncryMode[keyIdx] == ZM_WEP256)
- {
- keyLen = 29;
- }
-
- zfWEPDecrypt(dev, buf, IvOffset, keyLen, wd->sta.wepKey[keyIdx], iv);
-
- if (ret == ZM_ICV_FAILURE)
- {
- zm_debug_msg0("WEP ICV fail");
-
- /* Discard ICV failed frame */
- zfwBufFree(dev, buf, 0);
- return;
- }
-
- encryMode = wd->sta.SWEncryMode[keyIdx];
-
- /* Remove ICV from buffer */
- zfwBufSetSize(dev, buf, len-4);
-
- offset += ZM_SIZE_OF_IV;
- }
- }
- }
-
-#ifdef ZM_ENABLE_CENC
- //else if ( encryMode == ZM_CENC ) /* check if CENC */
- if ( encryMode == ZM_CENC )
- {
- u32_t rxIV[4];
-
- rxIV[0] = (zmw_rx_buf_readh(dev, buf, 28) << 16)
- + zmw_rx_buf_readh(dev, buf, 26);
- rxIV[1] = (zmw_rx_buf_readh(dev, buf, 32) << 16)
- + zmw_rx_buf_readh(dev, buf, 30);
- rxIV[2] = (zmw_rx_buf_readh(dev, buf, 36) << 16)
- + zmw_rx_buf_readh(dev, buf, 34);
- rxIV[3] = (zmw_rx_buf_readh(dev, buf, 40) << 16)
- + zmw_rx_buf_readh(dev, buf, 38);
-
- //zm_debug_msg2("rxIV[0] = 0x", rxIV[0]);
- //zm_debug_msg2("rxIV[1] = 0x", rxIV[1]);
- //zm_debug_msg2("rxIV[2] = 0x", rxIV[2]);
- //zm_debug_msg2("rxIV[3] = 0x", rxIV[3]);
-
- /* destination address*/
- da[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
- da[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+2);
- da[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+4);
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- }
- else
- {
- if ((da[0] & 0x1))
- { //multicast frame
- /* Accumlate the PN sequence */
- wd->sta.rxivGK[0] ++;
-
- if (wd->sta.rxivGK[0] == 0)
- {
- wd->sta.rxivGK[1]++;
- }
-
- if (wd->sta.rxivGK[1] == 0)
- {
- wd->sta.rxivGK[2]++;
- }
-
- if (wd->sta.rxivGK[2] == 0)
- {
- wd->sta.rxivGK[3]++;
- }
-
- if (wd->sta.rxivGK[3] == 0)
- {
- wd->sta.rxivGK[0] = 0;
- wd->sta.rxivGK[1] = 0;
- wd->sta.rxivGK[2] = 0;
- }
-
- //zm_debug_msg2("wd->sta.rxivGK[0] = 0x", wd->sta.rxivGK[0]);
- //zm_debug_msg2("wd->sta.rxivGK[1] = 0x", wd->sta.rxivGK[1]);
- //zm_debug_msg2("wd->sta.rxivGK[2] = 0x", wd->sta.rxivGK[2]);
- //zm_debug_msg2("wd->sta.rxivGK[3] = 0x", wd->sta.rxivGK[3]);
-
- if ( !((wd->sta.rxivGK[0] == rxIV[0])
- && (wd->sta.rxivGK[1] == rxIV[1])
- && (wd->sta.rxivGK[2] == rxIV[2])
- && (wd->sta.rxivGK[3] == rxIV[3])))
- {
- u8_t PacketDiscard = 0;
- /* Discard PN Code Error frame */
- if (rxIV[0] < wd->sta.rxivGK[0])
- {
- PacketDiscard = 1;
- }
- if (wd->sta.rxivGK[0] > 0xfffffff0)
- { //boundary case
- if ((rxIV[0] < 0xfffffff0)
- && (((0xffffffff - wd->sta.rxivGK[0]) + rxIV[0]) > 16))
- {
- PacketDiscard = 1;
- }
- }
- else
- { //normal case
- if ((rxIV[0] - wd->sta.rxivGK[0]) > 16)
- {
- PacketDiscard = 1;
- }
- }
- // sync sta pn code with ap because of losting some packets
- wd->sta.rxivGK[0] = rxIV[0];
- wd->sta.rxivGK[1] = rxIV[1];
- wd->sta.rxivGK[2] = rxIV[2];
- wd->sta.rxivGK[3] = rxIV[3];
- if (PacketDiscard)
- {
- zm_debug_msg0("Discard PN Code lost too much multicast frame");
- zfwBufFree(dev, buf, 0);
- return;
- }
- }
- }
- else
- { //unicast frame
- /* Accumlate the PN sequence */
- wd->sta.rxiv[0] += 2;
-
- if (wd->sta.rxiv[0] == 0 || wd->sta.rxiv[0] == 1)
- {
- wd->sta.rxiv[1]++;
- }
-
- if (wd->sta.rxiv[1] == 0)
- {
- wd->sta.rxiv[2]++;
- }
-
- if (wd->sta.rxiv[2] == 0)
- {
- wd->sta.rxiv[3]++;
- }
-
- if (wd->sta.rxiv[3] == 0)
- {
- wd->sta.rxiv[0] = 0;
- wd->sta.rxiv[1] = 0;
- wd->sta.rxiv[2] = 0;
- }
-
- //zm_debug_msg2("wd->sta.rxiv[0] = 0x", wd->sta.rxiv[0]);
- //zm_debug_msg2("wd->sta.rxiv[1] = 0x", wd->sta.rxiv[1]);
- //zm_debug_msg2("wd->sta.rxiv[2] = 0x", wd->sta.rxiv[2]);
- //zm_debug_msg2("wd->sta.rxiv[3] = 0x", wd->sta.rxiv[3]);
-
- if ( !((wd->sta.rxiv[0] == rxIV[0])
- && (wd->sta.rxiv[1] == rxIV[1])
- && (wd->sta.rxiv[2] == rxIV[2])
- && (wd->sta.rxiv[3] == rxIV[3])))
- {
- zm_debug_msg0("PN Code mismatch, lost unicast frame, sync pn code to recv packet");
- // sync sta pn code with ap because of losting some packets
- wd->sta.rxiv[0] = rxIV[0];
- wd->sta.rxiv[1] = rxIV[1];
- wd->sta.rxiv[2] = rxIV[2];
- wd->sta.rxiv[3] = rxIV[3];
- /* Discard PN Code Error frame */
- //zm_debug_msg0("Discard PN Code mismatch unicast frame");
- //zfwBufFree(dev, buf, 0);
- //return;
- }
- }
- }
- }
-#endif //ZM_ENABLE_CENC
-
- /* for tally */
- if ((zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) & 0x1) == 0)
- {
- /* for ACU to display RxRate */
- zfWlanUpdateRxRate(dev, addInfo);
-
- wd->commTally.rxUnicastFrm++;
- wd->commTally.rxUnicastOctets += (len-24);
- }
- else if (zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET) == 0xffff)
- {
- wd->commTally.rxBroadcastFrm++;
- wd->commTally.rxBroadcastOctets += (len-24);
- }
- else
- {
- wd->commTally.rxMulticastFrm++;
- wd->commTally.rxMulticastOctets += (len-24);
- }
- wd->ledStruct.rxTraffic++;
-
- if ((frameSubtype & 0x80) == 0x80)
- {
- /* if QoS control bit-7 is 1 => A-MSDU frame */
- if ((zmw_rx_buf_readh(dev, buf, 24) & 0x80) != 0)
- {
- zfDeAmsdu(dev, buf, vap, encryMode);
- return;
- }
- }
-
- // Remove MIC of TKIP
- if ( encryMode == ZM_TKIP )
- {
- zfwBufSetSize(dev, buf, zfwBufGetSize(dev, buf) - 8);
- }
-
- /* Convert 802.11 and SNAP header to ethernet header */
- if ( (wd->wlanMode == ZM_MODE_INFRASTRUCTURE)||
- (wd->wlanMode == ZM_MODE_IBSS) )
- {
- /* destination address*/
- da[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET);
- da[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+2);
- da[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A1_OFFSET+4);
-
- /* check broadcast frame */
- if ( (da[0] == 0xffff) && (da[1] == 0xffff) && (da[2] == 0xffff) )
- {
- // Ap send broadcast frame to the DUT !
- }
- /* check multicast frame */
- /* TODO : Remove these code, hardware should be able to block */
- /* multicast frame on the multicast address list */
- /* or bypass all multicast packet by flag bAllMulticast */
- else if ((da[0] & 0x01) && (wd->sta.bAllMulticast == 0))
- {
- for(ii=0; ii<wd->sta.multicastList.size; ii++)
- {
- if ( zfMemoryIsEqual(wd->sta.multicastList.macAddr[ii].addr,
- (u8_t*) da, 6))
- {
- break;
- }
- }
-
- if ( ii == wd->sta.multicastList.size )
- { /* not found */
- zm_debug_msg0("discard unknown multicast frame");
-
- zfwBufFree(dev, buf, 0);
- return;
- }
- }
-
-#ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0
- //To remove IV
- if (offset > 0)
- {
- for (i=12; i>0; i--)
- {
- zmw_rx_buf_writeh(dev, buf, ((i-1)*2)+offset,
- zmw_rx_buf_readh(dev, buf, (i-1)*2));
- }
- zfwBufRemoveHead(dev, buf, offset);
- }
-#else
-
- if (zfRxBufferEqualToStr(dev, buf, zgSnapBridgeTunnel,
- 24+offset, 6))
- {
- snapCase = 1;
- }
- else if ( zfRxBufferEqualToStr(dev, buf, zgSnap8021h,
- 24+offset, 6) )
- {
- typeLengthField =
- (((u16_t) zmw_rx_buf_readb(dev, buf, 30+offset)) << 8) +
- zmw_rx_buf_readb(dev, buf, 31+offset);
-
- //zm_debug_msg2("tpyeLengthField = ", typeLengthField);
-
- //8137 : IPX, 80F3 : Appletalk
- if ( (typeLengthField != 0x8137)&&
- (typeLengthField != 0x80F3) )
- {
- snapCase = 2;
- }
-
- if ( typeLengthField == 0x888E )
- {
- zfShowRxEAPOL(dev, buf, 32);
- }
- }
- else
- {
- //zfwDumpBuf(dev, buf);
- }
-
- /* source address */
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- /* SA = Address 3 */
- sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET);
- sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+2);
- sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A3_OFFSET+4);
- }
- else
- {
- /* SA = Address 2 */
- sa[0] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET);
- sa[1] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+2);
- sa[2] = zmw_rx_buf_readh(dev, buf, ZM_WLAN_HEADER_A2_OFFSET+4);
- }
-
- if ( snapCase )
- {
- /* SA */
- zmw_rx_buf_writeh(dev, buf, 24+offset, sa[0]);
- zmw_rx_buf_writeh(dev, buf, 26+offset, sa[1]);
- zmw_rx_buf_writeh(dev, buf, 28+offset, sa[2]);
-
- /* DA = Address 1 */
- zmw_rx_buf_writeh(dev, buf, 18+offset, da[0]);
- zmw_rx_buf_writeh(dev, buf, 20+offset, da[1]);
- zmw_rx_buf_writeh(dev, buf, 22+offset, da[2]);
- zfwBufRemoveHead(dev, buf, 18+offset);
- }
- else
- {
- /* SA */
- zmw_rx_buf_writeh(dev, buf, 16+offset, sa[0]);
- zmw_rx_buf_writeh(dev, buf, 18+offset, sa[1]);
- zmw_rx_buf_writeh(dev, buf, 20+offset, sa[2]);
-
- /* DA = Address 1 */
- zmw_rx_buf_writeh(dev, buf, 10+offset, da[0]);
- zmw_rx_buf_writeh(dev, buf, 12+offset, da[1]);
- zmw_rx_buf_writeh(dev, buf, 14+offset, da[2]);
- zfwBufRemoveHead(dev, buf, 10+offset);
- /* Ethernet payload length */
- typeLengthField = zfwBufGetSize(dev, buf) - 14;
- zmw_rx_buf_writeh(dev, buf, 12, (typeLengthField<<8)+(typeLengthField>>8));
- }
-#endif // ZM_ENABLE_NATIVE_WIFI
- }
- else if (wd->wlanMode == ZM_MODE_AP)
- {
- //if ((zmw_rx_buf_readb(dev, buf, 1) & 0x3) != 3)
- if (vap < ZM_MAX_AP_SUPPORT)
- /* AP mode */
- {
-#ifdef ZM_ENABLE_NATIVE_WIFI //Native Wifi : 1, Ethernet format : 0
- //To remove IV
- if (offset > 0)
- {
- for (i=12; i>0; i--)
- {
- zmw_rx_buf_writeh(dev, buf, ((i-1)*2)+offset,
- zmw_rx_buf_readh(dev, buf, (i-1)*2));
- }
- zfwBufRemoveHead(dev, buf, offset);
- }
-#else
- /* SA = Address 2 */
- zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A2_OFFSET));
- zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A2_OFFSET+2));
- zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A2_OFFSET+4));
- /* DA = Address 3 */
- /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */
- /* sequence must not be inverted */
- zmw_rx_buf_writeh(dev, buf, 22+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A3_OFFSET+4));
- zmw_rx_buf_writeh(dev, buf, 20+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A3_OFFSET+2));
- zmw_rx_buf_writeh(dev, buf, 18+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A3_OFFSET));
- zfwBufRemoveHead(dev, buf, 18+offset);
-#endif // ZM_ENABLE_NATIVE_WIFI
- #if 1
- ret = zfIntrabssForward(dev, buf, vap);
- if (ret == 1)
- {
- /* Free Rx buffer if intra-BSS unicast frame */
- zm_msg0_rx(ZM_LV_2, "Free intra-BSS unicast frame");
- zfwBufFree(dev, buf, 0);
- return;
- }
- #endif
- }
- else
- /* WDS mode */
- {
- zm_msg0_rx(ZM_LV_2, "Rx WDS data");
-
- /* SA = Address 4 */
- zmw_rx_buf_writeh(dev, buf, 30+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A4_OFFSET));
- zmw_rx_buf_writeh(dev, buf, 32+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A4_OFFSET+2));
- zmw_rx_buf_writeh(dev, buf, 34+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A4_OFFSET+4));
- /* DA = Address 3 */
- /* Seq : Read 20 write 22, read 18 write 20, read 16 write 18 */
- /* sequence must not be inverted */
- zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A3_OFFSET+4));
- zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A3_OFFSET+2));
- zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A3_OFFSET));
- zfwBufRemoveHead(dev, buf, 24+offset);
- }
- }
- else if (wd->wlanMode == ZM_MODE_PSEUDO)
- {
- /* WDS test: remove add4 */
- if (wd->enableWDS)
- {
- offset += 6;
- }
-
- /* SA = Address 2 */
- zmw_rx_buf_writeh(dev, buf, 24+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A2_OFFSET));
- zmw_rx_buf_writeh(dev, buf, 26+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A2_OFFSET+2));
- zmw_rx_buf_writeh(dev, buf, 28+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A2_OFFSET+4));
- /* DA = Address 1 */
- zmw_rx_buf_writeh(dev, buf, 18+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A1_OFFSET));
- zmw_rx_buf_writeh(dev, buf, 20+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A1_OFFSET+2));
- zmw_rx_buf_writeh(dev, buf, 22+offset, zmw_rx_buf_readh(dev, buf,
- ZM_WLAN_HEADER_A1_OFFSET+4));
- zfwBufRemoveHead(dev, buf, 18+offset);
- }
- else
- {
- zm_assert(0);
- }
-
- /* Call zfwRecvEth() to notify upper layer */
- //zm_msg2_rx(ZM_LV_2, "Call zfwRecvEth(), buf=", buf);
- //zfwDumpBuf(dev, buf);
-
- #if ZM_PROTOCOL_RESPONSE_SIMULATION == 1
- zfProtRspSim(dev, buf);
- #endif
- //zfwDumpBuf(dev, buf);
-
- /* tally */
- wd->commTally.NotifyNDISRxFrmCnt++;
-
- if (wd->zfcbRecvEth != NULL)
- {
- wd->zfcbRecvEth(dev, buf, vap);
- ZM_PERFORMANCE_RX_MSDU(dev, wd->tick)
- }
- }
- /* if management frame */
- else if (frameType == ZM_WLAN_MANAGEMENT_FRAME)
- {
- zm_msg2_rx(ZM_LV_2, "Rx management,FC=", frameCtrl);
- /* Call zfProcessManagement() to handle management frame */
- zfProcessManagement(dev, buf, addInfo); //CWYang(m)
- zfwBufFree(dev, buf, 0);
- }
- /* PsPoll */
- else if ((wd->wlanMode == ZM_MODE_AP) && (frameCtrl == 0xa4))
- {
- zm_msg0_rx(ZM_LV_0, "Rx PsPoll");
- zfApProcessPsPoll(dev, buf);
- zfwBufFree(dev, buf, 0);
- }
- else
- {
- zm_msg0_rx(ZM_LV_1, "Rx discard!!");
- wd->commTally.DriverDiscardedFrm++;
-
- zfwBufFree(dev, buf, 0);
- }
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfWlanRxValidate */
-/* Validate Rx frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : received 802.11 frame buffer. */
-/* */
-/* OUTPUTS */
-/* Error code */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfWlanRxValidate(zdev_t* dev, zbuf_t* buf)
-{
- u16_t frameType;
- u16_t frameCtrl;
- u16_t frameLen;
- u16_t ret;
- u8_t frameSubType;
-
- zmw_get_wlan_dev(dev);
-
- frameCtrl = zmw_rx_buf_readh(dev, buf, 0);
- frameType = frameCtrl & 0xC;
- frameSubType = (frameCtrl & 0xF0) >> 4;
-
- frameLen = zfwBufGetSize(dev, buf);
-
- /* Accept Data/Management frame with protocol version = 0 */
- if ((frameType == 0x8) || (frameType == 0x0))
- {
-
- /* TODO : check rx status => erro bit */
-
- /* Check Minimum Length with Wep */
- if ((frameCtrl & 0x4000) != 0)
- {
- /* Minimum Length = */
- /* PLCP(5)+Header(24)+IV(4)+ICV(4)+CRC(4)+RxStatus(8) */
- if (frameLen < 32)
- {
- return ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH;
- }
- }
- else if ( frameSubType == 0x5 || frameSubType == 0x8 )
- {
- /* Minimum Length = PLCP(5)+MACHeader(24)+Timestamp(8)+BeaconInterval(2)+Cap(2)+CRC(4)+RxStatus(8) */
- if (frameLen < 36)
- {
- return ZM_ERR_MIN_RX_FRAME_LENGTH;
- }
- }
- else
- {
- /* Minimum Length = PLCP(5)+MACHeader(24)+CRC(4)+RxStatus(8) */
- if (frameLen < 24)
- {
- return ZM_ERR_MIN_RX_FRAME_LENGTH;
- }
- }
-
- /* Check if frame Length > ZM_WLAN_MAX_RX_SIZE. */
- if (frameLen > ZM_WLAN_MAX_RX_SIZE)
- {
- return ZM_ERR_MAX_RX_FRAME_LENGTH;
- }
- }
- else if ((frameCtrl&0xff) == 0xa4)
- {
- /* PsPoll */
- //zm_msg0_rx(ZM_LV_0, "rx pspoll");
- }
- else if ((frameCtrl&0xff) == ZM_WLAN_FRAME_TYPE_BAR)
- {
- if (wd->sta.enableDrvBA == 1)
- {
- zfAggRecvBAR(dev, buf);
- }
-
- return ZM_ERR_RX_BAR_FRAME;
- }
- else
- {
- return ZM_ERR_RX_FRAME_TYPE;
- }
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- }
- else if ( wd->wlanMode != ZM_MODE_PSEUDO )
- {
- ret = zfStaRxValidateFrame(dev, buf);
- if (ret != ZM_SUCCESS)
- {
- //zm_debug_msg1("discard frame, code = ", ret);
- return ret;
- }
- }
-
- return ZM_SUCCESS;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfWlanRxFilter */
-/* Filter duplicated frame. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : received 802.11 frame buffer. */
-/* */
-/* OUTPUTS */
-/* Error code */
-/* */
-/* AUTHOR */
-/* Stephen ZyDAS Technology Corporation 2005.10 */
-/* */
-/************************************************************************/
-u16_t zfWlanRxFilter(zdev_t* dev, zbuf_t* buf)
-{
- u16_t src[3];
- u16_t dst0;
- u16_t frameType;
- u16_t seq;
- u16_t offset;
- u16_t index;
- u16_t col;
- u16_t i;
- u8_t up = 0; /* User priority */
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- ZM_BUFFER_TRACE(dev, buf)
-
- /* RX PREFIX */
- offset = 0;
-
- frameType = zmw_rx_buf_readh(dev, buf, offset);
-
- // Don't divide 2^4 because we don't want the fragmentation pkt to be treated as
- // duplicated frames
- seq = zmw_rx_buf_readh(dev, buf, offset+22);
- dst0 = zmw_rx_buf_readh(dev, buf, offset+4);
- src[0] = zmw_rx_buf_readh(dev, buf, offset+10);
- src[1] = zmw_rx_buf_readh(dev, buf, offset+12);
- src[2] = zmw_rx_buf_readh(dev, buf, offset+14);
-
- /* QoS data frame */
- if ((frameType & 0x88) == 0x88)
- {
- up = zmw_rx_buf_readb(dev, buf, offset+24);
- up &= 0x7;
- }
-
- index = (src[2]+up) & (ZM_FILTER_TABLE_ROW-1);
-
- /* TBD : filter frame with source address == own MAC address */
- if ((wd->macAddr[0] == src[0]) && (wd->macAddr[1] == src[1])
- && (wd->macAddr[2] == src[2]))
- {
- //zm_msg0_rx(ZM_LV_0, "Rx filter=>src is own MAC");
- wd->trafTally.rxSrcIsOwnMac++;
-#if 0
- return ZM_ERR_RX_SRC_ADDR_IS_OWN_MAC;
-#endif
- }
-
- zm_msg2_rx(ZM_LV_2, "Rx seq=", seq);
-
- /* Filter unicast frame only */
- if ((dst0 & 0x1) == 0)
- {
- zmw_enter_critical_section(dev);
-
- for(i=0; i<ZM_FILTER_TABLE_COL; i++)
- {
- if ((wd->rxFilterTbl[i][index].addr[0] == src[0])
- && (wd->rxFilterTbl[i][index].addr[1] == src[1])
- && (wd->rxFilterTbl[i][index].addr[2] == src[2])
- && (wd->rxFilterTbl[i][index].up == up))
- {
- if (((frameType&0x800)==0x800)
- &&(wd->rxFilterTbl[i][index].seq==seq))
- {
- zmw_leave_critical_section(dev);
- /* hit : duplicated frame */
- zm_msg0_rx(ZM_LV_1, "Rx filter hit=>duplicated");
- wd->trafTally.rxDuplicate++;
- return ZM_ERR_RX_DUPLICATE;
- }
- else
- {
- /* hit : not duplicated frame, update sequence number */
- wd->rxFilterTbl[i][index].seq = seq;
- zmw_leave_critical_section(dev);
- zm_msg0_rx(ZM_LV_2, "Rx filter hit");
- return ZM_SUCCESS;
- }
- }
- } /* for(i=0; i<ZM_FILTER_TABLE_COL; i++) */
-
- /* miss : add to table */
- zm_msg0_rx(ZM_LV_1, "Rx filter miss");
- /* TODO : Random select a column */
- col = (u16_t)(wd->tick & (ZM_FILTER_TABLE_COL-1));
- wd->rxFilterTbl[col][index].addr[0] = src[0];
- wd->rxFilterTbl[col][index].addr[1] = src[1];
- wd->rxFilterTbl[col][index].addr[2] = src[2];
- wd->rxFilterTbl[col][index].seq = seq;
- wd->rxFilterTbl[col][index].up = up;
-
- zmw_leave_critical_section(dev);
- } /* if ((dst0 & 0x1) == 0) */
-
- return ZM_SUCCESS;
-}
-
-
-
-u16_t zfTxGenWlanTail(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t snaplen,
- u16_t* mic)
-{
- struct zsMicVar* pMicKey;
- u16_t i, length, payloadOffset;
- u8_t bValue, qosType = 0;
- u8_t snapByte[12];
-
- zmw_get_wlan_dev(dev);
-
- if ( wd->wlanMode == ZM_MODE_AP )
- {
- pMicKey = zfApGetTxMicKey(dev, buf, &qosType);
-
- if ( pMicKey == NULL )
- {
- return 0;
- }
- }
- else if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- pMicKey = zfStaGetTxMicKey(dev, buf);
-
- if ( pMicKey == NULL )
- {
- return 0;
- }
- }
- else
- {
- return 0;
- }
-
- length = zfwBufGetSize(dev, buf);
-
- zfMicClear(pMicKey);
-
- /* append DA and SA */
-#ifdef ZM_ENABLE_NATIVE_WIFI
- for(i=16; i<22; i++)
- { // VISTA DA
- bValue = zmw_tx_buf_readb(dev, buf, i);
- zfMicAppendByte(bValue, pMicKey);
- }
- for(i=10; i<16; i++)
- { // VISTA SA
- bValue = zmw_tx_buf_readb(dev, buf, i);
- zfMicAppendByte(bValue, pMicKey);
- }
-#else
- for(i=0; i<12; i++)
- {
- bValue = zmw_tx_buf_readb(dev, buf, i);
- zfMicAppendByte(bValue, pMicKey);
- }
-#endif
-
- /* append for alignment */
- if ( wd->wlanMode == ZM_MODE_INFRASTRUCTURE )
- {
- if (wd->sta.wmeConnected != 0)
- zfMicAppendByte(zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1) >> 5, pMicKey);
- else
- zfMicAppendByte(0, pMicKey);
- }
- else if ( wd->wlanMode == ZM_MODE_AP )
- {
- if (qosType == 1)
- zfMicAppendByte(zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1) >> 5, pMicKey);
- else
- zfMicAppendByte(0, pMicKey);
- }
- else
- {
- /* TODO : Qos Software MIC in IBSS Mode */
- zfMicAppendByte(0, pMicKey);
- }
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
- zfMicAppendByte(0, pMicKey);
-
- if ( snaplen == 0 )
- {
- payloadOffset = ZM_80211_FRAME_IP_OFFSET;
- }
- else
- {
- payloadOffset = ZM_80211_FRAME_TYPE_OFFSET;
-
- for(i=0; i<(snaplen>>1); i++)
- {
- snapByte[i*2] = (u8_t) (snap[i] & 0xff);
- snapByte[i*2+1] = (u8_t) ((snap[i] >> 8) & 0xff);
- }
-
- for(i=0; i<snaplen; i++)
- {
- zfMicAppendByte(snapByte[i], pMicKey);
- }
- }
-
- for(i=payloadOffset; i<length; i++)
- {
- bValue = zmw_tx_buf_readb(dev, buf, i);
- zfMicAppendByte(bValue, pMicKey);
- }
-
- zfMicGetMic( (u8_t*) mic, pMicKey);
-
- return ZM_SIZE_OF_MIC;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfTxGetIpTosAndFrag */
-/* Get IP TOS and frag offset from Tx buffer */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : Tx buffer pointer */
-/* up : pointer for returning user priority */
-/* fragOff : pointer for returning ip frag offset */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-void zfTxGetIpTosAndFrag(zdev_t* dev, zbuf_t* buf, u8_t* up, u16_t* fragOff)
-{
- u8_t ipv;
- u16_t len;
- u16_t etherType;
- u8_t tos;
-
- *up = 0;
- *fragOff = 0;
-
- len = zfwBufGetSize(dev, buf);
-
- if (len >= 34) //Minimum IPv4 packet size, 14(Ether header)+20(IPv4 header)
- {
- etherType = (((u16_t)zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_TYPE_OFFSET))<<8)
- + zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_TYPE_OFFSET + 1);
-
- /* protocol type = IP */
- if (etherType == 0x0800)
- {
- ipv = zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET) >> 4;
- if (ipv == 0x4) //IPv4
- {
- tos = zmw_tx_buf_readb(dev, buf, ZM_80211_FRAME_IP_OFFSET + 1);
- *up = (tos >> 5);
- *fragOff = zmw_tx_buf_readh(dev, buf, ZM_80211_FRAME_IP_OFFSET + 6);
- }
- /* TODO : handle VLAN tag and IPv6 packet */
- }
- }
- return;
-}
-
-#ifdef ZM_ENABLE_NATIVE_WIFI
-u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen)
-{
- snap[0] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 0);
- snap[1] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 2);
- snap[2] = zmw_buf_readh(dev, buf, ZM_80211_FRAME_HEADER_LEN + 4);
- *snaplen = 6;
-
- return ZM_80211_FRAME_HEADER_LEN + *snaplen;
-}
-#else
-u16_t zfTxGenWlanSnap(zdev_t* dev, zbuf_t* buf, u16_t* snap, u16_t* snaplen)
-{
- u16_t removed;
- u16_t etherType;
- u16_t len;
-
- len = zfwBufGetSize(dev, buf);
- if (len < 14) //Minimum Ethernet packet size, 14(Ether header)
- {
- /* TODO : Assert? */
- *snaplen = 0;
- return 0;
- }
-
- /* Generate RFC1042 header */
- etherType = (((u16_t)zmw_tx_buf_readb(dev, buf, 12))<<8)
- + zmw_tx_buf_readb(dev, buf, 13);
-
- //zm_debug_msg2("ethernet type or length = ", etherType);
-
- if (etherType > 1500)
- {
- /* ETHERNET format */
- removed = 12;
- snap[0] = 0xaaaa;
- snap[1] = 0x0003;
- if ((etherType ==0x8137) || (etherType == 0x80f3))
- {
- /* Bridge Tunnel */
- snap[2] = 0xF800;
- }
- else
- {
- /* RFC 1042 */
- snap[2] = 0x0000;
- }
- *snaplen = 6;
-
- if ( etherType == 0x888E )
- {
- zfShowTxEAPOL(dev, buf, 14);
- }
- }
- else
- {
- /* 802.3 format */
- removed = 14;
- *snaplen = 0;
- }
-
- return removed;
-}
-#endif
-
-u8_t zfIsVtxqEmpty(zdev_t* dev)
-{
- u8_t isEmpty = TRUE;
- u8_t i;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (wd->vmmqHead != wd->vmmqTail)
- {
- isEmpty = FALSE;
- goto check_done;
- }
-
- for(i=0; i < 4; i++)
- {
- if (wd->vtxqHead[i] != wd->vtxqTail[i])
- {
- isEmpty = FALSE;
- goto check_done;
- }
- }
-
-check_done:
- zmw_leave_critical_section(dev);
- return isEmpty;
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfPutVtxq */
-/* Put Tx buffer to virtual TxQ */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : Tx buffer pointer */
-/* */
-/* OUTPUTS */
-/* ZM_SUCCESS or error code */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-u16_t zfPutVtxq(zdev_t* dev, zbuf_t* buf)
-{
- u8_t ac;
- u8_t up;
- u16_t fragOff;
-#ifdef ZM_AGG_TALLY
- struct aggTally *agg_tal;
-#endif
-#ifdef ZM_ENABLE_AGGREGATION
- #ifndef ZM_BYPASS_AGGR_SCHEDULING
- u16_t ret;
- u16_t tid;
- #endif
-#endif
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- zfTxGetIpTosAndFrag(dev, buf, &up, &fragOff);
-
- if ( wd->zfcbClassifyTxPacket != NULL )
- {
- ac = wd->zfcbClassifyTxPacket(dev, buf);
- }
- else
- {
- ac = zcUpToAc[up&0x7] & 0x3;
- }
-
- /*
- * add by honda
- * main A-MPDU aggregation function
- */
-#ifdef ZM_AGG_TALLY
- agg_tal = &wd->agg_tal;
- agg_tal->got_packets_sum++;
-
-#endif
-
-#ifdef ZM_ENABLE_AGGREGATION
- #ifndef ZM_BYPASS_AGGR_SCHEDULING
- tid = up&0x7;
- if(wd->enableAggregation==0)
- {
- if( (wd->wlanMode == ZM_MODE_AP) ||
- (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
- (wd->wlanMode == ZM_MODE_PSEUDO) ) {
- // (infrastructure_mode && connect_to_11n_ap) || (ap_mode && is_11n_ap)
- //ret = zfAggPutVtxq(dev, buf);
-
-
- ret = zfAggTx(dev, buf, tid);
- if (ZM_SUCCESS == ret)
- {
- //zfwBufFree(dev, buf, ZM_SUCCESS);
-
- return ZM_SUCCESS;
- }
- if (ZM_ERR_EXCEED_PRIORITY_THRESHOLD == ret)
- {
- wd->commTally.txQosDropCount[ac]++;
- zfwBufFree(dev, buf, ZM_SUCCESS);
-
- zm_msg1_tx(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac);
-
- return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
- }
- if (ZM_ERR_TX_BUFFER_UNAVAILABLE == ret)
- {
- /*
- * do nothing
- * continue following procession, put into VTXQ
- * return ZM_SUCCESS;
- */
- }
- }
- }
- #endif
-#endif
- /*
- * end of add by honda
- */
-
- /* First Ip frag */
- if ((fragOff & 0xff3f) == 0x0020)
- {
- /* Don't let ip frag in if VTXQ unable to hold */
- /* whole ip frag burst(assume 20 frag) */
- zmw_enter_critical_section(dev);
- if (((wd->vtxqHead[ac] - wd->vtxqTail[ac])& ZM_VTXQ_SIZE_MASK)
- > (ZM_VTXQ_SIZE-20))
- {
- wd->qosDropIpFrag[ac] = 1;
- }
- else
- {
- wd->qosDropIpFrag[ac] = 0;
- }
- zmw_leave_critical_section(dev);
-
- if (wd->qosDropIpFrag[ac] == 1)
- {
- //zm_debug_msg2("vtQ full, drop buf = ", buf);
- wd->commTally.txQosDropCount[ac]++;
- zfwBufFree(dev, buf, ZM_SUCCESS);
- zm_msg1_tx(ZM_LV_1, "Packet discarded, first ip frag, ac=", ac);
- //VTXQ[] can not hold whold ip frag burst(assume 20 frags)
- return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
- }
- }
- else if ((fragOff & 0xff3f) == 0)
- {
- wd->qosDropIpFrag[ac] = 0;
- }
-
- if (((fragOff &= 0xff1f) != 0) && (wd->qosDropIpFrag[ac] == 1))
- {
- wd->commTally.txQosDropCount[ac]++;
- zfwBufFree(dev, buf, ZM_SUCCESS);
- zm_msg1_tx(ZM_LV_1, "Packet discarded, ip frag, ac=", ac);
- //Discard following ip frags
- return ZM_ERR_EXCEED_PRIORITY_THRESHOLD;
- }
-
- zmw_enter_critical_section(dev);
- if (((wd->vtxqHead[ac] + 1) & ZM_VTXQ_SIZE_MASK) != wd->vtxqTail[ac])
- {
- wd->vtxq[ac][wd->vtxqHead[ac]] = buf;
- wd->vtxqHead[ac] = ((wd->vtxqHead[ac] + 1) & ZM_VTXQ_SIZE_MASK);
- zmw_leave_critical_section(dev);
- return ZM_SUCCESS;
- }
- else
- {
- zmw_leave_critical_section(dev);
-
- wd->commTally.txQosDropCount[ac]++;
- zfwBufFree(dev, buf, ZM_SUCCESS);
- zm_msg1_tx(ZM_LV_1, "Packet discarded, VTXQ full, ac=", ac);
- return ZM_ERR_EXCEED_PRIORITY_THRESHOLD; //VTXQ[] Full
- }
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfGetVtxq */
-/* Get Tx buffer from virtual TxQ */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* Tx buffer pointer */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-zbuf_t* zfGetVtxq(zdev_t* dev, u8_t ac)
-{
- zbuf_t* buf;
-
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- ac &= 0x3;
- zmw_enter_critical_section(dev);
- if (wd->vtxqHead[ac] != wd->vtxqTail[ac])
- {
- buf = wd->vtxq[ac][wd->vtxqTail[ac]];
- wd->vtxqTail[ac] = ((wd->vtxqTail[ac] + 1) & ZM_VTXQ_SIZE_MASK);
- zmw_leave_critical_section(dev);
- return buf;
- }
- else
- {
- zmw_leave_critical_section(dev);
- return 0; //VTXQ[] empty
- }
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfPutVmmq */
-/* Put Tx buffer to virtual MmQ */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* buf : Tx buffer pointer */
-/* */
-/* OUTPUTS */
-/* ZM_SUCCESS or error code */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.12 */
-/* */
-/************************************************************************/
-u16_t zfPutVmmq(zdev_t* dev, zbuf_t* buf)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (((wd->vmmqHead + 1) & ZM_VMMQ_SIZE_MASK) != wd->vmmqTail)
- {
- wd->vmmq[wd->vmmqHead] = buf;
- wd->vmmqHead = ((wd->vmmqHead + 1) & ZM_VMMQ_SIZE_MASK);
- zmw_leave_critical_section(dev);
- return ZM_SUCCESS;
- }
- else
- {
- zmw_leave_critical_section(dev);
-
- zfwBufFree(dev, buf, ZM_SUCCESS);
- zm_msg0_mm(ZM_LV_0, "Packet discarded, VMmQ full");
- return ZM_ERR_VMMQ_FULL; //VTXQ[] Full
- }
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfGetVmmq */
-/* Get Tx buffer from virtual MmQ */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* Tx buffer pointer */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.12 */
-/* */
-/************************************************************************/
-zbuf_t* zfGetVmmq(zdev_t* dev)
-{
- zbuf_t* buf;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
- if (wd->vmmqHead != wd->vmmqTail)
- {
- buf = wd->vmmq[wd->vmmqTail];
- wd->vmmqTail = ((wd->vmmqTail + 1) & ZM_VMMQ_SIZE_MASK);
- zmw_leave_critical_section(dev);
- return buf;
- }
- else
- {
- zmw_leave_critical_section(dev);
- return 0; //VTXQ[] empty
- }
-}
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfPushVtxq */
-/* Service Virtual TxQ (weighted round robin) */
-/* Get Tx buffer form virtual TxQ and put to hardware TxD queue */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen ZyDAS Technology Corporation 2006.6 */
-/* */
-/************************************************************************/
-void zfPushVtxq(zdev_t* dev)
-{
- zbuf_t* buf;
- u16_t i;
- u16_t txed;
- u32_t freeTxd;
- u16_t err;
- u16_t skipFlag = 0;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
-
-
- //zm_debug_msg1("zfHpGetFreeTxdCount = ", zfHpGetFreeTxdCount(dev));
-
- if (wd->halState == ZM_HAL_STATE_INIT)
- {
- if (!wd->modeMDKEnable)
- {
- zm_debug_msg0("HAL is not ready for Tx");
- }
- return;
- }
- else if (wd->sta.DFSDisableTx)
- {
- zm_debug_msg0("return because 802.11h DFS Disable Tx");
- return;
- }
- else if (wd->sta.flagFreqChanging != 0)
- {
- //Hold until RF frequency changed
- return;
- }
- else if (( wd->sta.flagKeyChanging ) && ( wd->wlanMode != ZM_MODE_AP ))
- {
- return;
- }
-#ifdef ZM_ENABLE_POWER_SAVE
- else if ( zfPowerSavingMgrIsSleeping(dev) )
- {
- //zm_debug_msg0("Packets queued since the MAC is in power-saving mode\n");
- return;
- }
-#endif
-
- zmw_enter_critical_section(dev);
- if (wd->vtxqPushing != 0)
- {
- skipFlag = 1;
- }
- else
- {
- wd->vtxqPushing = 1;
- }
- zmw_leave_critical_section(dev);
-
- if (skipFlag == 1)
- {
- return;
- }
-
- while (1)
- {
- txed = 0;
-
- /* 2006.12.20, Serve Management queue */
- while( zfHpGetFreeTxdCount(dev) > 0 )
- {
- buf = zfGetVmmq(dev);
- if (buf != 0)
- {
- txed = 1;
- //zm_debug_msg2("send buf = ", buf);
- err = zfHpSend(dev, NULL, 0, NULL, 0, NULL, 0, buf, 0,
- ZM_INTERNAL_ALLOC_BUF, 0, 0xff);
- if (err != ZM_SUCCESS)
- {
- zfwBufFree(dev, buf, 0);
- }
- }
- else
- {
- break;
- }
- }
- if ((wd->sta.bScheduleScan) || ((wd->sta.bChannelScan == TRUE) && (zfStaIsConnected(dev))))
- {
- //Hold until Scan Stop
- wd->vtxqPushing = 0;
- return;
- }
-
-#ifdef ZM_ENABLE_AGGREGATION
- #ifndef ZM_BYPASS_AGGR_SCHEDULING
- if( (wd->wlanMode == ZM_MODE_AP) ||
- (wd->wlanMode == ZM_MODE_INFRASTRUCTURE && wd->sta.EnableHT) ||
- (wd->wlanMode == ZM_MODE_PSEUDO) ) {
-
- zfAggTxScheduler(dev, 0);
-
- if (txed == 0) {
- wd->vtxqPushing = 0;
- return;
- }
- else {
- continue;
- }
- }
- #endif
-#endif
-
- /* Service VTxQ[3] */
- for (i=0; i<4; i++)
- {
- freeTxd = zfHpGetFreeTxdCount(dev);
- if (freeTxd >= 3)
- {
- buf = zfGetVtxq(dev, 3);
- if (buf != 0)
- {
- txed = 1;
- //zm_debug_msg2("send buf = ", buf);
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
- }
- }
- else
- {
- break;
- }
- }
-
- /* Service VTxQ[2] */
- for (i=0; i<3; i++)
- {
- freeTxd = zfHpGetFreeTxdCount(dev);
- if (freeTxd >= (zfHpGetMaxTxdCount(dev)*1/4))
- {
- buf = zfGetVtxq(dev, 2);
- if (buf != 0)
- {
- txed = 1;
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
- }
- if (wd->sta.ac0PriorityHigherThanAc2 == 1)
- {
- buf = zfGetVtxq(dev, 0);
- if (buf != 0)
- {
- txed = 1;
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
- }
- }
- }
- else
- {
- break;
- }
- }
-
- /* Service VTxQ[0] */
- for (i=0; i<2; i++)
- {
- freeTxd = zfHpGetFreeTxdCount(dev);
- if (freeTxd >= (zfHpGetMaxTxdCount(dev)*2/4))
- {
- buf = zfGetVtxq(dev, 0);
- if (buf != 0)
- {
- txed = 1;
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
- }
- }
- else
- {
- break;
- }
-
- }
-
- /* Service VTxQ[1] */
- freeTxd = zfHpGetFreeTxdCount(dev);
- if (freeTxd >= (zfHpGetMaxTxdCount(dev)*3/4))
- {
- buf = zfGetVtxq(dev, 1);
- if (buf != 0)
- {
- txed = 1;
- zfTxSendEth(dev, buf, 0, ZM_EXTERNAL_ALLOC_BUF, 0);
- ZM_PERFORMANCE_TX_MPDU(dev, wd->tick);
- }
- }
-
- /* All VTxQs are either empty or exceed their threshold */
- if (txed == 0)
- {
- wd->vtxqPushing = 0;
- return;
- }
- } //while (1)
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfFlushVtxq */
-/* Flush Virtual TxQ and MmQ */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.1 */
-/* */
-/************************************************************************/
-void zfFlushVtxq(zdev_t* dev)
-{
- zbuf_t* buf;
- u8_t i;
- zmw_get_wlan_dev(dev);
-
- /* Flush MmQ */
- while ((buf = zfGetVmmq(dev)) != 0)
- {
- zfwBufFree(dev, buf, 0);
- zm_debug_msg0("zfFlushVtxq: [Vmmq]");
- wd->queueFlushed |= 0x10;
- }
-
- /* Flush VTxQ */
- for (i=0; i<4; i++)
- {
- while ((buf = zfGetVtxq(dev, i)) != 0)
- {
- zfwBufFree(dev, buf, 0);
- zm_debug_msg1("zfFlushVtxq: [zfGetVtxq]- ", i);
- wd->queueFlushed |= (1<<i);
- }
- }
-}
-
-void zf80211FrameSend(zdev_t* dev, zbuf_t* buf, u16_t* header, u16_t snapLen,
- u16_t* da, u16_t* sa, u8_t up, u16_t headerLen, u16_t* snap,
- u16_t* tail, u16_t tailLen, u16_t offset, u16_t bufType,
- u8_t ac, u8_t keyIdx)
-{
- u16_t err;
- u16_t fragLen;
-
- zmw_get_wlan_dev(dev);
-
- fragLen = zfwBufGetSize(dev, buf);
- if ((da[0]&0x1) == 0)
- {
- wd->commTally.txUnicastFrm++;
- wd->commTally.txUnicastOctets += (fragLen+snapLen);
- }
- else if (da[0] == 0xffff)
- {
- wd->commTally.txBroadcastFrm++;
- wd->commTally.txBroadcastOctets += (fragLen+snapLen);
- }
- else
- {
- wd->commTally.txMulticastFrm++;
- wd->commTally.txMulticastOctets += (fragLen+snapLen);
- }
- wd->ledStruct.txTraffic++;
-
- err = zfHpSend(dev, header, headerLen, snap, snapLen,
- tail, tailLen, buf, offset,
- bufType, ac, keyIdx);
- if (err != ZM_SUCCESS)
- {
- if (bufType == ZM_EXTERNAL_ALLOC_BUF)
- {
- zfwBufFree(dev, buf, err);
- }
- else if (bufType == ZM_INTERNAL_ALLOC_BUF)
- {
- zfwBufFree(dev, buf, 0);
- }
- else
- {
- zm_assert(0);
- }
- }
-}
-
-void zfCheckIsRIFSFrame(zdev_t* dev, zbuf_t* buf, u16_t frameSubtype)
-{
- zmw_get_wlan_dev(dev);
-
- /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */
- if (frameSubtype & 0x80)
- { //QoS data frame
- u16_t sequenceNum;
- u16_t qosControlField;
-
- sequenceNum = ( zmw_buf_readh(dev, buf, 22) >> 4 ); // Discard fragment number !
- qosControlField = zmw_buf_readh(dev, buf, 24); // Don't consider WDS (Wireless Distribution System)
- //DbgPrint("The QoS Control Field : %d", qosControlField);
- //DbgPrint("The RIFS Count : %d", wd->sta.rifsCount);
-
- if( qosControlField & ZM_BIT_5 )
- {// ACK policy is "No ACK"
- /* RIFS-Like frame */
- wd->sta.rifsLikeFrameSequence[wd->sta.rifsLikeFrameCnt] = sequenceNum;
-
- if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTING )
- {
- if( wd->sta.rifsLikeFrameSequence[2] != 0 )
- {// RIFS-like Pattern collected
- if( ( wd->sta.rifsLikeFrameSequence[2] - wd->sta.rifsLikeFrameSequence[1] == 2 ) &&
- ( wd->sta.rifsLikeFrameSequence[1] - wd->sta.rifsLikeFrameSequence[0] == 2 ) )
- {
- /* RIFS pattern matched */
-
- /* #3 Enable RIFS function if the RIFS pattern matched */
- zfHpEnableRifs(dev, ((wd->sta.currentFrequency<3000)?1:0), wd->sta.EnableHT, wd->sta.HT2040);
-
- // Set RIFS timer
- wd->sta.rifsTimer = wd->tick;
-
- wd->sta.rifsCount++;
-
- // Set state to be Detected
- wd->sta.rifsState = ZM_RIFS_STATE_DETECTED;
- }
- }
- }
- else
- {// state = Detected
- // Reset RIFS timer
- if( (wd->tick - wd->sta.rifsTimer) < ZM_RIFS_TIMER_TIMEOUT )
- wd->sta.rifsTimer = wd->tick;
- }
-
- //DbgPrint("SN1 = %d, SN2 = %d, SN3 = %d\n", wd->sta.rifsLikeFrameSequence[0],
- // wd->sta.rifsLikeFrameSequence[1],
- // wd->sta.rifsLikeFrameSequence[2]);
-
- // Update RIFS-like sequence number
- if( wd->sta.rifsLikeFrameSequence[2] != 0 )
- {
- wd->sta.rifsLikeFrameSequence[0] = wd->sta.rifsLikeFrameSequence[1];
- wd->sta.rifsLikeFrameSequence[1] = wd->sta.rifsLikeFrameSequence[2];
- wd->sta.rifsLikeFrameSequence[2] = 0;
- }
-
- // Only record three adjacent frame
- if( wd->sta.rifsLikeFrameCnt < 2 )
- wd->sta.rifsLikeFrameCnt++;
- }
- }
-
- /* #4 Disable RIFS function if the timer TIMEOUT */
- if( wd->sta.rifsState == ZM_RIFS_STATE_DETECTED )
- {
- if( ( wd->tick - wd->sta.rifsTimer ) > ZM_RIFS_TIMER_TIMEOUT )
- {// TIMEOUT
- // Disable RIFS
- zfHpDisableRifs(dev);
-
- // Reset RIFS-like sequence number FIFO
- wd->sta.rifsLikeFrameSequence[0] = 0;
- wd->sta.rifsLikeFrameSequence[1] = 0;
- wd->sta.rifsLikeFrameSequence[2] = 0;
- wd->sta.rifsLikeFrameCnt = 0;
-
- // Set state to be Detecting
- wd->sta.rifsState = ZM_RIFS_STATE_DETECTING;
- }
- }
-}
diff --git a/drivers/staging/otus/80211core/cwep.c b/drivers/staging/otus/80211core/cwep.c
deleted file mode 100644
index ec31bb1..0000000
--- a/drivers/staging/otus/80211core/cwep.c
+++ /dev/null
@@ -1,299 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : cwep.c */
-/* */
-/* Abstract */
-/* This module contains Tx and Rx functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-
-u32_t crc32_tab[] =
-{
- 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
- 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
- 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
- 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
- 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
- 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
- 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
- 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
- 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
- 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
- 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
- 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
- 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
- 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
- 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
- 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
- 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
- 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
- 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
- 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
- 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
- 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
- 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
- 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
- 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
- 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
- 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
- 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
- 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
- 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
- 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
- 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
- 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
- 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
- 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
- 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
- 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
- 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
- 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
- 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
- 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
- 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
- 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
- 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
- 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
- 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
- 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
- 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
- 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
- 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
- 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
- 0x2d02ef8dL
-};
-
-void zfWEPEncrypt(zdev_t *dev, zbuf_t *buf, u8_t *snap, u16_t snapLen, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv)
-{
- u8_t S[256],S2[256];
- u16_t ui;
- u16_t i;
- u16_t j;
- u8_t temp;
- u8_t K;
- u32_t ltemp;
- u16_t len;
- u32_t icv;
- u8_t key[32];
-
- key[0] = iv[0];
- key[1] = iv[1];
- key[2] = iv[2];
-
- /* Append Wep Key after IV */
- zfMemoryCopy(&key[3], WepKey, keyLen);
-
- keyLen += 3;
-
- for(i = 0; i < 256; i++)
- {
- S[i] = (u8_t)i;
- S2[i] = key[i&(keyLen-1)];
- }
-
- j = 0;
- for(i = 0; i < 256; i++)
- {
- j = (j + S[i] + S2[i]) ;
- j&=255 ;
-
- // Swap S[i] and S[j]
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
- }
-
- i = j = 0;
- icv = -1;
-
- /* For Snap Header */
- for (ui = 0; ui < snapLen; ui++)
- {
- u8_t In;
-
- i++;
- i &= 255;
- j += S[i];
- j &= 255;
-
- // Swap S[i] and S[j]
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
-// temp = (S[i] + temp) & 255;
- temp += S[i];
- temp &=255;
- K = S[temp]; // Key used to Xor with input data
-
- In = snap[ui];
- icv = (icv>>8) ^ crc32_tab[(icv^In)&0xff];
-
- snap[ui] = In ^ K;
- //zmw_tx_buf_writeb(dev, buf, ui, In ^ K);
- }
-
- len = zfwBufGetSize(dev, buf);
-
- for (ui = offset; ui < len; ui++)
- {
- u8_t In;
-
- i++;
- i &= 255;
- j += S[i];
- j &= 255;
-
- // Swap S[i] and S[j]
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
-// temp = (S[i] + temp) & 255;
- temp += S[i];
- temp &=255;
- K = S[temp]; // Key used to Xor with input data
-
- In = zmw_tx_buf_readb(dev, buf, ui);
- icv = (icv>>8) ^ crc32_tab[(icv^In)&0xff];
-
- zmw_tx_buf_writeb(dev, buf, ui, In ^ K);
- } //End of for (ui = 0; ui < Num_Bytes; ui++)
-
- icv = ~(icv);
- ltemp = (u32_t) icv;
-
- for (ui = 0; ui < 4; ui++)
- {
- i ++;
- i &= 255;
- j += S[i];
- j &= 255;
-
- // Swap S[i] and S[j]
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
- temp += S[i];
- temp &= 255;
- K = S[temp]; // Key used to Xor with input data
-
- //*Out++ = (u8_t)(ltemp ^ K)&0xff;
- zmw_tx_buf_writeb(dev, buf, len+ui, (u8_t)(ltemp ^ K)&0xff);
- ltemp >>= 8;
- }
-
- zfwBufSetSize(dev, buf, len+4);
-}
-
-u16_t zfWEPDecrypt(zdev_t *dev, zbuf_t *buf, u16_t offset, u8_t keyLen, u8_t* WepKey, u8_t *iv)
-{
- u8_t S[256];
- u8_t S2[256];
- u16_t ui;
- u16_t i;
- u16_t j;
- u32_t icv_tmp;
- u32_t *icv;
- u32_t rxbuf_icv;
- u8_t temp;
- u8_t K;
- u16_t len;
- u8_t key[32];
-
- /* Retrieve IV */
- key[0] = iv[0];
- key[1] = iv[1];
- key[2] = iv[2];
-
- /* Append Wep Key after IV */
- zfMemoryCopy(&key[3], WepKey, keyLen);
-
- keyLen += 3;
-
- for(i = 0; i < 256; i++)
- {
- S[i] = (u8_t)i;
- S2[i] = key[i&(keyLen-1)];
- }
-
- j = 0;
- for(i = 0; i < 256; i++)
- {
- j = (j + S[i] + S2[i]);
- j&=255 ;
-
- // Swap S[i] and S[j]
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
- }
-
- i = j = 0;
-
- len = zfwBufGetSize(dev, buf);
-
- for (ui = offset; ui < len; ui++)
- {
- u8_t In;
-
- i++;
- i &= 255;
- j += S[i];
- j &= 255;
-
- // Swap S[i] and S[j]
- temp = S[i];
- S[i] = S[j];
- S[j] = temp;
-// temp = (S[i] + temp) & 255;
- temp += S[i];
- temp &=255;
- K = S[temp]; // Key used to Xor with input data
-
- In = zmw_rx_buf_readb(dev, buf, ui);
-
- zmw_rx_buf_writeb(dev, buf, ui, In ^ K);
- } //End of for (ui = 0; ui < Num_Bytes; ui++)
-
- icv = &icv_tmp;
- *icv = -1;
-
- for (ui = offset; ui < len - 4; ui++)
- {
- u8_t In;
-
- In = zmw_rx_buf_readb(dev, buf, ui);
- *icv = (*icv>>8) ^ crc32_tab[(*icv^In)&0xff];
- }
-
- *icv = ~*icv;
-
- rxbuf_icv = (zmw_rx_buf_readb(dev, buf, len-4) |
- zmw_rx_buf_readb(dev, buf, len-3) << 8 |
- zmw_rx_buf_readb(dev, buf, len-2) << 16 |
- zmw_rx_buf_readb(dev, buf, len-1) << 24);
-
- if (*icv != rxbuf_icv)
- {
- return ZM_ICV_FAILURE;
- }
-
- return ZM_ICV_SUCCESS;
-}
diff --git a/drivers/staging/otus/80211core/cwm.c b/drivers/staging/otus/80211core/cwm.c
deleted file mode 100644
index 1bd0b1f..0000000
--- a/drivers/staging/otus/80211core/cwm.c
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : cwm.c */
-/* */
-/* Abstract */
-/* This module contains channel width related functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-
-#include "cprecomp.h"
-
-
-
-void zfCwmInit(zdev_t* dev) {
- //u16_t i;
- zmw_get_wlan_dev(dev);
-
- switch (wd->wlanMode) {
- case ZM_MODE_AP:
- wd->cwm.cw_mode = CWM_MODE2040;
- wd->cwm.cw_width = CWM_WIDTH40;
- wd->cwm.cw_enable = 1;
- break;
- case ZM_MODE_INFRASTRUCTURE:
- case ZM_MODE_PSEUDO:
- case ZM_MODE_IBSS:
- default:
- wd->cwm.cw_mode = CWM_MODE2040;
- wd->cwm.cw_width = CWM_WIDTH20;
- wd->cwm.cw_enable = 1;
- break;
- }
-}
-
-
-void zfCoreCwmBusy(zdev_t* dev, u16_t busy)
-{
-
- zmw_get_wlan_dev(dev);
-
- zm_msg1_mm(ZM_LV_0, "CwmBusy=", busy);
-
- if(wd->cwm.cw_mode == CWM_MODE20) {
- wd->cwm.cw_width = CWM_WIDTH20;
- return;
- }
-
- if(wd->cwm.cw_mode == CWM_MODE40) {
- wd->cwm.cw_width = CWM_WIDTH40;
- return;
- }
-
- if (busy) {
- wd->cwm.cw_width = CWM_WIDTH20;
- return;
- }
-
-
- if((wd->wlanMode == ZM_MODE_INFRASTRUCTURE || wd->wlanMode == ZM_MODE_PSEUDO ||
- wd->wlanMode == ZM_MODE_IBSS)) {
- if ((wd->sta.ie.HtCap.HtCapInfo & HTCAP_SupChannelWidthSet) &&
- (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_RecomTxWidthSet) &&
- (wd->sta.ie.HtInfo.ChannelInfo & ExtHtCap_ExtChannelOffsetAbove)) {
-
- wd->cwm.cw_width = CWM_WIDTH40;
- }
- else {
- wd->cwm.cw_width = CWM_WIDTH20;
- }
-
- return;
- }
-
- if(wd->wlanMode == ZM_MODE_AP) {
- wd->cwm.cw_width = CWM_WIDTH40;
- }
-
-}
-
-
-
-
-u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy)
-{
- u32_t busy; /* percentage */
- u32_t cycleTime, ctlClear;
-
- cycleTime = 1280000; //1.28 seconds
-
- if (cycleTime > ctlBusy) {
- ctlClear = cycleTime - ctlBusy;
- }
- else
- {
- ctlClear = 0;
- }
-
- /* Compute ratio of extension channel busy to control channel clear
- * as an approximation to extension channel cleanliness.
- *
- * According to the hardware folks, ext rxclear is undefined
- * if the ctrl rxclear is de-asserted (i.e. busy)
- */
- if (ctlClear) {
- busy = (extBusy * 100) / ctlClear;
- } else {
- busy = 0;
- }
- if (busy > ATH_CWM_EXTCH_BUSY_THRESHOLD) {
- return TRUE;
- }
-
- return FALSE;
-}
diff --git a/drivers/staging/otus/80211core/cwm.h b/drivers/staging/otus/80211core/cwm.h
deleted file mode 100644
index 40c39fa..0000000
--- a/drivers/staging/otus/80211core/cwm.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : cwm.h */
-/* */
-/* Abstract */
-/* This module contains channel width relatived functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/****************************************************************************/
-/*Revision History: */
-/* Who When What */
-/* -------- -------- ----------------------------------------------*/
-/* */
-/* Honda 3-19-07 created */
-/* */
-/****************************************************************************/
-
-#ifndef _CWM_H
-#define _CWM_H
-
-#define ATH_CWM_EXTCH_BUSY_THRESHOLD 30 /* Extension Channel Busy Threshold (0-100%) */
-
-void zfCwmInit(zdev_t* dev);
-void zfCoreCwmBusy(zdev_t* dev, u16_t busy);
-u16_t zfCwmIsExtChanBusy(u32_t ctlBusy, u32_t extBusy);
-
-
-
-#endif /* #ifndef _CWM_H */
diff --git a/drivers/staging/otus/80211core/freqctrl.c b/drivers/staging/otus/80211core/freqctrl.c
deleted file mode 100644
index bab0df0..0000000
--- a/drivers/staging/otus/80211core/freqctrl.c
+++ /dev/null
@@ -1,259 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-
-/* zfAddFreqChangeReq should be called inside the critical section */
-static void zfAddFreqChangeReq(zdev_t* dev, u16_t frequency, u8_t bw40,
- u8_t extOffset, zfpFreqChangeCompleteCb cb)
-{
- zmw_get_wlan_dev(dev);
-
-//printk("zfAddFreqChangeReq freqReqQueueTail%d\n", wd->freqCtrl.freqReqQueueTail);
- wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueTail] = frequency;
- wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueTail] = bw40;
- wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueTail] = extOffset;
- wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueTail] = cb;
- wd->freqCtrl.freqReqQueueTail++;
- if ( wd->freqCtrl.freqReqQueueTail >= ZM_MAX_FREQ_REQ_QUEUE )
- {
- wd->freqCtrl.freqReqQueueTail = 0;
- }
-}
-
-void zfCoreSetFrequencyV2(zdev_t* dev, u16_t frequency, zfpFreqChangeCompleteCb cb)
-{
- zfCoreSetFrequencyEx(dev, frequency, 0, 0, cb);
-}
-
-void zfCoreSetFrequencyExV2(zdev_t* dev, u16_t frequency, u8_t bw40,
- u8_t extOffset, zfpFreqChangeCompleteCb cb, u8_t forceSetFreq)
-{
- u8_t setFreqImmed = 0;
- u8_t initRF = 0;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zm_msg1_scan(ZM_LV_1, "Freq=", frequency);
-
- zmw_enter_critical_section(dev);
- if ((wd->sta.currentFrequency == frequency)
- && (wd->sta.currentBw40 == bw40)
- && (wd->sta.currentExtOffset == extOffset))
- {
- if ( forceSetFreq == 0 && wd->sta.flagFreqChanging == 0 )
- {
- goto done;
- }
- }
-#ifdef ZM_FB50
- /*if(frequency!=2437) {
- zmw_leave_critical_section(dev);
- return;
- }*/
-#endif
-
- zfAddFreqChangeReq(dev, frequency, bw40, extOffset, cb);
-
-// zm_assert( wd->sta.flagFreqChanging == 0 );
- //wd->sta.flagFreqChanging = 1;
- if ( wd->sta.flagFreqChanging == 0 )
- {
- if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
- {
- initRF = 1;
- }
- wd->sta.currentFrequency = frequency;
- wd->sta.currentBw40 = bw40;
- wd->sta.currentExtOffset = extOffset;
- setFreqImmed = 1;
- }
- wd->sta.flagFreqChanging++;
-
- zmw_leave_critical_section(dev);
-
- if ( setFreqImmed )
- {
- //zfHpSetFrequency(dev, frequency, 0);
- if ( forceSetFreq )
- { // Cold reset to reset the frequency after scanning !
- zm_debug_msg0("#6_1 20070917");
- zm_debug_msg0("It is happen!!! No error message");
- zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, 2);
- }
- else
- {
- zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
- }
-
- if ( zfStaIsConnected(dev)
- && (frequency == wd->frequency)) {
- wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
- }
- }
- return;
-
-done:
- zmw_leave_critical_section(dev);
-
- if ( cb != NULL )
- {
- cb(dev);
- }
- zfPushVtxq(dev);
- return;
-}
-
-void zfCoreSetFrequencyEx(zdev_t* dev, u16_t frequency, u8_t bw40,
- u8_t extOffset, zfpFreqChangeCompleteCb cb)
-{
- zfCoreSetFrequencyExV2(dev, frequency, bw40, extOffset, cb, 0);
-}
-
-void zfCoreSetFrequency(zdev_t* dev, u16_t frequency)
-{
- zfCoreSetFrequencyV2(dev, frequency, NULL);
-}
-
-/* zfRemoveFreqChangeReq SHOULD NOT be called inside the critical section */
-static void zfRemoveFreqChangeReq(zdev_t* dev)
-{
- zfpFreqChangeCompleteCb cb = NULL;
- u16_t frequency;
- u8_t bw40;
- u8_t extOffset;
- u16_t compFreq = 0;
- u8_t compBw40 = 0;
- u8_t compExtOffset = 0;
-
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (wd->freqCtrl.freqReqQueueHead != wd->freqCtrl.freqReqQueueTail)
- {
- zm_msg1_scan(ZM_LV_1, "Freq=",
- wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead]);
- compFreq = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
- compBw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
- compExtOffset = wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
-
- wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
- cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
- wd->freqCtrl.freqReqQueueHead++;
- if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
- {
- wd->freqCtrl.freqReqQueueHead = 0;
- }
- }
- zmw_leave_critical_section(dev);
-
- if ( cb != NULL )
- {
- cb(dev);
- }
-
- zmw_enter_critical_section(dev);
- while (wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] != 0)
- {
- frequency = wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead];
- bw40 = wd->freqCtrl.freqReqBw40[wd->freqCtrl.freqReqQueueHead];
- extOffset=wd->freqCtrl.freqReqExtOffset[wd->freqCtrl.freqReqQueueHead];
- if ((compFreq == frequency)
- && (compBw40 == bw40)
- && (compExtOffset == extOffset))
- {
- /* Duplicated frequency command */
- zm_msg1_scan(ZM_LV_1, "Duplicated Freq=", frequency);
-
- cb = wd->freqCtrl.freqChangeCompCb[wd->freqCtrl.freqReqQueueHead];
- wd->freqCtrl.freqReqQueue[wd->freqCtrl.freqReqQueueHead] = 0;
- wd->freqCtrl.freqReqQueueHead++;
-
- if ( wd->freqCtrl.freqReqQueueHead >= ZM_MAX_FREQ_REQ_QUEUE )
- {
- wd->freqCtrl.freqReqQueueHead = 0;
- }
-
- if ( wd->sta.flagFreqChanging != 0 )
- {
- wd->sta.flagFreqChanging--;
- }
-
- zmw_leave_critical_section(dev);
- if ( cb != NULL )
- {
- cb(dev);
- }
- zmw_enter_critical_section(dev);
- }
- else
- {
- u8_t initRF = 0;
- if ((wd->sta.currentBw40 != bw40) || (wd->sta.currentExtOffset != extOffset))
- {
- initRF = 1;
- }
- wd->sta.currentFrequency = frequency;
- wd->sta.currentBw40 = bw40;
- wd->sta.currentExtOffset = extOffset;
- zmw_leave_critical_section(dev);
-
- zfHpSetFrequencyEx(dev, frequency, bw40, extOffset, initRF);
- if ( zfStaIsConnected(dev)
- && (frequency == wd->frequency)) {
- wd->sta.connPowerInHalfDbm = zfHpGetTransmitPower(dev);
- }
-
- return;
- }
- }
- zmw_leave_critical_section(dev);
-
- return;
-}
-
-void zfCoreSetFrequencyComplete(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zm_msg1_scan(ZM_LV_1, "flagFreqChanging=", wd->sta.flagFreqChanging);
-
- zmw_enter_critical_section(dev);
- //wd->sta.flagFreqChanging = 0;
- if ( wd->sta.flagFreqChanging != 0 )
- {
- wd->sta.flagFreqChanging--;
- }
-
- zmw_leave_critical_section(dev);
-
- zfRemoveFreqChangeReq(dev);
-
- zfPushVtxq(dev);
- return;
-}
-
-void zfReSetCurrentFrequency(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- zm_debug_msg0("It is happen!!! No error message");
-
- zfCoreSetFrequencyExV2(dev, wd->frequency, 0, 0, NULL, 1);
-}
diff --git a/drivers/staging/otus/80211core/ledmgr.c b/drivers/staging/otus/80211core/ledmgr.c
deleted file mode 100644
index eafce0b..0000000
--- a/drivers/staging/otus/80211core/ledmgr.c
+++ /dev/null
@@ -1,556 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLedCtrlType1 */
-/* Traditional single-LED state */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.6 */
-/* */
-/************************************************************************/
-// bit 15-12 : Toff for Scan state
-// 11-8 : Ton for Scan state
-// 7 : Reserved
-// 6 : mode
-//--------------------------------------
-// bit 6 = 0
-// 5-4 : Connect state
-// 00 => always off
-// 01 => always on
-// 10 => Idle off, acitve on
-// 11 => Idle on, active off
-//--------------------------------------
-// bit 6 = 1
-// 5-4 : freq
-// 00 => 1Hz
-// 01 => 0.5Hz
-// 10 => 0.25Hz
-// 11 => 0.125Hz
-//--------------------------------------
-// 3 : Power save state
-// 0 => always off in power save state
-// 1 => works as connect state
-// 2 : Disable state
-// 1 : Reserved
-// 0 : Power-on state
-void zfLedCtrlType1(zdev_t* dev)
-{
- u16_t i;
- u32_t ton, toff, tmp, period;
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<ZM_MAX_LED_NUMBER; i++)
- {
- if (zfStaIsConnected(dev) != TRUE)
- {
- //Scan state
- ton = ((wd->ledStruct.ledMode[i] & 0xf00) >> 8) * 5;
- toff = ((wd->ledStruct.ledMode[i] & 0xf000) >> 12) * 5;
-
- if ((ton + toff) != 0)
- {
- tmp = wd->ledStruct.counter / (ton+toff);
- tmp = wd->ledStruct.counter - (tmp * (ton+toff));
- if (tmp < ton)
- {
- zfHpLedCtrl(dev, i, 1);
- }
- else
- {
- zfHpLedCtrl(dev, i, 0);
- }
- }
- }
- else
- {
- if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[i] & 0x8) == 0))
- {
- zfHpLedCtrl(dev, i, 0);
- }
- else
- {
- //Connect state
- if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
- {
- if ((wd->ledStruct.counter & 1) == 0)
- {
- zfHpLedCtrl(dev, i, (wd->ledStruct.ledMode[i] & 0x10) >> 4);
- }
- else
- {
- if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
- {
- wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
- if ((wd->ledStruct.ledMode[i] & 0x20) != 0)
- {
- zfHpLedCtrl(dev, i, ((wd->ledStruct.ledMode[i] & 0x10) >> 4)^1);
- }
- }
- }
- }// if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
- else
- {
- period = 5 * (1 << ((wd->ledStruct.ledMode[i] & 0x30) >> 4));
- tmp = wd->ledStruct.counter / (period*2);
- tmp = wd->ledStruct.counter - (tmp * (period*2));
- if (tmp < period)
- {
- if ((wd->ledStruct.counter & 1) == 0)
- {
- zfHpLedCtrl(dev, i, 0);
- }
- else
- {
- if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
- {
- wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
- zfHpLedCtrl(dev, i, 1);
- }
- }
- }
- else
- {
- if ((wd->ledStruct.counter & 1) == 0)
- {
- zfHpLedCtrl(dev, i, 1);
- }
- else
- {
- if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
- {
- wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
- zfHpLedCtrl(dev, i, 0);
- }
- }
- }
- } //else, if ((wd->ledStruct.ledMode[i] & 0x40) == 0)
- } //else, if (zfPowerSavingMgrIsSleeping(dev))
- } //else : if (zfStaIsConnected(dev) != TRUE)
- } //for (i=0; i<ZM_MAX_LED_NUMBER; i++)
-}
-
-/******************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLedCtrlType2 */
-/* Customize for Netgear Dual-LED state ((bug#31292)) */
-/* */
-/* 1. Status: When dongle does not connect to 2.4G or 5G but in site */
-/* survey/association */
-/* LED status: Slow blinking, Amber then Blue per 500ms */
-/* 2. Status: Connection at 2.4G in site survey/association */
-/* LED status: Slow blinking, Amber/off per 500ms */
-/* 3. Status: Connection at 5G in site survey/association */
-/* LED status: Slow blinking, Blue/off per 500ms */
-/* 4. Status: When transfer the packet */
-/* LED status: Blink per packet, including TX and RX */
-/* 5. Status: When linking is established but no traffic */
-/* LED status: Always on */
-/* 6. Status: When linking is dropped but no re-connection */
-/* LED status: Always off */
-/* 7. Status: From one connection(2.4G or 5G) to change to another band */
-/* LED status: Amber/Blue =>Slow blinking, Amber then Blue per 500ms */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Shang-Chun Liu Atheros Communications, INC. 2007.11 */
-/* */
-/******************************************************************************/
-void zfLedCtrlType2_scan(zdev_t* dev);
-
-void zfLedCtrlType2(zdev_t* dev)
-{
- u16_t OperateLED;
- zmw_get_wlan_dev(dev);
-
- if (zfStaIsConnected(dev) != TRUE)
- {
- // Disconnect state
- if(wd->ledStruct.counter % 4 != 0)
- {
- // Update LED each 400ms(4*100)
- // Prevent this situation
- // _______ ___
- // LED[0] ON | | | x |
- // ------ OFF->+-+-+-+-+-+-+-+-+-+-+-+->>>...
- // LED[1] ON
- //
- return;
- }
-
- if (((wd->state == ZM_WLAN_STATE_DISABLED) && (wd->sta.bChannelScan))
- || ((wd->state != ZM_WLAN_STATE_DISABLED) && (wd->sta.bAutoReconnect)))
- {
- // Scan/AutoReconnect state
- zfLedCtrlType2_scan(dev);
- }
- else
- {
- // Neither Connected nor Scan
- zfHpLedCtrl(dev, 0, 0);
- zfHpLedCtrl(dev, 1, 0);
- }
- }
- else
- {
- if( wd->sta.bChannelScan )
- {
- // Scan state
- if(wd->ledStruct.counter % 4 != 0)
- return;
- zfLedCtrlType2_scan(dev);
- return;
- }
-
- if(wd->frequency < 3000)
- {
- OperateLED = 0; // LED[0]: work on 2.4G (b/g band)
- zfHpLedCtrl(dev, 1, 0);
- }
- else
- {
- OperateLED = 1; // LED[1]: work on 5G (a band)
- zfHpLedCtrl(dev, 0, 0);
- }
-
- if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[OperateLED] & 0x8) == 0))
- {
- // If Sleeping, turn OFF
- zfHpLedCtrl(dev, OperateLED, 0);
- }
- else
- {
- //Connect state
- if ((wd->ledStruct.counter & 1) == 0) // even
- {
- // No traffic, always ON
- zfHpLedCtrl(dev, OperateLED, 1);
- }
- else // odd
- {
- if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
- {
- // If have traffic, turn OFF
- // _____ _ _ _ _____
- // LED[Operate] ON | | | | | | | |
- // ------------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
- //
- wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
- zfHpLedCtrl(dev, OperateLED, 0);
- }
- }
- }
- }
-}
-
-void zfLedCtrlType2_scan(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- // When doing scan, blink(Amber/Blue) and off per 500ms (about 400ms in our driver)
- // _______ _______
- // LED[0] ON | | 8 12 | |
- // ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
- // LED[1] ON 0 4 |_______| 0 3
- //
-
- switch(wd->ledStruct.counter % 16)
- {
- case 0: // case 0~3, LED[0] on
- if(wd->supportMode & ZM_WIRELESS_MODE_24)
- {
- zfHpLedCtrl(dev, 0, 1);
- zfHpLedCtrl(dev, 1, 0);
- }
- else
- {
- zfHpLedCtrl(dev, 1, 1);
- zfHpLedCtrl(dev, 0, 0);
- }
- break;
-
- case 8: // case 8~11, LED[1] on
- if(wd->supportMode & ZM_WIRELESS_MODE_5)
- {
- zfHpLedCtrl(dev, 1, 1);
- zfHpLedCtrl(dev, 0, 0);
- }
- else
- {
- zfHpLedCtrl(dev, 0, 1);
- zfHpLedCtrl(dev, 1, 0);
- }
- break;
-
- default: // others, all off
- zfHpLedCtrl(dev, 0, 0);
- zfHpLedCtrl(dev, 1, 0);
- break;
- }
-}
-
-/**********************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLedCtrlType3 */
-/* Customize for Netgear Single-LED state ((bug#32243)) */
-/* */
-/* ¡EOff: when the adapter is disabled or hasn't started to associate with AP */
-/* yet. */
-/* ¡EOn: Once adpater associate with AP successfully */
-/* ¡ESlow blinking: whenever adapters do site-survey or try to associate with AP */
-/* - If there is a connection already, and adapters do site-survey or */
-/* re-associate action, the LED should keep LED backgraoud as ON, thus */
-/* the blinking behavior SHOULD be OFF (200ms) - ON (800ms) and continue this*/
-/* cycle. */
-/* - If there is no connection yet, and adapters start to do site-survey or */
-/* associate action, the LED should keep LED background as OFF, thus the */
-/* blinking behavior SHOULD be ON (200ms) - OFF (800ms) and continue this */
-/* cycle. */
-/* - For the case that associate fail, adpater should keep associating, and the*/
-/* LED should also keep slow blinking. */
-/* ¡EQuick blinking: to blink OFF-ON cycle for each time that traffic packet is */
-/* received or is transmitted. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Shang-Chun Liu Atheros Communications, INC. 2008.01 */
-/* */
-/**********************************************************************************/
-void zfLedCtrlType3_scan(zdev_t* dev, u16_t isConnect);
-
-void zfLedCtrlType3(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- if (zfStaIsConnected(dev) != TRUE)
- {
- // Disconnect state
- if(wd->ledStruct.counter % 2 != 0)
- {
- // Update LED each 200ms(2*100)
- // Prevent this situation
- // ___ _
- // LED[0] ON | | |x|
- // ------ OFF->+-+-+-+-+-+-+->>>...
- //
- return;
- }
-
- if (((wd->state == ZM_WLAN_STATE_DISABLED) && (wd->sta.bChannelScan))
- || ((wd->state != ZM_WLAN_STATE_DISABLED) && (wd->sta.bAutoReconnect)))
- {
- // Scan/AutoReconnect state
- zfLedCtrlType3_scan(dev, 0);
- }
- else
- {
- // Neither Connected nor Scan
- zfHpLedCtrl(dev, 0, 0);
- zfHpLedCtrl(dev, 1, 0);
- }
- }
- else
- {
- if( wd->sta.bChannelScan )
- {
- // Scan state
- if(wd->ledStruct.counter % 2 != 0)
- return;
- zfLedCtrlType3_scan(dev, 1);
- return;
- }
-
- if ((zfPowerSavingMgrIsSleeping(dev)) && ((wd->ledStruct.ledMode[0] & 0x8) == 0))
- {
- // If Sleeping, turn OFF
- zfHpLedCtrl(dev, 0, 0);
- zfHpLedCtrl(dev, 1, 0);
- }
- else
- {
- //Connect state
- if ((wd->ledStruct.counter & 1) == 0) // even
- {
- // No traffic, always ON
- zfHpLedCtrl(dev, 0, 1);
- zfHpLedCtrl(dev, 1, 1);
- }
- else // odd
- {
- if ((wd->ledStruct.txTraffic > 0) || (wd->ledStruct.rxTraffic > 0))
- {
- // If have traffic, turn OFF
- // _____ _ _ _ _____
- // LED[Operate] ON | | | | | | | |
- // ------------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
- //
- wd->ledStruct.txTraffic = wd->ledStruct.rxTraffic = 0;
- zfHpLedCtrl(dev, 0, 0);
- zfHpLedCtrl(dev, 1, 0);
- }
- }
- }
- }
-}
-
-void zfLedCtrlType3_scan(zdev_t* dev, u16_t isConnect)
-{
- u32_t ton, toff, tmp;
- zmw_get_wlan_dev(dev);
-
- // Doing scan when :
- // 1. Disconnected: ON (200ms) - OFF (800ms) (200ms-600ms in our driver)
- // ___ ___ ___
- // LED[0] ON | | | | | |
- // ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
- // 0 2 4 6 8 10 12 14 16
- // 2. Connected: ON (800ms) - OFF (200ms) (600ms-200ms in our driver)
- // ___________ ___________ ______
- // LED[0] ON | | | | |
- // ------ OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+->>>...
- // 0 2 4 6 8 10 12 14 16
-
- //Scan state
- if(!isConnect)
- ton = 2, toff = 6;
- else
- ton = 6, toff = 2;
-
- if ((ton + toff) != 0)
- {
- tmp = wd->ledStruct.counter % (ton+toff);
- if (tmp < ton)
- {
- zfHpLedCtrl(dev, 0, 1);
- zfHpLedCtrl(dev, 1, 1);
- }
- else
- {
- zfHpLedCtrl(dev, 0, 0);
- zfHpLedCtrl(dev, 1, 0);
- }
- }
-}
-
-/******************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLedCtrl_BlinkWhenScan_Alpha */
-/* Customize for Alpha/DLink LED */
-/* - Blink LED 12 times within 3 seconds when doing Active Scan */
-/* ___ ___ ___ ___ */
-/* LED[0] ON | | | | | | | | */
-/* -------OFF->-+-+-+-+-+-+-+-+-+-+-+-+-+--+-->>>... */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Shang-Chun Liu Atheros Communications, INC. 2007.11 */
-/* */
-/******************************************************************************/
-void zfLedCtrl_BlinkWhenScan_Alpha(zdev_t* dev)
-{
- static u32_t counter = 0;
- zmw_get_wlan_dev(dev);
-
- if(counter > 34) // counter for 3 sec
- {
- wd->ledStruct.LEDCtrlFlag &= ~(u8_t)ZM_LED_CTRL_FLAG_ALPHA;
- counter = 0;
- }
-
- if( (counter % 3) < 2)
- zfHpLedCtrl(dev, 0, 1);
- else
- zfHpLedCtrl(dev, 0, 0);
-
- counter++;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfLed100msCtrl */
-/* LED 100 milliseconds timer. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.6 */
-/* */
-/************************************************************************/
-void zfLed100msCtrl(zdev_t* dev)
-{
- zmw_get_wlan_dev(dev);
-
- wd->ledStruct.counter++;
-
- if(wd->ledStruct.LEDCtrlFlag)
- {
- switch(wd->ledStruct.LEDCtrlFlag) {
- case ZM_LED_CTRL_FLAG_ALPHA:
- zfLedCtrl_BlinkWhenScan_Alpha(dev);
- break;
- }
- }
- else
- {
- switch(wd->ledStruct.LEDCtrlType) {
- case 1: // Traditional 1 LED
- zfLedCtrlType1(dev);
- break;
-
- case 2: // Dual-LEDs for Netgear
- zfLedCtrlType2(dev);
- break;
-
- case 3: // Single-LED for Netgear (WN111v2)
- zfLedCtrlType3(dev);
- break;
-
- default:
- zfLedCtrlType1(dev);
- break;
- }
- }
-}
-
diff --git a/drivers/staging/otus/80211core/performance.c b/drivers/staging/otus/80211core/performance.c
deleted file mode 100644
index 4c10e1d..0000000
--- a/drivers/staging/otus/80211core/performance.c
+++ /dev/null
@@ -1,431 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : performance.c */
-/* */
-/* Abstract */
-/* This module performance evaluation functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
-
-#define ZM_TP_SIZE 50
-static struct zsSummary zm_summary;
-static struct zsVariation zm_var;
-static struct zsThroughput zm_tp;
-
-void zfiPerformanceInit(zdev_t* dev)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- zm_summary.tick_base = wd->tick;
- zm_summary.tx_msdu_count = 0;
- zm_summary.tx_mpdu_count = 0;
- zm_summary.rx_msdu_count = 0;
- zm_summary.rx_mpdu_count = 0;
- zm_summary.rx_broken_seq = 0;
- zm_summary.rx_broken_sum = 0;
- zm_summary.rx_seq_base = 0;
- zm_summary.rx_broken_seq_dis = 0;
- zm_summary.rx_duplicate_seq = 0;
- zm_summary.rx_old_seq = 0;
- zm_summary.reset_count = 0;
- zm_summary.reset_sum = 0;
- zm_summary.rx_lost_sum = 0;
- zm_summary.rx_duplicate_error = 0;
- zm_summary.rx_free = 0;
- zm_summary.rx_amsdu_len = 0;
- zm_summary.rx_flush = 0;
- zm_summary.rx_clear = 0;
- zm_summary.rx_reorder = 0;
-
- for (i=0; i<100; i++)
- {
- zm_var.tx_msdu_tick[i] = zm_var.tx_mpdu_tick[i] = 0;
- zm_var.rx_msdu_tick[i] = zm_var.rx_mpdu_tick[i] = 0;
- }
-
- zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_PERFORMANCE, 100);
-
- zm_tp.size = ZM_TP_SIZE;
- zm_tp.head = zm_tp.size - 1;
- zm_tp.tail = 0;
- for (i=0; i<zm_tp.size; i++)
- {
- zm_tp.tx[i]=0;
- zm_tp.rx[i]=0;
- }
-}
-
-void zfiPerformanceGraph(zdev_t* dev)
-{
- s16_t i,j;
- u8_t s[ZM_TP_SIZE+5];
- zmw_get_wlan_dev(dev);
-
- for (i=0; i<(zm_tp.size-1); i++)
- {
- zm_tp.tx[i] = zm_tp.tx[i+1];
- zm_tp.rx[i] = zm_tp.rx[i+1];
- }
- zm_tp.tx[zm_tp.size-1] = zm_summary.tx_mpdu_count*1500*8/1000000;
- zm_tp.rx[zm_tp.size-1] = zm_summary.rx_msdu_count*1500*8/1000000;
-
- for (i=15; i>0; i--)
- {
- s[0] = (i/10) + '0';
- s[1] = (i%10) + '0';
- s[2] = '0';
- s[3] = '|';
- for (j=0; j<zm_tp.size; j++)
- {
- if ((zm_tp.tx[j]/10 == i) && (zm_tp.rx[j]/10 == i))
- {
- s[4+j] = 'X';
- }
- else if (zm_tp.tx[j]/10 == i)
- {
- s[4+j] = 'T';
- }
- else if (zm_tp.rx[j]/10 == i)
- {
- s[4+j] = 'R';
- }
- else
- {
- s[4+j] = ' ';
- }
- }
- s[zm_tp.size+4] = '\0';
- DbgPrint("%s",s);
- }
- DbgPrint("000|__________________________________________________");
-
-}
-
-
-void zfiPerformanceRefresh(zdev_t* dev)
-{
- u16_t i;
-
- zmw_get_wlan_dev(dev);
-
- zfiDbgReadReg(dev, 0x11772c);
-
- zm_var.tx_msdu_mean = zm_summary.tx_msdu_count / 100;
- zm_var.tx_mpdu_mean = zm_summary.tx_mpdu_count / 100;
- zm_var.rx_msdu_mean = zm_summary.rx_msdu_count / 100;
- zm_var.rx_mpdu_mean = zm_summary.rx_mpdu_count / 100;
-
- zm_var.tx_msdu_sum = zm_var.tx_mpdu_sum = 0;
- zm_var.rx_msdu_sum = zm_var.rx_mpdu_sum = 0;
- zm_summary.tx_idle_count = zm_summary.rx_idle_count = 0;
- for (i=0; i<100; i++)
- {
- zm_var.tx_msdu_sum += (zm_var.tx_msdu_tick[i] * zm_var.tx_msdu_tick[i]);
- zm_var.tx_mpdu_sum += (zm_var.tx_mpdu_tick[i] * zm_var.tx_mpdu_tick[i]);
- zm_var.rx_msdu_sum += (zm_var.rx_msdu_tick[i] * zm_var.rx_msdu_tick[i]);
- zm_var.rx_mpdu_sum += (zm_var.rx_mpdu_tick[i] * zm_var.rx_mpdu_tick[i]);
-
- if (!zm_var.tx_mpdu_tick[i]) zm_summary.tx_idle_count++;
- if (!zm_var.rx_mpdu_tick[i]) zm_summary.rx_idle_count++;
- }
- zm_var.tx_msdu_var = (zm_var.tx_msdu_sum / 100) - (zm_var.tx_msdu_mean * zm_var.tx_msdu_mean);
- zm_var.tx_mpdu_var = (zm_var.tx_mpdu_sum / 100) - (zm_var.tx_mpdu_mean * zm_var.tx_mpdu_mean);
- zm_var.rx_msdu_var = (zm_var.rx_msdu_sum / 100) - (zm_var.rx_msdu_mean * zm_var.rx_msdu_mean);
- zm_var.rx_mpdu_var = (zm_var.rx_mpdu_sum / 100) - (zm_var.rx_mpdu_mean * zm_var.rx_mpdu_mean);
-
- zm_summary.tick_base = wd->tick;
- zm_summary.rx_broken_sum += zm_summary.rx_broken_seq;
- zm_summary.rx_lost_sum += (zm_summary.rx_broken_seq - zm_summary.rx_duplicate_seq - zm_summary.rx_old_seq);
-
- zfiPerformanceGraph(dev);
-
- DbgPrint("******************************************************\n");
- DbgPrint("* TX: MSDU=%5d, VAR=%5d; MPDU=%5d, VAR=%5d\n", zm_summary.tx_msdu_count,
- zm_var.tx_msdu_var, zm_summary.tx_mpdu_count, zm_var.tx_mpdu_var);
- DbgPrint("* TX: idle=%5d,TxRate=%3d, PER=%5d\n", zm_summary.tx_idle_count,
- wd->CurrentTxRateKbps/1000,
- (u16_t)wd->PER[wd->sta.oppositeInfo[0].rcCell.currentRate]);
- DbgPrint("* RX: MSDU=%5d, VAR=%5d; MPDU=%5d, VAR=%5d\n", zm_summary.rx_msdu_count,
- zm_var.rx_msdu_var, zm_summary.rx_mpdu_count, zm_var.rx_mpdu_var);
- DbgPrint("* RX: idle=%5d,RxRate=%3d,AMSDU=%5d\n", zm_summary.rx_idle_count,
- wd->CurrentRxRateKbps/1000, zm_summary.rx_amsdu_len);
- DbgPrint("* RX broken seq=%4d, distances=%4d, duplicates=%4d\n", zm_summary.rx_broken_seq,
- zm_summary.rx_broken_seq_dis, zm_summary.rx_duplicate_seq);
- DbgPrint("* RX old seq=%4d, lost=%4d, broken sum=%4d\n", zm_summary.rx_old_seq,
- (zm_summary.rx_broken_seq - zm_summary.rx_duplicate_seq - zm_summary.rx_old_seq),
- zm_summary.rx_broken_sum);
- DbgPrint("* Rx lost sum=%4d,dup. error=%4d, free count=%4d\n", zm_summary.rx_lost_sum,
- zm_summary.rx_duplicate_error, zm_summary.rx_free);
- DbgPrint("* Rx flush sum=%4d, clear sum=%4d, reorder=%7d\n", zm_summary.rx_flush,
- zm_summary.rx_clear, zm_summary.rx_reorder);
- DbgPrint("* Firmware reset=%3d, reset sum=%4d\n", zm_summary.reset_count,
- zm_summary.reset_sum);
- DbgPrint("******************************************************\n\n");
- //reset count 11772c
- zm_summary.tx_msdu_count = 0;
- zm_summary.tx_mpdu_count = 0;
- zm_summary.rx_msdu_count = 0;
- zm_summary.rx_mpdu_count = 0;
- zm_summary.rx_broken_seq = 0;
- zm_summary.rx_broken_seq_dis = 0;
- zm_summary.rx_duplicate_seq = 0;
- zm_summary.rx_old_seq = 0;
- zm_summary.reset_count = 0;
- zm_summary.rx_amsdu_len = 0;
-
- for (i=0; i<100; i++)
- {
- zm_var.tx_msdu_tick[i] = zm_var.tx_mpdu_tick[i] = 0;
- zm_var.rx_msdu_tick[i] = zm_var.rx_mpdu_tick[i] = 0;
- }
-
- zfTimerSchedule(dev, ZM_EVENT_TIMEOUT_PERFORMANCE, 100);
-}
-
-void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick)
-{
- u32_t index;
- zm_summary.tx_msdu_count++;
-
- index = tick - zm_summary.tick_base;
-
- if (index < 100)
- {
- zm_var.tx_msdu_tick[index]++;
- }
- else
- {
- //DbgPrint("wd->tick exceeded tick_base+100!\n");
- }
-}
-
-void zfiRxPerformanceMSDU(zdev_t* dev, u32_t tick)
-{
- u32_t index;
- zm_summary.rx_msdu_count++;
-
- index = tick - zm_summary.tick_base;
-
- if (index < 100)
- {
- zm_var.rx_msdu_tick[index]++;
- }
- else
- {
- //DbgPrint("wd->tick exceeded tick_base+100!\n");
- }
-}
-
-void zfiTxPerformanceMPDU(zdev_t* dev, u32_t tick)
-{
- u32_t index;
- zm_summary.tx_mpdu_count++;
-
- index = tick - zm_summary.tick_base;
-
- if (index < 100)
- {
- zm_var.tx_mpdu_tick[index]++;
- }
- else
- {
- //DbgPrint("wd->tick exceeded tick_base+100!\n");
- }
-}
-
-#ifndef ZM_INT_USE_EP2_HEADER_SIZE
-#define ZM_INT_USE_EP2_HEADER_SIZE 12
-#endif
-void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf)
-{
- u32_t index;
- u16_t frameType;
- u16_t frameCtrl;
- u8_t mpduInd;
- u16_t plcpHdrLen;
- u16_t len;
-
- zmw_get_wlan_dev(dev);
-
- len = zfwBufGetSize(dev, buf);
- mpduInd = zmw_rx_buf_readb(dev, buf, len-1);
- /* First MPDU or Single MPDU */
- if(((mpduInd & 0x30) == 0x00) || ((mpduInd & 0x30) == 0x20))
- //if ((mpduInd & 0x10) == 0x00)
- {
- plcpHdrLen = 12; // PLCP header length
- }
- else
- {
- if (zmw_rx_buf_readh(dev, buf, 4) == wd->macAddr[0] &&
- zmw_rx_buf_readh(dev, buf, 6) == wd->macAddr[1] &&
- zmw_rx_buf_readh(dev, buf, 8) == wd->macAddr[2]) {
- plcpHdrLen = 0;
- }
- else if (zmw_rx_buf_readh(dev, buf, 16) == wd->macAddr[0] &&
- zmw_rx_buf_readh(dev, buf, 18) == wd->macAddr[1] &&
- zmw_rx_buf_readh(dev, buf, 20) == wd->macAddr[2]){
- plcpHdrLen = 12;
- }
- else {
- plcpHdrLen = 0;
- }
- }
-
- frameCtrl = zmw_rx_buf_readb(dev, buf, plcpHdrLen + 0);
- frameType = frameCtrl & 0xf;
-
- if (frameType != ZM_WLAN_DATA_FRAME)
- {
- return;
- }
-
- zm_summary.rx_mpdu_count++;
-
- index = wd->tick - zm_summary.tick_base;
-
- if (index < 100)
- {
- zm_var.rx_mpdu_tick[index]++;
- }
- else
- {
- //DbgPrint("wd->tick exceeded tick_base+100!\n");
- }
-}
-
-void zfiRxPerformanceSeq(zdev_t* dev, zbuf_t* buf)
-{
- u16_t seq_no;
- u16_t offset = 0;
- u16_t old_dis = zm_summary.rx_broken_seq_dis;
- //sys_time = KeQueryPerformanceCounter(&freq);
-
- seq_no = zmw_rx_buf_readh(dev, buf, offset+22) >> 4;
-
- ZM_SEQ_DEBUG("Out %5d\n", seq_no);
-
- if (seq_no < zm_summary.rx_seq_base)
- {
- if (seq_no == 0)
- {
- if (zm_summary.rx_seq_base != 4095)
- {
- zm_summary.rx_broken_seq++;
- ZM_SEQ_DEBUG("Broken seq");
- zm_summary.rx_broken_seq_dis+=(4096 - zm_summary.rx_seq_base);
- }
- }
- else if ((seq_no < 300) && (zm_summary.rx_seq_base > 3800))
- {
- zm_summary.rx_broken_seq++;
- ZM_SEQ_DEBUG("Broken seq");
- zm_summary.rx_broken_seq_dis+=(4096 - zm_summary.rx_seq_base + seq_no);
- }
- else
- {
- zm_summary.rx_broken_seq++;
- ZM_SEQ_DEBUG("Broken seq");
- zm_summary.rx_broken_seq_dis+=(zm_summary.rx_seq_base - seq_no);
- zm_summary.rx_old_seq++;
- }
- }
- else
- {
- if (seq_no != (zm_summary.rx_seq_base + 1))
- {
- if ((seq_no > 3800) && (zm_summary.rx_seq_base < 300))
- {
- zm_summary.rx_broken_seq++;
- ZM_SEQ_DEBUG("Broken seq");
- zm_summary.rx_broken_seq_dis+=(4096 - seq_no + zm_summary.rx_seq_base);
- zm_summary.rx_old_seq++;
- }
- else
- {
- zm_summary.rx_broken_seq++;
- ZM_SEQ_DEBUG("Broken seq");
- zm_summary.rx_broken_seq_dis+=(seq_no - zm_summary.rx_seq_base);
- }
- }
- }
- if (seq_no == zm_summary.rx_seq_base)
- {
- zm_summary.rx_duplicate_seq++;
- }
-
- if ((zm_summary.rx_broken_seq_dis - old_dis) > 100)
- {
- DbgPrint("* seq_no=%4d, base_seq=%4d, dis_diff=%4d", seq_no,
- zm_summary.rx_seq_base, zm_summary.rx_broken_seq_dis - old_dis);
- }
- zm_summary.rx_seq_base = seq_no;
-}
-
-void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp)
-{
- zm_summary.reset_count = (u16_t)rsp - zm_summary.reset_sum;
- zm_summary.reset_sum = (u16_t)rsp;
-}
-
-void zfiRxPerformanceDup(zdev_t* dev, zbuf_t* buf1, zbuf_t* buf2)
-{
- u16_t seq_no1, seq_no2;
-
- seq_no1 = zmw_rx_buf_readh(dev, buf1, 22) >> 4;
- seq_no2 = zmw_rx_buf_readh(dev, buf2, 22) >> 4;
- if (seq_no1 != seq_no2)
- {
- zm_summary.rx_duplicate_error++;
- }
-}
-
-void zfiRxPerformanceFree(zdev_t* dev, zbuf_t* buf)
-{
- zm_summary.rx_free++;
-}
-
-void zfiRxPerformanceAMSDU(zdev_t* dev, zbuf_t* buf, u16_t len)
-{
- if (zm_summary.rx_amsdu_len < len)
- {
- zm_summary.rx_amsdu_len = len;
- }
-}
-void zfiRxPerformanceFlush(zdev_t* dev)
-{
- zm_summary.rx_flush++;
-}
-
-void zfiRxPerformanceClear(zdev_t* dev)
-{
- zm_summary.rx_clear++;
- ZM_SEQ_DEBUG("RxClear");
-}
-
-void zfiRxPerformanceReorder(zdev_t* dev)
-{
- zm_summary.rx_reorder++;
-}
-#endif /* end of ZM_ENABLE_PERFORMANCE_EVALUATION */
diff --git a/drivers/staging/otus/80211core/performance.h b/drivers/staging/otus/80211core/performance.h
deleted file mode 100644
index 29f658a..0000000
--- a/drivers/staging/otus/80211core/performance.h
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-#ifndef _PERFORMANCE_H
-#define _PERFORMANCE_H
-
-#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
-
-struct zsSummary
-{
- u32_t tx_msdu_count;
- u32_t tx_mpdu_count;
- u32_t rx_msdu_count;
- u32_t rx_mpdu_count;
- u32_t tick_base;
- u16_t rx_seq_base;
- u16_t rx_broken_seq;
- u16_t rx_broken_sum;
- u16_t rx_broken_seq_dis;
- u16_t rx_duplicate_seq;
- u16_t rx_duplicate_error;
- u16_t rx_old_seq;
- u16_t rx_lost_sum;
- u16_t tx_idle_count;
- u16_t rx_idle_count;
- u16_t reset_count;
- u16_t reset_sum;
- u16_t rx_free;
- u16_t rx_amsdu_len;
- u16_t rx_flush;
- u16_t rx_clear;
- u32_t rx_reorder;
-};
-
-struct zsVariation
-{
- u32_t tx_msdu_tick[100];
- u32_t tx_mpdu_tick[100];
- u32_t rx_msdu_tick[100];
- u32_t rx_mpdu_tick[100];
-
- u32_t tx_msdu_mean;
- u32_t tx_mpdu_mean;
- u32_t rx_msdu_mean;
- u32_t rx_mpdu_mean;
-
- u32_t tx_msdu_sum;
- u32_t tx_mpdu_sum;
- u32_t rx_msdu_sum;
- u32_t rx_mpdu_sum;
-
- u32_t tx_msdu_var;
- u32_t tx_mpdu_var;
- u32_t rx_msdu_var;
- u32_t rx_mpdu_var;
-};
-
-struct zsThroughput
-{
- u32_t tx[50];
- u32_t rx[50];
- u16_t head;
- u16_t tail;
- u16_t size;
- LARGE_INTEGER sys_time;
- LARGE_INTEGER freq;
-};
-
-void zfiPerformanceInit(zdev_t* dev);
-void zfiPerformanceRefresh(zdev_t* dev);
-
-void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
-void zfiRxPerformanceMSDU(zdev_t* dev, u32_t tick);
-void zfiTxPerformanceMPDU(zdev_t* dev, u32_t tick);
-void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
-void zfiRxPerformanceSeq(zdev_t* dev, zbuf_t* buf);
-void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
-void zfiRxPerformanceDup(zdev_t* dev, zbuf_t* buf1, zbuf_t* buf2);
-void zfiRxPerformanceFree(zdev_t* dev, zbuf_t* buf);
-void zfiRxPerformanceAMSDU(zdev_t* dev, zbuf_t* buf, u16_t len);
-void zfiRxPerformanceFlush(zdev_t* dev);
-void zfiRxPerformanceClear(zdev_t* dev);
-void zfiRxPerformanceReorder(zdev_t* dev);
-#endif /* end of ZM_ENABLE_PERFORMANCE_EVALUATION */
-#endif /* end of _PERFORMANCE_H */
diff --git a/drivers/staging/otus/80211core/pub_usb.h b/drivers/staging/otus/80211core/pub_usb.h
deleted file mode 100644
index c4b4bd2..0000000
--- a/drivers/staging/otus/80211core/pub_usb.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _PUB_USB_H
-#define _PUB_USB_H
-
-#include "../oal_dt.h"
-
-#define ZM_HAL_80211_MODE_AP 0
-#define ZM_HAL_80211_MODE_STA 1
-#define ZM_HAL_80211_MODE_IBSS_GENERAL 2
-#define ZM_HAL_80211_MODE_IBSS_WPA2PSK 3
-
-/* USB module description */
-/* Queue Management */
-/* 80211core requires OAL to implement a transmission queue in OAL's */
-/* USB module. Because there is only limited on-chip memory, so USB */
-/* data transfer may be pending until on-chip memory is available. */
-/* 80211core also requires OAL's USB module to provide two functions */
-/* zfwUsbGetFreeTxQSize() and zfwUsbGetMaxTxQSize() for 80211core to */
-/* query the status of this transmission queue. The main purpose of */
-/* this queue is for QoS/WMM. Though there are hardware priority */
-/* queues on the chip, and also software priority queues in the */
-/* 80211core. There is still one and only one USB channel. So */
-/* 80211core will use the information that zfwUsbGetFreeTxQSize() */
-/* returned to schedule the traffic from the software priority */
-/* queues to the hardware priority queues. For example, if 80211core */
-/* found that USB transmission queue is going to be full, it will */
-/* not allow packets with lower priority to enter the USB channel. */
-
-
-/* Structure for USB call back functions */
-struct zfCbUsbFuncTbl {
- void (*zfcbUsbRecv)(zdev_t *dev, zbuf_t *buf);
- void (*zfcbUsbRegIn)(zdev_t* dev, u32_t* rsp, u16_t rspLen);
- void (*zfcbUsbOutComplete)(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr);
- void (*zfcbUsbRegOutComplete)(zdev_t* dev);
-};
-
-/* Call back functions */
-/* Below are the functions that should be called by the OAL */
-
-/* When data is available in endpoint 3, OAL shall embed the data in */
-/* zbuf_t and supply to 80211core by calling this function */
-/* void (*zfcbUsbRecv)(zdev_t *dev, zbuf_t *buf); */
-
-/* When data is available in endpoint 2, OAL shall call this function */
-/* void (*zfcbUsbRegIn)(zdev_t* dev, u32_t* rsp, u16_t rspLen); */
-
-/* When USB data transfer completed in endpoint 1, OAL shall call this function */
-/* void (*zfcbUsbOutComplete)(zdev_t* dev, zbuf_t *buf, u8_t status, u8_t *hdr); */
-
-
-/* Call out functions */
-/* Below are the functions that supply by the OAL for 80211core to */
-/* manipulate the USB */
-
-/* Return OAL's USB TxQ size */
-extern u32_t zfwUsbGetMaxTxQSize(zdev_t* dev);
-
-/* Return OAL's TxQ available size */
-extern u32_t zfwUsbGetFreeTxQSize(zdev_t* dev);
-
-/* Register call back function */
-extern void zfwUsbRegisterCallBack(zdev_t* dev, struct zfCbUsbFuncTbl *zfUsbFunc);
-
-/* Enable USB interrupt endpoint */
-extern u32_t zfwUsbEnableIntEpt(zdev_t *dev, u8_t endpt);
-
-/* Enable USB Rx endpoint */
-extern int zfwUsbEnableRxEpt(zdev_t* dev, u8_t endpt);
-
-/* 80211core call this function to send a USB request over endpoint 0 */
-extern u32_t zfwUsbSubmitControl(zdev_t* dev, u8_t req, u16_t value,
- u16_t index, void *data, u32_t size);
-extern u32_t zfwUsbSubmitControlIo(zdev_t* dev, u8_t req, u8_t reqtype,
- u16_t value, u16_t index, void *data, u32_t size);
-
-/* 80211core call this function to transfer data out over endpoint 1 */
-extern void zfwUsbCmd(zdev_t* dev, u8_t endpt, u32_t* cmd, u16_t cmdLen);
-
-/* 80211core call this function to transfer data out over endpoint 4 */
-extern u32_t zfwUsbSend(zdev_t* dev, u8_t endpt, u8_t *hdr, u16_t hdrlen, u8_t *snap, u16_t snapLen,
- u8_t *tail, u16_t tailLen, zbuf_t *buf, u16_t offset);
-
-/* 80211core call this function to set USB configuration */
-extern u32_t zfwUsbSetConfiguration(zdev_t *dev, u16_t value);
-
-#endif
diff --git a/drivers/staging/otus/80211core/pub_zfi.h b/drivers/staging/otus/80211core/pub_zfi.h
deleted file mode 100644
index 5202e5a..0000000
--- a/drivers/staging/otus/80211core/pub_zfi.h
+++ /dev/null
@@ -1,820 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _PUB_DEFS_H
-#define _PUB_DEFS_H
-
-#include "../oal_dt.h"
-
-/***** Section 1 : Tunable Parameters *****/
-/* The definitions in this section are tunabel parameters */
-
-/* Maximum number of BSS that could be scaned */
-#define ZM_MAX_BSS 128
-
-/* Maximum number of WPA2 PMKID that supported */
-#define ZM_PMKID_MAX_BSS_CNT 8
-
-/* Enable aggregation and deaggregation */
-#define ZM_ENABLE_AGGREGATION
-
-#ifdef ZM_ENABLE_AGGREGATION
- /* Enable BA failed retransmission in firmware */
- #define ZM_ENABLE_FW_BA_RETRANSMISSION
- #define ZM_BYPASS_AGGR_SCHEDULING
- //#define ZM_AGGR_BIT_ON
-#endif
-
-
-#ifndef ZM_FB50
-//#define ZM_FB50
-#endif
-
-#ifndef ZM_AP_DEBUG
-//#define ZM_AP_DEBUG
-#endif
-
-//#define ZM_ENABLE_BA_RATECTRL
-
-/***** End of section 1 *****/
-
-
-/***** Section 2 : Public Definitions, data structures and prototypes *****/
-/* function return status */
-#define ZM_STATUS_SUCCESS 0
-#define ZM_STATUS_FAILURE 1
-
-// media connect status
-#define ZM_STATUS_MEDIA_CONNECT 0x00
-#define ZM_STATUS_MEDIA_DISCONNECT 0x01
-#define ZM_STATUS_MEDIA_DISCONNECT_NOT_FOUND 0x02
-#define ZM_STATUS_MEDIA_DISABLED 0x03
-#define ZM_STATUS_MEDIA_CONNECTION_DISABLED 0x04
-#define ZM_STATUS_MEDIA_CONNECTION_RESET 0x05
-#define ZM_STATUS_MEDIA_RESET 0x06
-#define ZM_STATUS_MEDIA_DISCONNECT_DEAUTH 0x07
-#define ZM_STATUS_MEDIA_DISCONNECT_DISASOC 0x08
-#define ZM_STATUS_MEDIA_DISCONNECT_TIMEOUT 0x09
-#define ZM_STATUS_MEDIA_DISCONNECT_AUTH_FAILED 0x0a
-#define ZM_STATUS_MEDIA_DISCONNECT_ASOC_FAILED 0x0b
-#define ZM_STATUS_MEDIA_DISCONNECT_MIC_FAIL 0x0c
-#define ZM_STATUS_MEDIA_DISCONNECT_UNREACHABLE 0x0d
-#define ZM_STATUS_MEDIA_DISCONNECT_BEACON_MISS 0x0e
-
-// Packet Filter
-#define ZM_PACKET_TYPE_DIRECTED 0x00000001
-#define ZM_PACKET_TYPE_MULTICAST 0x00000002
-#define ZM_PACKET_TYPE_ALL_MULTICAST 0x00000004
-#define ZM_PACKET_TYPE_BROADCAST 0x00000008
-#define ZM_PACKET_TYPE_PROMISCUOUS 0x00000020
-
-/* BSS mode definition */
-/* TODO : The definitions here are coupled with XP's NDIS OID. */
-/* We can't be changed them freely, need to disarm this mine */
-#define ZM_MODE_IBSS 0
-#define ZM_MODE_INFRASTRUCTURE 1
-#define ZM_MODE_UNKNOWN 2
-#define ZM_MODE_INFRASTRUCTURE_MAX 3
-#define ZM_MODE_AP 4
-#define ZM_MODE_PSEUDO 5
-
-
-/* Authentication mode */
-#define ZM_AUTH_MODE_OPEN 0
-#define ZM_AUTH_MODE_SHARED_KEY 1
-#define ZM_AUTH_MODE_AUTO 2
-#define ZM_AUTH_MODE_WPA 3
-#define ZM_AUTH_MODE_WPAPSK 4
-#define ZM_AUTH_MODE_WPA_NONE 5
-#define ZM_AUTH_MODE_WPA2 6
-#define ZM_AUTH_MODE_WPA2PSK 7
-#ifdef ZM_ENABLE_CENC
-#define ZM_AUTH_MODE_CENC 8
-#endif //ZM_ENABLE_CENC
-#define ZM_AUTH_MODE_WPA_AUTO 9
-#define ZM_AUTH_MODE_WPAPSK_AUTO 10
-
-// Encryption mode
-#define ZM_NO_WEP 0x0
-#define ZM_AES 0x4
-#define ZM_TKIP 0x2
-#define ZM_WEP64 0x1
-#define ZM_WEP128 0x5
-#define ZM_WEP256 0x6
-#ifdef ZM_ENABLE_CENC
-#define ZM_CENC 0x7
-#endif //ZM_ENABLE_CENC
-
-/* Encryption type for wep status */
-#define ZM_ENCRYPTION_WEP_DISABLED 0
-#define ZM_ENCRYPTION_WEP_ENABLED 1
-#define ZM_ENCRYPTION_WEP_KEY_ABSENT 2
-#define ZM_ENCRYPTION_NOT_SUPPORTED 3
-#define ZM_ENCRYPTION_TKIP 4
-#define ZM_ENCRYPTION_TKIP_KEY_ABSENT 5
-#define ZM_ENCRYPTION_AES 6
-#define ZM_ENCRYPTION_AES_KEY_ABSENT 7
-
-#ifdef ZM_ENABLE_CENC
-#define ZM_ENCRYPTION_CENC 8
-#endif //ZM_ENABLE_CENC
-
-/* security type */
-#define ZM_SECURITY_TYPE_NONE 0
-#define ZM_SECURITY_TYPE_WEP 1
-#define ZM_SECURITY_TYPE_WPA 2
-
-#ifdef ZM_ENABLE_CENC
-#define ZM_SECURITY_TYPE_CENC 3
-#endif //ZM_ENABLE_CENC
-
-/* Encryption Exemption Action Type */
-#define ZM_ENCRYPTION_EXEMPT_NO_EXEMPTION 0
-#define ZM_ENCRYPTION_EXEMPT_ALWAYS 1
-
-/* MIC failure */
-#define ZM_MIC_PAIRWISE_ERROR 0x06
-#define ZM_MIC_GROUP_ERROR 0x0E
-
-
-/* power save mode */
-#define ZM_STA_PS_NONE 0
-#define ZM_STA_PS_MAX 1
-#define ZM_STA_PS_FAST 2
-#define ZM_STA_PS_LIGHT 3
-
-/* WME AC Type */
-#define ZM_WME_AC_BK 0 /* Background AC */
-#define ZM_WME_AC_BE 1 /* Best-effort AC */
-#define ZM_WME_AC_VIDEO 2 /* Video AC */
-#define ZM_WME_AC_VOICE 3 /* Voice AC */
-
-/* Preamble type */
-#define ZM_PREAMBLE_TYPE_AUTO 0
-#define ZM_PREAMBLE_TYPE_LONG 1
-#define ZM_PREAMBLE_TYPE_SHORT 2
-
-/* wireless modes constants */
-#define ZM_WIRELESS_MODE_5_54 0x01 ///< 5 GHz 54 Mbps
-#define ZM_WIRELESS_MODE_5_108 0x02 ///< 5 GHz 108 Mbps
-#define ZM_WIRELESS_MODE_24_11 0x04 ///< 2.4 GHz 11 Mbps
-#define ZM_WIRELESS_MODE_24_54 0x08 ///< 2.4 GHz 54 Mbps
-#define ZM_WIRELESS_MODE_24_108 0x10 ///< 2.4 GHz 108 Mbps
-#define ZM_WIRELESS_MODE_49_13 0x100 ///< 4.9 GHz 13.5 Mbps, quarter rate chn-bandwidth = 5
-#define ZM_WIRELESS_MODE_49_27 0x200 ///< 4.9 GHz 27 Mbps, half rate chn-bandwidth = 10
-#define ZM_WIRELESS_MODE_49_54 0x400 ///< 4.9 GHz 54 Mbps, full rate chn-bandwidth = 20
-#define ZM_WIRELESS_MODE_5_300 0x1000 ///< 5 GHz 300 Mbps
-#define ZM_WIRELESS_MODE_24_300 0x2000 ///< 2.4 GHz 300 Mbps
-#define ZM_WIRELESS_MODE_5_130 0x4000 ///< 5 GHz 130 Mbps
-#define ZM_WIRELESS_MODE_24_130 0x8000 ///< 2.4 GHz 130 Mbps
-
-#define ZM_WIRELESS_MODE_24_N (ZM_WIRELESS_MODE_24_130|ZM_WIRELESS_MODE_24_300)
-#define ZM_WIRELESS_MODE_5_N (ZM_WIRELESS_MODE_5_130|ZM_WIRELESS_MODE_5_300)
-#define ZM_WIRELESS_MODE_24 (ZM_WIRELESS_MODE_24_11|ZM_WIRELESS_MODE_24_54|ZM_WIRELESS_MODE_24_N)
-#define ZM_WIRELESS_MODE_5 (ZM_WIRELESS_MODE_5_54|ZM_WIRELESS_MODE_5_N)
-
-/* AdHoc Mode with different band */
-#define ZM_ADHOCBAND_A 1
-#define ZM_ADHOCBAND_B 2
-#define ZM_ADHOCBAND_G 3
-#define ZM_ADHOCBAND_BG 4
-#define ZM_ADHOCBAND_ABG 5
-
-/* Authentication algorithm in the field algNo of authentication frames */
-#define ZM_AUTH_ALGO_OPEN_SYSTEM 0x10000 /* Open system */
-#define ZM_AUTH_ALGO_SHARED_KEY 0x10001 /* Shared Key */
-#define ZM_AUTH_ALGO_LEAP 0x10080 /* Leap */
-
-struct zsScanResult
-{
- u32_t reserved;
-};
-
-
-struct zsStastics
-{
- u32_t reserved;
-};
-
-#define ZM_MAX_SUPP_RATES_IE_SIZE 12
-#define ZM_MAX_IE_SIZE 50 //100
-#define ZM_MAX_WPS_IE_SIZE 150
-#define ZM_MAX_PROBE_FRAME_BODY_SIZE 512//300
-#define ZM_MAX_COUNTRY_INFO_SIZE 20
-
-#define ZM_MAX_SSID_LENGTH 32
-struct zsBssInfo
-{
- u8_t macaddr[6];
- u8_t bssid[6];
- u8_t beaconInterval[2];
- u8_t capability[2];
- u8_t timeStamp[8];
- u8_t ssid[ZM_MAX_SSID_LENGTH + 2]; // EID(1) + Length(1) + SSID(32)
- u8_t supportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + supported rates [12]
- u8_t channel;
- u16_t frequency;
- u16_t atimWindow;
- u8_t erp;
- u8_t extSupportedRates[ZM_MAX_SUPP_RATES_IE_SIZE + 2]; // EID(1) + Length(1) + extended supported rates [12]
- u8_t wpaIe[ZM_MAX_IE_SIZE + 2];
- u8_t wscIe[ZM_MAX_WPS_IE_SIZE + 2];
- u8_t rsnIe[ZM_MAX_IE_SIZE + 2];
-#ifdef ZM_ENABLE_CENC
- u8_t cencIe[ZM_MAX_IE_SIZE + 2]; /* CENC */ /* half size because of memory exceed 64k boundary */
-#endif //ZM_ENABLE_CENC
- u8_t securityType;
- u8_t signalStrength;
- u8_t signalQuality;
- u16_t sortValue;
- u8_t wmeSupport;
- u8_t flag;
- u8_t EnableHT;
- u8_t enableHT40;
- u8_t SG40;
- u8_t extChOffset;
- u8_t apCap; // bit0:11N AP
- u16_t frameBodysize;
- u8_t frameBody[ZM_MAX_PROBE_FRAME_BODY_SIZE];
- u8_t countryInfo[ZM_MAX_COUNTRY_INFO_SIZE + 2];
- u16_t athOwlAp;
- u16_t marvelAp;
- u16_t broadcomHTAp;
- u32_t tick;
- struct zsBssInfo* next;
-};
-
-struct zsBssList
-{
- u8_t bssCount;
- struct zsBssInfo* head;
- struct zsBssInfo* tail;
-};
-
-struct zsBssListV1
-{
- u8_t bssCount;
- struct zsBssInfo bssInfo[ZM_MAX_BSS];
-};
-
-#define ZM_KEY_FLAG_GK 0x0001
-#define ZM_KEY_FLAG_PK 0X0002
-#define ZM_KEY_FLAG_AUTHENTICATOR 0x0004
-#define ZM_KEY_FLAG_INIT_IV 0x0008
-#define ZM_KEY_FLAG_DEFAULT_KEY 0x0010
-
-#ifdef ZM_ENABLE_CENC
-#define ZM_KEY_FLAG_CENC 0x0020
-#endif //ZM_ENABLE_CENC
-
-// Comment: For TKIP, key[0]~key[15] => TKIP key
-// key[16]~key[23] => Tx MIC key
-// key[24]~key[31] => Rx MIC key
-struct zsKeyInfo
-{
- u8_t* key;
- u8_t keyLength;
- u8_t keyIndex;
- u8_t* initIv;
- u16_t flag;
- u8_t vapId;
- u16_t vapAddr[3];
- u16_t* macAddr;
-};
-
-
-
-/*
- * Channels are specified by frequency.
- */
-typedef struct {
- u16_t channel; /* setting in Mhz */
- u32_t channelFlags; /* see below */
- u8_t privFlags;
- s8_t maxRegTxPower; /* max regulatory tx power in dBm */
- s8_t maxTxPower; /* max true tx power in 0.25 dBm */
- s8_t minTxPower; /* min true tx power in 0.25 dBm */
-} ZM_HAL_CHANNEL;
-
-struct zsRegulationTable
-{
- u16_t regionCode;
- u16_t CurChIndex;
- u16_t allowChannelCnt;
- ZM_HAL_CHANNEL allowChannel[60]; /* 2.4GHz: 14 channels, 5 GHz: 31 channels */
-};
-
-struct zsPartnerNotifyEvent
-{
- u8_t bssid[6]; // The BSSID of IBSS
- u8_t peerMacAddr[6]; // The MAC address of peer station
-};
-
-#define ZM_RC_TRAINED_BIT 0x1
-struct zsRcCell
-{
- u32_t txCount;
- u32_t failCount;
- u8_t currentRate;
- u8_t currentRateIndex;
- u32_t probingTime;
- u8_t operationRateSet[24];
- u8_t operationRateCount;
- u16_t rxRssi;
- u8_t flag;
- u32_t lasttxCount;
- u32_t lastTime;
-};
-
-struct zsOppositeInfo
-{
- u8_t macAddr[6];
- struct zsRcCell rcCell;
- u8_t valid; // This indicate if this opposite is still valid
- u8_t aliveCounter;
- u8_t pkInstalled;
-
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- /* For WPA2PSK ! */
- u8_t wpaState;
- u8_t camIdx;
- u8_t encryMode;
- u16_t iv16;
- u32_t iv32;
-#endif
-};
-
-typedef void (*zfpIBSSIteratePeerStationCb)(
- zdev_t* dev, struct zsOppositeInfo *peerInfo, void *ctx, u8_t index);
-
-typedef u16_t (*zfpStaRxSecurityCheckCb)(zdev_t* dev, zbuf_t* buf);
-
-
-/* Communication Tally data structure */
-struct zsCommTally
-{
- u32_t txUnicastFrm; // 0 txUnicastFrames
- u32_t txMulticastFrm; // 1 txMulticastFrames
- u32_t txUnicastOctets; // 2 txUniOctets byte size
- u32_t txMulticastOctets; // 3 txMultiOctets byte size
- u32_t txFrmUpperNDIS; // 4
- u32_t txFrmDrvMgt; // 5
- u32_t RetryFailCnt; // 6
- u32_t Hw_TotalTxFrm; // 7 Hardware total Tx Frame
- u32_t Hw_RetryCnt; // 8 txMultipleRetriesFrames
- u32_t Hw_UnderrunCnt; // 9
-
- u32_t DriverRxFrmCnt; // 10
- u32_t rxUnicastFrm; // 11 rxUnicastFrames
- u32_t rxMulticastFrm; // 12rxMulticastFrames
-
- u32_t NotifyNDISRxFrmCnt; // 14
- u32_t rxUnicastOctets; // 15 rxUniOctets byte size
- u32_t rxMulticastOctets; // 16 rxMultiOctets byte size
- u32_t DriverDiscardedFrm; // 17 Discard by ValidateFrame
- u32_t LessThanDataMinLen; // 18
- u32_t GreaterThanMaxLen; // 19
- u32_t DriverDiscardedFrmCauseByMulticastList;
- u32_t DriverDiscardedFrmCauseByFrmCtrl;
- u32_t rxNeedFrgFrm; // 22 need more frg frm
- u32_t DriverRxMgtFrmCnt;
- u32_t rxBroadcastFrm; // 24 Receive broadcast frame count
- u32_t rxBroadcastOctets; // 25 Receive broadcast frame byte size
- u32_t rx11bDataFrame; // 26 Measured quality 11b data frame count
- u32_t rxOFDMDataFrame; // 27 Measured quality 11g data frame count
-
-
- u32_t Hw_TotalRxFrm; // 28
- u32_t Hw_CRC16Cnt; // 29 rxPLCPCRCErrCnt
- u32_t Hw_CRC32Cnt; // 30 rxCRC32ErrCnt
- u32_t Hw_DecrypErr_UNI; // 31
- u32_t Hw_DecrypErr_Mul; // 32
-
- u32_t Hw_RxFIFOOverrun; // 34
- u32_t Hw_RxTimeOut; // 35
- u32_t LossAP; // 36
-
- u32_t Tx_MPDU; // 37
- u32_t BA_Fail; // 38
- u32_t Hw_Tx_AMPDU; // 39
- u32_t Hw_Tx_MPDU; // 40
-
- u32_t RateCtrlTxMPDU;
- u32_t RateCtrlBAFail;
-
- u32_t txQosDropCount[5]; //41 42 43 44 45
-
- u32_t Hw_RxMPDU; // 46
- u32_t Hw_RxDropMPDU; // 47
- u32_t Hw_RxDelMPDU; // 48
-
- u32_t Hw_RxPhyMiscError; // 49
- u32_t Hw_RxPhyXRError; // 50
- u32_t Hw_RxPhyOFDMError; // 51
- u32_t Hw_RxPhyCCKError; // 52
- u32_t Hw_RxPhyHTError; // 53
- u32_t Hw_RxPhyTotalCount; // 54
-
- u32_t swRxFragmentCount; // 55
- u32_t swRxUnicastMicFailCount; // 56
- u32_t swRxMulticastMicFailCount; // 57
- u32_t swRxDropUnencryptedCount; // 58
-
- u32_t txBroadcastFrm;
- u32_t txBroadcastOctets;
-};
-
-/* Traffic Monitor Tally data structure */
-struct zsTrafTally
-{
- u32_t rxDuplicate;
- u32_t rxSrcIsOwnMac;
- //u32_t rxDataFrameCount;
- //u32_t rxDataByteCount;
- //u32_t rxDataBytesIn1000ms;
- //u32_t rxDataTmpFor1000ms;
- //u32_t rxDataBytesIn2000ms;
- //u32_t rxDataTmpFor2000ms;
-
- //u32_t txDataFrameCount;
- //u32_t txDataByteCount;
- //u32_t txDataBytesIn1000ms;
- //u32_t txDataTmpFor1000ms;
- u32_t txDataBytesIn2000ms;
- u32_t txDataTmpFor2000ms;
-};
-
-/* Hal rx packet moniter information */
-struct zsMonHalRxInfo
-{
- u32_t currentRSSI[7];
- u32_t currentRxEVM[14];
- u32_t currentRxDataMT;
- u32_t currentRxDataMCS;
- u32_t currentRxDataBW;
- u32_t currentRxDataSG;
-};
-
-struct zsTail
-{
- u8_t SignalStrength1;
- u8_t SignalStrength2;
- u8_t SignalStrength3;
- u8_t SignalQuality;
- u8_t SAIndex;
- u8_t DAIndex;
- u8_t ErrorIndication;
- u8_t RxMacStatus;
-};
-
-union zuTail
-{
- struct zsTail Data;
- u8_t Byte[8];
-};
-
-struct zsAdditionInfo
-{
- u8_t PlcpHeader[12];
- union zuTail Tail;
-};
-
-
-struct zsPmkidBssidInfo
-{
- u16_t bssid[3];
- u8_t pmkid[16];
-};
-
-struct zsPmkidInfo
-{
- u32_t bssidCount;
- struct zsPmkidBssidInfo bssidInfo[ZM_PMKID_MAX_BSS_CNT];
-};
-
-
-struct zsCbFuncTbl
-{
- u16_t (*zfcbAuthNotify)(zdev_t* dev, u16_t* macAddr);
- u16_t (*zfcbAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
- u16_t bodySize, u16_t port);
- u16_t (*zfcbDisAsocNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
- u16_t (*zfcbApConnectNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
- void (*zfcbConnectNotify)(zdev_t* dev, u16_t status, u16_t* bssid);
- void (*zfcbScanNotify)(zdev_t* dev, struct zsScanResult* result);
- void (*zfcbMicFailureNotify)(zdev_t* dev, u16_t* addr, u16_t status);
- void (*zfcbApMicFailureNotify)(zdev_t* dev, u8_t* addr, zbuf_t* buf);
- void (*zfcbIbssPartnerNotify)(zdev_t* dev, u16_t status,
- struct zsPartnerNotifyEvent *event);
- void (*zfcbMacAddressNotify)(zdev_t* dev, u8_t* addr);
- void (*zfcbSendCompleteIndication)(zdev_t* dev, zbuf_t* buf);
- void (*zfcbRecvEth)(zdev_t* dev, zbuf_t* buf, u16_t port);
- void (*zfcbRecv80211)(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
- void (*zfcbRestoreBufData)(zdev_t* dev, zbuf_t* buf);
-#ifdef ZM_ENABLE_CENC
- u16_t (*zfcbCencAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
- u16_t bodySize, u16_t port);
-#endif //ZM_ENABLE_CENC
- u8_t (*zfcbClassifyTxPacket)(zdev_t* dev, zbuf_t* buf);
-
- void (*zfcbHwWatchDogNotify)(zdev_t* dev);
-};
-
-extern void zfZeroMemory(u8_t* va, u16_t length);
-#define ZM_INIT_CB_FUNC_TABLE(p) zfZeroMemory((u8_t *)p, sizeof(struct zsCbFuncTbl));
-
-//extern struct zsWlanDev zgWlanDev;
-
-/* Initialize WLAN hardware and software, resource will be allocated */
-/* for WLAN operation, must be called first before other function. */
-extern u16_t zfiWlanOpen(zdev_t* dev, struct zsCbFuncTbl* cbFuncTbl);
-
-/* WLAN hardware will be shutdown and all resource will be release */
-extern u16_t zfiWlanClose(zdev_t* dev);
-
-/* Enable/disable Wlan operation */
-extern u16_t zfiWlanEnable(zdev_t* dev);
-extern u16_t zfiWlanDisable(zdev_t* dev, u8_t ResetKeyCache);
-extern u16_t zfiWlanResume(zdev_t* dev, u8_t doReconn);
-extern u16_t zfiWlanSuspend(zdev_t* dev);
-
-/* Enable/disable ISR interrupt */
-extern u16_t zfiWlanInterruptEnable(zdev_t* dev);
-extern u16_t zfiWlanInterruptDisable(zdev_t* dev);
-
-/* Do WLAN site survey */
-extern u16_t zfiWlanScan(zdev_t* dev);
-
-/* Get WLAN stastics */
-extern u16_t zfiWlanGetStatistics(zdev_t* dev);
-
-/* Reset WLAN */
-extern u16_t zfiWlanReset(zdev_t* dev);
-
-/* Deauthenticate a STA */
-extern u16_t zfiWlanDeauth(zdev_t* dev, u16_t* macAddr, u16_t reason);
-
-extern u16_t zfiTxSendEth(zdev_t* dev, zbuf_t* buf, u16_t port);
-extern u8_t zfiIsTxQueueFull(zdev_t* dev);
-extern u16_t zfiTxSend80211Mgmt(zdev_t* dev, zbuf_t* buf, u16_t port);
-
-extern void zfiIsrPci(zdev_t* dev);
-
-extern u8_t zfiWlanIBSSGetPeerStationsCount(zdev_t* dev);
-extern u8_t zfiWlanIBSSIteratePeerStations(zdev_t* dev, u8_t numToIterate, zfpIBSSIteratePeerStationCb callback, void *ctx);
-extern void zfiWlanFlushAllQueuedBuffers(zdev_t* dev);
-
-/* coid.c */
-extern void zfiWlanQueryMacAddress(zdev_t* dev, u8_t* addr);
-
-extern u16_t zfiGlobalDataSize(zdev_t* dev);
-
-extern void zfiHeartBeat(zdev_t* dev);
-
-extern void zfiWlanSetWlanMode(zdev_t* dev, u8_t wlanMode);
-extern void zfiWlanSetAuthenticationMode(zdev_t* dev, u8_t authMode);
-extern void zfiWlanSetWepStatus(zdev_t* dev, u8_t wepStatus);
-extern void zfiWlanSetSSID(zdev_t* dev, u8_t* ssid, u8_t ssidLength);
-extern void zfiWlanSetFragThreshold(zdev_t* dev, u16_t fragThreshold);
-extern void zfiWlanSetRtsThreshold(zdev_t* dev, u16_t rtsThreshold);
-extern void zfiWlanSetFrequency(zdev_t* dev, u32_t frequency, u8_t bImmediate);
-extern void zfiWlanSetBssid(zdev_t* dev, u8_t* bssid);
-extern void zfiWlanSetBeaconInterval(zdev_t* dev, u16_t beaconInterval,
- u8_t bImmediate);
-extern void zfiWlanSetDtimCount(zdev_t* dev, u8_t dtim);
-extern void zfiWlanSetAtimWindow(zdev_t* dev, u16_t atimWindow, u8_t bImmediate);
-extern void zfiWlanSetEncryMode(zdev_t* dev, u8_t encryMode);
-extern u8_t zfiWlanSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
-extern u8_t zfiWlanPSEUDOSetKey(zdev_t* dev, struct zsKeyInfo keyInfo);
-extern void zfiWlanSetPowerSaveMode(zdev_t* dev, u8_t mode);
-extern void zfiWlanQueryBssListV1(zdev_t* dev, struct zsBssListV1* bssListV1);
-extern void zfiWlanQueryBssList(zdev_t* dev, struct zsBssList* pBssList);
-extern void zfiWlanSetProtectionMode(zdev_t* dev, u8_t mode);
-extern void zfiWlanFlushBssList(zdev_t* dev);
-
-void zfiWlanDisableDfsChannel(zdev_t* dev, u8_t disableFlag);
-
-extern u8_t zfiWlanQueryWlanMode(zdev_t* dev);
-extern u16_t zfiWlanChannelToFrequency(zdev_t* dev, u8_t channel);
-extern u8_t zfiWlanFrequencyToChannel(zdev_t* dev, u16_t freq);
-
-#define ZM_WLAN_STATE_OPENED 0
-#define ZM_WLAN_STATE_ENABLED 1
-#define ZM_WLAN_STATE_DISABLED 2
-#define ZM_WLAN_STATE_CLOSEDED 3
-extern u8_t zfiWlanQueryAdapterState(zdev_t* dev);
-extern u8_t zfiWlanQueryAuthenticationMode(zdev_t* dev, u8_t bWrapper);
-extern u8_t zfiWlanQueryWepStatus(zdev_t* dev, u8_t bWrapper);
-extern void zfiWlanQuerySSID(zdev_t* dev, u8_t* ssid, u8_t* pSsidLength);
-extern u16_t zfiWlanQueryFragThreshold(zdev_t* dev);
-extern u16_t zfiWlanQueryRtsThreshold(zdev_t* dev);
-extern u32_t zfiWlanQueryFrequency(zdev_t* dev);
-extern u32_t zfiWlanQueryCurrentFrequency(zdev_t* dev, u8_t qmode);
-extern u32_t zfiWlanQueryFrequencyAttribute(zdev_t* dev, u32_t frequency);
-extern void zfiWlanQueryFrequencyHT(zdev_t* dev, u32_t *bandWidth, u32_t *extOffset);
-extern u8_t zfiWlanQueryCWMode(zdev_t* dev);
-extern u32_t zfiWlanQueryCWEnable(zdev_t* dev);
-extern void zfiWlanQueryBssid(zdev_t* dev, u8_t* bssid);
-extern u16_t zfiWlanQueryBeaconInterval(zdev_t* dev);
-extern u32_t zfiWlanQueryRxBeaconTotal(zdev_t* dev);
-extern u16_t zfiWlanQueryAtimWindow(zdev_t* dev);
-extern u8_t zfiWlanQueryEncryMode(zdev_t* dev);
-extern u16_t zfiWlanQueryCapability(zdev_t* dev);
-extern u16_t zfiWlanQueryAid(zdev_t* dev);
-extern void zfiWlanQuerySupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
-extern void zfiWlanQueryExtSupportRate(zdev_t* dev, u8_t* rateArray, u8_t* pLength);
-extern void zfiWlanQueryRsnIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
-extern void zfiWlanQueryWpaIe(zdev_t* dev, u8_t* ie, u8_t* pLength);
-extern u8_t zfiWlanQueryHTMode(zdev_t* dev);
-extern u8_t zfiWlanQueryBandWidth40(zdev_t* dev);
-extern u8_t zfiWlanQueryMulticastCipherAlgo(zdev_t *dev);
-extern u16_t zfiWlanQueryRegionCode(zdev_t* dev);
-extern void zfiWlanSetWpaIe(zdev_t* dev, u8_t* ie, u8_t Length);
-extern void zfiWlanSetWpaSupport(zdev_t* dev, u8_t WpaSupport);
-extern void zfiWlanCheckStaWpaIe(zdev_t* dev);
-extern void zfiWlanSetBasicRate(zdev_t* dev, u8_t bRateSet, u8_t gRateSet,
- u32_t nRateSet);
-extern void zfiWlanSetBGMode(zdev_t* dev, u8_t mode);
-extern void zfiWlanSetpreambleType(zdev_t* dev, u8_t type);
-extern u8_t zfiWlanQuerypreambleType(zdev_t* dev);
-extern u8_t zfiWlanQueryPowerSaveMode(zdev_t* dev);
-extern void zfiWlanSetMacAddress(zdev_t* dev, u16_t* mac);
-extern u16_t zfiWlanSetTxRate(zdev_t* dev, u16_t rate);
-extern u32_t zfiWlanQueryTxRate(zdev_t* dev);
-extern void zfWlanUpdateRxRate(zdev_t* dev, struct zsAdditionInfo* addInfo);
-extern u32_t zfiWlanQueryRxRate(zdev_t* dev);
-extern u8_t zfiWlanSetPmkidInfo(zdev_t* dev, u16_t* bssid, u8_t* pmkid);
-extern u32_t zfiWlanQueryPmkidInfo(zdev_t* dev, u8_t* buf, u32_t len);
-extern void zfiWlanSetAllMulticast(zdev_t* dev, u32_t setting);
-extern void zfiWlanSetHTCtrl(zdev_t* dev, u32_t *setting, u32_t forceTxTPC);
-extern void zfiWlanQueryHTCtrl(zdev_t* dev, u32_t *setting, u32_t *forceTxTPC);
-extern void zfiWlanDbg(zdev_t* dev, u8_t setting);
-
-extern void zfiWlanResetTally(zdev_t* dev);
-extern void zfiWlanQueryTally(zdev_t* dev, struct zsCommTally *tally);
-extern void zfiWlanQueryTrafTally(zdev_t* dev, struct zsTrafTally *tally);
-extern void zfiWlanQueryMonHalRxInfo(zdev_t* dev, struct zsMonHalRxInfo *halRxInfo);
-
-extern u32_t zfiFWConfig(zdev_t* dev, u32_t size);
-
-extern void zfiDKEnable(zdev_t* dev, u32_t enable);
-
-extern void zfiWlanSetMulticastList(zdev_t* dev, u8_t size, u8_t* pList);
-extern void zfiWlanRemoveKey(zdev_t* dev, u8_t keyType, u8_t keyId);
-extern u8_t zfiWlanQueryIsPKInstalled(zdev_t *dev, u8_t *staMacAddr);
-extern u32_t zfiWlanQueryPacketTypePromiscuous(zdev_t* dev);
-extern void zfiWlanSetPacketTypePromiscuous(zdev_t* dev, u32_t setValue);
-extern void zfiSetChannelManagement(zdev_t* dev, u32_t setting);
-extern void zfiSetRifs(zdev_t* dev, u16_t setting);
-extern void zfiCheckRifs(zdev_t* dev);
-extern void zfiSetReorder(zdev_t* dev, u16_t value);
-extern void zfiSetSeqDebug(zdev_t* dev, u16_t value);
-
-extern u16_t zfiConfigWdsPort(zdev_t* dev, u8_t wdsPortId, u16_t flag, u16_t* wdsAddr,
- u16_t encType, u32_t* wdsKey);
-extern void zfiWlanQueryRegulationTable(zdev_t* dev, struct zsRegulationTable* pEntry);
-extern void zfiWlanSetScanTimerPerChannel(zdev_t* dev, u16_t time);
-extern void zfiWlanSetAutoReconnect(zdev_t* dev, u8_t enable);
-extern u32_t zfiDebugCmd(zdev_t* dev, u32_t cmd, u32_t value);
-extern void zfiWlanSetProbingHiddenSsid(zdev_t* dev, u8_t* ssid, u8_t ssidLen,
- u16_t entry);
-extern void zfiWlanSetDropUnencryptedPackets(zdev_t* dev, u8_t enable);
-extern void zfiWlanSetIBSSJoinOnly(zdev_t* dev, u8_t joinOnly);
-extern void zfiWlanSetDefaultKeyId(zdev_t* dev, u8_t keyId);
-extern void zfiWlanSetDisableProbingWithSsid(zdev_t* dev, u8_t mode);
-extern void zfiWlanQueryGSN(zdev_t* dev, u8_t *gsn, u16_t vapId);
-extern u16_t zfiStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
-extern u8_t zfiWlanSetDot11DMode(zdev_t* dev, u8_t mode);
-extern u8_t zfiWlanSetDot11HDFSMode(zdev_t* dev, u8_t mode);
-extern u8_t zfiWlanSetDot11HTPCMode(zdev_t* dev, u8_t mode);
-extern u8_t zfiWlanSetAniMode(zdev_t* dev, u8_t mode);
-extern void zfiWlanSetStaWme(zdev_t* dev, u8_t enable, u8_t uapsdInfo);
-extern void zfiWlanSetApWme(zdev_t* dev, u8_t enable);
-extern u8_t zfiWlanQuerywmeEnable(zdev_t* dev);
-#ifdef ZM_OS_LINUX_FUNC
-extern void zfiWlanShowTally(zdev_t* dev);
-#endif
-#ifdef ZM_ENABLE_CENC
-/* CENC */
-extern u8_t zfiWlanSetCencPairwiseKey(zdev_t* dev, u8_t keyid, u32_t *txiv, u32_t *rxiv,
- u8_t *key, u8_t *mic);
-extern u8_t zfiWlanSetCencGroupKey(zdev_t* dev, u8_t keyid, u32_t *rxiv,
- u8_t *key, u8_t *mic);
-#endif //ZM_ENABLE_CENC
-extern void zfiWlanQuerySignalInfo(zdev_t* dev, u8_t *buffer);
-extern void zfiWlanQueryAdHocCreatedBssDesc(zdev_t* dev, struct zsBssInfo *pBssInfo);
-extern u8_t zfiWlanQueryAdHocIsCreator(zdev_t* dev);
-extern u32_t zfiWlanQuerySupportMode(zdev_t* dev);
-extern u32_t zfiWlanQueryTransmitPower(zdev_t* dev);
-extern void zfiWlanEnableLeapConfig(zdev_t* dev, u8_t leapEnabled);
-
-/* returned buffer allocated by driver core */
-extern void zfiRecvEthComplete(zdev_t* dev, zbuf_t* buf);
-
-extern void zfiRecv80211(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
-
-extern void zfiWlanSetMaxTxPower(zdev_t* dev, u8_t power2, u8_t power5);
-extern void zfiWlanQueryMaxTxPower(zdev_t* dev, u8_t *power2, u8_t *power5);
-extern void zfiWlanSetConnectMode(zdev_t* dev, u8_t mode);
-extern void zfiWlanSetSupportMode(zdev_t* dev, u32_t mode);
-extern void zfiWlanSetAdhocMode(zdev_t* dev, u32_t mode);
-extern u32_t zfiWlanQueryAdhocMode(zdev_t* dev, u8_t bWrapper);
-extern u8_t zfiWlanSetCountryIsoName(zdev_t* dev, u8_t *countryIsoName, u8_t length);
-extern const char* zfiWlanQueryCountryIsoName(zdev_t* dev);
-extern u8_t zfiWlanQueryregulatoryDomain(zdev_t* dev);
-extern u8_t zfiWlanQueryCCS(zdev_t* dev);
-extern void zfiWlanSetCCS(zdev_t* dev, u8_t mode);
-extern void zfiWlanSetRegulatory(zdev_t* dev, u8_t CCS, u16_t Code, u8_t bfirstChannel);
-extern const char* zfiHpGetisoNamefromregionCode(zdev_t* dev, u16_t regionCode);
-extern void zfiWlanSetLEDCtrlParam(zdev_t* dev, u8_t type, u8_t flag);
-extern u32_t zfiWlanQueryReceivedPacket(zdev_t* dev);
-extern void zfiWlanCheckSWEncryption(zdev_t* dev);
-extern u16_t zfiWlanQueryAllowChannels(zdev_t *dev, u16_t *channels);
-extern u16_t zfiWlanGetMulticastAddressCount(zdev_t* dev);
-extern void zfiWlanGetMulticastList(zdev_t* dev, u8_t* pMCList);
-extern void zfiWlanSetPacketFilter(zdev_t* dev, u32_t PacketFilter);
-extern u8_t zfiCompareWithMulticastListAddress(zdev_t* dev, u16_t* dstMacAddr);
-extern void zfiWlanSetSafeModeEnabled(zdev_t* dev, u8_t safeMode);
-extern void zfiWlanSetIBSSAdditionalIELength(zdev_t* dev, u32_t ibssAdditionalIESize, u8_t* ibssAdditionalIE);
-extern void zfiWlanSetXLinkMode(zdev_t* dev, u32_t setValue);
-
-/* hprw.c */
-extern u32_t zfiDbgWriteFlash(zdev_t* dev, u32_t addr, u32_t val);
-extern u32_t zfiDbgWriteReg(zdev_t* dev, u32_t addr, u32_t val);
-extern u32_t zfiDbgReadReg(zdev_t* dev, u32_t addr);
-
-extern u32_t zfiDbgWriteEeprom(zdev_t* dev, u32_t addr, u32_t val);
-extern u32_t zfiDbgBlockWriteEeprom(zdev_t* dev, u32_t addr, u32_t* buf);
-extern u32_t zfiDbgBlockWriteEeprom_v2(zdev_t* dev, u32_t addr, u32_t* buf, u32_t wrlen);
-
-extern u16_t zfiDbgChipEraseFlash(zdev_t *dev);
-extern u16_t zfiDbgProgramFlash(zdev_t *dev, u32_t offset, u32_t len, u32_t *data);
-extern u32_t zfiDbgGetFlashCheckSum(zdev_t *dev, u32_t addr, u32_t len);
-extern u32_t zfiDbgReadFlash(zdev_t *dev, u32_t addr, u32_t len);
-extern u32_t zfiDownloadFwSet(zdev_t *dev);
-
-extern u32_t zfiDbgDelayWriteReg(zdev_t* dev, u32_t addr, u32_t val);
-extern u32_t zfiDbgFlushDelayWrite(zdev_t* dev);
-
-extern u32_t zfiDbgSetIFSynthesizer(zdev_t* dev, u32_t value);
-extern u32_t zfiDbgReadTally(zdev_t* dev);
-
-extern u32_t zfiDbgQueryHwTxBusy(zdev_t* dev);
-
-extern u8_t zfiWlanGetDestAddrFromBuf(zdev_t *dev, zbuf_t *buf, u16_t *macAddr);
-
-extern u32_t zfiWlanQueryHwCapability(zdev_t* dev);
-
-extern void zfiWlanSetDynamicSIFSParam(zdev_t* dev, u8_t val);
-
-/***** End of section 2 *****/
-
-/***** section 3 performance evaluation *****/
-#ifdef ZM_ENABLE_PERFORMANCE_EVALUATION
-extern void zfiTxPerformanceMSDU(zdev_t* dev, u32_t tick);
-extern void zfiRxPerformanceMPDU(zdev_t* dev, zbuf_t* buf);
-extern void zfiRxPerformanceReg(zdev_t* dev, u32_t reg, u32_t rsp);
-#define ZM_PERFORMANCE_INIT(dev) zfiPerformanceInit(dev);
-#define ZM_PERFORMANCE_TX_MSDU(dev, tick) zfiTxPerformanceMSDU(dev, tick);
-#define ZM_PERFORMANCE_RX_MSDU(dev, tick) zfiRxPerformanceMSDU(dev, tick);
-#define ZM_PERFORMANCE_TX_MPDU(dev, tick) zfiTxPerformanceMPDU(dev, tick);
-#define ZM_PERFORMANCE_RX_MPDU(dev, buf) zfiRxPerformanceMPDU(dev, buf);
-#define ZM_PERFORMANCE_RX_SEQ(dev, buf) zfiRxPerformanceSeq(dev, buf);
-#define ZM_PERFORMANCE_REG(dev, reg, rsp) {if(cmd[1] == reg) zfiRxPerformanceReg(dev, reg, rsp);}
-#define ZM_PERFORMANCE_DUP(dev, buf1, buf2) zfiRxPerformanceDup(dev, buf1, buf2);
-#define ZM_PERFORMANCE_FREE(dev, buf) zfiRxPerformanceFree(dev, buf);
-#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len) zfiRxPerformanceAMSDU(dev, buf, len);
-#define ZM_PERFORMANCE_RX_FLUSH(dev) zfiRxPerformanceFlush(dev);
-#define ZM_PERFORMANCE_RX_CLEAR(dev) zfiRxPerformanceClear(dev);
-#define ZM_SEQ_DEBUG if (wd->seq_debug) DbgPrint
-#define ZM_PERFORMANCE_RX_REORDER(dev) zfiRxPerformanceReorder(dev);
-#else
-#define ZM_PERFORMANCE_INIT(dev)
-#define ZM_PERFORMANCE_TX_MSDU(dev, tick)
-#define ZM_PERFORMANCE_RX_MSDU(dev, tick)
-#define ZM_PERFORMANCE_TX_MPDU(dev, tick)
-#define ZM_PERFORMANCE_RX_MPDU(dev, buf)
-#define ZM_PERFORMANCE_RX_SEQ(dev, buf)
-#define ZM_PERFORMANCE_REG(dev, reg, rsp)
-#define ZM_PERFORMANCE_DUP(dev, buf1, buf2)
-#define ZM_PERFORMANCE_FREE(dev, buf)
-#define ZM_PERFORMANCE_RX_AMSDU(dev, buf, len)
-#define ZM_PERFORMANCE_RX_FLUSH(dev)
-#define ZM_PERFORMANCE_RX_CLEAR(dev)
-#define ZM_PERFORMANCE_RX_REORDER(dev)
-#endif
-/***** End of section 3 *****/
-#endif
diff --git a/drivers/staging/otus/80211core/pub_zfw.h b/drivers/staging/otus/80211core/pub_zfw.h
deleted file mode 100644
index 2474bb7..0000000
--- a/drivers/staging/otus/80211core/pub_zfw.h
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _PUB_ZFW_H
-#define _PUB_ZFW_H
-
-#include "../oal_dt.h"
-
-
-/* Buffer management */
-#ifdef ZM_ENABLE_BUFFER_DEBUG
-extern zbuf_t* zfwBufAllocateWithContext(zdev_t* dev, u16_t len, u8_t *functionName, ULONG line);
-#define zfwBufAllocate(dev, len) zfwBufAllocateWithContext(dev, len, (u8_t *)__func__, __LINE__)
-#else
-extern zbuf_t* zfwBufAllocate(zdev_t* dev, u16_t len);
-#endif
-extern void zfwBufFree(zdev_t* dev, zbuf_t* buf, u16_t errCode);
-extern u16_t zfwBufChain(zdev_t* dev, zbuf_t** head, zbuf_t* tail);
-extern u16_t zfwBufCopy(zdev_t* dev, zbuf_t* dst, zbuf_t* src);
-extern u16_t zfwBufSetSize(zdev_t* dev, zbuf_t* buf, u16_t size);
-extern u16_t zfwBufRemoveHead(zdev_t* dev, zbuf_t* buf, u16_t size);
-extern u16_t zfwBufGetSize(zdev_t* dev, zbuf_t* buf);
-extern void zfwCopyBufContext(zdev_t* dev, zbuf_t* source, zbuf_t* dest);
-
-/* Memory management */
-extern void* zfwMemAllocate(zdev_t* dev, u32_t size);
-extern void zfwMemFree(zdev_t* dev, void* mem, u32_t size);
-extern void zfwMemoryCopy(u8_t* dst, u8_t* src, u16_t length);
-extern void zfwMemoryMove(u8_t* dst, u8_t* src, u16_t length);
-extern void zfwZeroMemory(u8_t* va, u16_t length);
-extern u8_t zfwMemoryIsEqual(u8_t* m1, u8_t* m2, u16_t length);
-
-/* Others */
-extern void zfwSleep(zdev_t* dev, u32_t ms);
-extern u16_t zfwGetVapId(zdev_t* dev);
-extern u16_t zfwStaAddIeWpaRsn(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t frameType);
-extern u32_t zfwWaitForEvent(zdev_t *dev, u32_t event, u32_t timeout);
-extern void zfwSendEvent(zdev_t* dev);
-extern void zfwGetActiveScanDur(zdev_t* dev, u8_t* Dur );
-extern void zfwGetShowZeroLengthSSID(zdev_t* dev, u8_t* Dur );
-/* For debugging */
-extern void zfwDumpBuf(zdev_t* dev, zbuf_t* buf);
-extern void zfwDbgReadRegDone(zdev_t* dev, u32_t addr, u32_t val);
-/* For Evl */
-extern void zfwDbgDownloadFwInitDone(zdev_t* dev);
-extern void zfwDbgReadFlashDone(zdev_t* dev, u32_t addr, u32_t* rspdata, u32_t datalen);
-extern void zfwDbgGetFlashChkSumDone(zdev_t* dev, u32_t* rspdata);
-extern void zfwDbgProgrameFlashDone(zdev_t* dev);
-extern void zfwDbgProgrameFlashChkDone(zdev_t* dev);
-extern void zfwDbgWriteRegDone(zdev_t* dev, u32_t addr, u32_t val);
-extern void zfwDbgWriteEepromDone(zdev_t* dev, u32_t addr, u32_t val);
-extern void zfwDbgReadTallyDone(zdev_t* dev);
-extern void zfwWlanReadRegDone(zdev_t* dev, u32_t addr, u32_t val);
-extern void zfwWlanWriteRegDone(zdev_t* dev, u32_t addr, u32_t val);
-extern void zfwWlanReadTallyDone(zdev_t* dev);
-extern void zfwDbgQueryHwTxBusyDone(zdev_t* dev, u32_t val);
-extern u32_t zfwReadReg(zdev_t* dev, u32_t offset);
-extern u32_t zfwReadEeprom(zdev_t* dev, u32_t addr);
-
-/* Reserved for Vista, please return 0 */
-extern u8_t zfwGetPktEncExemptionActionType(zdev_t* dev, zbuf_t* buf);
-
-#ifdef ZM_ENABLE_CENC
-/* Reserved for CENC, please return 0 */
-extern u8_t zfwCencHandleBeaconProbrespon(zdev_t* dev, u8_t *pWIEc,
- u8_t *pPeerSSIDc, u8_t *pPeerAddrc);
-#endif //ZM_ENABLE_CENC
-
-#ifdef ZM_HALPLUS_LOCK
-extern asmlinkage struct zsWlanDev *zfwGetWlanDev(zdev_t* dev);
-extern asmlinkage void zfwEnterCriticalSection(zdev_t* dev);
-extern asmlinkage void zfwLeaveCriticalSection(zdev_t* dev);
-extern asmlinkage u8_t zfwBufReadByte(zdev_t* dev, zbuf_t* buf, u16_t offset);
-extern asmlinkage u16_t zfwBufReadHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset);
-extern asmlinkage void zfwBufWriteByte(zdev_t* dev, zbuf_t* buf, u16_t offset, u8_t value);
-extern asmlinkage void zfwBufWriteHalfWord(zdev_t* dev, zbuf_t* buf, u16_t offset, u16_t value);
-extern asmlinkage u8_t *zfwGetBuffer(zdev_t* dev, zbuf_t* buf);
-#endif
-
-#endif //_PUB_ZFW_H
diff --git a/drivers/staging/otus/80211core/queue.c b/drivers/staging/otus/80211core/queue.c
deleted file mode 100644
index 29be4bd..0000000
--- a/drivers/staging/otus/80211core/queue.c
+++ /dev/null
@@ -1,304 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : queue.c */
-/* */
-/* Abstract */
-/* This module contains queue management functions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-#include "cprecomp.h"
-#include "queue.h"
-
-
-struct zsQueue* zfQueueCreate(zdev_t* dev, u16_t size)
-{
- struct zsQueue* q;
-
- q = (struct zsQueue*)zfwMemAllocate(dev, sizeof(struct zsQueue)
- + (sizeof(struct zsQueueCell)*(size-1)));
- if (q != NULL)
- {
- q->size = size;
- q->sizeMask = size-1;
- q->head = 0;
- q->tail = 0;
- }
- return q;
-}
-
-void zfQueueDestroy(zdev_t* dev, struct zsQueue* q)
-{
- u16_t size = sizeof(struct zsQueue) + (sizeof(struct zsQueueCell)*(q->size-1));
-
- zfQueueFlush(dev, q);
- zfwMemFree(dev, q, size);
-
- return;
-}
-
-u16_t zfQueuePutNcs(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick)
-{
- u16_t ret = ZM_ERR_QUEUE_FULL;
-
- zm_msg0_mm(ZM_LV_1, "zfQueuePutNcs()");
-
- if (((q->tail+1)&q->sizeMask) != q->head)
- {
- q->cell[q->tail].buf = buf;
- q->cell[q->tail].tick = tick;
- q->tail = (q->tail+1) & q->sizeMask;
- ret = ZM_SUCCESS;
- }
-
- return ret;
-}
-
-u16_t zfQueuePut(zdev_t* dev, struct zsQueue* q, zbuf_t* buf, u32_t tick)
-{
- u16_t ret;
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- ret = zfQueuePutNcs(dev, q, buf, tick);
-
- zmw_leave_critical_section(dev);
-
- return ret;
-}
-
-zbuf_t* zfQueueGet(zdev_t* dev, struct zsQueue* q)
-{
- zbuf_t* buf = NULL;
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- if (q->head != q->tail)
- {
- buf = q->cell[q->head].buf;
- q->head = (q->head+1) & q->sizeMask;
- }
-
- zmw_leave_critical_section(dev);
-
- return buf;
-}
-
-u16_t zfCompareDstwithBuf(zdev_t* dev, zbuf_t* buf, u8_t* addr)
-{
- u16_t i;
- u8_t dst[6];
-
- for (i=0; i<6; i++)
- {
- dst[i] = zmw_buf_readb(dev, buf, i);
- if (dst[i] != addr[i])
- {
- return 1+i;
- }
- }
-
- return 0;
-}
-
-
-zbuf_t* zfQueueGetWithMac(zdev_t* dev, struct zsQueue* q, u8_t* addr, u8_t* mb)
-{
- zbuf_t* buf;
- zbuf_t* retBuf = NULL;
- u16_t index, next;
- zmw_declare_for_critical_section();
-
- *mb = 0;
-
- zmw_enter_critical_section(dev);
-
- index = q->head;
-
- while (1)
- {
- if (index != q->tail)
- {
- buf = q->cell[index].buf;
-
- //if buf's detination address == input addr
- if (zfCompareDstwithBuf(dev, buf, addr) == 0)
- {
- retBuf = buf;
- //Get it, and trace the whole queue to calculate more bit
- while ((next =((index+1)&q->sizeMask)) != q->tail)
- {
- q->cell[index].buf = q->cell[next].buf;
- q->cell[index].tick = q->cell[next].tick;
-
- if ((*mb == 0) && (zfCompareDstwithBuf(dev,
- q->cell[next].buf, addr) == 0))
- {
- *mb = 1;
- }
-
- index = next;
- }
- q->tail = (q->tail-1) & q->sizeMask;
-
- zmw_leave_critical_section(dev);
- return retBuf;
- }
- index = (index + 1) & q->sizeMask;
- } //if (index != q->tail)
- else
- {
- break;
- }
- }
-
- zmw_leave_critical_section(dev);
-
- return retBuf;
-
-}
-
-void zfQueueFlush(zdev_t* dev, struct zsQueue* q)
-{
- zbuf_t* buf;
-
- while ((buf = zfQueueGet(dev, q)) != NULL)
- {
- zfwBufFree(dev, buf, 0);
- }
-
- return;
-}
-
-void zfQueueAge(zdev_t* dev, struct zsQueue* q, u32_t tick, u32_t msAge)
-{
- zbuf_t* buf;
- u32_t buftick;
- zmw_declare_for_critical_section();
-
- while (1)
- {
- buf = NULL;
- zmw_enter_critical_section(dev);
-
- if (q->head != q->tail)
- {
- buftick = q->cell[q->head].tick;
- if (((tick - buftick)*ZM_MS_PER_TICK) > msAge)
- {
- buf = q->cell[q->head].buf;
- q->head = (q->head+1) & q->sizeMask;
- }
- }
-
- zmw_leave_critical_section(dev);
-
- if (buf != NULL)
- {
- zm_msg0_mm(ZM_LV_0, "Age frame in queue!");
- zfwBufFree(dev, buf, 0);
- }
- else
- {
- break;
- }
- }
- return;
-}
-
-
-u8_t zfQueueRemovewithIndex(zdev_t* dev, struct zsQueue* q, u16_t index, u8_t* addr)
-{
- u16_t next;
- u8_t mb = 0;
-
- //trace the whole queue to calculate more bit
- while ((next =((index+1)&q->sizeMask)) != q->tail)
- {
- q->cell[index].buf = q->cell[next].buf;
- q->cell[index].tick = q->cell[next].tick;
-
- if ((mb == 0) && (zfCompareDstwithBuf(dev,
- q->cell[next].buf, addr) == 0))
- {
- mb = 1;
- }
-
- index = next;
- }
- q->tail = (q->tail-1) & q->sizeMask;
-
- return mb;
-
-}
-
-void zfQueueGenerateUapsdTim(zdev_t* dev, struct zsQueue* q,
- u8_t* uniBitMap, u16_t* highestByte)
-{
- zbuf_t* psBuf;
- u8_t dst[6];
- u16_t id, aid, index, i;
- u16_t bitPosition;
- u16_t bytePosition;
- zmw_get_wlan_dev(dev);
- zmw_declare_for_critical_section();
-
- zmw_enter_critical_section(dev);
-
- index = q->head;
-
- while (index != q->tail)
- {
- psBuf = q->cell[index].buf;
- for (i=0; i<6; i++)
- {
- dst[i] = zmw_buf_readb(dev, psBuf, i);
- }
- /* TODO : use u8_t* fot MAC address */
- if (((id = zfApFindSta(dev, (u16_t*)dst)) != 0xffff)
- && (wd->ap.staTable[id].psMode != 0))
- {
- /* Calculate PVB only when all AC are delivery-enabled */
- if ((wd->ap.staTable[id].qosInfo & 0xf) == 0xf)
- {
- aid = id + 1;
- bitPosition = (1 << (aid & 0x7));
- bytePosition = (aid >> 3);
- uniBitMap[bytePosition] |= bitPosition;
-
- if (bytePosition>*highestByte)
- {
- *highestByte = bytePosition;
- }
- }
- index = (index+1) & q->sizeMask;
- }
- else
- {
- /* Free garbage UAPSD frame */
- zfQueueRemovewithIndex(dev, q, index, dst);
- zfwBufFree(dev, psBuf, 0);
- }
- }
- zmw_leave_critical_section(dev);
-
- return;
-}
diff --git a/drivers/staging/otus/80211core/queue.h b/drivers/staging/otus/80211core/queue.h
deleted file mode 100644
index 4526b88..0000000
--- a/drivers/staging/otus/80211core/queue.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _QUEUE_H
-#define _QUEUE_H
-
-#include "../oal_dt.h"
-
-struct zsQueueCell
-{
- u32_t tick;
- zbuf_t* buf;
-};
-
-struct zsQueue
-{
- u16_t size;
- u16_t sizeMask;
- u16_t head;
- u16_t tail;
- struct zsQueueCell cell[1];
-};
-
-#endif //#ifndef _QUEUE_H
diff --git a/drivers/staging/otus/80211core/ratectrl.c b/drivers/staging/otus/80211core/ratectrl.c
deleted file mode 100644
index a1abe2f..0000000
--- a/drivers/staging/otus/80211core/ratectrl.c
+++ /dev/null
@@ -1,875 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#include "cprecomp.h"
-#include "ratectrl.h"
-
-const u32_t zcRateToPhyCtrl[] =
- {
- /* 1M, 2M, 5M, 11M , 0 1 2 3*/
- 0x00000, 0x10000, 0x20000, 0x30000,
- /* 6M 9M 12M 18M , 4 5 6 7*/
- 0xb0001, 0xf0001, 0xa0001, 0xe0001,
- /* 24M 36M 48M 54M , 8 9 10 11*/
- 0x90001, 0xd0001, 0x80001, 0xc0001,
- /* MCS0 MCS1 MCS2 MCS3, 12 13 14 15*/
- 0x00002, 0x10002, 0x20002, 0x30002,
- /* MCS4 MCS5 MCS6 MCS7, 16 17 18 19*/
- 0x40002, 0x50002, 0x60002, 0x70002,
- /* MCS8 MCS9 MCS10 MCS11, 20 21 22 23*/
- 0x80002, 0x90002, 0xa0002, 0xb0002,
- /* MCS12 MCS13 MCS14 MCS15, 24 25 26 27*/
- 0xc0002, 0xd0002, 0xe0002, 0xf0002,
- /* MCS14SG, MCS15SG MCS7SG , 28 29, 30*/
- 0x800e0002, 0x800f0002, 0x80070002
- };
-
-
-const u8_t zcHtRateTable[15][4] =
- { /*[5G 20MHz] [5G 40MHz] [2.4G 20MHz] [2.4G 40MHz]*/
- { 4, 4, 0, 0}, /*OFDM6M OFDM6M CCK1M CCK1M */
- { 5, 5, 1, 1}, /*OFDM9M OFDM9M CCK2M CCK2M */
- { 13, 12, 2, 2}, /*MCS1 MCS0 CCK5M CCK5M */
- { 14, 13, 3, 3}, /*MCS2 MCS1 CCK11M CCK11M */
- { 15, 14, 13, 12}, /*MCS3 MCS2 MCS1 MCS0 */
- { 16, 15, 14, 13}, /*MCS4 MCS3 MCS2 MCS1 */
- { 23, 16, 15, 14}, /*MCS11 MCS4 MCS3 MCS2 */
- { 24, 23, 16, 15}, /*MCS12 MCS11 MCS4 MCS3 */
- { 25, 24, 23, 16}, /*MCS13 MCS12 MCS11 MCS4 */
- { 26, 25, 24, 23}, /*MCS14 MCS13 MCS12 MCS11 */
- { 27, 26, 25, 24}, /*MCS15 MCS14 MCS13 MCS12 */
- { 0, 27, 26, 25}, /*0 MCS15 MCS14 MCS13 */
- { 0, 29, 27, 26}, /*0 MCS15SG MCS15 MCS14 */
- { 0, 0, 0, 28}, /*0 0 0 MCS14SG*/
- { 0, 0, 0, 29} /*0 0 0 MCS15SG*/
- };
-
-const u8_t zcHtOneTxStreamRateTable[15][4] =
- { /*[5G 20MHz] [5G 40MHz] [2.4G 20MHz] [2.4G 40MHz]*/
- { 4, 4, 0, 0}, /*OFDM6M OFDM6M CCK1M CCK1M */
- { 5, 5, 1, 1}, /*OFDM9M OFDM9M CCK2M CCK2M */
- { 13, 12, 2, 2}, /*MCS1 MCS0 CCK5M CCK5M */
- { 14, 13, 3, 3}, /*MCS2 MCS1 CCK11M CCK11M */
- { 15, 14, 13, 12}, /*MCS3 MCS2 MCS1 MCS0 */
- { 16, 15, 14, 13}, /*MCS4 MCS3 MCS2 MCS1 */
- { 17, 16, 15, 14}, /*MCS5 MCS4 MCS3 MCS2 */
- { 18, 17, 16, 15}, /*MCS6 MCS5 MCS4 MCS3 */
- { 19, 18, 17, 16}, /*MCS7 MCS6 MCS5 MCS4 */
- { 0, 19, 18, 17}, /*0 MCS7 MCS6 MCS5 */
- { 0, 30, 19, 18}, /*0 MCS7SG MCS7 MCS6 */
- { 0, 0, 0, 19}, /*0 0 0 MCS7 */
- { 0, 0, 0, 30}, /*0 0 0 MCS7SG */
- { 0, 0, 0, 0 }, /*0 0 0 0 */
- { 0, 0, 0, 0 } /*0 0 0 0 */
- };
-
-const u16_t zcRate[] =
- {
- 1, 2, 5, 11, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
- 6, 9, 12, 18, /* 6M 9M 12M 18M , 4 5 6 7*/
- 24, 36, 48, 54, /* 24M 36M 48M 54M , 8 9 10 11*/
- 13, 27, 40, 54, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
- 81, 108, 121, 135, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
- 27, 54, 81, 108, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
- 162, 216, 243, 270, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
- 270, 300, 150 /* MCS14SG, MCS15SG, MCS7SG , 28 29 30*/
- };
-
-const u16_t PERThreshold[] =
- {
- 100, 50, 50, 50, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
- 50, 50, 30, 30, /* 6M 9M 12M 18M , 4 5 6 7*/
- 25, 25, 25, 20, /* 24M 36M 48M 54M , 8 9 10 11*/
- 50, 50, 50, 40, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
- 30, 30, 30, 30, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
- 30, 30, 25, 25, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
- 25, 25, 15, 15, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
- 15, 15, 10 /* MCS14SG, MCS15SG , 28 29*/
- };
-
-const u16_t FailDiff[] =
- {
- 40, 46, 40, 0, /* 1M, 2M, 5M, 11M , 0 1 2 3*/
- 24, 17, 22, 16, /* 6M 9M 12M 18M , 4 5 6 7*/
- 19, 13, 5, 0, /* 24M 36M 48M 54M , 8 9 10 11*/
- 36, 22, 15, 19, /* MCS0 MCS1 MCS2 MCS3 , 12 13 14 15*/
- 12, 5, 4, 7, /* MCS4 MCS5 MCS6 MCS7 , 16 17 18 19*/
- 0, 0, 0, 0, /* MCS8 MCS9 MCS10 MCS11 , 20 21 22 23*/
- 9, 4, 3, 3, /* MCS12 MCS13 MCS14 MCS15 , 24 25 26 27*/
- 3, 0, 0 /* MCS14SG, MCS15SG , 28 29*/
- };
-
-
-#ifdef ZM_ENABLE_BA_RATECTRL
-u32_t TxMPDU[29];
-u32_t BAFail[29];
-u32_t BAPER[29];
-const u16_t BADiff[] =
- {
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 0, 0, 0, 0,
- 361, 220, 151, 187,
- 122, 48, 41, 65,
- 0, 0, 0, 0,
- 88, 33, 27, 25,
- 0
- };
-#endif
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlInitCell */
-/* Initialize rate control cell. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* type : 0=>11b, 1=>11a/g, 2=>11n, 3=>11n one Tx stream */
-/* gBand : 1=>2.4G, 0=>5G */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-void zfRateCtrlInitCell(zdev_t* dev, struct zsRcCell* rcCell, u8_t type,
- u8_t gBand, u8_t SG40)
-{
- u8_t i;
- u8_t maxrate;
- zmw_get_wlan_dev(dev);
-
- if (SG40) SG40 = 1;
-
- if (gBand != 0)
- {
- if (type == 1) //11g
- {
- for (i=0; i<4; i++) //1M 2M 5M 11M
- {
- rcCell->operationRateSet[i] = (u8_t)i;
- }
- for (i=4; i<10; i++) //12M 18M 24M 36M 48M 54M
- {
- rcCell->operationRateSet[i] = 2+i;
- }
- rcCell->operationRateCount = 10;
- rcCell->currentRateIndex = 5; //18M
- }
- else if (type == 2) //11ng
- {
- if (wd->wlanMode == ZM_MODE_AP) //AP 11ng 40M
- {
- for (i=0; i<15; i++)
- {
- rcCell->operationRateSet[i] = zcHtRateTable[i][3];
- }
- if(!SG40) rcCell->operationRateSet[13] = 27;
- rcCell->operationRateCount = 14+SG40;
- rcCell->currentRateIndex = 10;
- }
- else //STA
- {
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11ng 40M
- {
- for (i=0; i<15; i++)
- {
- rcCell->operationRateSet[i] = zcHtRateTable[i][3];
- }
- if(!SG40) rcCell->operationRateSet[13] = 27;
- rcCell->operationRateCount = 14+SG40;
- rcCell->currentRateIndex = 10;
- }
- else //11ng 20M
- {
- for (i=0; i<13; i++)
- {
- rcCell->operationRateSet[i] = zcHtRateTable[i][2];
- }
- rcCell->operationRateCount = 13;
- rcCell->currentRateIndex = 9;
- }
- }
- }
- else if (type == 3) //11ng one Tx stream
- {
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11ng 40M one Tx stream
- {
- if(SG40 != 0)
- {
- maxrate = 13;
- }
- else
- {
- maxrate = 12;
- }
- for (i=0; i<maxrate; i++)
- {
- rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][3];
- }
- rcCell->operationRateCount = i;
- rcCell->currentRateIndex = ((i+1)*3)/4;
- }
- else //11ng 20M
- {
- for (i=0; i<11; i++)
- {
- rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][2];
- }
- rcCell->operationRateCount = i;
- rcCell->currentRateIndex = ((i+1)*3)/4;
- }
- }
- else //if (type == 0) //11b
- {
- for (i=0; i<4; i++)
- {
- rcCell->operationRateSet[i] = (u8_t)i;
- }
- rcCell->operationRateCount = 4;
- rcCell->currentRateIndex = rcCell->operationRateCount-1;
- }
- }
- else
- {
- if (type == 2) //11na
- {
- if (wd->wlanMode == ZM_MODE_AP) //AP 11na 40M
- {
- for (i=0; i<(12+SG40); i++)
- {
- rcCell->operationRateSet[i] = zcHtRateTable[i][1];
- }
- rcCell->operationRateCount = 12+SG40;
- rcCell->currentRateIndex = 8;
- }
- else //STA
- {
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11na 40M
- {
- for (i=0; i<(12+SG40); i++)
- {
- rcCell->operationRateSet[i] = zcHtRateTable[i][1];
- }
- rcCell->operationRateCount = 12+SG40;
- rcCell->currentRateIndex = 8;
- }
- else //11na 20M
- {
- for (i=0; i<11; i++)
- {
- rcCell->operationRateSet[i] = zcHtRateTable[i][0];
- }
- rcCell->operationRateCount = 11;
- rcCell->currentRateIndex = 7;
- }
- }
- }
- else if (type == 3) //11na one Tx stream
- {
- if (wd->sta.htCtrlBandwidth == ZM_BANDWIDTH_40MHZ) //11na 40M one Tx stream
- {
- if(SG40 != 0)
- {
- maxrate = 11;
- }
- else
- {
- maxrate = 10;
- }
- for (i=0; i<maxrate; i++)
- {
- rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][1];
- }
- rcCell->operationRateCount = i;
- rcCell->currentRateIndex = ((i+1)*3)/4;
- }
- else //11ng 20M
- {
- for (i=0; i<9; i++)
- {
- rcCell->operationRateSet[i] = zcHtOneTxStreamRateTable[i][0];
- }
- rcCell->operationRateCount = i;
- rcCell->currentRateIndex = ((i+1)*3)/4;
- }
- }
- else //if (type == 1) //11a
- {
- for (i=0; i<8; i++) //6M 9M 12M 18M 24M 36M 48M 54M
- {
- rcCell->operationRateSet[i] = i+4;
- }
- rcCell->operationRateCount = 8;
- rcCell->currentRateIndex = 4; //24M
- }
- }
-
- rcCell->flag = 0;
- rcCell->txCount = 0;
- rcCell->failCount = 0;
- rcCell->currentRate = rcCell->operationRateSet[rcCell->currentRateIndex];
- rcCell->lasttxCount = 0;
- rcCell->lastTime = wd->tick;
- rcCell->probingTime = wd->tick;
- for (i=0; i<ZM_RATE_TABLE_SIZE; i++) {
- wd->PER[i] = 0;
- wd->txMPDU[i] = wd->txFail[i] = 0;
- }
- wd->probeCount = 0;
- wd->probeInterval = 0;
-#ifdef ZM_ENABLE_BA_RATECTRL
- for (i=0; i<29; i++) {
- TxMPDU[i]=0;
- BAFail[i]=0;
- BAPER[i]=0;
- }
-#endif
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlGetHigherRate */
-/* Get a higher rate. */
-/* */
-/* INPUTS */
-/* rcCell : rate control cell */
-/* */
-/* OUTPUTS */
-/* rate */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-u8_t zfRateCtrlGetHigherRate(struct zsRcCell* rcCell)
-{
- u8_t rateIndex;
-
- rateIndex = rcCell->currentRateIndex
- + (((rcCell->currentRateIndex+1) < rcCell->operationRateCount)?1:0);
- return rcCell->operationRateSet[rateIndex];
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlNextLowerRate */
-/* Get a lower rate. */
-/* */
-/* INPUTS */
-/* rcCell : rate control cell */
-/* */
-/* OUTPUTS */
-/* rate */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-u8_t zfRateCtrlNextLowerRate(zdev_t* dev, struct zsRcCell* rcCell)
-{
- zmw_get_wlan_dev(dev);
- if (rcCell->currentRateIndex > 0)
- {
- rcCell->currentRateIndex--;
- rcCell->currentRate = rcCell->operationRateSet[rcCell->currentRateIndex];
- }
- zm_msg1_tx(ZM_LV_0, "Lower Tx Rate=", rcCell->currentRate);
- //DbgPrint("Lower Tx Rate=%d", rcCell->currentRate);
- rcCell->failCount = rcCell->txCount = 0;
- rcCell->lasttxCount = 0;
- rcCell->lastTime = wd->tick;
- return rcCell->currentRate;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlRateDiff */
-/* Rate difference. */
-/* */
-/* INPUTS */
-/* rcCell : rate control cell */
-/* retryRate : retry rate */
-/* */
-/* OUTPUTS */
-/* rate difference */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-u8_t zfRateCtrlRateDiff(struct zsRcCell* rcCell, u8_t retryRate)
-{
- u16_t i;
-
- /* Find retryRate in operationRateSet[] */
- for (i=0; i<rcCell->operationRateCount; i++)
- {
- if (retryRate == rcCell->operationRateSet[i])
- {
- if (i < rcCell->currentRateIndex)
- {
- return ((rcCell->currentRateIndex - i)+1)>>1;
- }
- else if (i == rcCell->currentRateIndex == 0)
- {
- return 1;
- }
- else
- {
- return 0;
- }
- }
- }
- /* TODO : retry rate not in operation rate set */
- zm_msg1_tx(ZM_LV_0, "Not in operation rate set:", retryRate);
- return 1;
-
-}
-
-u32_t zfRateCtrlUDPTP(zdev_t* dev, u16_t Rate, u32_t PER) {
- if ((PER < 100) && (Rate > 0) && PER)
- return 1168000/(((12304/Rate)+197)*(100+100*PER/(100-PER)));
- else
- return 0;
-}
-
-u8_t zfRateCtrlFindMaxUDPTP(zdev_t* dev, struct zsRcCell* rcCell) {
- u8_t i, maxIndex=0, rateIndex;
- u32_t max=0, UDPThroughput;
-
- zmw_get_wlan_dev(dev);
-
- rateIndex = zm_agg_min(rcCell->currentRateIndex+3, rcCell->operationRateCount-1);
- for (i=rcCell->currentRateIndex; i < rateIndex; i++) {
- UDPThroughput = zfRateCtrlUDPTP(dev, zcRate[rcCell->operationRateSet[i]],
- wd->PER[rcCell->operationRateSet[i]]);
- if (max < UDPThroughput) {
- max = UDPThroughput;
- maxIndex = i;
- }
- }
-
- return rcCell->operationRateSet[maxIndex];
-}
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlGetTxRate */
-/* Get transmission rate. */
-/* */
-/* INPUTS */
-/* dev : device pointer */
-/* rcCell : rate control cell */
-/* probing : rate probing flag */
-/* */
-/* OUTPUTS */
-/* Tx rate */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-u16_t zfRateCtrlGetTxRate(zdev_t* dev, struct zsRcCell* rcCell, u16_t* probing)
-{
- u8_t newRate, highRate;
- zmw_get_wlan_dev(dev);
-
- zm_msg1_tx(ZM_LV_3, "txCount=", rcCell->txCount);
- zm_msg1_tx(ZM_LV_3, "probingTime=", rcCell->probingTime);
- zm_msg1_tx(ZM_LV_3, "tick=", wd->tick);
- *probing = 0;
- newRate = rcCell->currentRate;
-
- if (wd->probeCount && (wd->probeCount < wd->success_probing))
- {
- if (wd->probeInterval < 50)
- {
- wd->probeInterval++;
- }
- else
- {
- wd->probeInterval++;
- if (wd->probeInterval > 52) //probe 51, 52, 53 three packets every 50 packets
- {
- wd->probeInterval = 0;
- }
- newRate=zfRateCtrlGetHigherRate(rcCell);
- *probing = 1;
- wd->probeCount++;
- rcCell->probingTime = wd->tick;
- }
- }
- /* Accumulate at least 1000ms and 8 packets or Accumulate over 1K packets */
- else if ((((wd->tick - rcCell->probingTime) > (ZM_RATE_CTRL_PROBING_INTERVAL_MS/ZM_MS_PER_TICK))
- && (rcCell->txCount >= ZM_RATE_CTRL_MIN_PROBING_PACKET))
- || (rcCell->txCount >= 1000))
- {
-#ifndef ZM_DISABLE_RATE_CTRL
- /* PER = fail/total */
- wd->probeCount = 0;
- wd->probeSuccessCount = 0;
- if (wd->txMPDU[rcCell->currentRate] != 0) {
- wd->PER[rcCell->currentRate] = zm_agg_min(100,
- (wd->txFail[rcCell->currentRate]*100)/wd->txMPDU[rcCell->currentRate]);
- if (!wd->PER[rcCell->currentRate]) wd->PER[rcCell->currentRate] ++;
- }
-
- /* if PER < threshold, do rate probing, return probing rate */
- if ((wd->PER[rcCell->currentRate] <= (ZM_RATE_PROBING_THRESHOLD+15)) ||
- ((rcCell->currentRate <= 16) &&
- ((wd->PER[rcCell->currentRate]/2) <= ZM_RATE_PROBING_THRESHOLD)))
- {
- newRate = zfRateCtrlGetHigherRate(rcCell);
- if (newRate != rcCell->currentRate)
- {
- *probing = 1;
- wd->probeCount++;
- wd->probeInterval = 0;
- wd->success_probing =
- (rcCell->currentRate <= 16)? (ZM_RATE_SUCCESS_PROBING/2) : ZM_RATE_SUCCESS_PROBING;
- //DbgPrint("Start Probing");
- zm_msg1_tx(ZM_LV_0, "Probing Rate=", newRate);
- }
- }
-#endif
-
- zm_msg0_tx(ZM_LV_1, "Diminish counter");
- rcCell->failCount = rcCell->failCount>>1;
- rcCell->txCount = rcCell->txCount>>1;
- wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
- wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
-
-
- if (rcCell->currentRate > 15) {
- highRate = zfRateCtrlGetHigherRate(rcCell);
- if ((highRate != rcCell->currentRate) && wd->PER[highRate] &&
- ((wd->PER[rcCell->currentRate] + FailDiff[rcCell->currentRate]) >
- wd->PER[highRate])) {
- //DbgPrint("PER compare force raise rate to %d", highRate);
- wd->probeSuccessCount = wd->probeCount = ZM_RATE_SUCCESS_PROBING;
- zfRateCtrlTxSuccessEvent(dev, rcCell, highRate);
- }
- }
- else {
- highRate = zfRateCtrlFindMaxUDPTP(dev, rcCell);
- if (rcCell->currentRate < highRate) {
- //DbgPrint("UDP Throughput compare force raise rate to %d", highRate);
- wd->probeSuccessCount = wd->probeCount = ZM_RATE_SUCCESS_PROBING;
- zfRateCtrlTxSuccessEvent(dev, rcCell, highRate);
- }
- }
- rcCell->probingTime = wd->tick;
- }
-
- if( (wd->tick > 1000)
- && ((wd->tick - rcCell->lastTime) > 3840) )
- {
- if (rcCell->lasttxCount < 70)
- {
- rcCell->failCount = rcCell->failCount>>1;
- rcCell->txCount = rcCell->txCount>>1;
- wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
- wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
-
- rcCell->failCount = (rcCell->failCount < rcCell->txCount)?
- rcCell->failCount : rcCell->txCount;
- wd->txFail[rcCell->currentRate] = (wd->txFail[rcCell->currentRate] < wd->txMPDU[rcCell->currentRate])?
- wd->txFail[rcCell->currentRate] : wd->txMPDU[rcCell->currentRate];
- }
-
- rcCell->lastTime = wd->tick;
- rcCell->lasttxCount = 0;
- }
-
- rcCell->txCount++;
- rcCell->lasttxCount++;
- wd->txMPDU[rcCell->currentRate]++;
- zm_msg1_tx(ZM_LV_1, "Get Tx Rate=", newRate);
- return newRate;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlTxFailEvent */
-/* Tx fail event. Calculate PER and lower Tx rate if under */
-/* PER under threshold. */
-/* */
-/* INPUTS */
-/* rcCell : rate control cell */
-/* retryRate : retry rate */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-void zfRateCtrlTxFailEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t aggRate, u32_t retryRate)
-{
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
-#ifndef ZM_DISABLE_RATE_CTRL
- //DbgPrint("aggRate=%d, retryRate=%d", aggRate, retryRate);
- if (aggRate && (aggRate != rcCell->currentRate)) {
- wd->txFail[aggRate] += retryRate;
- return;
- }
-
- if (!aggRate) {
- retryRate = (zfRateCtrlRateDiff(rcCell, (u8_t)retryRate)+1)>>1;
- if (rcCell->currentRate <12) //legacy rate
- {
- retryRate*=2;
- }
- }
- rcCell->failCount += retryRate;
- wd->txFail[rcCell->currentRate] += retryRate;
-
- //DbgPrint("failCount=%d", rcCell->failCount);
- if (rcCell->failCount > ZM_MIN_RATE_FAIL_COUNT)
- {
- if (wd->txMPDU[rcCell->currentRate] != 0) {
- wd->PER[rcCell->currentRate] = zm_agg_min(100,
- (wd->txFail[rcCell->currentRate]*100)/wd->txMPDU[rcCell->currentRate]);
- if (!wd->PER[rcCell->currentRate]) wd->PER[rcCell->currentRate] ++;
- }
- //zm_msg1_tx(ZM_LV_1, "PER=", per);
- //DbgPrint("PER=%d, txFail=%d, txMPDU=%d", wd->PER[rcCell->currentRate], wd->txFail[rcCell->currentRate], wd->txMPDU[rcCell->currentRate]);
- if (wd->PER[rcCell->currentRate] > PERThreshold[rcCell->currentRate])
- {
- /* Lower Tx Rate if PER < THRESHOLD */
- zfRateCtrlNextLowerRate(dev, rcCell);
- rcCell->flag |= ZM_RC_TRAINED_BIT;
-
- // Resolve compatibility problem with Marvell
- if(rcCell->currentRate == 15)
- {
- zmw_leave_critical_section(dev);
- zfHpSetAggPktNum(dev, 8);
- zmw_enter_critical_section(dev);
- }
-
- wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
- wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
-
- wd->probeCount = wd->probeSuccessCount = 0;
- }
- }
-
-#endif
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlTxSuccessEvent */
-/* Tx success event. Raise Tx rate because rate probing success. */
-/* */
-/* INPUTS */
-/* rcCell : rate control cell */
-/* successRate : success rate */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-void zfRateCtrlTxSuccessEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t successRate)
-{
- /* Raise Tx Rate */
- u16_t i, PERProbe;
- u16_t pcount;
- zmw_get_wlan_dev(dev);
-
- zmw_declare_for_critical_section();
-
- //DbgPrint("Probing successRate=%d", successRate);
- /* Find successRate in operationRateSet[] */
- wd->probeSuccessCount++;
- if (wd->probeCount < wd->success_probing)
- {
- return;
- }
-
- pcount = wd->probeCount;
- if (pcount != 0)
- {
- PERProbe = wd->probeSuccessCount * 100 / pcount;
- }
- else
- {
- PERProbe = 1;
- }
-
- if (PERProbe < ((rcCell->currentRate < 16)? 80:100))
- {
- return;
- }
- //DbgPrint("wd->probeCount=%d, wd->probeSuccessCount=%d", wd->probeCount, wd->probeSuccessCount);
- wd->probeCount = wd->probeSuccessCount = 0;
- for (i=0; i<rcCell->operationRateCount; i++)
- {
- if (successRate == rcCell->operationRateSet[i])
- {
- if (i > rcCell->currentRateIndex)
- {
- /* Raise current Tx rate */
- zm_msg1_tx(ZM_LV_0, "Raise Tx Rate=", successRate);
- //DbgPrint("Raise Tx Rate=%d", successRate);
-
- // Resolve compatibility problem with Marvell
- if((rcCell->currentRate <= 15) && (successRate > 15))
- {
- zmw_leave_critical_section(dev);
- zfHpSetAggPktNum(dev, 16);
- zmw_enter_critical_section(dev);
- }
-
- rcCell->currentRate = successRate;
- rcCell->currentRateIndex = (u8_t)i;
- rcCell->failCount = rcCell->txCount = 0;
- rcCell->lasttxCount = 0;
- rcCell->lastTime = wd->tick;
- wd->txFail[rcCell->currentRate] = wd->txFail[rcCell->currentRate] >> 1;
- wd->txMPDU[rcCell->currentRate] = wd->txMPDU[rcCell->currentRate] >> 1;
- }
- }
- }
-
- return;
-}
-
-
-/************************************************************************/
-/* */
-/* FUNCTION DESCRIPTION zfRateCtrlRxRssiEvent */
-/* Rx RSSI event. Calculate RSSI moving average, accelarate */
-/* rate probing if RSSI variation over threshold. */
-/* */
-/* INPUTS */
-/* rcCell : rate control cell */
-/* successRate : success rate */
-/* */
-/* OUTPUTS */
-/* None */
-/* */
-/* AUTHOR */
-/* Stephen Chen Atheros Communications, INC. 2007.2 */
-/* */
-/************************************************************************/
-void zfRateCtrlRxRssiEvent(struct zsRcCell* rcCell, u16_t rxRssi)
-{
- /* if delta(rcCell->rxRssi, rxRssi) > ZM_RATE_CTRL_RSSI_VARIATION */
- if ((rcCell->rxRssi - rxRssi) > ZM_RATE_CTRL_RSSI_VARIATION)
- {
- /* Accelerate rate probing via decreaing rcCell->probingTime */
- rcCell->probingTime -= ZM_RATE_CTRL_PROBING_INTERVAL_MS/ZM_MS_PER_TICK;
- }
-
- /* Update RSSI moving average */
- rcCell->rxRssi = (((rcCell->rxRssi*7) + rxRssi)+4) >> 3;
- return;
-}
-
-
-#ifdef ZM_ENABLE_BA_RATECTRL
-u8_t HigherRate(u8_t Rate) {
- if (Rate < 28) Rate++; //28=MCS15SG, 27=MCS15, 26=MCS14, 25=MCS13
- if (Rate > 28) Rate = 28;
- while ((Rate >= 20) && (Rate <= 23)) {
- Rate ++;
- }
- return Rate;
-}
-
-u8_t LowerRate(u8_t Rate) {
- if (Rate > 1) Rate--;
- while ((Rate >= 20) && (Rate <= 23)) {
- Rate --;
- }
- return Rate;
-}
-
-u8_t RateMapToRateIndex(u8_t Rate, struct zsRcCell* rcCell) {
- u8_t i;
- for (i=0; i<rcCell->operationRateCount; i++) {
- if (Rate == rcCell->operationRateSet[i]) {
- return i;
- }
- }
- return 0;
-}
-
-void zfRateCtrlAggrSta(zdev_t* dev) {
- u8_t RateIndex, Rate;
- u8_t HRate;
- u8_t LRate;
- u32_t RateCtrlTxMPDU, RateCtrlBAFail;
- zmw_get_wlan_dev(dev);
-
- RateIndex = wd->sta.oppositeInfo[0].rcCell.currentRateIndex;
- Rate = wd->sta.oppositeInfo[0].rcCell.operationRateSet[RateIndex];
-
- TxMPDU[Rate] = (TxMPDU[Rate] / 5) + (wd->commTally.RateCtrlTxMPDU * 4 / 5);
- BAFail[Rate] = (BAFail[Rate] / 5) + (wd->commTally.RateCtrlBAFail * 4 / 5);
- RateCtrlTxMPDU = wd->commTally.RateCtrlTxMPDU;
- RateCtrlBAFail = wd->commTally.RateCtrlBAFail;
- wd->commTally.RateCtrlTxMPDU = 0;
- wd->commTally.RateCtrlBAFail = 0;
- if (TxMPDU[Rate] > 0) {
- BAPER[Rate] = BAFail[Rate] * 1000 / TxMPDU[Rate]; //PER*1000
- BAPER[Rate] = (BAPER[Rate]>0)? BAPER[Rate]:1;
- }
- else {
- return;
- }
-
- HRate = HigherRate(Rate);
- LRate = LowerRate(Rate);
- if (BAPER[Rate]>200) {
- if ((RateCtrlTxMPDU > 100) && (BAPER[Rate]<300) && (HRate != Rate) && BAPER[HRate] &&
- (BAPER[HRate] < BAPER[Rate] + BADiff[Rate])) {
- Rate = HRate;
- //DbgPrint("Rate improved to %d", Rate);
- }
- else {
- Rate = LRate;
- //DbgPrint("Rate decreased to %d", Rate);
- }
- }
- else if (BAPER[Rate] && BAPER[Rate]<100) {
- if (RateCtrlTxMPDU > 100) {
- Rate = HRate;
- //DbgPrint("Rate improved to %d", Rate);
- }
- }
- wd->sta.oppositeInfo[0].rcCell.currentRate = Rate;
- wd->sta.oppositeInfo[0].rcCell.currentRateIndex = RateMapToRateIndex(Rate, &wd->sta.oppositeInfo[0].rcCell);
-}
-#endif
diff --git a/drivers/staging/otus/80211core/ratectrl.h b/drivers/staging/otus/80211core/ratectrl.h
deleted file mode 100644
index 92411d7..0000000
--- a/drivers/staging/otus/80211core/ratectrl.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _RATECTRL_H
-#define _RATECTRL_H
-
-#define ZM_RATE_CTRL_PROBING_INTERVAL_MS 1000 //1000ms
-#define ZM_RATE_CTRL_MIN_PROBING_PACKET 8
-
-#define ZM_MIN_RATE_FAIL_COUNT 20
-
-#define ZM_RATE_PROBING_THRESHOLD 15 //6%
-#define ZM_RATE_SUCCESS_PROBING 10
-
-#define ZM_RATE_CTRL_RSSI_VARIATION 5 //TBD
-
-extern const u32_t zcRateToPhyCtrl[];
-
-extern void zfRateCtrlInitCell(zdev_t* dev, struct zsRcCell* rcCell, u8_t type, u8_t gBand, u8_t SG40);
-extern u16_t zfRateCtrlGetTxRate(zdev_t* dev, struct zsRcCell* rcCell, u16_t* probing);
-extern void zfRateCtrlTxFailEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t aggRate, u32_t retryRate);
-extern void zfRateCtrlTxSuccessEvent(zdev_t* dev, struct zsRcCell* rcCell, u8_t successRate);
-extern void zfRateCtrlAggrSta(zdev_t* dev);
-#endif
diff --git a/drivers/staging/otus/80211core/struct.h b/drivers/staging/otus/80211core/struct.h
deleted file mode 100644
index 17b5ce3..0000000
--- a/drivers/staging/otus/80211core/struct.h
+++ /dev/null
@@ -1,1315 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef _STRUCT_H
-#define _STRUCT_H
-
-#include "../oal_marc.h"
-
-#define ZM_SW_LOOP_BACK 0 /* 1=>enable, 0=>disable */
-#define ZM_PCI_LOOP_BACK 0 /* 1=>enable, 0=>disable */
-#define ZM_PROTOCOL_RESPONSE_SIMULATION 0
-
-#define ZM_RX_FRAME_SIZE 1600
-
-extern const u8_t zg11bRateTbl[4];
-extern const u8_t zg11gRateTbl[8];
-
-#define ZM_DRIVER_CORE_MAJOR_VERSION 1
-#define ZM_DRIVER_CORE_MINOR_VERSION 1
-#define ZM_DRIVER_CORE_BRANCH_MAJOR_VERSION 3
-#define ZM_DRIVER_CORE_BRANCH_MINOR_VERSION 39
-
-#ifndef ZM_VTXQ_SIZE
-#define ZM_VTXQ_SIZE 1024 //2^N
-#endif
-
-#define ZM_VTXQ_SIZE_MASK (ZM_VTXQ_SIZE-1)
-#define ZM_VMMQ_SIZE 8 //2^N
-#define ZM_VMMQ_SIZE_MASK (ZM_VMMQ_SIZE-1)
-
-#include "cagg.h"
-
-#define ZM_AGG_POOL_SIZE 20
-#define ZM_RATE_TABLE_SIZE 32
-
-#define ZM_MAX_BUF_DISCRETE_NUMBER 5
-
-
-
-
-
-
-
-
-
-/**********************************************************************************/
-/* IBSS macros */
-/**********************************************************************************/
-#define ZM_IBSS_PEER_ALIVE_COUNTER 4
-
-/**********************************************************************************/
-/* BIT mapping related macros */
-/**********************************************************************************/
-
-#define ZM_BIT_0 0x1
-#define ZM_BIT_1 0x2
-#define ZM_BIT_2 0x4
-#define ZM_BIT_3 0x8
-#define ZM_BIT_4 0x10
-#define ZM_BIT_5 0x20
-#define ZM_BIT_6 0x40
-#define ZM_BIT_7 0x80
-#define ZM_BIT_8 0x100
-#define ZM_BIT_9 0x200
-#define ZM_BIT_10 0x400
-#define ZM_BIT_11 0x800
-#define ZM_BIT_12 0x1000
-#define ZM_BIT_13 0x2000
-#define ZM_BIT_14 0x4000
-#define ZM_BIT_15 0x8000
-#define ZM_BIT_16 0x10000
-#define ZM_BIT_17 0x20000
-#define ZM_BIT_18 0x40000
-#define ZM_BIT_19 0x80000
-#define ZM_BIT_20 0x100000
-#define ZM_BIT_21 0x200000
-#define ZM_BIT_22 0x400000
-#define ZM_BIT_23 0x800000
-#define ZM_BIT_24 0x1000000
-#define ZM_BIT_25 0x2000000
-#define ZM_BIT_26 0x4000000
-#define ZM_BIT_27 0x8000000
-#define ZM_BIT_28 0x10000000
-#define ZM_BIT_29 0x20000000 //WPA support
-#define ZM_BIT_30 0x40000000
-#define ZM_BIT_31 0x80000000
-
-
-/**********************************************************************************/
-/* MAC address related macros */
-/**********************************************************************************/
-#define ZM_MAC_BYTE_TO_WORD(macb, macw) macw[0] = macb[0] + (macb[1] << 8); \
- macw[1] = macb[2] + (macb[3] << 8); \
- macw[2] = macb[4] + (macb[5] << 8);
-
-#define ZM_MAC_WORD_TO_BYTE(macw, macb) macb[0] = (u8_t) (macw[0] & 0xff); \
- macb[1] = (u8_t) (macw[0] >> 8); \
- macb[2] = (u8_t) (macw[1] & 0xff); \
- macb[3] = (u8_t) (macw[1] >> 8); \
- macb[4] = (u8_t) (macw[2] & 0xff); \
- macb[5] = (u8_t) (macw[2] >> 8);
-
-#define ZM_MAC_0(macw) ((u8_t)(macw[0] & 0xff))
-#define ZM_MAC_1(macw) ((u8_t)(macw[0] >> 8))
-#define ZM_MAC_2(macw) ((u8_t)(macw[1] & 0xff))
-#define ZM_MAC_3(macw) ((u8_t)(macw[1] >> 8))
-#define ZM_MAC_4(macw) ((u8_t)(macw[2] & 0xff))
-#define ZM_MAC_5(macw) ((u8_t)(macw[2] >> 8))
-
-#define ZM_IS_MULTICAST_OR_BROADCAST(mac) (mac[0] & 0x01)
-#define ZM_IS_MULTICAST(mac) ((mac[0] & 0x01) && (((u8_t)mac[0]) != 0xFF))
-
-#define ZM_MAC_EQUAL(mac1, mac2) ((mac1[0]==mac2[0])&&(mac1[1]==mac2[1])&&(mac1[2]==mac2[2]))
-#define ZM_MAC_NOT_EQUAL(mac1, mac2) ((mac1[0]!=mac2[0])||(mac1[1]!=mac2[1])||(mac1[2]!=mac2[2]))
-/**********************************************************************************/
-/* MAC address related mac'ros (end) */
-/**********************************************************************************/
-#define ZM_BYTE_TO_WORD(A, B) ((A<<8)+B)
-#define ZM_ROL32( A, n ) \
- ( ((A) << (n)) | ( ((A)>>(32-(n))) & ( (1UL << (n)) - 1 ) ) )
-#define ZM_ROR32( A, n ) ZM_ROL32( (A), 32-(n) )
-#define ZM_LO8(v16) ((u8_t)((v16) & 0xFF))
-#define ZM_HI8(v16) ((u8_t)(((v16)>>8)&0xFF))
-
-#ifdef ZM_ENABLE_BUFFER_TRACE
-extern void zfwBufTrace(zdev_t* dev, zbuf_t *buf, u8_t *functionName);
-#define ZM_BUFFER_TRACE(dev, buf) zfwBufTrace(dev, buf, __func__);
-#else
-#define ZM_BUFFER_TRACE(dev, buf)
-#endif
-
-/* notification events to heart beat function */
-#define ZM_BSSID_LIST_SCAN 0x01
-
-/* CAM mode */
-#define ZM_CAM_AP 0x1
-#define ZM_CAM_STA 0x2
-#define ZM_CAM_HOST 0x4
-
-/* finite state machine for adapter */
-#define ZM_STA_STATE_DISCONNECT 1
-#define ZM_STA_STATE_CONNECTING 2
-#define ZM_STA_STATE_CONNECTED 3
-
-/* Event definitions for finite state machine */
-#define ZM_EVENT_TIMEOUT_SCAN 0x0000
-#define ZM_EVENT_TIMEOUT_BG_SCAN 0x0001
-#define ZN_EVENT_TIMEOUT_RECONNECT 0x0002
-#define ZM_EVENT_TIMEOUT_INIT_SCAN 0x0003
-#define ZM_EVENT_TIMEOUT_AUTH 0x0004
-#define ZM_EVENT_TIMEOUT_ASSO 0x0005
-#define ZM_EVENT_TIMEOUT_AUTO_SCAN 0x0006
-#define ZM_EVENT_TIMEOUT_MIC_FAIL 0x0007
-#define ZM_EVENT_TIMEOUT_CHECK_AP 0x0008
-#define ZM_EVENT_CONNECT 0x0009
-#define ZM_EVENT_INIT_SCAN 0x000a
-#define ZM_EVENT_SCAN 0x000b
-#define ZM_EVENT_BG_SCAN 0x000c
-#define ZM_EVENT_DISCONNECT 0x000d
-#define ZM_EVENT_WPA_MIC_FAIL 0x000e
-#define ZM_EVENT_AP_ALIVE 0x000f
-#define ZM_EVENT_CHANGE_TO_AP 0x0010
-#define ZM_EVENT_CHANGE_TO_STA 0x0011
-#define ZM_EVENT_IDLE 0x0012
-#define ZM_EVENT_AUTH 0x0013
-#define ZM_EVENT_ASSO_RSP 0x0014
-#define ZM_EVENT_WPA_PK_OK 0x0015
-#define ZM_EVENT_WPA_GK_OK 0x0016
-#define ZM_EVENT_RCV_BEACON 0x0017
-#define ZM_EVENT_RCV_PROBE_RSP 0x0018
-#define ZM_EVENT_SEND_DATA 0x0019
-#define ZM_EVENT_AUTO_SCAN 0x001a
-#define ZM_EVENT_MIC_FAIL1 0x001d
-#define ZM_EVENT_MIC_FAIL2 0x001e
-#define ZM_EVENT_IBSS_MONITOR 0x001f
-#define ZM_EVENT_IN_SCAN 0x0020
-#define ZM_EVENT_CM_TIMER 0x0021
-#define ZM_EVENT_CM_DISCONNECT 0x0022
-#define ZM_EVENT_CM_BLOCK_TIMER 0x0023
-#define ZM_EVENT_TIMEOUT_ADDBA 0x0024
-#define ZM_EVENT_TIMEOUT_PERFORMANCE 0x0025
-#define ZM_EVENT_SKIP_COUNTERMEASURE 0x0026
-#define ZM_EVENT_NONE 0xffff
-
-/* Actions after call finite state machine */
-#define ZM_ACTION_NONE 0x0000
-#define ZM_ACTION_QUEUE_DATA 0x0001
-#define ZM_ACTION_DROP_DATA 0x0002
-
-/* Timers for finite state machine */
-#define ZM_TICK_ZERO 0
-#define ZM_TICK_INIT_SCAN_END 8
-#define ZM_TICK_NEXT_BG_SCAN 50
-#define ZM_TICK_BG_SCAN_END 8
-#define ZM_TICK_AUTH_TIMEOUT 4
-#define ZM_TICK_ASSO_TIMEOUT 4
-#define ZM_TICK_AUTO_SCAN 300
-#define ZM_TICK_MIC_FAIL_TIMEOUT 6000
-#define ZM_TICK_CHECK_AP1 150
-#define ZM_TICK_CHECK_AP2 350
-#define ZM_TICK_CHECK_AP3 250
-#define ZM_TICK_IBSS_MONITOR 160
-#define ZM_TICK_IN_SCAN 4
-#define ZM_TICK_CM_TIMEOUT 6000
-#define ZM_TICK_CM_DISCONNECT 200
-#define ZM_TICK_CM_BLOCK_TIMEOUT 6000
-
-/* Fix bug#33338 Counter Measure Issur */
-#ifdef NDIS_CM_FOR_XP
-#define ZM_TICK_CM_TIMEOUT_OFFSET 2160
-#define ZM_TICK_CM_DISCONNECT_OFFSET 72
-#define ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET 2160
-#else
-#define ZM_TICK_CM_TIMEOUT_OFFSET 0
-#define ZM_TICK_CM_DISCONNECT_OFFSET 0
-#define ZM_TICK_CM_BLOCK_TIMEOUT_OFFSET 0
-#endif
-
-#define ZM_TIME_ACTIVE_SCAN 30 //ms
-#define ZM_TIME_PASSIVE_SCAN 110 //ms
-
-/* finite state machine for BSS connect */
-#define ZM_STA_CONN_STATE_NONE 0
-#define ZM_STA_CONN_STATE_AUTH_OPEN 1
-#define ZM_STA_CONN_STATE_AUTH_SHARE_1 2
-#define ZM_STA_CONN_STATE_AUTH_SHARE_2 3
-#define ZM_STA_CONN_STATE_ASSOCIATE 4
-#define ZM_STA_CONN_STATE_SSID_NOT_FOUND 5
-#define ZM_STA_CONN_STATE_AUTH_COMPLETED 6
-
-/* finite state machine for WPA handshaking */
-#define ZM_STA_WPA_STATE_INIT 0
-#define ZM_STA_WPA_STATE_PK_OK 1
-#define ZM_STA_WPA_STATE_GK_OK 2
-
-/* various timers */
-#define ZM_INTERVAL_CONNECT_TIMEOUT 20 /* 200 milisecond */
-
-/* IBSS definitions */
-#define ZM_IBSS_PARTNER_LOST 0
-#define ZM_IBSS_PARTNER_ALIVE 1
-#define ZM_IBSS_PARTNER_CHECK 2
-
-#define ZM_BCMC_ARRAY_SIZE 16 /* Must be 2^N */
-#define ZM_UNI_ARRAY_SIZE 16 /* Must be 2^N */
-
-#define ZM_MAX_DEFRAG_ENTRIES 4 /* 2^N */
-#define ZM_DEFRAG_AGING_TIME_SEC 5 /* 5 seconds */
-
-#define ZM_MAX_WPAIE_SIZE 128
-/* WEP related definitions */
-#define ZM_USER_KEY_DEFAULT 64
-#define ZM_USER_KEY_PK 0 /* Pairwise Key */
-#define ZM_USER_KEY_GK 1 /* Group Key */
-/* AP WLAN Type */
-#define ZM_WLAN_TYPE_PURE_B 2
-#define ZM_WLAN_TYPE_PURE_G 1
-#define ZM_WLAN_TYPE_MIXED 0
-
-/* HAL State */
-#define ZM_HAL_STATE_INIT 0
-#define ZM_HAL_STATE_RUNNING 1
-
-/* AP Capability */
-#define ZM_All11N_AP 0x01
-#define ZM_XR_AP 0x02
-#define ZM_SuperG_AP 0x04
-
-/* MPDU Density */
-#define ZM_MPDU_DENSITY_NONE 0
-#define ZM_MPDU_DENSITY_1_8US 1
-#define ZM_MPDU_DENSITY_1_4US 2
-#define ZM_MPDU_DENSITY_1_2US 3
-#define ZM_MPDU_DENSITY_1US 4
-#define ZM_MPDU_DENSITY_2US 5
-#define ZM_MPDU_DENSITY_4US 6
-#define ZM_MPDU_DENSITY_8US 7
-
-/* Software Encryption */
-#define ZM_SW_TKIP_ENCRY_EN 0x01
-#define ZM_SW_TKIP_DECRY_EN 0x02
-#define ZM_SW_WEP_ENCRY_EN 0x04
-#define ZM_SW_WEP_DECRY_EN 0x08
-
-/* Default Support Rate */
-#define ZM_DEFAULT_SUPPORT_RATE_ZERO 0x0
-#define ZM_DEFAULT_SUPPORT_RATE_DISCONNECT 0x1
-#define ZM_DEFAULT_SUPPORT_RATE_IBSS_B 0x2
-#define ZM_DEFAULT_SUPPORT_RATE_IBSS_AG 0x3
-
-/* security related definitions */
-struct zsTkipSeed
-{
- u8_t tk[32]; /* key */
- u8_t ta[6];
- u16_t ttak[5];
- u16_t ppk[6];
- u16_t iv16,iv16tmp;
- u32_t iv32,iv32tmp;
-};
-
-struct zsMicVar
-{
- u32_t k0, k1; // Key
- u32_t left, right; // Current state
- u32_t m; // Message accumulator (single word)
- u16_t nBytes; // # bytes in M
-};
-
-struct zsDefragEntry
-{
- u8_t fragCount;
- u8_t addr[6];
- u16_t seqNum;
- zbuf_t* fragment[8];
- u32_t tick;
-};
-
-struct zsDefragList
-{
- struct zsDefragEntry defragEntry[ZM_MAX_DEFRAG_ENTRIES];
- u8_t replaceNum;
-};
-
-#define ZM_MAX_OPPOSITE_COUNT 16
-#define ZM_MAX_TX_SAMPLES 15
-#define ZM_TX_RATE_DOWN_CRITERIA 80
-#define ZM_TX_RATE_UP_CRITERIA 200
-
-
-#define ZM_MAX_PROBE_HIDDEN_SSID_SIZE 2
-struct zsSsidList
-{
- u8_t ssid[32];
- u8_t ssidLen;
-};
-
-struct zsWrapperSetting
-{
- u8_t bDesiredBssid;
- u8_t desiredBssid[6];
- u16_t bssid[3];
- u8_t ssid[32];
- u8_t ssidLen;
- u8_t authMode;
- u8_t wepStatus;
- u8_t encryMode;
- u8_t wlanMode;
- u16_t frequency;
- u16_t beaconInterval;
- u8_t dtim;
- u8_t preambleType;
- u16_t atimWindow;
-
- struct zsSsidList probingSsidList[ZM_MAX_PROBE_HIDDEN_SSID_SIZE];
-
- u8_t dropUnencryptedPkts;
- u8_t ibssJoinOnly;
- u32_t adhocMode;
- u8_t countryIsoName[4];
- u16_t autoSetFrequency;
-
- /* AP */
- u8_t bRateBasic;
- u8_t gRateBasic;
- u32_t nRateBasic;
- u8_t bgMode;
-
- /* Common */
- u8_t staWmeEnabled;
- u8_t staWmeQosInfo;
- u8_t apWmeEnabled;
-
-
- /* rate information: added in the future */
-};
-
-struct zsWrapperFeatureCtrl
-{
- u8_t bIbssGMode;
-};
-
-#define ZM_MAX_PS_STA 16
-#define ZM_PS_QUEUE_SIZE 32
-
-struct zsStaPSEntity
-{
- u8_t bUsed;
- u8_t macAddr[6];
- u8_t bDataQueued;
-};
-
-struct zsStaPSList
-{
- u8_t count;
- struct zsStaPSEntity entity[ZM_MAX_PS_STA];
-};
-
-#define ZM_MAX_TIMER_COUNT 32
-
-/* double linked list */
-struct zsTimerEntry
-{
- u16_t event;
- u32_t timer;
- struct zsTimerEntry *pre;
- struct zsTimerEntry *next;
-};
-
-struct zsTimerList
-{
- u8_t freeCount;
- struct zsTimerEntry list[ZM_MAX_TIMER_COUNT];
- struct zsTimerEntry *head;
- struct zsTimerEntry *tail;
-};
-
-/* Multicast list */
-#define ZM_MAX_MULTICAST_LIST_SIZE 64
-
-struct zsMulticastAddr
-{
- u8_t addr[6];
-};
-
-struct zsMulticastList
-{
- u8_t size;
- struct zsMulticastAddr macAddr[ZM_MAX_MULTICAST_LIST_SIZE];
-};
-
-enum ieee80211_cwm_mode {
- CWM_MODE20,
- CWM_MODE2040,
- CWM_MODE40,
- CWM_MODEMAX
-
-};
-
-enum ieee80211_cwm_extprotspacing {
- CWM_EXTPROTSPACING20,
- CWM_EXTPROTSPACING25,
- CWM_EXTPROTSPACINGMAX
-};
-
-enum ieee80211_cwm_width {
- CWM_WIDTH20,
- CWM_WIDTH40
-};
-
-enum ieee80211_cwm_extprotmode {
- CWM_EXTPROTNONE, /* no protection */
- CWM_EXTPROTCTSONLY, /* CTS to self */
- CWM_EXTPROTRTSCTS, /* RTS-CTS */
- CWM_EXTPROTMAX
-};
-
-struct ieee80211_cwm {
-
- /* Configuration */
- enum ieee80211_cwm_mode cw_mode; /* CWM mode */
- u8_t cw_extoffset; /* CWM Extension Channel Offset */
- enum ieee80211_cwm_extprotmode cw_extprotmode; /* CWM Extension Channel Protection Mode */
- enum ieee80211_cwm_extprotspacing cw_extprotspacing;/* CWM Extension Channel Protection Spacing */
- u32_t cw_enable; /* CWM State Machine Enabled */
- u32_t cw_extbusythreshold;/* CWM Extension Channel Busy Threshold */
-
- /* State */
- enum ieee80211_cwm_width cw_width; /* CWM channel width */
-};
-
-
-/* AP : STA database structure */
-struct zsStaTable
-{
- u32_t time; /* tick time */
- //u32_t phyCtrl; /* Tx PHY CTRL */
- u16_t addr[3]; /* STA MAC address */
- u16_t state; /* aut/asoc */
- //u16_t retry; /* Retry count */
- struct zsRcCell rcCell;
-
- u8_t valid; /* Valid flag : 1=>valid */
- u8_t psMode; /* STA power saving mode */
- u8_t staType; /* 0=>11b, 1=>11g, 2=>11n */
- u8_t qosType; /* 0=>Legacy, 1=>WME */
- u8_t qosInfo; /* WME QoS info */
- u8_t vap; /* Virtual AP ID */
- u8_t encryMode; /* Encryption type for this STA */
- u8_t keyIdx;
- struct zsMicVar txMicKey;
- struct zsMicVar rxMicKey;
- u16_t iv16;
- u32_t iv32;
-#ifdef ZM_ENABLE_CENC
- /* CENC */
- u8_t cencKeyIdx;
- u32_t txiv[4];
- u32_t rxiv[4];
-#endif //ZM_ENABLE_CENC
-};
-
-struct zdStructWds
-{
- u8_t wdsBitmap; /* Set bit-N to 1 to enable WDS */
- u8_t encryMode[ZM_MAX_WDS_SUPPORT]; /* WDS encryption mode */
- u16_t macAddr[ZM_MAX_WDS_SUPPORT][3]; /* WDS neighbor MAC address */
-};
-
- // htcapinfo 16bits
-#define HTCAP_AdvCodingCap 0x0001
-#define HTCAP_SupChannelWidthSet 0x0002
-#define HTCAP_DynamicSMPS 0x0004
-#define HTCAP_SMEnabled 0x000C
-#define HTCAP_GreenField 0x0010
-#define HTCAP_ShortGIfor20MHz 0x0020
-#define HTCAP_ShortGIfor40MHz 0x0040
-#define HTCAP_TxSTBC 0x0080
-#define HTCAP_RxOneStream 0x0100
-#define HTCAP_RxTwoStream 0x0200
-#define HTCAP_RxThreeStream 0x0300
-#define HTCAP_DelayedBlockACK 0x0400
-#define HTCAP_MaxAMSDULength 0x0800
-#define HTCAP_DSSSandCCKin40MHz 0x1000
-#define HTCAP_PSMPSup 0x2000
-#define HTCAP_STBCControlFrameSup 0x4000
-#define HTCAP_LSIGTXOPProtectionSUP 0x8000
- // Ampdu HT Parameter Info 8bits
-#define HTCAP_MaxRxAMPDU0 0x00
-#define HTCAP_MaxRxAMPDU1 0x01
-#define HTCAP_MaxRxAMPDU2 0x02
-#define HTCAP_MaxRxAMPDU3 0x03
- // PCO 8bits
-#define HTCAP_PCO 0x01
-#define HTCAP_TransmissionTime1 0x02
-#define HTCAP_TransmissionTime2 0x04
-#define HTCAP_TransmissionTime3 0x06
- // MCS FeedBack 8bits
-#define HTCAP_PlusHTCSupport 0x04
-#define HTCAP_RDResponder 0x08
- // TX Beamforming 0 8bits
-#define HTCAP_TxBFCapable 0x01
-#define HTCAP_RxStaggeredSoundCap 0x02
-#define HTCAP_TxStaggeredSoundCap 0x04
-#define HTCAP_RxZLFCapable 0x08
-#define HTCAP_TxZLFCapable 0x10
-#define HTCAP_ImplicitTxBFCapable 0x20
- // Tx Beamforming 1 8bits
-#define HTCAP_ExplicitCSITxBFCap 0x01
-#define HTCAP_ExpUncompSteerMatrCap 0x02
- // Antenna Selection Capabilities 8bits
-#define HTCAP_AntennaSelectionCap 0x01
-#define HTCAP_ExplicitCSITxASCap 0x02
-#define HTCAP_AntennaIndFeeTxASCap 0x04
-#define HTCAP_ExplicitCSIFeedbackCap 0x08
-#define HTCAP_AntennaIndFeedbackCap 0x10
-#define HTCAP_RxASCap 0x20
-#define HTCAP_TxSoundPPDUsCap 0x40
-
-
-
-struct zsHTCapability
-{
- u8_t ElementID;
- u8_t Length;
- // HT Capability Info
- u16_t HtCapInfo;
- u8_t AMPDUParam;
- u8_t MCSSet[16]; //16 bytes
- // Extended HT Capability Info
- u8_t PCO;
- u8_t MCSFeedBack;
-
- u8_t TxBFCap[4];
- u8_t AselCap;
-};
-
-union zuHTCapability
-{
- struct zsHTCapability Data;
- u8_t Byte[28];
-};
-
- //channelinfo 8bits
-#define ExtHtCap_ExtChannelOffsetAbove 0x01
-#define ExtHtCap_ExtChannelOffsetBelow 0x03
-#define ExtHtCap_RecomTxWidthSet 0x04
-#define ExtHtCap_RIFSMode 0x08
-#define ExtHtCap_ControlAccessOnly 0x10
- //operatinginfo 16bits
-#define ExtHtCap_NonGFDevicePresent 0x0004
- //beaconinfo 16bits
-#define ExtHtCap_DualBeacon 0x0040
-#define ExtHtCap_DualSTBCProtection 0x0080
-#define ExtHtCap_SecondaryBeacon 0x0100
-#define ExtHtCap_LSIGTXOPProtectFullSup 0x0200
-#define ExtHtCap_PCOActive 0x0400
-#define ExtHtCap_PCOPhase 0x0800
-
-
-struct zsExtHTCapability
-{
- u8_t ElementID;
- u8_t Length;
- u8_t ControlChannel;
- u8_t ChannelInfo;
- u16_t OperatingInfo;
- u16_t BeaconInfo;
- // Supported MCS Set
- u8_t MCSSet[16];
-};
-
-union zuExtHTCapability
-{
- struct zsExtHTCapability Data;
- u8_t Byte[24];
-};
-
-struct InformationElementSta {
- struct zsHTCapability HtCap;
- struct zsExtHTCapability HtInfo;
-};
-
-struct InformationElementAp {
- struct zsHTCapability HtCap;
-};
-
-#define ZM_MAX_FREQ_REQ_QUEUE 32
-typedef void (*zfpFreqChangeCompleteCb)(zdev_t* dev);
-
-struct zsWlanDevFreqControl
-{
- u16_t freqReqQueue[ZM_MAX_FREQ_REQ_QUEUE];
- u8_t freqReqBw40[ZM_MAX_FREQ_REQ_QUEUE];
- u8_t freqReqExtOffset[ZM_MAX_FREQ_REQ_QUEUE];
- zfpFreqChangeCompleteCb freqChangeCompCb[ZM_MAX_FREQ_REQ_QUEUE];
- u8_t freqReqQueueHead;
- u8_t freqReqQueueTail;
-};
-
-struct zsWlanDevAp
-{
- u16_t protectedObss; /* protected overlap BSS */
- u16_t staAgingTimeSec; /* in second, STA will be deathed if it does not */
- /* active for this long time */
- u16_t staProbingTimeSec;/* in second, STA will be probed if it does not */
- /* active for this long time */
- u8_t authSharing; /* authentication on going*/
- u8_t bStaAssociated; /* 11b STA associated */
- u8_t gStaAssociated; /* 11g STA associated */
- u8_t nStaAssociated; /* 11n STA associated */
- u16_t protectionMode; /* AP protection mode flag */
- u16_t staPowerSaving; /* Set associated power saving STA count */
-
-
-
- zbuf_t* uniArray[ZM_UNI_ARRAY_SIZE]; /* array to store unicast frames */
- u16_t uniHead;
- u16_t uniTail;
-
- /* HT Capability Info */
- union zuHTCapability HTCap; //CWYang(+)
-
- /* Extended HT Capability Info */
- union zuExtHTCapability ExtHTCap; //CWYang(+)
-
- /* STA table */
- struct zsStaTable staTable[ZM_MAX_STA_SUPPORT];
-
- /* WDS */
- struct zdStructWds wds;
- /* WPA */
- u8_t wpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_WPAIE_SIZE];
- u8_t wpaLen[ZM_MAX_AP_SUPPORT];
- u8_t stawpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_WPAIE_SIZE];
- u8_t stawpaLen[ZM_MAX_AP_SUPPORT];
- u8_t wpaSupport[ZM_MAX_AP_SUPPORT];
-
- //struct zsTkipSeed bcSeed;
- u8_t bcKeyIndex[ZM_MAX_AP_SUPPORT];
- u8_t bcHalKeyIdx[ZM_MAX_AP_SUPPORT];
- struct zsMicVar bcMicKey[ZM_MAX_AP_SUPPORT];
- u16_t iv16[ZM_MAX_AP_SUPPORT];
- u32_t iv32[ZM_MAX_AP_SUPPORT];
-
-#ifdef ZM_ENABLE_CENC
- /* CENC */
- u32_t txiv[ZM_MAX_AP_SUPPORT][4];
-#endif //ZM_ENABLE_CENC
-
- /* Virtual AP */
- u8_t beaconCounter;
- u8_t vapNumber;
- u8_t apBitmap; /* Set bit-N to 1 to enable VAP */
- u8_t hideSsid[ZM_MAX_AP_SUPPORT];
- u8_t authAlgo[ZM_MAX_AP_SUPPORT];
- u8_t ssid[ZM_MAX_AP_SUPPORT][32]; /* SSID */
- u8_t ssidLen[ZM_MAX_AP_SUPPORT]; /* SSID length */
- u8_t encryMode[ZM_MAX_AP_SUPPORT];
- u8_t wepStatus[ZM_MAX_AP_SUPPORT];
- u16_t capab[ZM_MAX_AP_SUPPORT]; /* Capability */
- u8_t timBcmcBit[ZM_MAX_AP_SUPPORT]; /* BMCM bit of TIM */
- u8_t wlanType[ZM_MAX_AP_SUPPORT];
-
- /* Array to store BC or MC frames */
- zbuf_t* bcmcArray[ZM_MAX_AP_SUPPORT][ZM_BCMC_ARRAY_SIZE];
- u16_t bcmcHead[ZM_MAX_AP_SUPPORT];
- u16_t bcmcTail[ZM_MAX_AP_SUPPORT];
-
- u8_t qosMode; /* 1=>WME */
- u8_t uapsdEnabled;
- struct zsQueue* uapsdQ;
-
- u8_t challengeText[128];
-
- struct InformationElementAp ie[ZM_MAX_STA_SUPPORT];
-
-
-};
-
-#define ZM_MAX_BLOCKING_AP_LIST_SIZE 4 /* 2^N */
-struct zsBlockingAp
-{
- u8_t addr[6];
- u8_t weight;
-};
-
-#define ZM_SCAN_MGR_SCAN_NONE 0
-#define ZM_SCAN_MGR_SCAN_INTERNAL 1
-#define ZM_SCAN_MGR_SCAN_EXTERNAL 2
-
-struct zsWlanDevStaScanMgr
-{
- u8_t scanReqs[2];
- u8_t currScanType;
- u8_t scanStartDelay;
-};
-
-#define ZM_PS_MSG_STATE_ACTIVE 0
-#define ZM_PS_MSG_STATE_SLEEP 1
-#define ZM_PS_MSG_STATE_T1 2
-#define ZM_PS_MSG_STATE_T2 3
-#define ZM_PS_MSG_STATE_S1 4
-
-#define ZM_PS_MAX_SLEEP_PERIODS 3 // The number of beacon periods
-
-struct zsWlanDevStaPSMgr
-{
- u8_t state;
- u8_t isSleepAllowed;
- u8_t maxSleepPeriods;
- u8_t ticks;
- u32_t lastTxUnicastFrm;
- u32_t lastTxMulticastFrm;
- u32_t lastTxBroadcastFrm;
- u8_t tempWakeUp; /*enable when wake up but still in ps mode */
- u16_t sleepAllowedtick;
-};
-
-struct zsWlanDevSta
-{
- u32_t beaconTxCnt; /* Transmitted beacon counter (in IBSS) */
- u8_t txBeaconInd; /* In IBSS mode, true means that we just transmit a beacon during
- last beacon period.
- */
- u16_t beaconCnt; /* receive beacon count, will be perodically reset */
- u16_t bssid[3]; /* BSSID of connected AP */
- u8_t ssid[32]; /* SSID */
- u8_t ssidLen; /* SSID length */
- u8_t mTxRate; /* Tx rate for multicast */
- u8_t uTxRate; /* Tx rate for unicast */
- u8_t mmTxRate; /* Tx rate for management frame */
- u8_t bChannelScan;
- u8_t bScheduleScan;
-
- u8_t InternalScanReq;
- u16_t activescanTickPerChannel;
- u16_t passiveScanTickPerChannel;
- u16_t scanFrequency;
- u32_t connPowerInHalfDbm;
-
- u16_t currentFrequency;
- u16_t currentBw40;
- u16_t currentExtOffset;
-
- u8_t bPassiveScan;
-
- struct zsBlockingAp blockingApList[ZM_MAX_BLOCKING_AP_LIST_SIZE];
-
- //struct zsBssInfo bssInfoPool[ZM_MAX_BSS];
- struct zsBssInfo* bssInfoArray[ZM_MAX_BSS];
- struct zsBssList bssList;
- u8_t bssInfoArrayHead;
- u8_t bssInfoArrayTail;
- u8_t bssInfoFreeCount;
-
- u8_t authMode;
- u8_t currentAuthMode;
- u8_t wepStatus;
- u8_t encryMode;
- u8_t keyId;
-#ifdef ZM_ENABLE_IBSS_WPA2PSK
- u8_t ibssWpa2Psk;
-#endif
-#ifdef ZM_ENABLE_CENC
- u8_t cencKeyId; //CENC
-#endif //ZM_ENABLE_CENC
- u8_t dropUnencryptedPkts;
- u8_t ibssJoinOnly;
- u8_t adapterState;
- u8_t oldAdapterState;
- u8_t connectState;
- u8_t connectRetry;
- u8_t wpaState;
- u8_t wpaIe[ZM_MAX_IE_SIZE + 2];
- u8_t rsnIe[ZM_MAX_IE_SIZE + 2];
- u8_t challengeText[255+2];
- u8_t capability[2];
- //u8_t connectingHiddenAP;
- //u8_t scanWithSSID;
- u16_t aid;
- u32_t mgtFrameCount;
- u8_t bProtectionMode;
- u32_t NonNAPcount;
- u8_t RTSInAGGMode;
- u32_t connectTimer;
- u16_t atimWindow;
- u8_t desiredBssid[6];
- u8_t bDesiredBssid;
- struct zsTkipSeed txSeed;
- struct zsTkipSeed rxSeed[4];
- struct zsMicVar txMicKey;
- struct zsMicVar rxMicKey[4];
- u16_t iv16;
- u32_t iv32;
- struct zsOppositeInfo oppositeInfo[ZM_MAX_OPPOSITE_COUNT];
- u8_t oppositeCount;
- u8_t bssNotFoundCount; /* sitesurvey for search desired ISBB threshold */
- u16_t rxBeaconCount;
- u8_t beaconMissState;
- u32_t rxBeaconTotal;
- u8_t bIsSharedKey;
- u8_t connectTimeoutCount;
-
- u8_t recvAtim;
-
- /* ScanMgr Control block */
- struct zsWlanDevStaScanMgr scanMgr;
- struct zsWlanDevStaPSMgr psMgr;
-
- // The callback would be called if receiving an unencrypted packets but
- // the station is in encrypted mode. The wrapper could decide whether
- // to drop the packet by its OS setting.
- zfpStaRxSecurityCheckCb pStaRxSecurityCheckCb;
-
- /* WME */
- u8_t apWmeCapability; //bit-0 => a WME AP
- //bit-7 => a UAPSD AP
- u8_t wmeParameterSetCount;
-
- u8_t wmeEnabled;
- #define ZM_STA_WME_ENABLE_BIT 0x1
- #define ZM_STA_UAPSD_ENABLE_BIT 0x2
- u8_t wmeQosInfo;
-
- u8_t wmeConnected;
- u8_t qosInfo;
- struct zsQueue* uapsdQ;
-
- /* countermeasures */
- u8_t cmMicFailureCount;
- u8_t cmDisallowSsidLength;
- u8_t cmDisallowSsid[32];
-
- /* power-saving mode */
- u8_t powerSaveMode;
- zbuf_t* staPSDataQueue[ZM_PS_QUEUE_SIZE];
- u8_t staPSDataCount;
-
- /* IBSS power-saving mode */
- /* record the STA which has entered the PS mode */
- struct zsStaPSList staPSList;
- /* queue the data of the PS STAs */
- zbuf_t* ibssPSDataQueue[ZM_PS_QUEUE_SIZE];
- u8_t ibssPSDataCount;
- u8_t ibssPrevPSDataCount;
- u8_t bIbssPSEnable;
- /* BIT_15: ON/OFF, BIT_0~14: Atim Timer */
- u16_t ibssAtimTimer;
-
- /* WPA2 */
- struct zsPmkidInfo pmkidInfo;
-
- /* Multicast list related objects */
- struct zsMulticastList multicastList;
-
- /* XP packet filter feature : */
- /* 1=>enable: All multicast address packets, not just the ones enumerated in the multicast address list. */
- /* 0=>disable */
- u8_t bAllMulticast;
-
- /* reassociation flag */
- u8_t connectByReasso;
- u8_t failCntOfReasso;
-
- /* for HT configure control setting */
- u8_t preambleTypeHT; /* HT: 0 Mixed mode 1 Green field */
- u8_t htCtrlBandwidth;
- u8_t htCtrlSTBC;
- u8_t htCtrlSG;
- u8_t defaultTA;
-
- u8_t connection_11b;
-
- u8_t EnableHT;
- u8_t SG40;
- u8_t HT2040;
- /* for WPA setting */
- u8_t wpaSupport;
- u8_t wpaLen;
-
- /* IBSS related objects */
- u8_t ibssDelayedInd;
- struct zsPartnerNotifyEvent ibssDelayedIndEvent;
- u8_t ibssPartnerStatus;
-
- u8_t bAutoReconnect;
-
- u8_t flagFreqChanging;
- u8_t flagKeyChanging;
- struct zsBssInfo ibssBssDesc;
- u8_t ibssBssIsCreator;
- u16_t ibssReceiveBeaconCount;
- u8_t ibssSiteSurveyStatus;
-
- u8_t disableProbingWithSsid;
-#ifdef ZM_ENABLE_CENC
- /* CENC */
- u8_t cencIe[ZM_MAX_IE_SIZE + 2];
-#endif //ZM_ENABLE_CENC
- u32_t txiv[4]; //Tx PN Sequence
- u32_t rxiv[4]; //Rx PN Sequence
- u32_t rxivGK[4];//Broadcast Rx PN Sequence
- u8_t wepKey[4][32]; // For Software WEP
- u8_t SWEncryMode[4];
-
- /* 802.11d */
- u8_t b802_11D;
-
- /* 802.11h */
- u8_t TPCEnable;
- u8_t DFSEnable;
- u8_t DFSDisableTx;
-
- /* Owl AP */
- u8_t athOwlAp;
-
- /* Enable BA response in driver */
- u8_t enableDrvBA;
-
- /* HT Capability Info */
- union zuHTCapability HTCap; //CWYang(+)
-
- /* Extended HT Capability Info */
- union zuExtHTCapability ExtHTCap; //CWYang(+)
-
- struct InformationElementSta ie;
-
-#define ZM_CACHED_FRAMEBODY_SIZE 200
- u8_t asocReqFrameBody[ZM_CACHED_FRAMEBODY_SIZE];
- u16_t asocReqFrameBodySize;
- u8_t asocRspFrameBody[ZM_CACHED_FRAMEBODY_SIZE];
- u16_t asocRspFrameBodySize;
- u8_t beaconFrameBody[ZM_CACHED_FRAMEBODY_SIZE];
- u16_t beaconFrameBodySize;
-
- u8_t ac0PriorityHigherThanAc2;
- u8_t SWEncryptEnable;
-
- u8_t leapEnabled;
-
- u32_t TotalNumberOfReceivePackets;
- u32_t TotalNumberOfReceiveBytes;
- u32_t avgSizeOfReceivePackets;
-
- u32_t ReceivedPacketRateCounter;
- u32_t ReceivedPktRatePerSecond;
-
- /* #2 Record the sequence number to determine whether the unicast frame is separated by RIFS or not */
-#define ZM_RIFS_STATE_DETECTING 0
-#define ZM_RIFS_STATE_DETECTED 1
-#define ZM_RIFS_TIMER_TIMEOUT 4480 // <Driver time>4480ms <Real time>7s
- u8_t rifsState;
- u8_t rifsLikeFrameCnt;
- u16_t rifsLikeFrameSequence[3];
- u32_t rifsTimer;
- u32_t rifsCount;
-
- /* RX filter desired by upper layers. Note this contains some bits which must be filtered
- by sw since the hw supports only a subset of possible filter actions.= */
- u32_t osRxFilter;
-
- u8_t bSafeMode;
-
- u32_t ibssAdditionalIESize;
- u8_t ibssAdditionalIE[256];
-}; //struct zsWlanDevSta
-
-#define ZM_CMD_QUEUE_SIZE 256 //Roger Check, test 64 when ready
-
-#define ZM_OID_READ 1
-#define ZM_OID_WRITE 2
-#define ZM_OID_INTERNAL_WRITE 3
-#define ZM_CMD_SET_FREQUENCY 4
-#define ZM_CMD_SET_KEY 5
-#define ZM_CWM_READ 6
-#define ZM_MAC_READ 7
-#define ZM_ANI_READ 8
-#define ZM_EEPROM_READ 9
-#define ZM_EEPROM_WRITE 0x0A
-#define ZM_OID_CHAN 0x30
-#define ZM_OID_SYNTH 0x32
-#define ZM_OID_TALLY 0x81
-#define ZM_OID_TALLY_APD 0x82
-
-#define ZM_OID_DKTX_STATUS 0x92
-#define ZM_OID_FLASH_CHKSUM 0xD0
-#define ZM_OID_FLASH_READ 0xD1
-#define ZM_OID_FLASH_PROGRAM 0xD2
-#define ZM_OID_FW_DL_INIT 0xD3
-
-/* Driver to Firmware OID */
-#define ZM_CMD_ECHO 0x80
-#define ZM_CMD_TALLY 0x81
-#define ZM_CMD_TALLY_APD 0x82
-#define ZM_CMD_CONFIG 0x83
-#define ZM_CMD_RREG 0x00
-#define ZM_CMD_WREG 0x01
-#define ZM_CMD_RMEM 0x02
-#define ZM_CMD_WMEM 0x03
-#define ZM_CMD_BITAND 0x04
-#define ZM_CMD_BITOR 0x05
-#define ZM_CMD_EKEY 0x28
-#define ZM_CMD_DKEY 0x29
-#define ZM_CMD_FREQUENCY 0x30
-#define ZM_CMD_RF_INIT 0x31
-#define ZM_CMD_SYNTH 0x32
-#define ZM_CMD_FREQ_STRAT 0x33
-#define ZM_CMD_RESET 0x90
-#define ZM_CMD_DKRESET 0x91
-#define ZM_CMD_DKTX_STATUS 0x92
-#define ZM_CMD_FDC 0xA0
-#define ZM_CMD_WREEPROM 0xB0
-#define ZM_CMD_WFLASH 0xB0
-#define ZM_CMD_FLASH_ERASE 0xB1
-#define ZM_CMD_FLASH_PROG 0xB2
-#define ZM_CMD_FLASH_CHKSUM 0xB3
-#define ZM_CMD_FLASH_READ 0xB4
-#define ZM_CMD_FW_DL_INIT 0xB5
-#define ZM_CMD_MEM_WREEPROM 0xBB
-
-
-/* duplicate filter table column */
-#define ZM_FILTER_TABLE_COL 2 /* 2^n */
-/* duplicate filter table Row */
-#define ZM_FILTER_TABLE_ROW 8 /* 2^n */
-
-/* duplicate filter table structure */
-struct zsRxFilter
-{
- u16_t addr[3];
- u16_t seq;
- u8_t up;
-};
-
-struct zsWlanDev
-{
- /* AP global variables */
- struct zsWlanDevAp ap;
- /* STA global variables */
- struct zsWlanDevSta sta;
- /* save wrapper setting */
- struct zsWrapperSetting ws;
- /* features determined by wrapper (vendor) */
- struct zsWrapperFeatureCtrl wfc;
- /* Traffic Monitor tally */
- struct zsTrafTally trafTally;
- /* Communication tally */
- struct zsCommTally commTally;
- /* Duplicate frame filter table */
- struct zsRxFilter rxFilterTbl[ZM_FILTER_TABLE_COL][ZM_FILTER_TABLE_ROW];
- /* Regulatory table */
- struct zsRegulationTable regulationTable;
-
- /* */
- struct zsWlanDevFreqControl freqCtrl;
-
- enum devState state;
-
- u8_t halState;
- u8_t wlanMode; /* AP/INFRASTRUCTURE/IBSS/PSEUDO */
- u16_t macAddr[3]; /* MAC address */
- u16_t beaconInterval; /* beacon Interval */
- u8_t dtim; /* DTIM period */
- u8_t CurrentDtimCount;
- u8_t preambleType;
- u8_t preambleTypeInUsed;
- u8_t maxTxPower2; /* 2.4 GHz Max Tx power (Unit: 0.5 dBm) */
- u8_t maxTxPower5; /* 5 GHz Max Tx power (Unit: 0.5 dBm) */
- u8_t connectMode;
- u32_t supportMode;
-
- u8_t bRate; /* 11b Support Rate bit map */
- u8_t bRateBasic; /* 11b Basic Rate bit map */
- u8_t gRate; /* 11g Support Rate bit map */
- u8_t gRateBasic; /* 11g Basic Rate bit map */
- /* channel index point to the item in regulation table */
- u8_t channelIndex;
-
- /* channel management */
- u8_t BandWidth40;
- u8_t ExtOffset; //1 above, 3 below, 0 not present
- u16_t frequency; /* operation frequency */
-
- u8_t erpElement; /* ERP information element data */
-
- u8_t disableSelfCts; /* set to 1 to disable Self-CTS */
- u8_t bgMode;
-
- /* private test flag */
- u32_t enableProtectionMode; /* force enable/disable self cts */
- u32_t checksumTest; /* OTUS checksum test 1=>zero checksum 0=>normal */
- u32_t rxPacketDump; /* rx packet dump */
-
- u8_t enableAggregation; /* force enable/disable A-MSPU */
- u8_t enableWDS; /* force enable/disable WDS testing */
- u8_t enableTxPathMode; /* OTUS special testing mode 1=>diable, 0=>enable: ZM_SYSTEM_TEST_MODE */
- u8_t enableHALDbgInfo; /* */
-
- u32_t forceTxTPC; /* force tx packet send TPC */
-
- u16_t seq[4];
- u16_t mmseq;
-
- /* driver core time tick */
- u32_t tick;
- u16_t tickIbssSendBeacon;
- u16_t tickIbssReceiveBeacon;
-
- /* RTS threshold */
- u16_t rtsThreshold;
-
- /* fragmentation threshold, 256 <= value <= 2346, 0=disabled */
- u16_t fragThreshold;
-
- /* Tx Rate */
- u16_t txMCS;
- u16_t txMT;
- u32_t CurrentTxRateKbps; //CWYang(+)
- /* Rx Rate */
- u32_t CurrentRxRateKbps; //Janet(+)
- u8_t CurrentRxRateUpdated;
- u8_t modulationType;
- u8_t rxInfo;
- u16_t rateField;
-
- /* timer related objects */
- struct zsTimerList timerList;
- u8_t bTimerReady;
-
- /* for defragmentation */
- struct zsDefragList defragTable;
-
- /* Data struct for Interface Dependent Layer */
- //struct zsIdlStruct idlStruct;
-
- /* Signal Strength/Quality Related Parameters */
- u8_t SignalStrength; //CWYang(+)
- u8_t SignalQuality; //CWYang(+)
-
-
-
- /* QoS */
- zbuf_t* vtxq[4][ZM_VTXQ_SIZE];
- u16_t vtxqHead[4];
- u16_t vtxqTail[4];
- u16_t qosDropIpFrag[4];
-
- /* Management Tx queue */
- zbuf_t* vmmq[ZM_VMMQ_SIZE];
- u16_t vmmqHead;
- u16_t vmmqTail;
-
- u8_t vtxqPushing;
-
- /*
- * add by honda
- * 1. Aggregate queues
- * 2. STA's associated information and queue number
- * 3. rx aggregation re-ordering queue
- */
- struct aggQueue *aggQPool[ZM_AGG_POOL_SIZE];
- u8_t aggInitiated;
- u8_t addbaComplete;
- u8_t addbaCount;
- u8_t aggState;
- u8_t destLock;
- struct aggSta aggSta[ZM_MAX_STA_SUPPORT];
- struct agg_tid_rx *tid_rx[ZM_AGG_POOL_SIZE];
- struct aggTally agg_tal;
- struct destQ destQ;
- struct baw_enabler *baw_enabler;
- struct ieee80211_cwm cwm;
- u16_t reorder;
- u16_t seq_debug;
- /* rate control */
- u32_t txMPDU[ZM_RATE_TABLE_SIZE];
- u32_t txFail[ZM_RATE_TABLE_SIZE];
- u32_t PER[ZM_RATE_TABLE_SIZE];
- u16_t probeCount;
- u16_t probeSuccessCount;
- u16_t probeInterval;
- u16_t success_probing;
- /*
- * end of add by honda
- */
-
- /* airopeek sniffer mode for upper sw */
- u32_t swSniffer; /* window: airoPeek */
- u32_t XLinkMode;
-
- /* MDK mode */
- /* init by 0=>normal driver 1=>MDK driver */
- u32_t modeMDKEnable;
-
- u32_t heartBeatNotification;
-
- /* pointer for HAL Plus private memory */
- void* hpPrivate;
-
- /* for WPA setting */
- //u8_t wpaSupport[ZM_MAX_AP_SUPPORT];
- //u8_t wpaLen[ZM_MAX_AP_SUPPORT];
- //u8_t wpaIe[ZM_MAX_AP_SUPPORT][ZM_MAX_IE_SIZE];
-
- struct zsLedStruct ledStruct;
-
- /* ani flag */
- u8_t aniEnable;
- u16_t txq_threshold;
-
- //Skip Mic Error Check
- u8_t TKIP_Group_KeyChanging;
-
- u8_t dynamicSIFSEnable;
-
- u8_t queueFlushed;
-
- u16_t (*zfcbAuthNotify)(zdev_t* dev, u16_t* macAddr);
- u16_t (*zfcbAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body, u16_t bodySize, u16_t port);
- u16_t (*zfcbDisAsocNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
- u16_t (*zfcbApConnectNotify)(zdev_t* dev, u8_t* macAddr, u16_t port);
- void (*zfcbConnectNotify)(zdev_t* dev, u16_t status, u16_t* bssid);
- void (*zfcbScanNotify)(zdev_t* dev, struct zsScanResult* result);
- void (*zfcbMicFailureNotify)(zdev_t* dev, u16_t* addr, u16_t status);
- void (*zfcbApMicFailureNotify)(zdev_t* dev, u8_t* addr, zbuf_t* buf);
- void (*zfcbIbssPartnerNotify)(zdev_t* dev, u16_t status, struct zsPartnerNotifyEvent *event);
- void (*zfcbMacAddressNotify)(zdev_t* dev, u8_t* addr);
- void (*zfcbSendCompleteIndication)(zdev_t* dev, zbuf_t* buf);
- void (*zfcbRecvEth)(zdev_t* dev, zbuf_t* buf, u16_t port);
- void (*zfcbRecv80211)(zdev_t* dev, zbuf_t* buf, struct zsAdditionInfo* addInfo);
- void (*zfcbRestoreBufData)(zdev_t* dev, zbuf_t* buf);
-#ifdef ZM_ENABLE_CENC
- u16_t (*zfcbCencAsocNotify)(zdev_t* dev, u16_t* macAddr, u8_t* body,
- u16_t bodySize, u16_t port);
-#endif //ZM_ENABLE_CENC
- u8_t (*zfcbClassifyTxPacket)(zdev_t* dev, zbuf_t* buf);
- void (*zfcbHwWatchDogNotify)(zdev_t* dev);
-};
-
-
-struct zsWlanKey
-{
- u8_t key;
-};
-
-
-/* These macros are defined here for backward compatibility */
-/* Please leave them alone */
-/* For Tx packet allocated in upper layer layer */
-#define zmw_tx_buf_readb(dev, buf, offset) zmw_buf_readb(dev, buf, offset)
-#define zmw_tx_buf_readh(dev, buf, offset) zmw_buf_readh(dev, buf, offset)
-#define zmw_tx_buf_writeb(dev, buf, offset, value) zmw_buf_writeb(dev, buf, offset, value)
-#define zmw_tx_buf_writeh(dev, buf, offset, value) zmw_buf_writeh(dev, buf, offset, value)
-
-/* For Rx packet allocated in driver */
-#define zmw_rx_buf_readb(dev, buf, offset) zmw_buf_readb(dev, buf, offset)
-#define zmw_rx_buf_readh(dev, buf, offset) zmw_buf_readh(dev, buf, offset)
-#define zmw_rx_buf_writeb(dev, buf, offset, value) zmw_buf_writeb(dev, buf, offset, value)
-#define zmw_rx_buf_writeh(dev, buf, offset, value) zmw_buf_writeh(dev, buf, offset, value)
-
-#endif /* #ifndef _STRUCT_H */
diff --git a/drivers/staging/otus/80211core/wlan.h b/drivers/staging/otus/80211core/wlan.h
deleted file mode 100644
index 26c18b8..0000000
--- a/drivers/staging/otus/80211core/wlan.h
+++ /dev/null
@@ -1,595 +0,0 @@
-/*
- * Copyright (c) 2007-2008 Atheros Communications Inc.
- *
- * Permission to use, copy, modify, and/or distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-/* */
-/* Module Name : wlan_defs.h */
-/* */
-/* Abstract */
-/* This module contains WLAN definitions. */
-/* */
-/* NOTES */
-/* None */
-/* */
-/************************************************************************/
-
-#ifndef _WLAN_H
-#define _WLAN_H
-
-
-#define ZM_EXTERNAL_ALLOC_BUF 0
-#define ZM_INTERNAL_ALLOC_BUF 1
-
-#define ZM_SIZE_OF_CTRL_SET 8
-#define ZM_SIZE_OF_IV 4
-#define ZM_SIZE_OF_EXT_IV 4
-#define ZM_SIZE_OF_MIC 8
-#define ZM_SIZE_OF_CCX_MIC 8
-#define ZM_SIZE_OF_WLAN_DATA_HEADER 24
-#define ZM_SIZE_OF_QOS_CTRL 2
-
-/* Header definition */
-#define ZM_SIZE_OF_WLAN_WDS_HEADER 32
-#define ZM_SIZE_OF_SNAP_HEADER 8
-
-#define ZM_WLAN_HEADER_A1_OFFSET 4
-#define ZM_WLAN_HEADER_A2_OFFSET 10
-#define ZM_WLAN_HEADER_A3_OFFSET 16
-#define ZM_WLAN_HEADER_A4_OFFSET 24
-#define ZM_WLAN_HEADER_IV_OFFSET 24
-#define ZM_SIZE_OF_WLAN_DATA_HEADER 24
-
-/* Port definition */
-#define ZM_PORT_DISABLED 0
-#define ZM_PORT_ENABLED 1
-
-/* Frame Type */
-#define ZM_WLAN_MANAGEMENT_FRAME 0x0
-#define ZM_WLAN_CONTROL_FRAME 0x4
-#define ZM_WLAN_DATA_FRAME 0x8
-
-/* Frame Subtype */
-#define ZM_WLAN_FRAME_TYPE_ASOCREQ 0x00
-#define ZM_WLAN_FRAME_TYPE_ASOCRSP 0x10
-#define ZM_WLAN_FRAME_TYPE_REASOCREQ 0x20
-#define ZM_WLAN_FRAME_TYPE_REASOCRSP 0x30
-#define ZM_WLAN_FRAME_TYPE_PROBEREQ 0x40
-#define ZM_WLAN_FRAME_TYPE_PROBERSP 0x50
-/* 0x60, 0x70 => Reserved */
-#define ZM_WLAN_FRAME_TYPE_BEACON 0x80
-#define ZM_WLAN_FRAME_TYPE_ATIM 0x90
-#define ZM_WLAN_FRAME_TYPE_DISASOC 0xA0
-#define ZM_WLAN_FRAME_TYPE_AUTH 0xB0
-#define ZM_WLAN_FRAME_TYPE_DEAUTH 0xC0
-#define ZM_WLAN_FRAME_TYPE_ACTION 0xD0
-
-/* Frame type and subtype */
-#define ZM_WLAN_FRAME_TYPE_NULL 0x48
-#define ZM_WLAN_FRAME_TYPE_BAR 0x84
-#define ZM_WLAN_FRAME_TYPE_BA 0x94
-#define ZM_WLAN_FRAME_TYPE_PSPOLL 0xA4
-#define ZM_WLAN_FRAME_TYPE_RTS 0xB4
-#define ZM_WLAN_FRAME_TYPE_CTS 0xC4
-#define ZM_WLAN_FRAME_TYPE_QOS_NULL 0xC8
-
-/* action frame */
-#define ZM_WLAN_SPECTRUM_MANAGEMENT_ACTION_FRAME 0
-#define ZM_WLAN_QOS_ACTION_FRAME 1
-#define ZM_WLAN_DLS_ACTION_FRAME 2
-#define ZM_WLAN_BLOCK_ACK_ACTION_FRAME 3
-/* block ack action frame*/
-#define ZM_WLAN_ADDBA_REQUEST_FRAME 0
-#define ZM_WLAN_ADDBA_RESPONSE_FRAME 1
-#define ZM_WLAN_DELBA_FRAME 2
-
-/* Element ID */
-#define ZM_WLAN_EID_SSID 0
-#define ZM_WLAN_EID_SUPPORT_RATE 1
-#define ZM_WLAN_EID_FH 2
-#define ZM_WLAN_EID_DS 3
-#define ZM_WLAN_EID_CFS 4
-#define ZM_WLAN_EID_TIM 5
-#define ZM_WLAN_EID_IBSS 6
-#define ZM_WLAN_EID_COUNTRY 7
-/* reserved 8-15 */
-#define ZM_WLAN_EID_CHALLENGE 16
-/* reserved 17-31 */
-#define ZM_WLAN_EID_POWER_CONSTRAINT 32
-#define ZM_WLAN_EID_POWER_CAPABILITY 33
-#define ZM_WLAN_EID_TPC_REQUEST 34
-#define ZM_WLAN_EID_TPC_REPORT 35
-#define ZM_WLAN_EID_SUPPORTED_CHANNELS 36
-#define ZM_WLAN_EID_CHANNEL_SWITCH_ANNOUNCE 37
-#define ZM_WLAN_EID_MEASUREMENT_REQUEST 38
-#define ZM_WLAN_EID_MEASUREMENT_REPORT 39
-#define ZM_WLAN_EID_QUIET 40
-#define ZM_WLAN_EID_IBSS_DFS 41
-#define ZM_WLAN_EID_ERP 42
-#define ZM_WLAN_PREN2_EID_HTCAPABILITY 45
-#define ZM_WLAN_EID_RSN_IE 48
-#define ZM_WLAN_EID_EXTENDED_RATE 50
-#define ZM_WLAN_EID_HT_CAPABILITY 51
-#define ZM_WLAN_EID_EXTENDED_HT_CAPABILITY 52
-#define ZM_WLAN_EID_NEW_EXT_CHANNEL_OFFSET 53
-#define ZM_WLAN_PREN2_EID_HTINFORMATION 61
-#define ZM_WLAN_PREN2_EID_SECONDCHOFFSET 62
-#ifdef ZM_ENABLE_CENC
-#define ZM_WLAN_EID_CENC_IE 68
-#endif //ZM_ENABLE_CENC
-#define ZM_WLAN_EID_VENDOR_PRIVATE 221 /* Vendor private space; must demux OUI */
-#define ZM_WLAN_EID_WPA_IE 221
-#define ZM_WLAN_EID_WPS_IE 221
-#define ZM_WLAN_EID_WIFI_IE 221
-
-/* ERP information element */
-#define ZM_WLAN_NON_ERP_PRESENT_BIT 0x1
-#define ZM_WLAN_USE_PROTECTION_BIT 0x2
-#define ZM_WLAN_BARKER_PREAMBLE_MODE_BIT 0x4
-
-/* Channel frequency, in MHz */
-#define ZM_CH_G_1 2412
-#define ZM_CH_G_2 2417
-#define ZM_CH_G_3 2422
-#define ZM_CH_G_4 2427
-#define ZM_CH_G_5 2432
-#define ZM_CH_G_6 2437
-#define ZM_CH_G_7 2442
-#define ZM_CH_G_8 2447
-#define ZM_CH_G_9 2452
-#define ZM_CH_G_10 2457
-#define ZM_CH_G_11 2462
-#define ZM_CH_G_12 2467
-#define ZM_CH_G_13 2472
-#define ZM_CH_G_14 2484
-#define ZM_CH_A_184 4920
-#define ZM_CH_A_188 4940
-#define ZM_CH_A_192 4960
-#define ZM_CH_A_196 4980
-#define ZM_CH_A_8 5040
-#define ZM_CH_A_12 5060
-#define ZM_CH_A_16 5080
-#define ZM_CH_A_36 5180
-#define ZM_CH_A_40 5200
-#define ZM_CH_A_44 5220
-#define ZM_CH_A_48 5240
-#define ZM_CH_A_52 5260
-#define ZM_CH_A_56 5280
-#define ZM_CH_A_60 5300
-#define ZM_CH_A_64 5320
-#define ZM_CH_A_100 5500
-#define ZM_CH_A_104 5520
-#define ZM_CH_A_108 5540
-#define ZM_CH_A_112 5560
-#define ZM_CH_A_116 5580
-#define ZM_CH_A_120 5600
-#define ZM_CH_A_124 5620
-#define ZM_CH_A_128 5640
-#define ZM_CH_A_132 5660
-#define ZM_CH_A_136 5680
-#define ZM_CH_A_140 5700
-#define ZM_CH_A_149 5745
-#define ZM_CH_A_153 5765
-#define ZM_CH_A_157 5785
-#define ZM_CH_A_161 5805
-#define ZM_CH_A_165 5825
-
-
-/* AP : STA table => STA Type */
-#define ZM_11B_STA 0x0
-#define ZM_11G_STA 0x2
-#define ZM_11N_STA 0x4
-
-/* AP : timeout */
-#define ZM_MS_PER_TICK 10
-#define ZM_TICK_PER_SECOND (1000/ZM_MS_PER_TICK)
-#define ZM_TICK_PER_MINUTE (60*1000/ZM_MS_PER_TICK)
-#define ZM_PREAUTH_TIMEOUT_MS 1000 /* 1 sec */
-#define ZM_AUTH_TIMEOUT_MS 1000 /* 1 sec */
-
-/* Error code */
-#define ZM_SUCCESS 0
-#define ZM_ERR_TX_PORT_DISABLED 1
-#define ZM_ERR_BUFFER_DMA_ADDR 2
-#define ZM_ERR_FREE_TXD_EXHAUSTED 3
-#define ZM_ERR_TX_BUFFER_UNAVAILABLE 4
-#define ZM_ERR_BCMC_PS_BUFFER_UNAVAILABLE 5
-#define ZM_ERR_UNI_PS_BUFFER_UNAVAILABLE 6
-#define ZM_ERR_EXCEED_PRIORITY_THRESHOLD 7
-#define ZM_ERR_VMMQ_FULL 8
-#define ZM_ERR_FLUSH_PS_QUEUE 9
-#define ZM_ERR_CMD_INT_MISSED 15 /* Polling cmd int timeout*/
-/* Rx */
-#define ZM_ERR_RX_FRAME_TYPE 20
-#define ZM_ERR_MIN_RX_ENCRYPT_FRAME_LENGTH 21
-#define ZM_ERR_MIN_RX_FRAME_LENGTH 22
-#define ZM_ERR_MAX_RX_FRAME_LENGTH 23
-#define ZM_ERR_RX_DUPLICATE 24
-#define ZM_ERR_RX_SRC_ADDR_IS_OWN_MAC 25
-#define ZM_ERR_MIN_RX_PROTOCOL_VERSION 26
-#define ZM_ERR_WPA_GK_NOT_INSTALLED 27
-#define ZM_ERR_STA_NOT_ASSOCIATED 28
-#define ZM_ERR_DATA_BEFORE_CONNECTED 29
-#define ZM_ERR_DATA_NOT_ENCRYPTED 30
-#define ZM_ERR_DATA_BSSID_NOT_MATCHED 31
-#define ZM_ERR_RX_BAR_FRAME 32
-#define ZM_ERR_OUT_OF_ORDER_NULL_DATA 33
-
-/* ZFI */
-#define ZM_ERR_INVALID_TX_RATE 40
-#define ZM_ERR_WDS_PORT_ID 41
-
-/* QUEUE */
-#define ZM_ERR_QUEUE_FULL 50
-#define ZM_ERR_STA_UAPSD_QUEUE_FULL 51
-#define ZM_ERR_AP_UAPSD_QUEUE_FULL 52
-
-/* Maximum Rx frame length */
-#if ZM_LARGEPAYLOAD_TEST == 1
-#define ZM_WLAN_MAX_RX_SIZE 16384
-#else
-#define ZM_WLAN_MAX_RX_SIZE 8192
-#endif
-
-/* PCI DMA test error code */
-#define ZM_ERR_INTERRUPT_MISSED 100
-#define ZM_ERR_OWN_BIT_NOT_CLEARED 101
-#define ZM_ERR_RX_SEQ_NUMBER 102
-#define ZM_ERR_RX_LENGTH 103
-#define ZM_ERR_RX_DATA 104
-#define ZM_ERR_RX_DESCRIPTOR_NUM 105
-/* Common register test error code */
-#define ZM_ERR_REGISTER_ACCESS 110 /* Register R/W test fail*/
-#define ZM_ERR_CLEAR_INTERRUPT_FLAG 111
-#define ZM_ERR_COMMAND_RESPONSE 112
-#define ZM_ERR_INTERRUPT_GENERATE 113
-#define ZM_ERR_INTERRUPT_ACK 114
-#define ZM_ERR_SCRATCH_ACCESS 115
-#define ZM_ERR_INTERRUPT_MASK_ACCESS 116
-#define ZM_ERR_SHARE_MEMORY_PCI_ACCESS 117
-#define ZM_ERR_SHARE_MEMORY_FW_ACCESS 118
-#define ZM_ERR_SHARE_MEMORY_DISABLE 119
-#define ZM_ERR_SHARE_MEMORY_TEST_RESPONSE 120
-
-/* Firmware Download error code */
-#define ZM_ERR_FIRMWARE_DOWNLOAD_TIMEOUT 150
-#define ZM_ERR_FIRMWARE_DOWNLOAD_INT_FLAG 151
-#define ZM_ERR_FIRMWARE_READY_TIMEOUT 152
-#define ZM_ERR_FIRMWARE_WRONG_TYPE 153
-
-/* Debug */
-#define ZM_LV_0 0//Debug level 0, Disable debug message
-#define ZM_LV_1 1//Debug level 1, Show minimum information
-#define ZM_LV_2 2//Debug level 2, Show medium message
-#define ZM_LV_3 3//Debug level 3, Show all
-
-#define ZM_SCANMSG_LEV ZM_LV_1
-#define ZM_TXMSG_LEV ZM_LV_0//ZM_LV_0
-#define ZM_RXMSG_LEV ZM_LV_0
-#define ZM_MMMSG_LEV ZM_LV_0
-#define ZM_DESMSG_LEV ZM_LV_0//ZM_LV_0
-#define ZM_BUFMSG_LEV ZM_LV_0//ZM_LV_1
-#define ZM_INITMSG_LEV ZM_LV_0
-
-#define zm_msg0_scan(lv, msg) if (ZM_SCANMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_scan(lv, msg, val) if (ZM_SCANMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_scan(lv, msg, val) if (ZM_SCANMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define zm_msg0_tx(lv, msg) if (ZM_TXMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_tx(lv, msg, val) if (ZM_TXMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_tx(lv, msg, val) if (ZM_TXMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define zm_msg0_rx(lv, msg) if (ZM_RXMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_rx(lv, msg, val) if (ZM_RXMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_rx(lv, msg, val) if (ZM_RXMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define zm_msg0_mm(lv, msg) if (ZM_MMMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_mm(lv, msg, val) if (ZM_MMMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_mm(lv, msg, val) if (ZM_MMMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define zm_msg0_des(lv, msg) if (ZM_DESMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_des(lv, msg, val) if (ZM_DESMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_des(lv, msg, val) if (ZM_DESMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define zm_msg0_buf(lv, msg) if (ZM_BUFMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_buf(lv, msg, val) if (ZM_BUFMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_buf(lv, msg, val) if (ZM_BUFMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define zm_msg0_init(lv, msg) if (ZM_INITMSG_LEV >= lv) \
- {zm_debug_msg0(msg);}
-#define zm_msg1_init(lv, msg, val) if (ZM_INITMSG_LEV >= lv) \
- {zm_debug_msg1(msg, val);}
-#define zm_msg2_init(lv, msg, val) if (ZM_INITMSG_LEV >= lv) \
- {zm_debug_msg2(msg, val);}
-
-#define ZM_MAX_AP_SUPPORT 2 /* Must <= 8 */
-#define ZM_MAX_WDS_SUPPORT 6 /* Must <= 6 */
-#define ZM_MAX_STA_SUPPORT 16 /* Must <= 64 */
-
-/* STA table state */
-#define ZM_STATE_AUTH 1
-#define ZM_STATE_PREAUTH 2
-#define ZM_STATE_ASOC 3
-
-/* Rate set */
-#define ZM_RATE_SET_CCK 0
-#define ZM_RATE_SET_OFDM 1
-
-/* HT PT */
-#define ZM_PREAMBLE_TYPE_MIXED_MODE 0
-#define ZM_PREAMBLE_TYPE_GREEN_FIELD 1
-
-/* HT bandwidth */
-#define ZM_BANDWIDTH_20MHZ 0
-#define ZM_BANDWIDTH_40MHZ 1
-
-/* MIC status */
-#define ZM_MIC_SUCCESS 0
-#define ZM_MIC_FAILURE 1
-
-/* ICV status */
-#define ZM_ICV_SUCCESS 0
-#define ZM_ICV_FAILURE 1
-
-/* definition check */
-#if (ZM_MAX_AP_SUPPORT > 8)
-definition error, ZM_MAX_AP_SUPPORT > 8
-#endif
-#if (ZM_MAX_AP_SUPPORT > 64)
-definition error, ZM_MAX_STA_SUPPORT > 64
-#endif
-
-/* Transmission Rate information */
-
-/* WLAN frame format */
-#define ZM_PLCP_HEADER_SIZE 5
-#define ZM_ETHERNET_ADDRESS_LENGTH 6
-#define ZM_TIMESTAMP_OFFSET 0
-#define ZM_BEACON_INTERVAL_OFFSET 8
-#define ZM_CAPABILITY_OFFSET 10
-
-/* Reason Code */
-/* An unsolicited notification management frame of */
-/* type Disassocation or Deauthentication was generated. */
-#ifdef ZM_REASON_CODE
-#define ZM_WLAN_REASON_CODE_UNSPECIFIED 1
-#define ZM_WLAN_FRAME_DISASOC_DEAUTH_REASON_CODE 24
-#endif
-
-struct zsWlanManagementFrameHeader
-{
- //u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
- u8_t frameCtrl[2];
- u8_t duration[2];
- u8_t da[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t sa[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t bssid[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t seqCtrl[2];
- u8_t body[1];
-};
-
-struct zsWlanProbeRspFrameHeader
-{
- //u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
- u8_t frameCtrl[2];
- u8_t duration[2];
- u8_t da[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t sa[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t bssid[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t seqCtrl[2];
- u8_t timeStamp[8];
- u8_t beaconInterval[2];
- u8_t capability[2];
- u8_t ssid[ZM_MAX_SSID_LENGTH + 2]; // EID(1) + Length(1) + SSID(32)
-} ;
-
-#define zsWlanBeaconFrameHeader zsWlanProbeRspFrameHeader
-
-struct zsWlanAuthFrameHeader
-{
- //u8_t plcpHdr[ZM_PLCP_HEADER_SIZE];
- u8_t frameCtrl[2];
- u8_t duration[2];
- u8_t address1[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t address2[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t address3[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t seqCtrl[2];
- u16_t algo;
- u16_t seq;
- u16_t status;
- u8_t challengeText[255]; // the first 2 bytes are information ID, length
-};
-
-struct zsWlanAssoFrameHeader
-{
- //u8_t plcpHdr[PLCP_HEADER_SIZE];
- u8_t frameCtrl[2];
- u8_t duration[2];
- u8_t address1[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t address2[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t address3[ZM_ETHERNET_ADDRESS_LENGTH];
- u8_t seqCtrl[2];
- u8_t capability[2];
- u16_t status;
- u16_t aid;
- //u8_t supportedRates[10];
-};
-
-struct zsFrag
-{
- zbuf_t* buf[16];
- u16_t bufType[16];
- u16_t seq[16];
- u8_t flag[16];
-
-};
-
-//================================
-// Hardware related definitions
-//================================
-#define ZM_MAC_REG_BASE 0x1c3000
-
-#define ZM_MAC_REG_ATIM_WINDOW (ZM_MAC_REG_BASE + 0x51C)
-#define ZM_MAC_REG_BCN_PERIOD (ZM_MAC_REG_BASE + 0x520)
-#define ZM_MAC_REG_PRETBTT (ZM_MAC_REG_BASE + 0x524)
-
-#define ZM_MAC_REG_MAC_ADDR_L (ZM_MAC_REG_BASE + 0x610)
-#define ZM_MAC_REG_MAC_ADDR_H (ZM_MAC_REG_BASE + 0x614)
-
-#define ZM_MAC_REG_GROUP_HASH_TBL_L (ZM_MAC_REG_BASE + 0x624)
-#define ZM_MAC_REG_GROUP_HASH_TBL_H (ZM_MAC_REG_BASE + 0x628)
-
-#define ZM_MAC_REG_BASIC_RATE (ZM_MAC_REG_BASE + 0x630)
-#define ZM_MAC_REG_MANDATORY_RATE (ZM_MAC_REG_BASE + 0x634)
-#define ZM_MAC_REG_RTS_CTS_RATE (ZM_MAC_REG_BASE + 0x638)
-#define ZM_MAC_REG_BACKOFF_PROTECT (ZM_MAC_REG_BASE + 0x63c)
-#define ZM_MAC_REG_RX_THRESHOLD (ZM_MAC_REG_BASE + 0x640)
-#define ZM_MAC_REG_RX_PE_DELAY (ZM_MAC_REG_BASE + 0x64C)
-
-#define ZM_MAC_REG_DYNAMIC_SIFS_ACK (ZM_MAC_REG_BASE + 0x658)
-#define ZM_MAC_REG_SNIFFER (ZM_MAC_REG_BASE + 0x674)
-#define ZM_MAC_REG_TX_UNDERRUN (ZM_MAC_REG_BASE + 0x688)
-#define ZM_MAC_REG_RX_TOTAL (ZM_MAC_REG_BASE + 0x6A0)
-#define ZM_MAC_REG_RX_CRC32 (ZM_MAC_REG_BASE + 0x6A4)
-#define ZM_MAC_REG_RX_CRC16 (ZM_MAC_REG_BASE + 0x6A8)
-#define ZM_MAC_REG_RX_ERR_UNI (ZM_MAC_REG_BASE + 0x6AC)
-#define ZM_MAC_REG_RX_OVERRUN (ZM_MAC_REG_BASE + 0x6B0)
-#define ZM_MAC_REG_RX_ERR_MUL (ZM_MAC_REG_BASE + 0x6BC)
-#define ZM_MAC_REG_TX_RETRY (ZM_MAC_REG_BASE + 0x6CC)
-#define ZM_MAC_REG_TX_TOTAL (ZM_MAC_REG_BASE + 0x6F4)
-
-
-#define ZM_MAC_REG_ACK_EXTENSION (ZM_MAC_REG_BASE + 0x690)
-#define ZM_MAC_REG_EIFS_AND_SIFS (ZM_MAC_REG_BASE + 0x698)
-
-#define ZM_MAC_REG_SLOT_TIME (ZM_MAC_REG_BASE + 0x6F0)
-
-#define ZM_MAC_REG_ROLL_CALL_TBL_L (ZM_MAC_REG_BASE + 0x704)
-#define ZM_MAC_REG_ROLL_CALL_TBL_H (ZM_MAC_REG_BASE + 0x708)
-
-#define ZM_MAC_REG_AC0_CW (ZM_MAC_REG_BASE + 0xB00)
-#define ZM_MAC_REG_AC1_CW (ZM_MAC_REG_BASE + 0xB04)
-#define ZM_MAC_REG_AC2_CW (ZM_MAC_REG_BASE + 0xB08)
-#define ZM_MAC_REG_AC3_CW (ZM_MAC_REG_BASE + 0xB0C)
-#define ZM_MAC_REG_AC4_CW (ZM_MAC_REG_BASE + 0xB10)
-#define ZM_MAC_REG_AC1_AC0_AIFS (ZM_MAC_REG_BASE + 0xB14)
-#define ZM_MAC_REG_AC3_AC2_AIFS (ZM_MAC_REG_BASE + 0xB18)
-
-#define ZM_MAC_REG_RETRY_MAX (ZM_MAC_REG_BASE + 0xB28)
-
-#define ZM_MAC_REG_TXOP_NOT_ENOUGH_INDICATION (ZM_MAC_REG_BASE + 0xB30)
-
-#define ZM_MAC_REG_AC1_AC0_TXOP (ZM_MAC_REG_BASE + 0xB44)
-#define ZM_MAC_REG_AC3_AC2_TXOP (ZM_MAC_REG_BASE + 0xB48)
-
-#define ZM_MAC_REG_ACK_TABLE (ZM_MAC_REG_BASE + 0xC00)
-
-#define ZM_MAC_REG_BCN_ADDR (ZM_MAC_REG_BASE + 0xD84)
-#define ZM_MAC_REG_BCN_LENGTH (ZM_MAC_REG_BASE + 0xD88)
-
-#define ZM_MAC_REG_BCN_PLCP (ZM_MAC_REG_BASE + 0xD90)
-#define ZM_MAC_REG_BCN_CTRL (ZM_MAC_REG_BASE + 0xD94)
-
-#define ZM_MAC_REG_BCN_HT1 (ZM_MAC_REG_BASE + 0xDA0)
-#define ZM_MAC_REG_BCN_HT2 (ZM_MAC_REG_BASE + 0xDA4)
-
-
-#define ZM_RX_STATUS_IS_MIC_FAIL(rxStatus) rxStatus->Tail.Data.ErrorIndication & ZM_BIT_6
-
-//================================
-//================================
-
-#ifdef ZM_ENABLE_NATIVE_WIFI
-#define ZM_80211_FRAME_HEADER_LEN 24
-#define ZM_80211_FRAME_TYPE_OFFSET 30 // ZM_80211_FRAME_HEADER_LEN + SNAP
-#define ZM_80211_FRAME_IP_OFFSET 32 // ZM_80211_FRAME_HEADER_LEN + SNAP + TYPE
-#else
-#define ZM_80211_FRAME_HEADER_LEN 14
-#define ZM_80211_FRAME_TYPE_OFFSET 12 // ZM_80211_FRAME_HEADER_LEN + SNAP
-#define ZM_80211_FRAME_IP_OFFSET 14 // ZM_80211_FRAME_HEADER_LEN + SNAP + TYPE
-#endif
-
-#define ZM_BSS_INFO_VALID_BIT 0x01
-#define ZM_BSS_INFO_UPDATED_BIT 0x02
-
-
-
-
-
-#define ZM_ERROR_INDICATION_RX_TIMEOUT 0x01
-#define ZM_ERROR_INDICATION_OVERRUN 0x02
-#define ZM_ERROR_INDICATION_DECRYPT_ERROR 0x04
-#define ZM_ERROR_INDICATION_CRC32_ERROR 0x08
-#define ZM_ERROR_INDICATION_ADDR_NOT_MATCH 0x10
-#define ZM_ERROR_INDICATION_CRC16_ERROR 0x20
-#define ZM_ERROR_INDICATION_MIC_ERROR 0x40
-
-#define ZM_RXMAC_STATUS_MOD_TYPE_CCK 0x00
-#define ZM_RXMAC_STATUS_MOD_TYPE_OFDM 0x01
-#define ZM_RXMAC_STATUS_MOD_TYPE_HT_OFDM 0x02
-#define ZM_RXMAC_STATUS_MOD_TYPE_DL_OFDM 0x03
-#define ZM_RXMAC_STATUS_TOTAL_ERROR 0x80
-
-
-
-
-
-#define ZM_MAX_LED_NUMBER 2
-
-#define ZM_LED_DISABLE_MODE 0x0
-#define ZM_LED_LINK_MODE 0x1
-#define ZM_LED_LINK_TR_MODE 0x2
-#define ZM_LED_TR_ON_MODE 0x3
-#define ZM_LED_TR_OFF_MODE 0x4
-
-#define ZM_LED_CTRL_FLAG_ALPHA 0x1
-
-struct zsLedStruct
-{
- u32_t counter;
- u32_t counter100ms;
- u16_t ledLinkState;
- u16_t ledMode[ZM_MAX_LED_NUMBER];
- u32_t txTraffic;
- u32_t rxTraffic;
- u8_t LEDCtrlType;
- u8_t LEDCtrlFlag; // Control Flag for vendors
- u8_t LEDCtrlFlagFromReg; // Control Flag for vendors in registry
-};
-
-
-//HAL+ capability bits definition
-#define ZM_HP_CAP_11N 0x1
-#define ZM_HP_CAP_11N_ONE_TX_STREAM 0x2
-#define ZM_HP_CAP_2G 0x4
-#define ZM_HP_CAP_5G 0x8
-
-#endif /* #ifndef _WLAN_H */
OpenPOWER on IntegriCloud