一些比较有用的ebpf代码小笔记

记录一些容易遗忘的ebpf相关的代码笔记。

在userspace代码里修改bpf.c里的常量

假设在bpf.c内核文件里有agent_pid这个常量:

volatile const uint32_t agent_pid;

可以在用户空间中这样修改这个变量的值,使用RewriteConstants函数

    spec, err := bpf.LoadAgent()
    err = spec.RewriteConstants(map[string]interface{}{
        "agent_pid": uint32(os.Getpid()),
    })
    if err != nil {
        log.Fatal("rewrite constants error:", err)

获取skb的netns

static __always_inline int get_netns(struct sk_buff *skb)
{   
    if (!skb) {
        return 0;
    }
    struct net_device *dev;
    u32 inode;
    struct net *ns;

    if (!bpf_core_field_exists(possible_net_t, net))
        return 0;

    dev = _C(skb, dev);
    if (!dev) {
        struct sock *sk = _C(skb, sk);
        if (!sk)
            goto no_ns;
        ns = _C(sk, __sk_common.skc_net.net);
    } else {
        ns = _C(dev, nd_net.net);
    }

    if (!ns)
        goto no_ns;

    inode = _C(ns, ns.inum);
    return inode;
no_ns:
    return 0;
}

In

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注