AF_XDP

前言

本文翻译自https://www.kernel.org/doc/html/latest/networking/af_xdp.html,刚开始学AF_XDP,翻译或有纰漏,还请指出。

文中使用(斜体文字)标出了本人翻译中的疑问,后续围绕本文继续完善概念。

AF_XDP

概述

AF_XDP是优化的地址族,用于高性能包处理。

本文假定读者熟知BPF和XDP,如果对它们不熟悉,Cilium项目对其有一份优秀的指南cilium.readthedocs.io/en/latest/bpf/.

通过在XDP程序中使用XDP_REDIRECT返回值,可以用bpf_redirect_map()函数将数据帧重定向到其他支持XDP的网络设备,而AF_XDP套接字使XDP将数据帧重定向到用户空间程序的内存缓冲区成为可能。

AF_XDP套接字(AF_XDP socket, XSK)由基本的socket()系统调用创建,与XSK相关的环形缓冲区(ring)有两个:RX ring和TX ring。Rx ring和TX ring分别负责套接字数据包的接收和发送,分别由setsockopts XDP_RX_RING和XDP_TX_RING注册和分配大小。每个套接字必须有至少一个缓冲区。RX或TX缓冲区描述符指向内存中一个叫UMEM的数据缓存区,RX和TX可以共享相同的UMEM,这样数据包就不必在RX和TX之间复制。如果一个数据包因可能的重传需要被保存在缓存区一段时间,指向该数据包的描述符可以马上改变指向另一个(包?)并重用,这就再次避免了复制数据。

不指向另一个会怎么样?

UMEM由许多相同大小的块(chunks)组成,在ring中的描述符通过引用数据帧的地址来引用该数据帧,而这一地址就是整个UMUM内存域中的偏移量。用户空间的程序可以用任何适合的方式来对UMEM分配内存(如malloc、mmap、huge pages等),这一内存区域接下来由新的setsockopt XDP_UMUM_REG向内核注册。UMUM同样有着两个ring:FILL ring和COMPLETION ring。应用程序用FILL ring发送地址到内核,以向其内填充RX包数据。一旦每个数据包都被接收,对这些数据帧的引用将会在RX ring中出现。而COMPLETION ring则包含着内核已经传输完成、并可以再次由用户空间使用的RX或TX ring数据帧的地址,因此,出现在COMPLETION ring中的数据帧地址是之前使用TX ring传输过的地址。总体来说,RX和FILL ring用于接收路径,TX和COMPLETION ring用于发送路径。

最后,套接字使用bind()调用绑定到一个设备和其上指定的队列号,直到绑定完成,流量才开始流动。

如果需要的话,UMEM可以在进程间共享。如果一个进程需要共享UMEM,只需要跳过UMEM和对应两个ring的注册,在bind调用时使用XDP_SHARED_UMUM标识,并提交它想要共享的进程的XSK以及自己新创建的XSK,这一新的进程(到底指提交共享的还是新创建的?应该是新创建的吧)接下来就会在自己的RX ring中接收到指向该共享UMEM的数据帧的引用。注意,由于ring是单消费者/单生产者的结构(性能原因),新的进程必须用相关的RX和TX ring创建自己的套接字,因为它不能与其他进程共享(套接字?)。这也是每个UMEM只有一组FILL和COMPLETION ring的原因,由单个进程来处理UMEM。

那么数据包接下来是如何由XDP程序分发到XSK的呢?有一种BPF映射(map)叫XSKMAP(全称BPF_MAP_TYPE_XSKMAP),用户空间程序可以将XSK放到该映射中的任意位置,XDP程序就可以重定向数据包到映射中指定的值(XSK),此时,XDP会验证映射中该XSK确实被绑定到了该设备(XDP程序所在的设备?)以及ring序号,如果验证错误,那么这个数据包就会被丢弃。这也意味着目前为了通过XSK把任何流量导向用户空间,必须先加载XDP程序(并且在XSKMAP中有加载好的XSK)。

AF_XDP能够以两种不同模式运行:XDP_SKB和XDP_DRV(是想说XDP程序的运行模式吧?)。如果网卡驱动不支持XDP或加载XDP程序时指定了XDP_SKB模式,则运行在XDP_SKB模式,该模式由SKBs和通用XDP(generic XDP)支持,将数据复制到用户空间,是适用于任何网络设备的回退模式(通用模式?)。如果网卡驱动支持XDP,那么它将为AF_XDP提供更好的性能,但是用户空间同样会存在一份副本。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值