无法使用bpf_map_lookup_elem()获取数据



我正在尝试为XDP编写一段代码,其中用户空间程序将填充bpf映射,然后内核将查看该映射。为了创建映射,我在bpf_obj文件中添加了一个SEC(".maps"(,该文件将加载到内核中。关于这一点,我有一堆问题:

  1. 如果用户空间应该是向映射中写入数据的空间,我应该从用户空间本身创建映射吗?或者,我目前的做法还可以吗
  2. 在用户空间中,我有两个功能。Insert((和Fetch((,将数据插入到地图中,其他函数将分别从地图中获取数据。在Insert((中,我使用bpf_map_update_elem((来输入数据,在Fetch((中我使用bpf _map_lookup_elm((来获取数据。但是,问题出现在Fetch((中,它无法获取数据。我注意到的唯一解决方法是,如果在Insert((中,我在完成bpf_map_update_elem((之后立即执行bpf_mat_lookup_elem(,那么在Fetch((中我可以获取数据

在Insert((中的bpf_map_update_elem((之后,bpf_map_lookup_elem是否以某种方式使数据持久存在于映射中?

编辑:(这是一段代码(

Insert(struct my_key key, struct my_val value){
map_fd = find_map_fd(bpf_obj, "my_map");
if(map_fd < 0)
xdp_link_detach(config.ifindex, config.xdp_flags,0);
bpf_map_update_elem(map_fd, &key, &value, BPF_ANY);
}
Fetch(struct my_key key){
struct my_val value;
map_fd = find_map_fd(bpf_obj, "my_map");
if(map_fd < 0)
xdp_link_detach(config.ifindex, config.xdp_flags,0);
if(bpf_map_lookup_elem(map_fd, &key, &value) == 0)
printf("Found key");
else
printf("Key not found");
}
int main(){
// Defined key and value
Insert(key, value);
Fetch(key);  // This call is failing to fetch
return 0;
}

然而,如果我更改Insert((,那么上面的程序就可以工作了:

Insert(struct my_key key, struct my_val val){
map_fd = find_map_fd(bpf_obj, "my_map");
if(map_fd < 0)
xdp_link_detach(config.ifindex, config.xdp_flags,0);
bpf_map_update_elem(map_fd, &key, &val, BPF_ANY);
//Immediately fetch the value
struct my_val value;
bpf_map_lookup_elem(map_fd, &key, &value);

}

实际上,我发现了这个问题。我不得不更改我的密钥定义:

struct Key {
uint32_t srcIP;
uint16_t srcPort;
};

至:

struct Key {
uint32_t IP;
uint32_t port;
};

这和内核如何创建边界有关。它可能对我写的端口做了一些填充。我使用strace查看了bpf调用,注意到我请求的密钥和写在bpf_map中的密钥相差了32位小数。

相关内容

  • 没有找到相关文章

最新更新