【问题标题】:Unable to capture VLAN tagged packets using DPDK无法使用 DPDK 捕获 VLAN 标记的数据包
【发布时间】:2021-05-04 14:40:09
【问题描述】:

我们正在使用 DPDK 捕获多播 UDP 流,在捕获来自 VLAN 中继端口的多播数据包方面需要帮助。我们 Linux 服务器上的 pNIC(Intel x710)连接到交换机上的中继端口,因此接收来自 2 个 VLAN 的数据包。我们的 Linux 服务器在裸机上安装了 CentOS(没有使用虚拟机管理程序)。

在非 VLAN 流量的正常情况下,我们将物理 NIC 与 DPDK 绑定并为其创建一个 KNI 端口(具有明确定义的 IP)(KNI 是发出多播加入请求时需要的,而没有 KNI 端口我们无法提出加入请求)。

对于 VLAN 流量,我们服务器的物理端口连接到交换机上的中继端口。在 Linux 服务器上,我们配置了两个 VLAN 接口 pNIC.10 和 pNIC.20 分别接收来自 VLAN 10 和 20 的数据包(参考https://www.linuxtechi.com/vlan-tagged-nic-ethernet-card-centos-rhel-servers/)。在这种情况下,我们仍然需要将物理端口与 DPDK 绑定,因为绑定发生在 PCI 设备 id 上(VLAN IF 没有 PCI id)。但是,我们无法确定要创建什么以及要创建多少个 KNI 端口。已尝试创建两个 KNI 端口 - 每个 VLAN ID 一个,但这对我们不起作用。在这种情况下无法启用 KNI 端口。

任何帮助将不胜感激!

【问题讨论】:

  • 能否请您更新以下信息,dpdk 版本、网卡型号、固件、RX vlan 的 DPDK 应用程序设置、多播 IP 接受、示例程序(如果有)?也请描述实际问题
  • 要求vlan tag-1重定向到Kernel interface-1,vlan tag-2重定向到Kernel interface-2?
  • @VipinVarghese 我们正在使用带有 Intel x710 DA-4 NIC 的 DPDK 版本 18。我在原始帖子中添加了一个图表以使事情变得清晰。我们面临的问题是我们无法通过带有来自多个 VLAN 的数据的 VLAN 标记端口捕获多播数据包。不用说,两个 VLAN 有不同的子网。我们希望使用 Intel x710 NIC 上的单个物理端口捕获来自 172.16.1.x 和 172.16.2.x 的多播数据。
  • 下列说法正确吗? DPDK口你用的是PF口,还有VF口。 linux 或 DPDK 中都没有为流过滤启用 MAC-VLAN。 DPDK 在混杂和所有多播接收中启用?在 dpdk 中禁用 vlan 标记删除?是否允许在 dev_Configure 中启用所有 vlan?
  • DPDK 正在与 PF 端口一起使用。没有 VF 端口。在 linux 或 DPDK 中没有为流过滤启用 MAC-VLAN - 是的 DPDK 在混杂中启用 - 是的,所有多播接收 - 是的,但只有在启用 IGMP 后发送加入请求时 dpdk 中禁用了 Vlan 标记删除 - 是.我猜你指的是 VLAN 条带。我们确实设置了 local_port_conf.rxmode.hw_vlan_filter = 1 虽然允许在 dev_Configure 中启用所有 vlan - 不确定这指的是什么属性。可以分享一下具体的名字吗?

标签: linux vlan


【解决方案1】:

基于 DPDK 物理网卡的标准默认设置(例如 l2fwd/skeleton/l3fwd/testpmd),DPDK 物理网卡可以接收 VLAN 标记的数据包。确认同一个可以

  1. 编辑代码以解析 ETHER-VLAN 标头
  2. 在主服务器中启用rte_pdump_init,并使用dpdk-pdump作为辅服务器来捕获数据包。

为了向内核发送 VLAN 数据包,应将 KNI 或 TAP 接口与 DPODK 绑定作为虚拟接口,以将数据包发送到 KNI/TAP。以下是启用 VLAN 数据包通过 DPDK 接收和发送到内核的步骤。

  1. 选择 DPDK-21.02 示例框架
  2. 使用 TAP 和 NIC PMD 编译应用程序
  3. 启动应用程序./applciation-binary -l 2 --vdev=net_tap0 -a [PCIe B:D:F]
  4. 在Linux终端上调出界面ifconfig dtap0 promisc up
  5. 添加VALN-10接口vconfig add dtap0 10
  6. 添加VLAN-20接口vconfig add dtap0 20

注意:调出 VLAN 接口并运行 TCPDUMP。

[根据评论对话进行编辑]@RamandeepSandhu 将很快分享 KNI 的步骤。

【讨论】:

    【解决方案2】:

    我们已经能够通过以下步骤解决手头的问题:

    • 物理网卡端口 (p1p1) 绑定到 DPDK。
    • 在物理 NIC 端口之上创建了一个名为 p1p1 的 KNI 端口。没有为该 KNI 端口分配 IP 地址。
    • VLAN 接口使用 p1p1 作为主设备添加
      • "ip link add link p1p1 name p1p1.10 type vlan id 10"
      • "ip link add link p1p1 name p1p1.20 type vlan id 20"
    • 增加 VLAN IF
      • “ip link set dev p1p1.10 up”
      • “ip link set dev p1p1.20 up”
    • 为 p1p1.10 和 p1p1.20 分配了适当的 IP

    发布此消息后,我们可以发送多播加入请求并在 DPDK 绑定端口上接收流。

    【讨论】:

    • 感谢您发布最终的答案。根据您的回答 2 观察 1)DPDK 在接收和传输 vlan 数据包方面没有问题,2)您使用 ip link add 而不是 ip link add 类型为 vlan. Hence the fundamental issue VLAN 接口未在内核中启用。跨度>
    • 在我看来,如果您可以将您的答案添加到原始答案中,这将非常有用,因为它围绕enabling VLAN in kernel
    猜你喜欢
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 2018-05-13
    • 2015-09-08
    相关资源
    最近更新 更多