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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? car6ktx.cpp

?? WLAN在AR6000程序中的驅動代碼
?? CPP
字號:
//------------------------------------------------------------------------------
// <copyright file="car6ktx.cpp" 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 driver packet transmit 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"
extern "C" {
#include "bmi.h"
}

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

NDIS_STATUS
CAR6KMini::TransmitBufferBuild(
	OUT AR6K_TRANSMIT_BUFFER *pTxBuffer,
	IN  NDIS_PACKET          *pNdisPacket) 
//
//  This function is called to convert the data in an NDIS_PACKET
//  into a contiguous block of data in the format required by the
//  AR6K Wireless Module.
//
//  The format of a packet sent to the Wireless Module looks like:
//		WMI_DATA_HDR:
//			UINT8	  reserved (always 0)
//			UINT8     msgType = 0 (data)
//      802_3_HDR:
//			UINT8[6]  dstMac
//          UINT8[6]  srcMac
//          UINT8[2]  length
//      SNAP_HDR:
//          UINT8     DSAP = 0xAA
//          UINT8     SSAP = 0xAA
//          UINT8     CNTL = 0x03
//          UINT8[3]  CODE = {0x00 0x00 0x00)
//          UINT8[2]  EthType (e.g. 0x08 00 for IP packet)
//      PAYLOAD:
//          UINT8[length] packet payload that follows 802_3 header (e.g. IP packet)
{
	NDIS_STATUS		Status = NDIS_STATUS_INVALID_DATA;
	PNDIS_BUFFER    pNdisBuffer;
	PBYTE           pBufferData;
	ULONG           cbBufferData;
	USHORT          EthLength;
	PBYTE           pTxData;
	ULONG           cbTxDataSpaceRemaining;
	boolean         bIsDIX = false;

	NdisQueryPacketFirstBuffer(pNdisPacket, &pNdisBuffer);
	if (NULL == pNdisBuffer)
		goto done;

	// The first buffer should contain the 802.3 MAC header
	NdisQueryBuffer(pNdisBuffer, &pBufferData, &cbBufferData);
	if (cbBufferData < sizeof(ETHERNET_MAC_HEADER))
		goto done;

	pTxBuffer->pNdisPacket = pNdisPacket;
	WMI_DATA_HDR_SET_MSG_TYPE( &(pTxBuffer->WMIDataHeader), DATA_MSGTYPE);

	// Copy the source and destination MAC addresses
	memcpy(&pTxBuffer->MACHeader.DestMACAddress[0], pBufferData, ETHERNET_MAC_ADDRESS_LENGTH * 2);
	pBufferData += ETHERNET_MAC_ADDRESS_LENGTH * 2;
	cbBufferData -= ETHERNET_MAC_ADDRESS_LENGTH * 2;

	// Check the 2 bytes after the dest and source MAC addresses to see if
	// they are a length (802.3 format packet) or a type (DIX format)
	EthLength = (pBufferData[0] << 8) | pBufferData[1];
	if (EthLength <= 0x0600)
	{
		// Length field is the length in bytes,
		// Packet is already in 802.3 format
		pTxData = (PBYTE)&pTxBuffer->MACHeader.Length;

	}
	else
	{
		// Packet is in DIX format, we will need to insert length field and SNAP header
		// to convert it into the 802.3 format that the AR6K requires.
		bIsDIX = true;

		pTxBuffer->SNAPHeader.dsap = 0xAA;
		pTxBuffer->SNAPHeader.ssap = 0xAA;
		pTxBuffer->SNAPHeader.cntl = 0x03;
		pTxBuffer->SNAPHeader.orgCode[0] = 0;
		pTxBuffer->SNAPHeader.orgCode[1] = 0;
		pTxBuffer->SNAPHeader.orgCode[2] = 0;

		pTxData = (PBYTE)&pTxBuffer->SNAPHeader.Type;
	}

	cbTxDataSpaceRemaining = (&pTxBuffer->PayloadData[0] - pTxData) + m_MaxTransmitBufferPayloadDataLength;

	// Copy remaining data from first buffer, and data from
	// all remaining buffers in the NDIS_PaCKET, into the
	// contiguous WMI_DATA output buffer

	while (TRUE)
	{
		if (cbBufferData > cbTxDataSpaceRemaining)
		{
			Status = NDIS_STATUS_BUFFER_TOO_SHORT;
			break;
		}
		NdisMoveMemory(pTxData, pBufferData, cbBufferData);
		pTxData += cbBufferData;
		cbTxDataSpaceRemaining -= cbBufferData;

		NdisGetNextBuffer(pNdisBuffer, &pNdisBuffer);

		if (pNdisBuffer == NULL)
		{
			// Copied all the buffers. Fill in the Ethernet length field if needed
			if (bIsDIX)
			{
				// For an 802.3 packet, the EthLength field is the number of bytes in the Data payload field
				EthLength = pTxData - (PBYTE)&pTxBuffer->SNAPHeader;
				pTxBuffer->MACHeader.Length = A_CPU2BE16(EthLength);
			}
			pTxBuffer->cbWMIData = pTxData - (PBYTE)&pTxBuffer->WMIDataHeader;
			Status = NDIS_STATUS_SUCCESS;
			break;
		}

		NdisQueryBuffer(pNdisBuffer, &pBufferData, &cbBufferData);
	}

done:
	return Status;
}


