diff options
author | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-28 09:44:56 -0700 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2010-10-28 09:44:56 -0700 |
commit | e4c5bf8e3dca827a1b3a6fac494eae8c74b7e1e7 (patch) | |
tree | ea51b391f7d74ca695dcb9f5e46eb02688a92ed9 /drivers/staging/otus/80211core/cinit.c | |
parent | 81280572ca6f54009edfa4deee563e8678784218 (diff) | |
parent | a4ac0d847af9dd34d5953a5e264400326144b6b2 (diff) | |
download | op-kernel-dev-e4c5bf8e3dca827a1b3a6fac494eae8c74b7e1e7.zip op-kernel-dev-e4c5bf8e3dca827a1b3a6fac494eae8c74b7e1e7.tar.gz |
Merge 'staging-next' to Linus's tree
This merges the staging-next tree to Linus's tree and resolves
some conflicts that were present due to changes in other trees that were
affected by files here.
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/staging/otus/80211core/cinit.c')
-rw-r--r-- | drivers/staging/otus/80211core/cinit.c | 1912 |
1 files changed, 0 insertions, 1912 deletions
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; -} |