📄 wt_conv.c
字号:
#include "wtprecomp.h"static UINT8 oui_rfc1042[] = { 0x00, 0x00, 0x00 };static UINT8 oui_8021h[] = { 0x00, 0x00, 0xf8 };//#define ntohs(_n) ((((_n)&0xff) << 8) | (((_n)>>8)&0xff))//#define htons(_n) ((((_n)&0xff) << 8) | (((_n)>>8)&0xff))ULONG Wt802_11to802_3(IN PWT_ADAPTER Adapter, IN PWTWLAN_RXBUF pWtRxBuf) { UINT BytesCopied = 1;//just for test FN_ENTER; FN_EXIT(0,0); return BytesCopied;} int wt_stt_findproto(unsigned int proto){ if (proto == 0x80f3) /* APPLETALK */ return 1; return 0; // return ((prottype == ETH_P_AARP) || (prottype == ETH_P_IPX));}ULONG Wt802_3to802_11(IN PWT_ADAPTER Adapter, IN PWTWLAN_TXBUF pWtTxBuf) { UINT16 proto; UINT16 fc; PWTWLAN_HWTXBUF payload; p80211_hdr_t *w_hdr; wlan_ethhdr_t *e_hdr; struct wlan_llc *e_llc; struct wlan_snap *e_snap; UINT8 *a1 = NULL; UINT8 *a2 = NULL; UINT8 *a3 = NULL; FN_ENTER; e_hdr = (wlan_ethhdr_t *)(pWtTxBuf->skb->data); if(pWtTxBuf->skb->len <= 0) return 0; payload = pWtTxBuf->TXHwBuf.pHwTxBuf; pWtTxBuf->LlcHeadLen = 0; /* step 1: classify ether frame, DIX or 802.3? */ proto = ntohs(e_hdr->type); if (proto <= 1500) { /* codes <= 1500 reserved for 802.3 lengths */ /* it's 802.3, pass ether payload unchanged, */ /* trim off ethernet header and copy payload to tx_desc */ payload->TxAUXBuf.DataLen = host2ieee16(proto); // payload->length = proto; // memcpy(payload->data, skb->data + sizeof(wlan_ethhdr_t), payload->length); } else { /* it's DIXII, time for some conversion */ /* Create 802.11 packet. Header also contains llc and snap. */ // size of body is llc + snap + BytesCopied - sizeof(wlan_ethhdr_t) // llc is located in front of (snap + 802.11 body) // e_llc = (wlan_llc_t*)(header->data + WLAN_HDR_A3_LEN); e_llc = (wlan_llc_t*)pWtTxBuf->TXHwBuf.pHwTxBuf->Buffer; // snap is located behind the llc and in front of 802.11 body e_snap = (wlan_snap_t*)((UINT8*)e_llc + sizeof(wlan_llc_t)); /* setup the LLC header */ e_llc->dsap = 0xAA; /* SNAP, see IEEE 802 */ e_llc->ssap = 0xAA; e_llc->ctl = 0x03; /* setup the SNAP header */ e_snap->type = htons(proto); if (wt_stt_findproto(proto)) memcpy(e_snap->oui, oui_8021h, WLAN_IEEE_OUI_LEN); else memcpy(e_snap->oui, oui_rfc1042, WLAN_IEEE_OUI_LEN); //added by hk 2004.12.11 payload->TxAUXBuf.DataLen = host2ieee16( sizeof(wlan_llc_t) + sizeof(wlan_snap_t) + pWtTxBuf->skb->len -WLAN_ETHHDR_LEN ); //printk( "File %s Line %d payload->TxAUXBuf.DataLen = %08x\n", __FILE__, __LINE__, payload->TxAUXBuf.DataLen ); pWtTxBuf->LlcHeadLen = sizeof(wlan_llc_t) + sizeof(wlan_snap_t); if( ieee2host16( payload->TxAUXBuf.DataLen ) < 38 + sizeof(wlan_llc_t) + sizeof(wlan_snap_t)) { payload->TxAUXBuf.DataLen = host2ieee16( 46 ); } } //printk( "File %s Line %d payload->TxAUXBuf.DataLen = %08x\n", __FILE__, __LINE__, payload->TxAUXBuf.DataLen ); /* Set up the 802.11 header */ w_hdr = (p80211_hdr_t*)payload->dot11Head; /* It's a data frame */ fc = host2ieee16(WLAN_SET_FC_FTYPE(WLAN_FTYPE_DATA) | WLAN_SET_FC_FSTYPE(WLAN_FSTYPE_DATAONLY)); switch(Adapter->MacParameter.macmode) { case WLAN_MACMODE_NONE: /* 0 */ case WLAN_MACMODE_IBSS_STA: /* 1 */ a1 = e_hdr->daddr; a2 = Adapter->MacParameter.dot11MacAddress; a3 = Adapter->MacParameter.mBssid; // ? bssidaddr ? break; case WLAN_MACMODE_ESS_STA: /* 2 */ fc |= host2ieee16(WLAN_SET_FC_TODS(1)); a1 = Adapter->MacParameter.mBssid; a2 = Adapter->MacParameter.dot11MacAddress; a3 = e_hdr->daddr; break; case WLAN_MACMODE_ESS_AP: /* 3 */ fc |= host2ieee16(WLAN_SET_FC_FROMDS(1)); a1 = e_hdr->daddr; a2 = Adapter->MacParameter.mBssid; a3 = e_hdr->saddr; break; default: /* fall through */ return 0; break; } memcpy(w_hdr->a3.a1, a1, WLAN_ADDR_LEN); memcpy(w_hdr->a3.a2, a2, WLAN_ADDR_LEN); memcpy(w_hdr->a3.a3, a3, WLAN_ADDR_LEN); // if (wlandev->wep_enabled) // fc |= host2ieee16(WLAN_SET_FC_ISWEP(1)); w_hdr->a3.fc = fc; w_hdr->a3.dur = host2ieee16(0); w_hdr->a3.seq = host2ieee16(0); payload->TxAUXBuf.HeadLen = WLAN_HDR_A3_LEN ; FN_EXIT(0,0); return ( ieee2host16( payload->TxAUXBuf.DataLen ) );}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -