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

     數據類型重定義如(rú)下:

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

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

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

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

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

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

關注FAST開源社區
FAST一(yī)一(yī)開源、開放、高(gāo)速、高(gāo)效、可(kě)編程、可(kě)定義!軟硬件協同并行(xíng)處理(lǐ)。