我有一个DPDK应用程序,它使用Boost asio加入多播组,并在特定UDP端口号上通过VLAN接收多播UDP数据包(其他IPv4端口也用于其他流量)。我尝试在DPDK应用程序中的该端口仅接收那些多播UDP数据包,并将它们放入RX队列中,并使所有其他入口网络流量表现为DPDK应用程序没有运行(转到内核)。因此,我使用流隔离模式(rte_flow_isolate())。我的应用程序的流过滤部分基于DPDK提供的flow_filtering示例,并添加了对rte_flow_isolate()和VLAN filter的调用。我使用的过滤器如下:
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中的许多其他项。我使用的是DPDK19.11,我使用的OFED版本是RHEL7.6的4.6 (x86_64)
我在这里做错了什么,为什么添加RTE_FLOW_ITEM_TYPE_IPV4过滤器(没有ip地址,规范和掩码都为0)会导致我的应用程序不接收任何数据包,即使它们是IPv4数据包?对于DPDK的MLX5驱动,有没有解决这个问题的方法?
发布于 2019-12-17 06:08:30
答案很简单:数据包是零碎的。它们无法匹配的原因有两个:
尝试匹配未分段的数据包以进行确认。
发布于 2020-01-04 01:23:04
是否可以在使用DPDK接收组播时使用流隔离模式?我认为流隔离和混杂或所有多播模式是不兼容的。
https://stackoverflow.com/questions/59361202
复制相似问题