C语言 如何在eBPF中使用bpf_map_lookup_elem()获取字符数组?

66bbxpm5  于 2023-03-12  发布在  其他
关注(0)|答案(1)|浏览(216)

我有一个类型为BPF_MAP_TYPE_ARRAY的bpfMap:

struct {
   __uint(type, BPF_MAP_TYPE_ARRAY);
   __uint(max_entries, 1);
   __type(key, u32);
   __type(value, char[MAX__SIZE]);
} input_map SEC(".maps");

然后我想得到userspace-input字符串的值,它是一种char数组类型:

char target_string[MAX_SIZE] ;
target_string = bpf_map_lookup_elem(&input_map, &0);

它有一个编译错误:

error: array type 'char[MAX__SIZE]' is not assignable

我对eBPF和C真的是新手,谁能告诉我为什么会出现这个错误,以及实现我的函数的最佳方法是什么?

vngu2lb8

vngu2lb81#

你得到这个错误是因为C不允许你给char target_string[MAX_SIZE];赋值,因为它是一个数组。这里的技巧是,在C中,数组和指针基本上是一样的(内存方面)。除了数组类型有编译时边界检查。然而指针是可赋值的,所以我们可以这样做:

char *target_string;
__u32 key = 0;

target_string = bpf_map_lookup_elem(&input_map, &key);
if (!target_string) {
    return 0;
}

return target_string[2];

额外的提示,&0也是不允许的,你必须创建一个键变量并传递一个指针给它。
注意我们仍然可以在指针上使用[]操作符,和数组一样工作,唯一的问题是你必须确保你没有超出MAX_SIZE的范围,否则验证器会阻止你。

相关问题