四行代碼定乾坤:硬件二層交換機設計(jì)與實現(xiàn)
發布時(shí)間:2022-11-04
“我OpenBox又回來(lái)了(le)!”
沉寂了(le)16個月,終于又提筆(bǐ)開(kāi)始寫《硬件二層交換設計(jì)與實現(xiàn)》。從(cóng)軟件設計(jì)到(dào)硬件設計(jì)需要這(zhè)麽長時(shí)間嗎?答(dá)案是肯定的,不僅需要,而且這(zhè)點時(shí)間還隻能(néng)初入Verilog代碼編程之門(mén)。
但(dàn)從(cóng)網絡實驗教學的角度來(lái)看(kàn),這(zhè)是不可接受的。故我們想換個思路,走走捷徑。然而這(zhè)一走,便走了(le)整整16月有餘。
所幸略有小(xiǎo)成,與君分享,共勉自(zì)學、自(zì)研、自(zì)證之艱辛與快(kuài)樂。
A)P4與Tofino
書上(shàng)或網上(shàng)能(néng)找到(dào)的内容請(qǐng)大(dà)家自(zì)行查找了(le)解。見:https://p4.org
B)FAST全軟件可編程平台
FAST架構在我們之前的文(wén)章中有介紹,該平台也(yě)是一種典型的SDN架構設計(jì),硬件數據平面主要包括FPGA OS和(hé)UM兩部分,核心邏輯處理(lǐ)在UM模塊中。UM又分成了(le)5個不同邏輯功能(néng)流水(shuǐ)線,
用(yòng)戶可以針對(duì)此流水(shuǐ)線進行改造升級或擴展新的流水(shuǐ)級功能(néng)。然而,使用(yòng)Verilog語言來(lái)開(kāi)發FPGA芯片功能(néng)着實是一件比較有難度的事(shì)情,至少在成爲一個合格的Verilog代碼工(gōng)程師之前來(lái)說,确實有比較漫長和(hé)艱辛的路程要走。
受P4編程思想的啓發,我們決定将FAST架構中的UM部分更換成具備P4開(kāi)發能(néng)力的硬件邏輯部件。故該平台依然采用(yòng)多核CPU加FPGA架構,P4邏輯全采用(yòng)FPGA編寫,所有功能(néng)和(hé)指令邏輯全在硬件實現(xiàn)。
C)基本功能(néng)
1.分組前96字節内,小(xiǎo)于128的任意bit位,任意多個PHV對(duì)象定義;
2.支持32字節Metadata對(duì)象編程,含16字節用(yòng)戶自(zì)定義Metadata内容;
3.分組前60字節内,任意bit位對(duì)象查表匹配,精确匹配與帶掩碼匹配,匹配字段支持輸入端口等Metadata字段;
4.每動作(zuò)支持14條指令,支持加、減、與、或、異或、取反等操作(zuò);
5.每個指令執行器中含16個臨時(shí)寄存器,支持臨時(shí)變量暫存與讀取,位寬支持1到(dào)64位;
6.支持有狀态的存儲寄存器對(duì)象定義與操作(zuò),存儲寄存器位寬支持1到(dào)64位,最大(dà)個數支持128個。支持多個寄存器對(duì)象編程;
7.支持對(duì)分組進行協議(yì)插入與删除,長度支持1到(dào)16字節;
8.動作(zuò)與指令均支持參數化配置,即可運行前實例化,也(yě)可運行時(shí)調整;
9.支持32種不同邏輯業務處理(lǐ)功能(néng)在線編譯、在線加載、在線配置、在線卸載,不影響其他(tā)業務邏輯;
10.提供P4後端編譯器,支持用(yòng)戶P4代碼編譯;
11.提供P4運行時(shí)配置管理(lǐ)工(gōng)具,支持用(yòng)戶流表配置、動作(zuò)配置和(hé)寄存器初始配置。
擁有上(shàng)述平台編程功能(néng)後,對(duì)硬件的設計(jì)要求便會(huì)變得較爲簡單。原來(lái)要花(huā)較長時(shí)間,寫較多代碼的功能(néng),現(xiàn)在可以簡單、快(kuài)速的實現(xiàn)。
A)設計(jì)原理(lǐ)
從(cóng)交換機的幾個功能(néng)步驟開(kāi)始,先實現(xiàn)源MAC地址的學習。從(cóng)平台功能(néng)分析,使用(yòng)寄存器部件比較合适。
拟定義一個端口與MAC地址的映射表,存儲在寄存器對(duì)象中,使用(yòng)源MAC地址作(zuò)爲寄存器對(duì)象的索引,分組輸入端口号作(zuò)爲該索引位置的值。在使用(yòng)目的MAC查表時(shí),亦使用(yòng)MAC地址作(zuò)爲索引進行查找,即可獲取該地址學習存儲的端口号。
由于MAC地址爲48位,本平台支持寄存器的深度有限,故本案例中僅取MAC地址的後4位作(zuò)爲索引。故實驗演示時(shí),要求測試主機的MAC地址尾數不同。
單播地址可以采用(yòng)上(shàng)述思路進行設備,那組播與廣播地址呢(ne),我們本案例拟采用(yòng)全泛洪的方式先來(lái)實現(xiàn)一個基礎版本。
想要做組播功能(néng)可以将組播協議(yì)配置規則送CPU處理(lǐ),CPU學習到(dào)入組和(hé)退組信息後,通過P4的運行時(shí)工(gōng)具進行組播MAC與相應端口号的規則配置即可。
B)代碼實現(xiàn)
action learn_forward()
{
MAC_PORT.regwrite((u8)hdr.eth.smac&0xF,std_meta.ioport);
std_meta.ioport = MAC_PORT.regread((u8)hdr.eth.dmac&0xF);
}
單播自(zì)學習與轉發
action mb_cast()
{
MAC_PORT.regwrite((u8)hdr.eth.smac&0xF,std_meta.ioport);
std_meta.ioport = ~std_meta.ioport;
}
多播泛洪
以上(shàng)爲硬件二層交換機(原型系統)全部業務邏輯功能(néng)代碼。是的,就是這(zhè)四行代碼!!!!
A)軟件核心代碼
B)編譯器結果
C)硬件配置
D)Ping通測試
C:\Users\Administrator>ping 192.168.1.198
正在 Ping 192.168.1.198 具有 32 字節的數據:
來(lái)自(zì) 192.168.1.198 的回複: 字節=32 時(shí)間<1ms TTL=127
來(lái)自(zì) 192.168.1.198 的回複: 字節=32 時(shí)間<1ms TTL=127
來(lái)自(zì) 192.168.1.198 的回複: 字節=32 時(shí)間<1ms TTL=127
來(lái)自(zì) 192.168.1.198 的回複: 字節=32 時(shí)間<1ms TTL=127
物質守恒、能(néng)力守恒,苦難亦然守恒。
爲了(le)讓學生們在我們平台編寫硬件邏輯少些(xiē)痛苦,我們艱苦奮鬥了(le)16個月,對(duì)P4的原理(lǐ)、代碼和(hé)編譯器進行了(le)仔細琢磨、分析和(hé)領悟。我們認爲P4是一門(mén)較爲優秀的編程語言,更是一種硬件編程的創新思路和(hé)具體表達形式。我們無法去破解P4的硬件實現(xiàn),固然也(yě)無從(cóng)參考,而是領悟P4編程方式的精髓理(lǐ)念後,采用(yòng)了(le)原有FAST架構和(hé)部分邏輯調整,并配置P4後端編譯适配,打造了(le)現(xiàn)如今的支持P4的FAST架構可編程平台。
本平台結合了(le)FAST架構與P4可編程的雙重優勢。支持用(yòng)戶在最底層硬件到(dào)最高(gāo)層軟件全方便的編程與驗證,而且編程語言均使用(yòng)C語言和(hé)類似C的P4語言,進一步降低(dī)了(le)學習與使用(yòng)難度。
下(xià)一步,做個硬件路由器?或者您有更美(měi)好(hǎo)的想法,我們可以試一試!
有需要開(kāi)發可編程硬件(FPGA、ASIC等)的P4後端編譯器,或獲得本平台介紹相關源碼的客戶,請(qǐng)與15116127200(微信同号)聯系,閱讀更多FAST相關文(wén)章請(qǐng)進入以下(xià)公衆号。