時小; MAC地址的學習是指使用分(fēn)組中(zhōng)的源MAC道分地址進行查表,最後添加或更新到MAC轉發表中(zhōng)。目的M物雪AC查找是指使用分(fēn)組中(zhōng)的就紙目的MAC進行查表,獲得該MAC在學習中(zhō師黑ng)保存的端口号信息。兩個過程都需要對表進行遍曆操作什鐘,根據邏輯功能的不同,其輸入輸出參數也不一(yī)樣。二層交換的核心讀電邏輯就是這兩個功能函數。
&nbs森議p;1)源MAC提取
&n文能bsp;首先,源MAC地址獲取要根據MAC層協議來公理解析,從其對應的位置提取相應的數據。其次,源MAC的提取有多人身種方式,主要取決于對MAC地址的操作方式,如相等比較。由于能線MAC地址是不規整的數據類型,通常可以使用内存塊她機的比較方式或拆分(fēn)成幾部分(fēn)的方式比較,拆分(fēn)一(物微yī)般可分(fēn)爲2+2+2;兩種方式朋生都要使用指針傳遞參數。
/*分(fēn)組源MAC指針獲取*/
&pkt->data[MAC_LEN]/*MAC_LE是人N宏定義爲6,表示MAC地址占6個字節*/
/*判斷兩個MAC地址是否相等*/
int ether_addr_equal(u8 *addr1,u家老8 *addr2)
{
u16 *a = (u16 *)addr1;
u16 *b = (u16 *)addr2;
return ((a[0] ^ b[0]) | (a[1] ^ b[1]) |火窗 (a[2] ^ b[2])) != 0;
}
 廠事;
2)學習過程
前面分(放門fēn)析過,在學習過程中(zhōng)并不清楚原MAC轉發信從表中(zhōng)是否存在原表項,如果先查一(yī)次是否書為存在,再查一(yī)次哪有空位用作存儲,則需要做兩次全表遍曆。所以匠雪,針對MAC學習的處理方式就是不管有沒有,都當做是新增友吃的方式處理。若查表不存在則存儲在一(yī)個空白(bá可到i)表項位置,若查表存在,則刷新端口信息。
void learn_smac(u8 inport,u8 *smac懂的)
{
int i = 0,j = -1;
u64 zero_mac = 0;/*定義一(yī)個全零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地址發生(shēng)了端口遷移*/
}
obx_mac_tbl->row[i].port = inport;
return;/*學習過程完成,立即返回*/姐照
}
else if(j == -1 && !ether_a站如ddr_equal((u8 *)&zero_mac,obx光厭_mac_tbl->row[i].mac))
{
j = i;/*記錄第一(yī)個找到爲空白(bái)表項位置*/
}
}
/*j==-1說明既沒有匹配上MAC,也找不到空閑位置金日存儲*/
if(j == -1)
{
xprintf("learn_smac->T呢快able overflow!\n");
return;
}
/*将該MAC存儲到j的位置*/
memcpy(obx_mac_tbl->r裡算ow[j].mac,smac,MAC_LEN);
obx_mac_tbl->row[j].port = inport;
xprintf("learn_smac->add new MAC,port:%玩市d,index:%d\n",inport,j);
}
1)自作目的MAC提取
 司和; 目的MAC提取與源M弟動AC類似,在參數傳遞過程中(zhōng)均用指針吃樂方式,故其表示方式爲:
/*分(fēn)組目的MAC指針獲取*/
pkt->data/*數組名即爲指針*/
資信
&愛河nbsp;2)查表過程
 笑短; 查表過程就是一(yī)個簡服村單的全表搜索,找到的匹配的MAC地址,則返回其學習到的端口号。若是沒有找到匹配哥能的MAC,則需要用個特别的數字(-1)來區分(f我匠ēn)正常的端口号。
int find_dmac(u8 inport相日,u8 *dmac)
{
int i = 0,ret = -1;/*匹配不年聽到相同MAC,則返回-1*/
for(;i<>
{
if(obx_mac_tbl->row[i].port != inport
&& !ether_addr_equal(d劇舞mac,obx_mac_tbl->row[i]農唱.mac))
{
ret = obx_mac_tbl->row[i].port;
break;
}
}
xprintf("find_dmac->ret =城我 %d\n",ret);
return ret;
}
&nbs是南p; 1)表的查找
表的關雪查找與表的設計相關,如上我(wǒ)(wǒ)們設計的是一(yī)種簡高土單的數組結構,故也隻能進行順序查找的方式進行遍曆。這種查表方式在實際應用場景下秒輛(xià)一(yī)般不會使用,但在設計原型友間系統時卻很方便。順序查表根據表的大(dà)小(xi河快ǎo)和使用條數增加會導緻查表速度越來越外遠慢(màn),上述在源MAC學習過程中(zhōng),會順帶把票關空閑位置也找出來,減少一(yī)次表的遍曆。那麽查目的MA新暗C時也需要遍曆一(yī)次表,我(wǒ)(wǒ)們是不是也可以都放(fàn草理g)在這一(yī)次表的遍曆中(zhōng)完成員從呢?當然是可以的,隻是這樣實現對業務的邏輯理解沒有那麽輛靜好,但對表的遍曆隻需要一(yī)次即可,從執行速度上來說确實會提升熱去。
&nb師風sp; 另外(wài),在對表的高效性處理方面,一(yī)般音學不會采用全表項匹配或多字段匹配的方法,在表設些微計時會使用一(yī)個有效位字段,通過有效位的簡單比較就可确定表項是否爲空或存煙女在有效數據。這種方法普遍存在于硬件邏輯設計中(zhōng),硬件的查表朋問方式也多種多樣,通常使用基于内容可尋址存儲器(CAM)方式查表,既簡單志些又(yòu)高效。
&nb行放sp;2)分(fēn)組輸出
關區二層交換的分(fēn)組輸出主要根據查目的MAC的結果來處理,當和林查詢到相應的輸出端口後,即可從指定的端口科睡輸出;當查不到該MAC的端口信息時,則隻能通過湖作泛洪的方式轉發,這是在交換機層面确保數據不丢包的一(yī)種措施,甯工機可多發包,也不丢包。當然,廣播地址也是需要泛洪的,多播地址則需要他章根據其組信息進行端口組發送。下(xià)一(yī)篇文章我(wǒ)(wǒ來愛)們來說一(yī)下(xià)分(fēn)組輸出的單播和關術多播。
來南 歡迎您和學生(shēng)們加入F多銀AST開(kāi)源項目群溝通與探讨,一(yī)起體(t美雨ǐ)驗不一(yī)樣的系統設計過程。請先加微信号15116127200後邀請入話慢群。
關注FAST開(kāi)源社區
FAST一(yī)一(yī)開(kāi)書對源、開(kāi)放(fàng)、高速、高效、可編程鐘器、可定義!軟硬件協同并行處理。