⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wt_conv.c

📁 mini-PCI driver for LHWT chipsets
💻 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 + -