我正在测试nginx_quic与quic_bpf打开,但我遇到了BPF_MAP_CREATE失败。errno(22)告诉无效参数。我用BPF_MAP_TYPE_SOCKHASH类型编写了一个简单的BPF_MAP_CREATE示例。但是errno(7)告诉论证列表太长了。我不知道如何使用BPF_MAP_TYPE_SOCKHASH
。
下面是我的代码:
#include <sys/socket.h>
#include <sys/syscall.h>
#include <linux/bpf.h>
#include <string.h>
#include <stdint.h>
#include <errno.h>
int main(){
union bpf_attr attr;
memset(&attr, sizeof(union bpf_attr), 0);
- attr.map_type = BPF_MAP_TYPE_SOCKHASH;
attr.key_size = sizeof(uint64_t);
attr.value_size = sizeof(uint64_t);
attr.max_entries = 64;
attr.map_flags = 0;
int ret = syscall(__NR_bpf, BPF_MAP_CREATE, attr, sizeof(attr));
printf("ret = %d, errno = %dn", ret, errno);
return 0;
}
result: ret = -1, errno = 7
我的linux内核是5.4uname -:Linux h3c_r4900 5.4.0-126-generic #142~18.04.1-Ubuntu SMP Thu Sep 1 16:25:16 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux
谁能给我一个工作的例子或告诉什么是我的代码或系统环境的问题?我认为bpf过滤器是在linux内核中实现的,还是我需要libbpf或任何依赖关系?
这个问题是由于linux内核不支持ebpf导致的。我通过重新编译linux内核来解决这个问题,几乎所有ebpf相关的配置都打开了。