- 论坛徽章:
- 0
|
内核[2.6.34]相关代码:arp.c neighbour.c
假设表项处于NUD_INCOMPLETE状态,此时它会发送广播ARP报文。
如果它在发送前收到了对方主机的ARP报文,那么在arp_process()中的处理- if (!dont_send) {
- n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
- if (n) {
- arp_send(ARPOP_REPLY,ETH_P_ARP,sip,dev,tip,sha,dev->dev_addr,sha);
- neigh_release(n);
- }
- }
复制代码 neigh_event_ns() -> neigh_update(neigh, lladdr, NUD_STALE, NEIGH_UPDATE_F_OVERRIDE)会导致表项从NUD_INCOMPLETE迁移到NUD_STALE状态,等待表项被主机引用,但实际上之前肯定已经引用过了,因为迁移到了NUD_INCOMPLETE。感觉做了许多无用功,在这种特殊情况下直接迁移到NUD_DELAY不是更好??
另外,“Understanding Linux Network Internals”书中关于邻居表的状态转移图,并没有NUD_INCOMPLETE迁移到NUD_STALE的,但从代码看是可以的??? |
|