You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 24.04 HWE内核下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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 23:12:10