NDIS_STATUS
CAR6KMini::TransmitBufferListAllocate()
//
//  Allocate m_MaxTransmitBuffers and put them on the m_TransmitBufferList
//
{
	NDIS_STATUS            Status = NDIS_STATUS_SUCCESS;
	PAR6K_TRANSMIT_BUFFER  pTransmitBuffer;
	ULONG                  cbTransmitBuffer = offsetof(AR6K_TRANSMIT_BUFFER, PayloadData) + m_MaxTransmitBufferPayloadDataLength;

	// ULONG align the size of a transmit buffer
	cbTransmitBuffer = (cbTransmitBuffer + 3) & ~3;

	// Allocate the block of storage to hold all the transmit buffers
	m_cbTransmitBufferArray = cbTransmitBuffer * m_MaxTransmitBuffers;
	m_pTransmitBufferArray = (PAR6K_TRANSMIT_BUFFER)A_MALLOC(m_cbTransmitBufferArray);
	if (m_pTransmitBufferArray == NULL)
		goto done;

	// Put all the transmit buffers on the free list
	pTransmitBuffer = &m_pTransmitBufferArray[0];
	for (ULONG iBuffer = 0; iBuffer < m_MaxTransmitBuffers; iBuffer++)
	{
		pTransmitBuffer->pNdisPacket = NULL;
		pTransmitBuffer->cbWMIData = 0;
		InsertTailList(&m_TransmitBufferList, &pTransmitBuffer->node);
		pTransmitBuffer = (PAR6K_TRANSMIT_BUFFER)((PBYTE)pTransmitBuffer + cbTransmitBuffer);
	}

done:
	return Status;
}

PAR6K_TRANSMIT_BUFFER 
CAR6KMini::TransmitBufferListRemoveHead()
//
//  This function is called to get the first available transmit buffer
//  from the free list. If none are available, then NULL will be returned.
//
{
	PAR6K_TRANSMIT_BUFFER pBuffer = NULL;

    Lock();

	if (!IsListEmpty(&m_TransmitBufferList))
		pBuffer = (PAR6K_TRANSMIT_BUFFER)RemoveHeadList(&m_TransmitBufferList);

	Unlock();

	return pBuffer;
}

void 
CAR6KMini::TransmitBufferListInsertHead(
	PAR6K_TRANSMIT_BUFFER pBuffer)
//
//  This function is called to return a transmit buffer to the free list.
//
{
	Lock();
	pBuffer->pNdisPacket = NULL;
	InsertHeadList(&m_TransmitBufferList, &pBuffer->node);
	Unlock();
}

PNDIS_PACKET 
CAR6KMini::TransmitNdisPacketListRemoveHead()
//
//  Get the first packet from the list of pending send packets.
//
{
	PNDIS_PACKET pPacket = NULL;
	PLIST_ENTRY pNode;

    Lock();
	if (!IsListEmpty(&m_TransmitNdisPacketList))
	{
		pNode = RemoveHeadList(&m_TransmitNdisPacketList);
		pPacket = (PNDIS_PACKET)((PBYTE)pNode - offsetof(NDIS_PACKET, MiniportReservedEx));
	}
	Unlock();

	return pPacket;
}

