亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? car6krx.cpp

?? WLAN在AR6000程序中的驅(qū)動代碼
?? CPP
字號:
//------------------------------------------------------------------------------
// <copyright file="" company="Atheros and Microsoft">
//    Copyright (c) 2006 Microsoft Corporation.  All rights reserved.
//    Copyright (c) 2006 Atheros Corporation.  All rights reserved.
//
//    The use and distribution terms for this software are covered by the
//    Microsoft Limited Permissive License (Ms-LPL) 
//    http://www.microsoft.com/resources/sharedsource/licensingbasics/limitedpermissivelicense.mspx 
//    which can be found in the file MS-LPL.txt at the root of this distribution.
//    By using this software in any fashion, you are agreeing to be bound by
//    the terms of this license.
//
//    You must not remove this notice, or any other, from this software.
// </copyright>
// 
// <summary>
//    Windows CE Wifi Driver for AR-6000
// </summary>
//------------------------------------------------------------------------------
//==============================================================================
// AR6000 NDIS Miniport received packet handling functions.
//
// Author(s): ="Atheros and Microsoft"
//==============================================================================


#include <windows.h>
#include <ndis.h>


#include "htc_internal.h"
#include "htc.h"
#include "wmi_api.h"
#include "netbuf.h"
#include "ndisnetbuf.h"
#include "athdefs.h"
extern "C" {
#include "bmi.h"
}

#include "cmini.hpp"
#include "c802_3mini.hpp"
#include "c802_11mini.hpp"
#include "car6k.hpp"
#include "osapi.h"


static const CAP_CONST bridgeTunnel = ETHERNET_TUNNEL;
static const CAP_CONST vrfc1042		= RFC1042SNAP;

void
CAR6KMini::ReceiveWMIDataPacket(
	HTC_EVENT_INFO  *evInfo)
//
//  This function processes data from an HTC_BUFFER_RECEIVED indication
//  not on the WMI_CONTROL_MBOX endpoint.
//
{
	ndis_mini_buf_t *pb = (ndis_mini_buf_t *)evInfo->cookie;
	NDIS_STATUS      Status;
	NDIS_PACKET     *pPacket;
	NDIS_BUFFER     *pBuffer;
	PBYTE            pData;
	ULONG            cbData;
	BOOL			 doDix = FALSE;
	USHORT			 etherType;
	SNAP_HEADER		 *pSnapHdr;
	MAC_ADDRESS		 *pDestAddr,*tempAddr;
	BOOL			 mcForUs = FALSE;
		
	
	NDIS_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, "AR6K: +ReceiveWMIDataPacket");

	    
    if (evInfo->status != A_OK) {
		NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: ERROR - ReceiveWMIPacket Error in receiving : status = %x\n", evInfo->status);
		if (A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
			a_netbuf_free(pb);
		}
		goto done;
    }
    
	// evInfo->actualLength is the length of the pb->data including
	//      2 bytes: WMI_DATA_HEADER [optional - only if HTC header is 46 00]
	//     14 bytes: 802.3 MAC header
	//      8 bytes: SNAP header (with EthType as last 2 bytes)
	//      N bytes: payload (e.g. IP packet)
	pData = evInfo->buffer; 
	cbData = evInfo->actualLength;

	// Remove the WMI_DATA_HDR.
	if (cbData < sizeof(WMI_DATA_HDR))
	{
		NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: ERROR - ReceiveWMIPacket missing WMI header (%u bytes)\n", evInfo->actualLength);
		if ( A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
			a_netbuf_free(pb);
		}
		goto done;
    }
	pData += sizeof(WMI_DATA_HDR);
	cbData -= sizeof(WMI_DATA_HDR);

	if (cbData < sizeof(ETHERNET_MAC_HEADER) + sizeof(SNAP_HEADER))
	{
		NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: ERROR - ReceiveWMIPacket missing MAC + SNAP (%u bytes)\n", cbData);
		if ( A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
			a_netbuf_free(pb);
		}
		goto done;
	}

