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框架相关推荐

  1. Kernel Crypto框架

    随着数字时代的发展,每天都有海量的数据产生,并且用户也越来越重视个人隐私数据的安全,从某种意义上讲,用户个人数据的价值正逐步高于设备本身.实现数据安全保护的基础是[密钥 + 加密算法]:对于加密算法, ...

  2. 异步爬虫框架与协程浅析

    异步爬虫框架与协程浅析 经典原文使用协成完成异步爬虫原文链接 根据分享原文链接. Python基于协程的实现,其实是利用了Python生成器的特性完成的,Python生成器的原理其实涉及到用户态绿色线 ...

  3. Sequelize 4.43.0 发布,基于 Nodejs 的异步 ORM 框架

    Sequelize 4.43.0 发布了,Sequelize 是一款基于 Nodejs 的异步 ORM 框架,它同时支持 PostgreSQL.MySQL.SQLite 和 MSSQL 多种数据库,很 ...

  4. android 学习随笔十二(网络:使用异步HttpClient框架)

    使用异步HttpClient框架发送get.post请求 在https://github.com/  搜索 asyn-http https://github.com/search?utf8=✓& ...

  5. celery 停止任务_celery异步任务框架

    目录 Celery 一.官方 二.Celery异步任务框架Celery架构图消息中间件任务执行单元任务结果存储 三.使用场景 四.Celery的安装配置 五.两种celery任务结构:提倡用包管理,结 ...

  6. AsyncQueryHandler 异步查询框架

    AsyncQueryHandler简介: 异步的查询操作帮助类,可以处理增删改(ContentProvider提供的数据) 使用场景: 在一般的应用中可以使用ContentProvider去操作数据库 ...

  7. [android] 异步http框架与实现原理

    介绍github上的异步http框架android-async-http loopj开发 获取AsyncHttpClient对象,通过new 调用AsyncHttpClient对象的get(url,r ...

  8. Disruptor是一个高性能的异步处理框架

    为什么80%的码农都做不了架构师?>>>    Disruptor是一个高性能的异步处理框架,或者可以认为是最快的消息框架(轻量的JMS),也可以认为是一个观察者模式实现,或者事件- ...

  9. Android 从零开始打造异步处理框架

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/52847872 本文出自[赵彦军的博客] 概述 封装尝试 Handler优化 线程优 ...

  10. 框架 go_go异步任务框架machinery,嗖嗖的[视频]

    hi,这次介绍一个 go 的异步任务框架 machinery. 和 Python 生态里的 celery 类似.视频里演示了它的简单使用.当我们有一些cpu密集计算任务,延迟任务等, 可以使用异步任务 ...

最新文章

  1. 双圆弧插值算法(三,代码实现)
  2. mysqldump远程备份mysql数据库方法
  3. 华为海思总裁致员工信:不再有换胎机会,必当科技自立!
  4. PS5穿越云层3D文字
  5. 设计模式--6大原则--开闭原则
  6. boost::copy_n相关的测试程序
  7. 自己搭建的邮件系统不能发往gmail、hotmail等问题解决
  8. Android开发之如何在debug模式下打出release正式包
  9. 树莓派python交互界面实例_玩转树莓派-RaspBerry,使用Python开发定制界面
  10. Redis配置文件配置
  11. 用httpPost对JSON发送和接收的例子
  12. 在ubuntu16.04下安装opencv3.4.5(超详细)
  13. 计算机编程自学怎么样?
  14. Linux安装命令_rpm
  15. windows10 C:\windows\system32\winlogon.exe自动关机
  16. 2021-11-26 pyautogui 配合雷电模拟器实现手机APP签到答题自动化
  17. 健身房健身需要什么装备,五款健身房必备运动耳机分享
  18. Git 配置别名 —— 让命令变得更简单
  19. 【MES】MES能为制造企业做什么,解决什么问题?
  20. apktool下载安装

热门文章

  1. linux 9 -- 交互式使用Bash Shell
  2. 【转】请求处理机制其二:Django中间件的解析
  3. jQuery自定义右键菜单
  4. java加解密之DES多种使用方式
  5. axios基于常见业务场景的二次封装
  6. html5-微格式-时间的格式
  7. 爬虫入门到精通-headers的详细讲解(模拟登录知乎)
  8. js 的强制 类型 转换cast, 伪对象?
  9. 关于在win8下开发c或者c++时,某些特殊情况
  10. 分布式系统设计之DB类(来自深空老大)