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