无法使用 bpf_map_lookup_elem() 获取数据

Unable to fetch data using bpf_map_lookup_elem()

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

  1. 如果用户 space 应该是将数据写入地图的人,我应该从用户 space 本身创建地图吗?或者,我现在的做法可以吗?
  2. 在用户 space 我有 2 个函数。 Insert() 和 Fetch(),它们会将数据插入到地图中,其他函数将分别从地图中获取数据。在 Insert() 中,我使用 bpf_map_update_elem() 来输入数据,在 Fetch() 中,我使用 bpf_map_lookup_elem() 来获取数据。但是,问题出现在无法获取数据的 Fetch() 中。我注意到的唯一解决方法是,如果在 Insert() 中我在完成 bpf_map_update_elem() 之后立即执行 bpf_map_lookup_elem(),那么在 Fetch() 中我可以获取数据。

bpf_map_lookup_elem() 是否以某种方式使数据在 Insert() 中的 bpf_map_update_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 位小数。