0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何在VPP IPSec中使用异步crypto框架?

FPGA之家 来源:DPDK与SPDK开源社区 作者:DPDK与SPDK开源社区 2021-04-02 17:57 次阅读

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框架。

a1681868-92eb-11eb-8b86-12bb97331649.png

图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所示。

a18c31ee-92eb-11eb-8b86-12bb97331649.png

图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。

a1eb61aa-92eb-11eb-8b86-12bb97331649.png

VPP启动后,使用如下命令能看到QAT 硬件队列和VPP Worker线程的绑定关系

a205d346-92eb-11eb-8b86-12bb97331649.png

使用如下命令还可看到算法和engine的绑定关系

a22ad7f4-92eb-11eb-8b86-12bb97331649.png

Engine 名后的“*”代表其为该算法的缺省engine,这时我们可以将缺省的engine从sw_scheduler变成dpdk_cryptodev

a24d79bc-92eb-11eb-8b86-12bb97331649.png

可以看到缺省engine 变成了DPDK Cryptodev

a26cf918-92eb-11eb-8b86-12bb97331649.png

这时我们可以在IPsec中启动异步模式

a2a62e40-92eb-11eb-8b86-12bb97331649.png

自此所有的IPsec工作流都将以异步的方式进行处理。在VPP的show run命令输出可以看到多出来的用于处理IPsec异步模式的graph node。

a2c31d02-92eb-11eb-8b86-12bb97331649.png

我们还可以切换轮询或者中断模式(可选),中断模式下crypto dispatch节点仅在队列中还有网络帧未被取出时才会启用。使用中断模式将视网络情况略微影响性能,但能在没有网络帧要处理时尽量小地占用CPU。

原文标题:同步异步你说了算:VPP 的异步Crypto框架

文章出处:【微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10824

    浏览量

    211098
  • VPP
    VPP
    +关注

    关注

    0

    文章

    7

    浏览量

    9491

原文标题:同步异步你说了算:VPP 的异步Crypto框架

文章出处:【微信号:zhuyandz,微信公众号:FPGA之家】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    何在智能手机系统中使用bq27505

    电子发烧友网站提供《如何在智能手机系统中使用bq27505.pdf》资料免费下载
    发表于 10-17 10:21 0次下载
    如<b class='flag-5'>何在</b>智能手机系统<b class='flag-5'>中使</b>用bq27505

    IPSec VPN的含义与原理

    IPSec VPN(Internet Protocol Security Virtual Private Network),即基于IPSec协议的虚拟专用网络,是一种在公共网络上建立安全加密连接
    的头像 发表于 10-08 09:52 365次阅读

    何在MSP430™MCU中使用智能模拟组合

    电子发烧友网站提供《如何在MSP430™MCU中使用智能模拟组合.pdf》资料免费下载
    发表于 09-14 10:19 0次下载
    如<b class='flag-5'>何在</b>MSP430™MCU<b class='flag-5'>中使</b>用智能模拟组合

    何在反向降压-升压拓扑中使用TPS6290x

    电子发烧友网站提供《如何在反向降压-升压拓扑中使用TPS6290x.pdf》资料免费下载
    发表于 09-13 10:07 0次下载
    如<b class='flag-5'>何在</b>反向降压-升压拓扑<b class='flag-5'>中使</b>用TPS6290x

    何在汽车CAN应用中使用负边缘触发触发器节省电力

    电子发烧友网站提供《如何在汽车CAN应用中使用负边缘触发触发器节省电力.pdf》资料免费下载
    发表于 09-13 10:06 0次下载
    如<b class='flag-5'>何在</b>汽车CAN应用<b class='flag-5'>中使</b>用负边缘触发触发器节省电力

    InRouter与Juniper SRX如何建立IPSec隧道配置?

    Task Force (IETF) 定义的安全标准框架,在公网上为两个私有网络提供安全通信通道,通过加密通道保证连接的安全——在两个公共网关间提供私密数据封包服务IPSEC是一套比较完整成体系的VPN
    发表于 07-25 07:32

    IR915如何连接cisco L2tp over ipsec

    123456 //定义一个本地用户 3. IPSec配置crypto isakmp policy 10 //定义isakmp策略,注意路由器会按序号匹配策略所定义的参数,先匹配的先采用,如果一个
    发表于 07-25 06:36

    何在RTOS中使用spi_interface.c?

    何在 RTOS 中使用 spi_interface.c?
    发表于 07-10 06:29

    何在IDF框架中使用自定义的静态库和动态库?

    基于商业需要,我们需要在 ESP-IDF v4.0-rc 这个版本的IDF中开发与使用自定义库,有如下问题请协助: 1如何利用IDF框架编写自定义静态库和动态库? 2如何在IDF框架中使
    发表于 06-25 07:57

    请问cmakelists中的变量如何在程序中使用?

    大家好, 我有个问题请教,cmakelists.txt中的变量如何在程序中使用?比如以下cmakelists.txt文件中的PROJECT_VER变量,我如何在c程序中使用?试了很多办
    发表于 06-11 07:34

    鸿蒙Ability Kit(程序框架服务)【应用启动框架AppStartup】

    `AppStartup`提供了一种更加简单高效的初始化组件的方式,支持异步初始化组件加速应用的启动时间。使用启动框架应用开发者只需要分别为待初始化的组件实现`AppStartup`提供
    的头像 发表于 06-10 18:38 666次阅读

    何在测试中使用ChatGPT

    Dimitar Panayotov 在 2023 年 QA Challenge Accepted 大会 上分享了他如何在测试中使用 ChatGPT。
    的头像 发表于 02-20 13:57 717次阅读

    何在DAVE IDE中使用XMC7200?

    能否在 DAVE IDE 中为 XMC 7200 EVK KIT 构建应用程序。我尝试打开一个项目但它最多只能显示 XMC48000。如何在 DAVE IDE 中使用 XMC7200 请帮忙。
    发表于 01-26 06:32

    IPSec的基本知识

    IPSec 是一项标准的安全技术,它通过在数据包中插人一个预定义头部的方式,来保障 OSI 上层协议数据的安全。IPSec 主要用于保护网络层(IP)数据,因此它提供了网络层的安全性。
    的头像 发表于 12-22 11:07 1119次阅读
    <b class='flag-5'>IPSec</b>的基本知识

    何在Linux中使用htop命令

    本文介绍如何在 Linux 中使用 htop 命令。
    的头像 发表于 12-04 14:45 1898次阅读
    如<b class='flag-5'>何在</b>Linux<b class='flag-5'>中使</b>用htop命令