白皮书

构建BittWare的数据包解析器,HLS与P4的实现对比

概述

BittWare的SmartNIC Shell和BittWare的Loopback Example的功能之一是一个数据包解析器/分类器,可以从数据包中提取协议字段。通过这篇白皮书,我们不仅要描述我们的解析器,还要解释使用HLS来构建和配置它如何比使用P4语言实现得更好。解析器的代码可在BittWare开发者网站上免费提供给Xilinx UltraScale+的用户,作为我们回环实例的一部分(2020年1月上市)。

超越P4,为智能网卡编程

今天,BittWare的SmartNIC Shell的解析器组件是使用Xilinx HLS C++开发环境建立的。但是BittWare的SmartNIC Shell的早期版本通过Xilinx SDNet工具使用P4语言。

使用P4的一个原因是,它是一个新兴的标准,在商品英特尔服务器上拥抱软件定义网络(SDN)的人中很受欢迎。然而,赛灵思后来限制了SDNet的可用性。我们对P4的使用是专门针对SmartNIC Shell的终端用户的,所以这种限制导致我们要寻找一种更开放的解决方案。在我们使用HLS实现RSS的成功之后,我们有动力使用同样的HLS方法(特别是Xilinx HLS C++环境)重新实现SmartNIC Shell解析器。

本白皮书的PDF版本

什么是数据包解析器?

在以太网上使用的协议对硬件的利用是一个挑战。这种挑战的存在是因为协议有许多可选字段。这些选项使寻找例如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/SDNetHLS C++
CLBs3,1853,391
BRAM220
登记册10,3615,975
代码行数2061,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卡之间的可移植性。在我们基于Xilinx FPGA的卡之间,HLS提供了一种简单的方法,几乎不需要任何改变。对于转移到基于英特尔的卡,例如我们的520N-MX,将需要改变源代码,特别是在复杂的pragmas方面。然而,基本概念是相同的。在这两种情况下,我们都是根据我们对FPGA翻译挑战的了解来构建C++。任意的C++代码在FPGA中的运行情况会很差。然而,经过重组并涂上灵动词的C++代码运行得非常好。Xilinx或Intel所需要的改变非常相似,只是表达方式有些不同。

作为BittWare的SmartNIC外壳的一部分,我们的解析器可以帮助团队在我们的FPGA卡上快速建立网络包处理应用。了解更多关于我们卡的SmartNIC的信息,或与我们联系,讨论你的应用需求。

BittWare的Loopback例子重新部署了SmartNIC外壳的一个子集,我们可以免费提供。该子集包括我们的解析器库。

还有更多可读:获取应用说明

要求下载PDF文件

你在这个页面上看到的是解析器的基本概述,是SmartNIC Shell的一部分。在SmartNIC Shell的完整应用说明中有更多的细节,最重要的是它可以免费下载!请填写表格,要求获得PDF版本的完整应用说明。

"*"表示必填项目

名称*
请检查这是一个有效的电子邮件,因为PDF将使用这个地址发送。
地址和城市*