我只是使用常量值(0xfeed)更新skb->cb,并试图在出口tc层ebpf挂钩处获取相同的数据包数据。都是零。我是不是漏掉了什么?不管怎么说,有没有用skb本身在钩子之间发送元数据(LRU_HASH映射可能会有所帮助,但我认为拥有带内元数据会更快)。
SEC("cgroup/skb")
int cgrp_dump_pkt(struct __sk_buff *skb) {
void *data_end = (void *) (long) skb->data_end;
void *data = (void *) (long) skb->data;
if(data < data_end)
{
skb->cb[0] = 0xfeed;
skb->cb[1] = 0xfeed;
skb->cb[2] = 0xfeed;
skb->cb[3] = 0xfeed;
skb->cb[4] = 0xfeed;
bpf_printk("hash:%x mark:%x pri:%x", skb->hash, skb->mark, skb->priority);
bpf_printk("cb0:%x cb1:%x cb2:%x", skb->cb[0], skb->cb[1], skb->cb[2]);
bpf_printk("cb3:%x cb4:%x", skb->cb[3], skb->cb[4]);
}
return 1;
}上面的钩子连接到一个码头实例cgroup,我试图通过在tc出口中附加钩子来查看相同的数据包(将只打印包含cb0-4的数据包信息)。cb0-4值显示为0。这是一种预期的行为吗?如何将ebpf钩子之间的元数据从cgroup skb传递到tc出口或较低层?
发布于 2022-03-03 15:11:53
我只使用过cb字段在BPF尾调用之间传递数据。要将数据从一个挂钩点传递到堆栈中的另一个挂钩点,可以使用skb->mark (32位值)。
请确保没有其他软件正在使用您想要使用的相同位元。例如,请参见https://github.com/fwmark/registry。
https://stackoverflow.com/questions/71339027
复制相似问题