0731-84728105
15116127200
二層交換機原型設計與實現(五)
發布時(shí)間:2021-05-24
  &nbs跳熱p;  MAC地址的學習是指使用分組中的源MAC錢火地址進行查表,最後添加或更新到MAC轉發表中。目的MAC查找是指使用分組中的也務目的MAC進行查表,獲得(de)該MAC在學習中保歌女存的端口号信息。兩個過程都需要對表進行遍曆操作,根據邏輯功能的不嗎廠(bù)同,其輸入輸出參數也不(bù)一樣。二層交換的核心邏輯就是些用這兩個功能函數。
   &房著nbsp; 1)源MAC提取
     首你黃先,源MAC地址獲取要根據MAC層協議來解件家析,從其對應的位置提取相應的數據。其次,源MA紅說C的提取有多種方式,主要取決于對MAC地址的操作方式,西機如(rú)相等比較。由于MAC地址是不(bù)規整的數據類書匠型,通(tōng)常可以使用内存塊的比較費國方式或拆分成幾部分的方式比較,拆分一般可分為(wèi)2+2+2;兩種方購微式都要使用指針傳遞參數。

/*分組源MAC指針獲取*/
&pkt->data[MAC_LEN]/*M海劇AC_LEN宏定義為(wèi)6,表示MAC地址占6個字節*/
/*判斷兩個MAC地址是否相等*/
int ether_addr_equal(u8 *addr1,u8 *addr體工2)
{
u16 *a = (u16 *)addr1;不不
u16 *b = (u16 *)addr2;
return ((a[0] ^ b[0]) | (a[1] ^ b[1])呢亮 | (a[2] ^ b[2])) != 照醫0;
}

   &nb鄉都sp;  2)學習過程
   兵人  前面分析過,在學習過程中并不(bù)清楚原MAC轉發表聽中中是否存在原表項,如(rú)果先查一次是否存在,再查一次哪有著理空位用作存儲,則需要做兩次全表遍曆。所以,針對MAC中不學習的處理方式就是不(bù)管有沒有,都當做是新增的方式處理。若查表不(公資bù)存在則存儲在一個空白表項位置,若查表存在,則刷新端口信息志女。

void learn_smac(u8 inport,u會紙8 *smac)
{
int i = 0,j = -1;
u64 zero_mac = 0;/*定義一個全零MAC地址*/
xprintf("learn_smac->\n"有也);
for(;i<>
{
if(!ether_addr_equal(smac,obx_mac_tbl城飛->row[i].mac))
{
/*MAC轉發表當前i行的MAC地址與輸入參數s廠雜mac相等*/
if(obx_mac_tbl->row[i].port != inport)區妹
{
/*這個MAC地址發生了端口遷移*/
}
obx_mac_tbl->row[i].port 友技= inport;
return;/*學習過程完成,立即返回*/
}
else if(j == -1 && !ether_add海月r_equal((u8 *)&zero_議機mac,obx_mac_tbl->row[i].mac))
{
j = i;/*記錄第一個找到為(wèi)空白表項位置*大好/
}
}
/*j==-1說(shuō)明既沒有匹配上MAC,也找不(bù)到空閑位置草會存儲*/
if(j == -1)
{
xprintf("learn_smac->Tabl草歌e overflow!\n");
return;
}
/*将該MAC存儲到j的位置*/
memcpy(obx_mac_tbl->row[j].答愛mac,smac,MAC_LEN);
obx_mac_tbl->row[j].port = inpo間路rt;
xprintf("learn_smac->ad黑算d new MAC,port:%d,index:門是%d\n",inport,j);
}

     家兒;1)目的MAC提取
    數人 目的MAC提取與源MAC類似,在參數傳遞過程中朋算均用指針方式,故其表示方式為(wèi):

/*分組目的MAC指針獲取*/
pkt->data/*數組名即為(wèi)指針*/

    &樂跳nbsp;2)查表過程
   &n從錢bsp; 查表過程就是一個簡單的全表搜索,找到校信的匹配的MAC地址,則返回其學習到的端口号黃技。若是沒有找到匹配的MAC,則需要用個特别的數字少吧(-1)來區分正常的端口号。

int find_dmac(u8 i作不nport,u8 *dmac)
{
int i = 0,ret = -1;/*匹配不(bù)到相同MAC,作些則返回-1*/
for(;i<>
{
if(obx_mac_tbl->row[有時i].port != inport
&& !ether_addr_equal(dmac,obx_mac_tbl下外->row[i].mac))
{
ret = obx_mac_tbl->row[i].port議睡;
break;
}
}
xprintf("find_dmac->ret = %d\n",ret高喝);
return ret;
}

   &快綠nbsp; 1)表的查找
    &n短聽bsp;表的查找與表的設計相關,如(rú)上我們(men)設計的是一種簡問術單的數組結構,故也隻能進行順序查找的方式進行遍曆。這種查表方式在實際應用錢遠場景下一般不(bù)會(huì)使用,但在設計原型系統時(shí)卻很方議費便。順序查表根據表的大(dà)小和使用條數增加會(huì)草匠導緻查表速度越來越慢,上述在源MAC學習個子過程中,會(huì)順帶把空閑位置也找出來,減少一次表的遍曆。那麼森下查目的MAC時(shí)也需要遍曆一次表,我們(men)是問我不(bù)是也可以都放在這一次表的遍曆中完成呢?當然是下呢可以的,隻是這樣實現對業務的邏輯理解沒有那麼好(hǎo),但對媽兵表的遍曆隻需要一次即可,從執行速度上來說(shu數書ō)确實會(huì)提升。
     另得匠外,在對表的高效性處理方面,一般不(bù)會(huì)采用全表項匹配的吧或多字段匹配的方法,在表設計時(shí)會(huì)使用一個有效位字醫上段,通(tōng)過有效位的簡單比較就可确定表項是否為(wèi)空劇白或存在有效數據。這種方法普遍存在于硬件邏輯設計中,也時硬件的查表方式也多種多樣,通(tōng)常使用基于内容可事業尋址存儲器(qì)(CAM)方式查表,既簡單又高效。
   草制  2)分組輸出
  &nbs請中p;  二層交換的分組輸出主要根據查目的MAC的結果來聽得處理,當查詢到相應的輸出端口後,即可從指定的可高端口輸出;當查不(bù)到該MAC的端口信息時(shí),請校則隻能通(tōng)過泛洪的方式轉發,這是在交換機層面确保數據不(bù身雜)丢包的一種措施,甯可多發包,也不(bù)丢黃技包。當然,廣播地址也是需要泛洪的,多播地址月亮則需要根據其組信息進行端口組發送。下一篇文章我們(men)來說(日城shuō)一下分組輸出的單播和多播。
   空照   歡迎您和學生們(men小在)加入FAST開(kāi)源項目群溝通(tōng)與探讨,一起體驗不討劇(bù)一樣的系統設計過程。請先加微信号15116讀銀127200後邀請入群。

關注FAST開(kāi)源社區 為在
FAST一一開(kāi)源、開(kāi)放、高速、高效、可編程、們懂可定義!軟硬件協同并行處理。