diff options
| author | karlf <[email protected]> | 2016-08-11 13:28:13 -0700 |
|---|---|---|
| committer | karlf <[email protected]> | 2016-08-11 13:28:13 -0700 |
| commit | 96eb96dfb613e4c745db6bd1f53a92fe7e2290fc (patch) | |
| tree | ad5f3ede5cbcd6b598677ce41bcf8318471bdd92 /network/wlan/WDI/COMMON/BAGen.c | |
| parent | 687b274aa38fd05c8c26e3068932121876d7f745 (diff) | |
Updated for "Windows 10 Anniversary Update" (Version 1607)
Diffstat (limited to 'network/wlan/WDI/COMMON/BAGen.c')
| -rw-r--r-- | network/wlan/WDI/COMMON/BAGen.c | 943 |
1 files changed, 0 insertions, 943 deletions
diff --git a/network/wlan/WDI/COMMON/BAGen.c b/network/wlan/WDI/COMMON/BAGen.c deleted file mode 100644 index 6d789c04..00000000 --- a/network/wlan/WDI/COMMON/BAGen.c +++ /dev/null @@ -1,943 +0,0 @@ -#include "Mp_Precomp.h" - -#if WPP_SOFTWARE_TRACE -#include "BAGen.tmh" -#endif - -VOID -ActivateBAEntry( - PADAPTER Adapter, - PBA_RECORD pBA, - u2Byte Time - ) -{ - RT_TRACE(COMP_HT, DBG_LOUD, ("pBA->bValid = TRUE\r\n")); - pBA->bValid = TRUE; - if(Time != 0) - PlatformSetTimer(Adapter, &pBA->Timer, Time); -} - -VOID -DeActivateBAEntry( - PADAPTER Adapter, - PBA_RECORD pBA -) -{ - RT_TRACE(COMP_HT, DBG_LOUD, ("pBA->bValid = FALSE\r\n")); - pBA->bValid = FALSE; - PlatformCancelTimer(Adapter, &pBA->Timer); -} - -VOID -ExtendBAEntry( - PADAPTER Adapter, - PBA_RECORD pBA - ) -{ -// if(pBA->bValid && pBA->LifeTime!=0) -// { -// PlatformCancelTimer(Adapter, &pBA->Timer); -// PlatformSetTimer(Adapter, &pBA->Timer, pBA->LifeTime); -// } -} - -BOOLEAN -TxTsDeleteBA( - PADAPTER Adapter, - PTX_TS_RECORD pTxTs - ) -{ - PBA_RECORD pAdmittedBa = &pTxTs->TxAdmittedBARecord; - PBA_RECORD pPendingBa = &pTxTs->TxPendingBARecord; - BOOLEAN bSendDELBA = FALSE; - - // Delete pending BA - if(pPendingBa->bValid) - { - DeActivateBAEntry(Adapter, pPendingBa); - bSendDELBA = TRUE; - } - - // Delete admitted BA - if(pAdmittedBa->bValid) - { - DeActivateBAEntry(Adapter, pAdmittedBa); - bSendDELBA = TRUE; - } - - return bSendDELBA; -} - -BOOLEAN -RxTsDeleteBA( - PADAPTER Adapter, - PRX_TS_RECORD pRxTs - ) -{ - PBA_RECORD pBa = &pRxTs->RxAdmittedBARecord; - BOOLEAN bSendDELBA = FALSE; - - if(pBa->bValid) - { - DeActivateBAEntry(Adapter, pBa); - bSendDELBA = TRUE; - } - - return bSendDELBA; -} - - -VOID -ResetBaEntry( - PBA_RECORD pBA - ) -{ - pBA->bValid = FALSE; - pBA->BaParamSet = 0; - pBA->BaTimeoutValue = 0; - pBA->DialogToken = 0; - pBA->BaStartSeqCtrl = 0; -} - -VOID -ConstructADDBAReq( - IN PADAPTER Adapter, - IN pu1Byte Addr, - IN PBA_RECORD pBA, - OUT pu1Byte Buffer, - OUT pu4Byte pLength - ) -{ - OCTET_STRING osADDBAFrame, tmp; - - FillOctetString(osADDBAFrame, Buffer, 0); - *pLength = 0; - - ConstructMaFrameHdr( - Adapter, - Addr, - ACT_CAT_BA, - ACT_ADDBAREQ, - &osADDBAFrame ); - - // Dialog Token - FillOctetString(tmp, &pBA->DialogToken, 1); - PacketAppendData(&osADDBAFrame, tmp); - - // BA Parameter Set - FillOctetString(tmp, &pBA->BaParamSet, 2); - PacketAppendData(&osADDBAFrame, tmp); - - // BA Timeout Value - FillOctetString(tmp, &pBA->BaTimeoutValue, 2); - PacketAppendData(&osADDBAFrame, tmp); - - // BA Start SeqCtrl - FillOctetString(tmp, &pBA->BaStartSeqCtrl, 2); - PacketAppendData(&osADDBAFrame, tmp); - - *pLength = osADDBAFrame.Length; -} - -VOID -ConstructADDBARsp( - IN PADAPTER Adapter, - IN pu1Byte Addr, - IN PBA_RECORD pBA, - IN u2Byte StatusCode, - OUT pu1Byte Buffer, - OUT pu4Byte pLength - ) -{ - OCTET_STRING osADDBAFrame, tmp; - - FillOctetString(osADDBAFrame, Buffer, 0); - *pLength = 0; - - ConstructMaFrameHdr( - Adapter, - Addr, - ACT_CAT_BA, - ACT_ADDBARSP, - &osADDBAFrame ); - - // Dialog Token - FillOctetString(tmp, &pBA->DialogToken, 1); - PacketAppendData(&osADDBAFrame, tmp); - - // Status Code - FillOctetString(tmp, &StatusCode, 2); - PacketAppendData(&osADDBAFrame, tmp); - - // BA Parameter Set - FillOctetString(tmp, &pBA->BaParamSet, 2); - PacketAppendData(&osADDBAFrame, tmp); - - // BA Timeout Value - FillOctetString(tmp, &pBA->BaTimeoutValue, 2); - PacketAppendData(&osADDBAFrame, tmp); - - *pLength = osADDBAFrame.Length; -} - -VOID -ConstructDELBA( - IN PADAPTER Adapter, - IN pu1Byte Addr, - IN PBA_RECORD pBA, - IN TR_SELECT TxRxSelect, - IN u2Byte ReasonCode, - OUT pu1Byte Buffer, - OUT pu4Byte pLength - ) -{ - OCTET_STRING osDELBAFrame, tmp; - u2Byte DelbaParamSet=0; - - SET_DELBA_PARAM_SET_FIELD_INITIATOR(&DelbaParamSet, (TxRxSelect==TX_DIR)?1:0 ); - SET_DELBA_PARAM_SET_FIELD_TID(&DelbaParamSet, GET_BA_PARAM_SET_FIELD_TID(&(pBA->BaParamSet))) ; - - FillOctetString(osDELBAFrame, Buffer, 0); - *pLength = 0; - - ConstructMaFrameHdr( - Adapter, - Addr, - ACT_CAT_BA, - ACT_DELBA, - &osDELBAFrame ); - - // DELBA Parameter Set - FillOctetString(tmp, &DelbaParamSet, 2); - PacketAppendData(&osDELBAFrame, tmp); - - // Reason Code - FillOctetString(tmp, &ReasonCode, 2); - PacketAppendData(&osDELBAFrame, tmp); - - *pLength = osDELBAFrame.Length; -} - -VOID -SendADDBAReq( - IN PADAPTER Adapter, - IN pu1Byte Addr, - IN PBA_RECORD pBA - ) -{ - PRT_TCB pTcb; - PRT_TX_LOCAL_BUFFER pBuf; - u1Byte DataRate = MgntQuery_MgntFrameTxRate(Adapter, Addr); - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>SendADDBAReq()\n")); - - PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); - - if(MgntGetBuffer(Adapter, &pTcb, &pBuf)) - { - ConstructADDBAReq(Adapter, Addr, pBA, pBuf->Buffer.VirtualAddress, &pTcb->PacketLength); - - if(pTcb->PacketLength != 0) - { - if(ACTING_AS_AP(Adapter)) - MgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, BE_QUEUE, DataRate); - else - MgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, DataRate); - } - } - - PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); -} - -VOID -SendADDBARsp( - IN PADAPTER Adapter, - IN pu1Byte Addr, - IN PBA_RECORD pBA, - IN u2Byte StatusCode - ) -{ - PRT_TCB pTcb; - PRT_TX_LOCAL_BUFFER pBuf; - u1Byte DataRate = MgntQuery_MgntFrameTxRate(Adapter, Addr); - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>SendADDBARsp()\n")); - PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); - - if(MgntGetBuffer(Adapter, &pTcb, &pBuf)) - { - ConstructADDBARsp( - Adapter, - Addr, - pBA, - StatusCode, - pBuf->Buffer.VirtualAddress, - &pTcb->PacketLength ); - - if(pTcb->PacketLength != 0) - MgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, DataRate); - } - - PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); -} - -VOID -SendDELBA( - IN PADAPTER Adapter, - IN pu1Byte Addr, - IN PBA_RECORD pBA, - IN TR_SELECT TxRxSelect, - IN u2Byte ReasonCode - ) -{ - PRT_TCB pTcb; - PRT_TX_LOCAL_BUFFER pBuf; - u1Byte DataRate = MgntQuery_MgntFrameTxRate(Adapter, Addr); - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>SendDELBA()\n")); - PlatformAcquireSpinLock(Adapter, RT_TX_SPINLOCK); - - if(MgntGetBuffer(Adapter, &pTcb, &pBuf)) - { - ConstructDELBA( - Adapter, - Addr, - pBA, - TxRxSelect, - ReasonCode, - pBuf->Buffer.VirtualAddress, - &pTcb->PacketLength ); - - if(pTcb->PacketLength != 0) - MgntSendPacket(Adapter, pTcb, pBuf, pTcb->PacketLength, NORMAL_QUEUE, DataRate); - } - - PlatformReleaseSpinLock(Adapter, RT_TX_SPINLOCK); -} - - -RT_STATUS -OnADDBAReq( - IN PADAPTER Adapter, - IN PRT_RFD pRfd, - IN POCTET_STRING mmpdu - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PBA_RECORD pBA; - PRX_TS_RECORD pTS; - pu1Byte Addr = Frame_Addr2(*mmpdu); - u2Byte StatusCode; - RT_TRACE(COMP_QOS, DBG_TRACE, ("=====>OnADDBAReq()\n")); - // CategoryCode(1) + ActionCode(1) + DialogToken(1) + ParameterSet(2) + TimeoutValue(2) + StartSequence(2) - if(mmpdu->Length < sMacHdrLng + 9) - { - RT_TRACE(COMP_QOS, DBG_SERIOUS, ("OnADDBAReq(): Invalid length(%d) of frame\n", mmpdu->Length)); - return RT_STATUS_MALFORMED_PKT; - } - // - // Check Block Ack support. - // Reject if there is no support of Block Ack. - // - if( (pMgntInfo->pStaQos->CurrentQosMode == QOS_DISABLE) || - (pMgntInfo->pHTInfo->bCurrentHTSupport == FALSE) || - (pMgntInfo->pHTInfo->bAcceptAddbaReq == FALSE) || - (pMgntInfo->IOTAction & HT_IOT_ACT_REJECT_ADDBA_REQ) ) - { - StatusCode = ADDBA_STATUS_REFUSED; - goto OnADDBAReq_Fail; - } - - // Add by hpfan: reject addba when 4-way is not finished - if(pMgntInfo->bWiFiConfg && - pMgntInfo->SecurityInfo.SecLvl > RT_SEC_LVL_NONE && !SecIsTxKeyInstalled(Adapter, pMgntInfo->Bssid)) - { - StatusCode = ADDBA_STATUS_REFUSED; - goto OnADDBAReq_Fail; - } - - // - // Search for related traffic stream. - // If there is no matched TS, reject the ADDBA request. - // - if( !GetTs( - Adapter, - (PTS_COMMON_INFO*)(&pTS), - Addr, - GET_BA_FRAME_PARAM_SET_TID(mmpdu->Octet), - RX_DIR, - TRUE) ) - { - StatusCode = ADDBA_STATUS_REFUSED; - goto OnADDBAReq_Fail; - } - pBA = &pTS->RxAdmittedBARecord; - - - // - // To Determine the ADDBA Req content - // We can do much more check here, including BufferSize, AMSDU_Support, Policy, StartSeqCtrl... - // I want to check StartSeqCtrl to make sure when we start aggregation!!! - // - if(GET_BA_FRAME_PARAM_SET_BA_POLICY(mmpdu->Octet) == BA_POLICY_DELAYED) - { - StatusCode = ADDBA_STATUS_INVALID_PARAM; - goto OnADDBAReq_Fail; - } - - // - // Clear all packets queued in driver for RxReorder and prepare to receive packet from new - // new sequence start!! - // This fix the protocol IOT issue with Netgear WRT3500. - // - - FlushRxTsPendingPkts(Adapter, pTS); - - // - // Admit the ADDBA Request - // - DeActivateBAEntry(Adapter, pBA); - PlatformMoveMemory(&(pBA->DialogToken) , GET_BA_FRAME_DIALOG_TOKEN(mmpdu->Octet), 1); - PlatformMoveMemory(&(pBA->BaParamSet) , GET_BA_FRAME_PARAM_SET(mmpdu->Octet), 2); - PlatformMoveMemory(&(pBA->BaTimeoutValue), GET_BA_FRAME_TIMEOUT_VALUE(mmpdu->Octet), 2); - PlatformMoveMemory(&(pBA->BaStartSeqCtrl), GET_BAREQ_FRAME_START_SQECTRL(mmpdu->Octet), 2); - - { - SET_BA_PARAM_SET_FIELD_BUF_SIZE( &(pBA->BaParamSet), 64); // At least, forced by SPEC - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnADDBAReq(): SET_FIELD_BUF_SIZE = 64\n")); - } - - ActivateBAEntry(Adapter, pBA, 0); - SendADDBARsp(Adapter, Addr, pBA, ADDBA_STATUS_SUCCESS); - - // End of procedure. - return RT_STATUS_SUCCESS; - -OnADDBAReq_Fail: - { - BA_RECORD BA; - PlatformMoveMemory(&(BA.BaParamSet), GET_BA_FRAME_PARAM_SET(mmpdu->Octet), 2); - PlatformMoveMemory(&(BA.BaTimeoutValue), GET_BA_FRAME_TIMEOUT_VALUE(mmpdu->Octet), 2); - PlatformMoveMemory(&(BA.DialogToken), GET_BA_FRAME_DIALOG_TOKEN(mmpdu->Octet), 1); - SET_BA_PARAM_SET_FIELD_BA_POLICY(&(BA.BaParamSet), BA_POLICY_IMMEDIATE); - SendADDBARsp(Adapter, Addr, &BA, StatusCode); - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnADDBAReq(): OnADDBAReq_Fail\n")); - } - return RT_STATUS_SUCCESS; -} - -RT_STATUS -OnADDBARsp( - IN PADAPTER Adapter, - IN PRT_RFD pRfd, - IN POCTET_STRING mmpdu - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PBA_RECORD pPendingBA, pAdmittedBA; - PTX_TS_RECORD pTS; - pu1Byte Addr = Frame_Addr2(*mmpdu); - pu1Byte pDialogToken = GET_BA_FRAME_DIALOG_TOKEN(mmpdu->Octet); - pu1Byte pStatusCode = GET_BA_FRAME_STATUS_CODE(mmpdu->Octet); - u2Byte ReasonCode = ADDBA_STATUS_INVALID_PARAM; - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>OnADDBARsp()\n")); - // CategoryCode(1) + ActionCode(1) + DialogToken(1) + StatusCode(2) + ParameterSet(2) + TimeoutValue(2) - if(mmpdu->Length < sMacHdrLng + 9) - { - RT_TRACE(COMP_QOS, DBG_SERIOUS, ("OnADDBARsp(): Invalid length(%d) of frame\n", mmpdu->Length)); - return RT_STATUS_MALFORMED_PKT; - } - - // - // Check the capability - // Since we can always receive A-MPDU, we just check if it is under HT mode. - // - if(pMgntInfo->pStaQos->CurrentQosMode == QOS_DISABLE || - pMgntInfo->pHTInfo->bCurrentHTSupport == FALSE || - pMgntInfo->pHTInfo->bCurrentAMPDUEnable == FALSE ) - { - ReasonCode = DELBA_REASON_UNKNOWN_BA; - goto OnADDBARsp_Reject; - } - - // - // Search for related TS. - // If there is no TS found, we wil reject ADDBA Rsp by sending DELBA frame. - // - if (!GetTs( - Adapter, - (PTS_COMMON_INFO*)(&pTS), - Addr, - GET_BA_FRAME_PARAM_SET_TID(mmpdu->Octet), - TX_DIR, - FALSE) ) - { - ReasonCode = DELBA_REASON_UNKNOWN_BA; - goto OnADDBARsp_Reject; - } - pTS->bAddBaReqInProgress = FALSE; - pPendingBA = &pTS->TxPendingBARecord; - pAdmittedBA = &pTS->TxAdmittedBARecord; - - - // - // Check if related BA is waiting for setup. - // If not, reject by sending DELBA frame. - // - if((pAdmittedBA->bValid==TRUE)) - { - // Since BA is already setup, we ignore all other ADDBA Response. - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnADDBARsp(): Recv ADDBA Rsp. Drop because already admit it! \n")); - return RT_STATUS_PKT_DROP; - } - else if((pPendingBA->bValid == FALSE) ||(*pDialogToken != pPendingBA->DialogToken)) - { - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnADDBARsp(): Recv ADDBA Rsp. BA invalid, DELBA! \n")); - ReasonCode = DELBA_REASON_UNKNOWN_BA; - goto OnADDBARsp_Reject; - } - else - { - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnADDBARsp(): Recv ADDBA Rsp. BA is admitted! Status code:%X\n", (*pStatusCode) )); - DeActivateBAEntry(Adapter, pPendingBA); - } - - - if((*pStatusCode) == ADDBA_STATUS_SUCCESS) - { - // - // Determine ADDBA Rsp content here. - // We can compare the value of BA parameter set that Peer returned and Self sent. - // If it is OK, then admitted. Or we can send DELBA to cancel BA mechanism. - // - if(GET_BA_FRAME_PARAM_SET_BA_POLICY(mmpdu->Octet) == BA_POLICY_DELAYED) - { - // Since this is a kind of ADDBA failed, we delay next ADDBA process. - pTS->bAddBaReqDelayed = TRUE; - - DeActivateBAEntry(Adapter, pAdmittedBA); - ReasonCode = DELBA_REASON_END_BA; - goto OnADDBARsp_Reject; - } - - - // - // Admitted condition - // - PlatformMoveMemory(&(pAdmittedBA->DialogToken) , GET_BA_FRAME_DIALOG_TOKEN(mmpdu->Octet), 1); - PlatformMoveMemory(&(pAdmittedBA->BaTimeoutValue), GET_BA_FRAME_TIMEOUT_VALUE(mmpdu->Octet), 2); - PlatformMoveMemory(&(pAdmittedBA->BaStartSeqCtrl), &(pPendingBA->BaStartSeqCtrl), 2); - PlatformMoveMemory(&(pAdmittedBA->BaParamSet) , GET_BA_FRAME_PARAM_SET(mmpdu->Octet), 2); - pAdmittedBA->BufferSize = GET_BA_FRAME_PARAM_SET_BUF_SIZE(mmpdu->Octet); - - if(0 == pAdmittedBA->BufferSize) - { - RT_PRINT_ADDR(COMP_HT, DBG_WARNING, "[WARNING]OnADDBARsp(): Incorrect BufferSize (0) in AddBaRsp, skip this BlockAck process for Addr = ", Addr); - ReasonCode = ADDBA_STATUS_INVALID_PARAM; - goto OnADDBARsp_Reject; - } - DeActivateBAEntry(Adapter, pAdmittedBA); - ActivateBAEntry(Adapter, pAdmittedBA, 0 ); - } - else - { - // Delay next ADDBA process. - pTS->bAddBaReqDelayed = TRUE; - } - - // End of procedure - if(Adapter->TDLSSupport) - { - TDLS_OnAddBaRsp(Adapter, mmpdu); - } - - return RT_STATUS_SUCCESS; - -OnADDBARsp_Reject: - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnADDBARsp(): Rejected!!!!!!!!ReasonCode=%d\n", ReasonCode)); - { - BA_RECORD BA; - PlatformMoveMemory(&(BA.BaParamSet), GET_BA_FRAME_PARAM_SET(mmpdu->Octet), 2); - SendDELBA(Adapter, Addr, &BA, TX_DIR, ReasonCode); - } - return RT_STATUS_SUCCESS; -} - - -RT_STATUS -OnDELBA( - IN PADAPTER Adapter, - IN PRT_RFD pRfd, - IN POCTET_STRING mmpdu - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - pu1Byte Addr = Frame_Addr2(*mmpdu); - BA_RECORD BA; - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>OnDELBA()\n")); - if(pMgntInfo->pStaQos->CurrentQosMode == QOS_DISABLE || - pMgntInfo->pHTInfo->bCurrentHTSupport == FALSE ) - return RT_STATUS_SUCCESS; - - // CategoryCode(1) + ActionCode(1) + ParameterSet(2) + ReasonCode(2) - if(mmpdu->Length < sMacHdrLng + 6) - { - RT_TRACE(COMP_QOS, DBG_SERIOUS, ("OnDELBA(): Invalid length(%d) of frame\n", mmpdu->Length)); - return RT_STATUS_MALFORMED_PKT; - } - - if(GET_DELBA_FRAME_PARAM_SET_INITIATOR(mmpdu->Octet) == 1) - { - PRX_TS_RECORD pRxTs; - - if( !GetTs( - Adapter, - (PTS_COMMON_INFO*)&pRxTs, - Addr, - GET_DELBA_FRAME_PARAM_SET_TID(mmpdu->Octet), - RX_DIR, - FALSE) ) - { - return RT_STATUS_FAILURE; - } - - //BA Process Error when link with Netgear3500 v1 - //Fix do S3/S4 long run error - //by sherry 20101124 - if(pMgntInfo->IOTPeer == HT_IOT_PEER_MARVELL) - { - PlatformMoveMemory(&(BA.BaParamSet), GET_BA_FRAME_PARAM_SET(mmpdu->Octet), 2); - SendDELBA(Adapter, Addr, &BA, RX_DIR, 1); - } - - RxTsDeleteBA(Adapter, pRxTs); - } - else - { - PTX_TS_RECORD pTxTs; - - if(!GetTs( - Adapter, - (PTS_COMMON_INFO*)&pTxTs, - Addr, - GET_DELBA_FRAME_PARAM_SET_TID(mmpdu->Octet), - TX_DIR, - FALSE) ) - { - return RT_STATUS_FAILURE; - } - - pTxTs->bUsingBa = FALSE; - pTxTs->bAddBaReqInProgress = FALSE; - pTxTs->bAddBaReqDelayed = FALSE; - PlatformCancelTimer(Adapter, &pTxTs->TsAddBaTimer); - TxTsDeleteBA(Adapter, pTxTs); - } - - return RT_STATUS_SUCCESS; -} - -// -// ADDBA initiate. This can only be called by TX side. -// -VOID -TsInitAddBA( - PADAPTER Adapter, - PTX_TS_RECORD pTS, - u1Byte Policy, - BOOLEAN bOverwritePending - ) -{ - PBA_RECORD pBA = &pTS->TxPendingBARecord; - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - PRT_HIGH_THROUGHPUT pHTInfo = GET_HT_INFO(pMgntInfo); - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>TsInitAddBA()\n")); - - if(pBA->bValid==TRUE && bOverwritePending==FALSE) - return; - - // Set parameters to "Pending" variable set - DeActivateBAEntry(Adapter, pBA); - - pBA->DialogToken++; // DialogToken: Only keep the latest dialog token - SET_BA_PARAM_SET_FIELD_AMSDU_SUPPORT(&(pBA->BaParamSet), 0); // Do not support A-MSDU with A-MPDU now!! - SET_BA_PARAM_SET_FIELD_BA_POLICY(&(pBA->BaParamSet), Policy); // Policy: Delayed or Immediate - SET_BA_PARAM_SET_FIELD_TID(&(pBA->BaParamSet), GET_TSPEC_BODY_TSINFO_TSID(pTS->TsCommonInfo.TSpec)); // TID - // BufferSize: This need to be set according to A-MPDU vector - - { - SET_BA_PARAM_SET_FIELD_BUF_SIZE(&(pBA->BaParamSet), 64); // BufferSize: This need to be set according to A-MPDU vector - } - - // TODO: Enable AMSDU may not be aware of AMPDU - if(HT_AMSDU_WITHIN_AMPDU == pHTInfo->ForcedAMSDUMode) - { - SET_BA_PARAM_SET_FIELD_AMSDU_SUPPORT(&(pBA->BaParamSet), 1); - } - - pBA->BaTimeoutValue = 0; // Timeout value: Set 0 to disable Timer - SET_BA_START_SQECTRL_FIELD_SEQ_NUM(&(pBA->BaStartSeqCtrl), ((pTS->TxCurSeq) % 4096)); - - ActivateBAEntry(Adapter, pBA, BA_SETUP_TIMEOUT); - - SendADDBAReq(Adapter, pTS->TsCommonInfo.Addr, pBA); - - if(!ACTING_AS_AP(Adapter)) - { - // Negoitate with current SeqNum, but active this BA after 3 packets Txed - SET_BA_START_SQECTRL_FIELD_SEQ_NUM(&(pBA->BaStartSeqCtrl), ((pTS->TxCurSeq + 3) % 4096)); - } -} - -VOID -TsInitDelBA( - PADAPTER Adapter, - PTS_COMMON_INFO pTsCommonInfo, - TR_SELECT TxRxSelect - ) -{ - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>TsInitDelBA()\n")); - - if(TxRxSelect == TX_DIR) - { - PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)pTsCommonInfo; - - if(TxTsDeleteBA(Adapter, pTxTs)) - SendDELBA( - Adapter, - pTsCommonInfo->Addr, - (pTxTs->TxAdmittedBARecord.bValid)?(&pTxTs->TxAdmittedBARecord):(&pTxTs->TxPendingBARecord), - TxRxSelect, - DELBA_REASON_END_BA ); - } - else if(TxRxSelect == RX_DIR) - { - PRX_TS_RECORD pRxTs = (PRX_TS_RECORD)pTsCommonInfo; - if(RxTsDeleteBA(Adapter, pRxTs)) - SendDELBA( - Adapter, - pTsCommonInfo->Addr, - &pRxTs->RxAdmittedBARecord, - TxRxSelect, - DELBA_REASON_END_BA ); - } -} - -VOID -BaSetupTimeOut( - PRT_TIMER pTimer - ) -{ - PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)pTimer->Context; - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>BaSetupTimeOut()\n")); - pTxTs->bAddBaReqInProgress = FALSE; - pTxTs->bAddBaReqDelayed = TRUE; - pTxTs->TxPendingBARecord.bValid = FALSE; -} - -VOID -TxBaInactTimeout( - PRT_TIMER pTimer - ) -{ - PADAPTER Adapter = (PADAPTER)pTimer->Adapter; - PTX_TS_RECORD pTxTs = (PTX_TS_RECORD)pTimer->Context; - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>TxBaInactTimeout()\n")); - TxTsDeleteBA(Adapter, pTxTs); - SendDELBA( - Adapter, - pTxTs->TsCommonInfo.Addr, - &pTxTs->TxAdmittedBARecord, - TX_DIR, - DELBA_REASON_TIMEOUT ); -} - -VOID -RxBaInactTimeout( - PRT_TIMER pTimer - ) -{ - PADAPTER Adapter = (PADAPTER)pTimer->Adapter; - PRX_TS_RECORD pRxTs = (PRX_TS_RECORD)pTimer->Context; - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====>RxBaInactTimeout()\n")); - if(ACTING_AS_AP(Adapter)) - return; - - RxTsDeleteBA(Adapter, pRxTs); - SendDELBA( - Adapter, - pRxTs->TsCommonInfo.Addr, - &pRxTs->RxAdmittedBARecord, - RX_DIR, - DELBA_REASON_TIMEOUT ); -} - -VOID -RxBACheck( - PADAPTER Adapter, - PRT_RFD pRfd, - POCTET_STRING pFrame - ) -{ - -} - -// -// Description: Parse BlockAckReq frame -// -// 2015.08.19. Added by tynli. -// -RT_STATUS -OnBAReq( - IN PADAPTER Adapter, - IN PRT_RFD pRfd, - IN OCTET_STRING ospdu - ) -{ - PMGNT_INFO pMgntInfo = &(Adapter->MgntInfo); - pu1Byte pBARFrame = ospdu.Octet; - u1Byte BARAckPolicy, MultiTID, CompressedBitmap, GCR, TIDInfo = 0; - u2Byte StartSeqNum, LatestSeqNum; - PRX_TS_RECORD pTS = NULL; - pu1Byte Addr = Frame_Addr2(ospdu); - BAR_TYPE BARType = BAR_TYPE_BASIC_BAR; - - RT_TRACE(COMP_QOS, DBG_LOUD, ("=====> OnBAReq()\n")); - - // Header (16) + BAR control (2) - if(ospdu.Length < 16 + 2) - { - RT_TRACE(COMP_QOS, DBG_SERIOUS, ("OnBAReq(): Invalid length(%d) of frame\n", ospdu.Length)); - return RT_STATUS_MALFORMED_PKT; - } - - // - // Check Block Ack Req support. - // Reject if there is no support of Block Ack Req. - // - if((pMgntInfo->pStaQos->CurrentQosMode == QOS_DISABLE) || - (pMgntInfo->pHTInfo->bCurrentHTSupport == FALSE)) - { - //StatusCode = ADDBA_STATUS_REFUSED; - return RT_STATUS_FAILURE; - } - - // Get the BAR control field offset - pBARFrame += 16; - BARAckPolicy = GET_BAR_PARAM_CTRL_FIELD_BAR_ACK_POLICY(pBARFrame); - if(BARAckPolicy == BAR_NORMAL_ACK) - { - // Normal Ack - MultiTID = GET_BAR_PARAM_CTRL_FIELD_MULTI_TID(pBARFrame); - CompressedBitmap = GET_BAR_PARAM_CTRL_FIELD_COMPRESSED_BITMAP(pBARFrame); - GCR = GET_BAR_PARAM_CTRL_FIELD_GCR(pBARFrame); - TIDInfo = GET_BAR_PARAM_CTRL_FIELD_TID_INFO(pBARFrame); - - if(MultiTID == 0 && CompressedBitmap == 0 && GCR == 0) - { - // Basic BlockAckReq - BARType = BAR_TYPE_BASIC_BAR; - } - else if(MultiTID == 0 && CompressedBitmap == 1 && GCR == 0) - { - // Compressed BlockAckReq - BARType = BAR_TYPE_COMPRESSED_BAR; - } - else if(MultiTID == 1 && CompressedBitmap == 0 && GCR == 0) - { - // Extended Compressed BlockAckReq - BARType = BAR_TYPE_EXT_COMPRESSED_BAR; - } - else if(MultiTID == 1 && CompressedBitmap == 1 && GCR == 0) - { - // Multi-TID BlockAckReq - BARType = BAR_TYPE_MULTI_TID_BAR; - } - else if(MultiTID == 0 && CompressedBitmap == 1 && GCR == 1) - { - // GCR BlockAckReq - BARType = BAR_TYPE_GCR_BAR; - } - else - { - // Reserved - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnBAReq(): BAR type is reserved.\n")); - - } - } - else - { - // No Ack - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnBAReq(): BAR ACK policy is No ACK. Not handle now!!\n")); - } - - - // - // Search for related traffic stream. - // - if(!GetTs( - Adapter, - (PTS_COMMON_INFO*)(&pTS), - Addr, - TIDInfo, - RX_DIR, - TRUE)) - { - return RT_STATUS_FAILURE; - } - - if(BARType == BAR_TYPE_BASIC_BAR || BARType == BAR_TYPE_COMPRESSED_BAR || - BARType == BAR_TYPE_EXT_COMPRESSED_BAR || BARType == BAR_TYPE_GCR_BAR) - { - PRT_LIST_ENTRY pList = &pTS->RxPendingPktList; - - // Get BAR Info - pBARFrame += 2; - StartSeqNum = GET_BAR_PARAM_INFO_FIELD_STARTING_SEQ_NUM(pBARFrame); - - // Check the last received sequence number - if(!RTIsListEmpty(pList)) - { - LatestSeqNum = ((PRX_REORDER_ENTRY)pList->Blink)->SeqNum; - } - else - { - // Pending list is empty! - LatestSeqNum = pTS->RxIndicateSeq; - } - - // Update Rx indicate seq num for TS. - if(!(SN_LESS(StartSeqNum, LatestSeqNum) || SN_EQUAL(StartSeqNum, LatestSeqNum))) - { - // - // Indicate packets queued in driver for RxReorder and prepare to receive packet from new - // new sequence start!! - // - if(pTS->RxIndicateState==RXTS_INDICATE_BATCH) - IndicateRxReorderList(Adapter, pTS, FALSE); - else if(pTS->RxIndicateState==RXTS_INDICATE_REORDER) - IndicateRxReorderList(Adapter, pTS, TRUE); - - if(!(SN_LESS(StartSeqNum, pTS->RxIndicateSeq) || SN_EQUAL(StartSeqNum, pTS->RxIndicateSeq))) - { - pTS->RxIndicateSeq = StartSeqNum; - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnBAReq(): Update Rx indcate starting sequence (%#X)!!\n", StartSeqNum)); - } - } - //RT_TRACE(COMP_QOS, DBG_LOUD, ("OnBAReq(): BARAckPolicy=%d, MultiTID=%d, CompressedBitmap=%#X, GCR=%d, TIDInfo=%d, StartSeqNum=%#X\n", - // BARAckPolicy, MultiTID, CompressedBitmap, GCR, TIDInfo, StartSeqNum)); - } - else if(BARType == BAR_TYPE_MULTI_TID_BAR) - { - RT_TRACE(COMP_QOS, DBG_LOUD, ("OnBAReq(): Multi-TID BAR is not supported now!!\n")); - } - - //RT_PRINT_DATA(COMP_QOS, DBG_LOUD, "OnBAReq() Frame:\n", ospdu.Octet, ospdu.Length); - - return RT_STATUS_SUCCESS; -} |
