laotiu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:2569回复:4

关于NdisDeviceStateD0,各位帮忙看看代码

楼主#
更多 发布于:2004-09-22 11:45



/*
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.
可能是这里不理解吧,我刚开始看驱动不久







QQ:50528814,技术交流
laotiu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-09-22 12:44
刚才看了看原来>D0表示网卡处于休眠 状态
pAdapt->ProtocolDeviceState
pAdapt->MiniportDeviceState
分别表示什么?
QQ:50528814,技术交流
WY.lslrt
驱动牛犊
驱动牛犊
  • 注册日期2004-07-30
  • 最后登录2009-10-27
  • 粉丝0
  • 关注0
  • 积分116分
  • 威望15点
  • 贡献值0点
  • 好评度10点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-09-22 13:18
那是Miniport,Protocol的设备状态
NdisDeviceStateD0表示电源管理已准备就绪并且已激活
---传说中的分割线--------
laotiu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-09-22 14:17
Miniport,Protocol的设备状态?什么设备?这里的设备不就是网卡吗,上面是中间驱动和协议驱动.能解释清楚点吗?谢谢支持
QQ:50528814,技术交流
laotiu
驱动牛犊
驱动牛犊
  • 注册日期2003-05-26
  • 最后登录2005-04-01
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-09-22 14:26
是不是pAdapt->MiniportDeviceState表示虚拟设备的电源状态
pAdapt->ProtocolDeviceState表示下层设备的电源状态?
如果是的话那MiniportDeviceState>D0说明虚拟设备现在不工作
ProtocolDeviceState>D0说明不能向下发送,或从下面接受.
这样理解是否正确?
QQ:50528814,技术交流
游客

返回顶部