问题标签 [xdp-bpf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
3065 浏览

cpu - 测试 XDP 与 DPDK

我确实有一些使用 DPDK 的经验,但目前我正在阅读许多关于 XDP 的博客。我正在尝试比较这两种技术并了解 DPDK 和 XDP 之间的区别。这提出了一些问题。我希望有人可以帮助我解决以下问题:

  1. 使用 DPDK,我可以将 worker 映射到 CPU 内核并隔离 DPDK 将使用的 CPU 内核。在 eBPF / XDP 的情况下,使用哪些 CPU 内核?是否使用了所有可用的 CPU 内核?是否可以隔离用于 eBPF / XDP 程序的 CPU 内核?
  2. 当我测试 DPDK 应用程序的吞吐量时,我能够检查环形缓冲区(内存池)是否已满,因此数据包会丢失。但是如何检查 eBPF / XDP 程序是否因为吞吐量太高而导致丢包呢?我假设当 eBPF / XDP 程序花费太多时间来处理数据包时,最终您会看到数据包丢失吗?(尤其是在高速率发送64B数据包时,寻找可以发送的最大数据包数)

预先感谢您的帮助!

0 投票
0 回答
270 浏览

linux - AF_XDP 零拷贝 - 操作不支持错误

我正在尝试启用 AF_XDP 零复制模式,我在 Cent OS 8(内核 4.18)中看到错误,但 SKB 模式和带复制的 DRV 模式工作正常。驱动程序是 ixgbe 5.6.5,根据文档支持 AF_XDP 零拷贝。strace 显示失败是在绑定期间

ethtool 显示我有组合队列而不是单独的 rx/tx 队列。那是问题吗?

任何想法缺少什么?

0 投票
2 回答
1598 浏览

linux - 有效负载匹配上的 ebpf 数据包过滤器

我是 ebpf 和 xdp 主题的新手,想学习它。我的问题是如何使用 ebpf 过滤器过滤特定有效负载匹配的数据包?例如,如果数据包的数据(有效负载)为 1234,则将其传递给网络堆栈,否则将阻止该数据包。我达到了有效载荷长度。例如,如果我想匹配消息有效负载长度,它可以正常工作,但是当我开始匹配有效负载字符时出现错误。这是我的代码:

错误已删除,但无法比较有效负载...我正在从 python 套接字代码发送 UDP 消息。如果我比较有效载荷长度,它工作正常。

0 投票
4 回答
1285 浏览

linux - 更新目标端口后 xdp ebpf 如何更改校验和 tcphdr

更新目标端口后xdp ebpf如何更改校验和tcphdr?

这是我试图更改 tcp 数据包校验和的功能代码

我为接口加载了一个 xdp 程序lo,我想将数据包代理到同一网络接口中的端口 5555。

0 投票
0 回答
666 浏览

c - 使用 XDP 修改 UDP 数据包负载,超出接收大小

我想使用 XDP_TX 重新传输收到的数据包,同时还修改数据包的内容。我已经交换了 dst 和 src ip 地址,所以它成功地被发送回了发件人,这一切都很完美。

但是,我想将数据包有效负载修改为其他内容,我遇到的问题是我只能将内容修改为接收数据包的大小,而不能在其上添加更多数据(例如,如果它们也发送了 26 个字节,则只发回 26 个字节的有效负载)。

我可以通过沿着正常的 IP 标头获取 UDP 数据包的有效负载,直到获得数据:

除此之外,进行边界检查以确保数据包是我期望的长度:

这种类型的数据包总长度总是 26 字节。然后我可以通过以下方式修改数据包内容(尽管方式很糟糕):

但是,我受限于传入数据包的字节数。如果我尝试添加另一个字节,验证器将阻止它加载。是否可以扩展数据包以允许更多有效负载?我见过bpf_xdp_adjust_head但不确定这是否是我需要的!

0 投票
1 回答
156 浏览

docker - 如何将流量从一个端口重定向到同一接口中的另一个端口?

我需要将进入 docker 容器到特定端口的流量重定向到另一个容器(我知道它的 ip)到另一个使用 xdp 的端口。为此,我更改了 iphdr 结构的校验和:

然后是 tcphdr 结构的校验和:

但它不起作用,我做错了什么?

0 投票
0 回答
597 浏览

linux-kernel - bpf_csum_diff 函数调用有什么问题?

我想以某种方式使用 ebpf 重定向数据包。从 Cilium 文档中举了一个例子:Implementation: proxy via bpf

这是我在 bpf_helpers 中的宏示例:

这是代理脚本本身的代码:

这是代理脚本本身的代码:

告诉我如何正确地将数据包代理到 docker 中的另一个端口和另一个 ip?

0 投票
1 回答
342 浏览

linux - 无法使用自定义(桥接)tap 设备在 QEMU VM 中加载 XDP 程序

我最近尝试在 QEMU VM 中加载 XDP 程序(使用virtio-net-pci作为 NIC 驱动程序,并将设备作为后端)。这样做似乎需要我的 NIC 具有队列的 vCPU*2 功能,这可以通过在 QEMU 启动命令 ( ... -netdev tap,queues=<N> ...) 中声明它来完成。如果我没有用足够数量的队列声明 NIC 并尝试加载 XDP 程序,我会收到以下内核消息和错误:

到目前为止,这完全不是问题,尽管我知道为什么需要这样做(我已经成功地在我的主机上加载了相同的 XDP 程序,它只有一个队列)。

但我的目标是让 QEMU 使用我的自定义分接设备,该设备已连接到主机上的网桥。而不是让 QEMU 为我创建一个新的。

为了使用自定义 Tap 设备,我使用以下命令启动 VM:

tap0所谓的自定义水龙头设备在哪里。

上面的 QEMU 命令不会启动 VM,错误信息是:

通过删除选项ifname=tap0queues=4,它可以正常启动。

似乎它告诉我我不能同时声明具有多队列和桥接抽头设备的 NIC。但尴尬的是我需要在桥接分接头设备上执行 XDP 程序。

有谁知道为什么桥接分接头设备不能与启用多队列的 NIC 一起使用?

PS内核版本:5.4.33QEMU版本:4.2.0 (Debian 1:4.2-3ubuntu6.2)

感谢您阅读我的问题!

0 投票
1 回答
1023 浏览

linux - 为什么 bpf 重定向不能正常工作?(XDP)

我写了一个这样的简单程序:

发送方将数据包重定向到接口 5,接收方在对等接口接收数据包,但像 iperf 这样的程序没有收到它,为什么?

0 投票
1 回答
389 浏览

linux - 如何在出口路径中使用 XDP_REDIRECT?

如何在出口路径中使用 xdp_redirect?我知道 TC_ACT_REDIRECT 如何使用它,但 XDP_REDIRECT 不知道?