/**************************************************************************** * Ralink Tech Inc. * 4F, No. 2 Technology 5th Rd. * Science-based Industrial Park * Hsin-chu, Taiwan, R.O.C. * (c) Copyright 2002, Ralink Technology, Inc. * * All rights reserved. Ralink's source code is an unpublished work and the * use of a copyright notice does not imply otherwise. This source code * contains confidential trade secret material of Ralink Tech. Any attemp * or participation in deciphering, decoding, reverse engineering or in any * way altering the source code is stricitly prohibited, unless the prior * written consent of Ralink Technology, Inc. is obtained. **************************************************************************** Module Name: rt_profile.c Abstract: Revision History: Who When What --------- ---------- ---------------------------------------------- */ #include "rt_config.h" #ifdef SYSTEM_LOG_SUPPORT /* for wireless system event message */ char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = { /* system status event */ "had associated successfully", /* IW_ASSOC_EVENT_FLAG */ "had disassociated", /* IW_DISASSOC_EVENT_FLAG */ "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */ "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */ "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */ "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */ "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */ "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */ "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */ "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */ "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */ "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */ "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */ "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */ "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */ "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */ "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */ "scan completed", /* IW_SCAN_COMPLETED_EVENT_FLAG */ "scan terminate!! Busy!! Enqueue fail!!", /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */ "channel switch to ", /* IW_CHANNEL_CHANGE_EVENT_FLAG */ "wireless mode is not support", /* IW_STA_MODE_EVENT_FLAG */ "blacklisted in MAC filter list", /* IW_MAC_FILTER_LIST_EVENT_FLAG */ "Authentication rejected because of challenge failure", /* IW_AUTH_REJECT_CHALLENGE_FAILURE */ "Scanning", /* IW_SCANNING_EVENT_FLAG */ "Start a new IBSS", /* IW_START_IBSS_FLAG */ "Join the IBSS", /* IW_JOIN_IBSS_FLAG */ "Shared WEP fail", /* IW_SHARED_WEP_FAIL*/ }; #ifdef IDS_SUPPORT /* for wireless IDS_spoof_attack event message */ char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = { "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */ "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */ "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */ "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */ "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */ "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */ "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */ "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */ "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */ "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */ }; /* for wireless IDS_flooding_attack event message */ char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = { "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */ "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */ "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */ "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */ "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */ "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */ "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */ }; #endif /* IDS_SUPPORT */ #ifdef WSC_INCLUDED /* for WSC wireless event message */ char const *pWirelessWscEventText[IW_WSC_EVENT_TYPE_NUM] = { "PBC Session Overlap", /* IW_WSC_PBC_SESSION_OVERLAP */ "This WPS Registrar supports PBC", /* IW_WSC_REGISTRAR_SUPPORT_PBC */ "This WPS Registrar supports PIN", /* IW_WSC_REGISTRAR_SUPPORT_PIN */ "WPS status success", /* IW_WSC_STATUS_SUCCESS */ "WPS status fail", /* IW_WSC_STATUS_FAIL */ "WPS 2 mins time out!", /* IW_WSC_2MINS_TIMEOUT */ "WPS Send EAPOL_Start!", /* IW_WSC_SEND_EAPOL_START */ "WPS Send WscStart!", /* IW_WSC_SEND_WSC_START */ "WPS Send M1!", /* IW_WSC_SEND_M1 */ "WPS Send M2!", /* IW_WSC_SEND_M2 */ "WPS Send M3!", /* IW_WSC_SEND_M3 */ "WPS Send M4!", /* IW_WSC_SEND_M4 */ "WPS Send M5!", /* IW_WSC_SEND_M5 */ "WPS Send M6!", /* IW_WSC_SEND_M6 */ "WPS Send M7!", /* IW_WSC_SEND_M7 */ "WPS Send M8!", /* IW_WSC_SEND_M8 */ "WPS Send WscDone!", /* IW_WSC_SEND_DONE */ "WPS Send WscAck!", /* IW_WSC_SEND_ACK */ "WPS Send WscNack!", /* IW_WSC_SEND_NACK */ "WPS Receive WscStart!", /* IW_WSC_RECEIVE_WSC_START */ "WPS Receive M1!", /* IW_WSC_RECEIVE_M1 */ "WPS Receive M2!", /* IW_WSC_RECEIVE_M2 */ "WPS Receive M3!", /* IW_WSC_RECEIVE_M3 */ "WPS Receive M4!", /* IW_WSC_RECEIVE_M4 */ "WPS Receive M5!", /* IW_WSC_RECEIVE_M5 */ "WPS Receive M6!", /* IW_WSC_RECEIVE_M6 */ "WPS Receive M7!", /* IW_WSC_RECEIVE_M7 */ "WPS Receive M8!", /* IW_WSC_RECEIVE_M8 */ "WPS Receive WscDone!", /* IW_WSC_RECEIVE_DONE */ "WPS Receive WscAck!", /* IW_WSC_RECEIVE_ACK */ "WPS Receive WscNack!", /* IW_WSC_RECEIVE_NACK */ "Not only one candidate found" /* IW_WSC_MANY_CANDIDATE */ }; #endif /* WSC_INCLUDED */ #endif /* SYSTEM_LOG_SUPPORT */ NDIS_STATUS RTMPReadParametersHook( IN PRTMP_ADAPTER pAd) { PSTRING src = NULL; RTMP_OS_FD srcf; RTMP_OS_FS_INFO osFSInfo; INT retval = NDIS_STATUS_FAILURE; PSTRING buffer; #ifdef HOSTAPD_SUPPORT int i; #endif /*HOSTAPD_SUPPORT */ /* buffer = kmalloc(MAX_INI_BUFFER_SIZE, MEM_ALLOC_FLAG); */ os_alloc_mem(pAd, (UCHAR **)&buffer, MAX_INI_BUFFER_SIZE); if(buffer == NULL) return NDIS_STATUS_FAILURE; memset(buffer, 0x00, MAX_INI_BUFFER_SIZE); { #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { src = AP_PROFILE_PATH; } #endif /* CONFIG_AP_SUPPORT */ #ifdef MULTIPLE_CARD_SUPPORT src = (PSTRING)pAd->MC_FileName; #endif /* MULTIPLE_CARD_SUPPORT */ } if (src && *src) { RtmpOSFSInfoChange(&osFSInfo, TRUE); srcf = RtmpOSFileOpen(src, O_RDONLY, 0); if (IS_FILE_OPEN_ERR(srcf)) { DBGPRINT(RT_DEBUG_ERROR, ("Open file \"%s\" failed!\n", src)); } else { retval =RtmpOSFileRead(srcf, buffer, MAX_INI_BUFFER_SIZE); if (retval > 0) { RTMPSetProfileParameters(pAd, buffer); retval = NDIS_STATUS_SUCCESS; } else DBGPRINT(RT_DEBUG_ERROR, ("Read file \"%s\" failed(errCode=%d)!\n", src, retval)); retval = RtmpOSFileClose(srcf); if ( retval != 0) { retval = NDIS_STATUS_FAILURE; DBGPRINT(RT_DEBUG_ERROR, ("Close file \"%s\" failed(errCode=%d)!\n", src, retval)); } } RtmpOSFSInfoChange(&osFSInfo, FALSE); } #ifdef HOSTAPD_SUPPORT for (i = 0; i < pAd->ApCfg.BssidNum; i++) { pAd->ApCfg.MBSSID[i].Hostapd=FALSE; DBGPRINT(RT_DEBUG_TRACE, ("Reset ra%d hostapd support=FLASE", i)); } #endif /*HOSTAPD_SUPPORT */ #ifdef SINGLE_SKU_V2 RTMPSetSingleSKUParameters(pAd); #endif /* SINGLE_SKU_V2 */ /* kfree(buffer); */ os_free_mem(NULL, buffer); return (retval); } #ifdef SYSTEM_LOG_SUPPORT /* ======================================================================== Routine Description: Send log message through wireless event Support standard iw_event with IWEVCUSTOM. It is used below. iwreq_data.data.flags is used to store event_flag that is defined by user. iwreq_data.data.length is the length of the event log. The format of the event log is composed of the entry's MAC address and the desired log message (refer to pWirelessEventText). ex: 11:22:33:44:55:66 has associated successfully p.s. The requirement of Wireless Extension is v15 or newer. ======================================================================== */ VOID RtmpDrvSendWirelessEvent( IN VOID *pAdSrc, IN USHORT Event_flag, IN PUCHAR pAddr, IN UCHAR BssIdx, IN CHAR Rssi) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; PSTRING pBuf = NULL, pBufPtr = NULL; USHORT event, type, BufLen; UCHAR event_table_len = 0; if (pAd->CommonCfg.bWirelessEvent == FALSE) return; type = Event_flag & 0xFF00; event = Event_flag & 0x00FF; switch (type) { case IW_SYS_EVENT_FLAG_START: event_table_len = IW_SYS_EVENT_TYPE_NUM; break; #ifdef IDS_SUPPORT case IW_SPOOF_EVENT_FLAG_START: event_table_len = IW_SPOOF_EVENT_TYPE_NUM; break; case IW_FLOOD_EVENT_FLAG_START: event_table_len = IW_FLOOD_EVENT_TYPE_NUM; break; #endif /* IDS_SUPPORT */ #ifdef WSC_INCLUDED case IW_WSC_EVENT_FLAG_START: event_table_len = IW_WSC_EVENT_TYPE_NUM; break; #endif /* WSC_INCLUDED */ } if (event_table_len == 0) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __FUNCTION__, type)); return; } if (event >= event_table_len) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __FUNCTION__, event)); return; } /*Allocate memory and copy the msg. */ /* if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) */ os_alloc_mem(NULL, (UCHAR **)&pBuf, IW_CUSTOM_MAX_LEN); if(pBuf != NULL) { /*Prepare the payload */ memset(pBuf, 0, IW_CUSTOM_MAX_LEN); pBufPtr = pBuf; if (pAddr) pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr)); else if (BssIdx < MAX_MBSSID_NUM(pAd)) pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx); else pBufPtr += sprintf(pBufPtr, "(RT2860) "); if (type == IW_SYS_EVENT_FLAG_START) { pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]); if (Event_flag == IW_CHANNEL_CHANGE_EVENT_FLAG) { pBufPtr += sprintf(pBufPtr, "%3d", Rssi); } } #ifdef IDS_SUPPORT else if (type == IW_SPOOF_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi); else if (type == IW_FLOOD_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]); #endif /* IDS_SUPPORT */ #ifdef WSC_INCLUDED else if (type == IW_WSC_EVENT_FLAG_START) pBufPtr += sprintf(pBufPtr, "%s", pWirelessWscEventText[event]); #endif /* WSC_INCLUDED */ else pBufPtr += sprintf(pBufPtr, "%s", "unknown event"); pBufPtr[pBufPtr - pBuf] = '\0'; BufLen = pBufPtr - pBuf; RtmpOSWrielessEventSend(pAd->net_dev, RT_WLAN_EVENT_CUSTOM, Event_flag, NULL, (PUCHAR)pBuf, BufLen); /*DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __FUNCTION__, pBuf)); */ /* kfree(pBuf); */ os_free_mem(NULL, pBuf); } else DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __FUNCTION__)); } #endif /* SYSTEM_LOG_SUPPORT */ void RTMP_IndicateMediaState( IN PRTMP_ADAPTER pAd, IN NDIS_MEDIA_STATE media_state) { pAd->IndicateMediaState = media_state; #ifdef SYSTEM_LOG_SUPPORT if (pAd->IndicateMediaState == NdisMediaStateConnected) { RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); } else { RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0); } #endif /* SYSTEM_LOG_SUPPORT */ } void tbtt_tasklet(unsigned long data) { #ifdef CONFIG_AP_SUPPORT #ifdef WORKQUEUE_BH struct work_struct *work = (struct work_struct *)data; POS_COOKIE pObj = container_of(work, struct os_cookie, tbtt_task); RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pObj->pAd_va; #else PRTMP_ADAPTER pAd = (RTMP_ADAPTER *)data; #endif /* WORKQUEUE_BH */ if (pAd->OpMode == OPMODE_AP) { /* step 7 - if DTIM, then move backlogged bcast/mcast frames from PSQ to TXQ whenever DtimCount==0 */ #ifdef RTMP_MAC_USB if ((pAd->ApCfg.DtimCount + 1) == pAd->ApCfg.DtimPeriod) #endif /* RTMP_MAC_USB */ { PQUEUE_ENTRY pEntry; BOOLEAN bPS = FALSE; UINT count = 0; unsigned long IrqFlags; /* NdisAcquireSpinLock(&pAd->MacTabLock); */ /* NdisAcquireSpinLock(&pAd->TxSwQueueLock); */ RTMP_IRQ_LOCK(&pAd->irq_lock, IrqFlags); while (pAd->MacTab.McastPsQueue.Head) { bPS = TRUE; if (pAd->TxSwQueue[QID_AC_BE].Number <= (pAd->TxSwQMaxLen + MAX_PACKETS_IN_MCAST_PS_QUEUE)) { pEntry = RemoveHeadQueue(&pAd->MacTab.McastPsQueue); /*if(pAd->MacTab.McastPsQueue.Number) */ if (count) { RTMP_SET_PACKET_MOREDATA(pEntry, TRUE); } InsertHeadQueue(&pAd->TxSwQueue[QID_AC_BE], pEntry); count++; } else { break; } } RTMP_IRQ_UNLOCK(&pAd->irq_lock, IrqFlags); /* NdisReleaseSpinLock(&pAd->TxSwQueueLock); */ /* NdisReleaseSpinLock(&pAd->MacTabLock); */ if (pAd->MacTab.McastPsQueue.Number == 0) { UINT bss_index; /* clear MCAST/BCAST backlog bit for all BSS */ for(bss_index=BSS0; bss_indexApCfg.BssidNum; bss_index++) WLAN_MR_TIM_BCMC_CLEAR(bss_index); } pAd->MacTab.PsQIdleCount = 0; /* Dequeue outgoing framea from TxSwQueue0..3 queue and process it */ if (bPS == TRUE) { RTMPDeQueuePacket(pAd, FALSE, NUM_OF_TX_RING, /*MAX_TX_IN_TBTT*/MAX_PACKETS_IN_MCAST_PS_QUEUE); } } } #endif /* CONFIG_AP_SUPPORT */ } void announce_802_3_packet( IN VOID *pAdSrc, IN PNDIS_PACKET pPacket, IN UCHAR OpMode) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)pAdSrc; PNDIS_PACKET pRxPkt = pPacket; ASSERT(pPacket); MEM_DBG_PKT_FREE_INC(pPacket); #ifdef CONFIG_AP_SUPPORT #ifdef APCLI_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) { if (RTMP_MATPktRxNeedConvert(pAd, RtmpOsPktNetDevGet(pRxPkt))) RTMP_MATEngineRxHandle(pAd, pRxPkt, 0); } #endif /* APCLI_SUPPORT */ #endif /* CONFIG_AP_SUPPORT */ /* Push up the protocol stack */ #ifdef CONFIG_AP_SUPPORT #ifdef PLATFORM_BL2348 { extern int (*pToUpperLayerPktSent)(PNDIS_PACKET *pSkb); RtmpOsPktProtocolAssign(pRxPkt); pToUpperLayerPktSent(pRxPkt); return; } #endif /* PLATFORM_BL2348 */ #endif /* CONFIG_AP_SUPPORT */ #ifdef IKANOS_VX_1X0 { IKANOS_DataFrameRx(pAd, pRxPkt); return; } #endif /* IKANOS_VX_1X0 */ #ifdef INF_PPA_SUPPORT if (ppa_hook_directpath_send_fn && pAd->PPAEnable==TRUE ) { RtmpOsPktInfPpaSend(pRxPkt); pRxPkt=NULL; return; } #endif /* INF_PPA_SUPPORT */ #ifdef CONFIG_AP_SUPPORT #ifdef BG_FT_SUPPORT if (BG_FTPH_PacketFromApHandle(pRxPkt) == 0) return; #endif /* BG_FT_SUPPORT */ #endif /* CONFIG_AP_SUPPORT */ //+++Add by shiang for debug if (0) { hex_dump("announce_802_3_packet", GET_OS_PKT_DATAPTR(pRxPkt), GET_OS_PKT_LEN(pRxPkt)); } //---Add by shiang for debug RtmpOsPktProtocolAssign(pRxPkt); RtmpOsPktRcvHandle(pRxPkt); } extern NDIS_SPIN_LOCK TimerSemLock; VOID RTMPFreeAdapter( IN VOID *pAdSrc) { PRTMP_ADAPTER pAd = (PRTMP_ADAPTER)pAdSrc; POS_COOKIE os_cookie; int index; os_cookie=(POS_COOKIE)pAd->OS_Cookie; if (pAd->BeaconBuf) os_free_mem(NULL, pAd->BeaconBuf); NdisFreeSpinLock(&pAd->MgmtRingLock); for (index =0 ; index < NUM_OF_TX_RING; index++) { NdisFreeSpinLock(&pAd->TxSwQueueLock[index]); NdisFreeSpinLock(&pAd->DeQueueLock[index]); pAd->DeQueueRunning[index] = FALSE; } NdisFreeSpinLock(&pAd->irq_lock); #ifdef UAPSD_SUPPORT NdisFreeSpinLock(&pAd->UAPSDEOSPLock); /* OS_ABL_SUPPORT */ #endif /* UAPSD_SUPPORT */ #ifdef DOT11_N_SUPPORT NdisFreeSpinLock(&pAd->mpdu_blk_pool.lock); #endif /* DOT11_N_SUPPORT */ if (pAd->iw_stats) { os_free_mem(NULL, pAd->iw_stats); pAd->iw_stats = NULL; } if (pAd->stats) { os_free_mem(NULL, pAd->stats); pAd->stats = NULL; } NdisFreeSpinLock(&TimerSemLock); #ifdef RALINK_ATE #ifdef RTMP_MAC_USB RTMP_OS_ATMOIC_DESTROY(&pAd->BulkOutRemained); RTMP_OS_ATMOIC_DESTROY(&pAd->BulkInRemained); #endif /* RTMP_MAC_USB */ #endif /* RALINK_ATE */ RTMP_OS_FREE_TIMER(pAd); RTMP_OS_FREE_LOCK(pAd); RTMP_OS_FREE_TASKLET(pAd); RTMP_OS_FREE_TASK(pAd); RTMP_OS_FREE_SEM(pAd); RTMP_OS_FREE_ATOMIC(pAd); RtmpOsVfree(pAd); /* pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); */ if (os_cookie) os_free_mem(NULL, os_cookie); } int RTMPSendPackets( IN NDIS_HANDLE dev_hnd, IN PPNDIS_PACKET ppPacketArray, IN UINT NumberOfPackets, IN UINT32 PktTotalLen, IN RTMP_NET_ETH_CONVERT_DEV_SEARCH Func) { RTMP_ADAPTER *pAd = (RTMP_ADAPTER *)dev_hnd; PNDIS_PACKET pPacket = ppPacketArray[0]; INC_COUNTER64(pAd->WlanCounters.TransmitCountFrmOs); if (pPacket == NULL) goto done; /* RT2870STA does this in RTMPSendPackets() */ #ifdef RALINK_ATE if (ATE_ON(pAd)) { RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_RESOURCES); return 0; } #endif /* RALINK_ATE */ /* EapolStart size is 18 */ if (PktTotalLen < 14) { /*printk("bad packet size: %d\n", pkt->len); */ hex_dump("bad packet", GET_OS_PKT_DATAPTR(pPacket), PktTotalLen); RELEASE_NDIS_PACKET(pAd, pPacket, NDIS_STATUS_FAILURE); return 0; } RTMP_SET_PACKET_5VT(pPacket, 0); /* MiniportMMRequest(pAd, pkt->data, pkt->len); */ #ifdef CONFIG_5VT_ENHANCE if (*(int*)(GET_OS_PKT_CB(pPacket)) == BRIDGE_TAG) { RTMP_SET_PACKET_5VT(pPacket, 1); } #endif #ifdef CONFIG_AP_SUPPORT IF_DEV_CONFIG_OPMODE_ON_AP(pAd) APSendPackets((NDIS_HANDLE)pAd, (PPNDIS_PACKET) &pPacket, 1); #endif /* CONFIG_AP_SUPPORT */ done: return 0; } PNET_DEV get_netdev_from_bssid( IN PRTMP_ADAPTER pAd, IN UCHAR FromWhichBSSID) { PNET_DEV dev_p = NULL; #ifdef CONFIG_AP_SUPPORT UCHAR infRealIdx; #endif /* CONFIG_AP_SUPPORT */ do { #ifdef CONFIG_AP_SUPPORT infRealIdx = FromWhichBSSID & (NET_DEVICE_REAL_IDX_MASK); #ifdef APCLI_SUPPORT if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_APCLI) { dev_p = (infRealIdx >= MAX_APCLI_NUM ? NULL : pAd->ApCfg.ApCliTab[infRealIdx].dev); break; } #endif /* APCLI_SUPPORT */ #ifdef WDS_SUPPORT if(FromWhichBSSID >= MIN_NET_DEVICE_FOR_WDS) { dev_p = ((infRealIdx >= MAX_WDS_ENTRY) ? NULL : pAd->WdsTab.WdsEntry[infRealIdx].dev); break; } #endif /* WDS_SUPPORT */ if ((FromWhichBSSID > 0) && (FromWhichBSSID < pAd->ApCfg.BssidNum) && (FromWhichBSSID < MAX_MBSSID_NUM(pAd)) && (FromWhichBSSID < HW_BEACON_MAX_NUM)) { dev_p = pAd->ApCfg.MBSSID[FromWhichBSSID].MSSIDDev; } else #endif /* CONFIG_AP_SUPPORT */ { dev_p = pAd->net_dev; } } while (FALSE); ASSERT(dev_p); return dev_p; /* return one of MBSS */ } #ifdef CONFIG_AP_SUPPORT /* ======================================================================== 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; } VOID AP_E2PROM_IOCTL_PostCtrl( IN RTMP_IOCTL_INPUT_STRUCT *wrq, IN PSTRING msg) { wrq->u.data.length = strlen(msg); if (copy_to_user(wrq->u.data.pointer, msg, wrq->u.data.length)) { DBGPRINT(RT_DEBUG_TRACE, ("%s: copy_to_user() fail\n", __FUNCTION__)); } } VOID IAPP_L2_UpdatePostCtrl( IN PRTMP_ADAPTER pAd, IN UINT8 *mac_p, IN INT bssid) { } #endif /* CONFIG_AP_SUPPORT */ //#ifdef WDS_SUPPORT VOID AP_WDS_KeyNameMakeUp( IN STRING *pKey, IN UINT32 KeyMaxSize, IN INT KeyId) { snprintf(pKey, KeyMaxSize, "Wds%dKey", KeyId); } //#endif /* WDS_SUPPORT */