阅读:2569回复:4
关于NdisDeviceStateD0,各位帮忙看看代码/* MPSendPackets transfers some number of packets specified as Array of packet Pointers , over the Network */ VOID MPSendPackets ( IN NDIS_HANDLE MiniportAdapterContext, IN PPNDIS_PACKET PacketArray, IN UINT NumberOfPackets ) { PADAPT pAdapt = (PADAPT)MiniportAdapterContext; NDIS_STATUS Status; UINT i; PVOID MediaSpecificInfo = NULL; UINT MediaSpecificInfoSize = 0; DBGPRINT("===========>MPSendPackets"); for(i=0;i<NumberOfPackets;i++)//遍历所有的包 { PNDIS_PACKET Packet; PNDIS_PACKET MyPacket; BOOLEAN bDecision; PNDIS_BUFFER pNewNdisBfr; ULONG OrigPayloadl; ULONG NewPayloadl; PUCHAR pNewPayload = NULL; #define szPayloadCopy ETH_MAX_PACKET_SIZE char PayloadCopy[szPayloadCopy]; // // Copying a Single packet from the packet Array // Packet = PacketArray;//遍历所有的包 GetPktPayload( Packet, PayloadCopy, szPayloadCopy, &OrigPayloadl);//包的实际大小 //---------------------------------------- NdisAcquireSpinLock(&pAdapt->Lock); // // See if packet to be dropped. // Status = FilterPacket( pAdapt, Packet, NULL, TRUE, &bDecision//用于判断策略 ); if ( NDIS_STATUS_SUCCESS == Status && TRUE != bDecision ) { NdisReleaseSpinLock(&pAdapt->Lock); goto Done;// bDecision ==False,越过,直接发送,否则下面是ipsec处理,也就是说对201实行ipsec处理 } NdisReleaseSpinLock(&pAdapt->Lock); //------------------------------------------ ......省略ipsec处理 //------------------------------------------------- Done: // // The driver should fail the send if the virtual miniport is in low // power state // if (pAdapt->MiniportDeviceState > NdisDeviceStateD0)//Since D0 is the fully powered state, { NdisMSendComplete( ADAPT_MINIPORT_HANDLE(pAdapt), Packet, NDIS_STATUS_FAILURE);// if (NULL != pNewPayload) { // // Recycle memory. // NdisFreeMemory(pNewPayload, NewPayloadl, 0 ); pNewPayload = NULL; } continue;//下一个包 } do { NdisAcquireSpinLock(&pAdapt->Lock); // // If the below miniport is going to low power state, // stop sending down any packet. // if (pAdapt->ProtocolDeviceState > NdisDeviceStateD0) { NdisReleaseSpinLock(&pAdapt->Lock); if (NULL != pNewPayload) { NdisFreeMemory( pNewPayload, NewPayloadl, 0 ); pNewPayload = NULL; } Status = NDIS_STATUS_FAILURE; break; } pAdapt->OutstandingSends++; NdisReleaseSpinLock(&pAdapt->Lock); NdisAllocatePacket( &Status, &MyPacket, pAdapt->SendPacketPoolHandle ); if (Status == NDIS_STATUS_SUCCESS) { PSEND_RSVD SendRsvd; // // NIC drivers and intermediate drivers allocate // packet descriptors with, at least, 16 bytes of // ProtocolReserved space to be used by protocols // for receive indications. // SendRsvd = (PSEND_RSVD)(MyPacket->ProtocolReserved); SendRsvd->OriginalPkt = Packet; // // Found desired packet // if (NULL != pNewPayload) { // // Build new buffer descriptor. // NdisAllocateBuffer( &Status, &pNewNdisBfr, pAdapt->hSendBufferPool, pNewPayload, NewPayloadl ); if (NDIS_STATUS_SUCCESS != Status) { break; } // // Show new NDIS_BUFFER used. // SendRsvd->bNewBuffer = TRUE; // // Links a given buffer descriptor to the head of // the buffer-descriptor chain attached to a packet // descriptor. // NdisChainBufferAtFront( MyPacket, pNewNdisBfr ); } else { SendRsvd->bNewBuffer = FALSE; // Original used. MyPacket->Private.Head = Packet->Private.Head; MyPacket->Private.Tail = Packet->Private.Tail; } MyPacket->Private.Flags = NdisGetPacketFlags(Packet); // // Copy OOB Data to the New Packet // NdisMoveMemory ( NDIS_OOB_DATA_FROM_PACKET(MyPacket), NDIS_OOB_DATA_FROM_PACKET(Packet), sizeof(NDIS_PACKET_OOB_DATA) ); // // Copy Media Specific Information // NDIS_GET_PACKET_MEDIA_SPECIFIC_INFO ( Packet, &MediaSpecificInfo, &MediaSpecificInfoSize ); if( MediaSpecificInfo || MediaSpecificInfoSize) { NDIS_SET_PACKET_MEDIA_SPECIFIC_INFO ( MyPacket, MediaSpecificInfo, MediaSpecificInfoSize ); } // // Send the packets to Miniport // NdisSend( &Status, pAdapt->BindingHandle, MyPacket ); if( Status != NDIS_STATUS_PENDING) { if (NULL != pNewPayload) { NdisFreeBuffer(pNewNdisBfr); NdisFreeMemory( pNewPayload, NewPayloadl, 0 ); pNewPayload = NULL; } NdisFreePacket(MyPacket); ADAPT_DECR_PENDING_SENDS(pAdapt); } } else { // // The driver cannot allocate a packet. // ADAPT_DECR_PENDING_SENDS(pAdapt); if (NULL != pNewPayload) { NdisFreeMemory( pNewPayload, NewPayloadl, 0 ); pNewPayload = NULL; } } }while (FALSE); if( Status != NDIS_STATUS_PENDING) { NdisMSendComplete(pAdapt->MiniportHandle, Packet, Status); } } } --------------------------------------问题--------------------------------------------- 这段代码: Done: // // The driver should fail the send if the virtual miniport is in low // power state // if (pAdapt->MiniportDeviceState > NdisDeviceStateD0)//Since D0 is the fully powered state, { NdisMSendComplete( ADAPT_MINIPORT_HANDLE(pAdapt), Packet, NDIS_STATUS_FAILURE);// if (NULL != pNewPayload) { // // Recycle memory. // NdisFreeMemory(pNewPayload, NewPayloadl, 0 ); pNewPayload = NULL; } continue;// } 中的 pAdapt->MiniportDeviceState > NdisDeviceStateD0这句在这里是什么意思?在passthru里面用的是 if (IsIMDeviceStateOn(pAdapt) == FALSE) { Status = NDIS_STATUS_FAILURE; break; } 这个宏里面是两个状态都==D0然后就发送,上面这段对电源的状态使用不明白,各位帮忙分析分析吧 还有 if (pAdapt->ProtocolDeviceState > NdisDeviceStateD0) {也返回失败 我看了ddk中的 NdisDeviceStateUnspecified The NIC does not support pattern-match wake-ups. NdisDeviceStateD0 The NIC can signal a pattern-match wake-up from device power state D0. Since D0 is the fully powered state, this does not cause a wake-up but can be used as a runtime event. NdisDeviceStateD1 The NIC can signal a pattern-match wake-up from device power states D1 and D0. NdisDeviceStateD2 The NIC can signal a pattern-match wake-up from device power states D2, D1, and D0. NdisDeviceStateD3 The NIC can signal a pattern-match wake-up from device power states D3, D2, D1, and D0. 可能是这里不理解吧,我刚开始看驱动不久 |
|
|
沙发#
发布于:2004-09-22 12:44
刚才看了看原来>D0表示网卡处于休眠 状态
pAdapt->ProtocolDeviceState pAdapt->MiniportDeviceState 分别表示什么? |
|
|
板凳#
发布于:2004-09-22 13:18
那是Miniport,Protocol的设备状态
NdisDeviceStateD0表示电源管理已准备就绪并且已激活 |
|
|
地板#
发布于:2004-09-22 14:17
Miniport,Protocol的设备状态?什么设备?这里的设备不就是网卡吗,上面是中间驱动和协议驱动.能解释清楚点吗?谢谢支持
|
|
|
地下室#
发布于:2004-09-22 14:26
是不是pAdapt->MiniportDeviceState表示虚拟设备的电源状态
pAdapt->ProtocolDeviceState表示下层设备的电源状态? 如果是的话那MiniportDeviceState>D0说明虚拟设备现在不工作 ProtocolDeviceState>D0说明不能向下发送,或从下面接受. 这样理解是否正确? |
|
|