C++ Mellanox上的DPDK IPv4流过滤

C++ Mellanox上的DPDK IPv4流过滤,c++,network-programming,ipv4,dpdk,mellanox,C++,Network Programming,Ipv4,Dpdk,Mellanox,我有一个DPDK应用程序,它使用Boost asio加入多播组,并通过特定UDP端口号上的VLAN接收多播IPv4 UDP数据包(其他UDP端口也用于其他流量)。我正在尝试在DPDK应用程序的该端口仅接收那些多播UDP数据包,并将它们放入RX队列中,并使所有其他入口网络流量像DPDK应用程序未运行一样工作(转到内核)。因此,我使用流隔离模式(rte_flow_isolate())。我的应用程序的流过滤部分基于DPDK提供的流过滤示例,添加了对rte_flow_isolation()的调用和VLA

我有一个DPDK应用程序,它使用Boost asio加入多播组,并通过特定UDP端口号上的VLAN接收多播IPv4 UDP数据包(其他UDP端口也用于其他流量)。我正在尝试在DPDK应用程序的该端口仅接收那些多播UDP数据包,并将它们放入RX队列中,并使所有其他入口网络流量像DPDK应用程序未运行一样工作(转到内核)。因此,我使用流隔离模式(rte_flow_isolate())。我的应用程序的流过滤部分基于DPDK提供的流过滤示例,添加了对rte_flow_isolation()的调用和VLAN过滤器。我使用的过滤器如下所示:

action[0].type = RTE_FLOW_ACTION_TYPE_QUEUE;
action[0].conf = &queue;
action[1].type = RTE_FLOW_ACTION_TYPE_END;

pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[1].type = RTE_FLOW_ITEM_TYPE_VLAN;
//vlan id here
pattern[2].type = RTE_FLOW_ITEM_TYPE_IPV4;
//no specific ip address given
pattern[3].type = RTE_FLOW_ITEM_TYPE_UDP;
//udp port here
pattern[4].type = RTE_FLOW_ITEM_TYPE_END;
使用这些过滤器,我无法接收任何数据包,如果我只删除UDP过滤器,情况也是如此。但是,如果我同时删除IPV4和UDP筛选器(保留ETH和VLAN筛选器),我可以接收我需要的所有数据包,以及其他我不想要的数据包(并且希望发送到内核)

这是我需要从Wireshark捕获中接收的数据包的条目。目前我的理论是,由于保留位(邪恶位)是在IPv4报头中设置的,因此数据包不会被识别为IPv4。这可能是一个延伸:

Frame 100: 546 bytes on wire (4368 bits), 546 bytes captured (4368 bits) on interface 0

Ethernet II, Src: (src MAC), Dst: IPv4mcast_...
802.1Q Virtual LAN, PRI: 0, FRI: 0, ID: 112
Internet Protocol Version 4, Src: (src IP), Dst: (Dst mcast IP)
    Version: 4
    Header length: 20 bytes
    Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00: Not-ECT (Not ECN-Capable Transport))
    Total length: 1108
    Identification: 0x000 (0)
    Flags: 0x04 (RESERVED BIT HAS BEEN SET)
    Fragment offset: 0
    Time to live: 64
    Protocol: UDP (17)
    Header checksum: 0xd8c4 [validation disabled]
    Source: srcip
    Destination: dstip
User Datagram Protocol, Src Port: (src port), Dst Port: (dst port)
Data (N bytes)
我运行的硬件有一个Mellanox ConnectX-5卡,因此,DPDK使用的是MLX5驱动程序,它不支持RTE_FLOW_ITEM_TYPE_RAW以及RTE FLOW API中的许多其他项目。我使用的是DPDK 19.11,我使用的OFED版本是RHEL 7.6(x86_64)的4.6


我在这里做错了什么?为什么添加RTE_FLOW_ITEM_TYPE_IPV4筛选器(没有ip地址、规范和掩码都设置为0)会导致我的应用程序无法接收任何数据包,即使它们是IPV4数据包?DPDK的MLX5驱动程序有没有办法解决这个问题?

答案很简单:数据包是碎片化的。有两个原因无法匹配:

  • UDP报头仅出现在第一个IP片段中

  • 因此,从NIC的角度来看,碎片化UDP只是一个IP数据包


  • 尝试匹配非碎片化的数据包进行确认。

    答案很简单:数据包是碎片化的。有两个原因无法匹配:

  • UDP报头仅出现在第一个IP片段中

  • 因此,从NIC的角度来看,碎片化UDP只是一个IP数据包


  • 尝试匹配非碎片数据包以进行确认。

    在使用DPDK接收多播时,是否可以使用流隔离模式?我认为流隔离和混杂或所有多播模式是不兼容的

    使用DPDK接收多播时是否可以使用流隔离模式?我认为流隔离和混杂或所有多播模式是不兼容的

    你有没有想过?你有没有想过?