#ifdef WMM
	Lock();
    wmi_implicit_create_pstream((wmi_t *)m_pWMI, pb, DNLINK_TRAFFIC,1);
	Unlock();
#endif //WMM

	
	pDestAddr=(MAC_ADDRESS *)pData;
 	
 	/* Apply NDIS receive filter */
     if (isGrp(pDestAddr)) {
         if (isBcast(pDestAddr)) {
			 if (!(m_CurrentPacketFilter & NDIS_PACKET_TYPE_BROADCAST)) {
                 if ( A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
					a_netbuf_free(pb);
				 }			
				 goto done;
             }
         } else {
			 isMcForUs(pDestAddr,&mcForUs);
			 if (!(m_CurrentPacketFilter & (NDIS_PACKET_TYPE_MULTICAST |
				 NDIS_PACKET_TYPE_ALL_MULTICAST)) || !(mcForUs))
             {
				 if ( A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
					a_netbuf_free(pb);
				 }
				 goto done;
             }
		}
 		
     } else {
		tempAddr=(MAC_ADDRESS *) m_PermanentAddress;
		if ((A_MACADDR_COMP(pDestAddr,tempAddr) != 0) &&
             !(m_CurrentPacketFilter & NDIS_PACKET_TYPE_PROMISCUOUS))
        {
			if ( A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
				a_netbuf_free(pb);
			}
			goto done;
        }
	}

	 // Allocate an NDIS_PACKET from our packet pool.
	NdisAllocatePacket(&Status, &pPacket, m_RxPacketPool);
	if (NDIS_STATUS_SUCCESS != Status)
	{
		NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: ERROR - NdisAllocatePacket failed\n");
		if ( A_OK != HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
			a_netbuf_free(pb);
		}
		goto done;
	}

	// Check for ethernetType in SNAP header for NOVELL_IPX, APPLE_TALK_ARP etc
	// remove 802.3 length and SNAP header if it is not of these types 
	
	pSnapHdr=(SNAP_HEADER *)(pData+sizeof(ETHERNET_MAC_HEADER));
	etherType=A_BE2CPU16(pSnapHdr->Type);
	
	doDix=((A_MEMCMP(pSnapHdr,&bridgeTunnel, sizeof(CAP_CONST))) == 0);
	if((!doDix) && ((A_MEMCMP(pSnapHdr,&vrfc1042, sizeof(CAP_CONST))) == 0))
	{
		doDix = ((etherType != APPLE_TALK_ARP) && (etherType != NOVELL_IPX));
	}
	// Get rid of the 802.3 length and SNAP header by copying
	// the 802.3 DestMACAddr and SrcMACAddr forward so they
	// immediately precede the EthType at the end of the SNAP header.
	// That gives us a DIX packet.

	if (doDix) {
	memmove(pData + sizeof(SNAP_HEADER), pData, ETHERNET_MAC_ADDRESS_LENGTH * 2);
	pData += sizeof(SNAP_HEADER);
	cbData -= sizeof(SNAP_HEADER);
	}


	

	// Setup the fields of NDIS_BUFFER to point to our data.
	pBuffer = &pb->NdisBuffer;
	NdisInitializeBuffer(pBuffer, pData, cbData);

	// Chain the NDIS_BUFFER to the start of the NDIS_PACKET
	NdisChainBufferAtBack(pPacket, pBuffer);
	NDIS_SET_PACKET_HEADER_SIZE(pPacket, sizeof(ETHERNET_MAC_HEADER));
	NDIS_SET_PACKET_STATUS(pPacket, NDIS_STATUS_SUCCESS);

#ifdef NDIS_BUS_DRIVER
	NDIS_PACKET *PacketArray[1];
	PacketArray[0]=pPacket;
	NdisMIndicateReceivePacket(m_MiniportAdapterHandle, PacketArray, 1);
#else
	// Perform the indicate on the timer thread because tying up the
	// SDIO receive indication thread can result in a deadlock.
	PLIST_ENTRY pEntry = (PLIST_ENTRY)(pPacket->MiniportReserved);
	Lock();
	InsertTailList(&m_RxPendingPacketList, pEntry);
	NdisSetEvent(&m_RxPendingEvent);
	Unlock();
