📄 vntwifi.c
字号:
*
* Description:
* Clear BSS List Database except current assoc BSS
*
* Parameters:
* In:
* pMgmtHandle - Management Object structure
* bLinkPass - Current Link status
* Out:
*
* Return Value: None.
*
-*/
/*+
*
* Description:
* Query BSS List in management database
*
* Parameters:
* In:
* pMgmtHandle - Management Object structure
* Out:
* puBSSCount - BSS count
* pvFirstBSS - pointer to first BSS
*
* Return Value: None.
*
-*/
VOID
VNTWIFIvQueryBSSList (
IN PVOID pMgmtHandle,
OUT PUINT puBSSCount,
OUT PVOID *pvFirstBSS
)
{
UINT ii = 0;
PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
PKnownBSS pBSS = NULL;
UINT uCount = 0;
*pvFirstBSS = NULL;
for (ii = 0; ii < MAX_BSS_NUM; ii++) {
pBSS = &(pMgmt->sBSSList[ii]);
if (!pBSS->bActive) {
continue;
}
if (*pvFirstBSS == NULL) {
*pvFirstBSS = &(pMgmt->sBSSList[ii]);
}
uCount++;
}
*puBSSCount = uCount;
}
VOID
VNTWIFIvGetNextBSS (
IN PVOID pMgmtHandle,
IN PVOID pvCurrentBSS,
OUT PVOID *pvNextBSS
)
{
PKnownBSS pBSS = (PKnownBSS) pvCurrentBSS;
PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
*pvNextBSS = NULL;
while (*pvNextBSS == NULL) {
pBSS++;
if (pBSS > &(pMgmt->sBSSList[MAX_BSS_NUM])) {
return;
}
if (pBSS->bActive == TRUE) {
*pvNextBSS = pBSS;
return;
}
}
}
/*+
*
* Description:
* Update Tx attemps, Tx failure counter in Node DB
*
* In:
* Out:
* none
*
* Return Value: none
*
-*/
VOID
VNTWIFIvUpdateNodeTxCounter(
IN PVOID pMgmtHandle,
IN PBYTE pbyDestAddress,
IN BOOL bTxOk,
IN WORD wRate,
IN PBYTE pbyTxFailCount
)
{
PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
UINT uNodeIndex = 0;
UINT ii;
if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
if (BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex) == FALSE) {
return;
}
}
pMgmt->sNodeDBTable[uNodeIndex].uTxAttempts++;
if (bTxOk == TRUE) {
// transmit success, TxAttempts at least plus one
pMgmt->sNodeDBTable[uNodeIndex].uTxOk[MAX_RATE]++;
pMgmt->sNodeDBTable[uNodeIndex].uTxOk[wRate]++;
} else {
pMgmt->sNodeDBTable[uNodeIndex].uTxFailures++;
}
pMgmt->sNodeDBTable[uNodeIndex].uTxRetry += pbyTxFailCount[MAX_RATE];
for(ii=0;ii<MAX_RATE;ii++) {
pMgmt->sNodeDBTable[uNodeIndex].uTxFail[ii] += pbyTxFailCount[ii];
}
return;
}
VOID
VNTWIFIvGetTxRate(
IN PVOID pMgmtHandle,
IN PBYTE pbyDestAddress,
OUT PWORD pwTxDataRate,
OUT PBYTE pbyACKRate,
OUT PBYTE pbyCCKBasicRate,
OUT PBYTE pbyOFDMBasicRate
)
{
PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
UINT uNodeIndex = 0;
WORD wTxDataRate = RATE_1M;
BYTE byACKRate = RATE_1M;
BYTE byCCKBasicRate = RATE_1M;
BYTE byOFDMBasicRate = RATE_24M;
PWLAN_IE_SUPP_RATES pSupportRateIEs = NULL;
PWLAN_IE_SUPP_RATES pExtSupportRateIEs = NULL;
if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) ||
(pMgmt->eCurrMode == WMAC_MODE_ESS_AP)) {
// Adhoc Tx rate decided from node DB
if(BSSDBbIsSTAInNodeDB(pMgmt, pbyDestAddress, &uNodeIndex)) {
wTxDataRate = (pMgmt->sNodeDBTable[uNodeIndex].wTxDataRate);
pSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrSuppRates);
pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) (pMgmt->sNodeDBTable[uNodeIndex].abyCurrExtSuppRates);
} else {
if (pMgmt->eCurrentPHYMode != PHY_TYPE_11A) {
wTxDataRate = RATE_2M;
} else {
wTxDataRate = RATE_24M;
}
pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
}
} else { // Infrastructure: rate decided from AP Node, index = 0
wTxDataRate = (pMgmt->sNodeDBTable[0].wTxDataRate);
pSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrSuppRates;
pExtSupportRateIEs = (PWLAN_IE_SUPP_RATES) pMgmt->abyCurrExtSuppRates;
}
byACKRate = VNTWIFIbyGetACKTxRate( (BYTE) wTxDataRate,
pSupportRateIEs,
pExtSupportRateIEs
);
if (byACKRate > (BYTE) wTxDataRate) {
byACKRate = (BYTE) wTxDataRate;
}
byCCKBasicRate = VNTWIFIbyGetACKTxRate( RATE_11M,
pSupportRateIEs,
pExtSupportRateIEs
);
byOFDMBasicRate = VNTWIFIbyGetACKTxRate(RATE_54M,
pSupportRateIEs,
pExtSupportRateIEs
);
*pwTxDataRate = wTxDataRate;
*pbyACKRate = byACKRate;
*pbyCCKBasicRate = byCCKBasicRate;
*pbyOFDMBasicRate = byOFDMBasicRate;
return;
}
BYTE
VNTWIFIbyGetKeyCypher(
IN PVOID pMgmtHandle,
IN BOOL bGroupKey
)
{
PSMgmtObject pMgmt = (PSMgmtObject)pMgmtHandle;
if (bGroupKey == TRUE) {
return (pMgmt->byCSSGK);
} else {
return (pMgmt->byCSSPK);
}
}
/*
BOOL
VNTWIFIbInit(
IN PVOID pAdapterHandler,
OUT PVOID *pMgmtHandler
)
{
PSMgmtObject pMgmt = NULL;
UINT ii;
pMgmt = (PSMgmtObject)kmalloc(sizeof(SMgmtObject), (int)GFP_ATOMIC);
if (pMgmt == NULL) {
*pMgmtHandler = NULL;
return FALSE;
}
memset(pMgmt, 0, sizeof(SMgmtObject));
pMgmt->pAdapter = (PVOID) pAdapterHandler;
// should initial MAC address abyMACAddr
for(ii=0;ii<WLAN_BSSID_LEN;ii++) {
pMgmt->abyDesireBSSID[ii] = 0xFF;
}
pMgmt->pbyPSPacketPool = &pMgmt->byPSPacketPool[0];
pMgmt->pbyMgmtPacketPool = &pMgmt->byMgmtPacketPool[0];
pMgmt->byCSSPK = KEY_CTL_NONE;
pMgmt->byCSSGK = KEY_CTL_NONE;
pMgmt->wIBSSBeaconPeriod = DEFAULT_IBSS_BI;
pMgmt->cbFreeCmdQueue = CMD_Q_SIZE;
pMgmt->uCmdDequeueIdx = 0;
pMgmt->uCmdEnqueueIdx = 0;
pMgmt->eCommandState = WLAN_CMD_STATE_IDLE;
pMgmt->bCmdStop = FALSE;
pMgmt->bCmdRunning = FALSE;
*pMgmtHandler = pMgmt;
return TRUE;
}
*/
BOOL
VNTWIFIbSetPMKIDCache (
IN PVOID pMgmtObject,
IN ULONG ulCount,
IN PVOID pPMKIDInfo
)
{
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
if (ulCount > MAX_PMKID_CACHE) {
return (FALSE);
}
pMgmt->gsPMKIDCache.BSSIDInfoCount = ulCount;
MEMvCopy(pMgmt->gsPMKIDCache.BSSIDInfo, pPMKIDInfo, (ulCount*sizeof(PMKIDInfo)));
return (TRUE);
}
WORD
VNTWIFIwGetMaxSupportRate(
IN PVOID pMgmtObject
)
{
WORD wRate = RATE_54M;
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
for(wRate = RATE_54M; wRate > RATE_1M; wRate--) {
if (BITbIsBitOn(pMgmt->sNodeDBTable[0].wSuppRate, (1<<wRate))) {
return (wRate);
}
}
if (pMgmt->eCurrentPHYMode == PHY_TYPE_11A) {
return (RATE_6M);
} else {
return (RATE_1M);
}
}
VOID
VNTWIFIvSet11h (
IN PVOID pMgmtObject,
IN BOOL b11hEnable
)
{
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
pMgmt->b11hEnable = b11hEnable;
}
BOOL
VNTWIFIbMeasureReport(
IN PVOID pMgmtObject,
IN BOOL bEndOfReport,
IN PVOID pvMeasureEID,
IN BYTE byReportMode,
IN BYTE byBasicMap,
IN BYTE byCCAFraction,
IN PBYTE pbyRPIs
)
{
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
PBYTE pbyCurrentEID = (PBYTE) (pMgmt->pCurrMeasureEIDRep);
//spin_lock_irq(&pDevice->lock);
if ((pvMeasureEID != NULL) &&
(pMgmt->uLengthOfRepEIDs < (WLAN_A3FR_MAXLEN - sizeof(MEASEURE_REP) - sizeof(WLAN_80211HDR_A3) - 3))
) {
pMgmt->pCurrMeasureEIDRep->byElementID = WLAN_EID_MEASURE_REP;
pMgmt->pCurrMeasureEIDRep->len = 3;
pMgmt->pCurrMeasureEIDRep->byToken = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byToken;
pMgmt->pCurrMeasureEIDRep->byMode = byReportMode;
pMgmt->pCurrMeasureEIDRep->byType = ((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->byType;
switch (pMgmt->pCurrMeasureEIDRep->byType) {
case MEASURE_TYPE_BASIC :
pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_BASIC);
MEMvCopy( &(pMgmt->pCurrMeasureEIDRep->sRep.sBasic),
&(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
sizeof(MEASEURE_REQ));
pMgmt->pCurrMeasureEIDRep->sRep.sBasic.byMap = byBasicMap;
break;
case MEASURE_TYPE_CCA :
pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_CCA);
MEMvCopy( &(pMgmt->pCurrMeasureEIDRep->sRep.sCCA),
&(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
sizeof(MEASEURE_REQ));
pMgmt->pCurrMeasureEIDRep->sRep.sCCA.byCCABusyFraction = byCCAFraction;
break;
case MEASURE_TYPE_RPI :
pMgmt->pCurrMeasureEIDRep->len += sizeof(MEASEURE_REP_RPI);
MEMvCopy( &(pMgmt->pCurrMeasureEIDRep->sRep.sRPI),
&(((PWLAN_IE_MEASURE_REQ) pvMeasureEID)->sReq),
sizeof(MEASEURE_REQ));
MEMvCopy(pMgmt->pCurrMeasureEIDRep->sRep.sRPI.abyRPIdensity, pbyRPIs, 8);
break;
default :
break;
}
pbyCurrentEID += (2 + pMgmt->pCurrMeasureEIDRep->len);
pMgmt->uLengthOfRepEIDs += (2 + pMgmt->pCurrMeasureEIDRep->len);
pMgmt->pCurrMeasureEIDRep = (PWLAN_IE_MEASURE_REP) pbyCurrentEID;
}
if (bEndOfReport == TRUE) {
IEEE11hbMSRRepTx(pMgmt);
}
//spin_unlock_irq(&pDevice->lock);
return (TRUE);
}
BOOL
VNTWIFIbChannelSwitch(
IN PVOID pMgmtObject,
IN BYTE byNewChannel
)
{
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
//spin_lock_irq(&pDevice->lock);
pMgmt->uCurrChannel = byNewChannel;
pMgmt->bSwitchChannel = FALSE;
//spin_unlock_irq(&pDevice->lock);
return TRUE;
}
/*
BOOL
VNTWIFIbRadarPresent(
IN PVOID pMgmtObject,
IN BYTE byChannel
)
{
PSMgmtObject pMgmt = (PSMgmtObject) pMgmtObject;
if ((pMgmt->eCurrMode == WMAC_MODE_IBSS_STA) &&
(byChannel == (BYTE) pMgmt->uCurrChannel) &&
(pMgmt->bSwitchChannel != TRUE) &&
(pMgmt->b11hEnable == TRUE)) {
if (IS_ETH_ADDRESS_EQUAL(pMgmt->abyIBSSDFSOwner, CARDpGetCurrentAddress(pMgmt->pAdapter))) {
pMgmt->byNewChannel = CARDbyAutoChannelSelect(pMgmt->pAdapter,(BYTE) pMgmt->uCurrChannel);
pMgmt->bSwitchChannel = TRUE;
}
BEACONbSendBeacon(pMgmt);
CARDbChannelSwitch(pMgmt->pAdapter, 0, pMgmt->byNewChannel, 10);
}
return TRUE;
}
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -