【发布时间】:2021-04-15 19:14:48
【问题描述】:
是否可以在两个网络接口之间共享 ebpf 映射。 我想编写一个 XDP 程序并将其挂接到两个设备上,即 eth0 和 eth1。该实现要求它们都使用相同的地图。 是否可以加载相同的程序,将它们挂接到 eth0 和 eth1 并使用相同的 Map。
谢谢大家!
【问题讨论】:
是否可以在两个网络接口之间共享 ebpf 映射。 我想编写一个 XDP 程序并将其挂接到两个设备上,即 eth0 和 eth1。该实现要求它们都使用相同的地图。 是否可以加载相同的程序,将它们挂接到 eth0 和 eth1 并使用相同的 Map。
谢谢大家!
【问题讨论】:
是的,这是完全可能的。 eBPF 映射不附加到接口,它是在内核中创建的,然后被以下一个或多个引用:
eBPF 映射可以在连续的程序运行之间、内核空间和用户空间之间共享,或者 - 至于您的用例 - 在不同的 eBPF 程序之间共享,无论它们附加到什么接口。请注意,给定的程序甚至可以分离,然后再重新附加到另一个接口。
为了在多个程序中重复使用一个地图,这是通过在加载程序时指向同一个地图来完成的:当你加载一个地图时,你会得到一个地图的句柄(它的 id 或它的固定路径,例如例如),从该句柄获取映射的文件描述符,并在加载之前将此文件描述符放在您的 eBPF 字节码中。然后内核将文件描述符翻译成相关的内存地址。
在实践中大部分时间发生的情况是,这个“重定位”步骤(将文件描述符放在字节码中)由您用来加载程序的框架为您处理,例如 libbpf 或 bcc 工具。例如,libbpf 有一个bpf_map__reuse_fd(struct bpf_map *map, int fd) 函数,可以在解析目标文件以提取字节码之后但在加载它之前,为程序使用的特定映射显式重用给定的文件描述符。
【讨论】: