问题标签 [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 回答
710 浏览

python - How can I re-filter a scapy packet using BPF?

I'm writing a program that needs to re-filter the packets captured by sniff().I want to apply BPF filer to each packet and if it matches, return true, else return false.

Could any one give me some hints?Thanks!

0 投票
1 回答
1551 浏览

trace - 是否可以使用 eBPF 或 perf 来计算在单个跟踪函数中花费的时间?

目前,我可以告诉trace-cmd(一个 ftrace 前端)使用 ftrace 的函数图基础结构来跟踪指定的工作负载。使用一些跟踪数据处理工具,我可以查看调用函数的频率以及每个函数调用的相应总持续时间。示例输出可能如下所示,其中我跟踪工作负载生成的 ext4 函数调用:

我已经看到可以通过、、等生成的令人难以置信的火焰图,这让我相信我应该能够实现与使用or的输出相似的输出。但是,有一些障碍:eBPFsystemtapperftrace-cmdperfeBPF

  1. 我的工作负载最多可以运行 15 分钟,如果我使用perf. 作为参考,您可以查看在更短的时间内跟踪 bash 的示例输出。
  2. 我不够熟悉,eBPF无法确定我是否可以实现与我trace-cmd的后处理示例输出类似的数据/输出。

对于那些比我更熟悉eBPFperf比我更熟悉的人,我想知道:

  • 是否可以使用eBPFperf实现我的目标?
  • 如果是这样,为什么可能?

如果您感觉特别慷慨,将不胜感激可以帮助我实现目标的示例代码/命令。

0 投票
1 回答
737 浏览

linux-kernel - 无法附加 eBPF blob

我刚刚从内核编译了 BPF 示例tools/testing/selftests/bpf并尝试按照http://cilium.readthedocs.io/en/v0.10/bpf/中的说明进行加载:

这发生在内核 4.4.0-98 的 Ubuntu 16.04.3 LTS 上,llvm并且clang从包安装的版本 3.8iproute2是来自 github 的最新版本。

我怀疑我遇到了一些工具链/内核版本/功能不匹配的问题。

我究竟做错了什么?

0 投票
1 回答
367 浏览

c# - Berkeley Packet Filter 到高级过滤表达式

我有一个 C 程序,它通过 Berkeley Filter 手动设置 WinPcap 会话的过滤器。现在我想用 Pcap.Net 在 C# 中传输这个工具。Pcap.Net 不提供原始伯克利过滤器作为参数,而是提供高级过滤表达式(也用于例如 wireshark/tcpdump 等ip and tcp

有没有办法

  1. 将伯克利包过滤器“反编译”为高级过滤表达式
  2. 在 pcap.net 中为过滤器使用原始字节流

原始 bpf_program:

编辑澄清:Berkeley Packet Filter是基于 unix 的系统的接口。WinPcap 使用这个 BPF,Pcap.Net 也是如此。Pcap.Net 有一个类来处理 BPF,也称为BarkeleyPacketFilter. 该类只接受高级过滤表达式(如tcp port 80)。

我寻找一种使用原始过滤器(参见上面的代码块)而不是高级表达式来提供 BPF 类的方法。

0 投票
1 回答
1727 浏览

linux-kernel - 简单的 eBPF 操作不与 tc 一起生效

samples/bpf/pare_simple.c我从(来自 Linux 内核树)编译了 BPF 示例,并进行了非常简单的更改:

所以我希望丢弃任何数据包。我安装它如下:

这发生在 Ubuntu 16.04.3 LTS 上,内核为 4.4.0-98,llvm 和从软件包安装的 3.8 版本的 clang,iproute2 是来自 github 的最新版本。

所以它似乎安装成功,但是这个过滤器/ebpf 不会丢弃数据包,我在eth0接口上生成入口流量,例如 ICMP,它会继续。我究竟做错了什么?

0 投票
1 回答
6703 浏览

linux-kernel - 如何从内核树中构建 BPF 程序

内核在samples/bpf. 我有兴趣在树之外构建一个示例,就像我们构建一个内核模块一样,它Makefile可以足够简单。是否可以对 bpf 做同样的事情?我尝试通过删除不必要的部分samples/bpf/Makefile并保持对libbpf和其他部分的依赖关系,但结果并不是那么容易。

例如,尝试samples/bpf/bpf_tcp_kern.c使用以下命令行在内核树之外构建(我查看了 samples/bpf/Makefile 以及 的输出make samples/bpf V=1):

这是与clang-llvm 3.8.0

而且我需要libbpf构建用户端 bpf 应用程序。这部分工作得很好。

我错过了什么吗?我相信这项任务应该相当容易;-)

0 投票
1 回答
4485 浏览

linux-kernel - bpf_printk() 的输出

在运行一些示例时,samples/bpf我注意到bpf_printk输出前面带有一些额外的信息,例如:

BPF command: 2是传递给bpf_printkbpf 程序的实际字符串,但其余的是什么?我假设这来自内核的 JIT ?

我在哪里可以更仔细地查看这些位的含义?谢谢。

0 投票
0 回答
512 浏览

debugging - 在 netlink 消息上调试 bpf 代码

我正在编写一个 bpf 过滤器来防止某些网络链接消息。我正在尝试调试 bpf 代码。有没有可以帮助我的调试工具?

我最初是在考虑使用 nlmon 来捕获 netlink 消息:

来自https://jvns.ca/blog/2017/09/03/debugging-netlink-requests/

# 创建网络接口

sudo ip link add nlmon0 type nlmon
sudo ip link set dev nlmon0 up
sudo tcpdump -i nlmon0 -w netlink.pcap # 捕获你的数据包

然后使用 ./bpf_dbg ( https://github.com/cloudflare/bpftools/blob/master/linux_tools/bpf_dbg.c )

1)./bpf_dbg进入shell(用'>'表示的shell cmds):
2)>加载bpf 6,40 0 0 12,21 0 3 20...(这是我打算调试的bpf代码)
3)>加载pcap netlink.pcap
4) > run /disassemble/dump/quit (self-explanatory)
5) > breakpoint 2 (在加载的 BPF insns 2 处设置 bp,run然后执行;可以设置多个 bps,当然,调用breakpoint w/ o args 显示当前加载的bps,breakpoint reset用于重置所有断点)
6)>选择3(run等将从pcap中的第三个数据包开始)
7)>步骤[-,+](通过BPF执行单步执行)

以前有人试过吗?

另外,我无法让 nlmon 模块加载到我的 linux 内核上(有这个文档吗?)

我正在运行内核版本 Linux 版本 4.10.0-40-generic nlmon 模块似乎存在于内核源代码中:

https://elixir.free-electrons.com/linux/v4.10/source/drivers/net/nlmon.c#L41

但是,当我在 /lib/modules/ 中搜索 nlmon.ko 时,我什么也没找到。

0 投票
1 回答
502 浏览

linux-kernel - 无法使用密件抄送工具将 eBPF `kretprobes` 附加到 `napi_poll()`

想法是用来argdist测量延迟时间,napi_poll()其中返回处理的数据包数量(称为工作)。执行延迟与napi_poll()处理的数据包数量的比率将为我提供以直方图形式处理每个数据包所需的平均时间。

我正在使用以下命令

argdist -H 'r:c:napi_poll():u64:$latency/$retval#avg time per packet (ns)' 这最终给了我错误Failed to attach BPF to kprobe,在 dmesg 我收到类似的消息Could not insert probe at napi_poll+0: -2

我只是好奇为什么当类似的技巧适用时kretprobes我不能附加?napi_poll()net_rx_action()

0 投票
2 回答
2055 浏览

linux-kernel - 谁在 BPF 中创建地图

在阅读man bpf和其他一些文档来源之后,我的印象是 amap只能由用户进程创建。然而,下面的小程序似乎神奇地创建了bpf地图:

所以我用内核加载程序,tools/bpf/bpftool并验证程序是否已加载:

当然地图是空的。但是,bpf_map_lookup_elem从程序中删除会导致不创建地图。

更新 我用它调试它,strace发现在这两种情况下,即有bpf_map_lookup_elem和没有它,bpftool 确实调用bpf(BPF_MAP_CREATE, ...)并且它显然成功了。然后,如果 bpf_map_lookup_elem 被遗漏,我 strace onbpftool map showbpf(BPF_MAP_GET_NEXT_ID, ..)立即返回ENOENT,它永远不会转储地图。所以很明显有些东西没有完成地图的创建。

所以我想知道这是否是预期的行为?

谢谢。