登录
首页 >  Golang >  Go问答

ebpf 尾部调用无效即使 bpf 代码成功加载

来源:stackoverflow

时间:2024-02-08 23:48:24 419浏览 收藏

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《ebpf 尾部调用无效即使 bpf 代码成功加载》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!

问题内容

#include "bpf/bpf_helpers.h"
#include 
char _license[] sec("license") = "gpl";
struct bpf_map_def sec("maps") jump_table = {
    .type = bpf_map_type_prog_array,
    .key_size = sizeof(__u32),
    .value_size = sizeof(__u32),
    .max_entries = 100,
};

sec("xdp_1")
int test_func(struct xdp_md *ctx) {
  bpf_printk("tail call\n");
  return xdp_pass;
}

sec("xdp")
int xdp_pass_func(struct xdp_md *ctx) {
  __u32 zero = 0;
  bpf_tail_call(ctx, &jump_table, zero);
  bpf_printk("tail call failed\n");
  return xdp_pass;
}

当我查看 cat /sys/kernel/debug/tracing/trace_pipe 时,它显示 tail 调用失败 ,但我不知道出了什么问题,这是我的加载代码

func main() {
    if err := rlimit.RemoveMemlock(); err != nil {
        log.Fatal(err)
        return
    }
    var obj aclObjects
    err := loadAclObjects(&obj, nil)
    if err != nil {
        log.Fatal(err)
        return
    }
    err = obj.JumpTable.Put(uint32(0), uint32(obj.TestFunc.FD()))
    if err != nil {
        log.Fatal(err)
        return
    }
    link, err := netlink.LinkByName("ens33")
    if err != nil {
        log.Fatal(err)
        return
    }
    err = netlink.LinkSetXdpFd(link, obj.XdpPassFunc.FD())
    if err != nil {
        log.Fatal(err)
        return
    }
}

bpf代码可以加载,但是tail_call好像有点问题,我是根据linux源码写的,有人可以帮帮我吗?


正确答案


正如您在回答中意识到并提到的那样,当加载程序退出时,引用该程序的文件描述符确实会被关闭。

如果没有其他东西引用该程序,则该程序将被卸载。什么可以容纳这样的参考?

你想要的是在加载程序退出之前固定你的程序(你似乎使用了 goebpf?显然该库有 a Pin() function,这可能会有帮助)。

今天关于《ebpf 尾部调用无效即使 bpf 代码成功加载》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>