| trusted -> trusted | A pong arrives for a ping to the best address; trust becomes now plus 6.5 s. | endpoint.go:2006 |
| trusted -> stale | The trust window passes with no pong. The send path starts returning both the direct and the DERP address. | endpoint.go:632 |
| stale -> DERP only | A ping to the best address times out while the window is closed. The address is cleared. | endpoint.go:1236 |
| stale or DERP only -> trusted | A pong arrives from any direct candidate; it becomes the best address. | endpoint.go:1987 |
| probing while not trusted | Every outbound packet and every 3 s heartbeat tick runs a discovery round, limited to one probe per candidate per 5 s, and queues a CallMeMaybe over DERP. | endpoint.go:1101, endpoint.go:869, endpoint.go:1415 |
| peer's CallMeMaybe | Its endpoints are added as candidates and all of them are probed at once, ignoring the 5 s limit. | endpoint.go:2138 |
| any -> DERP only | A major link change, a rebind, or a listening port change wipes the path state of every peer. | magicsock.go:3834, net/netmon/netmon.go:199 |
| any -> DERP only | A UDP send to the best address fails with an unreachable-type error. | endpoint.go:1848 |
| heartbeat stops | Nothing sent for 45 s. The next packet sent restarts probing on the send path itself. | endpoint.go:869, endpoint.go:1014 |