Amiya · 2021年05月13日

软件定义智能网卡FIA:分组处理流水线实现

软件定义智能网卡FIA:目标

软件定义智能网卡FIA:ASIC vs. FPGA

软件定义智能网卡FIA:架构

软件定义智能网卡FIA:分组处理流水线实现

软件定义智能网卡FIA:基于RMT的分组处理流水线

软件定义智能网卡FIA:原型

软件定义智能网卡FIA架构中可重构分组处理流水线RDP(Reconfigurable Datagram Pipeline)有多种实现方式,如通用网络分组处理流水线实现,以及基于RMT的可编程网络分组处理流水线实现。其中,通用网络分组处理流水线实现,可以采用开源的FAST基本流水线,主要由5个通用功能模块组成,可支持基本的openflow转发功能。通过对基本流水线扩展,可以实现更加复杂的交换功能。

RDP分组处理流水线结构

基本流水线包含通用分组解析(GPP)、通用关键字提取(GKE)、通用匹配引擎(GME)、通用转发动作(GAC)和通用输出引擎(GOE)五个模块,以及一个分组缓冲区(buffer)。由于Buffer对软件是不可见的,与具体的分组处理功能无关,因此不是FAST的硬件模块,也没有MID编号。

GPP将到达的分组按照到达的先后顺序将分组写入buffer缓存,同时提取分组的前128字节作为分组头向量(PHV)随分组元数据(M)在模块间传递,模块GAC以此将分组从buffer读出,重新与元数据组合,发往GOE模块。在GPP将分组缓存,只在流水线中传递PHV的优点是简化流水线的设计,避免变长报文对流水线处理性能的影响。

M和PHV在verilog中分别定义为256位和1024位的向量,KEY定义为296位(IPv6五元组)的向量,因此上游模块使用1个时钟周期即可将M、PHV以及KEY信息传递到下游模块。

流水线的处理流程

1)GPP模块

GPP模块解析到达分组的L2-L4层协议,将解析结果写入分组元数据中8比特的PST字段。PST编码中0XXX XXXX编码对应IPv4相关协议,1XXX XXXX编码对应IPv6相关协议。0000 0000表示未识别的协议。

目前GPP支持的PST编码类型如表所示:


PST编码协议类型(封装格式)
0000 0000未识别
0000 0001Eth/IPv4/TCP
0000 0010Eth/IPv4/UDP
0000 0011Eth/ARP
0000 0100ETH/IPv4/ICMP
0000 0100-0111 1111保留
1000 0001Eth/IPv6/TCP
1000 0010Eth/IPv6/UDP
1000 0011Eth/IPv6/ICMPv6
1101 0000-1111 1111保留







GPP模块同时负责把分组送报文缓冲区按照先进先出的方式缓存,同时生成每个分组的PHV,与分组元数据一起向流水线下游传送。

2)GKE模块

GKE负责根据元数据中的PST值,从PHV中提取查表关键字。当分组PST确定时,关键字在PHV中具有确定的位置。例如,对于提取IPv4/TCP/UDP报文的五元组,可离线计算得:IPv4源IP地址到以太网帧起始的偏移量为26(208bit)字节,目的IP偏移量为30字节(240bit)。协议域偏移为23字节(184bit),TCP/UDP源和目的端口号分别为34(272bit)和36(288bit)字节。显然,如果在关键字提取时需要TCP的SYN等标志位,可以计算这些标志位的偏移量,直接赋值即可。用Verilog描述的IPv4五元组关键字提取代码如下所示。


If (PST=8’h00000001 || PST=8’h00000010 )//IPv4 TCP/UDPBeginSrc_IP<=PHV[239:208];//26*8=208Des_IP<= PHV[271:240];//30*8=240Pro_type<=PHV[191:184];//23*8=184Src_port<=PHV[287:272];//34*8=272Des_Port<=PHV[303:288];//36*8=288 End

GKE支持对IPv4/IPv6的TCP/UDP/ICMP五元组提取(ICMP没有端口号),其中IPv4和IPv6的关键字具有不同的格式。

3)GME模块

GME模块实现类似TCAM的功能,将包含五元组的key与TCAM中的带掩码的五元组规则进行匹配,返回匹配的FlowID,如果匹配不命中,FlowID为全3F。GME将返回的flowID信息填写到元数据的FlowID字段中。

不同的FPGA平台上,GME的匹配有不同的实现方法,以及不同的规则数目和规则宽度等。实现方式也可能是使用FPGA片外的TCAM芯片,或者FPGA片内的TCAM逻辑。

由于GME输入的KEY可能有多种格式,因此GME的KEY与元数据中协议类型(PST)字段合并组成查表关键字,软件在配置查表规则时,不同格式的规则前面要带上不同的PST编码。

4)GAC模块

GAC模块包含Action表,通常表项的大小与FlowID的宽度有关。例如系统支持4K条五元组标识的流,那么FlowID的宽度为12,在GAC中的Action表也有4K项。每个Action表包含对分组的转发操作,包括丢失,转发到特定输出端口,或送到特定的软件UA处理等。GAC根据转发操作相关更新分组元数据中的字段,信息同时将分组从buffer中读出,与元数据一起发给下游模块。

GAC实现对分组元数据中OutPort、discard、DMID等域的修改,决定分组的转发交换行为。

5)GOE模块

GOE模块负责分组处理流水线输出分组的处理,主要包含以下2个功能。一是根据配置对FlowID/DMID标识流的令牌桶限速,例如作为Openflow交换机实现时,GOE可以控制Packet-in分组(DMID为openflow通道控制器)的流量,二是对丢弃分组的计数。由于分组在Buffer中是顺序存储的,因此即使GAC之前的模块不能随意丢弃分组或者分组元数据。GPP等模块如果决策要丢弃分组时,需将分组元数据中的discard位置1,将DMID设置为GOE的MID,这样分组就会旁路掉GOE模块前其他模块的处理,直到GOE模块。GOE模块实现对分组的丢弃,并进行统计计数。

小结

软件定义智能网卡FIA中可重构分组处理流水线RDP采用FAST流水线实现,简化了FIA设计实现复杂度,同时,开源的FAST模型也有利于第三方开发自己的硬件加速模块。

作者:珠穆朗玛2048
来源:https://zhuanlan.zhihu.com/p/362566358

更多FPGA智能网卡相关技术干货请关注FPGA加速器技术专栏。

推荐阅读
关注数
1609
内容数
22
阐述CPU性能瓶颈问题如何破解,FPGA如何突围
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息