【发布时间】:2020-07-08 10:20:14
【问题描述】:
我在使用 DPDK 18 时遇到以下 40G NIC 适配器的问题:
04:00.3 以太网控制器:英特尔公司以太网控制器 用于 10GbE SFP+ 的 X710(修订版 02)
DPDK 使用驱动程序net_i40e。
显然 NIC 丢弃了它拥有的源 MAC 的广播数据包。
这里是对正在发生的事情的更详细描述。 我有一个带有两个路由器的高可用性环境。 通过 rte_eth_dev_mac_addr_add() 注册的两个路由器 虚拟 MAC (00:00:5e:00:01:64) 以及物理烧录 MAC。 当主路由器发送广播 VRRP-advertise 消息时 源 MAC 设置为虚拟 MAC,辅助路由的适配器似乎掉线了 包。
消息如下所示:
> Ethernet II, Src: 00:00:5e:00:01:64, Dst: ff:ff:ff:ff:ff:ff
> Destination: ff:ff:ff:ff:ff:ff
> Address: ff:ff:ff:ff:ff:ff
> .... ..1. .... .... .... .... = LG bit: Locally administered
> address (this is NOT the factory default)
> .... ...1 .... .... .... .... = IG bit: Group address
> (multicast/broadcast)
> Source: 00:00:5e:00:01:64
> Address: 00:00:5e:00:01:64
> .... ..0. .... .... .... .... = LG bit: Globally unique address
> (factory default)
> .... ...0 .... .... .... .... = IG bit: Individual address
> (unicast)
> Type: IPv4 (0x0800)
> Internet Protocol Version 4, Src: 10.93.0.1, Dst: 255.255.255.255
> 0100 .... = Version: 4
> .... 0101 = Header Length: 20 bytes (5)
> Differentiated Services Field: 0x00 (DSCP: CS0, ECN: Not-ECT)
> 0000 00.. = Differentiated Services Codepoint: Default (0)
> .... ..00 = Explicit Congestion Notification: Not ECN-Capable
> Transport (0)
> Total Length: 32
> Identification: 0x0000 (0)
> Flags: 0x0000
> 0... .... .... .... = Reserved bit: Not set
> .0.. .... .... .... = Don't fragment: Not set
> ..0. .... .... .... = More fragments: Not set
> ...0 0000 0000 0000 = Fragment offset: 0
> Time to live: 255
> Protocol: VRRP (112)
> Header checksum: 0x0000 incorrect, should be 0xb110(may be caused by
> "IP checksum offload"?)
> Source: 10.93.0.1
> Destination: 255.255.255.255
> Virtual Router Redundancy Protocol
> Version 3, Packet type 1 (Advertisement)
> 0011 .... = VRRP protocol version: 3
> .... 0001 = VRRP packet type: Advertisement (1)
> Virtual Rtr ID: 100
> Priority: 254 (Non-default backup priority)
> Addr Count: 1
> 0000 .... = Reserved: 0
> .... 0000 0000 0001 = Adver Int: 1
> Checksum: 0xf896 [correct]
> [Checksum Status: Good]
> IP Address: 0.31.205.8
>
相同的代码,相同的 DPDK 版本但使用 1G 网卡可以完美运行。
我错过了什么?
谢谢 迪玛
【问题讨论】:
-
您的网卡是 X710,但端口是 10G(请正确)。如果您想接收具有不同 MAC 地址的数据包,请确保您启用了
rte_eth_dev_promiscous。请使用您正在使用的示例代码或 DPDK 示例进行更新,以供参考以帮助您。 -
@VipinVarghese 感谢您的回复。是的,网卡是 40G,但自动配置为 10G 速度。我不想在混杂模式下工作,所以我注册了一个额外的 MAC。它适用于我们正在使用的 1G 汽车。我不能发布代码,它对 SO 来说太嘈杂了 :)
-
感谢您的回复,API
rte_eth_dev_mac_addr_add将添加 DST mac 地址列表作为白名单。在您的解释中,您添加了00:00:5e:00:01:64。但是您收到的数据包是Dst: ff:ff:ff:ff:ff:ff,所以我不清楚 DPDK 接口上接收的数据包是什么 -
@VipinVarghese 数据包被广播(DST MAC ff:ff:ff:ff:ff:FF)。由于它是广播的,我希望 NIC 能够接受它。示例中的消息是 VRRP 协议的一部分,用于在高可用性 (HA) 环境中选举主路由器。 00:00:5e:00:01:64 是虚拟 MAC(也是 VRRP 协议的一部分)。在任何特定时间,只有处于 HA 模式主机的路由器拥有它。另一台路由器处于 HA 备份模式,不会发送带有 MAC 的数据包,并且会丢弃任何带有 MAC 的入口数据包。
-
我认为我们应该只关注 i40e DPDK PMD 和行为,因为 DPDK 库与 HA 或 VRRP 无关。由于没有共享代码 sn-p,我最终修改了
examples/skeleton以禁用混杂模式,但在rte_eth_dev_start之前通过rte_eth_allmulticast_enable启用多播。使用ff:ff:ff:ff:ff:ff和1:ee:ee:ee:ee:ee进行测试对我有用。而44:44:44:44:44:44被删除。如果你愿意,我可以在 stackoverflwo 聊天dpdk-debug上联系我。 networklessons.com/multicast/…
标签: networking broadcast high-availability dpdk