📄 rt_linux.c
字号:
/* ************************************************************************* * Ralink Tech Inc. * 5F., No.36, Taiyuan St., Jhubei City, * Hsinchu County 302, * Taiwan, R.O.C. * * (c) Copyright 2002-2007, Ralink Technology, Inc. * * This program is free software; you can redistribute it and/or modify * * it under the terms of the GNU General Public License as published by * * the Free Software Foundation; either version 2 of the License, or * * (at your option) any later version. * * * * This program is distributed in the hope that it will be useful, * * but WITHOUT ANY WARRANTY; without even the implied warranty of * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * * GNU General Public License for more details. * * * * You should have received a copy of the GNU General Public License * * along with this program; if not, write to the * * Free Software Foundation, Inc., * * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * * ************************************************************************* */#include "rt_config.h"ULONG RTDebugLevel = RT_DEBUG_ERROR;BUILD_TIMER_FUNCTION(MlmePeriodicExec);//BUILD_TIMER_FUNCTION(MlmeRssiReportExec);BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);BUILD_TIMER_FUNCTION(APSDPeriodicExec);BUILD_TIMER_FUNCTION(AsicRfTuningExec);#ifdef RT2870BUILD_TIMER_FUNCTION(BeaconUpdateExec);#endif // RT2870 //#ifdef CONFIG_STA_SUPPORTBUILD_TIMER_FUNCTION(BeaconTimeout);BUILD_TIMER_FUNCTION(ScanTimeout);BUILD_TIMER_FUNCTION(AuthTimeout);BUILD_TIMER_FUNCTION(AssocTimeout);BUILD_TIMER_FUNCTION(ReassocTimeout);BUILD_TIMER_FUNCTION(DisassocTimeout);BUILD_TIMER_FUNCTION(LinkDownExec);#ifdef LEAP_SUPPORTBUILD_TIMER_FUNCTION(LeapAuthTimeout);#endifBUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);#ifdef QOS_DLS_SUPPORTBUILD_TIMER_FUNCTION(DlsTimeoutAction);#endif // QOS_DLS_SUPPORT //#endif // CONFIG_STA_SUPPORT //// for wireless system event messagechar 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 */ }; // for wireless IDS_spoof_attack event messagechar 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 messagechar 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 */ };/* timeout -- ms */VOID RTMP_SetPeriodicTimer( IN NDIS_MINIPORT_TIMER *pTimer, IN unsigned long timeout){ timeout = ((timeout*HZ) / 1000); pTimer->expires = jiffies + timeout; add_timer(pTimer);}/* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */VOID RTMP_OS_Init_Timer( IN PRTMP_ADAPTER pAd, IN NDIS_MINIPORT_TIMER *pTimer, IN TIMER_FUNCTION function, IN PVOID data){ init_timer(pTimer); pTimer->data = (unsigned long)data; pTimer->function = function; }VOID RTMP_OS_Add_Timer( IN NDIS_MINIPORT_TIMER *pTimer, IN unsigned long timeout){ if (timer_pending(pTimer)) return; timeout = ((timeout*HZ) / 1000); pTimer->expires = jiffies + timeout; add_timer(pTimer);}VOID RTMP_OS_Mod_Timer( IN NDIS_MINIPORT_TIMER *pTimer, IN unsigned long timeout){ timeout = ((timeout*HZ) / 1000); mod_timer(pTimer, jiffies + timeout);}VOID RTMP_OS_Del_Timer( IN NDIS_MINIPORT_TIMER *pTimer, OUT BOOLEAN *pCancelled){ if (timer_pending(pTimer)) { *pCancelled = del_timer_sync(pTimer); } else { *pCancelled = TRUE; } }VOID RTMP_OS_Release_Packet( IN PRTMP_ADAPTER pAd, IN PQUEUE_ENTRY pEntry){ //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);} // Unify all delay routine by using udelayVOID RTMPusecDelay( IN ULONG usec){ ULONG i; for (i = 0; i < (usec / 50); i++) udelay(50); if (usec % 50) udelay(usec % 50);}void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time){ time->u.LowPart = jiffies;}// pAd MUST allow to be NULLNDIS_STATUS os_alloc_mem( IN PRTMP_ADAPTER pAd, OUT PUCHAR *mem, IN ULONG size){ *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC); if (*mem) return (NDIS_STATUS_SUCCESS); else return (NDIS_STATUS_FAILURE);}// pAd MUST allow to be NULLNDIS_STATUS os_free_mem( IN PRTMP_ADAPTER pAd, IN PUCHAR mem){ ASSERT(mem); kfree(mem); return (NDIS_STATUS_SUCCESS);}PNDIS_PACKET RTMP_AllocateFragPacketBuffer( IN PRTMP_ADAPTER pAd, IN ULONG Length){ struct sk_buff *pkt; pkt = dev_alloc_skb(Length); if (pkt == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length)); } if (pkt) { RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); } return (PNDIS_PACKET) pkt; }PNDIS_PACKET RTMP_AllocateTxPacketBuffer( IN PRTMP_ADAPTER pAd, IN ULONG Length, IN BOOLEAN Cached, OUT PVOID *VirtualAddress){ struct sk_buff *pkt; pkt = dev_alloc_skb(Length); if (pkt == NULL) { DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length)); } if (pkt) { RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); *VirtualAddress = (PVOID) pkt->data; } else { *VirtualAddress = (PVOID) NULL; } return (PNDIS_PACKET) pkt; }VOID build_tx_packet( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, IN PUCHAR pFrame, IN ULONG FrameLen){ struct sk_buff *pTxPkt; ASSERT(pPacket); pTxPkt = RTPKT_TO_OSPKT(pPacket); NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen); }VOID RTMPFreeAdapter( IN PRTMP_ADAPTER pAd){ POS_COOKIE os_cookie; int index; os_cookie=(POS_COOKIE)pAd->OS_Cookie; kfree(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); vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa); kfree(os_cookie);}BOOLEAN OS_Need_Clone_Packet(void){ return (FALSE); }/* ======================================================================== Routine Description: clone an input NDIS PACKET to another one. The new internally created NDIS PACKET must have only one NDIS BUFFER return - byte copied. 0 means can't create NDIS PACKET NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket Arguments: pAd Pointer to our adapter pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU. *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet. Return Value: NDIS_STATUS_SUCCESS NDIS_STATUS_FAILURE Note: ========================================================================*/NDIS_STATUS RTMPCloneNdisPacket( IN PRTMP_ADAPTER pAd, IN BOOLEAN pInsAMSDUHdr, IN PNDIS_PACKET pInPacket, OUT PNDIS_PACKET *ppOutPacket){ struct sk_buff *pkt; ASSERT(pInPacket); ASSERT(ppOutPacket); // 1. Allocate a packet pkt = dev_alloc_skb(2048); if (pkt == NULL) { return NDIS_STATUS_FAILURE; } skb_put(pkt, GET_OS_PKT_LEN(pInPacket)); NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket)); *ppOutPacket = OSPKT_TO_RTPKT(pkt); RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS); printk("###Clone###\n"); return NDIS_STATUS_SUCCESS;}// the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()NDIS_STATUS RTMPAllocateNdisPacket( IN PRTMP_ADAPTER pAd, OUT PNDIS_PACKET *ppPacket, IN PUCHAR pHeader, IN UINT HeaderLen, IN PUCHAR pData, IN UINT DataLen){ PNDIS_PACKET pPacket; ASSERT(pData); ASSERT(DataLen); // 1. Allocate a packet pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE); if (pPacket == NULL) { *ppPacket = NULL;#ifdef DEBUG printk("RTMPAllocateNdisPacket Fail\n\n");#endif return NDIS_STATUS_FAILURE; } // 2. clone the frame content if (HeaderLen > 0) NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen); if (DataLen > 0) NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen); // 3. update length of packet skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen); RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);// printk("%s : pPacket = %p, len = %d\n", __FUNCTION__, pPacket, GET_OS_PKT_LEN(pPacket)); *ppPacket = pPacket; return NDIS_STATUS_SUCCESS;}/* ======================================================================== Description: This routine frees a miniport internally allocated NDIS_PACKET and its corresponding NDIS_BUFFER and allocated memory. ========================================================================*/VOID RTMPFreeNdisPacket( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket){ dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));}// IRQL = DISPATCH_LEVEL// NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same // scatter gather bufferNDIS_STATUS Sniff2BytesFromNdisBuffer( IN PNDIS_BUFFER pFirstBuffer, IN UCHAR DesiredOffset, OUT PUCHAR pByte0, OUT PUCHAR pByte1){ *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset); *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1); return NDIS_STATUS_SUCCESS;}void RTMP_QueryPacketInfo( IN PNDIS_PACKET pPacket, OUT PACKET_INFO *pPacketInfo, OUT PUCHAR *pSrcBufVA, OUT UINT *pSrcBufLen){ pPacketInfo->BufferCount = 1; pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket); pPacketInfo->PhysicalBufferCount = 1; pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); *pSrcBufLen = GET_OS_PKT_LEN(pPacket); }void RTMP_QueryNextPacketInfo( IN PNDIS_PACKET *ppPacket, OUT PACKET_INFO *pPacketInfo, OUT PUCHAR *pSrcBufVA, OUT UINT *pSrcBufLen){ PNDIS_PACKET pPacket = NULL; if (*ppPacket) pPacket = GET_OS_PKT_NEXT(*ppPacket); if (pPacket) { pPacketInfo->BufferCount = 1; pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket); pPacketInfo->PhysicalBufferCount = 1; pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket); *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket); *pSrcBufLen = GET_OS_PKT_LEN(pPacket); *ppPacket = GET_OS_PKT_NEXT(pPacket); } else { pPacketInfo->BufferCount = 0; pPacketInfo->pFirstBuffer = NULL; pPacketInfo->PhysicalBufferCount = 0; pPacketInfo->TotalPacketLength = 0; *pSrcBufVA = NULL; *pSrcBufLen = 0; *ppPacket = NULL; }}// not yet support MBSSPNET_DEV get_netdev_from_bssid( IN PRTMP_ADAPTER pAd, IN UCHAR FromWhichBSSID){ PNET_DEV dev_p = NULL;#ifdef CONFIG_STA_SUPPORT IF_DEV_CONFIG_OPMODE_ON_STA(pAd) { dev_p = pAd->net_dev; }#endif // CONFIG_STA_SUPPORT // ASSERT(dev_p); return dev_p; /* return one of MBSS */} PNDIS_PACKET DuplicatePacket( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, IN UCHAR FromWhichBSSID){ struct sk_buff *skb; PNDIS_PACKET pRetPacket = NULL; USHORT DataSize; UCHAR *pData; DataSize = (USHORT) GET_OS_PKT_LEN(pPacket); pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket); skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG); if (skb) {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -