📄 cmm_data.c
字号:
if (Rate < RATE_FIRST_OFDM_RATE) // CCK { if ((Rate > RATE_1) && OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SHORT_PREAMBLE_INUSED)) Duration = 96; // 72+24 preamble+plcp else Duration = 192; // 144+48 preamble+plcp Duration += (USHORT)((Size << 4) / RateIdTo500Kbps[Rate]); if ((Size << 4) % RateIdTo500Kbps[Rate]) Duration ++; } else if (Rate <= RATE_LAST_OFDM_RATE)// OFDM rates { Duration = 20 + 6; // 16+4 preamble+plcp + Signal Extension Duration += 4 * (USHORT)((11 + Size * 4) / RateIdTo500Kbps[Rate]); if ((11 + Size * 4) % RateIdTo500Kbps[Rate]) Duration += 4; } else //mimo rate { Duration = 20 + 6; // 16+4 preamble+plcp + Signal Extension } return (USHORT)Duration;}/* ======================================================================== Routine Description: Calculates the duration which is required to transmit out frames with given size and specified rate. Arguments: pTxWI Pointer to head of each MPDU to HW. Ack Setting for Ack requirement bit Fragment Setting for Fragment bit RetryMode Setting for retry mode Ifs Setting for IFS gap Rate Setting for transmit rate Service Setting for service Length Frame length TxPreamble Short or Long preamble when using CCK rates QueIdx - 0-3, according to 802.11e/d4.4 June/2003 Return Value: None IRQL = PASSIVE_LEVEL IRQL = DISPATCH_LEVEL See also : BASmartHardTransmit() !!! ========================================================================*/VOID RTMPWriteTxWI( IN PRTMP_ADAPTER pAd, IN PTXWI_STRUC pOutTxWI, IN BOOLEAN FRAG, IN BOOLEAN CFACK, IN BOOLEAN InsTimestamp, IN BOOLEAN AMPDU, IN BOOLEAN Ack, IN BOOLEAN NSeq, // HW new a sequence. IN UCHAR BASize, IN UCHAR WCID, IN ULONG Length, IN UCHAR PID, IN UCHAR TID, IN UCHAR TxRate, IN UCHAR Txopmode, IN BOOLEAN CfAck, IN HTTRANSMIT_SETTING *pTransmit){ PMAC_TABLE_ENTRY pMac = NULL; TXWI_STRUC TxWI; PTXWI_STRUC pTxWI; if (WCID < MAX_LEN_OF_MAC_TABLE) pMac = &pAd->MacTab.Content[WCID]; // // 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); NdisZeroMemory(&TxWI, TXWI_SIZE); pTxWI = &TxWI; pTxWI->FRAG= FRAG; pTxWI->CFACK = CFACK; pTxWI->TS= InsTimestamp; pTxWI->AMPDU = AMPDU; pTxWI->ACK = Ack; pTxWI->txop= Txopmode; pTxWI->NSEQ = NSeq; // John tune the performace with Intel Client in 20 MHz performance#ifdef DOT11_N_SUPPORT BASize = pAd->CommonCfg.TxBASize; if (pAd->MACVersion == 0x28720200) { if( BASize >13 ) BASize =13; } else { if( BASize >7 ) BASize =7; } pTxWI->BAWinSize = BASize; pTxWI->ShortGI = pTransmit->field.ShortGI; pTxWI->STBC = pTransmit->field.STBC;#endif // DOT11_N_SUPPORT // pTxWI->WirelessCliID = WCID; pTxWI->MPDUtotalByteCount = Length; pTxWI->PacketId = PID; // If CCK or OFDM, BW must be 20 pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3 if (pTxWI->BW) pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT // pTxWI->MCS = pTransmit->field.MCS; pTxWI->PHYMODE = pTransmit->field.MODE; pTxWI->CFACK = CfAck;#ifdef DOT11_N_SUPPORT if (pMac) { if (pAd->CommonCfg.bMIMOPSEnable) { if ((pMac->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7)) { // Dynamic MIMO Power Save Mode pTxWI->MIMOps = 1; } else if (pMac->MmpsMode == MMPS_STATIC) { // Static MIMO Power Save Mode if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7) { pTxWI->MCS = 7; pTxWI->MIMOps = 0; } } } //pTxWI->MIMOps = (pMac->PsMode == PWR_MMPS)? 1:0; if (pMac->bIAmBadAtheros && (pMac->WepStatus != Ndis802_11WEPDisabled)) { pTxWI->MpduDensity = 7; } else { pTxWI->MpduDensity = pMac->MpduDensity; } }#endif // DOT11_N_SUPPORT // pTxWI->PacketId = pTxWI->MCS; NdisMoveMemory(pOutTxWI, &TxWI, sizeof(TXWI_STRUC));}VOID RTMPWriteTxWI_Data( IN PRTMP_ADAPTER pAd, IN OUT PTXWI_STRUC pTxWI, IN TX_BLK *pTxBlk){ HTTRANSMIT_SETTING *pTransmit; PMAC_TABLE_ENTRY pMacEntry;#ifdef DOT11_N_SUPPORT UCHAR BASize;#endif // DOT11_N_SUPPORT // ASSERT(pTxWI); pTransmit = pTxBlk->pTransmit; pMacEntry = pTxBlk->pMacEntry; // // 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); NdisZeroMemory(pTxWI, TXWI_SIZE); pTxWI->FRAG = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAllowFrag); pTxWI->ACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bAckRequired); pTxWI->txop = pTxBlk->FrameGap;#ifdef CONFIG_STA_SUPPORT#ifdef QOS_DLS_SUPPORT if (pMacEntry && (pAd->StaCfg.BssType == BSS_INFRA) && (pMacEntry->ValidAsDls == TRUE)) pTxWI->WirelessCliID = BSSID_WCID; else#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT // pTxWI->WirelessCliID = pTxBlk->Wcid; pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; pTxWI->CFACK = TX_BLK_TEST_FLAG(pTxBlk, fTX_bPiggyBack); // If CCK or OFDM, BW must be 20 pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW);#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3 if (pTxWI->BW) pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);#endif // DOT11N_DRAFT3 // pTxWI->AMPDU = ((pTxBlk->TxFrameType == TX_AMPDU_FRAME) ? TRUE : FALSE); // John tune the performace with Intel Client in 20 MHz performance BASize = pAd->CommonCfg.TxBASize; if((pTxBlk->TxFrameType == TX_AMPDU_FRAME) && (pMacEntry)) { UCHAR RABAOriIdx = 0; //The RA's BA Originator table index. RABAOriIdx = pTxBlk->pMacEntry->BAOriWcidArray[pTxBlk->UserPriority]; BASize = pAd->BATable.BAOriEntry[RABAOriIdx].BAWinSize; } pTxWI->TxBF = pTransmit->field.TxBF; pTxWI->BAWinSize = BASize; pTxWI->ShortGI = pTransmit->field.ShortGI; pTxWI->STBC = pTransmit->field.STBC;#endif // DOT11_N_SUPPORT // pTxWI->MCS = pTransmit->field.MCS; pTxWI->PHYMODE = pTransmit->field.MODE;#ifdef DOT11_N_SUPPORT if (pMacEntry) { if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7)) { // Dynamic MIMO Power Save Mode pTxWI->MIMOps = 1; } else if (pMacEntry->MmpsMode == MMPS_STATIC) { // Static MIMO Power Save Mode if (pTransmit->field.MODE >= MODE_HTMIX && pTransmit->field.MCS > 7) { pTxWI->MCS = 7; pTxWI->MIMOps = 0; } } if (pMacEntry->bIAmBadAtheros && (pMacEntry->WepStatus != Ndis802_11WEPDisabled)) { pTxWI->MpduDensity = 7; } else { pTxWI->MpduDensity = pMacEntry->MpduDensity; } }#endif // DOT11_N_SUPPORT // #ifdef DBG_DIAGNOSE if (pTxBlk->QueIdx== 0) { pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++; pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++; }#endif // DBG_DIAGNOSE // // for rate adapation pTxWI->PacketId = pTxWI->MCS;#ifdef INF_AMAZON_SE/*Iverson patch for WMM A5-T07 ,WirelessStaToWirelessSta do not bulk out aggregate */ if( RTMP_GET_PACKET_NOBULKOUT(pTxBlk->pPacket)) { if(pTxWI->PHYMODE == MODE_CCK) { pTxWI->PacketId = 6; } } #endif // INF_AMAZON_SE // }VOID RTMPWriteTxWI_Cache( IN PRTMP_ADAPTER pAd, IN OUT PTXWI_STRUC pTxWI, IN TX_BLK *pTxBlk){ PHTTRANSMIT_SETTING /*pTxHTPhyMode,*/ pTransmit; PMAC_TABLE_ENTRY pMacEntry; // // update TXWI // pMacEntry = pTxBlk->pMacEntry; pTransmit = pTxBlk->pTransmit; //if (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_TX_RATE_SWITCH_ENABLED)) //if (RTMPCheckEntryEnableAutoRateSwitch(pAd, pMacEntry)) //if (TX_BLK_TEST_FLAG(pTxBlk, fTX_AutoRateSwitch)) if (pMacEntry->bAutoTxRateSwitch) { pTxWI->txop = IFS_HTTXOP; // If CCK or OFDM, BW must be 20 pTxWI->BW = (pTransmit->field.MODE <= MODE_OFDM) ? (BW_20) : (pTransmit->field.BW); pTxWI->ShortGI = pTransmit->field.ShortGI; pTxWI->STBC = pTransmit->field.STBC; pTxWI->MCS = pTransmit->field.MCS; pTxWI->PHYMODE = pTransmit->field.MODE; // set PID for TxRateSwitching pTxWI->PacketId = pTransmit->field.MCS; }#ifdef DOT11_N_SUPPORT pTxWI->AMPDU = ((pMacEntry->NoBADataCountDown == 0) ? TRUE: FALSE); pTxWI->MIMOps = 0;#ifdef DOT11N_DRAFT3 if (pTxWI->BW) pTxWI->BW = (pAd->CommonCfg.AddHTInfo.AddHtInfo.RecomWidth == 0) ? (BW_20) : (pTransmit->field.BW);#endif // DOT11N_DRAFT3 // if (pAd->CommonCfg.bMIMOPSEnable) { // MIMO Power Save Mode if ((pMacEntry->MmpsMode == MMPS_DYNAMIC) && (pTransmit->field.MCS > 7)) { // Dynamic MIMO Power Save Mode pTxWI->MIMOps = 1; } else if (pMacEntry->MmpsMode == MMPS_STATIC) { // Static MIMO Power Save Mode if ((pTransmit->field.MODE >= MODE_HTMIX) && (pTransmit->field.MCS > 7)) { pTxWI->MCS = 7; pTxWI->MIMOps = 0; } } }#endif // DOT11_N_SUPPORT //#ifdef DBG_DIAGNOSE if (pTxBlk->QueIdx== 0) { pAd->DiagStruct.TxDataCnt[pAd->DiagStruct.ArrayCurIdx]++; pAd->DiagStruct.TxMcsCnt[pAd->DiagStruct.ArrayCurIdx][pTxWI->MCS]++; }#endif // DBG_DIAGNOSE // pTxWI->MPDUtotalByteCount = pTxBlk->MpduHeaderLen + pTxBlk->SrcBufLen; }// 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]); }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -