问题标签 [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.
linux - BPF: translation of program contexts
I was looking at the different types of BPF
program, and noticed that for different program types the context is being passed differently.
Example:
For program type
BPF_PROG_TYPE_SOCK_OPS
, an object of typestruct bpf_sock_ops_kern
is passed. However, the BPF program of this type takes a reference tostruct bpf_sock_ops
. Why is it done this way and where is the "translation" frombpf_sock_ops_kern
tobpf_sock_ops
?For program type
BPF_PROG_TYPE_CGROUP_SKB
, an object of typestruct sk_buff
is passed (e.g., in__cgroup_bpf_run_filter_skb
), but the BPF program expects a minimized version,struct __sk_buff
.
So I looked at the struct bpf_verifier_ops
function callbacks, but they seem to only adjust the offsets in BPF instructions, as they are called by the BPF verifier.
I'd be glad if someone could shed light on how the BPF context is defined. Thanks.
linux-kernel - ebpf:拦截函数调用
我正在阅读有关kprobes
BPF 程序类型的信息,并且想知道是否有可能不仅拦截函数调用以进行跟踪或收集一些低级信息(寄存器、堆栈等),还可以替换调用并执行而不是实际功能?
是否kprobe
提供此功能或我正在寻找错误的工具?
network-programming - 阅读 BPF 程序集
我正在尝试为过滤器阅读一些 BPF 语法,以尝试弄清楚它的作用。我找不到的一件事是“字节偏移量的开始”。意思是,如果我们有以下汇编代码:
- 问题 1
对于字节偏移量 4,这是否将我置于 802.3 帧的目标 MAC 地址的中间?还是在序言中?我从数据包的哪个位置开始,然后走 4 个字节到我的半字,这就是我要问的。
- 问题2
如果它在 MAC 地址中,scapy 是否是编写我自己的数据包的以太网帧的可行选项?这样做的目标是编写一个连接并通过所有 BPF 要求的客户端。
linux-kernel - ebpf:存在三元查找吗?
有没有可以做三元查找map
的?ebpf
我知道存在最长前缀匹配的 LPM 映射,但我想要这样的东西:
concurrency - Linux TC eBPF 和并发性
内核可以在多个 CPU 上同时运行多少个 eBPF 程序实例是否有限制(类似于 python GIL 问题)
特别是 eBPF tc 程序可以同时在多个 CPU 上工作吗?
当 eBPF 在多个 CPU 上运行相同的代码时,它是如何锁定内核数据结构的?
linux-kernel - 如何在内核模块中使用跟踪点
我最近开始学习这些东西。关于这个问题,我发现了大量关于 kprobes、BPF、eBPF、tracepoints 和 perf 的资源。
我想测试内核中的一些 irq 事件(在它到达设备驱动程序之前)。因此,我在 do_IRQ() 函数的内核中创建了一个跟踪事件。
我已将内核中的跟踪点声明为:
为了检查这一点,我使用 eBPF 尝试了以下代码段。
在这里,我正在侦听特定 IRQ 编号上的 IRQ 事件。这对我来说效果很好,暂时。
现在,我试图将这个跟踪点附加到内核模块中(就像我们在内核模块中附加 kprobe 的方式一样)。这甚至可能吗?目前,我为此使用了 perf,但它产生了一些抖动。当我评估一些对抖动敏感的任务时,我希望我可以在内核模块中使用这个跟踪点。
我将不胜感激有关此事的任何意见或建议。
谢谢,库沙尔。
networking - eBPF 支持事件吗?
是否有可能让ebpf
程序生成事件,例如数据包计数器达到预定义的阈值ebpf
并将生成一些通知/事件给用户,类似于netlink
提供的东西。
我看到目前发出此事件/状态的唯一方法是maps
用户应用程序可以通过它进行轮询。
wireshark - BPF过滤源地址==传输地址
仅接收源 MAC 地址等于传输 MAC 地址的数据包的正确 BPF 过滤器是什么?
查看文档,似乎这些字段应该可以通过wlan[21:12]
或者wlan.addr2
但我无法让它们工作。
dhcp - ISC dhcrelay 未将 DISCOVER 数据包转发到 dhcp 服务器
我正在做 DHCP 中继 POC。我的设置如下。
DHCP 客户端(VX-works) ----------- DHCP 中继----------- DHCP 服务器 (VXworks)
在此设置中,DHCP 客户端正在发送 DICOVER 数据包,但中继代理没有收到数据包。我查看了代码,发现在套接字上应用了 Berkeley Packet Filtering (BPF)。DHCP 中继只是丢弃数据包而不将其转发到服务器。
为了进一步调试,我从代码中删除了 BPF 过滤器和校验和验证部分。
现在,DHCP 中继正在转发数据包,但数据包不是 DHCP 服务器所期望的。DHCP 中继正在正确地将数据包从广播更改为单播。服务器端收到的帧、以太网报头、IP 报头和 UDP 报头都是正确的(我在 Wireshark 日志中检查过),但引导协议选项字段不正确。
我还在客户端捕获了 Wireshark 日志。客户端正在按预期发送 DICOVER 数据包。
如果您需要更多信息,请发表评论。
Realy : 基于 ISC dhcrelay(4.3.1P1) Linux (3.14 kernel)
提前致谢。
编辑:下面是在 DHCP 客户端捕获的单个数据包的十六进制转储。
ff ff ff ff ff ff 00 20 61 1e 9e 14 08 00 45 00
01 1a 4f fe 40 00 20 11 09 d6 00 00 00 00 ff ff
ff ff 00 44 00 43 01 06 fd 9b 01 01 06 00 00 ae
af 53 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 20 61 1e 9e 14 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 63 82 53 63 35 01 01 39 02 02
4e 37 04 0f 06 03 01 ff
c - 在 BPF 程序上传时解密“无效的内存访问 map_ptr”
我正在编写一个自定义应用程序,它读取 C 代码,调用 LLVM 从该 C 代码生成 BPF 字节代码,然后重新定位任何 bpf 映射符号并将其上传到内核。我可以成功上传和运行不使用 BPF 映射的程序,但是一旦我重新定位程序以使用 BPF 映射,我就会收到以下错误:
详情如下:
以下输入提供给 LLVM:
生成以下字节码
并且“a”符号在指令#4中被重新定位,如下所示:
指令#4 中的“04”是符号“a”的映射的FD。调用 BPF_PROG_LOAD 后,我在内核的错误日志中得到以下信息。
我在破译这个错误日志时遇到了麻烦。内核想告诉我什么?