0731-84728105
15116127200
二層交換機(jī)原型設計與實現(四)
發布時間:2021-05-17
     MAC轉發表是二層交換機(jī)原型中的核心内容,所有的數據操作都是圍繞這張表而來。前一(yī)篇文章中講到(dào)了該表涉及的兩個(gè)核心字段:端口号與MAC地址。本篇文章專門(mén)講解一(yī)下(xià)該MAC轉發表的設計與表的操作方法。
     MAC轉發表的設計我們還(hái)是遵循漸進式的方法,從(cóng)最基本的字段開(kāi)始,根據需要再逐步增加。
     1)字段設計
     從(cóng)前一(yī)篇文章分析,對于MAC轉發表來說,其核心字段就(jiù)2個(gè):端口号和MAC地址,故我們對其字段的設計也就(jiù)采用此二元數據。交換機(jī)的端口号一(yī)般不超過64,故用char(8位)類型定義即可,MAC地址的位寬為(wèi)48位,可定義為(wèi)6個(gè)字節數組。一(yī)般在協議字段中或以協議字段作為(wèi)字段的表結構定義中,采用無符号類型做定義,這樣方便數據與或運算(suàn),也方便硬件(jiàn)移植。字段數據類型的定義一(yī)般也建議重定義為(wèi)簡寫方式,在讀(dú)寫代碼時,更好理解和把握數據是否溢出、越界等。

     數據類型重定義如下(xià):

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
//typedef unsigned long u64;/*64位系統*/
/*請特别的注意!!!在32位系統下(xià),long的數據位寬隻有32位,64位的數據類型必須使用long long的方式定義*/
typedef unsigned long long u64;/*32位系統,實驗平台OpenBox-S4為(wèi)32位系統*/

      2)表結構設計
     數據存儲結構的設計有很多(duō)方式可選,如數組、多(duō)維數組、單向鏈表、雙向鏈表和樹結構等。在原型系統的設計中,因為(wèi)表結構定義會(huì)影響到(dào)整個(gè)代碼實現,且需要考慮将來硬件(jiàn)卸載的便捷性,所以我們一(yī)般建議采用較為(wèi)簡單的表存儲結構。又(yòu)因為(wèi)每條表項的大小(xiǎo)是固定空間,所以采用數組的形式是較優的選擇。
     先定義一(yī)條表項的數據結構如下(xià):

struct row_port_mac
{
u8 port;
u8 pad;/*為(wèi)了對齊做的補充*/
u8 mac[MAC_LEN];
};

     補充對齊:上(shàng)述表項一(yī)條寬度為(wèi)7個(gè)字節,如此按數組形式組織的話,則會(huì)讓mac字段在非内存對齊位置出現,導緻數據比較時需要兩次對比。若是跨了CacheLine,則會(huì)導緻更長(cháng)的時間損耗。具體原因請網上(shàng)搜索“内存對齊”深入學習。我們建議在定義數組項的時候一(yī)定按照(zhào)8字節倍數對齊方式來定義,若小(xiǎo)于8字節,則補充為(wèi)8;若多(duō)于8,則再多(duō)補充直到(dào)成為(wèi)8的倍數(特别說明,這是針對數組定義要求,不同數據結構根據分析會(huì)有不同的優化定義方法)。
     再定義整張表的數據結構如下(xià):

#define OBX_MAC_MAX 128/*系統最多(duō)支持128條MAC表項*/
struct table_port_mac
{
struct row_port_mac row[OBX_MAC_MAX];
};

     3)表操作方法設計
     表的方法主要是指對表的操作,通(tōng)常包括表項的增、删、改和查四個(gè)動作。這些表動作的設計與表的結構定義和表的數據操作方法相(xiàng)關,可以利用對表數據的操作進行優化和精簡。如在二維數據中進行任何操作,都得先把表遍曆一(yī)次,找到(dào)空位才能(néng)增加,找到(dào)對應的内容項才能(néng)修改和删除。
     根據二層交換的數據處理流程分析,在源MAC的學習過程中,學習到(dào)一(yī)個(gè)新MAC地址需要進行增加表項操作,若已經學習到(dào)的MAC地址發生(shēng)了端口遷移,則需要更新其端口信息。在目的MAC查表過程中是一(yī)個(gè)單純的MAC地址查找過程。MAC表項的删除一(yī)般發生(shēng)在MAC表老化的時候,後面文章單獨講。
     結合前面的表方法設計和二層交換的數據處理邏輯,我們暫将MAC轉發表的方法定義為(wèi)兩個(gè):一(yī)是源MAC學習;二是目的MAC查找。
     1)源MAC學習
     源MAC學習是指将一(yī)個(gè)輸入分組的源MAC地址學習并保存到(dào)MAC轉發表中。若MAC轉發表中不存在該源MAC地址信息,則找一(yī)個(gè)空白(bái)位置存儲。若MAC轉發表中已有該地址信息,則刷新(覆蓋)其端口号信息。在查找源MAC地址是否存在時,同時查找空閑表項位置,這樣隻用遍曆一(yī)次表,即可完成兩件(jiàn)事(shì)情。另外就(jiù)是查找到(dào)源MAC地址後,立即刷新其端口号,可以判斷并打印顯示,該MAC地址是否發生(shēng)了端口轉移。
     2)目的MAC查找
     目的MAC的查找,其目的是為(wèi)了獲得查找MAC對應的端口号,查表結果有兩種情況,一(yī)是查找到(dào)了,返回對應的端口号信息;二是沒有查找到(dào),則不能(néng)返回正常端口數據,需要使用特殊返回值表示,如-1。
     1)查表設計
     MAC轉發表的方法設計為(wèi)什麽把二層交換的功能(néng)和表操作混在了一(yī)起?因為(wèi)在二層交換中,其核心數據處理流程就(jiù)是針對MAC轉發表進行的一(yī)系列數據查找、存儲和更新動作。按照(zhào)其邏輯處理方式來設計可以讓學生(shēng)更好理解MAC表的操作流程與細節。
     在邏輯設計的過程中,我們需要針對一(yī)些特定功能(néng)進行抽象、模塊化,比如表的四操作。但在具體實現過程中,其本身的邏輯處理也就(jiù)是對表的内容進行處理,以數據流程為(wèi)主線進行設計比純模塊化的分層設計更容易讓學生(shēng)掌握交換的處理過程。模塊化和分層可以放(fàng)到(dào)後期優化階段。
     表操作的方法也并不一(yī)定要馬上(shàng)全部實現,根據邏輯的需要逐個(gè)實現,在實現過程中也會(huì)不斷修改完善。
     2)MAC地址學習與查表實現
     MAC地址的學習與查找是二層交換的核心,特别是MAC地址學習,如何設計快速、高(gāo)效的學習方法,取決于我們對系統數據處理流程的深度理解與優化叠代。下(xià)一(yī)篇文章中會(huì)給出一(yī)種具體的實現方法供大家參考。
      歡迎您和學生(shēng)們加入FAST開(kāi)源項目群溝通(tōng)與探讨,一(yī)起體驗不一(yī)樣的系統設計過程。請先加微信号15116127200後邀請入群。

關注FAST開(kāi)源社區
FAST一(yī)一(yī)開(kāi)源、開(kāi)放(fàng)、高(gāo)速、高(gāo)效、可編程、可定義!軟硬件(jiàn)協同并行處理。