MAC轉發科動表是二層交換機原型中的核心内容,所有的數據操作都是圍繞這張表而來聽姐。前一篇文章中講到了該表涉及的兩個核心字段玩技:端口号與MAC地址。本篇文章專門講解一下該MAC轉發表的設計與表的資匠操作方法。
 空爸; MAC轉發表的設計我們(men)還是遵循漸進式的方法,從最基資數本的字段開(kāi)始,根據需要再逐步增加。
火好 1)字段設計
從習司前一篇文章分析,對于MAC轉發表來說(shuō),其核心字段就2個:端口文金号和MAC地址,故我們(men)對其字段的設計也就采用此二元數據。交鄉內換機的端口号一般不(bù)超過64,故用c媽術har(8位)類型定義即可,MAC地址的那影位寬為(wèi)48位,可定義為(wèi)還廠6個字節數組。一般在協議字段中或以協議字段作為(wè為地i)字段的表結構定義中,采用無符号類型做定義,這樣方便數據與或運算湖電,也方便硬件移植。字段數據類型的定義一般也建議重定義為(wè道分i)簡寫方式,在讀寫代碼時(shí),更好(h要劇ǎo)理解和把握數據是否溢出、越界等。
數據類型又兒重定義如(rú)下:
typedef unsigned char還區 u8;
typedef unsigned shor聽拍t u16;
typedef unsigned int u32;
//typedef unsigned long u64;/*64位系統*/外場
/*請特别的注意!!!在32位系統下,long的數據位大玩寬隻有32位,64位的數據類型必須使用long 要少long的方式定義*/
typedef unsigned long long u64;/*32位系統音明,實驗平台OpenBox-S4為(wèi)32位系統*/司時
&nb照都sp;
2)表結構設計
&nbs務線p;數據存儲結構的設計有很多方式可選,如火他(rú)數組、多維數組、單向鍊表、雙向鍊表和樹結構等美我。在原型系統的設計中,因為(wèi)表結構定義會(huì)影響到整個代碼實現,器靜且需要考慮将來硬件卸載的便捷性,所以我們(men)一般建議采用較為(wèi)簡作為單的表存儲結構。又因為(wèi)每條表項的大(dà)小是固定空間,所以采用數區外組的形式是較優的選擇。
化媽 先定義一條表項的數據結構如(rú)下:
struct row_port_mac
{
u8 port;
u8 pad;/*為(wèi)了對齊做的補充*/
u8 mac[MAC_LEN];
};
&n湖商bsp; 補充對齊:上述表項一條寬度路務為(wèi)7個字節,如(rú)此按數組河身形式組織的話,則會(huì)讓mac字段在非内存不到對齊位置出現,導緻數據比較時(shí)需要兩次對比。若是跨了Ca業民cheLine,則會(huì)導緻更長(cháng)的時(腦路shí)間損耗。具體原因請網上搜索“内存對齊”深入學習。著去我們(men)建議在定義數組項的時(shí)候一定按照8鐵新字節倍數對齊方式來定義,若小于8字節,則補充為(wèi)木站8;若多于8,則再多補充直到成為(wèi)8的倍數(特别說(sh說靜uō)明,這是針對數組定義要求,不(bù)同數據結構根據分析會(huì愛下)有不(bù)同的優化定義方法)。
&nbs文志p; 再定義整張表的數據結構如(rú日公)下:
#define OBX_MAC_MAX 128/紙這*系統最多支持128條MAC表項*/
struct table_port_mac
{
struct row_port_mac row[OBX_有山MAC_MAX];
};
3)表這靜操作方法設計
線和 表的方法主要是指對表的操作,訊人通(tōng)常包括表項的增、删、改和查四個動作。這些表和朋動作的設計與表的結構定義和表的數據操作方法相關,可以利用對表數據的操作進行優化間厭和精簡。如(rú)在二維數據中進行任何操作,問女都得(de)先把表遍曆一次,找到空位才能也匠增加,找到對應的内容項才能修改和删除。
&n生物bsp; 根據二層交換的數據處理流程分析吃日,在源MAC的學習過程中,學習到一個新MAC地址需要進行增加表項操秒從作,若已經學習到的MAC地址發生了端口遷移,則需要更新其端口信息。在目森議的MAC查表過程中是一個單純的MAC地址查找過兒相程。MAC表項的删除一般發生在MAC表老化的時(shí)候,後面文章單獨多湖講。
結合哥他前面的表方法設計和二層交換的數據處理邏輯,我們(men)暫将MA廠對C轉發表的方法定義為(wèi)兩個:一是源MAC學習;二是目的MAC查找。
通懂
1)源西鄉MAC學習
票小 源MAC學習是指将一個輸入分組的源MAC地址學習并保存到MAC轉風靜發表中。若MAC轉發表中不(bù)存在該源MAC地址信息,到男則找一個空白位置存儲。若MAC轉發表中已有該地址信息,則刷新(覆蓋)其端口号信知對息。在查找源MAC地址是否存在時(shí),同時(shí)查水村找空閑表項位置,這樣隻用遍曆一次表,即可完成兩件事情。另開她外就是查找到源MAC地址後,立即刷新其端口号,可以判斷并打印顯示,該M知作AC地址是否發生了端口轉移。
 開他; 2)目的MAC查找你山
目的MAC刀學的查找,其目的是為(wèi)了獲得(de)查找MAC對應的端口号,查表結果有吃山兩種情況,一是查找到了,返回對應的端口号信息;二是沒有查找到,則不(b開地ù)能返回正常端口數據,需要使用特殊返回值表示,如(rú)-1。
村討 1)查表設計
&nb影水sp;MAC轉發表的方法設計為(wèi)什麼把二層交換的功能和表市請操作混在了一起?因為(wèi)在二層交換中,其核心數林票據處理流程就是針對MAC轉發表進行的一系列數據下坐查找、存儲和更新動作。按照其邏輯處理方式來設計可以讓學離靜生更好(hǎo)理解MAC表的操作流程與細節。
&雨務nbsp; 在邏輯設計的過程中,我們(men)需要雜的針對一些特定功能進行抽象、模塊化,比如(rú)表的四操作。但在具體實現過程中裡船,其本身的邏輯處理也就是對表的内容進行處理,以風和數據流程為(wèi)主線進行設計比純模塊化的分層設計更章窗容易讓學生掌握交換的處理過程。模塊化和分層銀和可以放到後期優化階段。
&公懂nbsp; 表操作的方法也并不物見(bù)一定要馬上全部實現,根據邏輯的需要逐個實現,很光在實現過程中也會(huì)不(bù)斷修改完善。
 上紙; 2)MAC地址學習與查表實現
現綠
 哥我;MAC地址的學習與查找是二層交換的核心,特别是MAC地址學習,如相海(rú)何設計快速、高效的學習方法,取決于我們(men)對系統數據小開處理流程的深度理解與優化叠代。下一篇文章中會(huì)給出一種學什具體的實現方法供大(dà)家(jiā)參考。
議得
&窗說nbsp;
歡迎您和學生們(men坐短)加入FAST開(kāi)源項目群溝通(tōng)與探讨,一起體驗不厭厭(bù)一樣的系統設計過程。請先加微信号15116127200後邀請入群。媽購
關注FAST開(kāi)源社區
FAST一一開(kāi)源、開(kāi妹但)放、高速、高效、可編程、可定義!軟硬件協同并行處理。
水那