/*分(fēn)組源MAC指針獲取*/
&pkt->data[MAC_LEN]/*MAC_LEN宏定義爲6,表示MAC地址占6個字節*/
/*判斷兩個MAC地址是否相等*/
int ether_addr_equal(u8 *addr1,u8 *addr2)
{
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,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地址與輸入參數smac相等*/
if(obx_mac_tbl->row[i].port != inport)
{
/*這個MAC地址發生(shēng)了端口遷移*/
}
obx_mac_tbl->row[i].port = inport;
return;/*學習過程完成,立即返回*/
}
else if(j == -1 && !ether_addr_equal((u8 *)&zero_mac,obx_mac_tbl->row[i].mac))
{
j = i;/*記錄第一(yī)個找到爲空白(bái)表項位置*/
}
}
/*j==-1說明既沒有匹配上MAC,也找不到空閑位置存儲*/
if(j == -1)
{
xprintf("learn_smac->Table overflow!\n");
return;
}
/*将該MAC存儲到j的位置*/
memcpy(obx_mac_tbl->row[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);
}
/*分(fēn)組目的MAC指針獲取*/
pkt->data/*數組名即爲指針*/
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(dmac,obx_mac_tbl->row[i].mac))
{
ret = obx_mac_tbl->row[i].port;
break;
}
}
xprintf("find_dmac->ret = %d\n",ret);
return ret;
}