首页 > 其他分享 >dpdk下ipsec内联卸载(inline offload)测试

dpdk下ipsec内联卸载(inline offload)测试

时间:2024-07-27 16:56:38浏览次数:14  
标签:offload ESP Ctrl 端口 Command inline IPsec 数据包 dpdk

使用intel82599网卡完成。

介绍

本文介绍了数据平面开发套件 (DPDK)框架中的内联 IPsec 加速支持实现,特别关注英特尔® 82599 10 千兆以太网控制器系列的功能和支持。

内联 IPsec 可用于实现 IPsec 感知系统,该系统具有比旁路辅助和加速硬件更好的延迟,前提是支持的算法合适。

本文包含的背景信息将重点介绍 IPsec 的“后备”硬件加速与内联 IPsec 之间的差异(即数据包流差异以及应用程序端、性能和处理方面的预期差异)。

将提供设置测试系统、安装和运行 IPsec 网关应用程序的示例。

本文假设使用的DPDK版本是17.11或更高版本。

背景

DPDK 安全库提供了一个框架,用于管理和配置卸载到基于硬件的设备的安全协议操作。该库定义了通用 API 来创建和释放安全会话,这些会话可以支持完整的协议卸载以及与网络接口控制器 (NIC) 或加密设备的内联加密操作。

自 17.11 版以来,安全库就已包含在 DPDK 中,它引入了 API 和功能,可以添加对英特尔 82599 10 千兆以太网控制器系列上已有的内联加密 (IPsec) 加速的支持。DPDK IXGBE 驱动程序也进行了更新,支持内联 IPsec。

英特尔 82599 10 千兆以太网控制器系列仅支持 AES-GCM 128,因此支持的协议:

仅 ESP 身份验证:AES-128-GMAC(128 位密钥)
ESP 加密和认证:AES-128-GCM(128 位密钥)
IPsec安全网关示例应用程序也支持此功能,下面将详细说明。

数据包流
首先,让我们看一下数据包在系统中的流动和处理。
在这里插入图片描述
上面描述的数据包流显示了传入加密 IPsec 数据包的数据包处理阶段。在第一种情况下,使用旁路英特尔® QuickAssist 技术 (英特尔® QAT) 硬件加速器对其进行处理(解密和/或验证)。在第二种情况下,使用英特尔 82599 10 千兆以太网控制器中提供的内联 IPsec 硬件处理对其进行处理。

如上所述,处理的第二阶段(解密和/或身份验证)由网络控制器本身与数据包接收阶段相结合。 DPDK 应用程序仍需要处理封装安全有效负载 (ESP) 数据包的封装和解封装。

除数据包方向外,传出流程相同。

软件 API 和示例应用程序

现在,让我们看看软件 API、要求和使用模型。我们将使用IPsec 安全网关示例应用程序中的代码摘录,这些代码经过简化,清晰易懂,并且删除了错误处理。

首先,我们需要创建一个安全会话,从以下配置开始:

struct rte_security_session_conf sess_conf = {
    .action_type = RTE_SECURITY_ACTION_TYPE_INLINE_CRYPTO,
    .protocol = RTE_SECURITY_PROTOCOL_IPSEC,
    {.ipsec = {在这里插入代码片
        .spi = <SPI>,
        .salt = <Salt>,
        .options = { 0 },
        .direction = RTE_SECURITY_IPSEC_SA_DIR_INGRESS,
        .proto = RTE_SECURITY_IPSEC_SA_PROTO_ESP,
        .mode = RTE_SECURITY_IPSEC_SA_MODE_TUNNEL,
    } },
    .crypto_xform = <xforms>,
    .userdata = NULL,
};

接下来,创建安全会话:

struct rte_security_ctx *ctx = (struct rte_security_ctx *)
    rte_eth_dev_get_sec_ctx(<portid>);
rte_security_session *sec_session = 
    rte_security_session_create(ctx, &sess_conf, <session_pool>);

然后,创建一个 RTE_FLOW_ACTION_TYPE_SECURITY 流:

pattern[0].type = RTE_FLOW_ITEM_TYPE_ETH;
pattern[1].type = RTE_FLOW_ITEM_TYPE_IPV4;
pattern[1].mask = &rte_flow_item_ipv4_mask;
pattern[2].type = RTE_FLOW_ITEM_TYPE_ESP;
pattern[2].spec = &esp_spec; /*contains the SPI*/
pattern[2].mask = &rte_flow_item_esp_mask;

action[0].type = RTE_FLOW_ACTION_TYPE_SECURITY;
action[0].conf = sa->sec_session;
action[1].type = RTE_FLOW_ACTION_TYPE_END;
action[1].conf = NULL;

flow = rte_flow_create(portid, , <pattern>, , &<err>);

这样,配置就完成了,并且安全关联 (SA) 对于与所创建流匹配的传入 ESP 数据包处于活动状态。“rte_mbuf”结构中的卸载标志将通过设置 PKT_RX_SEC_OFFLOAD 标志来指示数据包是否以内联方式处理,如果发生任何错误,还将设置 PKT_RX_SEC_OFFLOAD_FAILED。

对于传出的数据包,编程类似,只是应用程序需要设置卸载标志 PKT_TX_SEC_OFFLOAD。

测试系统设置

除了 DPDK 和示例应用程序之外,我们还将使用 Python* scapy v2.4.0(数据包生成器)和 pycryptodome v3.6.0(提供 AES-GCM 支持)来生成明文和加密数据包。

将以下内容保存为 inline_ipsec.py:

from scapy.all import *

def main(argv):
    
    payload = 'test-' * 2000
    
    sa = SecurityAssociation(ESP, spi=5, crypt_algo='AES-GCM', 
            crypt_key='\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15'
                      '\x88\x09\xcf\x4f\x3d\xde\xad\xbe\xef', 
            auth_algo='NULL', auth_key=None,
            tunnel_header=IP(src='172.16.1.5', dst='172.16.2.5'))
    sa.crypt_algo.icv_size = 16
    
    try:
        opts, args = getopt.getopt(argv, 'c:i:s:e:',
                                   ['count=', 'iface=', 'size=', 'encrypt='])
    except getopt.GetoptError:
        sys.exit(2)


    maxcount = 1
    intface = "enp2s0f0"
    paysize = 64
    do_encrypt = True

    for opt, arg in opts:
        if opt in ("-c", "--count"):
            maxcount = arg
        if opt in ("-i", "--iface"):
            intface = arg
        if opt in ("-s", "--size"):
            paysize = arg
        if opt in ("-e", "--encrypt"):
            if arg == '0' or arg == 'False':
                do_encrypt = False

    p = IP(src='192.168.105.10', dst='192.168.105.10')
    p /= "|->"
    p /= payload[0:(int(paysize) - 6)]
    p /= "<-|"
    p = IP(str(p))
    
    if do_encrypt:
        e = sa.encrypt(p)
    else:
        e = p
    
    eth_e = Ether()/e
    
    sendp(eth_e, iface=intface, count=int(maxcount))
        
if __name__ == "__main__":
    exit(main(sys.argv[1:]))

测试系统配置如下图所示。

在这里插入图片描述
该配置使用两个英特尔® 82599ES 10 千兆以太网控制器双端口卡,如上所示连接。

在此特定配置中,卡 1 端口将分配给 DPDK 驱动程序,端口 0 BDF 06:00.0 和端口 1 BDF 06:00.1。卡 0 端口将分配给内核驱动程序,标识为 enp2s0f0 和 enp2s0f1。请注意,在其他系统中,地址和端口名称可能不同。

根据此数据创建 IPsec 示例应用配置,并将其保存为名为 inline.cfg 的文件。例如:

#SP IPv4 rules
sp ipv4 out esp protect 1005 pri 1 dst 192.168.105.0/24 sport 0:65535 dport 0:65535

#SA rules
sa out 1005 aead_algo aes-128-gcm aead_key 2b:7e:15:16:28:ae:d2:a6:ab:f7:15:88:09:cf:4f:3d:de:ad:be:ef \
mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \
port_id 1 \
type inline-crypto-offload \

sa in 5 aead_algo aes-128-gcm aead_key 2b:7e:15:16:28:ae:d2:a6:ab:f7:15:88:09:cf:4f:3d:de:ad:be:ef \
mode ipv4-tunnel src 172.16.1.5 dst 172.16.2.5 \
port_id 1 \
type inline-crypto-offload \

#Routing rules
rt ipv4 dst 172.16.2.5/32 port 1
rt ipv4 dst 192.168.105.10/32 port 0

然后按如下方式启动应用程序:

ipsec-secgw \
	-l 6,7 \
	-w 06:00.0 -w 06:00.1 \
	--log-level 8 --socket-mem 1024,0 --vdev crypto_null \
	-- -p 0xf -P -u 0x2 \
	--config="(0,0,6),(1,0,7)" -f ./inline.cfg

请注意,NULL 加密设备仅存在,因为应用程序需要“真正的”加密 PMD(出于遗留原因)。

测试 ESP 解密和解密数据包的转发

为了测试应用程序,在端口 1 上发送加密数据包:

python inline_ipsec.py -i enp2s0f1 -s 64 -c 32 -e 1

在监听端口 0 时:

tcpdump -i enp2s0f0 –vvX

在端口 0 上应该可以观察到解密的数据包:

10:31:00.636564 IP (tos 0x0, ttl 63, id 1, offset 0, flags [none], 
                    proto Options (0), length 84)
    192.168.105.10 > 192.168.105.10:  ip 64
	0x0000:  4500 0054 0001 0000 3f00 0100 c0a8 690a  E..T....?.....i.
	0x0010:  c0a8 690a 7c2d 3e74 6573 742d 7465 7374  ..i.|->test-test
	0x0020:  2d74 6573 742d 7465 7374 2d74 6573 742d  -test-test-test-
	0x0030:  7465 7374 2d74 6573 742d 7465 7374 2d74  test-test-test-t
	0x0040:  6573 742d 7465 7374 2d74 6573 742d 7465  est-test-test-te
	0x0050:  733c 2d7c                                s<-|

数据包流向如下:

端口 1 接收到 ESP 数据包。
端口 1 RX 队列包含已解密有效载荷的 ESP 数据包。
ESP 解封装。
包含解密有效负载的明文数据包在端口 0 上传输。

测试 ESP 加密

为了测试应用程序,在端口 0 上发送明文数据包:

python inline_ipsec.py -i enp2s0f0 -s 64 -c 32 -e 0

在监听端口 1 时:

tcpdump -i enp2s0f0 –vvX

在端口 1 上应该可以观察到加密数据包:

10:37:45.622669 IP (tos 0x0, ttl 64, id 0, offset 0, flags [none], 
                    proto ESP (50), length 140)
    172.16.1.5 > 172.16.2.5: ESP(spi=0x000003ed,seq=0x20), length 120
	0x0000:  4500 008c 0000 0000 4032 1f16 ac10 0105  E.......@2......
	0x0010:  ac10 0205 0000 03ed 0000 0020 0000 0000  ................
	0x0020:  0000 0020 fd78 c8f5 7fab 4fb3 5b98 7e79  .....x....O.[.~y
	0x0030:  81b0 b4f2 d796 ccd4 f0a7 b031 bb9b 9bde  ...........1....
	0x0040:  af18 767e 5d0f 73e3 bc82 4ea3 4afb 00eb  ..v~].s...N.J...
	0x0050:  6d02 a367 7a3a c2dd 6b64 74c1 5d41 bb45  m..gz:..kdt.]A.E
	0x0060:  7ac2 c1e0 0fb8 5f73 7fcd 4304 e396 32ea  z....._s..C...2.
	0x0070:  228e 22e5 4a3e ea72 88fb 13a7 e940 9346  ".".J>[email protected]
	0x0080:  4451 98cf 97fd 878c 96f0 f754            DQ.........T

数据包流向如下:

在端口 0 上接收到明文数据包。
ESP 封装。
数据包被放置在端口 1 上的 TX 队列中。
数据包在传输过程中由端口1加密。

新的改变

我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:

  1. 全新的界面设计 ,将会带来全新的写作体验;
  2. 在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;
  3. 增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;
  4. 全新的 KaTeX数学公式 语法;
  5. 增加了支持甘特图的mermaid语法1 功能;
  6. 增加了 多屏幕编辑 Markdown文章功能;
  7. 增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;
  8. 增加了 检查列表 功能。

功能快捷键

撤销:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜体:Ctrl/Command + I
标题:Ctrl/Command + Shift + H
无序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
检查列表:Ctrl/Command + Shift + C
插入代码:Ctrl/Command + Shift + K
插入链接:Ctrl/Command + Shift + L
插入图片:Ctrl/Command + Shift + G
查找:Ctrl/Command + F
替换:Ctrl/Command + G

合理的创建标题,有助于目录的生成

直接输入1次#,并按下space后,将生成1级标题。
输入2次#,并按下space后,将生成2级标题。
以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。

如何改变文本的样式

强调文本 强调文本

加粗文本 加粗文本

标记文本

删除文本

引用文本

H2O is是液体。

210 运算结果是 1024.

插入链接与图片

链接: link.

图片: Alt

带尺寸的图片: Alt

居中的图片: Alt

居中并且带尺寸的图片: Alt

当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。

如何插入一段漂亮的代码片

博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.

// An highlighted block
var foo = 'bar';

生成一个适合你的列表

  • 项目
    • 项目
      • 项目
  1. 项目1
  2. 项目2
  3. 项目3
  • 计划任务
  • 完成任务

创建一个表格

一个简单的表格是这么创建的:

项目Value
电脑$1600
手机$12
导管$1

设定内容居中、居左、居右

使用:---------:居中
使用:----------居左
使用----------:居右

第一列第二列第三列
第一列文本居中第二列文本居右第三列文本居左

SmartyPants

SmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:

TYPEASCIIHTML
Single backticks'Isn't this fun?'‘Isn’t this fun?’
Quotes"Isn't this fun?"“Isn’t this fun?”
Dashes-- is en-dash, --- is em-dash– is en-dash, — is em-dash

创建一个自定义列表

Markdown
Text-to- HTML conversion tool
Authors
John
Luke

如何创建一个注脚

一个具有注脚的文本。2

注释也是必不可少的

Markdown将文本转换为 HTML

KaTeX数学公式

您可以使用渲染LaTeX数学表达式 KaTeX:

Gamma公式展示 Γ ( n ) = ( n − 1 ) ! ∀ n ∈ N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N Γ(n)=(n−1)!∀n∈N 是通过欧拉积分

Γ ( z ) = ∫ 0 ∞ t z − 1 e − t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,. Γ(z)=∫0∞​tz−1e−tdt.

你可以找到更多关于的信息 LaTeX 数学表达式here.

新的甘特图功能,丰富你的文章

2014-01-07 2014-01-09 2014-01-11 2014-01-13 2014-01-15 2014-01-17 2014-01-19 2014-01-21 已完成 进行中 计划一 计划二 现有任务 Adding GANTT diagram functionality to mermaid
  • 关于 甘特图 语法,参考 这儿,

UML 图表

可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图:

张三 李四 王五 你好!李四, 最近怎么样? 你最近怎么样,王五? 我很好,谢谢! 我很好,谢谢! 李四想了很长时间, 文字太长了 不适合放在一行. 打量着王五... 很好... 王五, 你怎么样? 张三 李四 王五

这将产生一个流程图。:

链接 长方形 圆角长方形 菱形
  • 关于 Mermaid 语法,参考 这儿,

FLowchart流程图

我们依旧会支持flowchart的流程图:

Created with Raphaël 2.3.0 开始 我的操作 确认? 结束 yes no
  • 关于 Flowchart流程图 语法,参考 这儿.

导出与导入

导出

如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。

导入

如果你想加载一篇你写过的.md文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,
继续你的创作。


  1. mermaid语法说明 ↩︎

  2. 注脚的解释 ↩︎

标签:offload,ESP,Ctrl,端口,Command,inline,IPsec,数据包,dpdk
From: https://blog.csdn.net/funtasty/article/details/140488522

相关文章

  • 虚拟机编译安装 dpdk--运行helloworld
    DPDK技术介绍一,版本信息DPDK版本:dpdk-22.07操作系统:Ubuntu22.04.1LTS二、虚拟机ubuntu添加网卡1.2.显卡由enssx改为ethxsudonano/etc/default/grub找到GRUB_CMDLINE_LINUX=""改为GRUB_CMDLINE_LINUX="net.ifnames=0biosdevname=0"然后执行如下指令sudogr......
  • C++入门(3)inline函数与缺省参数
    一.inline函数当程序执行函数调用时,系统要建立栈空间,保护现场,传递参数以及控制程序执行的转移等等,这些工作需要系统时间和空间的开销。当函数功能简单,使用频率很高,为了提高效率,直接将函数的代码镶嵌到程序中。但这个方法有缺点,一是相同代码重复书写,二是程序的可读性往往没有......
  • gnu inline asm
    :::indexasmkeyword,assemblylanguageinC,inlineassemblylanguage,mixingassemblylanguageandC:::HowtoUseInlineAssemblyLanguageinCCodeTheasmkeywordallowsyoutoembedassemblerinstructionswithinCcode.GCCprovidestwoformsofi......
  • 内联函数(inline)
    ①概念引入多用于复用性强的函数(代码量较少具有特定功能的函数)坏处:让你的代码上下文很臃肿(冗余)好处:在复用性强的函数调用的时候直接插入函数代码段而不是进行函数跳转(编译器弄的),减少性能消耗提高运行效率。减少函数调用开销:函数调用涉及压栈、跳转等操作,会产生......
  • ecoAddRepeater -loc与-offLoadAtLoc的区别
    我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?拾陆楼知识星球入口 ecoAddRepeater-loc{xy}-cellBUF-netNET ecoAddRepeater-offLoadAtLoc{xy}-cellBUF-netNET 都是指定插buf/inv物理位置,区别在于前者用于插buf/inv驱动原始net所有的inputterm,后......
  • DPDK 关闭网口速率自动协商, 强制网口速率
    dpdk源码中的宏定义#defineETH_LINK_SPEED_FIXED(1<<0)//<Disableautoneg(fixedspeed)#defineETH_LINK_SPEED_10M_HD(1<<1)//<10Mbpshalf-duplex....要查看设备的支持速度能力,您可以调用rte_eth_dev_info_get,例如rte_eth_dev_info_get(port......
  • 深入理解C++中的常量和宏:const、#define、typedef和inline详解
    一、const 与 #define 的区别1.定义方式和类型const 定义的常量是有类型的变量。#define 只是文本替换,不带类型。constintMAX_VALUE=100;//MAX_VALUE是一个整数类型的常量#defineMAX_VALUE100//MAX_VALUE是一个文本替换,它不关联任何类型2.生效......
  • css32 CSS Layout - display: inline-block
    https://www.w3schools.com/css/css_inline-block.aspThedisplay:inline-blockValueComparedtodisplay:inline,themajordifferenceisthatdisplay:inline-blockallowstosetawidthandheightontheelement.Also,withdisplay:inline-block,thetop......
  • C++入门(3) 指针和引用的区别|引用的本质|引用小结|inline函数|缺省函数
    一,引用引用和指针的区别1,从语法规则上讲指针变量存储某个实例(变量或者对象)的地址;引用是某个实例的别名程序为指针变量分配内存空间;不为引用分配内存空间指针变量的值可以改变;引用一旦初始化就无法改变指针变量可以为NULL;但是没有空引用指针作为形参需要判断是否为空;引用......
  • Pytorch 如何使用 storage 实现参数 offload?
    在深入探讨PyTorch中的Storage类以及其在参数offload场景中的应用之前,让我们首先了解一下PyTorch和它的基础组件。PyTorch是一个广泛使用的开源机器学习库,它不仅提供了强大的计算图功能和自动梯度计算,还允许开发者直接操作底层数据结构,这其中就包括Storage。1.什么是......