0731-84728105
15116127200
FAST入門(6)FAST硬件流水線之二
發布時間:2018-07-16
     FAST基本的(de)流水線由5個通用功能模塊組成,可(kě)支持基本的(de)OpenFlow轉發功能。通過對基本流水線擴展,可(kě)以實現更加複雜的(de)交換功能。
一(yī)、基本硬件流水線結構
     FAST基本流水線包含通用分組解析(GPP)、通用關鍵字提取(GKE)、通用匹配引擎(GME)、通用轉發動作(GAC)和(hé)通用輸出引擎(GOE)五個模塊,以及一(yī)個分組緩沖區(Buffer),如(rú)下圖所示。由于Buffer對軟件是不可(kě)見的(de),與具體的(de)分組處理(lǐ)功能無關,因此不是FAST的(de)硬件模塊,也沒有(yǒu)MID編号。
     GPP将到達的(de)分組按照到達的(de)先後順序将分組寫入Buffer緩存,同時提取分組的(de)前128字節作為(wèi)分組頭向量(PHV)随分組元數據(M)在模塊間傳遞,模塊GAC以此将分組從Buffer讀出,重新與元數據組合,發往GOE模塊。在GPP将分組緩存,隻在流水線中傳遞PHV的(de)優點是簡化流水線的(de)設計,避免變長(cháng)報文對流水線處理(lǐ)性能的(de)影響。
     M和(hé)PHV在Verilog中分别定義為(wèi)256位和(hé)1024位的(de)向量,KEY定義為(wèi)296位(IPv6五元組)的(de)向量,因此上遊模塊使用1個時鍾周期即可(kě)将M、PHV以及KEY信息傳遞到下遊模塊。
二、流水線的(de)處理(lǐ)流程
   (1)GPP模塊
     GPP模塊解析到達分組的(de)L2-L4層協議,将解析結果寫入分組元數據中8比特的(de)PST字段。PST編碼中0XXXXXXX編碼對應IPv4相關協議,1XXX XXXX編碼對應IPv6相關協議。0000 0000表示未識别的(de)協議。
     目前GPP支持的(de)PST編碼類型如(rú)下:
     GPP模塊同時負責把分組送報文緩沖區按照先進先出的(de)方式緩存,同時生成每個分組的(de)PHV,與分組元數據一(yī)起向流水線下遊傳送。
   (2)GKE模塊
     GKE負責根據元數據中德PST值,從PHV中提取查表關鍵字。當分組PST确定時,關鍵字在PHV中具有(yǒu)确定的(de)位置。例如(rú),對于提取IPv4/TCP/UDP報文的(de)五元組,可(kě)離(lí)線計算得:IPv4源IP地(dì)址到以太網幀起始的(de)偏移量為(wèi)26(208bit)字節,目的(de)IP偏移量為(wèi)30字節(240bit)。協議域偏移為(wèi)23字節(184bit),TCP/UDP源和(hé)目的(de)端口号分别為(wèi)34(272bit)和(hé)36(288bit)字節。顯然,如(rú)果在關鍵字提取時需要TCP的(de)SYN等标志位,可(kě)以計算這些标志位的(de)偏移量,直接賦值即可(kě)。用Verilog描述的(de)IPv4五元組關鍵字提取代碼如(rú)下圖所示。
     GKE支持對IPv4/IPv6的(de)TCP/UDP/ICMP五元組提取(ICMP沒有(yǒu)端口号),其中IPv4和(hé)IPv6的(de)關鍵字具有(yǒu)不同的(de)格式。
   (3)GME模塊
     GME模塊實現類似TCAM的(de)功能,将包含五元組的(de)key與TCAM中的(de)帶掩碼的(de)五元組規則進行(xíng)匹配,返回匹配的(de)FlowID,如(rú)果匹配不命中,FlowID為(wèi)全0。GME将返回的(de)flowID信息填寫到元數據的(de)FlowID字段中。
     不同的(de)FPGA平台上,GME的(de)匹配有(yǒu)不同的(de)實現方法,以及不同的(de)規則數目和(hé)規則寬度等。實現方式也可(kě)能是使用FPGA片外的(de)TCAM芯片,或者FPGA片內(nèi)的(de)TCAM邏輯。
     由于GME輸入的(de)KEY可(kě)能有(yǒu)多種格式,因此GME講KEY與元數據中協議類型(PST)字段合并組成查表關鍵字,軟件在配置查表規則時,不同格式的(de)規則前面要帶上不同的(de)PST編碼。
   (4)GAC模塊
     GAC模塊包含Action表,通常表項的(de)大小與FlowID的(de)寬度有(yǒu)關。例如(rú)系統支持4K條五元組标識的(de)流,那麽FlowID的(de)寬度為(wèi)12,在GAC中的(de)Action表也有(yǒu)4K項。每個Action表包含對分組的(de)轉發操作,包括丢失,轉發到特定輸出端口,或送到特定的(de)軟件UA處理(lǐ)等。GAC根據轉發操作相關更新分組元數據中的(de)字段,信息同時将分組從Buffer中讀出,與元數據一(yī)起發給下遊模塊。
     GAC實現對分組元數據中OutPort、Discard、DMID等域的(de)修改,決定分組的(de)轉發交換行(xíng)為(wèi)。
   (5)GOE模塊
     GOE模塊負責FAST流水線輸出分組的(de)處理(lǐ),主要包含以下2個功能。一(yī)是根據配置對FlowID/DMID标識流的(de)令牌桶限速,例如(rú)作為(wèi)OpenFlow交換機(jī)實現時,GOE可(kě)以控制Packet-in分組(DMID為(wèi)OpenFlow通道(dào)控制器)的(de)流量,二是對丢棄分組的(de)計數。由于分組在Buffer中是順序存儲的(de),因此即使GAC之前的(de)模塊不能随意丢棄分組或者分組元數據。GPP等模塊如(rú)果決策要丢棄分組時,需将分組元數據中的(de)Discard位置位,将DMID設置為(wèi)GOE的(de)MID,這樣分組就會旁路掉GOE模塊前其他模塊的(de)處理(lǐ),直到GOE模塊。GOE模塊實現對分組的(de)丢棄,并進行(xíng)統計計數。
     顯然,FAST基本流水線隻實現了最基本的(de)分組處理(lǐ)功能,如(rú)何通過流水線擴展實現更加複雜的(de)分組處理(lǐ)将在後續文章(zhāng)中介紹。