0

我想产生多个用户空间进程,每个进程都处理来自单个源(三倍(SRC-IP, DST-IP, DST-Port))的数据包。

因为要通过 AF-XDP 内核程序传递大量数据包并且时间很关键,所以我想到了内核程序中的一个单独的映射,该映射预先由用户空间程序填充。

该映射定义了从前面提到的三元组到索引的映射,然后用于bpf_redirect_map(&xsks_map, index, 0)将数据包发送到用户空间中的特定套接字。

我最初的想法是将 src-ip、destination-ip 和目标端口连接成一个 (32 + 32 + 16) 位的值。

是否可以定义具有如此大键大小的映射?哪张地图最适合这个问题?此外,是否可以从用户空间填充地图?

4

1 回答 1

0

结构体作为键

有几种类型的地图可以与 eBPF 一起使用。其中一些是通用的(散列图、数组等),而另一些则是非常具体的(重定向图、sockmaps、...)。

您描述的案例听起来像是哈希映射的完美用例。这样的映射将 astruct作为键,将另一个struct作为值。所以你可以有类似的东西:

struct my_key {
        uint32_t src_ip;
        uint32_t dst_ip;
        uint16_t dst_port;
};

...并将其用作钥匙。在您的情况下,该值将是 xskmap 的索引,即一个简单的整数。哈希映射对于从给定键中检索值是有效的(不像数组那样进行线性搜索),因此您可以获得良好的性能。

哈希映射的密钥大小

键或值的大小没有具体限制,只要大小保持在 32 位整数上即可:)(请注意,在硬件卸载的情况下可能存在大小限制)。

从用户空间更新

从用户空间更新哈希映射是完全可行的(尽管某些非常特定的映射类型可能不允许这样做,但是像数组或哈希映射这样的通用映射完全可以)。你会这样做:

  • 在命令行中,使用bpftool,
  • 从一个 C 程序,使用 libbpf 的助手,
  • 用你自己的语言。在所有三种情况下,更新本身都是通过调用bpf()系统调用来完成的。
于 2020-03-12T15:53:30.323 回答