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