我希望产生多个用户空间进程,每个进程处理来自单个源((SRC-IP, DST-IP, DST-Port)的三倍)的数据包。
由于AF-XDP内核程序要传递大量数据包,而时间又很关键,因此我在内核程序中考虑了一个单独的map,该map预先由一个用户空间程序填充。
该映射定义了从前面提到的三元组到索引的映射,然后在bpf_redirect_map(&xsks_map, index, 0)中使用该索引将数据包发送到用户空间中的特定套接字。
我最初的想法是将src-ip、目标ip和目标端口连接到一个(32 + 32 + 16)-bit值中。
有可能用这么大的key-size来定义map吗?哪个地图最适合这个问题?此外,是否可以从用户空间填充地图?
发布于 2020-03-12 23:53:30
作为键的结构
有几种类型的映射可以与eBPF一起使用。其中一些是通用的(散列映射、数组等)还有一些是非常具体的(重定向映射、套接字映射等)。
您描述的用例听起来像是哈希映射的完美用例。这样的映射以struct为关键字,以另一个struct为值。所以你可能会有类似这样的东西:
struct my_key {
uint32_t src_ip;
uint32_t dst_ip;
uint16_t dst_port;
};..。并把它当做钥匙。在本例中,该值将是xskmap的索引,即一个简单的整数。散列映射对于从给定的键中检索值是有效的(没有像数组那样的线性搜索),因此您可以获得良好的性能。
散列映射的键大小
对于键或值的大小没有特定的限制,只要大小符合32位整数:) (请注意,在硬件卸载的情况下可能会有大小限制)。
从用户空间更新
从用户空间更新散列映射是完全可行的(尽管一些非常特定的映射类型可能不允许这样做,但像are数组或散列映射这样的通用映射完全可以)。你会这样做:
命令行中的
bpftool,bpf()系统调用来完成的。https://stackoverflow.com/questions/60599317
复制相似问题