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);
37 BUILD_TIMER_FUNCTION(BeaconUpdateExec);
40 BUILD_TIMER_FUNCTION(BeaconTimeout);
41 BUILD_TIMER_FUNCTION(ScanTimeout);
42 BUILD_TIMER_FUNCTION(AuthTimeout);
43 BUILD_TIMER_FUNCTION(AssocTimeout);
44 BUILD_TIMER_FUNCTION(ReassocTimeout);
45 BUILD_TIMER_FUNCTION(DisassocTimeout);
46 BUILD_TIMER_FUNCTION(LinkDownExec);
47 BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
48 BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
50 // for wireless system event message
51 char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
52 // system status event
53 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
54 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
55 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
56 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
57 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
58 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
59 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
60 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
61 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
62 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
63 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
64 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
65 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
66 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
67 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
68 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
69 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
70 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
71 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
74 // for wireless IDS_spoof_attack event message
75 char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
76 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
77 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
78 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
79 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
80 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
81 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
82 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
83 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
84 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
85 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
88 // for wireless IDS_flooding_attack event message
89 char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
90 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
91 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
92 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
93 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
94 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
95 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
96 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
100 VOID RTMP_SetPeriodicTimer(
101 IN NDIS_MINIPORT_TIMER *pTimer,
102 IN unsigned long timeout)
104 timeout = ((timeout*HZ) / 1000);
105 pTimer->expires = jiffies + timeout;
109 /* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
110 VOID RTMP_OS_Init_Timer(
111 IN PRTMP_ADAPTER pAd,
112 IN NDIS_MINIPORT_TIMER *pTimer,
113 IN TIMER_FUNCTION function,
117 pTimer->data = (unsigned long)data;
118 pTimer->function = function;
122 VOID RTMP_OS_Add_Timer(
123 IN NDIS_MINIPORT_TIMER *pTimer,
124 IN unsigned long timeout)
126 if (timer_pending(pTimer))
129 timeout = ((timeout*HZ) / 1000);
130 pTimer->expires = jiffies + timeout;
134 VOID RTMP_OS_Mod_Timer(
135 IN NDIS_MINIPORT_TIMER *pTimer,
136 IN unsigned long timeout)
138 timeout = ((timeout*HZ) / 1000);
139 mod_timer(pTimer, jiffies + timeout);
142 VOID RTMP_OS_Del_Timer(
143 IN NDIS_MINIPORT_TIMER *pTimer,
144 OUT BOOLEAN *pCancelled)
146 if (timer_pending(pTimer))
148 *pCancelled = del_timer_sync(pTimer);
157 VOID RTMP_OS_Release_Packet(
158 IN PRTMP_ADAPTER pAd,
159 IN PQUEUE_ENTRY pEntry)
161 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
164 // Unify all delay routine by using udelay
170 for (i = 0; i < (usec / 50); i++)
177 void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
179 time->u.LowPart = jiffies;
182 // pAd MUST allow to be NULL
183 NDIS_STATUS os_alloc_mem(
184 IN PRTMP_ADAPTER pAd,
188 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
190 return (NDIS_STATUS_SUCCESS);
192 return (NDIS_STATUS_FAILURE);
195 // pAd MUST allow to be NULL
196 NDIS_STATUS os_free_mem(
197 IN PRTMP_ADAPTER pAd,
203 return (NDIS_STATUS_SUCCESS);
207 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
208 IN PRTMP_ADAPTER pAd,
213 pkt = dev_alloc_skb(Length);
217 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));
222 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
225 return (PNDIS_PACKET) pkt;
229 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
230 IN PRTMP_ADAPTER pAd,
233 OUT PVOID *VirtualAddress)
237 pkt = dev_alloc_skb(Length);
241 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));
246 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
247 *VirtualAddress = (PVOID) pkt->data;
251 *VirtualAddress = (PVOID) NULL;
254 return (PNDIS_PACKET) pkt;
258 VOID build_tx_packet(
259 IN PRTMP_ADAPTER pAd,
260 IN PNDIS_PACKET pPacket,
265 struct sk_buff *pTxPkt;
268 pTxPkt = RTPKT_TO_OSPKT(pPacket);
270 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
273 VOID RTMPFreeAdapter(
274 IN PRTMP_ADAPTER pAd)
276 POS_COOKIE os_cookie;
279 os_cookie=(POS_COOKIE)pAd->OS_Cookie;
281 kfree(pAd->BeaconBuf);
284 NdisFreeSpinLock(&pAd->MgmtRingLock);
287 for (index =0 ; index < NUM_OF_TX_RING; index++)
289 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
290 NdisFreeSpinLock(&pAd->DeQueueLock[index]);
291 pAd->DeQueueRunning[index] = FALSE;
294 NdisFreeSpinLock(&pAd->irq_lock);
297 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
301 BOOLEAN OS_Need_Clone_Packet(void)
309 ========================================================================
312 clone an input NDIS PACKET to another one. The new internally created NDIS PACKET
313 must have only one NDIS BUFFER
314 return - byte copied. 0 means can't create NDIS PACKET
315 NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket
318 pAd Pointer to our adapter
319 pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.
320 *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet.
328 ========================================================================
330 NDIS_STATUS RTMPCloneNdisPacket(
331 IN PRTMP_ADAPTER pAd,
332 IN BOOLEAN pInsAMSDUHdr,
333 IN PNDIS_PACKET pInPacket,
334 OUT PNDIS_PACKET *ppOutPacket)
342 // 1. Allocate a packet
343 pkt = dev_alloc_skb(2048);
347 return NDIS_STATUS_FAILURE;
350 skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
351 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));
352 *ppOutPacket = OSPKT_TO_RTPKT(pkt);
355 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
357 printk("###Clone###\n");
359 return NDIS_STATUS_SUCCESS;
363 // the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
364 NDIS_STATUS RTMPAllocateNdisPacket(
365 IN PRTMP_ADAPTER pAd,
366 OUT PNDIS_PACKET *ppPacket,
372 PNDIS_PACKET pPacket;
376 // 1. Allocate a packet
377 pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
382 printk("RTMPAllocateNdisPacket Fail\n\n");
384 return NDIS_STATUS_FAILURE;
387 // 2. clone the frame content
389 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
391 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);
393 // 3. update length of packet
394 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);
396 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
397 // printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
399 return NDIS_STATUS_SUCCESS;
403 ========================================================================
405 This routine frees a miniport internally allocated NDIS_PACKET and its
406 corresponding NDIS_BUFFER and allocated memory.
407 ========================================================================
409 VOID RTMPFreeNdisPacket(
410 IN PRTMP_ADAPTER pAd,
411 IN PNDIS_PACKET pPacket)
413 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
417 // IRQL = DISPATCH_LEVEL
418 // NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
419 // scatter gather buffer
420 NDIS_STATUS Sniff2BytesFromNdisBuffer(
421 IN PNDIS_BUFFER pFirstBuffer,
422 IN UCHAR DesiredOffset,
426 *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);
427 *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);
429 return NDIS_STATUS_SUCCESS;
433 void RTMP_QueryPacketInfo(
434 IN PNDIS_PACKET pPacket,
435 OUT PACKET_INFO *pPacketInfo,
436 OUT PUCHAR *pSrcBufVA,
437 OUT UINT *pSrcBufLen)
439 pPacketInfo->BufferCount = 1;
440 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
441 pPacketInfo->PhysicalBufferCount = 1;
442 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
444 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
445 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
448 void RTMP_QueryNextPacketInfo(
449 IN PNDIS_PACKET *ppPacket,
450 OUT PACKET_INFO *pPacketInfo,
451 OUT PUCHAR *pSrcBufVA,
452 OUT UINT *pSrcBufLen)
454 PNDIS_PACKET pPacket = NULL;
457 pPacket = GET_OS_PKT_NEXT(*ppPacket);
461 pPacketInfo->BufferCount = 1;
462 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
463 pPacketInfo->PhysicalBufferCount = 1;
464 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
466 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
467 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
468 *ppPacket = GET_OS_PKT_NEXT(pPacket);
472 pPacketInfo->BufferCount = 0;
473 pPacketInfo->pFirstBuffer = NULL;
474 pPacketInfo->PhysicalBufferCount = 0;
475 pPacketInfo->TotalPacketLength = 0;
483 // not yet support MBSS
484 PNET_DEV get_netdev_from_bssid(
485 IN PRTMP_ADAPTER pAd,
486 IN UCHAR FromWhichBSSID)
488 PNET_DEV dev_p = NULL;
490 dev_p = pAd->net_dev;
493 return dev_p; /* return one of MBSS */
496 PNDIS_PACKET DuplicatePacket(
497 IN PRTMP_ADAPTER pAd,
498 IN PNDIS_PACKET pPacket,
499 IN UCHAR FromWhichBSSID)
502 PNDIS_PACKET pRetPacket = NULL;
506 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
507 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
510 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
513 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
514 pRetPacket = OSPKT_TO_RTPKT(skb);
521 PNDIS_PACKET duplicate_pkt(
522 IN PRTMP_ADAPTER pAd,
523 IN PUCHAR pHeader802_3,
527 IN UCHAR FromWhichBSSID)
530 PNDIS_PACKET pPacket = NULL;
533 if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
536 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
537 skb_put(skb, HdrLen);
538 NdisMoveMemory(skb->tail, pData, DataSize);
539 skb_put(skb, DataSize);
540 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
541 pPacket = OSPKT_TO_RTPKT(skb);
548 #define TKIP_TX_MIC_SIZE 8
549 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
550 IN PRTMP_ADAPTER pAd,
551 IN PNDIS_PACKET pPacket)
553 struct sk_buff *skb, *newskb;
556 skb = RTPKT_TO_OSPKT(pPacket);
557 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)
559 // alloc a new skb and copy the packet
560 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
561 dev_kfree_skb_any(skb);
564 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
570 return OSPKT_TO_RTPKT(skb);
576 PNDIS_PACKET ClonePacket(
577 IN PRTMP_ADAPTER pAd,
578 IN PNDIS_PACKET pPacket,
582 struct sk_buff *pRxPkt;
583 struct sk_buff *pClonedPkt;
586 pRxPkt = RTPKT_TO_OSPKT(pPacket);
589 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
593 // set the correct dataptr and data len
594 pClonedPkt->dev = pRxPkt->dev;
595 pClonedPkt->data = pData;
596 pClonedPkt->len = DataSize;
597 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
598 ASSERT(DataSize < 1530);
604 // change OS packet DataPtr and DataLen
606 void update_os_packet_info(
607 IN PRTMP_ADAPTER pAd,
609 IN UCHAR FromWhichBSSID)
611 struct sk_buff *pOSPkt;
613 ASSERT(pRxBlk->pRxPacket);
614 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
616 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
617 pOSPkt->data = pRxBlk->pData;
618 pOSPkt->len = pRxBlk->DataSize;
619 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
623 void wlan_802_11_to_802_3_packet(
624 IN PRTMP_ADAPTER pAd,
626 IN PUCHAR pHeader802_3,
627 IN UCHAR FromWhichBSSID)
629 struct sk_buff *pOSPkt;
631 ASSERT(pRxBlk->pRxPacket);
632 ASSERT(pHeader802_3);
634 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
636 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
637 pOSPkt->data = pRxBlk->pData;
638 pOSPkt->len = pRxBlk->DataSize;
639 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
646 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
649 void announce_802_3_packet(
650 IN PRTMP_ADAPTER pAd,
651 IN PNDIS_PACKET pPacket)
654 struct sk_buff *pRxPkt;
658 pRxPkt = RTPKT_TO_OSPKT(pPacket);
660 /* Push up the protocol stack */
662 IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);
664 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
667 #endif // IKANOS_VX_1X0 //
671 PRTMP_SCATTER_GATHER_LIST
672 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg)
674 sg->NumberOfElements = 1;
675 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
676 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
680 void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
685 if (RTDebugLevel < RT_DEBUG_TRACE)
689 printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen);
690 for (x=0; x<SrcBufLen; x++)
693 printk("0x%04x : ", x);
694 printk("%02x ", ((unsigned char)pt[x]));
695 if (x%16 == 15) printk("\n");
701 ========================================================================
704 Send log message through wireless event
706 Support standard iw_event with IWEVCUSTOM. It is used below.
708 iwreq_data.data.flags is used to store event_flag that is defined by user.
709 iwreq_data.data.length is the length of the event log.
711 The format of the event log is composed of the entry's MAC address and
712 the desired log message (refer to pWirelessEventText).
714 ex: 11:22:33:44:55:66 has associated successfully
716 p.s. The requirement of Wireless Extension is v15 or newer.
718 ========================================================================
720 VOID RTMPSendWirelessEvent(
721 IN PRTMP_ADAPTER pAd,
722 IN USHORT Event_flag,
727 #if WIRELESS_EXT >= 15
729 union iwreq_data wrqu;
730 PUCHAR pBuf = NULL, pBufPtr = NULL;
731 USHORT event, type, BufLen;
732 UCHAR event_table_len = 0;
734 type = Event_flag & 0xFF00;
735 event = Event_flag & 0x00FF;
739 case IW_SYS_EVENT_FLAG_START:
740 event_table_len = IW_SYS_EVENT_TYPE_NUM;
743 case IW_SPOOF_EVENT_FLAG_START:
744 event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
747 case IW_FLOOD_EVENT_FLAG_START:
748 event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
752 if (event_table_len == 0)
754 DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type));
758 if (event >= event_table_len)
760 DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event));
764 //Allocate memory and copy the msg.
765 if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)
767 //Prepare the payload
768 memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
773 pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
774 else if (BssIdx < MAX_MBSSID_NUM)
775 pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
777 pBufPtr += sprintf(pBufPtr, "(RT2860) ");
779 if (type == IW_SYS_EVENT_FLAG_START)
780 pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
781 else if (type == IW_SPOOF_EVENT_FLAG_START)
782 pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
783 else if (type == IW_FLOOD_EVENT_FLAG_START)
784 pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
786 pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
788 pBufPtr[pBufPtr - pBuf] = '\0';
789 BufLen = pBufPtr - pBuf;
791 memset(&wrqu, 0, sizeof(wrqu));
792 wrqu.data.flags = Event_flag;
793 wrqu.data.length = BufLen;
795 //send wireless event
796 wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
798 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
803 DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
805 DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__));
806 #endif /* WIRELESS_EXT >= 15 */
809 void send_monitor_packets(
810 IN PRTMP_ADAPTER pAd,
813 struct sk_buff *pOSPkt;
814 wlan_ng_prism2_header *ph;
816 USHORT header_len = 0;
817 UCHAR temp_header[40] = {0};
819 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
820 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,
821 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};
824 ASSERT(pRxBlk->pRxPacket);
825 if (pRxBlk->DataSize < 10)
827 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize));
828 goto err_free_sk_buff;
831 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
834 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
837 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
839 goto err_free_sk_buff;
842 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
843 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
844 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
846 pRxBlk->DataSize -= LENGTH_802_11;
847 if ((pRxBlk->pHeader->FC.ToDs == 1) &&
848 (pRxBlk->pHeader->FC.FrDs == 1))
849 header_len = LENGTH_802_11_WITH_ADDR4;
851 header_len = LENGTH_802_11;
854 if (pRxBlk->pHeader->FC.SubType & 0x08)
857 // Data skip QOS contorl field
858 pRxBlk->DataSize -=2;
861 // Order bit: A-Ralink or HTC+
862 if (pRxBlk->pHeader->FC.Order)
865 // Data skip HTC contorl field
866 pRxBlk->DataSize -= 4;
870 if (header_len <= 40)
871 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
874 if (pRxBlk->RxD.L2PAD)
875 pRxBlk->pData += (header_len + 2);
877 pRxBlk->pData += header_len;
881 if (pRxBlk->DataSize < pOSPkt->len) {
882 skb_trim(pOSPkt,pRxBlk->DataSize);
884 skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));
887 if ((pRxBlk->pData - pOSPkt->data) > 0) {
888 skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));
889 skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));
892 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {
893 if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {
894 DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__));
895 goto err_free_sk_buff;
900 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);
902 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));
903 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
905 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
906 ph->msglen = sizeof(wlan_ng_prism2_header);
907 strcpy(ph->devname, pAd->net_dev->name);
909 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
910 ph->hosttime.status = 0;
911 ph->hosttime.len = 4;
912 ph->hosttime.data = jiffies;
914 ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;
915 ph->mactime.status = 0;
917 ph->mactime.data = 0;
919 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
924 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
925 ph->channel.status = 0;
928 ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;
930 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
933 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));;
935 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
936 ph->signal.status = 0;
938 ph->signal.data = 0; //rssi + noise;
940 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
941 ph->noise.status = 0;
945 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
947 rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
950 if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
951 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
953 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
956 if (rate_index > 255)
959 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
962 ph->rate.data = ralinkrate[rate_index];
964 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
965 ph->frmlen.status = 0;
967 ph->frmlen.data = (u_int32_t)pRxBlk->DataSize;
970 pOSPkt->pkt_type = PACKET_OTHERHOST;
971 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
972 pOSPkt->ip_summed = CHECKSUM_NONE;
978 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
983 void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
985 daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
987 allow_signal(SIGTERM);
988 allow_signal(SIGKILL);
989 current->flags |= PF_NOFREEZE;
991 /* signal that we've started the thread */
995 void RTMP_IndicateMediaState(
996 IN PRTMP_ADAPTER pAd)
998 if (pAd->CommonCfg.bWirelessEvent)
1000 if (pAd->IndicateMediaState == NdisMediaStateConnected)
1002 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1006 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);