void 
CAR6KMini::TransmitNdisPacketListInsertTail(
	PNDIS_PACKET pPacket)
//
//  This function is called to add a packet to the list of packets
//  waiting for transmit buffers to become available so they can be sent.
//
{
	PLIST_ENTRY pNode = (PLIST_ENTRY)pPacket->MiniportReservedEx;

	Lock();
	InsertHeadList(&m_TransmitNdisPacketList, pNode);
	Unlock();
}

void
CAR6KMini::SendNdisPacket(
	PNDIS_PACKET          pPacket,
	PAR6K_TRANSMIT_BUFFER pTxBuffer)
//
//  Send the specified NDIS_PACKET using the provided buffer.
//
{
	NDIS_STATUS Status;
	A_STATUS    htcStatus;
#ifdef WMM
	HTC_ENDPOINT_ID endPointId;
	ndis_mini_buf_t osbuf;
	A_UINT8 *pData = NULL;
	IEEE8021PPRIORITY ndisUserPriority;
#endif

	Status = TransmitBufferBuild(pTxBuffer, pPacket);
	if (NDIS_STATUS_SUCCESS == Status)
	{

#ifdef WMM
		
	/* wmi APIs work with buf structures. So create a dummy buf here to pass to wmi.
	 * The data pointer in the buf is hacked to point to the WMIDataHeader.
	 */
	ndisUserPriority=(IEEE8021PPRIORITY)NDIS_PER_PACKET_INFO_FROM_PACKET(pPacket,Ieee8021pPriority);
	memset(&osbuf, 0, sizeof(ndis_mini_buf_t));

	osbuf.buf_dat = (PBYTE)&pTxBuffer->WMIDataHeader;
	
	Lock();
    endPointId = wmi_get_endpoint((wmi_t *)m_pWMI,
                          wmi_implicit_create_pstream((wmi_t *)m_pWMI, &osbuf, UPLINK_TRAFFIC, (A_UINT32)ndisUserPriority));
	Unlock();

#endif

		// Send the data to the device
#ifdef WMM
		htcStatus = HTCBufferSend(m_pHTCTarget, endPointId, (PBYTE)&pTxBuffer->WMIDataHeader, pTxBuffer->cbWMIData, pTxBuffer);
#else
		htcStatus = HTCBufferSend(m_pHTCTarget, ENDPOINT2, (PBYTE)&pTxBuffer->WMIDataHeader, pTxBuffer->cbWMIData, pTxBuffer);
#endif
		if (A_PENDING == htcStatus)
			Status = NDIS_STATUS_PENDING;
		else if (A_OK == htcStatus)
			Status = NDIS_STATUS_PENDING; // HTCBufferSend seems to return A_OK even when the send pends
		else
			Status = NDIS_STATUS_FAILURE;
	}

	if (NDIS_STATUS_PENDING != Status)
	{
		// If the packet isn't queued, complete it immediately
		NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: NDIS - SEND Complete %x FAILURE=%x\n", pPacket, Status);
		NdisMSendComplete(m_MiniportAdapterHandle, pPacket, Status);
		TransmitBufferListInsertHead(pTxBuffer);
	}
}

void
CAR6KMini::HTCDataSendCompleted(
	PVOID cookie)
//
//  This function is called when an HTCBufferSend request completes on
//  the an endpoint used for data packets. It completes the send and
//  returns the transmit buffer back to the free list.
//
{
	PAR6K_TRANSMIT_BUFFER pTxBuffer = (PAR6K_TRANSMIT_BUFFER)cookie;
	PNDIS_PACKET          pNdisPacket = pTxBuffer->pNdisPacket;

	NDIS_DEBUG_PRINTF(ATH_LOG_SEND, "AR6K: NDIS - SEND Complete %x\n", pNdisPacket);
	NdisMSendComplete(m_MiniportAdapterHandle, pNdisPacket, NDIS_STATUS_SUCCESS);

	pNdisPacket = TransmitNdisPacketListRemoveHead();
	if (pNdisPacket)
	{
		// pending list is not empty, use the buffer to send the first queued packet
		SendNdisPacket(pNdisPacket, pTxBuffer);
	}
	else
	{
		// nothing pending to transmit, just add the buffer to the free list
		TransmitBufferListInsertHead(pTxBuffer);
	}
}

