/*分(fēn)组源MAC指针获取*/
&pkt->data[MAC_LEN]/*MAC_LEN宏定义為(wèi)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;/*定义一个全零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地址发生了端口迁移*/
}
obx_mac_tbl->row[i].port = inport;
return;/*學(xué)习过程完成,立即返回*/
}
else if(j == -1 && !ether_addr_equal((u8 *)&zero_mac,obx_mac_tbl->row[i].mac))
{
j = i;/*记录第一个找到為(wèi)空白表项位置*/
}
}
/*j==-1说明既没有(yǒu)匹配上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/*数组名即為(wèi)指针*/
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;
}