以下内容都基于linux内核2.4.0源码)
在include/net/neighbour.h中定义了ARP有限状态机所对应的各种状态:
27 #define NUD_INCOMPLETE 0x01
28 #define NUD_REACHABLE 0x02
29 #define NUD_STALE 0x04
30 #define NUD_DELAY 0x08
31 #define NUD_PROBE 0x10
32 #define NUD_FAILED 0x20
33
34 /* Dummy states */
35 #define NUD_NOARP 0x40
36 #define NUD_PERMANENT 0x80
37 #define NUD_NONE 0x00
38
49 #define NUD_IN_TIMER (NUD_INCOMPLETE|NUD_DELAY|NUD_PROBE)
50 #define NUD_VALID (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE|NUD_PROBE|NUD_STALE|NUD_DELAY)
51 #define NUD_CONNECTED (NUD_PERMANENT|NUD_NOARP|NUD_REACHABLE)
各状态的含义:
NUD_NONE: 初始状态。当一个新的路由缓存条目被创建时,arp_bind_neighbour()函数被调用.
如果找不到相匹配的ARP缓存条目, neigh_alloc()将创建一个新的ARP缓存条目并设置
状态为NUD_NONE.
NUD_INCOMPLETE:未完成状态。当第一个包发送需要新的ARP缓存条目时neigh_resolve_output()被调用.
最后实际调用的是neigh_event_send()函数,它发送一个ARP请求并置传输状态为NUD_INCOMPLETE.
NUD_REACHABLE:可达状态。当收到ARP响应时,邻居表进入NUD_REACHABLE状态.
NUD_STALE:过期状态。当定时器触发neigh_periodic_timer()函数扫描到邻居表条目的最后时间超过可达
时间参数时,它设置条目状态为过期状态.
NUD_DELAY:延迟状态。当在NUD_STALE状态下有报文需要发送时,调用neigh_resolve_output()函数发送数据,
在发送报文同时,将状态迁移到这个状态,同时启动一个定时器。
NUD_PROBE:探测状态。NUD_DELAY的定时器到时调用neigh_timer_handler()迁移到这个状态,这个状态下,
发送ARP请求并等待响应。
NUD_FAILED: 失败状态。连续重发多次都没有响应
NUD_NOARP:不需要解析,如PPP接入
NUD_PERMANENT:静态ARP
NUD_IN_TIMER:定时器状态。表示邻居系统正在运行一个定时器
NUD_VALID:有效状态。表示邻居表有一个可用地址
NUD_CONNECTED:连接状态。表示可以直接根据邻居系统发送数据包
状态迁移图:
a: __neigh_event_send(net/core/neighbour.c): 707
n->state == NUD_NONE
c: neigh_periodic_timer(net/core/neighbour.c):
d: __neigh_event_send(net/core/neighbour.c):740
n->state == NUD_STALE
f: neigh_timer_handler: 650
neigh_sync:543
now-n->confirmed < n->parms->reachable
arp_rcv:767
e: neigh_timer_handler(net/core/neighbour.c): 657
n->state == NUD_PROBE