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