- serve_on pins the client's source IP (parsed datagrams only —
protocol garbage can never move the pin) and sends replies to the
latest-seen port from that IP: a NAT port rebind under a stable IP
keeps receiving (the review 003 S-1 residual, now fixed)
- the RFC 1928 MUST implemented: datagrams from a source IP other
than the pinned one are dropped (previously every parsed datagram
was forwarded regardless of source); the spoof primitive shrinks
from any-source to same-IP off-path
- the residual (a full client IP change mid-association) stays the
RFC's expected-peer posture — revisitable per OQ-SK2-09 (the
control-conn-derived expected IP is the complete fix, ADR-shaped)
- two tests pin the new behavior: the NAT port-rebind follow (the
old port stops receiving, the new one takes over) and the
foreign-IP drop (no reply to the spoofer, the association healthy)
Verification: cargo test --features local (15 suites green, door-udp
38 tests), clippy --all-targets --all-features -D warnings clean,
fmt clean.