0731-84728105
15116127200
四行代碼定乾坤:硬件(jiàn)二層交換機(jī)設計與實現
發布時間:2022-11-04
     “我OpenBox又(yòu)回來了!” 沉寂了16個(gè)月(yuè),終于又(yòu)提筆開(kāi)始寫《硬件(jiàn)二層交換設計與實現》。從(cóng)軟件(jiàn)設計到(dào)硬件(jiàn)設計需要這麽長(cháng)時間嗎(ma)?答案是肯定的,不僅需要,而且這點時間還(hái)隻能(néng)初入Verilog代碼編程之門(mén)。 但從(cóng)網絡實驗教學的角度來看(kàn),這是不可接受的。故我們想換個(gè)思路(lù),走走捷徑。然而這一(yī)走,便走了整整16月(yuè)有餘。 所幸略有小(xiǎo)成,與君分享,共勉自(zì)學、自(zì)研、自(zì)證之艱辛與快樂。
     A)P4與Tofino
     書上(shàng)或網上(shàng)能(néng)找到(dào)的内容請大家自(zì)行查找了解。見(jiàn):https://p4.org
     B)FAST全軟件(jiàn)可編程平台
     FAST架構在我們之前的文章中有介紹,該平台也是一(yī)種典型的SDN架構設計,硬件(jiàn)數據平面主要包括FPGA OS和UM兩部分,核心邏輯處理在UM模塊中。UM又(yòu)分成了5個(gè)不同邏輯功能(néng)流水(shuǐ)線, 用戶可以針對此流水(shuǐ)線進行改造升級或擴展新的流水(shuǐ)級功能(néng)。然而,使用Verilog語言來開(kāi)發FPGA芯片功能(néng)著(zhe)實是一(yī)件(jiàn)比較有難度的事(shì)情,至少在成為(wèi)一(yī)個(gè)合格的Verilog代碼工(gōng)程師(shī)之前來說,确實有比較漫長(cháng)和艱辛的路(lù)程要走。
     受P4編程思想的啓發,我們決定将FAST架構中的UM部分更換成具備P4開(kāi)發能(néng)力的硬件(jiàn)邏輯部件(jiàn)。故該平台依然采用多(duō)核CPU加FPGA架構,P4邏輯全采用FPGA編寫,所有功能(néng)和指令邏輯全在硬件(jiàn)實現。
     C)基本功能(néng)
     1.分組前96字節内,小(xiǎo)于128的任意bit位,任意多(duō)個(gè)PHV對象定義;
     2.支持32字節Metadata對象編程,含16字節用戶自(zì)定義Metadata内容;
     3.分組前60字節内,任意bit位對象查表匹配,精确匹配與帶掩碼匹配,匹配字段支持輸入端口等Metadata字段;
     4.每動作支持14條指令,支持加、減、與、或、異或、取反等操作;
     5.每個(gè)指令執行器(qì)中含16個(gè)臨時寄存器(qì),支持臨時變量暫存與讀(dú)取,位寬支持1到(dào)64位;
     6.支持有狀态的存儲寄存器(qì)對象定義與操作,存儲寄存器(qì)位寬支持1到(dào)64位,最大個(gè)數支持128個(gè)。支持多(duō)個(gè)寄存器(qì)對象編程;
     7.支持對分組進行協議插入與删除,長(cháng)度支持1到(dào)16字節;
     8.動作與指令均支持參數化配置,即可運行前實例化,也可運行時調整;
     9.支持32種不同邏輯業(yè)務處理功能(néng)在線編譯、在線加載、在線配置、在線卸載,不影響其他業(yè)務邏輯;
     10.提供P4後端編譯器(qì),支持用戶P4代碼編譯;
     11.提供P4運行時配置管理工(gōng)具,支持用戶流表配置、動作配置和寄存器(qì)初始配置。
     擁有上(shàng)述平台編程功能(néng)後,對硬件(jiàn)的設計要求便會(huì)變得較為(wèi)簡單。原來要花較長(cháng)時間,寫較多(duō)代碼的功能(néng),現在可以簡單、快速的實現。
     A)設計原理
     從(cóng)交換機(jī)的幾個(gè)功能(néng)步驟開(kāi)始,先實現源MAC地址的學習。從(cóng)平台功能(néng)分析,使用寄存器(qì)部件(jiàn)比較合适。 拟定義一(yī)個(gè)端口與MAC地址的映射表,存儲在寄存器(qì)對象中,使用源MAC地址作為(wèi)寄存器(qì)對象的索引,分組輸入端口号作為(wèi)該索引位置的值。在使用目的MAC查表時,亦使用MAC地址作為(wèi)索引進行查找,即可獲取該地址學習存儲的端口号。
     由于MAC地址為(wèi)48位,本平台支持寄存器(qì)的深度有限,故本案例中僅取MAC地址的後4位作為(wèi)索引。故實驗演示時,要求測試主機(jī)的MAC地址尾數不同。
     單播地址可以采用上(shàng)述思路(lù)進行設備,那組播與廣播地址呢(ne),我們本案例拟采用全泛洪的方式先來實現一(yī)個(gè)基礎版本。 想要做組播功能(néng)可以将組播協議配置規則送CPU處理,CPU學習到(dào)入組和退組信息後,通(tōng)過P4的運行時工(gōng)具進行組播MAC與相(xiàng)應端口号的規則配置即可。
     B)代碼實現

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;
}