#endif	

done:
	NDIS_DEBUG_PRINTF(ATH_LOG_TRC | ATH_LOG_RECV, "AR6K: -ReceiveWMIDataPacket");
}

#define MAX_PACKETS_PER_INDICATE	10

void
CAR6KMini::IndicateReceivePackets()
//
//  This function is called on the worker thread to indicate received
//  packets.
//
{
	NDIS_PACKET *pPacket;
	NDIS_PACKET *PacketArray[MAX_PACKETS_PER_INDICATE];
	ULONG        NumPacketsToIndicate;
	LIST_ENTRY  *pNode;
	boolean      bEventSignalled;

	NdisResetEvent(&m_RxWorkItemExitedEvent);

	while (false == m_Halting)
	{
		// Wait for packets to be placed on the list
		bEventSignalled = NdisWaitEvent(&m_RxPendingEvent, 0);
		if (m_Halting || !bEventSignalled)
			break;

		NumPacketsToIndicate = 0;

		//
		// Get up to MAX_PACKET_PER_INDICATE packets from the RxPending list.
		// Put the packet pointers into an array.
		//
		Lock();
		while (!IsListEmpty(&m_RxPendingPacketList))
		{
			pNode = RemoveHeadList(&m_RxPendingPacketList);
			pPacket = (PNDIS_PACKET)((PBYTE)pNode - offsetof(NDIS_PACKET, MiniportReserved));
			PacketArray[NumPacketsToIndicate++] = pPacket;
			if (NumPacketsToIndicate == MAX_PACKETS_PER_INDICATE) {
				Unlock();
				NdisMIndicateReceivePacket(m_MiniportAdapterHandle, PacketArray, NumPacketsToIndicate);
				Lock();
				NumPacketsToIndicate = 0;
			}
		}
		NdisResetEvent(&m_RxPendingEvent);
		Unlock();

		//
		// Indicate the received packets up to protocol drivers bound to us.
		//
		if (NumPacketsToIndicate)
			NdisMIndicateReceivePacket(m_MiniportAdapterHandle, PacketArray, NumPacketsToIndicate);
	}

	NdisSetEvent(&m_RxWorkItemExitedEvent);
}

void
CAR6KMini::AllocateHTCPacketBuffers(
	HTC_ENDPOINT_ID  eid,
	UINT             numBuffers)
//
//  This function is called to allocate packet buffers and transfer
//  ownership of them to HTC so that HTC can use them to indicate
//  packet data to us via HTC_BUFFER_RECEIVED indications.
//
{
	ndis_mini_buf_t *pb = NULL;

	for (UINT i = 0; i < numBuffers; i++)
	{
		pb = (ndis_mini_buf_t *)a_netbuf_alloc(AR6000_BUFFER_SIZE);
		if (NULL == pb)
		{
			NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: OOM in AllocateHTCPacketBuffers\n");
			break;
		}
		// Pass ownership of the buffer to HTC
		if ( A_OK != HTCBufferReceive(m_pHTCTarget, eid, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb)) {
			a_netbuf_free(pb);
		}
	}
}

void
CAR6KMini::ReturnPacket(
	IN PNDIS_PACKET Packet)
//
//  After the miniport passes packets up to NDIS via
//  NdisMIndicateReceivePackets, NDIS will some time later
//  return those packets (one at a time) to the miniport
//  by calling this ReturnPacket handler.
//
{
	NDIS_BUFFER *pBuffer;
	A_STATUS status = A_OK;

	// Remove the NDIS_BUFFER from the packet (should be exactly 1 buffer)
	NdisUnchainBufferAtFront(Packet, &pBuffer);

	// Return the NDIS_PACKET to our pool
	NdisFreePacket(Packet);

	// Return the pb containing the NDIS_BUFFER to the HTC layer
	// to receive a new packet
	ndis_mini_buf_t *pb = (ndis_mini_buf_t *)((PBYTE)pBuffer - offsetof(ndis_mini_buf_t, NdisBuffer));
	status = HTCBufferReceive(m_pHTCTarget, ENDPOINT2, a_netbuf_to_data(pb), AR6000_BUFFER_SIZE, pb);

	if ( status != A_OK ) {
		//HTC did'nt accept the buffer. Free it.
		a_netbuf_free(pb);
	}
}

