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);
50 BUILD_TIMER_FUNCTION(StaQuickResponeForRateUpExec);
51 BUILD_TIMER_FUNCTION(WpaDisassocApAndBlockAssoc);
52 #endif // CONFIG_STA_SUPPORT //
54 // for wireless system event message
55 char const *pWirelessSysEventText[IW_SYS_EVENT_TYPE_NUM] = {
56 // system status event
57 "had associated successfully", /* IW_ASSOC_EVENT_FLAG */
58 "had disassociated", /* IW_DISASSOC_EVENT_FLAG */
59 "had deauthenticated", /* IW_DEAUTH_EVENT_FLAG */
60 "had been aged-out and disassociated", /* IW_AGEOUT_EVENT_FLAG */
61 "occurred CounterMeasures attack", /* IW_COUNTER_MEASURES_EVENT_FLAG */
62 "occurred replay counter different in Key Handshaking", /* IW_REPLAY_COUNTER_DIFF_EVENT_FLAG */
63 "occurred RSNIE different in Key Handshaking", /* IW_RSNIE_DIFF_EVENT_FLAG */
64 "occurred MIC different in Key Handshaking", /* IW_MIC_DIFF_EVENT_FLAG */
65 "occurred ICV error in RX", /* IW_ICV_ERROR_EVENT_FLAG */
66 "occurred MIC error in RX", /* IW_MIC_ERROR_EVENT_FLAG */
67 "Group Key Handshaking timeout", /* IW_GROUP_HS_TIMEOUT_EVENT_FLAG */
68 "Pairwise Key Handshaking timeout", /* IW_PAIRWISE_HS_TIMEOUT_EVENT_FLAG */
69 "RSN IE sanity check failure", /* IW_RSNIE_SANITY_FAIL_EVENT_FLAG */
70 "set key done in WPA/WPAPSK", /* IW_SET_KEY_DONE_WPA1_EVENT_FLAG */
71 "set key done in WPA2/WPA2PSK", /* IW_SET_KEY_DONE_WPA2_EVENT_FLAG */
72 "connects with our wireless client", /* IW_STA_LINKUP_EVENT_FLAG */
73 "disconnects with our wireless client", /* IW_STA_LINKDOWN_EVENT_FLAG */
74 "scan completed" /* IW_SCAN_COMPLETED_EVENT_FLAG */
75 "scan terminate!! Busy!! Enqueue fail!!" /* IW_SCAN_ENQUEUE_FAIL_EVENT_FLAG */
78 // for wireless IDS_spoof_attack event message
79 char const *pWirelessSpoofEventText[IW_SPOOF_EVENT_TYPE_NUM] = {
80 "detected conflict SSID", /* IW_CONFLICT_SSID_EVENT_FLAG */
81 "detected spoofed association response", /* IW_SPOOF_ASSOC_RESP_EVENT_FLAG */
82 "detected spoofed reassociation responses", /* IW_SPOOF_REASSOC_RESP_EVENT_FLAG */
83 "detected spoofed probe response", /* IW_SPOOF_PROBE_RESP_EVENT_FLAG */
84 "detected spoofed beacon", /* IW_SPOOF_BEACON_EVENT_FLAG */
85 "detected spoofed disassociation", /* IW_SPOOF_DISASSOC_EVENT_FLAG */
86 "detected spoofed authentication", /* IW_SPOOF_AUTH_EVENT_FLAG */
87 "detected spoofed deauthentication", /* IW_SPOOF_DEAUTH_EVENT_FLAG */
88 "detected spoofed unknown management frame", /* IW_SPOOF_UNKNOWN_MGMT_EVENT_FLAG */
89 "detected replay attack" /* IW_REPLAY_ATTACK_EVENT_FLAG */
92 // for wireless IDS_flooding_attack event message
93 char const *pWirelessFloodEventText[IW_FLOOD_EVENT_TYPE_NUM] = {
94 "detected authentication flooding", /* IW_FLOOD_AUTH_EVENT_FLAG */
95 "detected association request flooding", /* IW_FLOOD_ASSOC_REQ_EVENT_FLAG */
96 "detected reassociation request flooding", /* IW_FLOOD_REASSOC_REQ_EVENT_FLAG */
97 "detected probe request flooding", /* IW_FLOOD_PROBE_REQ_EVENT_FLAG */
98 "detected disassociation flooding", /* IW_FLOOD_DISASSOC_EVENT_FLAG */
99 "detected deauthentication flooding", /* IW_FLOOD_DEAUTH_EVENT_FLAG */
100 "detected 802.1x eap-request flooding" /* IW_FLOOD_EAP_REQ_EVENT_FLAG */
104 VOID RTMP_SetPeriodicTimer(
105 IN NDIS_MINIPORT_TIMER *pTimer,
106 IN unsigned long timeout)
108 timeout = ((timeout*HZ) / 1000);
109 pTimer->expires = jiffies + timeout;
113 /* convert NdisMInitializeTimer --> RTMP_OS_Init_Timer */
114 VOID RTMP_OS_Init_Timer(
115 IN PRTMP_ADAPTER pAd,
116 IN NDIS_MINIPORT_TIMER *pTimer,
117 IN TIMER_FUNCTION function,
121 pTimer->data = (unsigned long)data;
122 pTimer->function = function;
126 VOID RTMP_OS_Add_Timer(
127 IN NDIS_MINIPORT_TIMER *pTimer,
128 IN unsigned long timeout)
130 if (timer_pending(pTimer))
133 timeout = ((timeout*HZ) / 1000);
134 pTimer->expires = jiffies + timeout;
138 VOID RTMP_OS_Mod_Timer(
139 IN NDIS_MINIPORT_TIMER *pTimer,
140 IN unsigned long timeout)
142 timeout = ((timeout*HZ) / 1000);
143 mod_timer(pTimer, jiffies + timeout);
146 VOID RTMP_OS_Del_Timer(
147 IN NDIS_MINIPORT_TIMER *pTimer,
148 OUT BOOLEAN *pCancelled)
150 if (timer_pending(pTimer))
152 *pCancelled = del_timer_sync(pTimer);
161 VOID RTMP_OS_Release_Packet(
162 IN PRTMP_ADAPTER pAd,
163 IN PQUEUE_ENTRY pEntry)
165 //RTMPFreeNdisPacket(pAd, (struct sk_buff *)pEntry);
168 // Unify all delay routine by using udelay
174 for (i = 0; i < (usec / 50); i++)
181 void RTMP_GetCurrentSystemTime(LARGE_INTEGER *time)
183 time->u.LowPart = jiffies;
186 // pAd MUST allow to be NULL
187 NDIS_STATUS os_alloc_mem(
188 IN PRTMP_ADAPTER pAd,
192 *mem = (PUCHAR) kmalloc(size, GFP_ATOMIC);
194 return (NDIS_STATUS_SUCCESS);
196 return (NDIS_STATUS_FAILURE);
199 // pAd MUST allow to be NULL
200 NDIS_STATUS os_free_mem(
201 IN PRTMP_ADAPTER pAd,
207 return (NDIS_STATUS_SUCCESS);
211 PNDIS_PACKET RTMP_AllocateFragPacketBuffer(
212 IN PRTMP_ADAPTER pAd,
217 pkt = dev_alloc_skb(Length);
221 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate frag rx %ld size packet\n",Length));
226 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
229 return (PNDIS_PACKET) pkt;
233 PNDIS_PACKET RTMP_AllocateTxPacketBuffer(
234 IN PRTMP_ADAPTER pAd,
237 OUT PVOID *VirtualAddress)
241 pkt = dev_alloc_skb(Length);
245 DBGPRINT(RT_DEBUG_ERROR, ("can't allocate tx %ld size packet\n",Length));
250 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
251 *VirtualAddress = (PVOID) pkt->data;
255 *VirtualAddress = (PVOID) NULL;
258 return (PNDIS_PACKET) pkt;
262 VOID build_tx_packet(
263 IN PRTMP_ADAPTER pAd,
264 IN PNDIS_PACKET pPacket,
269 struct sk_buff *pTxPkt;
272 pTxPkt = RTPKT_TO_OSPKT(pPacket);
274 NdisMoveMemory(skb_put(pTxPkt, FrameLen), pFrame, FrameLen);
277 VOID RTMPFreeAdapter(
278 IN PRTMP_ADAPTER pAd)
280 POS_COOKIE os_cookie;
283 os_cookie=(POS_COOKIE)pAd->OS_Cookie;
285 kfree(pAd->BeaconBuf);
288 NdisFreeSpinLock(&pAd->MgmtRingLock);
291 for (index =0 ; index < NUM_OF_TX_RING; index++)
293 NdisFreeSpinLock(&pAd->TxSwQueueLock[index]);
294 NdisFreeSpinLock(&pAd->DeQueueLock[index]);
295 pAd->DeQueueRunning[index] = FALSE;
298 NdisFreeSpinLock(&pAd->irq_lock);
301 vfree(pAd); // pci_free_consistent(os_cookie->pci_dev,sizeof(RTMP_ADAPTER),pAd,os_cookie->pAd_pa);
305 BOOLEAN OS_Need_Clone_Packet(void)
313 ========================================================================
316 clone an input NDIS PACKET to another one. The new internally created NDIS PACKET
317 must have only one NDIS BUFFER
318 return - byte copied. 0 means can't create NDIS PACKET
319 NOTE: internally created NDIS_PACKET should be destroyed by RTMPFreeNdisPacket
322 pAd Pointer to our adapter
323 pInsAMSDUHdr EWC A-MSDU format has extra 14-bytes header. if TRUE, insert this 14-byte hdr in front of MSDU.
324 *pSrcTotalLen return total packet length. This lenght is calculated with 802.3 format packet.
332 ========================================================================
334 NDIS_STATUS RTMPCloneNdisPacket(
335 IN PRTMP_ADAPTER pAd,
336 IN BOOLEAN pInsAMSDUHdr,
337 IN PNDIS_PACKET pInPacket,
338 OUT PNDIS_PACKET *ppOutPacket)
346 // 1. Allocate a packet
347 pkt = dev_alloc_skb(2048);
351 return NDIS_STATUS_FAILURE;
354 skb_put(pkt, GET_OS_PKT_LEN(pInPacket));
355 NdisMoveMemory(pkt->data, GET_OS_PKT_DATAPTR(pInPacket), GET_OS_PKT_LEN(pInPacket));
356 *ppOutPacket = OSPKT_TO_RTPKT(pkt);
359 RTMP_SET_PACKET_SOURCE(OSPKT_TO_RTPKT(pkt), PKTSRC_NDIS);
361 printk("###Clone###\n");
363 return NDIS_STATUS_SUCCESS;
367 // the allocated NDIS PACKET must be freed via RTMPFreeNdisPacket()
368 NDIS_STATUS RTMPAllocateNdisPacket(
369 IN PRTMP_ADAPTER pAd,
370 OUT PNDIS_PACKET *ppPacket,
376 PNDIS_PACKET pPacket;
380 // 1. Allocate a packet
381 pPacket = (PNDIS_PACKET *) dev_alloc_skb(HeaderLen + DataLen + TXPADDING_SIZE);
386 printk("RTMPAllocateNdisPacket Fail\n\n");
388 return NDIS_STATUS_FAILURE;
391 // 2. clone the frame content
393 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket), pHeader, HeaderLen);
395 NdisMoveMemory(GET_OS_PKT_DATAPTR(pPacket) + HeaderLen, pData, DataLen);
397 // 3. update length of packet
398 skb_put(GET_OS_PKT_TYPE(pPacket), HeaderLen+DataLen);
400 RTMP_SET_PACKET_SOURCE(pPacket, PKTSRC_NDIS);
401 // printk("%s : pPacket = %p, len = %d\n", __func__, pPacket, GET_OS_PKT_LEN(pPacket));
403 return NDIS_STATUS_SUCCESS;
407 ========================================================================
409 This routine frees a miniport internally allocated NDIS_PACKET and its
410 corresponding NDIS_BUFFER and allocated memory.
411 ========================================================================
413 VOID RTMPFreeNdisPacket(
414 IN PRTMP_ADAPTER pAd,
415 IN PNDIS_PACKET pPacket)
417 dev_kfree_skb_any(RTPKT_TO_OSPKT(pPacket));
421 // IRQL = DISPATCH_LEVEL
422 // NOTE: we do have an assumption here, that Byte0 and Byte1 always reasid at the same
423 // scatter gather buffer
424 NDIS_STATUS Sniff2BytesFromNdisBuffer(
425 IN PNDIS_BUFFER pFirstBuffer,
426 IN UCHAR DesiredOffset,
430 *pByte0 = *(PUCHAR)(pFirstBuffer + DesiredOffset);
431 *pByte1 = *(PUCHAR)(pFirstBuffer + DesiredOffset + 1);
433 return NDIS_STATUS_SUCCESS;
437 void RTMP_QueryPacketInfo(
438 IN PNDIS_PACKET pPacket,
439 OUT PACKET_INFO *pPacketInfo,
440 OUT PUCHAR *pSrcBufVA,
441 OUT UINT *pSrcBufLen)
443 pPacketInfo->BufferCount = 1;
444 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
445 pPacketInfo->PhysicalBufferCount = 1;
446 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
448 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
449 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
452 void RTMP_QueryNextPacketInfo(
453 IN PNDIS_PACKET *ppPacket,
454 OUT PACKET_INFO *pPacketInfo,
455 OUT PUCHAR *pSrcBufVA,
456 OUT UINT *pSrcBufLen)
458 PNDIS_PACKET pPacket = NULL;
461 pPacket = GET_OS_PKT_NEXT(*ppPacket);
465 pPacketInfo->BufferCount = 1;
466 pPacketInfo->pFirstBuffer = GET_OS_PKT_DATAPTR(pPacket);
467 pPacketInfo->PhysicalBufferCount = 1;
468 pPacketInfo->TotalPacketLength = GET_OS_PKT_LEN(pPacket);
470 *pSrcBufVA = GET_OS_PKT_DATAPTR(pPacket);
471 *pSrcBufLen = GET_OS_PKT_LEN(pPacket);
472 *ppPacket = GET_OS_PKT_NEXT(pPacket);
476 pPacketInfo->BufferCount = 0;
477 pPacketInfo->pFirstBuffer = NULL;
478 pPacketInfo->PhysicalBufferCount = 0;
479 pPacketInfo->TotalPacketLength = 0;
487 // not yet support MBSS
488 PNET_DEV get_netdev_from_bssid(
489 IN PRTMP_ADAPTER pAd,
490 IN UCHAR FromWhichBSSID)
492 PNET_DEV dev_p = NULL;
495 #ifdef CONFIG_STA_SUPPORT
496 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
498 dev_p = pAd->net_dev;
500 #endif // CONFIG_STA_SUPPORT //
503 return dev_p; /* return one of MBSS */
506 PNDIS_PACKET DuplicatePacket(
507 IN PRTMP_ADAPTER pAd,
508 IN PNDIS_PACKET pPacket,
509 IN UCHAR FromWhichBSSID)
512 PNDIS_PACKET pRetPacket = NULL;
516 DataSize = (USHORT) GET_OS_PKT_LEN(pPacket);
517 pData = (PUCHAR) GET_OS_PKT_DATAPTR(pPacket);
520 skb = skb_clone(RTPKT_TO_OSPKT(pPacket), MEM_ALLOC_FLAG);
523 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
524 pRetPacket = OSPKT_TO_RTPKT(skb);
528 if ((skb = __dev_alloc_skb(DataSize + 2+32, MEM_ALLOC_FLAG)) != NULL)
530 skb_reserve(skb, 2+32);
531 NdisMoveMemory(skb->tail, pData, DataSize);
532 skb_put(skb, DataSize);
533 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
534 pRetPacket = OSPKT_TO_RTPKT(skb);
542 PNDIS_PACKET duplicate_pkt(
543 IN PRTMP_ADAPTER pAd,
544 IN PUCHAR pHeader802_3,
548 IN UCHAR FromWhichBSSID)
551 PNDIS_PACKET pPacket = NULL;
554 if ((skb = __dev_alloc_skb(HdrLen + DataSize + 2, MEM_ALLOC_FLAG)) != NULL)
557 NdisMoveMemory(skb->tail, pHeader802_3, HdrLen);
558 skb_put(skb, HdrLen);
559 NdisMoveMemory(skb->tail, pData, DataSize);
560 skb_put(skb, DataSize);
561 skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
562 pPacket = OSPKT_TO_RTPKT(skb);
569 #define TKIP_TX_MIC_SIZE 8
570 PNDIS_PACKET duplicate_pkt_with_TKIP_MIC(
571 IN PRTMP_ADAPTER pAd,
572 IN PNDIS_PACKET pPacket)
574 struct sk_buff *skb, *newskb;
577 skb = RTPKT_TO_OSPKT(pPacket);
578 if (skb_tailroom(skb) < TKIP_TX_MIC_SIZE)
580 // alloc a new skb and copy the packet
581 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
582 dev_kfree_skb_any(skb);
585 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC for packet failed!, dropping packet!\n"));
591 return OSPKT_TO_RTPKT(skb);
594 if ((data = skb_put(skb, TKIP_TX_MIC_SIZE)) != NULL)
595 { // If we can extend it, well, copy it first.
596 NdisMoveMemory(data, pAd->PrivateInfo.Tx.MIC, TKIP_TX_MIC_SIZE);
600 // Otherwise, copy the packet.
601 newskb = skb_copy_expand(skb, skb_headroom(skb), TKIP_TX_MIC_SIZE, GFP_ATOMIC);
602 dev_kfree_skb_any(skb);
605 DBGPRINT(RT_DEBUG_ERROR, ("Extend Tx.MIC to packet failed!, dropping packet\n"));
610 NdisMoveMemory(skb->tail, pAd->PrivateInfo.Tx.MIC, TKIP_TX_MIC_SIZE);
611 skb_put(skb, TKIP_TX_MIC_SIZE);
614 return OSPKT_TO_RTPKT(skb);
622 PNDIS_PACKET ClonePacket(
623 IN PRTMP_ADAPTER pAd,
624 IN PNDIS_PACKET pPacket,
628 struct sk_buff *pRxPkt;
629 struct sk_buff *pClonedPkt;
632 pRxPkt = RTPKT_TO_OSPKT(pPacket);
635 pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG);
639 // set the correct dataptr and data len
640 pClonedPkt->dev = pRxPkt->dev;
641 pClonedPkt->data = pData;
642 pClonedPkt->len = DataSize;
643 pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len;
644 ASSERT(DataSize < 1530);
650 // change OS packet DataPtr and DataLen
652 void update_os_packet_info(
653 IN PRTMP_ADAPTER pAd,
655 IN UCHAR FromWhichBSSID)
657 struct sk_buff *pOSPkt;
659 ASSERT(pRxBlk->pRxPacket);
660 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
662 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
663 pOSPkt->data = pRxBlk->pData;
664 pOSPkt->len = pRxBlk->DataSize;
665 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
669 void wlan_802_11_to_802_3_packet(
670 IN PRTMP_ADAPTER pAd,
672 IN PUCHAR pHeader802_3,
673 IN UCHAR FromWhichBSSID)
675 struct sk_buff *pOSPkt;
677 ASSERT(pRxBlk->pRxPacket);
678 ASSERT(pHeader802_3);
680 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
682 pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID);
683 pOSPkt->data = pRxBlk->pData;
684 pOSPkt->len = pRxBlk->DataSize;
685 pOSPkt->tail = pOSPkt->data + pOSPkt->len;
692 #ifdef CONFIG_STA_SUPPORT
693 IF_DEV_CONFIG_OPMODE_ON_STA(pAd)
694 NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);
695 #endif // CONFIG_STA_SUPPORT //
700 void announce_802_3_packet(
701 IN PRTMP_ADAPTER pAd,
702 IN PNDIS_PACKET pPacket)
705 struct sk_buff *pRxPkt;
709 pRxPkt = RTPKT_TO_OSPKT(pPacket);
711 #ifdef CONFIG_STA_SUPPORT
712 #endif // CONFIG_STA_SUPPORT //
714 /* Push up the protocol stack */
716 IKANOS_DataFrameRx(pAd, pRxPkt->dev, pRxPkt, pRxPkt->len);
718 pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);
720 //#ifdef CONFIG_5VT_ENHANCE
721 // *(int*)(pRxPkt->cb) = BRIDGE_TAG;
724 #endif // IKANOS_VX_1X0 //
728 PRTMP_SCATTER_GATHER_LIST
729 rt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg)
731 sg->NumberOfElements = 1;
732 sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket);
733 sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket);
737 void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen)
742 if (RTDebugLevel < RT_DEBUG_TRACE)
746 printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen);
747 for (x=0; x<SrcBufLen; x++)
750 printk("0x%04x : ", x);
751 printk("%02x ", ((unsigned char)pt[x]));
752 if (x%16 == 15) printk("\n");
758 ========================================================================
761 Send log message through wireless event
763 Support standard iw_event with IWEVCUSTOM. It is used below.
765 iwreq_data.data.flags is used to store event_flag that is defined by user.
766 iwreq_data.data.length is the length of the event log.
768 The format of the event log is composed of the entry's MAC address and
769 the desired log message (refer to pWirelessEventText).
771 ex: 11:22:33:44:55:66 has associated successfully
773 p.s. The requirement of Wireless Extension is v15 or newer.
775 ========================================================================
777 VOID RTMPSendWirelessEvent(
778 IN PRTMP_ADAPTER pAd,
779 IN USHORT Event_flag,
784 #if WIRELESS_EXT >= 15
786 union iwreq_data wrqu;
787 PUCHAR pBuf = NULL, pBufPtr = NULL;
788 USHORT event, type, BufLen;
789 UCHAR event_table_len = 0;
791 type = Event_flag & 0xFF00;
792 event = Event_flag & 0x00FF;
796 case IW_SYS_EVENT_FLAG_START:
797 event_table_len = IW_SYS_EVENT_TYPE_NUM;
800 case IW_SPOOF_EVENT_FLAG_START:
801 event_table_len = IW_SPOOF_EVENT_TYPE_NUM;
804 case IW_FLOOD_EVENT_FLAG_START:
805 event_table_len = IW_FLOOD_EVENT_TYPE_NUM;
809 if (event_table_len == 0)
811 DBGPRINT(RT_DEBUG_ERROR, ("%s : The type(%0x02x) is not valid.\n", __func__, type));
815 if (event >= event_table_len)
817 DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%0x02x) is not valid.\n", __func__, event));
821 //Allocate memory and copy the msg.
822 if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL)
824 //Prepare the payload
825 memset(pBuf, 0, IW_CUSTOM_MAX_LEN);
830 pBufPtr += sprintf(pBufPtr, "(RT2860) STA(%02x:%02x:%02x:%02x:%02x:%02x) ", PRINT_MAC(pAddr));
831 else if (BssIdx < MAX_MBSSID_NUM)
832 pBufPtr += sprintf(pBufPtr, "(RT2860) BSS(ra%d) ", BssIdx);
834 pBufPtr += sprintf(pBufPtr, "(RT2860) ");
836 if (type == IW_SYS_EVENT_FLAG_START)
837 pBufPtr += sprintf(pBufPtr, "%s", pWirelessSysEventText[event]);
838 else if (type == IW_SPOOF_EVENT_FLAG_START)
839 pBufPtr += sprintf(pBufPtr, "%s (RSSI=%d)", pWirelessSpoofEventText[event], Rssi);
840 else if (type == IW_FLOOD_EVENT_FLAG_START)
841 pBufPtr += sprintf(pBufPtr, "%s", pWirelessFloodEventText[event]);
843 pBufPtr += sprintf(pBufPtr, "%s", "unknown event");
845 pBufPtr[pBufPtr - pBuf] = '\0';
846 BufLen = pBufPtr - pBuf;
848 memset(&wrqu, 0, sizeof(wrqu));
849 wrqu.data.flags = Event_flag;
850 wrqu.data.length = BufLen;
852 //send wireless event
853 wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf);
855 //DBGPRINT(RT_DEBUG_TRACE, ("%s : %s\n", __func__, pBuf));
860 DBGPRINT(RT_DEBUG_ERROR, ("%s : Can't allocate memory for wireless event.\n", __func__));
862 DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __func__));
863 #endif /* WIRELESS_EXT >= 15 */
867 #ifdef CONFIG_STA_SUPPORT
868 void send_monitor_packets(
869 IN PRTMP_ADAPTER pAd,
872 struct sk_buff *pOSPkt;
873 wlan_ng_prism2_header *ph;
875 USHORT header_len = 0;
876 UCHAR temp_header[40] = {0};
878 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
879 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,
880 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};
883 ASSERT(pRxBlk->pRxPacket);
884 if (pRxBlk->DataSize < 10)
886 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too small! (%d)\n", __func__, pRxBlk->DataSize));
887 goto err_free_sk_buff;
890 if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE)
892 DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%zu)\n", __func__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header)));
893 goto err_free_sk_buff;
896 pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket);
897 pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0);
898 if (pRxBlk->pHeader->FC.Type == BTYPE_DATA)
900 pRxBlk->DataSize -= LENGTH_802_11;
901 if ((pRxBlk->pHeader->FC.ToDs == 1) &&
902 (pRxBlk->pHeader->FC.FrDs == 1))
903 header_len = LENGTH_802_11_WITH_ADDR4;
905 header_len = LENGTH_802_11;
908 if (pRxBlk->pHeader->FC.SubType & 0x08)
911 // Data skip QOS contorl field
912 pRxBlk->DataSize -=2;
915 // Order bit: A-Ralink or HTC+
916 if (pRxBlk->pHeader->FC.Order)
919 // Data skip HTC contorl field
920 pRxBlk->DataSize -= 4;
924 if (header_len <= 40)
925 NdisMoveMemory(temp_header, pRxBlk->pData, header_len);
928 if (pRxBlk->RxD.L2PAD)
929 pRxBlk->pData += (header_len + 2);
931 pRxBlk->pData += header_len;
935 if (pRxBlk->DataSize < pOSPkt->len) {
936 skb_trim(pOSPkt,pRxBlk->DataSize);
938 skb_put(pOSPkt,(pRxBlk->DataSize - pOSPkt->len));
941 if ((pRxBlk->pData - pOSPkt->data) > 0) {
942 skb_put(pOSPkt,(pRxBlk->pData - pOSPkt->data));
943 skb_pull(pOSPkt,(pRxBlk->pData - pOSPkt->data));
946 if (skb_headroom(pOSPkt) < (sizeof(wlan_ng_prism2_header)+ header_len)) {
947 if (pskb_expand_head(pOSPkt, (sizeof(wlan_ng_prism2_header) + header_len), 0, GFP_ATOMIC)) {
948 DBGPRINT(RT_DEBUG_ERROR, ("%s : Reallocate header size of sk_buff fail!\n", __func__));
949 goto err_free_sk_buff;
954 NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len);
956 ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header));
957 NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header));
959 ph->msgcode = DIDmsg_lnxind_wlansniffrm;
960 ph->msglen = sizeof(wlan_ng_prism2_header);
961 strcpy(ph->devname, pAd->net_dev->name);
963 ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime;
964 ph->hosttime.status = 0;
965 ph->hosttime.len = 4;
966 ph->hosttime.data = jiffies;
968 ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime;
969 ph->mactime.status = 0;
971 ph->mactime.data = 0;
973 ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx;
978 ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel;
979 ph->channel.status = 0;
982 ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel;
984 ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi;
987 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));;
989 ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal;
990 ph->signal.status = 0;
992 ph->signal.data = 0; //rssi + noise;
994 ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise;
995 ph->noise.status = 0;
999 #ifdef DOT11_N_SUPPORT
1000 if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX)
1002 rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS);
1005 #endif // DOT11_N_SUPPORT //
1006 if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM)
1007 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4;
1009 rate_index = (UCHAR)(pRxBlk->pRxWI->MCS);
1012 if (rate_index > 255)
1015 ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate;
1016 ph->rate.status = 0;
1018 ph->rate.data = ralinkrate[rate_index];
1020 ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen;
1021 ph->frmlen.status = 0;
1023 ph->frmlen.data = (u_int32_t)pRxBlk->DataSize;
1026 pOSPkt->pkt_type = PACKET_OTHERHOST;
1027 pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev);
1028 pOSPkt->ip_summed = CHECKSUM_NONE;
1034 RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE);
1038 #endif // CONFIG_STA_SUPPORT //
1041 void rtmp_os_thread_init(PUCHAR pThreadName, PVOID pNotify)
1043 daemonize(pThreadName /*"%s",pAd->net_dev->name*/);
1045 allow_signal(SIGTERM);
1046 allow_signal(SIGKILL);
1047 current->flags |= PF_NOFREEZE;
1049 /* signal that we've started the thread */
1053 void RTMP_IndicateMediaState(
1054 IN PRTMP_ADAPTER pAd)
1056 if (pAd->CommonCfg.bWirelessEvent)
1058 if (pAd->IndicateMediaState == NdisMediaStateConnected)
1060 RTMPSendWirelessEvent(pAd, IW_STA_LINKUP_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);
1064 RTMPSendWirelessEvent(pAd, IW_STA_LINKDOWN_EVENT_FLAG, pAd->MacTab.Content[BSSID_WCID].Addr, BSS0, 0);