2 * Copyright (c) 1996, 2003 VIA Networking Technologies, Inc.
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 * Purpose: export functions for vntwifi lib
28 * Author: Yiching Chen
43 /*--------------------- Static Definitions -------------------------*/
44 //static int msglevel =MSG_LEVEL_DEBUG;
45 //static int msglevel =MSG_LEVEL_INFO;
47 /*--------------------- Static Classes ----------------------------*/
49 /*--------------------- Static Variables --------------------------*/
51 /*--------------------- Static Functions --------------------------*/
53 /*--------------------- Export Variables --------------------------*/
55 /*--------------------- Export Functions --------------------------*/
64 * pMgmtHandle - pointer to management object
65 * eOPMode - Opreation Mode
75 WMAC_CONFIG_MODE eOPMode
78 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
80 pMgmt->eConfigMode = eOPMode;
91 * pMgmtHandle - pointer to management object
92 * wBeaconPeriod - Beacon Period
93 * wATIMWindow - ATIM window
94 * uChannel - channel number
102 VNTWIFIvSetIBSSParameter (
104 unsigned short wBeaconPeriod,
105 unsigned short wATIMWindow,
106 unsigned int uChannel
109 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
111 pMgmt->wIBSSBeaconPeriod = wBeaconPeriod;
112 pMgmt->wIBSSATIMWindow = wATIMWindow;
113 pMgmt->uIBSSChannel = uChannel;
123 * pMgmtHandle - pointer to management object
127 * Return Value: current SSID pointer.
131 VNTWIFIpGetCurrentSSID (
135 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
136 return((PWLAN_IE_SSID) pMgmt->abyCurrSSID);
142 * Get current link channel
146 * pMgmtHandle - pointer to management object
150 * Return Value: current Channel.
154 VNTWIFIpGetCurrentChannel (
158 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
159 if (pMgmtHandle != NULL) {
160 return (pMgmt->uCurrChannel);
168 * Get current Assoc ID
172 * pMgmtHandle - pointer to management object
176 * Return Value: current Assoc ID
184 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
185 return(pMgmt->wCurrAID);
193 * This routine return max support rate of IES
202 * Return Value: max support rate
206 VNTWIFIbyGetMaxSupportRate (
207 PWLAN_IE_SUPP_RATES pSupportRateIEs,
208 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
211 unsigned char byMaxSupportRate = RATE_1M;
212 unsigned char bySupportRate = RATE_1M;
215 if (pSupportRateIEs) {
216 for (ii = 0; ii < pSupportRateIEs->len; ii++) {
217 bySupportRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]);
218 if (bySupportRate > byMaxSupportRate) {
219 byMaxSupportRate = bySupportRate;
223 if (pExtSupportRateIEs) {
224 for (ii = 0; ii < pExtSupportRateIEs->len; ii++) {
225 bySupportRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]);
226 if (bySupportRate > byMaxSupportRate) {
227 byMaxSupportRate = bySupportRate;
232 return byMaxSupportRate;
238 * This routine return data rate of ACK packtet
248 * Return Value: max support rate
252 VNTWIFIbyGetACKTxRate (
253 unsigned char byRxDataRate,
254 PWLAN_IE_SUPP_RATES pSupportRateIEs,
255 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
258 unsigned char byMaxAckRate;
259 unsigned char byBasicRate;
262 if (byRxDataRate <= RATE_11M) {
263 byMaxAckRate = RATE_1M;
265 // 24M is mandatory for 802.11a and 802.11g
266 byMaxAckRate = RATE_24M;
268 if (pSupportRateIEs) {
269 for (ii = 0; ii < pSupportRateIEs->len; ii++) {
270 if (pSupportRateIEs->abyRates[ii] & 0x80) {
271 byBasicRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]);
272 if ((byBasicRate <= byRxDataRate) &&
273 (byBasicRate > byMaxAckRate)) {
274 byMaxAckRate = byBasicRate;
279 if (pExtSupportRateIEs) {
280 for (ii = 0; ii < pExtSupportRateIEs->len; ii++) {
281 if (pExtSupportRateIEs->abyRates[ii] & 0x80) {
282 byBasicRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]);
283 if ((byBasicRate <= byRxDataRate) &&
284 (byBasicRate > byMaxAckRate)) {
285 byMaxAckRate = byBasicRate;
297 * Set Authentication Mode
301 * pMgmtHandle - pointer to management object
302 * eAuthMode - Authentication mode
310 VNTWIFIvSetAuthenticationMode (
312 WMAC_AUTHENTICATION_MODE eAuthMode
315 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
317 pMgmt->eAuthenMode = eAuthMode;
318 if ((eAuthMode == WMAC_AUTH_SHAREKEY) ||
319 (eAuthMode == WMAC_AUTH_AUTO)) {
320 pMgmt->bShareKeyAlgorithm = TRUE;
322 pMgmt->bShareKeyAlgorithm = FALSE;
329 * Set Encryption Mode
333 * pMgmtHandle - pointer to management object
334 * eAuthMode - Authentication mode
342 VNTWIFIvSetEncryptionMode (
344 WMAC_ENCRYPTION_MODE eEncryptionMode
347 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
349 pMgmt->eEncryptionMode = eEncryptionMode;
350 if ((eEncryptionMode == WMAC_ENCRYPTION_WEPEnabled) ||
351 (eEncryptionMode == WMAC_ENCRYPTION_TKIPEnabled) ||
352 (eEncryptionMode == WMAC_ENCRYPTION_AESEnabled) ) {
353 pMgmt->bPrivacyInvoked = TRUE;
355 pMgmt->bPrivacyInvoked = FALSE;
362 VNTWIFIbConfigPhyMode (
364 CARD_PHY_TYPE ePhyType
367 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
369 if ((ePhyType != PHY_TYPE_AUTO) &&
370 (ePhyType != pMgmt->eCurrentPHYMode)) {
371 if (CARDbSetPhyParameter(pMgmt->pAdapter, ePhyType, 0, 0, NULL, NULL)==TRUE) {
372 pMgmt->eCurrentPHYMode = ePhyType;
377 pMgmt->eConfigPHYMode = ePhyType;
383 VNTWIFIbGetConfigPhyMode (
388 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
390 if ((pMgmt != NULL) && (pePhyType != NULL)) {
391 *(PCARD_PHY_TYPE)pePhyType = pMgmt->eConfigPHYMode;
398 * Clear BSS List Database except current assoc BSS
402 * pMgmtHandle - Management Object structure
403 * bLinkPass - Current Link status
406 * Return Value: None.
414 * Query BSS List in management database
418 * pMgmtHandle - Management Object structure
420 * puBSSCount - BSS count
421 * pvFirstBSS - pointer to first BSS
423 * Return Value: None.
428 VNTWIFIvQueryBSSList(void *pMgmtHandle, unsigned int *puBSSCount, void **pvFirstBSS)
431 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
432 PKnownBSS pBSS = NULL;
433 unsigned int uCount = 0;
437 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
438 pBSS = &(pMgmt->sBSSList[ii]);
439 if (!pBSS->bActive) {
442 if (*pvFirstBSS == NULL) {
443 *pvFirstBSS = &(pMgmt->sBSSList[ii]);
447 *puBSSCount = uCount;
460 PKnownBSS pBSS = (PKnownBSS) pvCurrentBSS;
461 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
465 while (*pvNextBSS == NULL) {
467 if (pBSS > &(pMgmt->sBSSList[MAX_BSS_NUM])) {
470 if (pBSS->bActive == TRUE) {
484 * Update Tx attemps, Tx failure counter in Node DB
494 VNTWIFIvUpdateNodeTxCounter(
496 unsigned char *pbyDestAddress,
498 unsigned short wRate,
499 unsigned char *pbyTxFailCount
502 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
503 unsigned int uNodeIndex = 0;
506 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
507 (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
508 if (BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex) == FALSE) {
512 pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts++;
514 // transmit success, TxAttempts at least plus one
515 pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
516 pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wRate]++;
518 pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++;
520 pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += pbyTxFailCount[MAX_RATE];
521 for(ii=0;ii<MAX_RATE;ii++) {
522 pMgmt->sNodeDBTable[uNodeIndex].uTxFail[ii] += pbyTxFailCount[ii];
531 unsigned char *pbyDestAddress,
532 unsigned short *pwTxDataRate,
533 unsigned char *pbyACKRate,
534 unsigned char *pbyCCKBasicRate,
535 unsigned char *pbyOFDMBasicRate
538 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
539 unsigned int uNodeIndex = 0;
540 unsigned short wTxDataRate = RATE_1M;
541 unsigned char byACKRate = RATE_1M;
542 unsigned char byCCKBasicRate = RATE_1M;
543 unsigned char byOFDMBasicRate = RATE_24M;
544 PWLAN_IE_SUPP_RATES pSupportRateIEs = NULL;
545 PWLAN_IE_SUPP_RATES pExtSupportRateIEs = NULL;
548 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
549 (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
550 // Adhoc Tx rate decided from node DB
551 if(BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex)) {
552 wTxDataRate = (pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate);
553 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrSuppRates);
554 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrExtSuppRates);
556 if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) {
557 wTxDataRate = RATE_2M;
559 wTxDataRate = RATE_24M;
561 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
562 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
564 } else { // Infrastructure: rate decided from AP Node, index = 0
566 wTxDataRate = (pMgmt->sNodeDBTable[0].wTxDataRate);
568 printk("GetTxRate:AP MAC is %02x:%02x:%02x:%02x:%02x:%02x,TxRate is %d\n",
569 pMgmt->sNodeDBTable[0].abyMACAddr[0],pMgmt->sNodeDBTable[0].abyMACAddr[1],
570 pMgmt->sNodeDBTable[0].abyMACAddr[2],pMgmt->sNodeDBTable[0].abyMACAddr[3],
571 pMgmt->sNodeDBTable[0].abyMACAddr[4],pMgmt->sNodeDBTable[0].abyMACAddr[5],wTxDataRate);
575 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
576 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
578 byACKRate = VNTWIFIbyGetACKTxRate( (unsigned char) wTxDataRate,
582 if (byACKRate > (unsigned char) wTxDataRate) {
583 byACKRate = (unsigned char) wTxDataRate;
585 byCCKBasicRate = VNTWIFIbyGetACKTxRate( RATE_11M,
589 byOFDMBasicRate = VNTWIFIbyGetACKTxRate(RATE_54M,
593 *pwTxDataRate = wTxDataRate;
594 *pbyACKRate = byACKRate;
595 *pbyCCKBasicRate = byCCKBasicRate;
596 *pbyOFDMBasicRate = byOFDMBasicRate;
601 VNTWIFIbyGetKeyCypher(
606 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
608 if (bGroupKey == TRUE) {
609 return (pMgmt->byCSSGK);
611 return (pMgmt->byCSSPK);
619 void *pAdapterHandler,
624 PSMgmtObject pMgmt = NULL;
628 pMgmt = (PSMgmtObject)kmalloc(sizeof(SMgmtObject), (int)GFP_ATOMIC);
630 *pMgmtHandler = NULL;
634 memset(pMgmt, 0, sizeof(SMgmtObject));
635 pMgmt->pAdapter = (void *) pAdapterHandler;
637 // should initial MAC address abyMACAddr
638 for(ii=0;ii<WLAN_BSSID_LEN;ii++) {
639 pMgmt->abyDesireBSSID[ii] = 0xFF;
641 pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
642 pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
643 pMgmt->byCSSPK = KEY_CTL_NONE;
644 pMgmt->byCSSGK = KEY_CTL_NONE;
645 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
647 pMgmt->cbFreeCmdQueue = CMD_Q_SIZE;
648 pMgmt->uCmdDequeueIdx = 0;
649 pMgmt->uCmdEnqueueIdx = 0;
650 pMgmt->eCommandState = WLAN_CMD_STATE_IDLE;
651 pMgmt->bCmdStop = FALSE;
652 pMgmt->bCmdRunning = FALSE;
654 *pMgmtHandler = pMgmt;
662 VNTWIFIbSetPMKIDCache (
664 unsigned long ulCount,
668 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
670 if (ulCount > MAX_PMKID_CACHE) {
673 pMgmt->gsPMKIDCache.BSSIDInfoCount = ulCount;
674 memcpy(pMgmt->gsPMKIDCache.BSSIDInfo, pPMKIDInfo, (ulCount*sizeof(PMKIDInfo)));
681 VNTWIFIwGetMaxSupportRate(
685 unsigned short wRate = RATE_54M;
686 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
688 for(wRate = RATE_54M; wRate > RATE_1M; wRate--) {
689 if (pMgmt->sNodeDBTable[0].wSuppRate & (1<<wRate)) {
693 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11A) {
707 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
709 pMgmt->b11hEnable = b11hEnable;
713 VNTWIFIbMeasureReport(
717 unsigned char byReportMode,
718 unsigned char byBasicMap,
719 unsigned char byCCAFraction,
720 unsigned char *pbyRPIs
723 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
724 unsigned char *pbyCurrentEID = (unsigned char *) (pMgmt->pCurrMeasureEIDRep);
726 //spin_lock_irq(&pDevice->lock);
727 if ((pvMeasureEID != NULL) &&
728 (pMgmt->uLengthOfRepEIDs < (WLAN_A3FR_MAXLEN - sizeof(MEASEURE_REP) - sizeof(WLAN_80211HDR_A3) - 3))
730 pMgmt->pCurrMeasureEIDRep->byElementID = WLAN_EID_MEASURE_REP;
731 pMgmt->pCurrMeasureEIDRep->len = 3;
732 pMgmt->pCurrMeasureEIDRep->byToken = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byToken;
733 pMgmt->pCurrMeasureEIDRep->byMode = byReportMode;
734 pMgmt->pCurrMeasureEIDRep->byType = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byType;
735 switch (pMgmt->pCurrMeasureEIDRep->byType) {
736 case MEASURE_TYPE_BASIC :
737 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_BASIC);
738 memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sBasic),
739 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
740 sizeof(MEASEURE_REQ));
741 pMgmt->pCurrMeasureEIDRep->sRep.sBasic.byMap = byBasicMap;
743 case MEASURE_TYPE_CCA :
744 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_CCA);
745 memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sCCA),
746 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
747 sizeof(MEASEURE_REQ));
748 pMgmt->pCurrMeasureEIDRep->sRep.sCCA.byCCABusyFraction = byCCAFraction;
750 case MEASURE_TYPE_RPI :
751 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_RPI);
752 memcpy( &(pMgmt->pCurrMeasureEIDRep->sRep.sRPI),
753 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
754 sizeof(MEASEURE_REQ));
755 memcpy(pMgmt->pCurrMeasureEIDRep->sRep.sRPI.abyRPIdensity, pbyRPIs, 8);
760 pbyCurrentEID += (2 + pMgmt->pCurrMeasureEIDRep->len);
761 pMgmt->uLengthOfRepEIDs += (2 + pMgmt->pCurrMeasureEIDRep->len);
762 pMgmt->pCurrMeasureEIDRep = (PWLAN_IE_MEASURE_REP) pbyCurrentEID;
764 if (bEndOfReport == TRUE) {
765 IEEE11hbMSRRepTx(pMgmt);
767 //spin_unlock_irq(&pDevice->lock);
773 VNTWIFIbChannelSwitch(
775 unsigned char byNewChannel
778 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
780 //spin_lock_irq(&pDevice->lock);
781 pMgmt->uCurrChannel = byNewChannel;
782 pMgmt->bSwitchChannel = FALSE;
783 //spin_unlock_irq(&pDevice->lock);
789 VNTWIFIbRadarPresent(
791 unsigned char byChannel
794 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
795 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
796 (byChannel == (unsigned char) pMgmt->uCurrChannel) &&
797 (pMgmt->bSwitchChannel != TRUE) &&
798 (pMgmt->b11hEnable == TRUE)) {
799 if (!compare_ether_addr(pMgmt->abyIBSSDFSOwner, CARDpGetCurrentAddress(pMgmt->pAdapter))) {
800 pMgmt->byNewChannel = CARDbyAutoChannelSelect(pMgmt->pAdapter,(unsigned char) pMgmt->uCurrChannel);
801 pMgmt->bSwitchChannel = TRUE;
803 BEACONbSendBeacon(pMgmt);
804 CARDbChannelSwitch(pMgmt->pAdapter, 0, pMgmt->byNewChannel, 10);