0731-84728105
15116127200
FAST入门(6)FAST硬件流水線(xiàn)之二
发布时间:2018-07-16
     FAST基本的流水線(xiàn)由5个通用(yòng)功能(néng)模块组成,可(kě)支持基本的OpenFlow转发功能(néng)。通过对基本流水線(xiàn)扩展,可(kě)以实现更加复杂的交换功能(néng)。
一、基本硬件流水線(xiàn)结构
     FAST基本流水線(xiàn)包含通用(yòng)分(fēn)组解析(GPP)、通用(yòng)关键字提取(GKE)、通用(yòng)匹配引擎(GME)、通用(yòng)转发动作(GAC)和通用(yòng)输出引擎(GOE)五个模块,以及一个分(fēn)组缓冲區(qū)(Buffer),如下图所示。由于Buffer对软件是不可(kě)见的,与具體(tǐ)的分(fēn)组处理(lǐ)功能(néng)无关,因此不是FAST的硬件模块,也没有(yǒu)MID编号。
     GPP将到达的分(fēn)组按照到达的先后顺序将分(fēn)组写入Buffer缓存,同时提取分(fēn)组的前128字节作為(wèi)分(fēn)组头向量(PHV)随分(fēn)组元数据(M)在模块间传递,模块GAC以此将分(fēn)组从Buffer读出,重新(xīn)与元数据组合,发往GOE模块。在GPP将分(fēn)组缓存,只在流水線(xiàn)中传递PHV的优点是简化流水線(xiàn)的设计,避免变長(cháng)报文(wén)对流水線(xiàn)处理(lǐ)性能(néng)的影响。
     M和PHV在Verilog中分(fēn)别定义為(wèi)256位和1024位的向量,KEY定义為(wèi)296位(IPv6五元组)的向量,因此上游模块使用(yòng)1个时钟周期即可(kě)将M、PHV以及KEY信息传递到下游模块。
二、流水線(xiàn)的处理(lǐ)流程
   (1)GPP模块
     GPP模块解析到达分(fēn)组的L2-L4层协议,将解析结果写入分(fēn)组元数据中8比特的PST字段。PST编码中0XXXXXXX编码对应IPv4相关协议,1XXX XXXX编码对应IPv6相关协议。0000 0000表示未识别的协议。
     目前GPP支持的PST编码类型如下:
     GPP模块同时负责把分(fēn)组送报文(wén)缓冲區(qū)按照先进先出的方式缓存,同时生成每个分(fēn)组的PHV,与分(fēn)组元数据一起向流水線(xiàn)下游传送。
   (2)GKE模块
     GKE负责根据元数据中德PST值,从PHV中提取查表关键字。当分(fēn)组PST确定时,关键字在PHV中具有(yǒu)确定的位置。例如,对于提取IPv4/TCP/UDP报文(wén)的五元组,可(kě)离線(xiàn)计算得:IPv4源IP地址到以太网帧起始的偏移量為(wèi)26(208bit)字节,目的IP偏移量為(wèi)30字节(240bit)。协议域偏移為(wèi)23字节(184bit),TCP/UDP源和目的端口号分(fēn)别為(wèi)34(272bit)和36(288bit)字节。显然,如果在关键字提取时需要TCP的SYN等标志(zhì)位,可(kě)以计算这些标志(zhì)位的偏移量,直接赋值即可(kě)。用(yòng)Verilog描述的IPv4五元组关键字提取代码如下图所示。
     GKE支持对IPv4/IPv6的TCP/UDP/ICMP五元组提取(ICMP没有(yǒu)端口号),其中IPv4和IPv6的关键字具有(yǒu)不同的格式。
   (3)GME模块
     GME模块实现类似TCAM的功能(néng),将包含五元组的key与TCAM中的带掩码的五元组规则进行匹配,返回匹配的FlowID,如果匹配不命中,FlowID為(wèi)全0。GME将返回的flowID信息填写到元数据的FlowID字段中。
     不同的FPGA平台上,GME的匹配有(yǒu)不同的实现方法,以及不同的规则数目和规则宽度等。实现方式也可(kě)能(néng)是使用(yòng)FPGA片外的TCAM芯片,或者FPGA片内的TCAM逻辑。
     由于GME输入的KEY可(kě)能(néng)有(yǒu)多(duō)种格式,因此GME讲KEY与元数据中协议类型(PST)字段合并组成查表关键字,软件在配置查表规则时,不同格式的规则前面要带上不同的PST编码。
   (4)GAC模块
     GAC模块包含Action表,通常表项的大小(xiǎo)与FlowID的宽度有(yǒu)关。例如系统支持4K条五元组标识的流,那么FlowID的宽度為(wèi)12,在GAC中的Action表也有(yǒu)4K项。每个Action表包含对分(fēn)组的转发操作,包括丢失,转发到特定输出端口,或送到特定的软件UA处理(lǐ)等。GAC根据转发操作相关更新(xīn)分(fēn)组元数据中的字段,信息同时将分(fēn)组从Buffer中读出,与元数据一起发给下游模块。
     GAC实现对分(fēn)组元数据中OutPort、Discard、DMID等域的修改,决定分(fēn)组的转发交换行為(wèi)。
   (5)GOE模块
     GOE模块负责FAST流水線(xiàn)输出分(fēn)组的处理(lǐ),主要包含以下2个功能(néng)。一是根据配置对FlowID/DMID标识流的令牌桶限速,例如作為(wèi)OpenFlow交换机实现时,GOE可(kě)以控制Packet-in分(fēn)组(DMID為(wèi)OpenFlow通道控制器)的流量,二是对丢弃分(fēn)组的计数。由于分(fēn)组在Buffer中是顺序存储的,因此即使GAC之前的模块不能(néng)随意丢弃分(fēn)组或者分(fēn)组元数据。GPP等模块如果决策要丢弃分(fēn)组时,需将分(fēn)组元数据中的Discard位置位,将DMID设置為(wèi)GOE的MID,这样分(fēn)组就会旁路掉GOE模块前其他(tā)模块的处理(lǐ),直到GOE模块。GOE模块实现对分(fēn)组的丢弃,并进行统计计数。
     显然,FAST基本流水線(xiàn)只实现了最基本的分(fēn)组处理(lǐ)功能(néng),如何通过流水線(xiàn)扩展实现更加复杂的分(fēn)组处理(lǐ)将在后续文(wén)章中介绍。
服務(wù)热線(xiàn)