使用结构体作为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
相关产品推荐
相关产品推荐

