英文:
Unable to unload BPF program
问题
我无法从代码中卸载BPF程序。我正在使用Cilium eBPF库加载程序,并使用netlink将BPF函数添加到接口中。以下是我的操作步骤:
type BpfObjects struct {
CollectIpsProg *ebpf.Program `ebpf:"collect_ips_prog"`
}
var objects BpfObjects
// 加载BPF程序
spec, err := ebpf.LoadCollectionSpec("collect_ips.o")
if err != nil {
log.Fatalln("ebpf.LoadCollectionSpec", err)
}
if err := spec.LoadAndAssign(objects, nil); err != nil {
log.Fatalln("ebpf.LoadAndAssign", err)
}
// 加载到XDP
link, err := netlink.LinkByName("enp0s8")
if err != nil {
log.Fatalln("netlink.LinkByName", err)
}
err = netlink.LinkSetXdpFdWithFlags(link, objects.CollectIpsProg.FD(), 2)
if err != nil {
log.Fatalln("netlink.LinkSetXdpFdWithFlags:", err)
}
...
// 清理。这不会卸载BPF程序
objects.CollectIpsProg.Close()
objects.CollectIpsProg.Unpin()
尽管我关闭了程序,但是bpftool prog
和xdp-loader status
仍然显示BPF程序。我可以使用bpftool
或xdp-loader
卸载程序。
英文:
I am unable to unload a BPF program from code. I am using the Cilium eBPF library to load the program and netlink to add the BPF function to an interface. Here's what I'm doing:
type BpfObjects struct {
CollectIpsProg *ebpf.Program `ebpf:"collect_ips_prog"`
}
var objects BpfObjects
// Load the BPF program
spec, err := ebpf.LoadCollectionSpec("collect_ips.o")
if err != nil {
log.Fatalln("ebpf.LoadCollectionSpec", err)
}
if err := spec.LoadAndAssign(objects, nil); err != nil {
log.Fatalln("ebpf.LoadAndAssign", err)
}
// Load to XDP
link, err := netlink.LinkByName("enp0s8")
if err != nil {
log.Fatalln("netlink.LinkByName", err)
}
err = netlink.LinkSetXdpFdWithFlags(link, objects.CollectIpsProg.FD(), 2)
if err != nil {
log.Fatalln("netlink.LinkSetXdpFdWithFlags:", err)
}
...
// Cleanup. This does not unload the BPF program
objects.CollectIpsProg.Close()
objects.CollectIpsProg.Unpin()
Even though I am closing the program, bpftool prog
and xdp-loader status
still show the BPF program. I can unload the program using bpftool
or xdp-loader
.
答案1
得分: 3
eBPF程序只有在没有其他引用时(文件描述符、引用)才会卸载,但网络链接也会保留自己的引用。因此,要卸载程序,首先必须将其从网络链接中分离。
您可以通过将程序文件描述符设置为-1来实现:
err = netlink.LinkSetXdpFd(link, -1)
if err != nil {
log.Fatalln("netlink.LinkSetXdpFd:", err)
}
英文:
eBPF programs only unload when there are no more references to it(File descriptors, pins), but network links also hold their own references. So to unload the program, you first have to detach it from your network link.
You can do so by setting the program fd to -1:
err = netlink.LinkSetXdpFd(link, -1)
if err != nil {
log.Fatalln("netlink.LinkSetXdpFd:", err)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论