/*分組源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;
}
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);
}
/*分組目的MAC指針獲取*/
pkt->data/*數組名即為(wèi)指針*/
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;
}