sdl->;sdl_family == AF_LINK && sdl->;sdl_alen != 0) { /*地址类型是硬件链路层地址,并且地址长度不为0*/
bcopy(LLADDR(sdl), desten, sdl->;sdl_alen); /*那么就拷贝该硬件地址到desten*/
return 1; /*ether_output函数如果得到返回值1(成功),那他就知道*/
} /*他调用时的desten指针指向了正确的对方的硬件地址*/
/*
* 如果接口不支持ARP(PPP等点对点网络).
*/
if (ac->;ac_if.if_flags & IFF_NOARP)
return (0);
/*
* 先把要发送的数据指针临时保存,等到发送ARP请求查询包后,得到正确的对方硬件地址时再发送
*/
if (la->;la_hold) /*上次的mbuf还有没发的吗(也是因为同样的原因,但要发送的IP没一直没被解释)*/
m_freem(la->;la_hold); /*释放掉上次的包(一个mbuf链),因为上次的地址可能找不到了*/
la->;la_hold = m; /*把这次的保存进去*/
if (rt->;rt_expire) { /*如果不是永久ARP节点*/
rt->;rt_flags &= ~RTF_REJECT;
if (la->;la_asked == 0 || rt->;rt_expire != time_second) {/*不在同一秒钟,即一秒钟可发一次,5次后还没解析,就停止20秒*/
rt->;rt_expire = time_second;/*当前时间*/
if (la->;la_asked++ < arp_maxtries)/*在解释地址时重复发送ARP请求的包的次数,共5次*/
arprequest(ac,&SIN(rt->;rt_ifa->;ifa_addr)->;sin_addr,&SIN(dst)->;sin_addr, ac->;ac_enaddr);/*发送请求*/
else {
rt->;rt_flags |= RTF_REJECT;/*为了防止ARP泛洪,*/
rt->;rt_expire += arpt_down;/*arpt_down=20秒,一旦公布了down, 20秒不发送 */
la->;la_asked = 0;/*一共可以询问5次,从0次开始,上面有++*/
}
}
}
return (0);
}
/*
* 当数据包在if_ethersubr.c中的ether_input函数处理后,如果查到源,目的地址后的
* 2字节是ETHERTYPE_ARP时会产生一软中断,中断向量指向此arpintr函数,实际上的意思
* 是网络上有一ARP包被我们的网卡接收了.就由arpint函数处理
*/
static void
arpintr()
{
register struct mbuf *m;
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 及其 漏洞 分析 详解 协议 地址 解析 ARP IP if ea- 路由 |
注册
个人空间
