问题标签 [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.
networking - 使用 XDP eBPF 检测 VLAN 标记的数据包
我正在尝试检测带有 VLAN 标签的数据包。我有一些 PCAP 文件包含要测试的 VLAN 标记数据包。示例数据包的 Wireshark 屏幕截图:
在阅读了一些教程后,我编写了以下代码:
中的输出/sys/kernel/debug/tracing/trace
是这样的:
bpf_trace_printk: h_proto is: 0x800, ETH_P_8021Q is: 0x8100
我期望:
bpf_trace_printk: h_proto is: 0x8100, ETH_P_8021Q is: 0x8100
我正在使用 Fedora 34 进行测试,内核版本:5.11.12-300.fc34.x86_64
. 为什么h_proto
不等于0x8100
?
更新
我有两台虚拟机,我tcpreplay
用来将数据包(PCAP 文件)从一个虚拟机发送到另一个具有 eBPF 程序的虚拟机。虚拟机通过仅主机接口连接。我使用以下方法加载程序:
ip link set dev ens37 xdpgeneric obj xdp_vlan_kern.o sec xdpvlan
xdp-bpf - AF_XDP 套接字未收到任何数据包,该套接字附加到使用 16 个队列(alloc_netdev_mqs)创建的伪网络设备上的 RX-Queue 1
这是关于让多个进程打开绑定到不同队列的 XDP 套接字的方法。刚刚开始阅读和研究多进程解决方案。
我创建了一个具有 16 个队列并使用 tcpreplay 抽取数据包的伪 netdev。流程如下。
tcprelay -> lo -> 驱动程序(rx_handler) -> ps-dev[XDP] -> XDP_REDIRECT -> APP。
APP创建了一个XDP套接字并将其附加到队列1。XDP正在接收ctx->rx_queue_index为0的数据包。调用 bpf_redirect_map(&xsks_map, 1, XDP_ABORTED);
没有错误,因为xsks_map中有一个索引为1的套接字。但我没有看到APP上的任何数据。
如果 APP 打开 XDP 套接字并绑定到队列 0,同样可以正常工作。
假设我很清楚,问题是:
队列上的 XDP 套接字绑定是否与伪 netdev 一起使用?
我们如何让数据包发送到绑定在队列 1 上的 XDP 套接字?
编辑 01
perf 显示以下内容:我想知道为什么xdp_redirect_map
没有看到。
qemu - QEMU guest如何将数据包发送到主机的NIC?
我正在尝试测试 XDP 程序,但客户端提供的测试环境由一台服务器和在其上运行的 qemu 客户机组成,并充当流量生成器(使用 scapy 或 DPDK)。为了让这个测试成功运行,来自来宾的数据包应该到达/注入到主机的 NIC 驱动程序(XDP 在本机模式下工作)。是否有任何配置/黑客可以使流量从来宾到主机驱动程序?
编辑:@vipin 建议清除一些要点,
- 在主机上,网卡连接到内核上的 virbr0。
- XDP 在物理网卡上运行。
- 我正在使用 bpf_redirect_map 进行重定向,因为我们仍处于简单阶段。
无论如何,我有一个解决方法,就是在实验室设置中添加一个物理路由器,这对于这个阶段的测试来说已经足够了。
gcc - 使用 ip 命令安装 XDP 程序时出错
我正在尝试在我的网络驱动程序上安装 XDP 程序,但我收到错误ELF 在条目 0 中包含非 {map,call} 相关的 relo 数据,指向第 4 节!编译器错误?!获取程序/地图时出错!
我试图运行的代码:
编译命令:clang -O2 -g -Wall -target bpf -c filter.c -o filter.o就可以了!
和我用来安装的命令:ip link set enp0s3 xdpgeneric obj filter.o然后我得到上述错误。
我不确定这条消息应该是什么意思,我错过了什么吗?
c - ebpf 修改整包数据
我正在使用 XDP 并尝试修改ctx->data
. 假设对于这个例子,我想将所有数据包字节设置为 x+3(x 是数据包中的一个字节)。那可能吗?我尝试了以下代码并从验证者那里得到错误:
它因“禁止 pkt_end 上的指针运算”而失败</p>
我还将 for 循环更改为:
为了满足验证者并确保这不是无限循环,有办法不这样做吗?
另外,我尝试将所有数据包字节设置为一个常数:
验证器失败了:
不支持调用内置函数“memset”。
我什么时候打电话给 memset?
综上所述,我想将数据包上的每个字节更改为另一个字节,这可能吗?如果是的话,我会很高兴知道如何。
netfilter - 使用 eBPF/XDP 读写 netfilter 连接器
我正在纯 XDP 中的 NAT 服务器上工作。但是为了拥有强大的 nat 功能,我想跟踪连接(存储和获取跟踪数据)并且我正在考虑使用已经存在的 netfilter conntrack 数据结构和函数来帮助 XDP 中的数据包处理,我对 nf_conntrack 有一些了解,但是我觉得我错过了一些东西,我不确定我是否可以接收数据包并使用 netfilter conntrack 检查它是否是新连接。
例如,如果它是一个新连接:
我可以调用一个 netfiler conntrack 函数,它可以决定我可以将哪个端口分配为公共源端口以及将另一个信息分配给一个元组。
当回复回来时,我可以在 nf conntrack 中检查这是一个回复,然后更新数据包信息并传递给内部网络。
我从这个 repo 中得到了一些灵感:https ://github.com/ti-mo/conntracct 。但我看到他们只做统计,所以这里的数据包通过正常的内核堆栈。
我感到有点困惑,但如果我设法解释了我在想什么,并且您有提示或提示可以指导我,我将不胜感激。
谢谢。
linux-kernel - bpf_xdp_adjust_meta() 返回 errcode -13(权限被拒绝)
问题:
bpf_xdp_adjust_meta(ctx, -delta);
当 delta > 32 时返回错误代码 -13(权限被拒绝)。
但是BPF 和 XDP 参考指南指出元数据有 256 字节的空间。
那么我是否误解了某些东西,或者我如何将 256 字节用于元数据?
程序:
设置:
内核:
uname -rv
5.8.0-63-generic #71-Ubuntu SMP Tue Jul 13 15:59:12 UTC 2021
设备:
来自xdp-tutorial/testenv 的 veth,因为我的硬件驱动程序不支持原生 xdp 模式。
满载:
ip link set dev test xdp obj xdp_pass_kern.o sec xdp
并检查该程序是否以 xdp 本机模式附加。bpf_set_link_xdp_fd()
来自用户空间程序
我还尝试使用不同的编译环境(默认Makefile
):
背景:
我正在尝试通过该xdp_md->data_meta
字段传递数据,以使尾调用 eBPF 程序可以访问数据。为了调整 data_meta 指针,我调用了 eBPF 辅助函数bpf_xdp_adjust_meta(ctx, -delta);
,其中 delta 是保存元数据的结构的大小。这工作正常,只要 delta <= 32。如果它更大,帮助函数返回 -13(权限被拒绝)。这就是为什么我猜测元数据的空间是 32 字节,而不是BPF 和 XDP 参考指南中所述的 256 字节。
c - 如何阅读/理解 bpf 内核验证程序分析以调试错误?
我是 XDP eBPF 的新手。我有一个旨在丢弃 UDP 数据包的 BPF 程序,但它无法加载,因为它被内核验证程序拒绝。下面是代码:
这是加载程序时出现的内容:
我发现错误出现在 UDP 检查语句 if 上(ip->protocol == IPPROTO_UDP)
,因为当我评论检查时,它加载时没有错误。
所以,我需要知道的是,为什么内核验证程序拒绝 UDP 检查语句(如前所述),以及可以采取什么措施来解决它以解决错误。
谢谢。
bpf - bpf 验证器日志被截断,如何获取完整日志?
如下所示,bpf 验证者日志最后被截断。我怎样才能得到完整的日志?
补充:</p>
在@Qeole 的指导下,我已经解决了这个问题。
cilium/ebpf 实现,可以作为参考。
https://github.com/cilium/ebpf/commit/f365a1e12f0a2477c41ee907a917db6f9bd9cf72
kernel - 如何在两个内核空间 BPF 程序之间共享 BPF 映射?
在我提出我的问题之前;我已经阅读了之前提出的不同 ebpf 程序类型之间的地图共享 问题,该问题似乎没有回答我的问题。
现在,我正在做的是,我有两个 BPF 程序,一个用于 XDP,另一个用于 TC(无用户空间程序)。我在 TC 程序中创建了地图并将其固定到全局命名空间
现在,我想在我的 XDP 代码中访问同一个地图。该文档说可以使用 获取固定对象BPF_OBJ_GET
,但我能找到的只是用户空间版本。
所以,我需要知道,两个内核空间 BPF 程序如何共享一个映射?如果BPF_OBJ_GET
可以获得固定对象(在我的情况下是地图),那么如何?或者还有其他方法吗?
非常感谢如何访问其他内核空间 BPF 程序中的固定对象的代码示例,因为我是 XDP/BPF 或 tc/BPF 的新手。
谢谢。