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

使用结构体作为key时bpf_map_lookup_elem查询失败求助

BPF哈希映射查找返回NULL的问题排查与修复

问题根源分析

你的代码存在几个关键语法与逻辑错误,导致无法正确查找哈希映射条目:

  • 字段名拼写不匹配:结构体map_key/map_value定义的字段是key_1/key_2、value_1/value_2,但代码赋值时误用了key1/key2、value1/value2,导致生成的查询key与插入的key完全不一致。
  • 映射变量传参错误:sec2中调用bpf_map_update_elem时,错误传入结构体类型地址&map_key,而非目标映射变量&bpf_map,导致数据根本没插入到指定哈希映射中。
  • 函数定义不完整:sec2的SEC段缺少完整函数头(返回值类型、函数名、参数列表),无法正常编译执行。
  • 变量未声明:sec1中的check变量未提前声明类型,属于语法错误。

修正后的完整代码

#include <linux/bpf.h>
#include <bpf/bpf_helpers.h>
#include <linux/types.h>

struct map_key
{
    __u16 key_1;
    __u16 key_2;
}; // 补充结构体结尾分号

struct map_value
{
    __u16 value_1;
    __u16 value_2;
}; // 补充结构体结尾分号

struct
{
    __uint(type, BPF_MAP_TYPE_HASH);
    __type(key, struct map_key);
    __type(value, struct map_value);
    __uint(max_entries, 1024);
} bpf_map SEC(".maps");

SEC("sec1")
int sec1_func(struct __sk_buff *skb)
{
    struct map_key key = {0};
    key.key_1 = 10; // 修正字段名
    key.key_2 = 20; // 修正字段名
    struct map_value *check; // 声明变量类型
    check = bpf_map_lookup_elem(&bpf_map, &key);
    if (check == NULL) {
        bpf_trace_printk("Trouble.", sizeof("Trouble"));
    }
    return 0; // BPF程序必须返回值
}

SEC("sec2")
int sec2_func(void) // 补充完整函数定义
{
    struct map_key key = {0};
    key.key_1 = 10; // 修正字段名
    key.key_2 = 20; // 修正字段名

    struct map_value value = {0};
    value.value_1 = 15; // 修正字段名
    value.value_2 = 25; // 修正字段名

    bpf_map_update_elem(&bpf_map, &key, &value, BPF_NOEXIST); // 修正映射变量参数
    return 0; // BPF程序必须返回值
}

char _license[] SEC("license") = "GPL";

修正后,sec2会正确将key为{10,20}的条目插入到bpf_map中,sec1使用相同key查找时即可正常获取对应value。

内容的提问来源于stack exchange,提问作者imawful

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 03:15:56