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 #endif // CONFIG_STA_SUPPORT //
57 // for wireless system event message
58 char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
59 // system status event
60 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
61 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
62 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
63 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
64 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
65 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
66 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
67 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
68 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
69 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
70 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
71 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
72 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
73 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
74 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
75 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
76 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
77 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
78 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
81 // for wireless IDS_spoof_attack event message
82 char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
83 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
84 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
85 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
86 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
87 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
88 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
89 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
90 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
91 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
92 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
95 // for wireless IDS_flooding_attack event message
96 char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
97 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
98 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
99 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
100 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
101 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
102 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
103 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
107 VOID RTMP_SetPeriodicTimer(
108 IN NDIS_MINIPORT_TIMER *pTimer,
109 IN unsigned long timeout)
111 timeout = ((timeout*HZ) / 1000);
112 pTimer->expires = jiffies + timeout;
116 /* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
117 VOID RTMP_OS_Init_Timer(
118 IN PRTMP_ADAPTER pAd,
119 IN NDIS_MINIPORT_TIMER *pTimer,
120 IN TIMER_FUNCTION function,
124 pTimer->data = (unsigned long)data;
125 pTimer->function = function;
129 VOID RTMP_OS_Add_Timer(
130 IN NDIS_MINIPORT_TIMER *pTimer,
131 IN unsigned long timeout)
133 if (timer_pending(pTimer))
136 timeout = ((timeout*HZ) / 1000);
137 pTimer->expires = jiffies + timeout;
141 VOID RTMP_OS_Mod_Timer(
142 IN NDIS_MINIPORT_TIMER *pTimer,
143 IN unsigned long timeout)
145 timeout = ((timeout*HZ) / 1000);
146 mod_timer(pTimer, jiffies + timeout);
149 VOID RTMP_OS_Del_Timer(
150 IN NDIS_MINIPORT_TIMER *pTimer,
151 OUT BOOLEAN *pCancelled)
153 if (timer_pending(pTimer))
155 *pCancelled = del_timer_sync(pTimer);
164 VOID RTMP_OS_Release_Packet(
165 IN PRTMP_ADAPTER pAd,
166 IN PQUEUE_ENTRY pEntry)
168 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
171 // Unify all delay routine by using udelay
177 for (i = 0; i < (usec / 50); i++)
184 void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
186 time->u.LowPart = jiffies;
189 // pAd MUST allow to be NULL
190 NDIS_STATUS os_alloc_mem(
191 IN PRTMP_ADAPTER pAd,
195 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
197 return (NDIS_STATUS_SUCCESS);
199 return (NDIS_STATUS_FAILURE);
202 // pAd MUST allow to be NULL
203 NDIS_STATUS os_free_mem(
204 IN PRTMP_ADAPTER pAd,
210 return (NDIS_STATUS_SUCCESS);
214 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
215 IN PRTMP_ADAPTER pAd,
220 pkt = dev_alloc_skb(Length);
224 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));
229 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
232 return (PNDIS_PACKET) pkt;
236 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
237 IN PRTMP_ADAPTER pAd,
240 OUT PVOID *VirtualAddress)
244 pkt = dev_alloc_skb(Length);
248 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));
253 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
254 *VirtualAddress = (PVOID) pkt->data;
258 *VirtualAddress = (PVOID) NULL;
261 return (PNDIS_PACKET) pkt;
265 VOID build_tx_packet(
266 IN PRTMP_ADAPTER pAd,
267 IN PNDIS_PACKET pPacket,
272 struct sk_buff *pTxPkt;
275 pTxPkt = RTPKT_TO_OSPKT(pPacket);
277 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
280 VOID RTMPFreeAdapter(
281 IN PRTMP_ADAPTER pAd)
283 POS_COOKIE os_cookie;
286 os_cookie=(POS_COOKIE)pAd->OS_Cookie;
288 kfree(pAd->BeaconBuf);
291 NdisFreeSpinLock(&pAd->MgmtRingLock);
294 for (index =0 ; index < NUM_OF_TX_RING; index++)
296 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
297 NdisFreeSpinLock(&pAd->DeQueueLock[index]);
298 pAd->DeQueueRunning[index] = FALSE;
301 NdisFreeSpinLock(&pAd->irq_lock);
304 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
308 BOOLEAN OS_Need_Clone_Packet(void)
316 ========================================================================
319 clone an input NDIS PACKET to another one. The new internally created NDIS PACKET
320 must have only one NDIS BUFFER
321 return - byte copied. 0 means can't create NDIS PACKET
322 NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket
325 pAd Pointer to our adapter
326 pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.
327 *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet.
335 ========================================================================
337 NDIS_STATUS RTMPCloneNdisPacket(
338 IN PRTMP_ADAPTER pAd,
339 IN BOOLEAN pInsAMSDUHdr,
340 IN PNDIS_PACKET pInPacket,
341 OUT PNDIS_PACKET *ppOutPacket)
349 // 1. Allocate a packet
350 pkt = dev_alloc_skb(2048);
354 return NDIS_STATUS_FAILURE;
357 skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
358 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));
359 *ppOutPacket = OSPKT_TO_RTPKT(pkt);
362 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
364 printk("###Clone###\n");
366 return NDIS_STATUS_SUCCESS;
370 // the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
371 NDIS_STATUS RTMPAllocateNdisPacket(
372 IN PRTMP_ADAPTER pAd,
373 OUT PNDIS_PACKET *ppPacket,
379 PNDIS_PACKET pPacket;
383 // 1. Allocate a packet
384 pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
389 printk("RTMPAllocateNdisPacket Fail\n\n");
391 return NDIS_STATUS_FAILURE;
394 // 2. clone the frame content
396 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
398 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);
400 // 3. update length of packet
401 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);
403 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
404 // printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
406 return NDIS_STATUS_SUCCESS;
410 ========================================================================
412 This routine frees a miniport internally allocated NDIS_PACKET and its
413 corresponding NDIS_BUFFER and allocated memory.
414 ========================================================================
416 VOID RTMPFreeNdisPacket(
417 IN PRTMP_ADAPTER pAd,
418 IN PNDIS_PACKET pPacket)
420 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
424 // IRQL = DISPATCH_LEVEL
425 // NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
426 // scatter gather buffer
427 NDIS_STATUS Sniff2BytesFromNdisBuffer(
428 IN PNDIS_BUFFER pFirstBuffer,
429 IN UCHAR DesiredOffset,
433 *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);
434 *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);
436 return NDIS_STATUS_SUCCESS;
440 void RTMP_QueryPacketInfo(
441 IN PNDIS_PACKET pPacket,
442 OUT PACKET_INFO *pPacketInfo,
443 OUT PUCHAR *pSrcBufVA,
444 OUT UINT *pSrcBufLen)
446 pPacketInfo->BufferCount = 1;
447 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
448 pPacketInfo->PhysicalBufferCount = 1;
449 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
451 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
452 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
455 void RTMP_QueryNextPacketInfo(
456 IN PNDIS_PACKET *ppPacket,
457 OUT PACKET_INFO *pPacketInfo,
458 OUT PUCHAR *pSrcBufVA,
459 OUT UINT *pSrcBufLen)
461 PNDIS_PACKET pPacket = NULL;
464 pPacket = GET_OS_PKT_NEXT(*ppPacket);
468 pPacketInfo->BufferCount = 1;
469 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
470 pPacketInfo->PhysicalBufferCount = 1;
471 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
473 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
474 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
475 *ppPacket = GET_OS_PKT_NEXT(pPacket);
479 pPacketInfo->BufferCount = 0;
480 pPacketInfo->pFirstBuffer = NULL;
481 pPacketInfo->PhysicalBufferCount = 0;
482 pPacketInfo->TotalPacketLength = 0;
490 // not yet support MBSS
491 PNET_DEV get_netdev_from_bssid(
492 IN PRTMP_ADAPTER pAd,
493 IN UCHAR FromWhichBSSID)
495 PNET_DEV dev_p = NULL;
498 #ifdef CONFIG_STA_SUPPORT
499 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
501 dev_p = pAd->net_dev;
503 #endif // CONFIG_STA_SUPPORT //
506 return dev_p; /* return one of MBSS */
509 PNDIS_PACKET DuplicatePacket(
510 IN PRTMP_ADAPTER pAd,
511 IN PNDIS_PACKET pPacket,
512 IN UCHAR FromWhichBSSID)
515 PNDIS_PACKET pRetPacket = NULL;
519 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
520 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
523 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
526 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
527 pRetPacket = OSPKT_TO_RTPKT(skb);
531 if ((skb = __dev_alloc_skb(DataSize + 2+32, MEM_ALLOC_FLAG)) != NULL)
533 skb_reserve(skb, 2+32);
534 NdisMoveMemory(skb->tail, pData, DataSize);
535 skb_put(skb, DataSize);
536 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
537 pRetPacket = OSPKT_TO_RTPKT(skb);
545 PNDIS_PACKET duplicate_pkt(
546 IN PRTMP_ADAPTER pAd,
547 IN PUCHAR pHeader802_3,
551 IN UCHAR FromWhichBSSID)
554 PNDIS_PACKET pPacket = NULL;
557 if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
560 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
561 skb_put(skb, HdrLen);
562 NdisMoveMemory(skb->tail, pData, DataSize);
563 skb_put(skb, DataSize);
564 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
565 pPacket = OSPKT_TO_RTPKT(skb);
572 #define TKIP_TX_MIC_SIZE 8
573 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
574 IN PRTMP_ADAPTER pAd,
575 IN PNDIS_PACKET pPacket)
577 struct sk_buff *skb, *newskb;
580 skb = RTPKT_TO_OSPKT(pPacket);
581 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)
583 // alloc a new skb and copy the packet
584 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
585 dev_kfree_skb_any(skb);
588 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
594 return OSPKT_TO_RTPKT(skb);
597 if ((data = skb_put(skb, TKIP_TX_MIC_SIZE)) != NULL)
598 { // If we can extend it, well, copy it first.
599 NdisMoveMemory(data, pAd->PrivateInfo.Tx.MIC, TKIP_TX_MIC_SIZE);
603 // Otherwise, copy the packet.
604 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
605 dev_kfree_skb_any(skb);
608 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC to packet failed!, dropping packet\n"));
613 NdisMoveMemory(skb->tail, pAd->PrivateInfo.Tx.MIC, TKIP_TX_MIC_SIZE);
614 skb_put(skb, TKIP_TX_MIC_SIZE);
617 return OSPKT_TO_RTPKT(skb);
625 PNDIS_PACKET ClonePacket(
626 IN PRTMP_ADAPTER pAd,
627 IN PNDIS_PACKET pPacket,
631 struct sk_buff *pRxPkt;
632 struct sk_buff *pClonedPkt;
635 pRxPkt = RTPKT_TO_OSPKT(pPacket);
638 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
642 // set the correct dataptr and data len
643 pClonedPkt->dev = pRxPkt->dev;
644 pClonedPkt->data = pData;
645 pClonedPkt->len = DataSize;
646 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
647 ASSERT(DataSize < 1530);
653 // change OS packet DataPtr and DataLen
655 void update_os_packet_info(
656 IN PRTMP_ADAPTER pAd,
658 IN UCHAR FromWhichBSSID)
660 struct sk_buff *pOSPkt;
662 ASSERT(pRxBlk->pRxPacket);
663 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
665 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
666 pOSPkt->data = pRxBlk->pData;
667 pOSPkt->len = pRxBlk->DataSize;
668 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
672 void wlan_802_11_to_802_3_packet(
673 IN PRTMP_ADAPTER pAd,
675 IN PUCHAR pHeader802_3,
676 IN UCHAR FromWhichBSSID)
678 struct sk_buff *pOSPkt;
680 ASSERT(pRxBlk->pRxPacket);
681 ASSERT(pHeader802_3);
683 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
685 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
686 pOSPkt->data = pRxBlk->pData;
687 pOSPkt->len = pRxBlk->DataSize;
688 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
695 #ifdef CONFIG_STA_SUPPORT
696 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
697 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
698 #endif // CONFIG_STA_SUPPORT //
703 void announce_802_3_packet(
704 IN PRTMP_ADAPTER pAd,
705 IN PNDIS_PACKET pPacket)
708 struct sk_buff *pRxPkt;
712 pRxPkt = RTPKT_TO_OSPKT(pPacket);
714 #ifdef CONFIG_STA_SUPPORT
715 #endif // CONFIG_STA_SUPPORT //
717 /* Push up the protocol stack */
719 IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);
721 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
723 //#ifdef CONFIG_5VT_ENHANCE
724 // *(int*)(pRxPkt->cb) = BRIDGE_TAG;
727 #endif // IKANOS_VX_1X0 //
731 PRTMP_SCATTER_GATHER_LIST
732 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg)
734 sg->NumberOfElements = 1;
735 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
736 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
740 void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
745 if (RTDebugLevel < RT_DEBUG_TRACE)
749 printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen);
750 for (x=0; x<SrcBufLen; x++)
753 printk("0x%04x : ", x);
754 printk("%02x ", ((unsigned char)pt[x]));
755 if (x%16 == 15) printk("\n");
761 ========================================================================
764 Send log message through wireless event
766 Support standard iw_event with IWEVCUSTOM. It is used below.
768 iwreq_data.data.flags is used to store event_flag that is defined by user.
769 iwreq_data.data.length is the length of the event log.
771 The format of the event log is composed of the entry's MAC address and
772 the desired log message (refer to pWirelessEventText).
774 ex: 11:22:33:44:55:66 has associated successfully
776 p.s. The requirement of Wireless Extension is v15 or newer.
778 ========================================================================
780 VOID RTMPSendWirelessEvent(
781 IN PRTMP_ADAPTER pAd,
782 IN USHORT Event_flag,
787 #if WIRELESS_EXT >= 15
789 union iwreq_data wrqu;
790 PUCHAR pBuf = NULL, pBufPtr = NULL;
791 USHORT event, type, BufLen;
792 UCHAR event_table_len = 0;
794 type = Event_flag & 0xFF00;
795 event = Event_flag & 0x00FF;
799 case IW_SYS_EVENT_FLAG_START:
800 event_table_len = IW_SYS_EVENT_TYPE_NUM;
803 case IW_SPOOF_EVENT_FLAG_START:
804 event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
807 case IW_FLOOD_EVENT_FLAG_START:
808 event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
812 if (event_table_len == 0)
814 DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type));
818 if (event >= event_table_len)
820 DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event));
824 //Allocate memory and copy the msg.
825 if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)
827 //Prepare the payload
828 memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
833 pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
834 else if (BssIdx < MAX_MBSSID_NUM)
835 pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
837 pBufPtr += sprintf(pBufPtr, "(RT2860) ");
839 if (type == IW_SYS_EVENT_FLAG_START)
840 pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
841 else if (type == IW_SPOOF_EVENT_FLAG_START)
842 pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
843 else if (type == IW_FLOOD_EVENT_FLAG_START)
844 pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
846 pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
848 pBufPtr[pBufPtr - pBuf] = '\0';
849 BufLen = pBufPtr - pBuf;
851 memset(&wrqu, 0, sizeof(wrqu));
852 wrqu.data.flags = Event_flag;
853 wrqu.data.length = BufLen;
855 //send wireless event
856 wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
858 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
863 DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
865 DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__));
866 #endif /* WIRELESS_EXT >= 15 */
870 #ifdef CONFIG_STA_SUPPORT
871 void send_monitor_packets(
872 IN PRTMP_ADAPTER pAd,
875 struct sk_buff *pOSPkt;
876 wlan_ng_prism2_header *ph;
878 USHORT header_len = 0;
879 UCHAR temp_header[40] = {0};
881 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
882 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,
883 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};
886 ASSERT(pRxBlk->pRxPacket);
887 if (pRxBlk->DataSize < 10)
889 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize));
890 goto err_free_sk_buff;
893 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
895 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
896 goto err_free_sk_buff;
899 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
900 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
901 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
903 pRxBlk->DataSize -= LENGTH_802_11;
904 if ((pRxBlk->pHeader->FC.ToDs == 1) &&
905 (pRxBlk->pHeader->FC.FrDs == 1))
906 header_len = LENGTH_802_11_WITH_ADDR4;
908 header_len = LENGTH_802_11;
911 if (pRxBlk->pHeader->FC.SubType & 0x08)
914 // Data skip QOS contorl field
915 pRxBlk->DataSize -=2;
918 // Order bit: A-Ralink or HTC+
919 if (pRxBlk->pHeader->FC.Order)
922 // Data skip HTC contorl field
923 pRxBlk->DataSize -= 4;
927 if (header_len <= 40)
928 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
931 if (pRxBlk->RxD.L2PAD)
932 pRxBlk->pData += (header_len + 2);
934 pRxBlk->pData += header_len;
938 if (pRxBlk->DataSize < pOSPkt->len) {
939 skb_trim(pOSPkt,pRxBlk->DataSize);
941 skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));
944 if ((pRxBlk->pData - pOSPkt->data) > 0) {
945 skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));
946 skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));
949 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {
950 if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {
951 DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__));
952 goto err_free_sk_buff;
957 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);
959 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));
960 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
962 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
963 ph->msglen = sizeof(wlan_ng_prism2_header);
964 strcpy(ph->devname, pAd->net_dev->name);
966 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
967 ph->hosttime.status = 0;
968 ph->hosttime.len = 4;
969 ph->hosttime.data = jiffies;
971 ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;
972 ph->mactime.status = 0;
974 ph->mactime.data = 0;
976 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
981 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
982 ph->channel.status = 0;
985 ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;
987 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
990 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));;
992 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
993 ph->signal.status = 0;
995 ph->signal.data = 0; //rssi + noise;
997 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
998 ph->noise.status = 0;
1002 #ifdef DOT11_N_SUPPORT
1003 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
1005 rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
1008 #endif // DOT11_N_SUPPORT //
1009 if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
1010 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
1012 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
1015 if (rate_index > 255)
1018 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
1019 ph->rate.status = 0;
1021 ph->rate.data = ralinkrate[rate_index];
1023 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
1024 ph->frmlen.status = 0;
1026 ph->frmlen.data = (u_int32_t)pRxBlk->DataSize;
1029 pOSPkt->pkt_type = PACKET_OTHERHOST;
1030 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
1031 pOSPkt->ip_summed = CHECKSUM_NONE;
1037 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
1041 #endif // CONFIG_STA_SUPPORT //
1044 void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
1046 daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
1048 allow_signal(SIGTERM);
1049 allow_signal(SIGKILL);
1050 current->flags |= PF_NOFREEZE;
1052 /* signal that we've started the thread */
1056 void RTMP_IndicateMediaState(
1057 IN PRTMP_ADAPTER pAd)
1059 if (pAd->CommonCfg.bWirelessEvent)
1061 if (pAd->IndicateMediaState == NdisMediaStateConnected)
1063 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1067 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);