是否可以在两个网络接口之间共享 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)
函数可以在解析目标文件以提取字节码之后但在加载它之前,为程序使用的特定映射显式重用给定的文件描述符。