一、概述
MAC轉發表是二層交換機原型中的核心內容,所有的數據操作都是圍繞這張表而來。前一篇文章中講到了該表涉及的兩個核心字段:端口號與MAC地址。本篇文章專門講解一下該MAC轉發表的設計與表的操作方法。
二、MAC轉發表的設計
MAC轉發表的設計我們還是遵循漸進式的方法,從最基本的字段開始,根據需要再逐步增加。
1)字段設計
從前一篇文章分析,對于MAC轉發表來說,其核心字段就2個:端口號和MAC地址,故我們對其字段的設計也就采用此二元數據。交換機的端口號一般不超過64,故用char(8位)類型定義即可,MAC地址的位寬為48位,可定義為6個字節數組。一般在協議字段中或以協議字段作為字段的表結構定義中,采用無符號類型做定義,這樣方便數據與或運算,也方便硬件移植。字段數據類型的定義一般也建議重定義為簡寫方式,在讀寫代碼時,更好理解和把握數據是否溢出、越界等。
數據類型重定義如下:
typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
//typedef unsigned long u64;/*64位系統*/
/*請特別的注意!!!在32位系統下,long的數據位寬只有32位,64位的數據類型必須使用long long的方式定義*/
typedef unsigned long long u64;/*32位系統,實驗平臺OpenBox-S4為32位系統*/
2)表結構設計
數據存儲結構的設計有很多方式可選,如數組、多維數組、單向鏈表、雙向鏈表和樹結構等。在原型系統的設計中,因為表結構定義會影響到整個代碼實現,且需要考慮將來硬件卸載的便捷性,所以我們一般建議采用較為簡單的表存儲結構。又因為每條表項的大小是固定空間,所以采用數組的形式是較優的選擇。
先定義一條表項的數據結構如下:
struct row_port_mac
{
u8 port;
u8 pad;/*為了對齊做的補充*/
u8 mac[MAC_LEN];
};
補充對齊:上述表項一條寬度為7個字節,如此按數組形式組織的話,則會讓mac字段在非內存對齊位置出現,導致數據比較時需要兩次對比。若是跨了CacheLine,則會導致更長的時間損耗。具體原因請網上搜索“內存對齊”深入學習。我們建議在定義數組項的時候一定按照8字節倍數對齊方式來定義,若小于8字節,則補充為8;若多于8,則再多補充直到成為8的倍數(特別說明,這是針對數組定義要求,不同數據結構根據分析會有不同的優化定義方法)。
再定義整張表的數據結構如下:
#define OBX_MAC_MAX 128/*系統最多支持128條MAC表項*/
struct table_port_mac
{
struct row_port_mac row[OBX_MAC_MAX];
};
3)表操作方法設計
表的方法主要是指對表的操作,通常包括表項的增、刪、改和查四個動作。這些表動作的設計與表的結構定義和表的數據操作方法相關,可以利用對表數據的操作進行優化和精簡。如在二維數據中進行任何操作,都得先把表遍歷一次,找到空位才能增加,找到對應的內容項才能修改和刪除。
根據二層交換的數據處理流程分析,在源MAC的學習過程中,學習到一個新MAC地址需要進行增加表項操作,若已經學習到的MAC地址發生了端口遷移,則需要更新其端口信息。在目的MAC查表過程中是一個單純的MAC地址查找過程。MAC表項的刪除一般發生在MAC表老化的時候,后面文章單獨講。
三、MAC表功能方法設計
結合前面的表方法設計和二層交換的數據處理邏輯,我們暫將MAC轉發表的方法定義為兩個:一是源MAC學習;二是目的MAC查找。
1)源MAC學習
源MAC學習是指將一個輸入分組的源MAC地址學習并保存到MAC轉發表中。若MAC轉發表中不存在該源MAC地址信息,則找一個空白位置存儲。若MAC轉發表中已有該地址信息,則刷新(覆蓋)其端口號信息。在查找源MAC地址是否存在時,同時查找空閑表項位置,這樣只用遍歷一次表,即可完成兩件事情。另外就是查找到源MAC地址后,立即刷新其端口號,可以判斷并打印顯示,該MAC地址是否發生了端口轉移。
2)目的MAC查找
目的MAC的查找,其目的是為了獲得查找MAC對應的端口號,查表結果有兩種情況,一是查找到了,返回對應的端口號信息;二是沒有查找到,則不能返回正常端口數據,需要使用特殊返回值表示,如-1。
四、總結與下一步
1)查表設計
MAC轉發表的方法設計為什么把二層交換的功能和表操作混在了一起?因為在二層交換中,其核心數據處理流程就是針對MAC轉發表進行的一系列數據查找、存儲和更新動作。按照其邏輯處理方式來設計可以讓學生更好理解MAC表的操作流程與細節。
在邏輯設計的過程中,我們需要針對一些特定功能進行抽象、模塊化,比如表的四操作。但在具體實現過程中,其本身的邏輯處理也就是對表的內容進行處理,以數據流程為主線進行設計比純模塊化的分層設計更容易讓學生掌握交換的處理過程。模塊化和分層可以放到后期優化階段。
表操作的方法也并不一定要馬上全部實現,根據邏輯的需要逐個實現,在實現過程中也會不斷修改完善。
2)MAC地址學習與查表實現
MAC地址的學習與查找是二層交換的核心,特別是MAC地址學習,如何設計快速、高效的學習方法,取決于我們對系統數據處理流程的深度理解與優化迭代。下一篇文章中會給出一種具體的實現方法供大家參考。
五、結語
歡迎您和學生們加入FAST開源項目群溝通與探討,一起體驗不一樣的系統設計過程。請先加微信號15116127200后邀請入群。
關注FAST開源社區
FAST一一開源、開放、高速、高效、可編程、可定義!軟硬件協同并行處理。