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(AsicRxAntEvalTimeout);
34 BUILD_TIMER_FUNCTION(APSDPeriodicExec);
35 BUILD_TIMER_FUNCTION(AsicRfTuningExec);
38 #ifdef CONFIG_STA_SUPPORT
39 BUILD_TIMER_FUNCTION(BeaconTimeout);
40 BUILD_TIMER_FUNCTION(ScanTimeout);
41 BUILD_TIMER_FUNCTION(AuthTimeout);
42 BUILD_TIMER_FUNCTION(AssocTimeout);
43 BUILD_TIMER_FUNCTION(ReassocTimeout);
44 BUILD_TIMER_FUNCTION(DisassocTimeout);
45 BUILD_TIMER_FUNCTION(LinkDownExec);
46 BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
47 BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
48 BUILD_TIMER_FUNCTION(PsPollWakeExec);
49 BUILD_TIMER_FUNCTION(RadioOnExec);
50 #endif // CONFIG_STA_SUPPORT //
52 // for wireless system event message
53 char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
54 // system status event
55 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
56 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
57 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
58 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
59 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
60 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
61 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
62 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
63 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
64 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
65 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
66 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
67 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
68 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
69 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
70 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
71 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
72 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
73 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
76 // for wireless IDS_spoof_attack event message
77 char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
78 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
79 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
80 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
81 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
82 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
83 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
84 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
85 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
86 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
87 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
90 // for wireless IDS_flooding_attack event message
91 char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
92 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
93 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
94 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
95 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
96 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
97 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
98 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
102 VOID RTMP_SetPeriodicTimer(
103 IN NDIS_MINIPORT_TIMER *pTimer,
104 IN unsigned long timeout)
106 timeout = ((timeout*HZ) / 1000);
107 pTimer->expires = jiffies + timeout;
111 /* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
112 VOID RTMP_OS_Init_Timer(
113 IN PRTMP_ADAPTER pAd,
114 IN NDIS_MINIPORT_TIMER *pTimer,
115 IN TIMER_FUNCTION function,
119 pTimer->data = (unsigned long)data;
120 pTimer->function = function;
124 VOID RTMP_OS_Add_Timer(
125 IN NDIS_MINIPORT_TIMER *pTimer,
126 IN unsigned long timeout)
128 if (timer_pending(pTimer))
131 timeout = ((timeout*HZ) / 1000);
132 pTimer->expires = jiffies + timeout;
136 VOID RTMP_OS_Mod_Timer(
137 IN NDIS_MINIPORT_TIMER *pTimer,
138 IN unsigned long timeout)
140 timeout = ((timeout*HZ) / 1000);
141 mod_timer(pTimer, jiffies + timeout);
144 VOID RTMP_OS_Del_Timer(
145 IN NDIS_MINIPORT_TIMER *pTimer,
146 OUT BOOLEAN *pCancelled)
148 if (timer_pending(pTimer))
150 *pCancelled = del_timer_sync(pTimer);
159 VOID RTMP_OS_Release_Packet(
160 IN PRTMP_ADAPTER pAd,
161 IN PQUEUE_ENTRY pEntry)
163 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
166 // Unify all delay routine by using udelay
172 for (i = 0; i < (usec / 50); i++)
179 void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
181 time->u.LowPart = jiffies;
184 // pAd MUST allow to be NULL
185 NDIS_STATUS os_alloc_mem(
186 IN PRTMP_ADAPTER pAd,
190 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
192 return (NDIS_STATUS_SUCCESS);
194 return (NDIS_STATUS_FAILURE);
197 // pAd MUST allow to be NULL
198 NDIS_STATUS os_free_mem(
199 IN PRTMP_ADAPTER pAd,
205 return (NDIS_STATUS_SUCCESS);
209 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
210 IN PRTMP_ADAPTER pAd,
215 pkt = dev_alloc_skb(Length);
219 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));
224 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
227 return (PNDIS_PACKET) pkt;
231 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
232 IN PRTMP_ADAPTER pAd,
235 OUT PVOID *VirtualAddress)
239 pkt = dev_alloc_skb(Length);
243 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));
248 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
249 *VirtualAddress = (PVOID) pkt->data;
253 *VirtualAddress = (PVOID) NULL;
256 return (PNDIS_PACKET) pkt;
260 VOID build_tx_packet(
261 IN PRTMP_ADAPTER pAd,
262 IN PNDIS_PACKET pPacket,
267 struct sk_buff *pTxPkt;
270 pTxPkt = RTPKT_TO_OSPKT(pPacket);
272 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
275 VOID RTMPFreeAdapter(
276 IN PRTMP_ADAPTER pAd)
278 POS_COOKIE os_cookie;
281 os_cookie=(POS_COOKIE)pAd->OS_Cookie;
283 kfree(pAd->BeaconBuf);
286 NdisFreeSpinLock(&pAd->MgmtRingLock);
288 NdisFreeSpinLock(&pAd->RxRingLock);
290 for (index =0 ; index < NUM_OF_TX_RING; index++)
292 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
293 NdisFreeSpinLock(&pAd->DeQueueLock[index]);
294 pAd->DeQueueRunning[index] = FALSE;
297 NdisFreeSpinLock(&pAd->irq_lock);
299 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
303 BOOLEAN OS_Need_Clone_Packet(void)
311 ========================================================================
314 clone an input NDIS PACKET to another one. The new internally created NDIS PACKET
315 must have only one NDIS BUFFER
316 return - byte copied. 0 means can't create NDIS PACKET
317 NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket
320 pAd Pointer to our adapter
321 pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.
322 *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet.
330 ========================================================================
332 NDIS_STATUS RTMPCloneNdisPacket(
333 IN PRTMP_ADAPTER pAd,
334 IN BOOLEAN pInsAMSDUHdr,
335 IN PNDIS_PACKET pInPacket,
336 OUT PNDIS_PACKET *ppOutPacket)
344 // 1. Allocate a packet
345 pkt = dev_alloc_skb(2048);
349 return NDIS_STATUS_FAILURE;
352 skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
353 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));
354 *ppOutPacket = OSPKT_TO_RTPKT(pkt);
357 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
359 printk("###Clone###\n");
361 return NDIS_STATUS_SUCCESS;
365 // the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
366 NDIS_STATUS RTMPAllocateNdisPacket(
367 IN PRTMP_ADAPTER pAd,
368 OUT PNDIS_PACKET *ppPacket,
374 PNDIS_PACKET pPacket;
378 // 1. Allocate a packet
379 pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
384 printk("RTMPAllocateNdisPacket Fail\n\n");
386 return NDIS_STATUS_FAILURE;
389 // 2. clone the frame content
391 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
393 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);
395 // 3. update length of packet
396 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);
398 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
399 // printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
401 return NDIS_STATUS_SUCCESS;
405 ========================================================================
407 This routine frees a miniport internally allocated NDIS_PACKET and its
408 corresponding NDIS_BUFFER and allocated memory.
409 ========================================================================
411 VOID RTMPFreeNdisPacket(
412 IN PRTMP_ADAPTER pAd,
413 IN PNDIS_PACKET pPacket)
415 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
419 // IRQL = DISPATCH_LEVEL
420 // NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
421 // scatter gather buffer
422 NDIS_STATUS Sniff2BytesFromNdisBuffer(
423 IN PNDIS_BUFFER pFirstBuffer,
424 IN UCHAR DesiredOffset,
428 *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);
429 *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);
431 return NDIS_STATUS_SUCCESS;
435 void RTMP_QueryPacketInfo(
436 IN PNDIS_PACKET pPacket,
437 OUT PACKET_INFO *pPacketInfo,
438 OUT PUCHAR *pSrcBufVA,
439 OUT UINT *pSrcBufLen)
441 pPacketInfo->BufferCount = 1;
442 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
443 pPacketInfo->PhysicalBufferCount = 1;
444 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
446 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
447 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
450 void RTMP_QueryNextPacketInfo(
451 IN PNDIS_PACKET *ppPacket,
452 OUT PACKET_INFO *pPacketInfo,
453 OUT PUCHAR *pSrcBufVA,
454 OUT UINT *pSrcBufLen)
456 PNDIS_PACKET pPacket = NULL;
459 pPacket = GET_OS_PKT_NEXT(*ppPacket);
463 pPacketInfo->BufferCount = 1;
464 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
465 pPacketInfo->PhysicalBufferCount = 1;
466 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
468 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
469 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
470 *ppPacket = GET_OS_PKT_NEXT(pPacket);
474 pPacketInfo->BufferCount = 0;
475 pPacketInfo->pFirstBuffer = NULL;
476 pPacketInfo->PhysicalBufferCount = 0;
477 pPacketInfo->TotalPacketLength = 0;
485 // not yet support MBSS
486 PNET_DEV get_netdev_from_bssid(
487 IN PRTMP_ADAPTER pAd,
488 IN UCHAR FromWhichBSSID)
490 PNET_DEV dev_p = NULL;
492 #ifdef CONFIG_STA_SUPPORT
493 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
495 dev_p = pAd->net_dev;
497 #endif // CONFIG_STA_SUPPORT //
500 return dev_p; /* return one of MBSS */
503 PNDIS_PACKET DuplicatePacket(
504 IN PRTMP_ADAPTER pAd,
505 IN PNDIS_PACKET pPacket,
506 IN UCHAR FromWhichBSSID)
509 PNDIS_PACKET pRetPacket = NULL;
513 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
514 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
517 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
520 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
521 pRetPacket = OSPKT_TO_RTPKT(skb);
528 PNDIS_PACKET duplicate_pkt(
529 IN PRTMP_ADAPTER pAd,
530 IN PUCHAR pHeader802_3,
534 IN UCHAR FromWhichBSSID)
537 PNDIS_PACKET pPacket = NULL;
540 if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
543 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
544 skb_put(skb, HdrLen);
545 NdisMoveMemory(skb->tail, pData, DataSize);
546 skb_put(skb, DataSize);
547 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
548 pPacket = OSPKT_TO_RTPKT(skb);
555 #define TKIP_TX_MIC_SIZE 8
556 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
557 IN PRTMP_ADAPTER pAd,
558 IN PNDIS_PACKET pPacket)
560 struct sk_buff *skb, *newskb;
563 skb = RTPKT_TO_OSPKT(pPacket);
564 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)
566 // alloc a new skb and copy the packet
567 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
568 dev_kfree_skb_any(skb);
571 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
577 return OSPKT_TO_RTPKT(skb);
583 PNDIS_PACKET ClonePacket(
584 IN PRTMP_ADAPTER pAd,
585 IN PNDIS_PACKET pPacket,
589 struct sk_buff *pRxPkt;
590 struct sk_buff *pClonedPkt;
593 pRxPkt = RTPKT_TO_OSPKT(pPacket);
596 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
600 // set the correct dataptr and data len
601 pClonedPkt->dev = pRxPkt->dev;
602 pClonedPkt->data = pData;
603 pClonedPkt->len = DataSize;
604 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
605 ASSERT(DataSize < 1530);
611 // change OS packet DataPtr and DataLen
613 void update_os_packet_info(
614 IN PRTMP_ADAPTER pAd,
616 IN UCHAR FromWhichBSSID)
618 struct sk_buff *pOSPkt;
620 ASSERT(pRxBlk->pRxPacket);
621 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
623 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
624 pOSPkt->data = pRxBlk->pData;
625 pOSPkt->len = pRxBlk->DataSize;
626 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
630 void wlan_802_11_to_802_3_packet(
631 IN PRTMP_ADAPTER pAd,
633 IN PUCHAR pHeader802_3,
634 IN UCHAR FromWhichBSSID)
636 struct sk_buff *pOSPkt;
638 ASSERT(pRxBlk->pRxPacket);
639 ASSERT(pHeader802_3);
641 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
643 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
644 pOSPkt->data = pRxBlk->pData;
645 pOSPkt->len = pRxBlk->DataSize;
646 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
653 #ifdef CONFIG_STA_SUPPORT
654 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
655 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
656 #endif // CONFIG_STA_SUPPORT //
661 void announce_802_3_packet(
662 IN PRTMP_ADAPTER pAd,
663 IN PNDIS_PACKET pPacket)
666 struct sk_buff *pRxPkt;
670 pRxPkt = RTPKT_TO_OSPKT(pPacket);
672 /* Push up the protocol stack */
674 IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);
676 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
679 #endif // IKANOS_VX_1X0 //
683 PRTMP_SCATTER_GATHER_LIST
684 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg)
686 sg->NumberOfElements = 1;
687 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
688 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
692 void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
697 if (RTDebugLevel < RT_DEBUG_TRACE)
701 printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen);
702 for (x=0; x<SrcBufLen; x++)
705 printk("0x%04x : ", x);
706 printk("%02x ", ((unsigned char)pt[x]));
707 if (x%16 == 15) printk("\n");
713 ========================================================================
716 Send log message through wireless event
718 Support standard iw_event with IWEVCUSTOM. It is used below.
720 iwreq_data.data.flags is used to store event_flag that is defined by user.
721 iwreq_data.data.length is the length of the event log.
723 The format of the event log is composed of the entry's MAC address and
724 the desired log message (refer to pWirelessEventText).
726 ex: 11:22:33:44:55:66 has associated successfully
728 p.s. The requirement of Wireless Extension is v15 or newer.
730 ========================================================================
732 VOID RTMPSendWirelessEvent(
733 IN PRTMP_ADAPTER pAd,
734 IN USHORT Event_flag,
739 #if WIRELESS_EXT >= 15
741 union iwreq_data wrqu;
742 PUCHAR pBuf = NULL, pBufPtr = NULL;
743 USHORT event, type, BufLen;
744 UCHAR event_table_len = 0;
746 type = Event_flag & 0xFF00;
747 event = Event_flag & 0x00FF;
751 case IW_SYS_EVENT_FLAG_START:
752 event_table_len = IW_SYS_EVENT_TYPE_NUM;
755 case IW_SPOOF_EVENT_FLAG_START:
756 event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
759 case IW_FLOOD_EVENT_FLAG_START:
760 event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
764 if (event_table_len == 0)
766 DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type));
770 if (event >= event_table_len)
772 DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event));
776 //Allocate memory and copy the msg.
777 if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)
779 //Prepare the payload
780 memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
785 pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
786 else if (BssIdx < MAX_MBSSID_NUM)
787 pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
789 pBufPtr += sprintf(pBufPtr, "(RT2860) ");
791 if (type == IW_SYS_EVENT_FLAG_START)
792 pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
793 else if (type == IW_SPOOF_EVENT_FLAG_START)
794 pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
795 else if (type == IW_FLOOD_EVENT_FLAG_START)
796 pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
798 pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
800 pBufPtr[pBufPtr - pBuf] = '\0';
801 BufLen = pBufPtr - pBuf;
803 memset(&wrqu, 0, sizeof(wrqu));
804 wrqu.data.flags = Event_flag;
805 wrqu.data.length = BufLen;
807 //send wireless event
808 wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
810 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
815 DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
817 DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__));
818 #endif /* WIRELESS_EXT >= 15 */
822 #ifdef CONFIG_STA_SUPPORT
823 void send_monitor_packets(
824 IN PRTMP_ADAPTER pAd,
827 struct sk_buff *pOSPkt;
828 wlan_ng_prism2_header *ph;
830 USHORT header_len = 0;
831 UCHAR temp_header[40] = {0};
833 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
834 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,
835 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};
838 ASSERT(pRxBlk->pRxPacket);
839 if (pRxBlk->DataSize < 10)
841 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize));
842 goto err_free_sk_buff;
845 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
847 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
848 goto err_free_sk_buff;
851 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
852 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
853 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
855 pRxBlk->DataSize -= LENGTH_802_11;
856 if ((pRxBlk->pHeader->FC.ToDs == 1) &&
857 (pRxBlk->pHeader->FC.FrDs == 1))
858 header_len = LENGTH_802_11_WITH_ADDR4;
860 header_len = LENGTH_802_11;
863 if (pRxBlk->pHeader->FC.SubType & 0x08)
866 // Data skip QOS contorl field
867 pRxBlk->DataSize -=2;
870 // Order bit: A-Ralink or HTC+
871 if (pRxBlk->pHeader->FC.Order)
874 // Data skip HTC contorl field
875 pRxBlk->DataSize -= 4;
879 if (header_len <= 40)
880 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
883 if (pRxBlk->RxD.L2PAD)
884 pRxBlk->pData += (header_len + 2);
886 pRxBlk->pData += header_len;
890 if (pRxBlk->DataSize < pOSPkt->len) {
891 skb_trim(pOSPkt,pRxBlk->DataSize);
893 skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));
896 if ((pRxBlk->pData - pOSPkt->data) > 0) {
897 skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));
898 skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));
901 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {
902 if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {
903 DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__));
904 goto err_free_sk_buff;
909 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);
911 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));
912 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
914 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
915 ph->msglen = sizeof(wlan_ng_prism2_header);
916 strcpy(ph->devname, pAd->net_dev->name);
918 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
919 ph->hosttime.status = 0;
920 ph->hosttime.len = 4;
921 ph->hosttime.data = jiffies;
923 ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;
924 ph->mactime.status = 0;
926 ph->mactime.data = 0;
928 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
933 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
934 ph->channel.status = 0;
937 ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;
939 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
942 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));;
944 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
945 ph->signal.status = 0;
947 ph->signal.data = 0; //rssi + noise;
949 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
950 ph->noise.status = 0;
954 #ifdef DOT11_N_SUPPORT
955 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
957 rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
960 #endif // DOT11_N_SUPPORT //
961 if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
962 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
964 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
967 if (rate_index > 255)
970 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
973 ph->rate.data = ralinkrate[rate_index];
975 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
976 ph->frmlen.status = 0;
978 ph->frmlen.data = (u_int32_t)pRxBlk->DataSize;
981 pOSPkt->pkt_type = PACKET_OTHERHOST;
982 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
983 pOSPkt->ip_summed = CHECKSUM_NONE;
989 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
993 #endif // CONFIG_STA_SUPPORT //
996 void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
998 daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
1000 allow_signal(SIGTERM);
1001 allow_signal(SIGKILL);
1002 current->flags |= PF_NOFREEZE;
1004 /* signal that we've started the thread */
1008 void RTMP_IndicateMediaState(
1009 IN PRTMP_ADAPTER pAd)
1011 if (pAd->CommonCfg.bWirelessEvent)
1013 if (pAd->IndicateMediaState == NdisMediaStateConnected)
1015 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1019 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);