All,
I found one problem in the NdisMCoIndicateReceiveNetBufferLists()
API call.
According to the driver's document , if CoReceiveFlags is specified
with "NDIS_RECEIVE_FLAGS_RESOURCES ", driver can calim the owership of the
buffer. However, I found this API not working. What I did is to
initialize the value of "SourceHandle" to 0x55aa before indicating the
packet up. However, in the the ":MiniportReturnNetBufferLists "
function, this packet was returned from the protocol layer. Does anybody
know what it is going on with problem?
---------------------------WinDbg debugging
output -----------------------------------------
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x836f54e8 SourceHandle=0x55aa
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x83bd71d8 SourceHandle=0x55aa
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x836231d8 SourceHandle=0x55aa
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x83716418 SourceHandle=0x55aa
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x836f54e8 SourceHandle=0x55aa
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x836381d8 SourceHandle=0x55aa
0:VPNDRV:WARNING:CardIndicateReceivedPacket NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=1
1:VPNDRV:WARNING:MiniportReturnNetBufferLists Not our
NetBufferLists=0x83716418 SourceHandle=0x55aa
-------------------My function to indicate the packet
up ------------------------------------------------
if (pLink->ReceivedNBLChain)
{
ULONG ReceiveFlags=0;
DBG_NOTICE(pAdapter, ("NumberOfPackets
=%d\n",pLink->NumberOfPackets));
if (pAdapter->pCard->RCBCount==RCB_THRESHOLD)
{
NDIS_SET_RECEIVE_FLAG(ReceiveFlags,
NDIS_RECEIVE_FLAGS_RESOURCES);
//-------------------I put a hard code value 0x55aa to "
CurrentNetBufferList->SourceHandle" before indicating the packet
up.---------------------------
#if DBG
{
PNET_BUFFER_LIST CurrentNetBufferList;
UINT i;
CurrentNetBufferList = pLink->ReceivedNBLChain;
for (i=0; i<pLink->NumberOfPackets; i++)
{
CurrentNetBufferList->SourceHandle=0x55aa;
CurrentNetBufferList =
NET_BUFFER_LIST_NEXT_NBL(CurrentNetBufferList);
}
}
#endif
}
else
pAdapter->TotalIndicatedNetBufferList +=pLink->NumberOfPackets;
NET_BUFFER_LIST_NEXT_NBL(pLink->LastReceivedNBL) = NULL;
NdisMCoIndicateReceiveNetBufferLists(
pLink->NdisVcHandle,
pLink->ReceivedNBLChain,
pLink->NumberOfPackets,
ReceiveFlags
);
//
// Packets that were indicated with NDIS_STATUS_RESOURCES
// need to be returned to Hw11 immediately.
//
if ((ReceiveFlags&NDIS_RECEIVE_FLAGS_RESOURCES)) // Implies
LowResourceNBLChain != NULL
{
PNET_BUFFER_LIST CurrentNetBufferList;
UINT i;
PRCB pRCB;
DBG_WARNING(DbgInfo,("NDIS_RECEIVE_FLAGS_RESOURCES
NumberOfPackets=%d\n",pLink->NumberOfPackets));
CurrentNetBufferList = pLink->ReceivedNBLChain;
// DBG_WARNING(pAdapter,
("RCBCount=%d\n",pAdapter->pCard->RCBCount));
for (i=0; i<pLink->NumberOfPackets; i++)
{
pRCB = GET_RCB_FROM_NBL(CurrentNetBufferList);
ASSERT(pRCB);
CardQueueRCB(pAdapter->pCard,pRCB, FALSE);
CurrentNetBufferList =
NET_BUFFER_LIST_NEXT_NBL(CurrentNetBufferList);
}
// Make sure we walked the entire list.
ASSERT(CurrentNetBufferList == NULL);
// DBG_WARNING(pAdapter,
("RCBCount=%d\n",pAdapter->pCard->RCBCount));
}
//reset the following values
pLink->ReceivedNBLChain=NULL;
pLink->LastReceivedNBL=NULL;
pLink->NumberOfPackets=0;
}