Workaround
To Circumvent ProtocolReceive Faults
Caused By Some Faulty
NDIS Miniport Drivers

 

Knowledge Base ID

KB03080201
Category INFO

Effected Product

NDIS Protocol Drivers/NDIS Intermediate Driver Protocol Edge

Effected Versions

Unknown
Effected Platforms All (Primarily seen on Windows 2000)

 

Symptom

The symptoms observed are various faults associated with the ProtocolReceive handler of NDIS protocol drivers or the lower protocol-edge of NDIS Intermediate (IM) drivers. The symptoms observed by PCAUSA are primarily related to Realtek-based (e.g., SMC) adapters on the Windows 2000 platform. However, there is no reason to believe that this is adapter or platform specific.

This is a frustrating problem because only some adapters exhibit the problem. For example, for the same basic adapter (e.g., SMC) the 10Base-T adapter may work file whereas the Combo driver may exhibit the fault.

 

Cause

The NDIS miniport drivers that exhibit this problem call the ProtocolReceive handler instead of the ProtocolReceivePacket handler. The parameters passed to ProtocolReceive indicate that the the indication is a "partial packet". That is,

LookAheadBufferSize < PacketSize

When this condition exists NDIS protocol drivers usually consume as much of the lookahead data as possible and then call NdisTransferData to fetch the residual data.

The NDIS miniport drivers that exhibit this problem are actually indicating a complete packet and do not have a MiniportTransferData handler, Calling the non-existent MiniportTransferData handler causes the fault.

The DDK says this about MiniportTransferData:

"The MiniportTransferData function is required in NIC drivers that do not indicate multipacket receives and/or media-specific information with NdisMIndicateReceivePacket and in those that do not support WAN media."

This means that NDIS miniport drivers that exhibit this behavior are faulty.

 

Workaround

A workaround to accomodate this problem is to handle the NDIS_MAC_OPTION_TRANSFERS_NOT_PEND attribute of the lower miniport. NDIS MAC options are fetched by making the OID_GEN_MAC_OPTIONS query.

If the NDIS_MAC_OPTION_TRANSFERS_NOT_PENDoption is set, ignore LookAheadBufferSize and assume that a complete packet (PacketSize) is actually present at LookAheadBuffer.

A simple way to implement this check is to check the MAC option early on in the ProtocolReceive handler and set LookAheadBufferSize to be PacketSize if the option is set. Here is an example fragment:

if( pAdapter->MacOptions & NDIS_MAC_OPTION_TRANSFERS_NOT_PEND )
{
    LookaheadBufferSize = PacketSize;
}

 

 

Comments

Please click the following link to send e-mail relating to this PCAUSA Knowledge Base topic:

<Send Mail To KB03080201 Technical Contact>

 

Keywords ProtocolReceive, RealTek, SMC, INFO
Created March 8, 2002
Last Reviewed March 10, 2002

 
 

PCAUSA Home · Privacy Statement · Products · Ordering · Support · Utilities · Resources
Mailing Lists  · PCAUSA Newsletter · PCAUSA Discussion List
 
Rawether for Windows and WinDis 32 are trademarks of Printing Communications Assoc., Inc. (PCAUSA)
Microsoft, MS, Windows, Windows 95, Windows 98, Windows Millennium, Windows 2000, and Win32 are registered trademarks and Visual C++ and Windows NT are trademarks of the Microsoft Corporation.
Send mail to webmaster@pcausa.com with questions or comments about this web site.
Copyright © 1996-2008 Printing Communications Assoc., Inc. (PCAUSA)
Last modified: December 31, 2007