INT CFG80211_SendMgmtFrame(RTMP_ADAPTER *pAd, VOID *pData, ULONG Data) { if (pData != NULL) { #ifdef CONFIG_AP_SUPPORT struct ieee80211_mgmt *mgmt; #endif /* CONFIG_AP_SUPPORT */ { PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; pCfg80211_ctrl->TxStatusInUsed = TRUE; pCfg80211_ctrl->TxStatusSeq = pAd->Sequence; if (pCfg80211_ctrl->pTxStatusBuf != NULL) { os_free_mem(NULL, pCfg80211_ctrl->pTxStatusBuf); pCfg80211_ctrl->pTxStatusBuf = NULL; } os_alloc_mem(NULL, (UCHAR **)&pCfg80211_ctrl->pTxStatusBuf, Data); if (pCfg80211_ctrl->pTxStatusBuf != NULL) { NdisCopyMemory(pCfg80211_ctrl->pTxStatusBuf, pData, Data); pCfg80211_ctrl->TxStatusBufLen = Data; } else { pCfg80211_ctrl->TxStatusBufLen = 0; MTWF_LOG(DBG_CAT_ALL, DBG_SUBCAT_ALL, DBG_LVL_ERROR, ("CFG_TX_STATUS: MEM ALLOC ERROR\n")); return NDIS_STATUS_FAILURE; } CFG80211_CheckActionFrameType(pAd, "TX", pData, Data); #ifdef CONFIG_AP_SUPPORT mgmt = (struct ieee80211_mgmt *)pData; if (ieee80211_is_probe_resp(mgmt->frame_control)) { INT offset = sizeof(HEADER_802_11) + 12; CFG80211_SyncPacketWmmIe(pAd, pData + offset , Data - offset); } #endif /* CONFIG_AP_SUPPORT */ MiniportMMRequest(pAd, 0, pData, Data); } } return 0; }
BOOLEAN CFG80211_HandleP2pMgmtFrame(RTMP_ADAPTER *pAd, RX_BLK *pRxBlk, UCHAR OpMode) { RXWI_STRUC *pRxWI = pRxBlk->pRxWI; PHEADER_802_11 pHeader = pRxBlk->pHeader; PNET_DEV pNetDev = NULL; PCFG80211_CTRL pCfg80211_ctrl = &pAd->cfg80211_ctrl; UINT32 freq; if ((pHeader->FC.SubType == SUBTYPE_PROBE_REQ) || ((pHeader->FC.SubType == SUBTYPE_ACTION) && CFG80211_CheckActionFrameType(pAd, "RX", pHeader, pRxWI->RXWI_N.MPDUtotalByteCnt))) { MAP_CHANNEL_ID_TO_KHZ(pAd->LatchRfRegs.Channel, freq); freq /= 1000; #ifdef RT_CFG80211_P2P_CONCURRENT_DEVICE /* Check the P2P_GO exist in the VIF List */ if (pCfg80211_ctrl->Cfg80211VifDevSet.vifDevList.size > 0) { if ((pNetDev = RTMP_CFG80211_FindVifEntry_ByType(pAd, RT_CMD_80211_IFTYPE_P2P_GO)) != NULL) { DBGPRINT(RT_DEBUG_INFO, ("VIF STA GO RtmpOsCFG80211RxMgmt OK!! TYPE = %d, freq = %d, %02x:%02x:%02x:%02x:%02x:%02x\n", pHeader->FC.SubType, freq, PRINT_MAC(pHeader->Addr2))); CFG80211OS_RxMgmt(pNetDev, freq, (PUCHAR)pHeader, pRxWI->RXWI_N.MPDUtotalByteCnt); if (OpMode == OPMODE_AP) return TRUE; } } #endif /* RT_CFG80211_P2P_CONCURRENT_DEVICE */ if ( ((pHeader->FC.SubType == SUBTYPE_PROBE_REQ) && (pCfg80211_ctrl->cfg80211MainDev.Cfg80211RegisterProbeReqFrame == TRUE) ) || ((pHeader->FC.SubType == SUBTYPE_ACTION) /*&& ( pAd->Cfg80211RegisterActionFrame == TRUE)*/ )) { DBGPRINT(RT_DEBUG_INFO,("MAIN STA RtmpOsCFG80211RxMgmt OK!! TYPE = %d, freq = %d, %02x:%02x:%02x:%02x:%02x:%02x\n", pHeader->FC.SubType, freq, PRINT_MAC(pHeader->Addr2))); CFG80211OS_RxMgmt(CFG80211_GetEventDevice(pAd), freq, (PUCHAR)pHeader, pRxWI->RXWI_N.MPDUtotalByteCnt); if (OpMode == OPMODE_AP) return TRUE; } } return FALSE; }