@startuml Title Linux Neighbour States state NONE #ffeded [*] --> NONE: create NONE --> INCOMPLETE: send NONE --> FAILED: send, but\nmcast/app probes=0 state FAILED #ff9090 FAILED --> INCOMPLETE: send FAILED --> FAILED: send, but\nmcast/app probes=0 FAILED: drop skb FAILED: can be released by gc note left of FAILED Unreachable No reply for our probes end note state INCOMPLETE #ffd0d0 INCOMPLETE -> INCOMPLETE: send INCOMPLETE -> INCOMPLETE: timer expired,\nmore probes INCOMPLETE --> REACHABLE: received probe reply,\npush arp_queue INCOMPLETE -> FAILED: timer expired,\nno more probes\npurge arp_queue INCOMPLETE: add_timer now+retrans_time INCOMPLETE: add skb into arp_queue INCOMPLETE: neigh_probe: solicit, broadcasts note left of INCOMPLETE No valid address, send broadcast probes to learn it end note state STALE #edffed STALE --> DELAY: send STALE: can be released by gc\nif not used for gc_stale_time note bottom of STALE No traffic recently, address is stale and will need revalidation on sending end note state REACHABLE #b0ffb0 REACHABLE -> REACHABLE: send REACHABLE -> REACHABLE: timer expired,\nconfirmed(reachable_time) REACHABLE -> DELAY: timer expired,\nnot confirmed(reachable_time)\nbut used(delay_first_probe_time) REACHABLE --> STALE: timer expired,\nnot confirmed(reachable_time) and\nnot used(delay_first_probe_time) REACHABLE: add_timer confirmed+reachable_time note left of REACHABLE Address is recent, confirmed from traffic or probe reply end note state DELAY #d2ffd2 DELAY -> DELAY: send DELAY -> REACHABLE: timer expired,\nconfirmed(delay_first_probe_time) DELAY -> PROBE: timer expired,\nnot confirmed(delay_first_probe_time) DELAY: add_timer now+delay_first_probe_time note bottom of DELAY Allow traffic but avoid probe if traffic advances confirmed time end note state PROBE #e6ffe6 PROBE -> PROBE: send PROBE -> PROBE: timer expired,\nmore probes PROBE -up-> FAILED: timer expired,\nno more probes\npurge arp_queue PROBE -up-> REACHABLE: received probe reply PROBE: add_timer now+retrans_time PROBE: neigh_probe: solicit, ucast+bcast note bottom of PROBE We know address, allow traffic but also send probes because confirmed time is not recently updated by traffic end note @enduml