2 *************************************************************************
4 * 5F., No.36, Taiyuan St., Jhubei City,
8 * (c) Copyright 2002-2007, Ralink Technology, Inc.
10 * This program is free software; you can redistribute it and/or modify *
11 * it under the terms of the GNU General Public License as published by *
12 * the Free Software Foundation; either version 2 of the License, or *
13 * (at your option) any later version. *
15 * This program is distributed in the hope that it will be useful, *
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
18 * GNU General Public License for more details. *
20 * You should have received a copy of the GNU General Public License *
21 * along with this program; if not, write to the *
22 * Free Software Foundation, Inc., *
23 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
25 *************************************************************************
28 #include "rt_config.h"
30 ULONG RTDebugLevel = RT_DEBUG_ERROR;
32 BUILD_TIMER_FUNCTION(MlmePeriodicExec);
33 //BUILD_TIMER_FUNCTION(MlmeRssiReportExec);
34 BUILD_TIMER_FUNCTION(AsicRxAntEvalTimeout);
35 BUILD_TIMER_FUNCTION(APSDPeriodicExec);
36 BUILD_TIMER_FUNCTION(AsicRfTuningExec);
38 BUILD_TIMER_FUNCTION(BeaconUpdateExec);
42 #ifdef CONFIG_STA_SUPPORT
43 BUILD_TIMER_FUNCTION(BeaconTimeout);
44 BUILD_TIMER_FUNCTION(ScanTimeout);
45 BUILD_TIMER_FUNCTION(AuthTimeout);
46 BUILD_TIMER_FUNCTION(AssocTimeout);
47 BUILD_TIMER_FUNCTION(ReassocTimeout);
48 BUILD_TIMER_FUNCTION(DisassocTimeout);
49 BUILD_TIMER_FUNCTION(LinkDownExec);
51 BUILD_TIMER_FUNCTION(LeapAuthTimeout);
53 BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
54 BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
55 #ifdef QOS_DLS_SUPPORT
56 BUILD_TIMER_FUNCTION(DlsTimeoutAction);
57 #endif // QOS_DLS_SUPPORT //
58 #endif // CONFIG_STA_SUPPORT //
60 // for wireless system event message
61 char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
62 // system status event
63 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
64 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
65 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
66 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
67 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
68 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
69 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
70 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
71 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
72 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
73 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
74 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
75 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
76 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
77 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
78 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
79 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
80 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
81 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
84 // for wireless IDS_spoof_attack event message
85 char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
86 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
87 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
88 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
89 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
90 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
91 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
92 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
93 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
94 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
95 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
98 // for wireless IDS_flooding_attack event message
99 char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
100 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
101 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
102 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
103 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
104 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
105 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
106 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
110 VOID RTMP_SetPeriodicTimer(
111 IN NDIS_MINIPORT_TIMER *pTimer,
112 IN unsigned long timeout)
114 timeout = ((timeout*HZ) / 1000);
115 pTimer->expires = jiffies + timeout;
119 /* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
120 VOID RTMP_OS_Init_Timer(
121 IN PRTMP_ADAPTER pAd,
122 IN NDIS_MINIPORT_TIMER *pTimer,
123 IN TIMER_FUNCTION function,
127 pTimer->data = (unsigned long)data;
128 pTimer->function = function;
132 VOID RTMP_OS_Add_Timer(
133 IN NDIS_MINIPORT_TIMER *pTimer,
134 IN unsigned long timeout)
136 if (timer_pending(pTimer))
139 timeout = ((timeout*HZ) / 1000);
140 pTimer->expires = jiffies + timeout;
144 VOID RTMP_OS_Mod_Timer(
145 IN NDIS_MINIPORT_TIMER *pTimer,
146 IN unsigned long timeout)
148 timeout = ((timeout*HZ) / 1000);
149 mod_timer(pTimer, jiffies + timeout);
152 VOID RTMP_OS_Del_Timer(
153 IN NDIS_MINIPORT_TIMER *pTimer,
154 OUT BOOLEAN *pCancelled)
156 if (timer_pending(pTimer))
158 *pCancelled = del_timer_sync(pTimer);
167 VOID RTMP_OS_Release_Packet(
168 IN PRTMP_ADAPTER pAd,
169 IN PQUEUE_ENTRY pEntry)
171 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
174 // Unify all delay routine by using udelay
180 for (i = 0; i < (usec / 50); i++)
187 void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
189 time->u.LowPart = jiffies;
192 // pAd MUST allow to be NULL
193 NDIS_STATUS os_alloc_mem(
194 IN PRTMP_ADAPTER pAd,
198 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
200 return (NDIS_STATUS_SUCCESS);
202 return (NDIS_STATUS_FAILURE);
205 // pAd MUST allow to be NULL
206 NDIS_STATUS os_free_mem(
207 IN PRTMP_ADAPTER pAd,
213 return (NDIS_STATUS_SUCCESS);
217 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
218 IN PRTMP_ADAPTER pAd,
223 pkt = dev_alloc_skb(Length);
227 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));
232 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
235 return (PNDIS_PACKET) pkt;
239 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
240 IN PRTMP_ADAPTER pAd,
243 OUT PVOID *VirtualAddress)
247 pkt = dev_alloc_skb(Length);
251 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));
256 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
257 *VirtualAddress = (PVOID) pkt->data;
261 *VirtualAddress = (PVOID) NULL;
264 return (PNDIS_PACKET) pkt;
268 VOID build_tx_packet(
269 IN PRTMP_ADAPTER pAd,
270 IN PNDIS_PACKET pPacket,
275 struct sk_buff *pTxPkt;
278 pTxPkt = RTPKT_TO_OSPKT(pPacket);
280 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
283 VOID RTMPFreeAdapter(
284 IN PRTMP_ADAPTER pAd)
286 POS_COOKIE os_cookie;
289 os_cookie=(POS_COOKIE)pAd->OS_Cookie;
291 kfree(pAd->BeaconBuf);
294 NdisFreeSpinLock(&pAd->MgmtRingLock);
297 for (index =0 ; index < NUM_OF_TX_RING; index++)
299 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
300 NdisFreeSpinLock(&pAd->DeQueueLock[index]);
301 pAd->DeQueueRunning[index] = FALSE;
304 NdisFreeSpinLock(&pAd->irq_lock);
307 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
311 BOOLEAN OS_Need_Clone_Packet(void)
319 ========================================================================
322 clone an input NDIS PACKET to another one. The new internally created NDIS PACKET
323 must have only one NDIS BUFFER
324 return - byte copied. 0 means can't create NDIS PACKET
325 NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket
328 pAd Pointer to our adapter
329 pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.
330 *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet.
338 ========================================================================
340 NDIS_STATUS RTMPCloneNdisPacket(
341 IN PRTMP_ADAPTER pAd,
342 IN BOOLEAN pInsAMSDUHdr,
343 IN PNDIS_PACKET pInPacket,
344 OUT PNDIS_PACKET *ppOutPacket)
352 // 1. Allocate a packet
353 pkt = dev_alloc_skb(2048);
357 return NDIS_STATUS_FAILURE;
360 skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
361 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));
362 *ppOutPacket = OSPKT_TO_RTPKT(pkt);
365 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
367 printk("###Clone###\n");
369 return NDIS_STATUS_SUCCESS;
373 // the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
374 NDIS_STATUS RTMPAllocateNdisPacket(
375 IN PRTMP_ADAPTER pAd,
376 OUT PNDIS_PACKET *ppPacket,
382 PNDIS_PACKET pPacket;
386 // 1. Allocate a packet
387 pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
392 printk("RTMPAllocateNdisPacket Fail\n\n");
394 return NDIS_STATUS_FAILURE;
397 // 2. clone the frame content
399 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
401 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);
403 // 3. update length of packet
404 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);
406 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
407 // printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
409 return NDIS_STATUS_SUCCESS;
413 ========================================================================
415 This routine frees a miniport internally allocated NDIS_PACKET and its
416 corresponding NDIS_BUFFER and allocated memory.
417 ========================================================================
419 VOID RTMPFreeNdisPacket(
420 IN PRTMP_ADAPTER pAd,
421 IN PNDIS_PACKET pPacket)
423 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
427 // IRQL = DISPATCH_LEVEL
428 // NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
429 // scatter gather buffer
430 NDIS_STATUS Sniff2BytesFromNdisBuffer(
431 IN PNDIS_BUFFER pFirstBuffer,
432 IN UCHAR DesiredOffset,
436 *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);
437 *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);
439 return NDIS_STATUS_SUCCESS;
443 void RTMP_QueryPacketInfo(
444 IN PNDIS_PACKET pPacket,
445 OUT PACKET_INFO *pPacketInfo,
446 OUT PUCHAR *pSrcBufVA,
447 OUT UINT *pSrcBufLen)
449 pPacketInfo->BufferCount = 1;
450 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
451 pPacketInfo->PhysicalBufferCount = 1;
452 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
454 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
455 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
458 void RTMP_QueryNextPacketInfo(
459 IN PNDIS_PACKET *ppPacket,
460 OUT PACKET_INFO *pPacketInfo,
461 OUT PUCHAR *pSrcBufVA,
462 OUT UINT *pSrcBufLen)
464 PNDIS_PACKET pPacket = NULL;
467 pPacket = GET_OS_PKT_NEXT(*ppPacket);
471 pPacketInfo->BufferCount = 1;
472 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
473 pPacketInfo->PhysicalBufferCount = 1;
474 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
476 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
477 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
478 *ppPacket = GET_OS_PKT_NEXT(pPacket);
482 pPacketInfo->BufferCount = 0;
483 pPacketInfo->pFirstBuffer = NULL;
484 pPacketInfo->PhysicalBufferCount = 0;
485 pPacketInfo->TotalPacketLength = 0;
493 // not yet support MBSS
494 PNET_DEV get_netdev_from_bssid(
495 IN PRTMP_ADAPTER pAd,
496 IN UCHAR FromWhichBSSID)
498 PNET_DEV dev_p = NULL;
501 #ifdef CONFIG_STA_SUPPORT
502 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
504 dev_p = pAd->net_dev;
506 #endif // CONFIG_STA_SUPPORT //
509 return dev_p; /* return one of MBSS */
512 PNDIS_PACKET DuplicatePacket(
513 IN PRTMP_ADAPTER pAd,
514 IN PNDIS_PACKET pPacket,
515 IN UCHAR FromWhichBSSID)
518 PNDIS_PACKET pRetPacket = NULL;
522 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
523 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
526 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
529 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
530 pRetPacket = OSPKT_TO_RTPKT(skb);
534 if ((skb = __dev_alloc_skb(DataSize + 2+32, MEM_ALLOC_FLAG)) != NULL)
536 skb_reserve(skb, 2+32);
537 NdisMoveMemory(skb->tail, pData, DataSize);
538 skb_put(skb, DataSize);
539 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
540 pRetPacket = OSPKT_TO_RTPKT(skb);
548 PNDIS_PACKET duplicate_pkt(
549 IN PRTMP_ADAPTER pAd,
550 IN PUCHAR pHeader802_3,
554 IN UCHAR FromWhichBSSID)
557 PNDIS_PACKET pPacket = NULL;
560 if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
563 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
564 skb_put(skb, HdrLen);
565 NdisMoveMemory(skb->tail, pData, DataSize);
566 skb_put(skb, DataSize);
567 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
568 pPacket = OSPKT_TO_RTPKT(skb);
575 #define TKIP_TX_MIC_SIZE 8
576 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
577 IN PRTMP_ADAPTER pAd,
578 IN PNDIS_PACKET pPacket)
580 struct sk_buff *skb, *newskb;
583 skb = RTPKT_TO_OSPKT(pPacket);
584 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)
586 // alloc a new skb and copy the packet
587 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
588 dev_kfree_skb_any(skb);
591 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
597 return OSPKT_TO_RTPKT(skb);
600 if ((data = skb_put(skb, TKIP_TX_MIC_SIZE)) != NULL)
601 { // If we can extend it, well, copy it first.
602 NdisMoveMemory(data, pAd->PrivateInfo.Tx.MIC, TKIP_TX_MIC_SIZE);
606 // Otherwise, copy the packet.
607 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
608 dev_kfree_skb_any(skb);
611 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC to packet failed!, dropping packet\n"));
616 NdisMoveMemory(skb->tail, pAd->PrivateInfo.Tx.MIC, TKIP_TX_MIC_SIZE);
617 skb_put(skb, TKIP_TX_MIC_SIZE);
620 return OSPKT_TO_RTPKT(skb);
628 PNDIS_PACKET ClonePacket(
629 IN PRTMP_ADAPTER pAd,
630 IN PNDIS_PACKET pPacket,
634 struct sk_buff *pRxPkt;
635 struct sk_buff *pClonedPkt;
638 pRxPkt = RTPKT_TO_OSPKT(pPacket);
641 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
645 // set the correct dataptr and data len
646 pClonedPkt->dev = pRxPkt->dev;
647 pClonedPkt->data = pData;
648 pClonedPkt->len = DataSize;
649 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
650 ASSERT(DataSize < 1530);
656 // change OS packet DataPtr and DataLen
658 void update_os_packet_info(
659 IN PRTMP_ADAPTER pAd,
661 IN UCHAR FromWhichBSSID)
663 struct sk_buff *pOSPkt;
665 ASSERT(pRxBlk->pRxPacket);
666 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
668 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
669 pOSPkt->data = pRxBlk->pData;
670 pOSPkt->len = pRxBlk->DataSize;
671 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
675 void wlan_802_11_to_802_3_packet(
676 IN PRTMP_ADAPTER pAd,
678 IN PUCHAR pHeader802_3,
679 IN UCHAR FromWhichBSSID)
681 struct sk_buff *pOSPkt;
683 ASSERT(pRxBlk->pRxPacket);
684 ASSERT(pHeader802_3);
686 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
688 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
689 pOSPkt->data = pRxBlk->pData;
690 pOSPkt->len = pRxBlk->DataSize;
691 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
698 #ifdef CONFIG_STA_SUPPORT
699 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
700 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
701 #endif // CONFIG_STA_SUPPORT //
706 void announce_802_3_packet(
707 IN PRTMP_ADAPTER pAd,
708 IN PNDIS_PACKET pPacket)
711 struct sk_buff *pRxPkt;
715 pRxPkt = RTPKT_TO_OSPKT(pPacket);
717 #ifdef CONFIG_STA_SUPPORT
718 #endif // CONFIG_STA_SUPPORT //
720 /* Push up the protocol stack */
722 IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);
724 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
726 //#ifdef CONFIG_5VT_ENHANCE
727 // *(int*)(pRxPkt->cb) = BRIDGE_TAG;
730 #endif // IKANOS_VX_1X0 //
734 PRTMP_SCATTER_GATHER_LIST
735 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg)
737 sg->NumberOfElements = 1;
738 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
739 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
743 void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
748 if (RTDebugLevel < RT_DEBUG_TRACE)
752 printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen);
753 for (x=0; x<SrcBufLen; x++)
756 printk("0x%04x : ", x);
757 printk("%02x ", ((unsigned char)pt[x]));
758 if (x%16 == 15) printk("\n");
764 ========================================================================
767 Send log message through wireless event
769 Support standard iw_event with IWEVCUSTOM. It is used below.
771 iwreq_data.data.flags is used to store event_flag that is defined by user.
772 iwreq_data.data.length is the length of the event log.
774 The format of the event log is composed of the entry's MAC address and
775 the desired log message (refer to pWirelessEventText).
777 ex: 11:22:33:44:55:66 has associated successfully
779 p.s. The requirement of Wireless Extension is v15 or newer.
781 ========================================================================
783 VOID RTMPSendWirelessEvent(
784 IN PRTMP_ADAPTER pAd,
785 IN USHORT Event_flag,
790 #if WIRELESS_EXT >= 15
792 union iwreq_data wrqu;
793 PUCHAR pBuf = NULL, pBufPtr = NULL;
794 USHORT event, type, BufLen;
795 UCHAR event_table_len = 0;
797 type = Event_flag & 0xFF00;
798 event = Event_flag & 0x00FF;
802 case IW_SYS_EVENT_FLAG_START:
803 event_table_len = IW_SYS_EVENT_TYPE_NUM;
806 case IW_SPOOF_EVENT_FLAG_START:
807 event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
810 case IW_FLOOD_EVENT_FLAG_START:
811 event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
815 if (event_table_len == 0)
817 DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type));
821 if (event >= event_table_len)
823 DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event));
827 //Allocate memory and copy the msg.
828 if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)
830 //Prepare the payload
831 memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
836 pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
837 else if (BssIdx < MAX_MBSSID_NUM)
838 pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
840 pBufPtr += sprintf(pBufPtr, "(RT2860) ");
842 if (type == IW_SYS_EVENT_FLAG_START)
843 pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
844 else if (type == IW_SPOOF_EVENT_FLAG_START)
845 pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
846 else if (type == IW_FLOOD_EVENT_FLAG_START)
847 pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
849 pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
851 pBufPtr[pBufPtr - pBuf] = '\0';
852 BufLen = pBufPtr - pBuf;
854 memset(&wrqu, 0, sizeof(wrqu));
855 wrqu.data.flags = Event_flag;
856 wrqu.data.length = BufLen;
858 //send wireless event
859 wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
861 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
866 DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
868 DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__));
869 #endif /* WIRELESS_EXT >= 15 */
873 #ifdef CONFIG_STA_SUPPORT
874 void send_monitor_packets(
875 IN PRTMP_ADAPTER pAd,
878 struct sk_buff *pOSPkt;
879 wlan_ng_prism2_header *ph;
881 USHORT header_len = 0;
882 UCHAR temp_header[40] = {0};
884 u_int32_t ralinkrate[256] = {2,4,11,22, 12,18,24,36,48,72,96, 108, 109, 110, 111, 112, 13, 26, 39, 52,78,104, 117, 130, 26, 52, 78,104, 156, 208, 234, 260, 27, 54,81,108,162, 216, 243, 270, // Last 38
885 54, 108, 162, 216, 324, 432, 486, 540, 14, 29, 43, 57, 87, 115, 130, 144, 29, 59,87,115, 173, 230,260, 288, 30, 60,90,120,180,240,270,300,60,120,180,240,360,480,540,600, 0,1,2,3,4,5,6,7,8,9,10,
886 11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80};
889 ASSERT(pRxBlk->pRxPacket);
890 if (pRxBlk->DataSize < 10)
892 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize));
893 goto err_free_sk_buff;
896 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
898 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
899 goto err_free_sk_buff;
902 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
903 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
904 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
906 pRxBlk->DataSize -= LENGTH_802_11;
907 if ((pRxBlk->pHeader->FC.ToDs == 1) &&
908 (pRxBlk->pHeader->FC.FrDs == 1))
909 header_len = LENGTH_802_11_WITH_ADDR4;
911 header_len = LENGTH_802_11;
914 if (pRxBlk->pHeader->FC.SubType & 0x08)
917 // Data skip QOS contorl field
918 pRxBlk->DataSize -=2;
921 // Order bit: A-Ralink or HTC+
922 if (pRxBlk->pHeader->FC.Order)
925 // Data skip HTC contorl field
926 pRxBlk->DataSize -= 4;
930 if (header_len <= 40)
931 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
934 if (pRxBlk->RxD.L2PAD)
935 pRxBlk->pData += (header_len + 2);
937 pRxBlk->pData += header_len;
941 if (pRxBlk->DataSize < pOSPkt->len) {
942 skb_trim(pOSPkt,pRxBlk->DataSize);
944 skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));
947 if ((pRxBlk->pData - pOSPkt->data) > 0) {
948 skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));
949 skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));
952 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {
953 if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {
954 DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__));
955 goto err_free_sk_buff;
960 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);
962 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));
963 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
965 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
966 ph->msglen = sizeof(wlan_ng_prism2_header);
967 strcpy(ph->devname, pAd->net_dev->name);
969 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
970 ph->hosttime.status = 0;
971 ph->hosttime.len = 4;
972 ph->hosttime.data = jiffies;
974 ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;
975 ph->mactime.status = 0;
977 ph->mactime.data = 0;
979 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
984 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
985 ph->channel.status = 0;
988 ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;
990 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
993 ph->rssi.data = (u_int32_t)RTMPMaxRssi(pAd, ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI0, RSSI_0), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI1, RSSI_1), ConvertToRssi(pAd, pRxBlk->pRxWI->RSSI2, RSSI_2));;
995 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
996 ph->signal.status = 0;
998 ph->signal.data = 0; //rssi + noise;
1000 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
1001 ph->noise.status = 0;
1005 #ifdef DOT11_N_SUPPORT
1006 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
1008 rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
1011 #endif // DOT11_N_SUPPORT //
1012 if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
1013 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
1015 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
1018 if (rate_index > 255)
1021 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
1022 ph->rate.status = 0;
1024 ph->rate.data = ralinkrate[rate_index];
1026 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
1027 ph->frmlen.status = 0;
1029 ph->frmlen.data = (u_int32_t)pRxBlk->DataSize;
1032 pOSPkt->pkt_type = PACKET_OTHERHOST;
1033 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
1034 pOSPkt->ip_summed = CHECKSUM_NONE;
1040 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
1044 #endif // CONFIG_STA_SUPPORT //
1047 void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
1050 #if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,0)
1051 daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
1053 allow_signal(SIGTERM);
1054 allow_signal(SIGKILL);
1055 current->flags |= PF_NOFREEZE;
1057 unsigned long flags;
1061 strcpy(current->comm, pThreadName);
1063 siginitsetinv(¤t->blocked, sigmask(SIGTERM) | sigmask(SIGKILL));
1065 /* Allow interception of SIGKILL only
1066 * Don't allow other signals to interrupt the transmission */
1067 #if LINUX_VERSION_CODE > KERNEL_VERSION(2,4,22)
1068 spin_lock_irqsave(¤t->sigmask_lock, flags);
1069 flush_signals(current);
1070 recalc_sigpending(current);
1071 spin_unlock_irqrestore(¤t->sigmask_lock, flags);
1075 /* signal that we've started the thread */
1080 void RTMP_IndicateMediaState(
1081 IN PRTMP_ADAPTER pAd)
1083 if (pAd->CommonCfg.bWirelessEvent)
1085 if (pAd->IndicateMediaState == NdisMediaStateConnected)
1087 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1091 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);