cmm_data.c
来自「ralink最新rt3070 usb wifi 无线网卡驱动程序」· C语言 代码 · 共 2,434 行 · 第 1/5 页
C
2,434 行
IN PRTMP_ADAPTER pAd, IN PTXD_STRUC pTxD, IN BOOLEAN bWIV, IN UCHAR QueueSEL){ // // Always use Long preamble before verifiation short preamble functionality works well. // Todo: remove the following line if short preamble functionality works // OPSTATUS_CLEAR_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED); pTxD->WIV = (bWIV) ? 1: 0; pTxD->QSEL= (QueueSEL); if (pAd->bGenOneHCCA == TRUE) pTxD->QSEL= FIFO_HCCA; pTxD->DMADONE = 0;}// should be called only when -// 1. MEADIA_CONNECTED// 2. AGGREGATION_IN_USED// 3. Fragmentation not in used// 4. either no previous frame (pPrevAddr1=NULL) .OR. previoud frame is aggregatibleBOOLEAN TxFrameIsAggregatible( IN PRTMP_ADAPTER pAd, IN PUCHAR pPrevAddr1, IN PUCHAR p8023hdr){ // can't aggregate EAPOL (802.1x) frame if ((p8023hdr[12] == 0x88) && (p8023hdr[13] == 0x8e)) return FALSE; // can't aggregate multicast/broadcast frame if (p8023hdr[0] & 0x01) return FALSE; if (INFRA_ON(pAd)) // must be unicast to AP return TRUE; else if ((pPrevAddr1 == NULL) || MAC_ADDR_EQUAL(pPrevAddr1, p8023hdr)) // unicast to same STA return TRUE; else return FALSE;}/* ======================================================================== Routine Description: Check the MSDU Aggregation policy 1.HT aggregation is A-MSDU 2.legaacy rate aggregation is software aggregation by Ralink. Arguments: Return Value: Note: ========================================================================*/BOOLEAN PeerIsAggreOn( IN PRTMP_ADAPTER pAd, IN ULONG TxRate, IN PMAC_TABLE_ENTRY pMacEntry){ ULONG AFlags = (fCLIENT_STATUS_AMSDU_INUSED | fCLIENT_STATUS_AGGREGATION_CAPABLE); if (pMacEntry != NULL && CLIENT_STATUS_TEST_FLAG(pMacEntry, AFlags)) { #ifdef DOT11_N_SUPPORT if (pMacEntry->HTPhyMode.field.MODE >= MODE_HTMIX) { return TRUE; }#endif // DOT11_N_SUPPORT //#ifdef AGGREGATION_SUPPORT if (TxRate >= RATE_6 && pAd->CommonCfg.bAggregationCapable && (!(OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_WMM_INUSED) && CLIENT_STATUS_TEST_FLAG(pMacEntry, fCLIENT_STATUS_WMM_CAPABLE)))) { // legacy Ralink Aggregation support return TRUE; }#endif // AGGREGATION_SUPPORT // } return FALSE; }/* ======================================================================== Routine Description: Check and fine the packet waiting in SW queue with highest priority Arguments: pAd Pointer to our adapter Return Value: pQueue Pointer to Waiting Queue IRQL = DISPATCH_LEVEL Note: ========================================================================*/PQUEUE_HEADER RTMPCheckTxSwQueue( IN PRTMP_ADAPTER pAd, OUT PUCHAR pQueIdx){ ULONG Number; // 2004-11-15 to be removed. test aggregation only// if ((OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_AGGREGATION_INUSED)) && (*pNumber < 2))// return NULL; Number = pAd->TxSwQueue[QID_AC_BK].Number + pAd->TxSwQueue[QID_AC_BE].Number + pAd->TxSwQueue[QID_AC_VI].Number + pAd->TxSwQueue[QID_AC_VO].Number + pAd->TxSwQueue[QID_HCCA].Number; if (pAd->TxSwQueue[QID_AC_VO].Head != NULL) { *pQueIdx = QID_AC_VO; return (&pAd->TxSwQueue[QID_AC_VO]); } 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; } //printk("%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); 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); 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)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?