📄 action.c
字号:
break; case ADDBA_RESP: PeerAddBARspAction(pAd,Elem); break; case DELBA: PeerDelBAAction(pAd,Elem); break; }}#ifdef DOT11N_DRAFT3#ifdef CONFIG_STA_SUPPORTVOID StaPublicAction( IN PRTMP_ADAPTER pAd, IN UCHAR Bss2040Coexist) { BSS_2040_COEXIST_IE BssCoexist; MLME_SCAN_REQ_STRUCT ScanReq; BssCoexist.word = Bss2040Coexist; // AP asks Station to return a 20/40 BSS Coexistence mgmt frame. So we first starts a scan, then send back 20/40 BSS Coexistence mgmt frame if ((BssCoexist.field.InfoReq == 1) && (OPSTATUS_TEST_FLAG(pAd, fOP_STATUS_SCAN_2040))) { // Clear record first. After scan , will update those bit and send back to transmiter. pAd->CommonCfg.BSSCoexist2040.field.InfoReq = 1; pAd->CommonCfg.BSSCoexist2040.field.Intolerant40 = 0; pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 0; // Fill out stuff for scan request ScanParmFill(pAd, &ScanReq, ZeroSsid, 0, BSS_ANY, SCAN_2040_BSS_COEXIST); MlmeEnqueue(pAd, SYNC_STATE_MACHINE, MT2_MLME_SCAN_REQ, sizeof(MLME_SCAN_REQ_STRUCT), &ScanReq); pAd->Mlme.CntlMachine.CurrState = CNTL_WAIT_OID_LIST_SCAN; }}/*Description : Build Intolerant Channel Rerpot from Trigger event table.return : how many bytes copied. */ULONG BuildIntolerantChannelRep( IN PRTMP_ADAPTER pAd, IN PUCHAR pDest) { ULONG FrameLen = 0; ULONG ReadOffset = 0; UCHAR i; UCHAR LastRegClass = 0xff; PUCHAR pLen; for ( i = 0;i < MAX_TRIGGER_EVENT;i++) { if (pAd->CommonCfg.TriggerEventTab.EventA[i].bValid == TRUE) { if (pAd->CommonCfg.TriggerEventTab.EventA[i].RegClass == LastRegClass) { *(pDest + ReadOffset) = (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel; *pLen++; ReadOffset++; FrameLen++; } else { *(pDest + ReadOffset) = IE_2040_BSS_INTOLERANT_REPORT; // IE *(pDest + ReadOffset + 1) = 2; // Len = RegClass byte + channel byte. pLen = pDest + ReadOffset + 1; LastRegClass = pAd->CommonCfg.TriggerEventTab.EventA[i].RegClass; *(pDest + ReadOffset + 2) = LastRegClass; // Len = RegClass byte + channel byte. *(pDest + ReadOffset + 3) = (UCHAR)pAd->CommonCfg.TriggerEventTab.EventA[i].Channel; FrameLen += 4; ReadOffset += 4; } } } return FrameLen;}/*Description : Send 20/40 BSS Coexistence Action frame If one trigger event is triggered.*/VOID Send2040CoexistAction( IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, IN BOOLEAN bAddIntolerantCha) { PUCHAR pOutBuffer = NULL; NDIS_STATUS NStatus; FRAME_ACTION_HDR Frame; ULONG FrameLen; ULONG IntolerantChaRepLen; IntolerantChaRepLen = 0; NStatus = MlmeAllocateMemory(pAd, &pOutBuffer); //Get an unused nonpaged memory if(NStatus != NDIS_STATUS_SUCCESS) { DBGPRINT(RT_DEBUG_ERROR,("ACT - Send2040CoexistAction() allocate memory failed \n")); return; } ActHeaderInit(pAd, &Frame.Hdr, pAd->MacTab.Content[Wcid].Addr, pAd->CommonCfg.Bssid); Frame.Category = CATEGORY_PUBLIC; Frame.Action = ACTION_BSS_2040_COEXIST; MakeOutgoingFrame(pOutBuffer, &FrameLen, sizeof(FRAME_ACTION_HDR), &Frame, END_OF_ARGS); *(pOutBuffer + FrameLen) = pAd->CommonCfg.BSSCoexist2040.word; FrameLen++; if (bAddIntolerantCha == TRUE) IntolerantChaRepLen = BuildIntolerantChannelRep(pAd, pOutBuffer + FrameLen); MiniportMMRequest(pAd, QID_AC_BE, pOutBuffer, FrameLen + IntolerantChaRepLen); DBGPRINT(RT_DEBUG_ERROR,("ACT - Send2040CoexistAction( BSSCoexist2040 = 0x%x ) \n", pAd->CommonCfg.BSSCoexist2040.word)); }/* ========================================================================== Description: After scan, Update 20/40 BSS Coexistence IE and send out. According to 802.11n D3.03 11.14.10 Parameters: ========================================================================== */VOID Update2040CoexistFrameAndNotify( IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, IN BOOLEAN bAddIntolerantCha) { BSS_2040_COEXIST_IE OldValue; OldValue.word = pAd->CommonCfg.BSSCoexist2040.word; if ((pAd->CommonCfg.TriggerEventTab.EventANo > 0) || (pAd->CommonCfg.TriggerEventTab.EventBCountDown > 0)) pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq = 1; // Need to check !!!! // How STA will set Intolerant40 if implementation dependent. Now we don't set this bit first.!!!!! // So Only check BSS20WidthReq change. if (OldValue.field.BSS20WidthReq != pAd->CommonCfg.BSSCoexist2040.field.BSS20WidthReq) { Send2040CoexistAction(pAd, Wcid, bAddIntolerantCha); }}#endif // CONFIG_STA_SUPPORT //BOOLEAN ChannelSwitchSanityCheck( IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, IN UCHAR NewChannel, IN UCHAR Secondary) { UCHAR i; if (Wcid >= MAX_LEN_OF_MAC_TABLE) return FALSE; if ((NewChannel > 7) && (Secondary == 1)) return FALSE; if ((NewChannel < 5) && (Secondary == 3)) return FALSE; // 0. Check if new channel is in the channellist. for (i = 0;i < pAd->ChannelListNum;i++) { if (pAd->ChannelList[i].Channel == NewChannel) { break; } } if (i == pAd->ChannelListNum) return FALSE; return TRUE;}VOID ChannelSwitchAction( IN PRTMP_ADAPTER pAd, IN UCHAR Wcid, IN UCHAR NewChannel, IN UCHAR Secondary) { UCHAR BBPValue = 0; ULONG MACValue; DBGPRINT(RT_DEBUG_TRACE,("SPECTRUM - ChannelSwitchAction(NewChannel = %d , Secondary = %d) \n", NewChannel, Secondary)); if (ChannelSwitchSanityCheck(pAd, Wcid, NewChannel, Secondary) == FALSE) return; // 1. Switches to BW = 20. if (Secondary == 0) { RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); BBPValue&= (~0x18); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); if (pAd->MACVersion == 0x28600100) { RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R69, 0x16); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R70, 0x08); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R73, 0x11); DBGPRINT(RT_DEBUG_TRACE, ("!!!rt2860C !!! \n" )); } pAd->CommonCfg.BBPCurrentBW = BW_20; pAd->CommonCfg.Channel = NewChannel; pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel; AsicSwitchChannel(pAd, pAd->CommonCfg.Channel,FALSE); AsicLockChannel(pAd, pAd->CommonCfg.Channel); pAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 0; DBGPRINT(RT_DEBUG_TRACE, ("!!!20MHz !!! \n" )); } // 1. Switches to BW = 40 And Station supports BW = 40. else if (((Secondary == 1) || (Secondary == 3)) && (pAd->CommonCfg.HtCapability.HtCapInfo.ChannelWidth == 1)) { pAd->CommonCfg.Channel = NewChannel; if (Secondary == 1) { // Secondary above. pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel + 2; RTMP_IO_READ32(pAd, TX_BAND_CFG, &MACValue); MACValue &= 0xfe; RTMP_IO_WRITE32(pAd, TX_BAND_CFG, MACValue); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); BBPValue&= (~0x18); BBPValue|= (0x10); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPValue); BBPValue&= (~0x20); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPValue); DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Lower LINK UP !!! Control Channel at Below. Central = %d \n", pAd->CommonCfg.CentralChannel )); } else { // Secondary below. pAd->CommonCfg.CentralChannel = pAd->CommonCfg.Channel - 2; RTMP_IO_READ32(pAd, TX_BAND_CFG, &MACValue); MACValue &= 0xfe; MACValue |= 0x1; RTMP_IO_WRITE32(pAd, TX_BAND_CFG, MACValue); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R4, &BBPValue); BBPValue&= (~0x18); BBPValue|= (0x10); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R4, BBPValue); RTMP_BBP_IO_READ8_BY_REG_ID(pAd, BBP_R3, &BBPValue); BBPValue&= (~0x20); BBPValue|= (0x20); RTMP_BBP_IO_WRITE8_BY_REG_ID(pAd, BBP_R3, BBPValue); DBGPRINT(RT_DEBUG_TRACE, ("!!!40MHz Upper LINK UP !!! Control Channel at UpperCentral = %d \n", pAd->CommonCfg.CentralChannel )); } pAd->CommonCfg.BBPCurrentBW = BW_40; AsicSwitchChannel(pAd, pAd->CommonCfg.CentralChannel, FALSE); AsicLockChannel(pAd, pAd->CommonCfg.CentralChannel); pAd->MacTab.Content[Wcid].HTPhyMode.field.BW = 1; }}#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //VOID PeerPublicAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) {#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3 UCHAR Action = Elem->Msg[LENGTH_802_11+1];#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT // if (Elem->Wcid >= MAX_LEN_OF_MAC_TABLE) return;#ifdef DOT11_N_SUPPORT#ifdef DOT11N_DRAFT3 switch(Action) { case ACTION_BSS_2040_COEXIST: // Format defined in IEEE 7.4.7a.1 in 11n Draf3.03 { //UCHAR BssCoexist; BSS_2040_COEXIST_ELEMENT *pCoexistInfo; BSS_2040_COEXIST_IE *pBssCoexistIe; BSS_2040_INTOLERANT_CH_REPORT *pIntolerantReport = NULL; if (Elem->MsgLen <= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT)) ) { DBGPRINT(RT_DEBUG_ERROR, ("ACTION - 20/40 BSS Coexistence Management Frame length too short! len = %ld!\n", Elem->MsgLen)); break; } DBGPRINT(RT_DEBUG_TRACE, ("ACTION - 20/40 BSS Coexistence Management action----> \n")); hex_dump("CoexistenceMgmtFrame", Elem->Msg, Elem->MsgLen); pCoexistInfo = (BSS_2040_COEXIST_ELEMENT *) &Elem->Msg[LENGTH_802_11+2]; //hex_dump("CoexistInfo", (PUCHAR)pCoexistInfo, sizeof(BSS_2040_COEXIST_ELEMENT)); if (Elem->MsgLen >= (LENGTH_802_11 + sizeof(BSS_2040_COEXIST_ELEMENT) + sizeof(BSS_2040_INTOLERANT_CH_REPORT))) { pIntolerantReport = (BSS_2040_INTOLERANT_CH_REPORT *)((PUCHAR)pCoexistInfo + sizeof(BSS_2040_COEXIST_ELEMENT)); } //hex_dump("IntolerantReport ", (PUCHAR)pIntolerantReport, sizeof(BSS_2040_INTOLERANT_CH_REPORT)); pBssCoexistIe = (BSS_2040_COEXIST_IE *)(&pCoexistInfo->BssCoexistIe);#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { if (INFRA_ON(pAd)) { StaPublicAction(pAd, pCoexistInfo); } }#endif // CONFIG_STA_SUPPORT // } break; }#endif // DOT11N_DRAFT3 //#endif // DOT11_N_SUPPORT //} static VOID ReservedAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem){ UCHAR Category; if (Elem->MsgLen <= LENGTH_802_11) { return; } Category = Elem->Msg[LENGTH_802_11]; DBGPRINT(RT_DEBUG_TRACE,("Rcv reserved category(%d) Action Frame\n", Category)); hex_dump("Reserved Action Frame", &Elem->Msg[0], Elem->MsgLen);}VOID PeerRMAction( IN PRTMP_ADAPTER pAd, IN MLME_QUEUE_ELEM *Elem) { return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -