白皮书
构建BittWare的数据包解析器,HLS与P4的实现对比
概述
BittWare 的 SmartNIC Shell 和 BittWare 的 Loopback Example 都有一个数据包解析器/分类器,可以从数据包中提取协议字段。在本白皮书中,我们不仅要介绍我们的解析器,还要解释使用 HLS 构建和配置解析器如何比使用 P4 语言实现得更好。解析器代码可在 BittWare 开发人员网站上免费提供给 AMD UltraScale+ 用户,作为环回示例的一部分(2020 年 1 月可用)。
超越P4,为智能网卡编程
目前,BittWare SmartNIC Shell 的解析器组件是使用 AMD HLS C++ 开发环境构建的。但是,BittWare SmartNIC Shell 的早期版本通过 AMD SDNet 工具使用 P4 语言。
使用 P4 的一个原因是,它是一种新兴标准,在使用英特尔商品服务器的软件定义网络(SDN)用户中很受欢迎。不过,AMD 后来限制了 SDNet 的可用性。我们对 P4 的使用是专门针对 SmartNIC Shell 的最终用户的,因此这种限制导致我们不得不寻找一种更开放的解决方案。在使用 HLS 成功实现 RSS 之后,我们开始使用相同的 HLS 方法(特别是 Xilinx HLS C++ 环境)重新实现 SmartNIC Shell 解析器。
什么是数据包解析器?
在以太网上使用的协议对硬件的利用是一个挑战。这种挑战的存在是因为协议有许多可选字段。这些选项使寻找例如IP头的开始变得复杂。为什么呢?在IP头的情况下,前面可能有零、一或两个VLAN标签。也可以有MPLS标签。因此,硬件需要了解协议,以便找到IP头。硬件需要IP头,以便找到经常用于硬件过滤器和表格的IP地址。类似的问题在下一级也存在,因为IP头本身就有可选字段。
BittWare的HLS C++数据包解析器可以处理:
- 0至2个VLAN标签(旧的SDNet代码允许0或1)。
- 0到5个MPLS标签(BittWare的旧SDNet代码不能识别MPLS)。
- IP碎片
- IPv4头文件(非IPv6)
它假定端口ID在这些IP协议中可以找到:TCP, UDP, DCCP, 和 STCP
在基本上创建了两个版本的数据包解析器之后,我们注意到了使用P4与HLS C++之间的一些差异。总的来说,HLS的流程没有P4那么抽象,但这个工具却要成熟得多。
资源使用的详情见表:
特征 | P4/SDNet | HLS C++ |
---|---|---|
CLBs | 3,185 | 3,391 |
BRAM | 22 | 0 |
登记册 | 10,361 | 5,975 |
代码行数 | 206 | 1,154 |
你可以看到,在所有的FPGA资源中,HLS要么相似,要么更好。虽然源代码确实需要更多的行数,但其中一部分是受到注释和格式化的影响。然而,HLS的C++实现确实总是需要比P4多的代码行。但这是针对数据包解析器/分类器而言的,这属于P4所能描述的范围--HLS C++可以做得更多。HLS是非常通用的,几乎可以做任何事情。P4是非常专业的。
更妙的是,既然HLS的实现已经存在,任何修改它以消化以太网协议变化的后续工作都与在P4语言中进行修改的工作大致相同。这是因为我们的HLS C++实现的结构是对我们创建的低级分析器函数的一系列调用。这种方法类似于直接操作位于P4下的运行时。
如前所述,Loopback实例的源代码,包括其解析器块,可以通过BittWare开发者网站免费提供给Ultrascale++用户。这是一个很好的例子,说明了如何在HLS C++代码中使用AXI接口。想看看它但没有BittWare FPGA卡吗?请与我们联系,了解哪里可以买到。
什么是Tuple?
在以太网上使用的协议对硬件的利用是一个挑战。这种挑战的存在是因为协议有许多可选字段。这些选项使寻找例如IP头的开始变得复杂。为什么呢?在IP头的情况下,前面可能有零、一或两个VLAN标签。也可以有MPLS标签。因此,硬件需要了解协议,以便找到IP头。硬件需要IP头,以便找到经常用于硬件过滤器和表格的IP地址。类似的问题在下一级也存在,因为IP头本身就有可选字段。
BittWare的HLS C++数据包解析器可以处理:
- 0至2个VLAN标签(旧的SDNet代码允许0或1)。
- 0到5个MPLS标签(BittWare的旧SDNet代码不能识别MPLS)。
- IP碎片
- IPv4头文件(非IPv6)
它假定端口ID在这些IP协议中可以找到:TCP, UDP, DCCP, 和 STCP
P4是否会成为FPGA硬件的常见配置?
P4语言是为了用软件定义 "包转发数据平面"(或网络交换机)而创建的。该语言尤其与硬件供应商Barefoot Networks有关。P4语言与谷歌帮助推广的名为 "P4 Runtime "的东西不同。P4运行时提出了一个标准的运行时API,能够操作由P4编译的解决方案的控制平面。
P4确实使定义一个新协议的数据包分类器/解析器变得容易。P4还规定了一套完整的表查询功能,它可以重写流过的数据包,例如消除VLAN标签。
这是否意味着P4的灵活性将导致FPGA的采用?我们认为有几个原因反对这种情况发生。
在FPGA硬件上提供P4子集的商业选择是存在的,但它们目前的范围有限。此外,如前所述,商业条款使BittWare难以利用这些条款来创建一个我们可以随产品免费提供的示例程序。
值得注意的是,没有一个真实世界的FPGA应用可以完全用P4编写。例如,在一些例子中跟随我们的解析器的接收端缩放(RSS)块不能用P4编写。然而,HLS C++可以用来编写任何一个模块,甚至是结合这两个功能的单一模块。
另外,P4表查询函数基本上是用RTL或HLS C++编写的特定硬件运行时库的一个包装。程序员可以直接从HLS C++中调用这种运行时,而不会受到任何影响。
底线是,在同时使用P4和HLS C++来实现解析器之后,我们实际上更倾向于HLS C++的方法。目前还不清楚FPGA上对P4的需求是否会增长到足以支持一个成熟的工具。HLS C++可以做得更多,也更成熟。
HLS的可移植性和结论
空标题
我们希望对FPGA上数据包分析器的两个实现的解释,一个是用P4语言,另一个是用HLS C++,对评估你的正确方法有帮助。
最后一点是关于 FPGA 卡之间的可移植性。在我们基于 AMD FPGA 的板卡之间,HLS 提供了一种简单的方法,几乎不需要做任何改动。如果要转移到基于英特尔的板卡,如我们的 520N-MX,则需要更改源代码,特别是在编译器实用程序方面。不过,基本概念是相同的。在这两种情况下,我们都是根据我们对 FPGA 转换挑战的了解来构建 C++ 的。任意的 C++ 代码在 FPGA 中的运行效果都很差。但是,经过重组并使用实用程序的 C++ 代码却能很好地运行。AMD 或英特尔所需的更改非常相似,只是表达方式略有不同。
作为BittWare的SmartNIC外壳的一部分,我们的解析器可以帮助团队在我们的FPGA卡上快速建立网络包处理应用。了解更多关于我们卡的SmartNIC的信息,或与我们联系,讨论你的应用需求。
BittWare的Loopback例子重新部署了SmartNIC外壳的一个子集,我们可以免费提供。该子集包括我们的解析器库。
还有更多可读:获取应用说明
要求下载PDF文件
你在这个页面上看到的是解析器的基本概述,是SmartNIC Shell的一部分。在SmartNIC Shell的完整应用说明中有更多的细节,最重要的是它可以免费下载!请填写表格,要求获得PDF版本的完整应用说明。
"*"表示必填项目