0

如何在协议驱动程序中禁用接收环回数据包?场景是,我的协议驱动程序正在从一个适配器接收数据包并将其发送到另一个适配器。(如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 中可以看出。

任何想法?

使用NDIS6.0,ndisprot60,开发:Win7,测试VM:Win2008 R2

4

1 回答 1

0

如果您设置NDIS_PACKET_TYPE_NO_LOCAL和发送不带NDIS_SEND_FLAGS_CHECK_FOR_LOOPBACK标志的 NBL,则 NDIS 不会向您发送环回数据包。

Wireshark 没有向您展示您的协议接收到的内容。每个协议都可以接收一组自定义流量。所以 Wireshark 只向您展示 Wireshark 收到的内容 :)

于 2013-05-02T19:26:30.780 回答