Ubuntu 24.04 HWE内核下BPF_LINK_CREATE绑定XDP程序返回-EINVAL问题
使用BPF_LINK_CREATE绑定XDP程序返回-EINVAL的问题排查
我在Ubuntu 24.04 HWE(内核版本6.14.0-36-generic,i40e网卡)系统中,尝试按照eBPF文档说明,使用BPF_LINK_CREATE搭配BPF_LINK_TYPE_XDP与target_ifindex将XDP程序绑定到网卡,但该调用始终返回-EINVAL错误。不过通过“传统”netlink/XDP路径绑定同一程序却可正常执行。需要排查以下可能性:
- 当前内核暂不支持该组合
union bpf_attr.link_create字段使用错误- Ubuntu HWE内核存在特定配置/回退问题
触发该错误的最简C示例:
#define _GNU_SOURCE #include <errno.h> #include <linux/bpf.h> #include <linux/if_link.h> #include <net/if.h> #include <stdint.h> #include <stdio.h> #include <string.h> #include <sys/syscall.h> #include <unistd.h> #include <bpf/bpf.h> static int sys_bpf_link_create(int prog_fd, int ifindex, __u32 xdp_flags) { union bpf_attr attr; memset(&attr, 0, sizeof(attr)); attr.link_create.prog_fd = prog_fd; attr.link_create.target_ifindex = ifindex; attr.link_create.attach_type = BPF_LINK_TYPE_XDP; // from enum bpf_link_type attr.link_create.flags = xdp_flags; // XDP_FLAGS_* (driver mode, etc.) return syscall(__NR_bpf, BPF_LINK_CREATE, &attr, sizeof(attr)); } int main(void) { const char *ifname = "eno2np1"; const char *pin_path = "/sys/fs/bpf/xdp_udp_echo"; int ifindex = if_nametoindex(ifname); if (ifindex == 0) { perror("if_nametoindex"); return 1; } int prog_fd = bpf_obj_get(pin_path); if (prog_fd < 0) { perror("bpf_obj_get"); return 1; } __u32 xdp_flags = XDP_FLAGS_DRV_MODE | XDP_FLAGS_UPDATE_IF_NOEXIST; int link_fd = sys_bpf_link_create(prog_fd, ifindex, xdp_flags); if (link_fd < 0) { perror("BPF_LINK_CREATE"); return 1; } printf("link_fd = %d\n", link_fd); pause(); // keep link alive return 0; }
内容的提问来源于stack exchange,提问作者xpepermint
相关产品推荐
相关产品推荐