void
CAR6KMini::SendPackets(
	IN PPNDIS_PACKET PacketArray,
	IN UINT          NumberOfPackets)
//
//  This function is called by NDIS to send packets through
//  the adapter to the network.
//
{
	UINT                  i;
	PAR6K_TRANSMIT_BUFFER pTxBuffer;
	PNDIS_PACKET          pNdisPacket;

    if (!m_Connected) {
		NDIS_DEBUG_PRINTF(ATH_LOG_ERR, "AR6K: NDIS - SEND Packet failed - Not connected to the network \n");
	    for (i = 0; i < NumberOfPackets; i++)
	    {
		    pNdisPacket = PacketArray[i];
	        NdisMSendComplete(m_MiniportAdapterHandle, pNdisPacket, NDIS_STATUS_FAILURE);
        }
        return;
    }

	for (i = 0; i < NumberOfPackets; i++)
	{
		pNdisPacket = PacketArray[i];
		NDIS_DEBUG_PRINTF(ATH_LOG_SEND, "AR6K: NDIS - SEND Packet %x\n", pNdisPacket);

		pTxBuffer = TransmitBufferListRemoveHead();
		if (pTxBuffer == NULL)
		{
			// Out of transmit buffers, we will have to queue
			// up the remaining packets to be transmitted when
			// buffers become available.
			break;
		}

		SendNdisPacket(pNdisPacket, pTxBuffer);
	}

	// Add to the queue all the packets that were not transmitted in the
	// above loop because all the transmit buffers were in use.
	for (; i < NumberOfPackets; i++)
	{
		pNdisPacket = PacketArray[i];
		TransmitNdisPacketListInsertTail(pNdisPacket);
	}
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色国产综合视频| 久久久久久亚洲综合影院红桃 | 精品成人一区二区| 国产精品久久久久四虎| 日本美女一区二区三区| 99精品欧美一区二区蜜桃免费| 91精品国产综合久久精品| 国产精品无码永久免费888| 奇米影视在线99精品| 91啪九色porn原创视频在线观看| 精品久久久久99| 日日摸夜夜添夜夜添国产精品| 不卡av在线免费观看| 精品国产电影一区二区| 日韩精品亚洲专区| 91官网在线免费观看| 亚洲人成在线观看一区二区| 黑人精品欧美一区二区蜜桃| 欧美一区二区精品在线| 亚洲与欧洲av电影| 色综合天天性综合| 国产精品美女一区二区三区| 国产电影一区在线| 一区二区三区免费网站| 高清在线不卡av| 久久久亚洲午夜电影| 国产一区二区在线观看免费| 欧美一级黄色大片| 日韩高清在线不卡| 欧美一级国产精品| 久久黄色级2电影| 精品久久久久久久久久久久久久久| 奇米888四色在线精品| 欧美电影在哪看比较好| 日韩成人精品在线观看| 欧美一区二区成人| 久久精品国产第一区二区三区| 欧美一个色资源| 韩国一区二区视频| 日本一区二区免费在线| voyeur盗摄精品| 一区二区三区中文在线观看| 欧美午夜精品久久久久久超碰| 夜夜嗨av一区二区三区中文字幕 | 亚洲欧洲综合另类| 色成年激情久久综合| 亚洲国产视频直播| 日韩欧美国产午夜精品| 国产剧情av麻豆香蕉精品| 国产亚洲人成网站| 91在线高清观看| 亚洲国产另类av| 26uuu亚洲综合色| 成人app网站| 亚洲国产一区二区三区| 精品av久久707| 91视频com| 日本在线不卡视频| 国产精品久久久久久久久快鸭| 色综合激情五月| 激情久久五月天| 亚洲另类一区二区| 日韩美女在线视频| 波多野结衣在线aⅴ中文字幕不卡| 亚洲黄色免费网站| 精品乱码亚洲一区二区不卡| 99精品桃花视频在线观看| 午夜精品久久久久影视| 久久精品视频在线免费观看| 在线观看av一区二区| 久久99精品久久久久久久久久久久| 国产精品久久久久久久久晋中 | 99久久婷婷国产| 日本中文在线一区| 国产精品久久777777| 91精品国产综合久久久蜜臀图片| 大白屁股一区二区视频| 日日欢夜夜爽一区| 亚洲欧美一区二区在线观看| 欧美成人video| 精品视频一区二区不卡| 丁香啪啪综合成人亚洲小说 | 亚洲欧美在线视频观看| 91精品福利在线一区二区三区 | 国产精品乱码一区二三区小蝌蚪| 欧美午夜视频网站| 国产成人综合视频| 日韩av一级电影| 亚洲国产wwwccc36天堂| 国产精品国产成人国产三级| 亚洲精品一区二区三区精华液| 欧美亚洲图片小说| 99精品国产热久久91蜜凸| 国产在线精品一区二区| 日韩国产欧美三级| 亚洲国产成人高清精品| 亚洲丝袜自拍清纯另类| 久久精品一二三| 久久日一线二线三线suv| 欧美一区午夜精品| 538在线一区二区精品国产| 在线一区二区三区四区| 99re这里都是精品| 成人av网站大全| 国产宾馆实践打屁股91| 国产精品综合二区| 国产在线视频一区二区| 精品一二三四在线| 精品在线播放免费| 另类小说色综合网站| 青青草97国产精品免费观看无弹窗版| 亚洲一区二区三区视频在线 | 欧美三级在线播放| 欧美亚洲国产一区二区三区| 色狠狠综合天天综合综合| 99在线精品观看| 色婷婷综合久久| 欧美日韩一区二区三区在线| 欧美丝袜丝交足nylons图片| 色激情天天射综合网| 欧美少妇xxx| 欧美日韩国产三级| 91精品国产福利| 欧美电视剧免费全集观看| 亚洲精品在线三区| 国产日本亚洲高清| 日韩理论电影院| 亚洲一区二区三区在线| 日韩av成人高清| 国产老女人精品毛片久久| 懂色中文一区二区在线播放| 成人毛片在线观看| 欧洲视频一区二区| 欧美一区三区二区| 国产调教视频一区| 一个色在线综合| 九色综合国产一区二区三区| 国产精品456露脸| 一本大道av一区二区在线播放| 欧美日韩情趣电影| 精品国产污网站| 成人免费在线观看入口| 亚洲国产人成综合网站| 国产麻豆成人精品| 在线亚洲+欧美+日本专区| 欧美tickling挠脚心丨vk| 国产精品美女一区二区在线观看| 亚洲愉拍自拍另类高清精品| 久久97超碰色| 99久久99久久久精品齐齐| 国产欧美一区二区精品久导航 | 91久久一区二区| 欧美变态tickling挠脚心| 国产精品久久久久影院色老大 | 欧美精品tushy高清| 国产日韩三级在线| 丝袜国产日韩另类美女| 国产馆精品极品| 欧美日韩精品一区二区天天拍小说| 欧美大片国产精品| 亚洲免费观看高清完整版在线观看熊| 三级影片在线观看欧美日韩一区二区| 国产乱对白刺激视频不卡| 在线这里只有精品| 中文字幕乱码一区二区免费| 视频一区国产视频| 99精品1区2区| 久久精品一区二区三区不卡| 日韩精品欧美精品| 97se亚洲国产综合自在线 | 精品中文字幕一区二区小辣椒 | 欧美狂野另类xxxxoooo| 国产精品污www在线观看| 日本不卡一区二区| 欧美性色aⅴ视频一区日韩精品| 亚洲精品一区二区三区精华液| 一区二区三区精品| 成人免费视频caoporn| 日韩久久精品一区| 亚洲va天堂va国产va久| 91麻豆精东视频| 捆绑变态av一区二区三区| 欧美特级限制片免费在线观看| 中文字幕一区二区三区精华液| 狠狠色丁香久久婷婷综| 67194成人在线观看| 一区二区三区美女| 91在线porny国产在线看| 日韩一区欧美一区| 国产精品一区免费在线观看| 日韩欧美一二三区| 美女一区二区三区| 精品久久久久久无| 麻豆91免费观看| 精品国产乱码久久久久久浪潮| 青青草97国产精品免费观看无弹窗版| 欧美日韩国产一区二区三区地区| 亚洲高清久久久| 欧美日韩激情在线| 婷婷综合在线观看|