VPP的crypto框架是VPP原生的一套数据加解密框架,其目的是为VPP框架中所有Graph node提供数据加密服务。VPP的Crypto框架包含一套为Graph node准备的用户API,包括创建、更新和删除密钥,以及处理加密工作等;该框架还包括一条逻辑简单且巧妙的crypto engine API,用于作为VPP Plugin的crypto engine来注册和上载回调函数,并根据每个crypto engine根据预设的优先级来决定某个算法的缺省engine回调函数。目前可用的VPP crypto engine有
crypto native engine:根据不同CPU特性和指令集所特别优化的plugin,性能最优但支持算法较少。
ipsecmb engine:基于intel-ipsec-mb库的plugin,仅支持英特尔的CPU。
openssl engine:支持算法最全面的纯软件实现,性能相比以上两个plugin相对弱一些。
可以看到,以上的engine均为软件实现。优点是逻辑结构较为简单,因为软件能实时返回密码运算结果,所以graph node可以立刻决定是否继续或中止对某个网络帧的流水线处理。然而,这一方式无法支持加密工作的卸载,如基于QAT的硬件卸载或基于多CPU Core合作的软件卸载等。为了填补这一空缺我们在VPP 20.05提出了VPP 异步crypto 框架,并在VPP 20.09对其进行了进一步完善。
01
VPP同步crypto框架
刚才介绍到,已有的VPP Crypto框架是同步软件实现,图1简单介绍了如何在VPP IPsec中使用crypto框架。
图1:VPP IPSec 使用 crypto 框架加密ESP Tunnel模式网络帧
如图,esp4-encrypt-tun是VPP的IPsec数据面处理的Graph Node。它将对接收到的网络帧进行SA查表,并将SA 中预存的crypto key索引号连同要加密的数据指针和长度一起提交给加密算法的缺省处理函数进行加密。加密结果将在处理完成后立刻返回给esp4-encrypt-tun,在将处理失败的网络帧丢弃后,其余帧将交由下一个graph node处理。
02
收发间卸载
在讨论如何将同步变成异步以前,我们首先需要介绍一下收发间卸载。
NIC的收发在某种程度上也属于CPU卸载范畴的一部分:CPU无需在二进制数据和光电信号之间进行转换,仅需要对二进制数据,及网络帧数据进行特定地址的读写即可完成网络帧的收发工作,光电信号的转换以及许多其他工作,如Checksum运算卸载,VXLan封装和解封卸载等,都是由NIC完成的。虽然NIC也需要一些时间完成收发工作,但并不需要让CPU一直等待其工作完成,而是和CPU并行地异步工作着。NIC对于能收发多少网络帧能立刻判定,因此CPU无需过多干预收发结果,只管读写即可。
那么,如果这类卸载发生在收发网络帧的中间呢?
这种网络帧收发之间的卸载,我们称为收发间卸载,恰恰是QAT的工作方式。CPU将加密的工作卸载给QAT,QAT在CPU的流水线之外并行地处理加密工作。并在另一个时间点将处理好的工作取回,并最终交由NIC进行发送。收发间卸载相比NIC卸载要相对复杂一些:CPU需要管理失败的加解密命令的结果,因为QAT的操作对象仅为内存而非网络帧,CPU需要自行管理QAT交互使用的内存;CPU也需要针对加解密操作的结果进行相应的处理;如非法的加密网络帧需要丢弃等。我们还需要一个独立于收网络帧之外的轮询(polling)操作,以便将QAT处理完成的数据及时取回。
03
VPP的异步crypto框架以及在VPP IPsec中的应用
要把图1的同步模式转变成异步模式,VPP的crypto 框架应该要有一个成双的enqueue和dequeue回调函数,同时底下应能有不同的async crypto engine来提供这些回调函数的指针。Esp4-encrypt-tun节点将需要加密的数据enqueue给cryptodev engine,并最终提交给QAT。我们还要增加了一个crypto dispatch node来轮询QAT VF,来取回加密好的网络帧并传递给esp4-encrypt-tun-post。籍此我们完成了esp4-encrypt-tun从同步到异步的转变,如图2所示。
图2:VPP IPSec 使用 Async crypto 框架加密ESP Tunnel模式网络帧
但光这样还不够。该图仅仅描述了IPsec ESP在TUNNEL模式下的加密工作流程。VPP Crypto 的异步框架还能:
支持多engine 。和同步的VPP Crypto框架一样,异步框架能让不同的算法由不同的engine来处理。
所有的graph node都能获取异步的crypto服务。它们仅需要想crypto dispatch节点告知自己在取回处理完成的网络帧时的下一跳节点名称。
Crypto dispatch节点在支持轮询模式的同时,还能在仅有限影响性能的前提下支持中断模式,这样能最大化VPP异步框架的适用性,如在容器中运行等。
最后,我们还提供基于DPDK Cryptodev API的高性能Cryptodev engine,通过其实现对QAT卸载的高效支持。
04
如何在VPP IPSec中使用异步crypto框架及DPDK Cryptodev Engine
首先我们要保证在VPP的startup.conf中拥有足够的QAT Virtual Function (VF)。因为一个VPP Worker线程将占用一个QAT VF的硬件队列,因此QAT VF的数量应不小于VPP Worker内核数量除以2。
VPP启动后,使用如下命令能看到QAT 硬件队列和VPP Worker线程的绑定关系
使用如下命令还可看到算法和engine的绑定关系
Engine 名后的“*”代表其为该算法的缺省engine,这时我们可以将缺省的engine从sw_scheduler变成dpdk_cryptodev
可以看到缺省engine 变成了DPDK Cryptodev
这时我们可以在IPsec中启动异步模式
自此所有的IPsec工作流都将以异步的方式进行处理。在VPP的show run命令输出可以看到多出来的用于处理IPsec异步模式的graph node。
我们还可以切换轮询或者中断模式(可选),中断模式下crypto dispatch节点仅在队列中还有网络帧未被取出时才会启用。使用中断模式将视网络情况略微影响性能,但能在没有网络帧要处理时尽量小地占用CPU。
原文标题:同步异步你说了算:VPP 的异步Crypto框架
文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。
责任编辑:haq
全部0条评论
快来发表一下你的评论吧 !