为了账号安全,请及时绑定邮箱和手机立即绑定

无法卸载 BPF 程序

无法卸载 BPF 程序

Go
临摹微笑 2022-11-08 14:33:55
我无法从代码中卸载 BPF 程序。我正在使用Cilium eBPF 库加载程序和netlink以将 BPF 函数添加到接口。这就是我正在做的事情: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() 即使我正在关闭程序,bpftool prog仍然 xdp-loader status显示 BPF 程序。bpftool我可以使用或卸载程序xdp-loader。
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

eBPF 程序只有在没有更多引用时才会卸载(文件描述符、引脚),但网络链接也拥有自己的引用。因此,要卸载程序,您首先必须将其与网络链接分离。


您可以通过将程序 fd 设置为 -1 来做到这一点:


err = netlink.LinkSetXdpFd(link, -1)

if err != nil {

    log.Fatalln("netlink.LinkSetXdpFd:", err)

}


查看完整回答
反对 回复 2022-11-08
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信