多(duō)播泛洪
以上(shàng)為(wèi)硬件(jiàn)二層交換機(jī)(原型系統)全部業(yè)務邏輯功能(néng)代碼。是的,就(jiù)是這四行代碼!!!!
      A)軟件(jiàn)核心代碼

      B)編譯器(qì)結果

      C)硬件(jiàn)配置

      D)Ping通(tōng)測試

C:\Users\Administrator>ping 192.168.1.198
正在 Ping 192.168.1.198 具有 32 字節的數據:
來自(zì) 192.168.1.198 的回複: 字節=32 時間<1ms TTL=127
來自(zì) 192.168.1.198 的回複: 字節=32 時間<1ms TTL=127
來自(zì) 192.168.1.198 的回複: 字節=32 時間<1ms TTL=127
來自(zì) 192.168.1.198 的回複: 字節=32 時間<1ms TTL=127

     物(wù)質守恒、能(néng)力守恒,苦難亦然守恒。
     為(wèi)了讓學生(shēng)們在我們平台編寫硬件(jiàn)邏輯少些痛苦,我們艱苦奮鬥了16個(gè)月(yuè),對P4的原理、代碼和編譯器(qì)進行了仔細琢磨、分析和領悟。我們認為(wèi)P4是一(yī)門(mén)較為(wèi)優秀的編程語言,更是一(yī)種硬件(jiàn)編程的創新思路(lù)和具體表達形式。我們無法去破解P4的硬件(jiàn)實現,固然也無從(cóng)參考,而是領悟P4編程方式的精髓理念後,采用了原有FAST架構和部分邏輯調整,并配置P4後端編譯适配,打造了現如今的支持P4的FAST架構可編程平台。
     本平台結合了FAST架構與P4可編程的雙重優勢。支持用戶在最底層硬件(jiàn)到(dào)最高(gāo)層軟件(jiàn)全方便的編程與驗證,而且編程語言均使用C語言和類似C的P4語言,進一(yī)步降低(dī)了學習與使用難度。
     下(xià)一(yī)步,做個(gè)硬件(jiàn)路(lù)由器(qì)?或者您有更美好的想法,我們可以試一(yī)試!
     有需要開(kāi)發可編程硬件(jiàn)(FPGA、ASIC等)的P4後端編譯器(qì),或獲得本平台介紹相(xiàng)關源碼的客戶,請與15116127200(微信同号)聯系,閱讀(dú)更多(duō)FAST相(xiàng)關文章請進入以下(xià)公衆号。