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

     數據類型重定義如下(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爲32位系統*/

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

struct row_port_mac
{
u8 port;
u8 pad;/*爲了對齊做的補充*/
u8 mac[MAC_LEN];
};

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

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

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

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