摘要:P4語言極大地改變了網絡領域,因為它可以快速描述和實現新的網絡應用程序。盡管可以使用P4語言描述各種各樣的應用程序,但是當前的可編程開關體系結構對P4程序施加了很大的限制。為了解決這個缺點,人們已經探索了將FPGA作為P4應用的潛在目標。P4應用程序使用三種抽象來描述:數據包解析器,匹配操作表和數據包逆解析器,后者使用匹配操作表的結果重新組合輸出數據包。盡管FPGA上的數據包解析器和匹配表的實現已在文獻中得到了廣泛報道,但對于數據包逆解析器并沒有提出一般的設計原理。
?
實際上,在FPGA上實現高速高效的逆解析器仍然是一個懸而未決的問題,因為它需要大量的互連,并且必須針對P4程序量身定制該體系結構。 ?
因此,在一些在FPGA上實現P4應用程序的工作中,逆解析器消耗了大量的芯片資源。因此,在本文中,我們通過介紹FPGA上高效和快速的逆解析器的設計原理來解決這個問題。 ?
作為一個神器,我們將介紹一種可通過P4程序生成高效的,可診斷的逆解析器架構的工具。我們的設計已通過基于cocotb的框架進行了驗證和仿真。最終的架構在Xilinx Ultrascale + FPGA上實現,并支持200 Gbps以上的吞吐量,同時與其他解決方案相比將資源使用量減少了近10倍。 ?
CCS概念:
? 硬件→可重新配置的邏輯應用程序;?
? 計算機系統組織→可重構計算;高級語言架構;
? 網絡→編程接口。 ?
?
01
INTRODUCTION
P4域特定語言(DSL)[6]重塑了網絡域,因為它允許描述具有很大靈活性的自定義數據包轉發應用程序。使用FPGA卸載網絡任務的興趣日益濃厚。例如,微軟已經在其數據中心部署了FPGA,以實現Azure服務器的數據平面[8]。網絡內計算是最近考慮使用FPGA的另一種途徑[20]。 ?
另外,最近的一些工作利用FPGA可重配置性來創建可編程數據平面并實現P4應用[5、13、21]。 ? 如圖1所示,P4應用程序包含三個抽象:數據包解析器,處理階段(匹配動作表)和數據包逆解析器(第2.2節)。盡管已經廣泛探索了FPGA上高效數據包解析器的設計[3、5、19],但很少有精力致力于高效數據包逆解析器的實現。首先,據我們所知,僅一篇論文涵蓋了該主題[7]。然而,Cabal等人[7]僅報告了100 Gbps數據包逆解析器的FPGA資源消耗,而未涵蓋設計原理和微體系結構細節。 ?
第二,如Luinaud等[16]觀察到,數據包逆分解器可能會消耗超過80%的資源來實現一個完整的流水線,這會危害FPGA來實現更復雜的P4應用程序的能力。 ?
本文介紹了一種開源代碼解決方案,可在FPGA上生成高效且高速的數據包逆解析器。它為FPGA數據包逆解析器的設計原理奠定了基礎。它包括一個體系結構和一個編譯器,可從P4程序生成一個逆解析器。 ?
用Python描述了逆解析器編譯器(第4節),并為提出的逆解析器體系結構生成了可綜合的VHDL代碼。 ?
生成的架構利用了FPGA固有的可配置性,從而避免了無法在FPGA上有效實現的硬件構造,例如交叉開關或桶形移位器[1,25]。
仿真環境基于cocotb [11],它允許使用幾個現成的Python包(例如Scapy)來生成測試用例。另外,可以將測試中的設計與虛擬網絡接口[12]連接起來。結果,可以使用P4行為參考模型來進行行為驗證[17]。 ?
已針對各種數據包頭評估了生成的體系結構。評估顯示,與最新解決方案(第5節)相比,生成的逆解析器支持200 Gbps以上的數據包吞吐量,同時將資源使用量減少10倍以上。 ?
本文的貢獻如下:
? 利用FPGA可配置性(§3)的逆解析器架構;
? 開源P4-to-VHDL數據包逆解析器編譯器(第4節);
? 基于cocotb的仿真環境,可簡化逆解析器驗證(第5節)。 ?
02
數據包處理
? 本節介紹P4語言以及如何組織P4程序組件來描述數據包處理。
>2.1 P4語言
P4 [6]是命令性DSL,用于描述可編程數據平面上的自定義數據包處理。
· 2.1.1 P4程序概述
構成P4程序的組件有四個:標頭,解析器,控制和switch。報頭是由特定寬度的字段和有效位組成的結構。標頭的結構用于定義可以由P4程序處理的標頭集。解析器塊表示順序和提取包頭的方式。控制塊描述了對標頭執行的操作。
·2.1.2?控制操作
在控制塊中,可以執行多種操作類型來修改標頭。逆解析器需要關注兩個特定的操作setValid和setInvalid,這兩個操作可分別用于將標頭有效性位設置為有效或無效。 ? ?
在P4中,控制塊還實現了解析邏輯。這些塊由一系列的emit語句組成。首先,這些語句的順序決定了標題的發出順序。 ?
其次,僅在設置了有效位的情況下才發送頭。
由于發出語句的順序決定了報頭的發出順序,并且由于可以由先前的控制塊更改有效性位,因此逆解析器必須能夠在運行時插入或刪除報頭。
>2.2 P4程序組件
本文考慮了Bená?ek等人提出的交換結構[5]由三部分組成:解析器,處理部分和逆解析器,如圖1所示。 ?
解析器。
解析器將數據包作為輸入,并生成數據包頭矢量(PHV)和數據包有效負載。在我們的設計中,我們假設PHV由兩部分組成:包含標頭數據的PHV_data總線和指示每個標頭組件有效性位的位圖矢量PHV_valid總線。我們還假設數據包有效負載是通過流總線發送的,第一個字節位于位置0。 ?
處理過程。
處理部分從解析器中獲取PHV作為輸入,并輸出修改后的PHV,并將其轉發給逆解析器。PHV上的操作可以是標頭數據修改或標頭有效性位更改。 ?
逆解析器。
逆解析器模塊將來自處理部分的PHV和來自解析器的有效負載作為輸入。它輸出要在流式總線上發送的數據包。 ?
03
Deparser架構原則
在本節中,我們介紹Deparser架構原則。首先,我們介紹一個Deparser抽象機。其次,我們介紹了Deparser I / O信號。第三,我們介紹了擬議的Deparser的微體系結構。我們所有的設計選擇都使用FPGA固有的可配置性,并為Deparser編譯器提供可配置的模塊。
>3.1 Deparser抽象機
Deparser抽象機如圖2所示。在此體系結構中,我們假設PHV已緩沖并與PHV有效向量一起到達了Deparser。 ?
算法1展示了PHV移位器模塊的偽代碼,而算法2展示了有效載荷移位器。 ?
在FPGA上實現逆解析器的主要限制因素是頭插入所需的大量互連和桶形移位器。為了限制這些塊的使用,我們基于標頭和有效載荷構造了一個新數據包。因此,由于可以在編譯時完全推斷出P4解析邏輯,并且由于FPGA是可重新配置的,因此我們為指定的P4程序定制了逆解析器架構,以減輕這些限制因素。 ?
現在,我們介紹了Deparser的輸入和輸出。
>3.2?輸入和輸出
該逆解析器具有3個輸入和1個輸出。輸出Pkt_out和輸入有效負載是AXI4流總線[2]。這兩個總線的數據寬度是一個編譯時間參數。兩個輸入PHV_data和PHV_valid分別包含標題數據和要解析的有效性位。在編譯P4應用程序時,將確定PHV_data和PHV_valid的寬度。
>3.3?微體系結構細節
在內部,逆解析器是圍繞三個塊構建的:PHV移位器,有效負載移位器和選擇器。PHV移位器獲取PHV_data和PHV_valid作為輸入,并輸出要發送的頭幀。 ?
有效載荷移位器接收有效載荷和PHV_valid作為輸入,并生成有效載荷數據幀。有效負載移位器和PHV移位器都輸入到選擇器。選擇器根據有效負載移位器和PHV移位器接收到的狀態生成Pkt_out幀。 ·
3.3.1 PHV移位器
PHV移位器將PHV位移位以構建數據包。它由圖3所示的標頭移位器組成。標頭移位器的最大數量等于Pkt_out總線寬度。 ?
標頭移位器具有三個輸入:PHV_data,PHV_valid和啟動信號。它輸出:標頭數據,有效的標頭和最后的標頭。PHV_valid和啟動輸入連接到狀態機模塊。狀態機模塊驅動標題有效和標題最后輸出。PHV_data輸入連接到驅動頭數據輸出的多路復用器。多路復用器根據狀態機模塊的一個輸出選擇PHV_data的位之一。狀態機是從逆解析器圖(§4)以及多路復用器的輸入數量中得出的。
·?3.3.2有效負載轉換器
有效負載移位器將有效負載與發出的標題對齊。有效負載移位器的基本模塊如圖4所示。它以數據,Ctrl和Keep作為輸入,并輸出有效負載數據和有效負載保持信號。數據總線和Keep總線分別連接到Deparser的有效負載輸入總線的AXI tdata和tkeep信號。該總線的每個字節都連接到圖4中多路復用器1的一個輸入。
Keep信號的每個位都連接到多路復用器3的一個輸入。Ctrl信號確定應選擇多路復用器1和3的哪個輸入。最后,可以注冊多路復用器1和3的輸出,以將數據輸出延遲一個周期。多路復用器2和4選擇當前值或延遲值。Ctrl總線的值由在編譯時生成的較小且恒定的關聯內存設置。
· 3.3.3 選擇器
該模塊在有效負載移位器和PHV移位器之間選擇正確的輸出數據,并生成AXI4流輸出信號數據包數據,數據包保留和數據包最后。選擇器將有效負載移位器的輸出和PHV移位器的輸出作為輸入,如圖5所示。 ?
分組數據和分組保持信號由塊數據選擇分配。該塊被復制以分配所有分組數據位。 ?
根據輸入信號“具有有效負載”指示的有效負載的存在,“最后一個包”信號是“ PHV最后”或“有效負載最后”。
· 3.3.4 FPGA上的多路復用器
所呈現的不同構造塊高度依賴于FPGA上的多路復用器實現。我們選擇使用多路復用器,因為它們已在FPGA上有效實現。實際上,一個16:1的多路復用器在Xilinx FPGA上消耗了一個切片[23]。雖然擁有一個非常大的多路復用器會變得很昂貴,但我們知道每個多路復用器的輸入數量將由編譯器減少到最少(第4.2.2節)。
04
生成逆解析器
逆解析器可以表示為有向無環圖(DAG)。為了生成Deparser DAG,使用p4c-bm2-ss編譯器將P4程序編譯為JSON文件[18]。生成的JSON文件然后用于生成一個Deparser DAG。可以優化此DAG,但是此優化留給以后的工作。本節的其余部分介紹了從Deparser DAG生成不同的Deparser模塊的過程。
>4.1 Deparser DAG
用于以太網,IPv4,IPv6,TCP和UDP數據包的Deparser DAG的示例如圖6所示。DAG的每個節點(不包括開頭和結尾)均表示一個報頭。DAG的每個箭頭表示可能要發出的下一個報頭。起始和結束之間的每個路徑代表可能發出的一組報頭。 ?
表1列出了所有可能的路徑。 ?
為了從DAG獲得逆解析器,有兩個部分。第一部分對deparser圖進行變換,以生成PHV移位器。第二部分使用deparser圖生成凈荷移位器。
>4.2 PHV移位器的生成
為了生成PHV移位器的標題移位器,我們構建了deparser圖的sub-DAG。每個子DAG代表一個報頭移位器塊(第3.3.1節)。由于大多數網絡協議都是按字節對齊的[5],因此我們為每個輸出字節構建一個sub-DAG。這允許合并PHV移位器狀態機,因此降低了逆解析器的體系結構復雜性。
· 4.2.1子DAG的生成
在子DAG中,每個節點都包含標題和要提取的字節。每個邊緣都指示要到達相應下一節點的報頭有效性條件。我們提出了算法3來生成子DAG。
所提出的算法通過遍歷De
parser圖來遍歷所有可能的標頭發射序列。我們將序列的每個字節分配給一個子DAG。當子DAG第一次處理來自特定標頭的字節時,我們將邊緣條件設置為此標頭。圖7顯示了使用算法3使用圖6的deparserDAG和128位輸出總線生成的子DAG。
· 4.2.2 Sub-DAG轉換
子DAG轉換分為兩個部分:標頭移位器多路復用器生成和狀態機生成。生成的多路復用器的輸入數量等于子DAG中的節點數量。狀態機是從子DAG派生的,其中每個節點代表一個狀態,每個邊沿代表一個過渡。頭字節位置被轉換為多路復用器的輸入位置。
>4.3有效載荷移位器關聯內存的創建
有效載荷移位器體系結構在第3.3.2節中介紹。我們使用該圖生成驅動Ctrl信號的關聯內存。使用deparser圖可以分兩步生成此內存。首先,我們通過查看Deparser圖表中開始和結束之間的所有可能路徑來確定可能的有效標頭的設置PH。集合PH中的每個元素ph由PHV_valid總線值和所有標頭寬度的總和組成。
?
建立集合PH后,對于每個可能的元素ph∈PH,我們為Ctrl分配一個值。對于每個可能的PHV_valid值,我們計算有效負載的偏移量。使用等式Offset = phw(mod w)獲得偏移,其中w是總線寬度,而phw表示發出的標頭的總位數。最后,我們為位于偏移值以下的每個有效負載移位器設置連接到圖4的多路復用器2和4的Ctrl位的值。 ?
05
結果
本節介紹了這項工作的結果。首先,我們描述實驗設置。然后,我們介紹了編譯器參數對生成的體系結構的影響。最后,我們將實現結果與以前的工作進行比較。
>5.1實驗設置
我們為以下三個協議棧生成了逆解析器:
?T1:以太網,IPv4 / IPv6,TCP / UDP
?T2:以太網,IPv4 / IPv6,TCP / UDP,ICMP / ICMPv6
?T3:以太網,2×VLAN,2×MPLS,IPv4 / IPv6, ?TCP / UDP,ICMP / ICMPv6
為了驗證我們的工作,我們基于cocotb框架[11]開發了一個仿真平臺。我們為AXI4-stream總線開發了cocotb驅動程序和監視器,從而使我們能夠快速評估不同的Deparser配置。Xilinx Vivado 2019.1用于合成和布局布線。為了實現可重復性,我們的代碼是開放的1。?
>5.2編譯器參數的影響
為了評估圖形復雜度的影響,我們從非優化的deparserDAG和逆解析器DAG(被視為優化的逆解析器DAG)生成并合成了逆解析器。使用解析器DAG作為逆解析器DAG是在P4 14 [9]中提出的實現。表2列出了針對Xilinx xcvu3p-3 FPGA時,每個綜合運行的Block RAM(BRAM),查找表(LUT)和觸發器(FF)的使用情況。結果表明,兩個因素主導著資源的使用:復雜度和數據總線寬度。
? 圖的復雜度。
圖形的復雜性受逆解析器代碼和圖形簡化程度的影響。由于簡化的Deparser DAG具有較少的邊,因此可減少其PHV_shifter的狀態機和有效負載移位器的關聯內存的大小。另外,每個子DAG需要更少的節點。結果,減少了PHV移位器復用器的輸入數量。例如,在T1中,有5個標頭。對于未優化的解析器DAG,這將導致總共32條路徑,而簡化的逆解析器圖僅包含7條路徑。
總線寬度。除了圖形復雜度之外,總線寬度還會影響資源消耗。提出的設計具有6個時鐘周期的延遲。而且,輸出數據包的等待時間是要發射的總報頭長度和總線寬度的函數。如表2所示,對于大型公交車,與較小型公交車相比,最壞情況的等待時間減少了。標頭發射的最壞情況延遲可以通過以上公式計算。 ?
同樣,增加總線寬度會增加LUT和FF的使用率。對于64位至256位不等的數據總線,資源使用量會略有增加,但是對于512位總線而言,這種增加變得非常重要。有兩個因素可以解釋這種較高的復雜性。首先,多路復用器的最小數量以每個輸出位1個多路復用器的速率增加。其次,對于較大的總線,由于標頭對齊,因此對于每個輸出幀,可以將更多標頭附加到總線上。 ?
因此,PHV移位器的可能輸入的重用較少。
>5.3實現結果
我們還為三個協議棧(具有512位數據總線)實現了非優化的Deparser DAG。我們將Deparser實施結果與Xilinx SDNet 2017.4 [24]和Bená?ek等人生成的Deparser進行了比較[5]。這些實現的結果顯示在表3中。我們的Deparser支持的吞吐量比Bená?ek等人提出的Deparser大20 Gpbs[5],同時將資源使用量減少5倍。 ?
與Xilinx SDNet [24]生成的逆解析器相比,在最壞的情況下,我們的逆解析器支持的吞吐量低60 Gbps,但我們的逆解析器使用的資源卻少了近10倍。 ?
比較實施和綜合結果時,資源消耗保持穩定。在T1和T2的情況下,布局布線后的性能幾乎相同。但是,可以通過對多路復用器進行流水線化來提高最大時鐘頻率,而不會顯著影響資源消耗。實際上,生成的體系結構每個切片消耗少于一個FF,而典型的切片則具有八個FF。結果,未使用的FF可以用于流水線復用器,因為它們不太可能由其他模塊驅動。
06
相關工作
Wang等提出了P4FPGA [22]。P4FPGA是面向中等性能FPGA(10 Gbps)的開源且與供應商無關的P4-to-FPGA編譯器。Ibanez等[14]建議將Xilinx SDNet P4編譯器[24]集成到現成的NetFPGA板[15]中。 ?
這項工作暴露了SDNet在實現逆解析器邏輯方面的局限性,事實證明這是所生成管道中資源消耗最大的模塊[16]。確實,根據我們的實驗,我們觀察到Xilinx SDNet無法優化分解圖中的不可達路徑。 ?
Bená?ek等?[5]提出了自動生成基于P4的數據包解析器和VHDL的逆解析器。這項工作擴展到了逆解析器之前對數據包解析器的研究[4]。但是,由于優化是從數據包解析器的設計中得出的,因此沒有涵蓋該逆解析器的體系結構和設計原理。其他數據包解析器研究包括[3,10,19]。. Gibb等 [10]介紹了數據包解析器的一般設計原理,但未涵蓋數據包逆解析器的情況。另外,Attig和Brebner [3]提出了一種語言來代表解析器,并帶有架構和編譯器,以在FPGA上實現它們。另外,圣地亞哥·達席爾瓦(Santiago da Silva)等人。[19]提議使用圖優化,類似于我們的工作,以簡化解析器管道。 ?
07
結論
P4改變了網絡格局,因為它允許表達自定義數據包處理。近年來,有幾篇著作將P4程序映射到FPGA。但是,這些工作大部分都集中在實現數據包解析器或match action階段。迄今為止,尚未提出關于FPGA的通用數據包逆解析原理。
確實,先前關于生成解析邏輯的工作的幼稚方法已經使該模塊的硬件實現在FPGA上非常昂貴。在這項工作中,我們通過介紹一套在FPGA上實現數據包逆解析器的設計原則來解決這個問題。在我們的工作中,我們提出了一種與FPGA微體系結構緊密耦合的體系結構,以利用FPGA固有的可配置性。 ?
我們還演示了簡化逆解析器圖以減少資源消耗的重要性。我們的結果表明,我們提出的去解析器體系結構跨越了100 Gbps的吞吐量邊界,同時將資源消耗減少了一個數量級。最后,為了實現可復制性,我們開源了我們的框架和基于cocotb的集成仿真環境。??
審核編輯:劉清
評論
查看更多