Skip to content

v0.3.1

Choose a tag to compare

@github-actions github-actions released this 05 Oct 15:44
· 1687 commits to main since this release

v0.3.1 — network changes, router port mappings, anchors

When the network changes

  • The daemon notices a network change as it happens. It listens to the operating system (a routing socket on macOS, rtnetlink on Linux) rather than polling, and counts a change only when the machine's routable addresses or default route differ.
  • It acts on the change at once. It forgets the outside addresses it had observed, redoes its port mappings, republishes each attached node's record to its rooms' boards and anchors, and redials every peer and anchor. A connected peer gets messages within seconds instead of waiting out a dead connection. The change is said once in the log and to clients, and vox status --json names when it happened.

Connections on macOS

  • A Mac that listens on every address answers from the address it was reached at. A peer that dials it at one of its addresses while the route back leaves by another, such as a Mac on Wi-Fi with a VPN up dialled at its LAN address, gets its replies. Vox carries a patched copy of quinn-udp for this until upstream has the fix.
  • A node bound to one IPv6 address doesn't dial [::1], where it could never be answered. A join whose link gives no address this node can send to, with nothing able to carry a circuit, says so at once instead of waiting 30 s.

Throughput on Linux

  • A Linux node keeps its full speed on paths that carry large packets: nodes or agents on one machine, a jumbo-frame LAN, a VM or container bridge. Vox never sends a batch larger than one UDP datagram: Linux refuses such a batch without a word, and it would read as a path that drops large packets. On a congested 200 Mbit/s link shared with a TCP flow, Vox now carries 186 Mbit/s.

Router port mappings

  • The router is found on macOS too, for IPv4 and IPv6, from the default route.
  • vox status --json names, per address family, which routers were asked and which method answered: PCP, NAT-PMP, UPnP-IGD or a pinhole, or that none did.
  • A PCP mapping keeps its nonce for every renewal and for its deletion, and renews on RFC 6887's schedule: at a random point between 1/2 and 5/8 of its lifetime, and after a failure, again at 3/4 and 7/8.
  • Port mappings are deleted when the daemon stops, and a mapping won by a candidate that lost the race is deleted as soon as the race ends.
  • Checked against a real home router (a Netgear Orbi): the mapping was granted, renewed and deleted.

Anchors

  • After a key rotation an anchor serves the room's current epoch, not only its first, so members reached through it and new joiners keep up.
  • vox node's "Elsewhere:" list names only addresses another machine can dial: no loopback.
  • An anchor's board line says what it counts, in words: bbgxlstzoacg: 1 member, 0 pending, 5 entries. When the number of entries isn't known, it says nothing about entries.

Agent comms

  • vox room post refuses a raw claim-protocol message (claim, release, handoff, renew, a decline naming a resource) and names the verb to use. An urgent message addressed to nobody wakes nobody.

Containers

  • Vox run as root is told at once that the daemon refuses root, and to run as an ordinary user (in a container, a non-root USER, e.g. podman run --user 1000 …). vox daemon will not start as root.
  • The manual says what a container host needs: on a Linux host, net.core.rmem_max of at least 4 MiB, set on the host. A container can't raise it, and with a smaller receive buffer a busy host can cut throughput to a fraction of the link.

Data directories

  • A data directory not laid out the way this version reads is refused, with the reason, and left unchanged.

Work items delivered

  • #108 RP-01: The agent-comms envelope and claim rules hold, through the shipped binary
  • #350 V030-28: adapter_stream_proof measures its claim on v0.3.0's single deterministic order
  • #356 V210-137: An anchor tracks every epoch of a room, not only epoch 0
  • #368 V030-31: Unproven agent-comms guards get real-binary mutants
  • #395 V210-170: An anchor's "Elsewhere" list names only addresses another machine can dial
  • #396 V210-171: An anchor's board line says what it counts, in words
  • #413 V030-39: A node notices when the machine's network changes
  • #414 V030-40: A network change is acted on at once: republish and redial
  • #415 V030-41: The router's address is found on macOS, for IPv4 and IPv6
  • #416 V030-42: vox status says which router was asked and which method answered
  • #417 V030-43: A PCP mapping keeps its nonce and renews on the RFC's schedule
  • #418 V030-44: Port mappings are deleted when the daemon stops, and unused grants at once
  • #419 V030-45: Port mapping is checked against a real router (opt-in)
  • #423 V030-46: Vox carries no code for data from earlier releases
  • #424 V030-47: A client running as root is told at once that the daemon refuses root
  • #425 V030-48: The user manual describes v0.3.1, including what a container host needs
  • #426 V030-49: On Linux, Vox keeps its share of a congested link: a send batch never exceeds one UDP datagram