ARP状态

(以下内容都基于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:连接状态。表示可以直接根据邻居系统发送数据包

状态迁移图:

ARP状态_第1张图片
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 

你可能感兴趣的:(c,timer,output,delay,linux内核)