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
41 /*--------------------- Static Definitions -------------------------*/
43 /*--------------------- Static Classes ----------------------------*/
45 /*--------------------- Static Variables --------------------------*/
47 /*--------------------- Static Functions --------------------------*/
49 /*--------------------- Export Variables --------------------------*/
51 /*--------------------- Export Functions --------------------------*/
60 * pMgmtHandle - pointer to management object
61 * eOPMode - Operation Mode
71 WMAC_CONFIG_MODE eOPMode
74 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
76 pMgmt->eConfigMode = eOPMode;
86 * pMgmtHandle - pointer to management object
87 * wBeaconPeriod - Beacon Period
88 * wATIMWindow - ATIM window
89 * uChannel - channel number
97 VNTWIFIvSetIBSSParameter(
99 unsigned short wBeaconPeriod,
100 unsigned short wATIMWindow,
101 unsigned int uChannel
104 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
106 pMgmt->wIBSSBeaconPeriod = wBeaconPeriod;
107 pMgmt->wIBSSATIMWindow = wATIMWindow;
108 pMgmt->uIBSSChannel = uChannel;
118 * pMgmtHandle - pointer to management object
122 * Return Value: current SSID pointer.
126 VNTWIFIpGetCurrentSSID(
130 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
132 return (PWLAN_IE_SSID) pMgmt->abyCurrSSID;
138 * Get current link channel
142 * pMgmtHandle - pointer to management object
146 * Return Value: current Channel.
150 VNTWIFIpGetCurrentChannel(
154 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
156 if (pMgmtHandle != NULL)
157 return pMgmt->uCurrChannel;
165 * Get current Assoc ID
169 * pMgmtHandle - pointer to management object
173 * Return Value: current Assoc ID
181 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
183 return pMgmt->wCurrAID;
189 * This routine return max support rate of IES
198 * Return Value: max support rate
202 VNTWIFIbyGetMaxSupportRate(
203 PWLAN_IE_SUPP_RATES pSupportRateIEs,
204 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
207 unsigned char byMaxSupportRate = RATE_1M;
208 unsigned char bySupportRate = RATE_1M;
211 if (pSupportRateIEs) {
212 for (ii = 0; ii < pSupportRateIEs->len; ii++) {
213 bySupportRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]);
214 if (bySupportRate > byMaxSupportRate)
215 byMaxSupportRate = bySupportRate;
219 if (pExtSupportRateIEs) {
220 for (ii = 0; ii < pExtSupportRateIEs->len; ii++) {
221 bySupportRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]);
222 if (bySupportRate > byMaxSupportRate)
223 byMaxSupportRate = bySupportRate;
228 return byMaxSupportRate;
234 * This routine return data rate of ACK packtet
244 * Return Value: max support rate
248 VNTWIFIbyGetACKTxRate(
249 unsigned char byRxDataRate,
250 PWLAN_IE_SUPP_RATES pSupportRateIEs,
251 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
254 unsigned char byMaxAckRate;
255 unsigned char byBasicRate;
258 if (byRxDataRate <= RATE_11M) {
259 byMaxAckRate = RATE_1M;
261 /* 24M is mandatory for 802.11a and 802.11g */
262 byMaxAckRate = RATE_24M;
264 if (pSupportRateIEs) {
265 for (ii = 0; ii < pSupportRateIEs->len; ii++) {
266 if (pSupportRateIEs->abyRates[ii] & 0x80) {
267 byBasicRate = DATARATEbyGetRateIdx(pSupportRateIEs->abyRates[ii]);
268 if ((byBasicRate <= byRxDataRate) &&
269 (byBasicRate > byMaxAckRate)) {
270 byMaxAckRate = byBasicRate;
275 if (pExtSupportRateIEs) {
276 for (ii = 0; ii < pExtSupportRateIEs->len; ii++) {
277 if (pExtSupportRateIEs->abyRates[ii] & 0x80) {
278 byBasicRate = DATARATEbyGetRateIdx(pExtSupportRateIEs->abyRates[ii]);
279 if ((byBasicRate <= byRxDataRate) &&
280 (byBasicRate > byMaxAckRate)) {
281 byMaxAckRate = byBasicRate;
293 * Set Authentication Mode
297 * pMgmtHandle - pointer to management object
298 * eAuthMode - Authentication mode
306 VNTWIFIvSetAuthenticationMode(
308 WMAC_AUTHENTICATION_MODE eAuthMode
311 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
313 pMgmt->eAuthenMode = eAuthMode;
314 if ((eAuthMode == WMAC_AUTH_SHAREKEY) ||
315 (eAuthMode == WMAC_AUTH_AUTO)) {
316 pMgmt->bShareKeyAlgorithm = true;
318 pMgmt->bShareKeyAlgorithm = false;
325 * Set Encryption Mode
329 * pMgmtHandle - pointer to management object
330 * eAuthMode - Authentication mode
338 VNTWIFIvSetEncryptionMode(
340 WMAC_ENCRYPTION_MODE eEncryptionMode
343 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
345 pMgmt->eEncryptionMode = eEncryptionMode;
346 if ((eEncryptionMode == WMAC_ENCRYPTION_WEPEnabled) ||
347 (eEncryptionMode == WMAC_ENCRYPTION_TKIPEnabled) ||
348 (eEncryptionMode == WMAC_ENCRYPTION_AESEnabled)) {
349 pMgmt->bPrivacyInvoked = true;
351 pMgmt->bPrivacyInvoked = false;
356 VNTWIFIbConfigPhyMode(
358 CARD_PHY_TYPE ePhyType
361 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
363 if ((ePhyType != PHY_TYPE_AUTO) &&
364 (ePhyType != pMgmt->eCurrentPHYMode)) {
365 if (CARDbSetPhyParameter(pMgmt->pAdapter, ePhyType, 0, 0, NULL, NULL) == true)
366 pMgmt->eCurrentPHYMode = ePhyType;
370 pMgmt->eConfigPHYMode = ePhyType;
375 VNTWIFIbGetConfigPhyMode(
380 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
382 if ((pMgmt != NULL) && (pePhyType != NULL))
383 *(PCARD_PHY_TYPE)pePhyType = pMgmt->eConfigPHYMode;
389 * Clear BSS List Database except current assoc BSS
393 * pMgmtHandle - Management Object structure
394 * bLinkPass - Current Link status
397 * Return Value: None.
404 * Query BSS List in management database
408 * pMgmtHandle - Management Object structure
410 * puBSSCount - BSS count
411 * pvFirstBSS - pointer to first BSS
413 * Return Value: None.
418 VNTWIFIvQueryBSSList(void *pMgmtHandle, unsigned int *puBSSCount, void **pvFirstBSS)
421 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
422 PKnownBSS pBSS = NULL;
423 unsigned int uCount = 0;
427 for (ii = 0; ii < MAX_BSS_NUM; ii++) {
428 pBSS = &(pMgmt->sBSSList[ii]);
432 if (*pvFirstBSS == NULL)
433 *pvFirstBSS = &(pMgmt->sBSSList[ii]);
437 *puBSSCount = uCount;
447 PKnownBSS pBSS = (PKnownBSS) pvCurrentBSS;
448 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
452 while (*pvNextBSS == NULL) {
454 if (pBSS > &(pMgmt->sBSSList[MAX_BSS_NUM]))
457 if (pBSS->bActive == true) {
467 * Update Tx attemps, Tx failure counter in Node DB
477 VNTWIFIvUpdateNodeTxCounter(
479 unsigned char *pbyDestAddress,
481 unsigned short wRate,
482 unsigned char *pbyTxFailCount
485 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
486 unsigned int uNodeIndex = 0;
489 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
490 (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
491 if (BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex) == false)
495 pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts++;
497 /* transmit success, TxAttempts at least plus one */
498 pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
499 pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wRate]++;
501 pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++;
503 pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += pbyTxFailCount[MAX_RATE];
504 for (ii = 0; ii < MAX_RATE; ii++)
505 pMgmt->sNodeDBTable[uNodeIndex].uTxFail[ii] += pbyTxFailCount[ii];
511 unsigned char *pbyDestAddress,
512 unsigned short *pwTxDataRate,
513 unsigned char *pbyACKRate,
514 unsigned char *pbyCCKBasicRate,
515 unsigned char *pbyOFDMBasicRate
518 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
519 unsigned int uNodeIndex = 0;
520 unsigned short wTxDataRate = RATE_1M;
521 unsigned char byACKRate = RATE_1M;
522 unsigned char byCCKBasicRate = RATE_1M;
523 unsigned char byOFDMBasicRate = RATE_24M;
524 PWLAN_IE_SUPP_RATES pSupportRateIEs = NULL;
525 PWLAN_IE_SUPP_RATES pExtSupportRateIEs = NULL;
527 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
528 (pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
529 /* Adhoc Tx rate decided from node DB */
530 if (BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex)) {
531 wTxDataRate = (pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate);
532 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrSuppRates);
533 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrExtSuppRates);
535 if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A)
536 wTxDataRate = RATE_2M;
538 wTxDataRate = RATE_24M;
540 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
541 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
543 } else { /* Infrastructure: rate decided from AP Node, index = 0 */
545 wTxDataRate = (pMgmt->sNodeDBTable[0].wTxDataRate);
547 pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
548 pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
550 byACKRate = VNTWIFIbyGetACKTxRate((unsigned char) wTxDataRate,
554 if (byACKRate > (unsigned char) wTxDataRate)
555 byACKRate = (unsigned char) wTxDataRate;
557 byCCKBasicRate = VNTWIFIbyGetACKTxRate(RATE_11M,
561 byOFDMBasicRate = VNTWIFIbyGetACKTxRate(RATE_54M,
565 *pwTxDataRate = wTxDataRate;
566 *pbyACKRate = byACKRate;
567 *pbyCCKBasicRate = byCCKBasicRate;
568 *pbyOFDMBasicRate = byOFDMBasicRate;
572 VNTWIFIbyGetKeyCypher(
577 PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
580 return pMgmt->byCSSGK;
582 return pMgmt->byCSSPK;
586 VNTWIFIbSetPMKIDCache(
588 unsigned long ulCount,
592 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
594 if (ulCount > MAX_PMKID_CACHE)
597 pMgmt->gsPMKIDCache.BSSIDInfoCount = ulCount;
598 memcpy(pMgmt->gsPMKIDCache.BSSIDInfo, pPMKIDInfo, (ulCount*sizeof(PMKIDInfo)));
603 VNTWIFIwGetMaxSupportRate(
607 unsigned short wRate = RATE_54M;
608 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
610 for (wRate = RATE_54M; wRate > RATE_1M; wRate--) {
611 if (pMgmt->sNodeDBTable[0].wSuppRate & (1<<wRate))
615 if (pMgmt->eCurrentPHYMode == PHY_TYPE_11A)
627 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
629 pMgmt->b11hEnable = b11hEnable;
633 VNTWIFIbMeasureReport(
637 unsigned char byReportMode,
638 unsigned char byBasicMap,
639 unsigned char byCCAFraction,
640 unsigned char *pbyRPIs
643 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
644 unsigned char *pbyCurrentEID = (unsigned char *)(pMgmt->pCurrMeasureEIDRep);
646 if ((pvMeasureEID != NULL) &&
647 (pMgmt->uLengthOfRepEIDs < (WLAN_A3FR_MAXLEN - sizeof(MEASEURE_REP) - sizeof(WLAN_80211HDR_A3) - 3))
649 pMgmt->pCurrMeasureEIDRep->byElementID = WLAN_EID_MEASURE_REP;
650 pMgmt->pCurrMeasureEIDRep->len = 3;
651 pMgmt->pCurrMeasureEIDRep->byToken = ((PWLAN_IE_MEASURE_REQ)pvMeasureEID)->byToken;
652 pMgmt->pCurrMeasureEIDRep->byMode = byReportMode;
653 pMgmt->pCurrMeasureEIDRep->byType = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byType;
654 switch (pMgmt->pCurrMeasureEIDRep->byType) {
655 case MEASURE_TYPE_BASIC:
656 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_BASIC);
657 memcpy(&(pMgmt->pCurrMeasureEIDRep->sRep.sBasic),
658 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
659 sizeof(MEASEURE_REQ));
660 pMgmt->pCurrMeasureEIDRep->sRep.sBasic.byMap = byBasicMap;
662 case MEASURE_TYPE_CCA:
663 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_CCA);
664 memcpy(&(pMgmt->pCurrMeasureEIDRep->sRep.sCCA),
665 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
666 sizeof(MEASEURE_REQ));
667 pMgmt->pCurrMeasureEIDRep->sRep.sCCA.byCCABusyFraction = byCCAFraction;
669 case MEASURE_TYPE_RPI:
670 pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_RPI);
671 memcpy(&(pMgmt->pCurrMeasureEIDRep->sRep.sRPI),
672 &(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
673 sizeof(MEASEURE_REQ));
674 memcpy(pMgmt->pCurrMeasureEIDRep->sRep.sRPI.abyRPIdensity, pbyRPIs, 8);
679 pbyCurrentEID += (2 + pMgmt->pCurrMeasureEIDRep->len);
680 pMgmt->uLengthOfRepEIDs += (2 + pMgmt->pCurrMeasureEIDRep->len);
681 pMgmt->pCurrMeasureEIDRep = (PWLAN_IE_MEASURE_REP) pbyCurrentEID;
684 IEEE11hbMSRRepTx(pMgmt);
690 VNTWIFIbChannelSwitch(
692 unsigned char byNewChannel
695 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
697 pMgmt->uCurrChannel = byNewChannel;
698 pMgmt->bSwitchChannel = false;