如何在协议驱动程序中禁用接收环回数据包?该场景是,我的协议驱动程序从一个适配器接收数据包并将其发送到另一个适配器。(如eth0 -> eth1
)。
只对IPv4感兴趣,
#define NPROT_ETH_TYPE 0x0008 //IPv4
过滤器定义为,
#define NPROTO_PACKET_FILTER ( NDIS_PACKET_TYPE_NO_LOCAL|
NDIS_PACKET_TYPE_DIRECTED/*|
NDIS_PACKET_TYPE_MULTICAST|
NDIS_PACKET_TYPE_BROADCAST*/)
接收端正在检查环回包,如下所示,
// Leave the packet if loopback flag is set.
if( NdisTestNblFlag( pNetBufList, NDIS_NBL_FLAGS_IS_LOOPBACK_PACKET ))
{
//
// Ndisprot is not interested in this NetBufferList, return the
// NetBufferList back to the miniport if the miniport gave us
// ownership of it.
//
break;
}
,当我在路上发送数据包时,SendFlags
被设置为零,以避免按照MSDN进行环回。
NdisSendNetBufferLists(
pOpenContext->BindingHandle,
pNetBufferList,
NDIS_DEFAULT_PORT_NUMBER,
0);
即使在克服了所有这些障碍之后,我的测试程序仍在接收环回数据包,这从wireshark中可以明显看出。
任何想法?
Using NDIS6.0, ndisprot60, Dev: Win7, Test VM: Win2008 R2
如果您设置了NDIS_PACKET_TYPE_NO_LOCAL
并且发送没有NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK
标志的nbl,那么NDIS将不会向您发送环回数据包。
Wireshark没有显示您的协议接收到的。每个协议都可以接收一组自定义流量。所以Wireshark只显示Wireshark接收到的内容:)