*/
s = splimp();/*关中断,凡是对队列进行操作的都要*/
IF_DEQUEUE(&arpintrq, m);/*把队列中的第一个mbuf链的指针放入m中
我们来看看这个宏
#define IF_DEQUEUE(ifq, m) { \ /*当然,这ifq是指arpintrq
(m) = (ifq)->;ifq_head; \ /* 第一个mbuf链放到m中
if (m) { \ /*如果m指向空,在宏之外的函数会处理
if (((ifq)->;ifq_head = (m)->;m_nextpkt) == 0) \ /*把该链的下一个链首放入队列头并判断是否为空
(ifq)->;ifq_tail = 0; \ /*如果头都为空,那么尾巴一定要置空,要不然...就全乱套了
(m)->;m_nextpkt = 0; \ /*多此一举,你们看看上面都判断了为空,这里还要填空
(ifq)->;ifq_len--; \ /* 长度减一
} \
}
*/
splx(s);/*操作完成,开中断*/
if (m == 0 || (m->;m_flags & M_PKTHDR) == 0)/*因为上面的宏会返回空,所以在这里要处理一下*/
panic("arpintr");
if (m->;m_len < sizeof(struct arphdr) &&
((m = m_pullup(m, sizeof(struct arphdr))) == NULL)) {
/*注意上面这个if,他是先执行m->;m_len<sizeof(struct arphdr),
也就是说如果mbuf链的第一个mubf的长度小于标准的arp头部的话,有可能在这个mbuf中
只有arp头的一部分,另外一部分通过调用m_pullup合并相邻的这两个mbuf看看是否有效,
根据统计,通常是无效的,这种情况在判断IP头的时候也会遇到.m_pullup是一大函数,以后我
会讲一讲
*/
log(LOG_ERR, "arp: runt packet -- m_pullup failed\n");/*记录下来*/
continue;/*既然这个mbuf链是无意义的,那么进行下一个while*/
}
ar = mtod(m, struct arphdr *);
if (ntohs(ar->;ar_hrd) != ARPHRD_ETHER
&& ntohs(ar->;ar_hrd) != ARPHRD_IEEE802) {
log(LOG_ERR,
"arp: unknown hardware address format (0x%2D)\n",
(unsigned char *)&ar->;ar_hrd, "");
m_freem(m);/*释放掉该mbuf链*/
continue;/*既然这个mbuf链是无意义的,那么进行下一个while*/
}
if (m->;m_pkthdr.len < sizeof(struct arphdr) + 2 * ar->;ar_hln/*这是判断该mbuf链的
| 论坛热门帖子: | [lch203] 写得蛮好的linux学习笔记(10-21) [黑马制造] 学习java的30个目标(10-19) [笑傲股林] 做测试半年了,有点迷茫,应该再学些什么提高自己的测试水平和测试能力呢?(10-19) [udp8589] 大家用google的来吱一声? 用百度的~~也来报道下?(10-18) [沂偌掳兆] 本人总结的一些认为C++比较经典的书籍,希望对大家有用(10-18) |
| TAG标签: | 及其 漏洞 分析 详解 协议 地址 解析 ARP IP if ea- 路由 |
注册
个人空间
