📄 cmm_data.c
字号:
else if (pAd->TxSwQueue[QID_AC_VI].Head != NULL) { *pQueIdx = QID_AC_VI; return (&pAd->TxSwQueue[QID_AC_VI]); } else if (pAd->TxSwQueue[QID_AC_BE].Head != NULL) { *pQueIdx = QID_AC_BE; return (&pAd->TxSwQueue[QID_AC_BE]); } else if (pAd->TxSwQueue[QID_AC_BK].Head != NULL) { *pQueIdx = QID_AC_BK; return (&pAd->TxSwQueue[QID_AC_BK]); } else if (pAd->TxSwQueue[QID_HCCA].Head != NULL) { *pQueIdx = QID_HCCA; return (&pAd->TxSwQueue[QID_HCCA]); } // No packet pending in Tx Sw queue *pQueIdx = QID_AC_BK; return (NULL);}/* ======================================================================== Routine Description: Suspend MSDU transmission Arguments: pAd Pointer to our adapter Return Value: None Note: ========================================================================*/VOID RTMPSuspendMsduTransmission( IN PRTMP_ADAPTER pAd){ DBGPRINT(RT_DEBUG_TRACE,("SCANNING, suspend MSDU transmission ...\n")); // // Before BSS_SCAN_IN_PROGRESS, we need to keep Current R66 value and // use Lowbound as R66 value on ScanNextChannel(...) // RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R66, &pAd->BbpTuning.R66CurrentValue); // set BBP_R66 to 0x30/0x40 when scanning (AsicSwitchChannel will set R66 according to channel when scanning) //RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, (0x26 + GET_LNA_GAIN(pAd))); RTMPSetAGCInitValue(pAd, BW_20); RTMP_SET_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS); //RTMP_IO_WRITE32(pAd, TX_CNTL_CSR, 0x000f0000); // abort all TX rings}/* ======================================================================== Routine Description: Resume MSDU transmission Arguments: pAd Pointer to our adapter Return Value: None IRQL = DISPATCH_LEVEL Note: ========================================================================*/VOID RTMPResumeMsduTransmission( IN PRTMP_ADAPTER pAd){// UCHAR IrqState; DBGPRINT(RT_DEBUG_TRACE,("SCAN done, resume MSDU transmission ...\n")); // After finish BSS_SCAN_IN_PROGRESS, we need to restore Current R66 value // R66 should not be 0 if (pAd->BbpTuning.R66CurrentValue == 0) { pAd->BbpTuning.R66CurrentValue = 0x38; DBGPRINT_ERR(("RTMPResumeMsduTransmission, R66CurrentValue=0...\n")); } RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R66, pAd->BbpTuning.R66CurrentValue); RTMP_CLEAR_FLAG(pAd, fRTMP_ADAPTER_BSS_SCAN_IN_PROGRESS);// sample, for IRQ LOCK to SEM LOCK// IrqState = pAd->irq_disabled;// if (IrqState)// RTMPDeQueuePacket(pAd, TRUE, NUM_OF_TX_RING, MAX_TX_PROCESS);// else RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, MAX_TX_PROCESS);}UINT deaggregate_AMSDU_announce( IN PRTMP_ADAPTER pAd, PNDIS_PACKET pPacket, IN PUCHAR pData, IN ULONG DataSize){ USHORT PayloadSize; USHORT SubFrameSize; PHEADER_802_3 pAMSDUsubheader; UINT nMSDU; UCHAR Header802_3[14]; PUCHAR pPayload, pDA, pSA, pRemovedLLCSNAP; PNDIS_PACKET pClonePacket; nMSDU = 0; while (DataSize > LENGTH_802_3) { nMSDU++; //hex_dump("subheader", pData, 64); pAMSDUsubheader = (PHEADER_802_3)pData; //pData += LENGTH_802_3; PayloadSize = pAMSDUsubheader->Octet[1] + (pAMSDUsubheader->Octet[0]<<8); SubFrameSize = PayloadSize + LENGTH_802_3; if ((DataSize < SubFrameSize) || (PayloadSize > 1518 )) { break; } //DBGPRINT(RT_DEBUG_TRACE,("%d subframe: Size = %d\n", nMSDU, PayloadSize)); pPayload = pData + LENGTH_802_3; pDA = pData; pSA = pData + MAC_ADDR_LEN; // convert to 802.3 header CONVERT_TO_802_3(Header802_3, pDA, pSA, pPayload, PayloadSize, pRemovedLLCSNAP);#ifdef CONFIG_STA_SUPPORT if ((Header802_3[12] == 0x88) && (Header802_3[13] == 0x8E) ) { /* avoid local heap overflow, use dyanamic allocation */ MLME_QUEUE_ELEM *Elem = (MLME_QUEUE_ELEM *) kmalloc(sizeof(MLME_QUEUE_ELEM), MEM_ALLOC_FLAG); if (Elem != NULL) { memmove(Elem->Msg+(LENGTH_802_11 + LENGTH_802_1_H), pPayload, PayloadSize); Elem->MsgLen = LENGTH_802_11 + LENGTH_802_1_H + PayloadSize; //WpaEAPOLKeyAction(pAd, Elem); REPORT_MGMT_FRAME_TO_MLME(pAd, BSSID_WCID, Elem->Msg, Elem->MsgLen, 0, 0, 0, 0); kfree(Elem); } }#endif // CONFIG_STA_SUPPORT //#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { if (pRemovedLLCSNAP) { pPayload -= LENGTH_802_3; PayloadSize += LENGTH_802_3; NdisMoveMemory(pPayload, &Header802_3[0], LENGTH_802_3); } }#endif // CONFIG_STA_SUPPORT // pClonePacket = ClonePacket(pAd, pPacket, pPayload, PayloadSize); if (pClonePacket) {#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) ANNOUNCE_OR_FORWARD_802_3_PACKET(pAd, pClonePacket, RTMP_GET_PACKET_IF(pPacket));#endif // CONFIG_STA_SUPPORT // } // A-MSDU has padding to multiple of 4 including subframe header. // align SubFrameSize up to multiple of 4 SubFrameSize = (SubFrameSize+3)&(~0x3); if (SubFrameSize > 1528 || SubFrameSize < 32) { break; } if (DataSize > SubFrameSize) { pData += SubFrameSize; DataSize -= SubFrameSize; } else { // end of A-MSDU DataSize = 0; } } // finally release original rx packet RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_SUCCESS); return nMSDU;}UINT BA_Reorder_AMSDU_Annnounce( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket){ PUCHAR pData; USHORT DataSize; UINT nMSDU = 0; pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); nMSDU = deaggregate_AMSDU_announce(pAd, pPacket, pData, DataSize); return nMSDU;}/* ========================================================================== Description: Look up the MAC address in the MAC table. Return NULL if not found. Return: pEntry - pointer to the MAC entry; NULL is not found ==========================================================================*/MAC_TABLE_ENTRY *MacTableLookup( IN PRTMP_ADAPTER pAd, PUCHAR pAddr){ ULONG HashIdx; MAC_TABLE_ENTRY *pEntry = NULL; HashIdx = MAC_ADDR_HASH_INDEX(pAddr); pEntry = pAd->MacTab.Hash[HashIdx]; while (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsWDS || pEntry->ValidAsApCli || pEntry->ValidAsMesh)) { if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) { break; } else pEntry = pEntry->pNext; } return pEntry;}MAC_TABLE_ENTRY *MacTableInsertEntry( IN PRTMP_ADAPTER pAd, IN PUCHAR pAddr, IN UCHAR apidx, IN BOOLEAN CleanAll){ UCHAR HashIdx; int i, FirstWcid; MAC_TABLE_ENTRY *pEntry = NULL, *pCurrEntry;// USHORT offset;// ULONG addr; // if FULL, return if (pAd->MacTab.Size >= MAX_LEN_OF_MAC_TABLE) return NULL; FirstWcid = 1;#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) if (pAd->StaCfg.BssType == BSS_INFRA) FirstWcid = 2;#endif // CONFIG_STA_SUPPORT // // allocate one MAC entry NdisAcquireSpinLock(&pAd->MacTabLock); for (i = FirstWcid; i< MAX_LEN_OF_MAC_TABLE; i++) // skip entry#0 so that "entry index == AID" for fast lookup { // pick up the first available vacancy if ((pAd->MacTab.Content[i].ValidAsCLI == FALSE) && (pAd->MacTab.Content[i].ValidAsWDS == FALSE) && (pAd->MacTab.Content[i].ValidAsApCli== FALSE) && (pAd->MacTab.Content[i].ValidAsMesh == FALSE)#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT && (pAd->MacTab.Content[i].ValidAsDls == FALSE)#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // ) { pEntry = &pAd->MacTab.Content[i]; if (CleanAll == TRUE) { pEntry->MaxSupportedRate = RATE_11; pEntry->CurrTxRate = RATE_11; NdisZeroMemory(pEntry, sizeof(MAC_TABLE_ENTRY)); pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE; }#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT if (apidx >= MIN_NET_DEVICE_FOR_DLS) { pEntry->ValidAsCLI = FALSE; pEntry->ValidAsWDS = FALSE; pEntry->ValidAsApCli = FALSE; pEntry->ValidAsMesh = FALSE; pEntry->ValidAsDls = TRUE; pEntry->isCached = FALSE; } else#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // {#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { pEntry->ValidAsCLI = TRUE; pEntry->ValidAsWDS = FALSE; pEntry->ValidAsApCli = FALSE; pEntry->ValidAsMesh = FALSE; pEntry->ValidAsDls = FALSE; }#endif // CONFIG_STA_SUPPORT // } pEntry->bIAmBadAtheros = FALSE; pEntry->pAd = pAd; pEntry->CMTimerRunning = FALSE; pEntry->EnqueueEapolStartTimerRunning = EAPOL_START_DISABLE; pEntry->RSNIE_Len = 0; NdisZeroMemory(pEntry->R_Counter, sizeof(pEntry->R_Counter)); pEntry->ReTryCounter = PEER_MSG1_RETRY_TIMER_CTR; if (pEntry->ValidAsMesh) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_MESH); else if (pEntry->ValidAsApCli) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_APCLI); else if (pEntry->ValidAsWDS) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_WDS);#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT else if (pEntry->ValidAsDls) pEntry->apidx = (apidx - MIN_NET_DEVICE_FOR_DLS);#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // else pEntry->apidx = apidx; {#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { pEntry->AuthMode = pAd->StaCfg.AuthMode; pEntry->WepStatus = pAd->StaCfg.WepStatus; pEntry->PrivacyFilter = Ndis802_11PrivFilterAcceptAll; }#endif // CONFIG_STA_SUPPORT // } pEntry->GTKState = REKEY_NEGOTIATING; pEntry->PairwiseKey.KeyLen = 0; pEntry->PairwiseKey.CipherAlg = CIPHER_NONE;#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT if (pEntry->ValidAsDls == TRUE) pEntry->PortSecured = WPA_802_1X_PORT_SECURED; else#endif //QOS_DLS_SUPPORT#endif // CONFIG_STA_SUPPORT // pEntry->PortSecured = WPA_802_1X_PORT_NOT_SECURED; pEntry->PMKID_CacheIdx = ENTRY_NOT_FOUND; COPY_MAC_ADDR(pEntry->Addr, pAddr); pEntry->Sst = SST_NOT_AUTH; pEntry->AuthState = AS_NOT_AUTH; pEntry->Aid = (USHORT)i; //0; pEntry->CapabilityInfo = 0; pEntry->PsMode = PWR_ACTIVE; pEntry->PsQIdleCount = 0; pEntry->NoDataIdleCount = 0; pEntry->AssocDeadLine = MAC_TABLE_ASSOC_TIMEOUT; pEntry->ContinueTxFailCnt = 0;#ifdef WDS_SUPPORT pEntry->LockEntryTx = FALSE; pEntry->TimeStamp_toTxRing = 0;#endif // WDS_SUPPORT // InitializeQueueHeader(&pEntry->PsQueue); pAd->MacTab.Size ++; // Add this entry into ASIC RX WCID search table RTMP_STA_ENTRY_ADD(pAd, pEntry); DBGPRINT(RT_DEBUG_TRACE, ("MacTableInsertEntry - allocate entry #%d, Total= %d\n",i, pAd->MacTab.Size)); break; } } // add this MAC entry into HASH table if (pEntry) { HashIdx = MAC_ADDR_HASH_INDEX(pAddr); if (pAd->MacTab.Hash[HashIdx] == NULL) { pAd->MacTab.Hash[HashIdx] = pEntry; } else { pCurrEntry = pAd->MacTab.Hash[HashIdx]; while (pCurrEntry->pNext != NULL) pCurrEntry = pCurrEntry->pNext; pCurrEntry->pNext = pEntry; } } NdisReleaseSpinLock(&pAd->MacTabLock); return pEntry;}/* ========================================================================== Description: Delete a specified client from MAC table ========================================================================== */BOOLEAN MacTableDeleteEntry( IN PRTMP_ADAPTER pAd, IN USHORT wcid, IN PUCHAR pAddr){ USHORT HashIdx; MAC_TABLE_ENTRY *pEntry, *pPrevEntry, *pProbeEntry; BOOLEAN Cancelled; //USHORT offset; // unused variable //UCHAR j; // unused variable if (wcid >= MAX_LEN_OF_MAC_TABLE) return FALSE; NdisAcquireSpinLock(&pAd->MacTabLock); HashIdx = MAC_ADDR_HASH_INDEX(pAddr); //pEntry = pAd->MacTab.Hash[HashIdx]; pEntry = &pAd->MacTab.Content[wcid]; if (pEntry && (pEntry->ValidAsCLI || pEntry->ValidAsApCli || pEntry->ValidAsWDS || pEntry->ValidAsMesh#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT || pEntry->ValidAsDls#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // )) { if (MAC_ADDR_EQUAL(pEntry->Addr, pAddr)) { // Delete this entry from ASIC on-chip WCID Table RTMP_STA_ENTRY_MAC_RESET(pAd, wcid);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -