📄 rt_linux.c
字号:
skb->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); pPacket = OSPKT_TO_RTPKT(skb); } return pPacket;}PNDIS_PACKET ClonePacket( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket, IN PUCHAR pData, IN ULONG DataSize){ struct sk_buff *pRxPkt; struct sk_buff *pClonedPkt; ASSERT(pPacket); pRxPkt = RTPKT_TO_OSPKT(pPacket); // clone the packet pClonedPkt = skb_clone(pRxPkt, MEM_ALLOC_FLAG); if (pClonedPkt) { // set the correct dataptr and data len pClonedPkt->dev = pRxPkt->dev; pClonedPkt->data = pData; pClonedPkt->len = DataSize; pClonedPkt->tail = pClonedPkt->data + pClonedPkt->len; ASSERT(DataSize < 1530); } return pClonedPkt;}// // change OS packet DataPtr and DataLen// void update_os_packet_info( IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk, IN UCHAR FromWhichBSSID){ struct sk_buff *pOSPkt; ASSERT(pRxBlk->pRxPacket); pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); pOSPkt->data = pRxBlk->pData; pOSPkt->len = pRxBlk->DataSize; pOSPkt->tail = pOSPkt->data + pOSPkt->len;}void wlan_802_11_to_802_3_packet( IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk, IN PUCHAR pHeader802_3, IN UCHAR FromWhichBSSID){ struct sk_buff *pOSPkt; ASSERT(pRxBlk->pRxPacket); ASSERT(pHeader802_3); pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); pOSPkt->dev = get_netdev_from_bssid(pAd, FromWhichBSSID); pOSPkt->data = pRxBlk->pData; pOSPkt->len = pRxBlk->DataSize; pOSPkt->tail = pOSPkt->data + pOSPkt->len; // // copy 802.3 header // // #ifdef CONFIG_STA_SUPPORT NdisMoveMemory(skb_push(pOSPkt, LENGTH_802_3), pHeader802_3, LENGTH_802_3);#endif // CONFIG_STA_SUPPORT // }void announce_802_3_packet( IN PRTMP_ADAPTER pAd, IN PNDIS_PACKET pPacket){ struct sk_buff *pRxPkt; ASSERT(pPacket); pRxPkt = RTPKT_TO_OSPKT(pPacket); /* Push up the protocol stack */ pRxPkt->protocol = eth_type_trans(pRxPkt, pRxPkt->dev);//#ifdef CONFIG_5VT_ENHANCE// *(int*)(pRxPkt->cb) = BRIDGE_TAG; //#endif netif_rx(pRxPkt);}/* * invaild or writeback cache * and convert virtual address to physical address */dma_addr_t linux_pci_map_single(void *handle, void *ptr, size_t size, int direction){ PRTMP_ADAPTER pAd; POS_COOKIE pObj; pAd = (PRTMP_ADAPTER)handle; pObj = (POS_COOKIE)pAd->OS_Cookie; return pci_map_single(pObj->pci_dev, ptr, size, direction);}void linux_pci_unmap_single(void *handle, dma_addr_t dma_addr, size_t size, int direction){ PRTMP_ADAPTER pAd; POS_COOKIE pObj; pAd=(PRTMP_ADAPTER)handle; pObj = (POS_COOKIE)pAd->OS_Cookie; pci_unmap_single(pObj->pci_dev, dma_addr, size, direction); }PRTMP_SCATTER_GATHER_LISTrt_get_sg_list_from_packet(PNDIS_PACKET pPacket, RTMP_SCATTER_GATHER_LIST *sg){ sg->NumberOfElements = 1; sg->Elements[0].Address = GET_OS_PKT_DATAPTR(pPacket); sg->Elements[0].Length = GET_OS_PKT_LEN(pPacket); return (sg);}void hex_dump(char *str, unsigned char *pSrcBufVA, unsigned int SrcBufLen){ unsigned char *pt; int x; if (RTDebugLevel < RT_DEBUG_TRACE) return; pt = pSrcBufVA; printk("%s: %p, len = %d\n",str, pSrcBufVA, SrcBufLen); for (x=0; x<SrcBufLen; x++) { if (x % 16 == 0) printk("0x%04x : ", x); printk("%02x ", ((unsigned char)pt[x])); if (x%16 == 15) printk("\n"); } printk("\n");}/* ======================================================================== Routine Description: Send log message through wireless event Support standard iw_event with IWEVCUSTOM. It is used below. iwreq_data.data.flags is used to store event_flag that is defined by user. iwreq_data.data.length is the length of the event log. The format of the event log is composed of the entry's MAC address and the desired log message (refer to pWirelessEventText). ex: 11:22:33:44:55:66 has associated successfully p.s. The requirement of Wireless Extension is v15 or newer. ========================================================================*/VOID RTMPSendWirelessEvent( IN PRTMP_ADAPTER pAd, IN USHORT Event_flag, IN MAC_TABLE_ENTRY *pEntry){#if WIRELESS_EXT >= 15 union iwreq_data wrqu; PUCHAR pBuf = NULL, pBufPtr = NULL; USHORT event, BufLen; event = Event_flag & 0x00FF; // sanity check if (event > IW_EVENT_TYPE_NUM) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The event(%d) is not valid.\n", __FUNCTION__, event)); return; } if (!pEntry) { DBGPRINT(RT_DEBUG_ERROR, ("%s : The Entry doesn't exist.\n", __FUNCTION__)); return; } //Allocate memory and copy the msg. if((pBuf = kmalloc(IW_CUSTOM_MAX_LEN, GFP_ATOMIC)) != NULL) { //Prepare the payload memset(pBuf, 0, IW_CUSTOM_MAX_LEN); pBufPtr = pBuf; pBufPtr += sprintf(pBufPtr, "(RT2860) %02x:%02x:%02x:%02x:%02x:%02x %s", PRINT_MAC(pEntry->Addr), pWirelessEventText[event]); pBufPtr[pBufPtr - pBuf] = '\0'; BufLen = pBufPtr - pBuf; memset(&wrqu, 0, sizeof(wrqu)); wrqu.data.flags = Event_flag; wrqu.data.length = BufLen; //send wireless event wireless_send_event(pAd->net_dev, IWEVCUSTOM, &wrqu, pBuf); kfree(pBuf); } else DBGPRINT(RT_DEBUG_ERROR, ("%s() : Can't allocate memory for wireless event.\n", __FUNCTION__)); #else DBGPRINT(RT_DEBUG_ERROR, ("%s : The Wireless Extension MUST be v15 or newer.\n", __FUNCTION__)); #endif /* WIRELESS_EXT >= 15 */ }#ifdef CONFIG_STA_SUPPORTvoid send_monitor_packets( IN PRTMP_ADAPTER pAd, IN RX_BLK *pRxBlk){ struct sk_buff *pOSPkt; wlan_ng_prism2_header *ph; int rate_index = 0; 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 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, 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}; ASSERT(pRxBlk->pRxPacket); pOSPkt = RTPKT_TO_OSPKT(pRxBlk->pRxPacket); if (pRxBlk->DataSize + sizeof(wlan_ng_prism2_header) > RX_BUFFER_AGGRESIZE) { DBGPRINT(RT_DEBUG_ERROR, ("%s : Size is too large! (%d)\n", __FUNCTION__, pRxBlk->DataSize + sizeof(wlan_ng_prism2_header))); RELEASE_NDIS_PACKET(pAd, pRxBlk->pRxPacket, NDIS_STATUS_FAILURE); return; } pOSPkt->dev = get_netdev_from_bssid(pAd, BSS0); if (pRxBlk->pHeader->FC.Type == BTYPE_DATA) { UCHAR header_len = LENGTH_802_11; UCHAR temp_header[40] = {0}; pRxBlk->DataSize -= LENGTH_802_11; // QOS if (pRxBlk->pHeader->FC.SubType & 0x08) { header_len += 2; // Data skip QOS contorl field pRxBlk->DataSize -=2; } // Order bit: A-Ralink or HTC+ if (pRxBlk->pHeader->FC.Order) { header_len += 4; // Data skip HTC contorl field pRxBlk->DataSize -= 4; } // Copy Header if (header_len <= 40) NdisMoveMemory(temp_header, pRxBlk->pData, header_len); // skip HW padding if (pRxBlk->RxD.L2PAD) pRxBlk->pData += (header_len + 2); else pRxBlk->pData += header_len; pOSPkt->data = pRxBlk->pData; pOSPkt->len = pRxBlk->DataSize; pOSPkt->tail = pOSPkt->data + pOSPkt->len; NdisMoveMemory(skb_push(pOSPkt, header_len), temp_header, header_len); } else { pOSPkt->data = pRxBlk->pData; pOSPkt->len = pRxBlk->DataSize; pOSPkt->tail = pOSPkt->data + pOSPkt->len; } if (skb_headroom(pOSPkt) < sizeof(wlan_ng_prism2_header)) pskb_expand_head(pOSPkt, sizeof(wlan_ng_prism2_header), 0, GFP_ATOMIC); ph = (wlan_ng_prism2_header *) skb_push(pOSPkt, sizeof(wlan_ng_prism2_header)); NdisZeroMemory(ph, sizeof(wlan_ng_prism2_header)); ph->msgcode = DIDmsg_lnxind_wlansniffrm; ph->msglen = sizeof(wlan_ng_prism2_header); strcpy(ph->devname, pAd->net_dev->name); ph->hosttime.did = DIDmsg_lnxind_wlansniffrm_hosttime; ph->hosttime.status = 0; ph->hosttime.len = 4; ph->hosttime.data = jiffies; ph->mactime.did = DIDmsg_lnxind_wlansniffrm_mactime; ph->mactime.status = 0; ph->mactime.len = 0; ph->mactime.data = 0; ph->istx.did = DIDmsg_lnxind_wlansniffrm_istx; ph->istx.status = 0; ph->istx.len = 0; ph->istx.data = 0; ph->channel.did = DIDmsg_lnxind_wlansniffrm_channel; ph->channel.status = 0; ph->channel.len = 4; if (pAd->CommonCfg.PhyMode >= PHY_11ABGN_MIXED && pAd->CommonCfg.RegTransmitSetting.field.BW == BW_40) ph->channel.data = (u_int32_t)pAd->CommonCfg.CentralChannel; else ph->channel.data = (u_int32_t)pAd->CommonCfg.Channel; ph->rssi.did = DIDmsg_lnxind_wlansniffrm_rssi; ph->rssi.status = 0; ph->rssi.len = 4; 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));; ph->signal.did = DIDmsg_lnxind_wlansniffrm_signal; ph->signal.status = 0; ph->signal.len = 4; ph->signal.data = 0; //rssi + noise; ph->noise.did = DIDmsg_lnxind_wlansniffrm_noise; ph->noise.status = 0; ph->noise.len = 4; ph->noise.data = 0; if (pRxBlk->pRxWI->PHYMODE >= MODE_HTMIX) { rate_index = 16 + ((UCHAR)pRxBlk->pRxWI->BW *16) + ((UCHAR)pRxBlk->pRxWI->ShortGI *32) + ((UCHAR)pRxBlk->pRxWI->MCS); } else if (pRxBlk->pRxWI->PHYMODE == MODE_OFDM) rate_index = (UCHAR)(pRxBlk->pRxWI->MCS) + 4; else rate_index = (UCHAR)(pRxBlk->pRxWI->MCS); if (rate_index < 0) rate_index = 0; if (rate_index > 255) rate_index = 255; ph->rate.did = DIDmsg_lnxind_wlansniffrm_rate; ph->rate.status = 0; ph->rate.len = 4; ph->rate.data = ralinkrate[rate_index]; ph->frmlen.did = DIDmsg_lnxind_wlansniffrm_frmlen; ph->frmlen.status = 0; ph->frmlen.len = 4; ph->frmlen.data = (u_int32_t)pRxBlk->DataSize; pOSPkt->pkt_type = PACKET_OTHERHOST; pOSPkt->protocol = eth_type_trans(pOSPkt, pOSPkt->dev); pOSPkt->ip_summed = CHECKSUM_NONE; netif_rx(pOSPkt); return;}#endif // CONFIG_STA_SUPPORT //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -