ebpf bpf_map_lookup_elem 使用 const char* 作为键类型,无法从 bpf map 获取值

问题描述 投票:0回答:1

当我想从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相同;

c pointers ebpf
1个回答
0
投票

我认为问题在于内存中字符串后面的内容。由于

BPF_MAP_TYPE_HASH
的所有键必须具有相同的大小(在您的情况下,我猜测是 192 字节大小),并且整个键用于搜索(而不仅仅是直到空终止符的部分)

在您的

char[192]
参数中,数组的其余部分被清零。 对于
char*
参数,这取决于您如何创建它。如果您没有将其分配为 192 字节归零数组,然后才复制您的字符串,那么内存中的随机字节也会用作您的密钥,并且您不会得到预期的结果。

© www.soinside.com 2019 - 2024. All rights reserved.