/*****************************************************************************
  * isMcForUs - Filter multicast frames that are not wanted
  *
  * Description:
  * If we're not receiving all m/c pkts, filter such a pkt
  * through the NDIS-supplied list.
  * Note: Promiscuous mode is not currently supported
  */
 
 void
 CAR6KMini::isMcForUs(MAC_ADDRESS *pAddr, BOOL *mcForUs)
 {
     UINT i;
 	MAC_ADDRESS	     *tempAddr;
 
	if (m_CurrentPacketFilter & NDIS_PACKET_TYPE_ALL_MULTICAST) {
		*mcForUs = TRUE;
        return;
     }
 	 for (i = 0; i < m_numMulticastAddresses; i++) {
		 tempAddr=(MAC_ADDRESS *) m_MulticastAddresses[i];
		 if ((A_MACADDR_COMP(pAddr, tempAddr) == 0)) {
			 *mcForUs=TRUE;
             return;
         }
 	 }
	 *mcForUs = FALSE; 
     return;
 }

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
天堂久久久久va久久久久| 精品视频在线免费看| 在线观看视频一区二区欧美日韩| 欧美精品一二三四| 国产精品午夜在线| 欧美a一区二区| 欧美日韩在线观看一区二区| 久久精品一区八戒影视| 婷婷夜色潮精品综合在线| jlzzjlzz亚洲女人18| 精品国产一区二区国模嫣然| 亚洲国产精品久久艾草纯爱| 91热门视频在线观看| 国产亚洲欧洲一区高清在线观看| 石原莉奈在线亚洲二区| 94-欧美-setu| 国产精品嫩草影院com| 久久91精品久久久久久秒播| 91精品久久久久久蜜臀| 亚洲已满18点击进入久久| 91丝袜美女网| 亚洲欧美自拍偷拍色图| 成人网男人的天堂| 国产视频不卡一区| 国产成人aaa| 久久精品在线观看| 国产精品一区二区在线观看不卡| 欧美一个色资源| 日韩精品一二区| 欧美猛男超大videosgay| 亚洲亚洲人成综合网络| 欧美三级乱人伦电影| 亚洲电影第三页| 欧美日韩五月天| 视频在线在亚洲| 欧美成人激情免费网| 久久国产生活片100| 久久久一区二区三区| 国产精品99久久久久久宅男| 国产拍欧美日韩视频二区| 不卡av在线网| 亚洲精品成人a在线观看| 在线精品视频一区二区| 亚洲第一av色| 欧美va亚洲va香蕉在线| 激情丁香综合五月| 久久婷婷国产综合国色天香 | 天堂影院一区二区| 欧美日韩亚洲综合在线 欧美亚洲特黄一级| 亚洲最新视频在线播放| 欧美日本在线看| 精品午夜一区二区三区在线观看| 久久影院午夜论| eeuss鲁片一区二区三区在线观看| 中文字幕一区二区视频| 欧美日韩精品综合在线| 久久97超碰色| 亚洲日穴在线视频| 欧美日韩不卡视频| 精彩视频一区二区三区| 国产精品免费免费| 欧美少妇xxx| 国产一区二区三区在线观看免费视频| 中文字幕精品三区| 欧美日韩一级视频| 久久99精品国产麻豆不卡| 国产精品国产三级国产aⅴ中文| 在线亚洲免费视频| 看电视剧不卡顿的网站| 最新热久久免费视频| 宅男在线国产精品| 成人一级片网址| 午夜精品福利一区二区三区蜜桃| 久久网站最新地址| 欧美日韩高清在线| 成人性生交大片免费看视频在线| 亚洲国产aⅴ天堂久久| 中文字幕av一区二区三区免费看| 欧美日韩国产美女| 成人爱爱电影网址| 免费观看成人鲁鲁鲁鲁鲁视频| 国产精品素人视频| 宅男在线国产精品| 一本久久a久久免费精品不卡| 久久国产精品色婷婷| 亚洲国产中文字幕在线视频综合| 国产日韩成人精品| 日韩免费视频线观看| 色噜噜狠狠一区二区三区果冻| 免播放器亚洲一区| 亚洲成人午夜影院| 中文字幕一区二区视频| 久久精品一区二区三区不卡| 91麻豆精品国产91久久久久 | 国产成人精品免费视频网站| 亚洲第四色夜色| 亚洲蜜臀av乱码久久精品| 久久精品日产第一区二区三区高清版| 欧美另类变人与禽xxxxx| 一本高清dvd不卡在线观看| 国产精品一区二区久激情瑜伽| 天天综合日日夜夜精品| 亚洲综合免费观看高清完整版| 国产精品国产三级国产普通话蜜臀| 久久嫩草精品久久久久| 日韩女优av电影| 69堂精品视频| 欧美日韩综合在线| 欧美亚洲愉拍一区二区| 色综合久久久久综合99| av不卡在线观看| 成人av电影观看| 成人免费看的视频| 国产98色在线|日韩| 国产精品亚洲一区二区三区在线| 美女一区二区三区| 蜜臀国产一区二区三区在线播放| 免费人成精品欧美精品| 看电视剧不卡顿的网站| 国产综合久久久久久鬼色 | 91丨porny丨国产| 成人的网站免费观看| 成人福利视频网站| 99精品一区二区三区| 99re热这里只有精品免费视频| 99久久精品费精品国产一区二区| 99r精品视频| 欧美日韩一级视频| 日韩欧美国产高清| 国产三级精品视频| 亚洲视频图片小说| 一区二区三区免费在线观看| 亚洲午夜久久久久久久久电影网| 日韩精品午夜视频| 国产精品456露脸| 色婷婷综合久久久中文一区二区| 欧美日韩美女一区二区| 91精品国产色综合久久不卡电影| 精品日韩一区二区三区| 中文一区二区在线观看| 亚洲精选免费视频| 天天爽夜夜爽夜夜爽精品视频| 久久精品国内一区二区三区| 成人毛片在线观看| 欧美日韩dvd在线观看| 久久综合色一综合色88| 自拍视频在线观看一区二区| 一区二区三区在线播放| 日本网站在线观看一区二区三区| 激情欧美一区二区三区在线观看| 99视频有精品| 欧美理论片在线| 国产亚洲综合在线| 亚洲一区在线观看视频| 久久精品国产99久久6| 99久久免费精品高清特色大片| 欧美午夜影院一区| 久久日韩精品一区二区五区| 一区二区三区在线观看欧美 | 色婷婷久久99综合精品jk白丝| 欧美一区二区高清| 国产精品久久久久久久久搜平片| 日韩国产在线观看| 99精品在线观看视频| 欧美成人午夜电影| 亚洲福利国产精品| 成人免费福利片| 精品国产一区二区三区忘忧草 | 亚洲欧洲av另类| 国产一区二区视频在线| 欧美日韩国产高清一区二区三区| 国产精品网站在线播放| 美女视频黄久久| 欧美日韩免费高清一区色橹橹 | 国产一区不卡视频| 欧美午夜宅男影院| 国产精品国产三级国产普通话三级 | 欧美国产日本视频| 偷拍一区二区三区四区| 99riav久久精品riav| 国产午夜精品一区二区三区视频 | 91在线视频免费91| 欧美一级高清片| 亚洲国产视频a| 91丨porny丨国产| 国产精品久久久久桃色tv| 国产乱子伦一区二区三区国色天香| 欧美日本一区二区三区四区| 17c精品麻豆一区二区免费| 国产乱子轮精品视频| 2024国产精品视频| 七七婷婷婷婷精品国产| 欧美一区中文字幕| 亚洲成人av中文| 欧美人伦禁忌dvd放荡欲情| 亚洲影视在线播放| 欧美性生活久久| 午夜精品福利在线| 91精品国产综合久久久蜜臀图片| 五月天一区二区三区|