mirror of
https://github.com/jmcorgan/fips.git
synced 2026-09-14 00:45:08 +00:00
A peer entry listing addresses on two transports dials both at startup. The first completion made the session; the second was misread: the responder classified its msg1 as a rekey (it came from an active peer) and set a pending session the initiator never cut over to, while the initiator resolved it as a cross-connection and swapped or discarded. Two ends, two ideas of the session. Now the inbound establish rule reads two more facts from the registry: whether the existing peer is live, and whether it already has a path on the transport the msg1 arrived on. A live peer's msg1 on a transport with no path is not a rekey, which rides an existing path, but a fresh handshake over a new transport: it runs as a net-new establish so the initiator's handshake completes, and the promotion keeps the transport as a path under the session both ends already share, dropping the new session. The outbound rule mirrors it: a completion over a new transport to a live peer is a keep, and the shell adds the path. Both ends therefore keep the same session and gain the same path, which the heartbeat tick proves within one interval. Once a discovery tick, a configured address of a live peer on a transport it has no path over is added as a path as well: an address whose transport was down at dial time (wifi joined later, Tor came up) was otherwise never looked at again, since an active peer is not re-dialled. The dual-udp-flap scenario is config-driven now: the dial owner lists udp/main and udp/<veth>, both dial at startup, and the veth handshake is kept as a path 55 ms after the bridge promotion. Run: 18 switches in [4, 18], 0 errors, one promotion per node.
Reference
Information-oriented technical descriptions for lookup on demand. Reference content describes what is: wire formats, configuration keys, command-line flags, control-socket commands, default values, file paths, exit codes. It is consulted, not read end-to-end.
Reference is austere by design: minimal narrative, no opinions, no guidance on when to use a feature. The "why" lives in design/; the "how do I accomplish X" lives in how-to/.
Available Reference
| Document | Scope |
|---|---|
| wire-formats.md | All FMP and FSP message byte layouts, encapsulation walkthrough |
| configuration.md | Full YAML configuration reference for the daemon and gateway |
| security.md | nftables baseline, peer ACL, cryptographic primitives, rekey defaults, threat-resistance matrix |
| nostr-events.md | Kind 37195 advert, Kind 21059 traversal signaling, Kind 10050 inbox relays |
| transports.md | Per-transport statistics counter inventory |
| control-socket.md | Line-delimited JSON control protocol for the daemon and gateway |
| native-api.md | Native datagram API: the Rust surface, addressing and ports, errno table, ceilings, line protocol, command reference |
| cli-fips.md | fips daemon CLI: options, exit codes, environment, files |
| cli-fipsctl.md | fipsctl control-client: subcommands, options, exit codes |
| cli-fipstop.md | fipstop live-status TUI: tabs, keybindings |
| cli-fips-gateway.md | fips-gateway service CLI: options, exit codes, files |