问题标签 [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.
ebpf - stdio.h 标头不适用于 eBPF 内核程序
我正在尝试查看是否可以将 stdio.h 与阻止每个数据包的简单 XDP 代码一起使用。
这段代码可以在没有的情况下工作,stdio.h
但是当我尝试使用以下代码编译它时它不会编译:
我在想也许编译器找不到系统头文件的目录所以我也试过:
我认为应该指定系统头文件的位置。
我不知道怎么了:(
ebpf - 如何使用 iproute2 将 XDP 程序导入内核?
我正在使用“ip link”命令将 xdp 程序放入内核,在我的虚拟机中(内核版本:4.18)
像这样的命令:
但是在这个命令之后,错误说:
我应该怎么做才能解决这个问题?
c - 将数据连续写入文件的 C 最快方法
我有一个由一些数据包统计信息组成的字符串,例如数据包长度等。
我想将其存储到 csv 文件中,但如果我使用标准 fprintf 写入文件,它的写入速度非常慢,我最终会丢失信息。
如何尽快将信息写入文件,以尽量减少数据包中的信息丢失。理想情况下,我希望每秒支持数百万个数据包,这意味着我需要每秒写入数百万行。
我正在使用 XDP 获取数据包信息并通过 eBPF 映射将其发送到用户空间,如果这很重要的话。
c - 如何设置 XDP 挂钩使用的内核/线程数?
我在用户端使用多生产者单消费者实现来处理来自 XDP 挂钩的 eBPF 映射的传入数据。
但是,为了做到这一点,我需要将 XDP 挂钩用于向用户空间发送信息的核心数量限制为 1。
我们有办法做到这一点吗?
我正在使用 BPF_MAP_TYPE_PERF_EVENT_ARRAY,并通过 bpf_prog_load_xattr 和 bpf_set_link_xdp_fd 挂钩 kern 代码。
这是加载钩子的函数。
这是它被使用的地方。
c - 获取用户空间中 XDP 钩子的 PID
我在用户端使用多生产者单消费者实现来处理来自 XDP 挂钩的 eBPF 映射的传入数据。
但是,为了做到这一点,我需要将 XDP 挂钩用于向用户空间发送信息的核心数量限制为 1。据我了解,这样做的唯一方法是以如下方式设置其亲和力:
但是,我不知道如何获取我的钩子的 PID,以便我可以做到这一点。
我正在使用,并通过和BPF_MAP_TYPE_PERF_EVENT_ARRAY
挂钩紧缩代码。bpf_prog_load_xattr
bpf_set_link_xdp_fd
这是加载钩子的函数。
这是它被使用的地方。
c - 如何正确利用掩码将索引信息发送到 perf 事件输出?
根据此处找到的 bpf_perf_event_output 文档:http: //man7.org/linux/man-pages/man7/bpf-helpers.7.html
“这些标志用于指示映射中必须为其放置值的索引,并用 BPF_F_INDEX_MASK 屏蔽。”
在以下代码中:
它可以按您的预期工作,并存储给定 CPU 编号的信息。但是,假设我希望将所有数据包发送到索引 1。
我交换
为了
代码正确编译并且没有抛出错误,但是根本没有数据包被保存。如果我希望将所有数据包都发送到索引 1,我做错了什么?
c - xdp 代码计算 icmp 校验和的验证程序失败?
我正在使用 xdp(使用 XDP_TX 操作)来构造一个 icmp resv 数据包。
linux:centos8
内核 4.18.0-80.el8.x86_64
llvm:7.0.1
clang:clang 版本 7.0.1 (tags/RELEASE_701/final)
这是我的代码:
但是编译结果告诉我“验证器失败”:
错误:
linux - AF_XDP 不适用于内核`4.18.0-25-generic`
我目前正在尝试从这里运行 AF_XDP-Tutorial:https ://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP
我能够编译它,但如果我尝试通过以下方式将 xdp 代码放入内核:
我收到此错误:
ERROR: Can't setup AF_XDP socket "Operation not permitted"
然后我检查了内核标志
CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
CONFIG_XDP_SOCKETS=y
/boot/config-4.18.0-25-generic
他们都在那里。
因此,下一步,我尝试不使用存储库libbpf
中的 -submodule编译程序xdp-tutorial
,而是使用此处的最新版本:https ://github.com/libbpf/libbpf/tree/master/src
但是现在,如果我尝试编译程序,我会得到以下输出:
cc -Wall -I../libbpf/src/build/usr/include/ -g -I../headers/ -L../libbpf/src -o af_xdp_user ../common/common_libbpf.o ../common /common_params.o ../common/common_user_bpf_xdp.o \af_xdp_user.c -l:libbpf.a -lelf -lpthread /usr/bin/ld: ../libbpf/src/libbpf.a(libbpf.o): 未定义引用符号 'gzopen64@@ZLIB_1.2.3.3' /usr/bin/ld: //lib/x86_64-linux-gnu/libz.so.1: 添加符号时出错:命令行中缺少 DSO
有谁能帮忙吗?
编辑:
输出sudo strace ./af_xdp_user --dev veth-basic02 --force
:
Edit_2:自从创建这篇文章以来,我升级到内核5.3.0-28
- 但不幸的是没有任何改变
linux - XDP 程序 ip 链接错误:Prog 部分被拒绝:不允许操作
我尝试进入XDP
,为此我有一个非常小的程序:
但是,如果我尝试将其加载到虚拟接口veth-basic02
中,则会出现此错误:
$ sudo ip -force link set dev veth-basic02 xdp object xdpsock_kern.o section xdp_sock
Prog 部分“xdp_sock”被拒绝:不允许操作 (1)!- 类型:6 - 说明:2(0 超限) - 许可证:
验证者分析:
获取程序/地图时出错!
内核版本:5.3.0-28-generic
这是我正在使用的 Makefile:
封锁:
编辑:
++echo 1 > /proc/sys/kernel/sysrq
确实解决了问题——我终于可以加载 XDP 程序了!不过有趣的复活节彩蛋。谢谢@Qeole!echo x > /proc/sysrq-trigger
Alt+SysRq+x
c - AF_XDP - 用户空间程序继续接收 `ping` 数据包,即使内核中的`XDP_DROP`
我从这个存储库开始我的应用程序:https ://github.com/xdp-project/xdp-tutorial/tree/master/advanced03-AF_XDP
就像“概念证明”一样,我想将提供的应用程序更改为
- 丢弃内核程序中所有其他接收到的数据包(
af_xdp_kern.c
) - 回复从用户空间收到的 ping 请求 (
af_xdp_user.c
)
我希望在执行 ping 的控制台窗口中看到的内容:
- 对每第二个 ping 请求的响应(例如,仅偶数或仅奇数序列号)
我注意到的是:
- 每个 ping 请求的响应
为了进一步调查,我用一个简单的内核程序替换了内核程序return XDP_DROP;
——据我所知,这意味着用户空间程序不应该接收任何数据包。
但不知何故,我仍然看到我发送的每个 ping 的响应。
我的内核程序:
用户空间程序:https ://github.com/xdp-project/xdp-tutorial/blob/master/advanced03-AF_XDP/af_xdp_user.c (删除if (false)
行287
)
有什么想法有什么问题吗?
编辑: