亚洲色图视频网站_a级黄色网_一区二区免费电影,国产精品久久久久亚洲秋菊,久久精品视频免费在线观看,国产精品免费精品一区

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

     數(shù)據(jù)類(lèi)型重定義如下:

typedef unsigned char u8;
typedef unsigned short u16;
typedef unsigned int u32;
//typedef unsigned long u64;/*64位系統(tǒng)*/
/*請(qǐng)?zhí)貏e的注意!!!在32位系統(tǒng)下,long的數(shù)據(jù)位寬只有32位,64位的數(shù)據(jù)類(lèi)型必須使用long long的方式定義*/
typedef unsigned long long u64;/*32位系統(tǒng),實(shí)驗(yàn)平臺(tái)OpenBox-S4為32位系統(tǒng)*/

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

struct row_port_mac
{
u8 port;
u8 pad;/*為了對(duì)齊做的補(bǔ)充*/
u8 mac[MAC_LEN];
};

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

#define OBX_MAC_MAX 128/*系統(tǒng)最多支持128條MAC表項(xiàng)*/
struct table_port_mac
{
struct row_port_mac row[OBX_MAC_MAX];
};

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

關(guān)注FAST開(kāi)源社區(qū)
FAST一一開(kāi)源、開(kāi)放、高速、高效、可編程、可定義!軟硬件協(xié)同并行處理。