VPP 的异步Crypto框架

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 框架 vs. iptables 框架对比** #### **1. 概述** | **特性** | **VPP(Vector Packet Processing)** | **iptables** | |---------------|----------------------------------------------------------|--------------------------------------------------| | **开发方** | 思科(Cisco)贡献,现由 FD.io 维护 | Linux 内核原生工具(基于 Netfilter) | | **定位** | 高性能数据平面(用于 NFV/SDN/5G) | 传统防火墙/NAT 工具 | | **处理方式** | 向量化批处理(一次处理多个数据包) | 逐包串行处理 | | **性能** | 可达 10M~100M PPS(包/秒) | 通常 <1M PPS | | **延迟** | 极低(旁路内核,DPDK/AF_XDP 加速) | 较高(依赖内核协议栈) | --- #### **2. 架构对比** ##### **VPP 架构** ``` +-----------------------+ | 应用插件(路由/NAT等) | +-----------↑-----------+ | 向量化处理 +-----------------------+ | 高速 I/O(DPDK/AF_XDP)| +-----------------------+ ``` - **优势**:模块化、支持自定义插件,适用于云原生和电信网络。 ##### **iptables 架构** ``` +-----------------------+ | 用户态规则配置(iptables CLI)| +-----------↓-----------+ | 内核 Netfilter 框架 | +-----------↓-----------+ | 内核协议栈处理 | +-----------------------+ ``` - **优势**:简单易用,适合主机级防火墙和 NAT。 --- #### **3. 功能对比** | **功能** | **VPP** | **iptables** | |------------------|-----------------------------------|-----------------------------------| | **包过滤** | 支持(需插件) | 原生支持 | | **NAT** | 高性能 NAT44/NAT64 | 基础 SNAT/DNAT | | **路由** | 支持全动态路由协议(如 BGP) | 仅支持静态路由 | | **加密/解密** | 支持 IPsec/SSL 硬件加速 | 依赖内核 Crypto 模块 | | **负载均衡** | 支持 L4/L7 负载均衡 | 仅限简单 DNAT 负载均衡 | --- #### **4. 性能对比** - **VPP**: - 吞吐量:单核可达 10Gbps+ - 延迟:微秒级(适合 5G UPF、边缘计算) - **iptables**: - 吞吐量:通常低于 1Gbps(受内核协议栈限制) - 延迟:毫秒级 **测试示例(64B 小包):** ```bash # VPP 性能测试 vpp# test throughput packet-generator 10Gbps # iptables 性能测试 iptables -A INPUT -p tcp --dport 80 -j ACCEPT ``` --- #### **5. 典型应用场景** | **场景** | **VPP** | **iptables** | |------------------|---------------------------------|---------------------------------| | **5G 用户面(UPF)** | ✔️ 高性能数据转发 | ❌ 性能不足 | | **云原生网络** | ✔️ 集成 Kubernetes/OpenStack | ❌ 功能有限 | | **家庭路由器** | ❌ 过度复杂 | ✔️ 简单 NAT/防火墙 | | **企业防火墙** | ✔️(需定制开发) | ✔️ 直接可用 | --- #### **6. 如何选择?** - **选 VPP 如果**: - 需要超高性能(如电信级网络)。 - 深度定制数据平面(如开发自定义协议)。 - **选 iptables 如果**: - 快速配置主机防火墙/NAT。 - 对性能要求不高(如小型企业网络)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值