void STA_MonPktSend( IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk) { PNET_DEV pNetDev; PNDIS_PACKET pRxPacket; PHEADER_802_11 pHeader; USHORT DataSize; UINT32 MaxRssi; UCHAR L2PAD, PHYMODE, BW, ShortGI, MCS, AMPDU, STBC, RSSI1; UCHAR BssMonitorFlag11n, Channel, CentralChannel; UCHAR *pData, *pDevName; /* sanity check */ ASSERT(pRxBlk->pRxPacket); if (pRxBlk->DataSize < 10) { DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __FUNCTION__, pRxBlk->DataSize)); goto err_free_sk_buff; } if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE) { DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __FUNCTION__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header))); goto err_free_sk_buff; } /* init */ MaxRssi = RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2)); pNetDev = get_netdev_from_bssid(pAd, BSS0); pRxPacket = pRxBlk->pRxPacket; pHeader = pRxBlk->pHeader; pData = pRxBlk->pData; DataSize = pRxBlk->DataSize; L2PAD = pRxBlk->RxD.L2PAD; PHYMODE = pRxBlk->pRxWI->PHYMODE; BW = pRxBlk->pRxWI->BW; ShortGI = pRxBlk->pRxWI->ShortGI; MCS = pRxBlk->pRxWI->MCS; AMPDU = pRxBlk->RxD.AMPDU; STBC = pRxBlk->pRxWI->STBC; RSSI1 = pRxBlk->pRxWI->RSSI1; BssMonitorFlag11n = 0; #ifdef MONITOR_FLAG_11N_SNIFFER_SUPPORT BssMonitorFlag11n = (pAd->StaCfg.BssMonitorFlag & MONITOR_FLAG_11N_SNIFFER); #endif /* MONITOR_FLAG_11N_SNIFFER_SUPPORT */ pDevName = (UCHAR *)RtmpOsGetNetDevName(pAd->net_dev); Channel = pAd->CommonCfg.Channel; CentralChannel = pAd->CommonCfg.CentralChannel; /* pass the packet */ send_monitor_packets(pNetDev, pRxPacket, pHeader, pData, DataSize, L2PAD, PHYMODE, BW, ShortGI, MCS, AMPDU, STBC, RSSI1, BssMonitorFlag11n, pDevName, Channel, CentralChannel, MaxRssi); return; err_free_sk_buff: RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); return; }
/* ======================================================================== Routine Description: Driver pre-Ioctl for AP. Arguments: pAdSrc - WLAN control block pointer pCB - the IOCTL parameters Return Value: NDIS_STATUS_SUCCESS - IOCTL OK Otherwise - IOCTL fail Note: ======================================================================== */ INT RTMP_AP_IoctlPrepare( IN RTMP_ADAPTER *pAd, IN VOID *pCB) { RT_CMD_AP_IOCTL_CONFIG *pConfig = (RT_CMD_AP_IOCTL_CONFIG *)pCB; POS_COOKIE pObj; USHORT index; INT Status = NDIS_STATUS_SUCCESS; #ifdef CONFIG_APSTA_MIXED_SUPPORT INT cmd = 0xff; #endif /* CONFIG_APSTA_MIXED_SUPPORT */ pObj = (POS_COOKIE) pAd->OS_Cookie; if((pConfig->priv_flags == INT_MAIN) && !RTMP_TEST_FLAG(pAd, fRTMP_ADAPTER_INTERRUPT_IN_USE)) { if (pConfig->pCmdData == NULL) return Status; if (RtPrivIoctlSetVal() == pConfig->CmdId_RTPRIV_IOCTL_SET) { if (TRUE #ifdef CONFIG_APSTA_MIXED_SUPPORT && (strstr(pConfig->pCmdData, "OpMode") == NULL) #endif /* CONFIG_APSTA_MIXED_SUPPORT */ #ifdef SINGLE_SKU && (strstr(pConfig->pCmdData, "ModuleTxpower") == NULL) #endif /* SINGLE_SKU */ ) { return -ENETDOWN; } } else return -ENETDOWN; } /* determine this ioctl command is comming from which interface. */ if (pConfig->priv_flags == INT_MAIN) { pObj->ioctl_if_type = INT_MAIN; pObj->ioctl_if = MAIN_MBSSID; /* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", pObj->ioctl_if, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */ } else if (pConfig->priv_flags == INT_MBSSID) { pObj->ioctl_if_type = INT_MBSSID; /* if (!RTMPEqualMemory(net_dev->name, pAd->net_dev->name, 3)) // for multi-physical card, no MBSSID */ if (strcmp(pConfig->name, RtmpOsGetNetDevName(pAd->net_dev)) != 0) /* sample */ { for (index = 1; index < pAd->ApCfg.BssidNum; index++) { if (pAd->ApCfg.MBSSID[index].MSSIDDev == pConfig->net_dev) { pObj->ioctl_if = index; /* DBGPRINT(RT_DEBUG_INFO, ("rt28xx_ioctl I/F(ra%d)(flags=%d): cmd = 0x%08x\n", index, RT_DEV_PRIV_FLAGS_GET(net_dev), cmd)); */ break; } } /* Interface not found! */ if(index == pAd->ApCfg.BssidNum) { /* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F\n")); */ return -ENETDOWN; } } else /* ioctl command from I/F(ra0) */ { /* GET_PAD_FROM_NET_DEV(pAd, net_dev); */ pObj->ioctl_if = MAIN_MBSSID; /* DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find I/F and use default: cmd = 0x%08x\n", cmd)); */ } MBSS_MR_APIDX_SANITY_CHECK(pAd, pObj->ioctl_if); } #ifdef WDS_SUPPORT else if (pConfig->priv_flags == INT_WDS) { pObj->ioctl_if_type = INT_WDS; for(index = 0; index < MAX_WDS_ENTRY; index++) { if (pAd->WdsTab.WdsEntry[index].dev == pConfig->net_dev) { pObj->ioctl_if = index; break; } if(index == MAX_WDS_ENTRY) { DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find wds I/F\n")); return -ENETDOWN; } } } #endif /* WDS_SUPPORT */ #ifdef APCLI_SUPPORT else if (pConfig->priv_flags == INT_APCLI) { pObj->ioctl_if_type = INT_APCLI; for (index = 0; index < MAX_APCLI_NUM; index++) { if (pAd->ApCfg.ApCliTab[index].dev == pConfig->net_dev) { pObj->ioctl_if = index; break; } if(index == MAX_APCLI_NUM) { DBGPRINT(RT_DEBUG_ERROR, ("rt28xx_ioctl can not find Apcli I/F\n")); return -ENETDOWN; } } APCLI_MR_APIDX_SANITY_CHECK(pObj->ioctl_if); } #endif /* APCLI_SUPPORT */ else { /* DBGPRINT(RT_DEBUG_WARN, ("IOCTL is not supported in WDS interface\n")); */ return -EOPNOTSUPP; } pConfig->apidx = pObj->ioctl_if; return Status; }