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
45 /*--------------------- Static Definitions -------------------------*/
46 //static int msglevel =MSG_LEVEL_DEBUG;
47 //static int msglevel =MSG_LEVEL_INFO;
49 /*--------------------- Static Classes ----------------------------*/
51 /*--------------------- Static Variables --------------------------*/
53 /*--------------------- Static Functions --------------------------*/
55 /*--------------------- Export Variables --------------------------*/
57 /*--------------------- Export Functions --------------------------*/
66 * pMgmtHandle - pointer to management object
67 * eOPMode - Opreation Mode
77 IN WMAC_CONFIG_MODE eOPMode
80 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
82 pMgmt
->eConfigMode
= eOPMode
;
93 * pMgmtHandle - pointer to management object
94 * wBeaconPeriod - Beacon Period
95 * wATIMWindow - ATIM window
96 * uChannel - channel number
104 VNTWIFIvSetIBSSParameter (
105 IN PVOID pMgmtHandle
,
106 IN WORD wBeaconPeriod
,
111 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
113 pMgmt
->wIBSSBeaconPeriod
= wBeaconPeriod
;
114 pMgmt
->wIBSSATIMWindow
= wATIMWindow
;
115 pMgmt
->uIBSSChannel
= uChannel
;
125 * pMgmtHandle - pointer to management object
129 * Return Value: current SSID pointer.
133 VNTWIFIpGetCurrentSSID (
137 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
138 return((PWLAN_IE_SSID
) pMgmt
->abyCurrSSID
);
144 * Get current link channel
148 * pMgmtHandle - pointer to management object
152 * Return Value: current Channel.
156 VNTWIFIpGetCurrentChannel (
160 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
161 if (pMgmtHandle
!= NULL
) {
162 return (pMgmt
->uCurrChannel
);
170 * Get current Assoc ID
174 * pMgmtHandle - pointer to management object
178 * Return Value: current Assoc ID
186 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
187 return(pMgmt
->wCurrAID
);
195 * This routine return max support rate of IES
204 * Return Value: max support rate
208 VNTWIFIbyGetMaxSupportRate (
209 IN PWLAN_IE_SUPP_RATES pSupportRateIEs
,
210 IN PWLAN_IE_SUPP_RATES pExtSupportRateIEs
213 BYTE byMaxSupportRate
= RATE_1M
;
214 BYTE bySupportRate
= RATE_1M
;
217 if (pSupportRateIEs
) {
218 for (ii
= 0; ii
< pSupportRateIEs
->len
; ii
++) {
219 bySupportRate
= DATARATEbyGetRateIdx(pSupportRateIEs
->abyRates
[ii
]);
220 if (bySupportRate
> byMaxSupportRate
) {
221 byMaxSupportRate
= bySupportRate
;
225 if (pExtSupportRateIEs
) {
226 for (ii
= 0; ii
< pExtSupportRateIEs
->len
; ii
++) {
227 bySupportRate
= DATARATEbyGetRateIdx(pExtSupportRateIEs
->abyRates
[ii
]);
228 if (bySupportRate
> byMaxSupportRate
) {
229 byMaxSupportRate
= bySupportRate
;
234 return byMaxSupportRate
;
240 * This routine return data rate of ACK packtet
250 * Return Value: max support rate
254 VNTWIFIbyGetACKTxRate (
255 IN BYTE byRxDataRate
,
256 IN PWLAN_IE_SUPP_RATES pSupportRateIEs
,
257 IN PWLAN_IE_SUPP_RATES pExtSupportRateIEs
264 if (byRxDataRate
<= RATE_11M
) {
265 byMaxAckRate
= RATE_1M
;
267 // 24M is mandatory for 802.11a and 802.11g
268 byMaxAckRate
= RATE_24M
;
270 if (pSupportRateIEs
) {
271 for (ii
= 0; ii
< pSupportRateIEs
->len
; ii
++) {
272 if (pSupportRateIEs
->abyRates
[ii
] & 0x80) {
273 byBasicRate
= DATARATEbyGetRateIdx(pSupportRateIEs
->abyRates
[ii
]);
274 if ((byBasicRate
<= byRxDataRate
) &&
275 (byBasicRate
> byMaxAckRate
)) {
276 byMaxAckRate
= byBasicRate
;
281 if (pExtSupportRateIEs
) {
282 for (ii
= 0; ii
< pExtSupportRateIEs
->len
; ii
++) {
283 if (pExtSupportRateIEs
->abyRates
[ii
] & 0x80) {
284 byBasicRate
= DATARATEbyGetRateIdx(pExtSupportRateIEs
->abyRates
[ii
]);
285 if ((byBasicRate
<= byRxDataRate
) &&
286 (byBasicRate
> byMaxAckRate
)) {
287 byMaxAckRate
= byBasicRate
;
299 * Set Authentication Mode
303 * pMgmtHandle - pointer to management object
304 * eAuthMode - Authentication mode
312 VNTWIFIvSetAuthenticationMode (
313 IN PVOID pMgmtHandle
,
314 IN WMAC_AUTHENTICATION_MODE eAuthMode
317 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
319 pMgmt
->eAuthenMode
= eAuthMode
;
320 if ((eAuthMode
== WMAC_AUTH_SHAREKEY
) ||
321 (eAuthMode
== WMAC_AUTH_AUTO
)) {
322 pMgmt
->bShareKeyAlgorithm
= TRUE
;
324 pMgmt
->bShareKeyAlgorithm
= FALSE
;
331 * Set Encryption Mode
335 * pMgmtHandle - pointer to management object
336 * eAuthMode - Authentication mode
344 VNTWIFIvSetEncryptionMode (
345 IN PVOID pMgmtHandle
,
346 IN WMAC_ENCRYPTION_MODE eEncryptionMode
349 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
351 pMgmt
->eEncryptionMode
= eEncryptionMode
;
352 if ((eEncryptionMode
== WMAC_ENCRYPTION_WEPEnabled
) ||
353 (eEncryptionMode
== WMAC_ENCRYPTION_TKIPEnabled
) ||
354 (eEncryptionMode
== WMAC_ENCRYPTION_AESEnabled
) ) {
355 pMgmt
->bPrivacyInvoked
= TRUE
;
357 pMgmt
->bPrivacyInvoked
= FALSE
;
364 VNTWIFIbConfigPhyMode (
365 IN PVOID pMgmtHandle
,
366 IN CARD_PHY_TYPE ePhyType
369 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
371 if ((ePhyType
!= PHY_TYPE_AUTO
) &&
372 (ePhyType
!= pMgmt
->eCurrentPHYMode
)) {
373 if (CARDbSetPhyParameter(pMgmt
->pAdapter
, ePhyType
, 0, 0, NULL
, NULL
)==TRUE
) {
374 pMgmt
->eCurrentPHYMode
= ePhyType
;
379 pMgmt
->eConfigPHYMode
= ePhyType
;
385 VNTWIFIbGetConfigPhyMode (
386 IN PVOID pMgmtHandle
,
390 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
392 if ((pMgmt
!= NULL
) && (pePhyType
!= NULL
)) {
393 *(PCARD_PHY_TYPE
)pePhyType
= pMgmt
->eConfigPHYMode
;
400 * Clear BSS List Database except current assoc BSS
404 * pMgmtHandle - Management Object structure
405 * bLinkPass - Current Link status
408 * Return Value: None.
416 * Query BSS List in management database
420 * pMgmtHandle - Management Object structure
422 * puBSSCount - BSS count
423 * pvFirstBSS - pointer to first BSS
425 * Return Value: None.
430 VNTWIFIvQueryBSSList (
431 IN PVOID pMgmtHandle
,
432 OUT PUINT puBSSCount
,
433 OUT PVOID
*pvFirstBSS
437 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
438 PKnownBSS pBSS
= NULL
;
443 for (ii
= 0; ii
< MAX_BSS_NUM
; ii
++) {
444 pBSS
= &(pMgmt
->sBSSList
[ii
]);
445 if (!pBSS
->bActive
) {
448 if (*pvFirstBSS
== NULL
) {
449 *pvFirstBSS
= &(pMgmt
->sBSSList
[ii
]);
453 *puBSSCount
= uCount
;
461 IN PVOID pMgmtHandle
,
462 IN PVOID pvCurrentBSS
,
466 PKnownBSS pBSS
= (PKnownBSS
) pvCurrentBSS
;
467 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
471 while (*pvNextBSS
== NULL
) {
473 if (pBSS
> &(pMgmt
->sBSSList
[MAX_BSS_NUM
])) {
476 if (pBSS
->bActive
== TRUE
) {
490 * Update Tx attemps, Tx failure counter in Node DB
500 VNTWIFIvUpdateNodeTxCounter(
501 IN PVOID pMgmtHandle
,
502 IN PBYTE pbyDestAddress
,
505 IN PBYTE pbyTxFailCount
508 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
512 if ((pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) ||
513 (pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
)) {
514 if (BSSDBbIsSTAInNodeDB(pMgmt
, pbyDestAddress
, &uNodeIndex
) == FALSE
) {
518 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxAttempts
++;
520 // transmit success, TxAttempts at least plus one
521 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxOk
[MAX_RATE
]++;
522 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxOk
[wRate
]++;
524 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFailures
++;
526 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxRetry
+= pbyTxFailCount
[MAX_RATE
];
527 for(ii
=0;ii
<MAX_RATE
;ii
++) {
528 pMgmt
->sNodeDBTable
[uNodeIndex
].uTxFail
[ii
] += pbyTxFailCount
[ii
];
536 IN PVOID pMgmtHandle
,
537 IN PBYTE pbyDestAddress
,
538 OUT PWORD pwTxDataRate
,
539 OUT PBYTE pbyACKRate
,
540 OUT PBYTE pbyCCKBasicRate
,
541 OUT PBYTE pbyOFDMBasicRate
544 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
546 WORD wTxDataRate
= RATE_1M
;
547 BYTE byACKRate
= RATE_1M
;
548 BYTE byCCKBasicRate
= RATE_1M
;
549 BYTE byOFDMBasicRate
= RATE_24M
;
550 PWLAN_IE_SUPP_RATES pSupportRateIEs
= NULL
;
551 PWLAN_IE_SUPP_RATES pExtSupportRateIEs
= NULL
;
554 if ((pMgmt
->eCurrMode
== WMAC_MODE_IBSS_STA
) ||
555 (pMgmt
->eCurrMode
== WMAC_MODE_ESS_AP
)) {
556 // Adhoc Tx rate decided from node DB
557 if(BSSDBbIsSTAInNodeDB(pMgmt
, pbyDestAddress
, &uNodeIndex
)) {
558 wTxDataRate
= (pMgmt
->sNodeDBTable
[uNodeIndex
].wTxDataRate
);
559 pSupportRateIEs
= (PWLAN_IE_SUPP_RATES
) (pMgmt
->sNodeDBTable
[uNodeIndex
].abyCurrSuppRates
);
560 pExtSupportRateIEs
= (PWLAN_IE_SUPP_RATES
) (pMgmt
->sNodeDBTable
[uNodeIndex
].abyCurrExtSuppRates
);
562 if (pMgmt
->eCurrentPHYMode
!= PHY_TYPE_11A
) {
563 wTxDataRate
= RATE_2M
;
565 wTxDataRate
= RATE_24M
;
567 pSupportRateIEs
= (PWLAN_IE_SUPP_RATES
) pMgmt
->abyCurrSuppRates
;
568 pExtSupportRateIEs
= (PWLAN_IE_SUPP_RATES
) pMgmt
->abyCurrExtSuppRates
;
570 } else { // Infrastructure: rate decided from AP Node, index = 0
572 wTxDataRate
= (pMgmt
->sNodeDBTable
[0].wTxDataRate
);
574 printk("GetTxRate:AP MAC is %02x:%02x:%02x:%02x:%02x:%02x,TxRate is %d\n",
575 pMgmt
->sNodeDBTable
[0].abyMACAddr
[0],pMgmt
->sNodeDBTable
[0].abyMACAddr
[1],
576 pMgmt
->sNodeDBTable
[0].abyMACAddr
[2],pMgmt
->sNodeDBTable
[0].abyMACAddr
[3],
577 pMgmt
->sNodeDBTable
[0].abyMACAddr
[4],pMgmt
->sNodeDBTable
[0].abyMACAddr
[5],wTxDataRate
);
581 pSupportRateIEs
= (PWLAN_IE_SUPP_RATES
) pMgmt
->abyCurrSuppRates
;
582 pExtSupportRateIEs
= (PWLAN_IE_SUPP_RATES
) pMgmt
->abyCurrExtSuppRates
;
584 byACKRate
= VNTWIFIbyGetACKTxRate( (BYTE
) wTxDataRate
,
588 if (byACKRate
> (BYTE
) wTxDataRate
) {
589 byACKRate
= (BYTE
) wTxDataRate
;
591 byCCKBasicRate
= VNTWIFIbyGetACKTxRate( RATE_11M
,
595 byOFDMBasicRate
= VNTWIFIbyGetACKTxRate(RATE_54M
,
599 *pwTxDataRate
= wTxDataRate
;
600 *pbyACKRate
= byACKRate
;
601 *pbyCCKBasicRate
= byCCKBasicRate
;
602 *pbyOFDMBasicRate
= byOFDMBasicRate
;
607 VNTWIFIbyGetKeyCypher(
608 IN PVOID pMgmtHandle
,
612 PSMgmtObject pMgmt
= (PSMgmtObject
)pMgmtHandle
;
614 if (bGroupKey
== TRUE
) {
615 return (pMgmt
->byCSSGK
);
617 return (pMgmt
->byCSSPK
);
625 IN PVOID pAdapterHandler,
626 OUT PVOID *pMgmtHandler
630 PSMgmtObject pMgmt = NULL;
634 pMgmt = (PSMgmtObject)kmalloc(sizeof(SMgmtObject), (int)GFP_ATOMIC);
636 *pMgmtHandler = NULL;
640 memset(pMgmt, 0, sizeof(SMgmtObject));
641 pMgmt->pAdapter = (PVOID) pAdapterHandler;
643 // should initial MAC address abyMACAddr
644 for(ii=0;ii<WLAN_BSSID_LEN;ii++) {
645 pMgmt->abyDesireBSSID[ii] = 0xFF;
647 pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
648 pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
649 pMgmt->byCSSPK = KEY_CTL_NONE;
650 pMgmt->byCSSGK = KEY_CTL_NONE;
651 pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
653 pMgmt->cbFreeCmdQueue = CMD_Q_SIZE;
654 pMgmt->uCmdDequeueIdx = 0;
655 pMgmt->uCmdEnqueueIdx = 0;
656 pMgmt->eCommandState = WLAN_CMD_STATE_IDLE;
657 pMgmt->bCmdStop = FALSE;
658 pMgmt->bCmdRunning = FALSE;
660 *pMgmtHandler = pMgmt;
668 VNTWIFIbSetPMKIDCache (
669 IN PVOID pMgmtObject
,
674 PSMgmtObject pMgmt
= (PSMgmtObject
) pMgmtObject
;
676 if (ulCount
> MAX_PMKID_CACHE
) {
679 pMgmt
->gsPMKIDCache
.BSSIDInfoCount
= ulCount
;
680 MEMvCopy(pMgmt
->gsPMKIDCache
.BSSIDInfo
, pPMKIDInfo
, (ulCount
*sizeof(PMKIDInfo
)));
687 VNTWIFIwGetMaxSupportRate(
691 WORD wRate
= RATE_54M
;
692 PSMgmtObject pMgmt
= (PSMgmtObject
) pMgmtObject
;
694 for(wRate
= RATE_54M
; wRate
> RATE_1M
; wRate
--) {
695 if (BITbIsBitOn(pMgmt
->sNodeDBTable
[0].wSuppRate
, (1<<wRate
))) {
699 if (pMgmt
->eCurrentPHYMode
== PHY_TYPE_11A
) {
709 IN PVOID pMgmtObject
,
713 PSMgmtObject pMgmt
= (PSMgmtObject
) pMgmtObject
;
715 pMgmt
->b11hEnable
= b11hEnable
;
719 VNTWIFIbMeasureReport(
720 IN PVOID pMgmtObject
,
721 IN BOOL bEndOfReport
,
722 IN PVOID pvMeasureEID
,
723 IN BYTE byReportMode
,
725 IN BYTE byCCAFraction
,
729 PSMgmtObject pMgmt
= (PSMgmtObject
) pMgmtObject
;
730 PBYTE pbyCurrentEID
= (PBYTE
) (pMgmt
->pCurrMeasureEIDRep
);
732 //spin_lock_irq(&pDevice->lock);
733 if ((pvMeasureEID
!= NULL
) &&
734 (pMgmt
->uLengthOfRepEIDs
< (WLAN_A3FR_MAXLEN
- sizeof(MEASEURE_REP
) - sizeof(WLAN_80211HDR_A3
) - 3))
736 pMgmt
->pCurrMeasureEIDRep
->byElementID
= WLAN_EID_MEASURE_REP
;
737 pMgmt
->pCurrMeasureEIDRep
->len
= 3;
738 pMgmt
->pCurrMeasureEIDRep
->byToken
= ((PWLAN_IE_MEASURE_REQ
) pvMeasureEID
)->byToken
;
739 pMgmt
->pCurrMeasureEIDRep
->byMode
= byReportMode
;
740 pMgmt
->pCurrMeasureEIDRep
->byType
= ((PWLAN_IE_MEASURE_REQ
) pvMeasureEID
)->byType
;
741 switch (pMgmt
->pCurrMeasureEIDRep
->byType
) {
742 case MEASURE_TYPE_BASIC
:
743 pMgmt
->pCurrMeasureEIDRep
->len
+= sizeof(MEASEURE_REP_BASIC
);
744 MEMvCopy( &(pMgmt
->pCurrMeasureEIDRep
->sRep
.sBasic
),
745 &(((PWLAN_IE_MEASURE_REQ
) pvMeasureEID
)->sReq
),
746 sizeof(MEASEURE_REQ
));
747 pMgmt
->pCurrMeasureEIDRep
->sRep
.sBasic
.byMap
= byBasicMap
;
749 case MEASURE_TYPE_CCA
:
750 pMgmt
->pCurrMeasureEIDRep
->len
+= sizeof(MEASEURE_REP_CCA
);
751 MEMvCopy( &(pMgmt
->pCurrMeasureEIDRep
->sRep
.sCCA
),
752 &(((PWLAN_IE_MEASURE_REQ
) pvMeasureEID
)->sReq
),
753 sizeof(MEASEURE_REQ
));
754 pMgmt
->pCurrMeasureEIDRep
->sRep
.sCCA
.byCCABusyFraction
= byCCAFraction
;
756 case MEASURE_TYPE_RPI
:
757 pMgmt
->pCurrMeasureEIDRep
->len
+= sizeof(MEASEURE_REP_RPI
);
758 MEMvCopy( &(pMgmt
->pCurrMeasureEIDRep
->sRep
.sRPI
),
759 &(((PWLAN_IE_MEASURE_REQ
) pvMeasureEID
)->sReq
),
760 sizeof(MEASEURE_REQ
));
761 MEMvCopy(pMgmt
->pCurrMeasureEIDRep
->sRep
.sRPI
.abyRPIdensity
, pbyRPIs
, 8);
766 pbyCurrentEID
+= (2 + pMgmt
->pCurrMeasureEIDRep
->len
);
767 pMgmt
->uLengthOfRepEIDs
+= (2 + pMgmt
->pCurrMeasureEIDRep
->len
);
768 pMgmt
->pCurrMeasureEIDRep
= (PWLAN_IE_MEASURE_REP
) pbyCurrentEID
;
770 if (bEndOfReport
== TRUE
) {
771 IEEE11hbMSRRepTx(pMgmt
);
773 //spin_unlock_irq(&pDevice->lock);
779 VNTWIFIbChannelSwitch(
780 IN PVOID pMgmtObject
,
784 PSMgmtObject pMgmt
= (PSMgmtObject
) pMgmtObject
;
786 //spin_lock_irq(&pDevice->lock);
787 pMgmt
->uCurrChannel
= byNewChannel
;
788 pMgmt
->bSwitchChannel
= FALSE
;
789 //spin_unlock_irq(&pDevice->lock);
795 VNTWIFIbRadarPresent(
796 IN PVOID pMgmtObject,
800 PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
801 if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
802 (byChannel == (BYTE) pMgmt->uCurrChannel) &&
803 (pMgmt->bSwitchChannel != TRUE) &&
804 (pMgmt->b11hEnable == TRUE)) {
805 if (IS_ETH_ADDRESS_EQUAL(pMgmt->abyIBSSDFSOwner, CARDpGetCurrentAddress(pMgmt->pAdapter))) {
806 pMgmt->byNewChannel = CARDbyAutoChannelSelect(pMgmt->pAdapter,(BYTE) pMgmt->uCurrChannel);
807 pMgmt->bSwitchChannel = TRUE;
809 BEACONbSendBeacon(pMgmt);
810 CARDbChannelSwitch(pMgmt->pAdapter, 0, pMgmt->byNewChannel, 10);