首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BPF:`bpf_obj_get_info_by_fd`在“无效论证”中失败

BPF:`bpf_obj_get_info_by_fd`在“无效论证”中失败
EN

Stack Overflow用户
提问于 2020-03-12 12:48:34
回答 1查看 396关注 0票数 0

我试图在我的用户空间程序中获得BPF_MAP_TYPE_XSKMAP的fd。

这是代码:

代码语言:javascript
复制
ret = bpf_get_link_xdp_id(cfg->ifindex, &cfg->prog_id, cfg->xdp_flags);
if (ret) {
    fprintf(stderr, "`bpf_get_link_xdp_id` returned error: %s\n", strerror(errno));
    exit(-ret);
}

cfg->prog_fd = bpf_prog_get_fd_by_id(cfg->prog_id);
if(cfg->prog_fd < 0) {
    fprintf(stderr, "Failed to obtain prog_fd: %s\n", strerror(errno));
    exit(1);
}

struct bpf_prog_info prog_info;
uint32_t prog_info_len = sizeof(struct bpf_prog_info);
uint32_t map_info_len = sizeof(struct bpf_map_info);
if(bpf_obj_get_info_by_fd(cfg->prog_fd, &prog_info, &prog_info_len) == 0) {

    const uint32_t amnt_of_maps = prog_info.nr_map_ids;
    uint32_t *map_ids = (uint32_t*)malloc(sizeof(uint32_t) * prog_info.nr_map_ids);

    memset(&prog_info, 0, prog_info_len);
    prog_info.nr_map_ids = amnt_of_maps;
    prog_info.map_ids = (uint64_t)(unsigned long)map_ids;

    if(bpf_obj_get_info_by_fd(cfg->prog_fd, &prog_info, &prog_info_len) == 0) {

        for(uint32_t i = 0; i < prog_info.nr_map_ids; i++) {

            const int map_fd = bpf_map_get_fd_by_id(map_ids[i]);

            if(map_fd >= 0) {
                struct bpf_map_info map_info;
                if(bpf_obj_get_info_by_fd(map_fd, &map_info, &map_info_len) == 0) {
                    if(strcmp(map_info.name, "xsks_map") == 0) {
                        cfg->xsks_map_fd = map_fd;
                        printf("Got fd of xsks_map!\n");
                        break;
                    }
                } else {
                    close(map_fd);
                }
            } else {
                fprintf(stderr, "Failed to obtain map_fd for id %d: %s\n", i, strerror(errno));
            }

        }
    } else {
        fprintf(stderr, "Failed to obtain prog_info 2: %s\n", strerror(errno));
    }
} else {
    fprintf(stderr, "Failed to obtain prog_info 1: %s\n", strerror(errno));
}

但是不幸的是,我在调用bpf_obj_get_info_by_fd(cfg->prog_fd, &prog_info, &prog_info_len)Failed to obtain prog_info 1: Invalid argument时出错了。

我不知道这是否是因为XDP程序是从另一个进程加载的?相同的进程是否必须获得同样加载了AF-XDP程序的程序信息?

编辑:我在用户空间程序中唯一改变的是通过BPF_MAP_TYPE_HASH填充bpf_map_update_elem (条目在那里,用bpftool map dump id <id>观察),并在XDP-程序中使用bpf_map_lookup_elem (相同的哈希映射)。

突然,错误更改为:Failed to obtain prog_info 1: Bad address

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-13 10:08:41

当您试图检索有关程序的信息时,内核代码中的一个函数中有一条注释,声明:

如果我们得到一个比我们所知道的更大的结构,那么确保所有未知位数都是0--即新用户空间--不依赖于任何我们还不知道的内核特性扩展。**

我想这就是你在你的案子里碰到的。您的libbpf版本可能在struct bpf_prog_info中使用内核不知道的一些属性。

要确保内核接受它,只需尝试零初始化您的结构

代码语言:javascript
复制
struct bpf_prog_info prog_info = {};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60654466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档