FAST基本的流水线由5个通用功能模块组成,可支持基本的OpenFlow转发功能。通过对基本流水线扩展,可以实现更加复杂的交换功能。

一、基本硬件流水线结构

FAST基本流水线包含通用分组解析(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编码中0XXXXXXX编码对应IPv4相关协议,1XXX XXXX编码对应IPv6相关协议。0000 0000表示未识别的协议。

目前GPP支持的PST编码类型如下:

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

Begin

Src_IP<=PHV[239:208]//26*8=208

Des_IP<= PHV[271:240]//30*8=240

Pro_type<=PHV[191:184];//23*8=184

Src_port<=PHV[287:272];//34*8=272

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

显然,FAST基本流水线只实现了最基本的分组处理功能,如何通过流水线扩展实现更加复杂的分组处理将在后续文章中介绍。


发表评论

电子邮件地址不会被公开。 必填项已用*标注