当我想从bpf map中获取值时,输入键类型为
const char*
,无法获取map值;但当key类型为char name[192]
时,可以得到正确的值。以上两种钥匙类型有什么区别?为什么会发生这种情况?
这是 ebpf 代码:
struct {
__uint(type, BPF_MAP_TYPE_HASH_OF_MAPS);
__uint(key_size, CLUSTER_NAME_MAX_LEN);
__uint(value_size, sizeof(__u32));
__uint(max_entries, MAP_SIZE_OF_CLUSTER);
__uint(map_flags, BPF_F_NO_PREALLOC);
__array(values, struct inner_of_maglev);
}outer_of_maglev SEC(".maps"); // CLUSTER_NAME_MAX_LEN equal 192
static inline void *loadbalance(struct cluster_endpoints *eps, const char* name,ctx_buff_t *ctx)
{
if (!eps || eps->ep_num == 0)
return NULL;
__u32 *res1;
__u32 *res2;
char c_name[192] = "outbound|5000||helloworld.default.svc.cluster.local";
res1 = (__u32 *)bpf_map_lookup_elem(&outer_of_maglev,name);
res2 = (__u32 *)bpf_map_lookup_elem(&outer_of_maglev,c_name);
if (res1) {
BPF_LOG(INFO, CLUSTER, "loadbalance_maglev test res %u\n",res);
}
return NULL;
}
如上面的说法,res1为NULL,res2不为NULL,这是map的正确值。 另外,变量名的内容与c_name相同;
我认为问题在于内存中字符串后面的内容。由于
BPF_MAP_TYPE_HASH
的所有键必须具有相同的大小(在您的情况下,我猜测是 192 字节大小),并且整个键用于搜索(而不仅仅是直到空终止符的部分)
在您的
char[192]
参数中,数组的其余部分被清零。
对于 char*
参数,这取决于您如何创建它。如果您没有将其分配为 192 字节归零数组,然后才复制您的字符串,那么内存中的随机字节也会用作您的密钥,并且您不会得到预期的结果。