记录一些容易遗忘的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;
}
发表回复