Skip to content

podnet v0.4.0-beta.1

Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 10 Nov 00:52
· 579 commits to main since this release

The first prerelease of podnet, for tests. podnet is the new name of
cfrs. The Cloudflare tunnel is one adapter of podnet. The version line
continues above v0.3.0-beta.12.

The releases up to v0.3.0-beta.12 are the releases of cfrs. They have
cfrs-TARGET and pod-netns-TARGET assets. They are signed as
https://github.com/Azathothas/cfrs/.github/workflows/release.yml@refs/tags/TAG.
Use that identity to check them. Releases from v0.4.0-beta.1 have the
assets and the identity that this note gives.

Binaries

File System
podnet-x86_64-unknown-linux-musl Linux x86-64
podnet-aarch64-unknown-linux-musl Linux ARM64
podnet-armv7-unknown-linux-musleabihf Linux ARMv7 (32-bit, hard float)
podnet-arm-unknown-linux-musleabihf Linux ARMv6 (32-bit, hard float)
podnet-i686-unknown-linux-musl Linux x86 (32-bit)
podnet-riscv64gc-unknown-linux-musl Linux RISC-V 64
podnet-loongarch64-unknown-linux-musl Linux LoongArch64
podnet-powerpc64le-unknown-linux-musl Linux POWER, little-endian

Each binary is static (musl). It needs no C library on the host.
podnet.1 is the manual page. SHA256SUMS lists each file.

The image is ghcr.io/podutils/podnet:v0.4.0-beta.1 (also :beta).

Check a download

sha256sum -c SHA256SUMS --ignore-missing
gh attestation verify podnet-x86_64-unknown-linux-musl --repo PodUtils/podnet
cosign verify-blob --bundle SHA256SUMS.sigstore.json \
  --certificate-identity https://github.com/PodUtils/podnet/.github/workflows/release.yml@refs/tags/v0.4.0-beta.1 \
  --certificate-oidc-issuer https://token.actions.githubusercontent.com SHA256SUMS
sh scripts/rebuild.sh v0.4.0-beta.1   # rebuild and compare (x86_64, aarch64)

podnet update does the first three checks itself.

Move from cfrs

  1. Run cfrs autostart remove NAME for each entry, and cfrs warp down.
    podnet does not see the markers and the units of cfrs.
  2. Install podnet new. cfrs update cannot install it: it looks for the
    assets of cfrs.
  3. To keep the WARP device, move ~/.local/state/cfrs to
    ~/.local/state/podnet, or set PODNET_STATE_DIR. podnet registers no
    new device then.
  4. Rename each variable, unit, path and metric of the list below in your
    scripts, units and dashboards.

Breaking

A command or a script written for v0.3.0-beta.12 must change for each item
below. Item 1 to 12 are the rename.

  1. The binary is podnet (was cfrs). The assets are podnet-TARGET
    (were cfrs-TARGET). The manual page is podnet.1 (was cfrs.1). The
    repository is PodUtils/podnet, and the signature identity is
    https://github.com/PodUtils/podnet/.github/workflows/release.yml@refs/tags/TAG.
  2. The pod-netns binary and its assets are gone. Use podnet pod. It has
    each option of the old command line, and podnet pod doctor. The crate
    podnet-netns (was pod-netns) is a library only.
  3. The image is ghcr.io/podutils/podnet (was ghcr.io/azathothas/cfrs).
  4. The variables change: CFRS_X is PODNET_X, CFRSNET_X is
    PODNET_VNET_X, and CFRSSOCKS_X is PODNET_SOCKS_X. The old names have
    no effect. The variables POD_NETNS_QUIET and POD_NETNS_TEST_MEM of the
    pod library are PODNET_NETNS_QUIET and PODNET_NETNS_TEST_MEM.
  5. The state directory is ~/.local/state/podnet (was
    ~/.local/state/cfrs). The run directory is $XDG_RUNTIME_DIR/podnet
    (was $XDG_RUNTIME_DIR/cfrs), and podnet-UID in the temporary directory
    (was cfrs-UID). podnet does not read the old directories.
  6. The default name of the TUN interface is podnet0 (was cfrs0).
  7. The units are podnet-NAME.service (were cfrs-NAME.service). The cron
    marker is # podnet autostart NAME. The blocks and files of warp up
    have the names podnet: the block # >>> podnet warp up >>>,
    90-podnet-warp.conf and conf.d/podnet-warp.fish. podnet warp down
    does not remove the files of cfrs.
  8. The metrics are podnet_* (were cfrs_*).
  9. The paths of the edge are /__podnet/ws and /__podnet/unlock (were
    /__cfrs/ws and /__cfrs/unlock). A client and a server must both be
    podnet.
  10. The User-Agent is podnet/VERSION (was cfrs/VERSION). The realm of the
    proxy login is podnet.
  11. The log filter is podnet=LEVEL (was cfrs=LEVEL), for example
    RUST_LOG=podnet=debug.
  12. The default directories of the file commands are ~/Downloads/podnet
    and ~/podnet-uploads.

Output and exit codes:

  1. podnet pod doctor uses the verdict words of podnet doctor. The text
    form gives ok or fail for each probe and each backend (before: ok,
    no, available, unavailable). The JSON form has the new keys
    schema (1), verdict for each capability, and verdicts (netns,
    seccomp, any). The keys ok, backend_netns, backend_seccomp and
    backend_available stay. The exit code stays 3 when no backend can run.
  2. A refused TCP bind exits 69 in net switch, net proxy, warp proxy,
    relay connect --listen and net tailscale.
  3. tunnel --config with an origin flag (--port, --forward,
    --no-tls-verify) exits 64 and names the flag. It ignored the flag
    before.
  4. relay stop checks the pair before it stops the local node.
  5. The ready line of share --json has the keys schema and podnet.
  6. doctor --agent: a row is ok only when the index host and the file host
    both answer. doctor --relay URL checks the relay that you name.

Behaviour:

  1. An ingress path: rule matches the decoded path, as cloudflared does:
    %XX is decoded, + stays. A rule for /a b now matches /a%20b.
  2. The library static path decodes + as a plus. A bad escape (%zz) is
    refused.
  3. The pair file of the relay always has mode 0600. load checks the file.
  4. warp export writes the reserved bytes in the file. warp export --check checks a file.

Changes for a tester

Seccomp backend (podnet pod, warp exec, warp shell):

  • A TCP socket stays tracked after its connect. Its options and addresses
    come from its entry. There is one entry for each socket of each process,
    and copies of a descriptor are tracked.
  • A plain upstream descriptor goes to the program after its handshake.
  • ICMP datagram sockets, recvmmsg and UDP names over 255 bytes work.
  • A slow connect dial does not stop the supervisor for other calls.
  • The close of a UDP socket stops its relay and frees its descriptors. A
    datagram written with write(2) leaves the pod. bind on a datagram
    socket is recorded, and getsockname reports it.
  • connect(AF_UNSPEC) dissolves the association of a datagram socket. A
    connected datagram socket takes datagrams from its peer only. Datagram and
    ICMP sockets keep their IP-level options.
  • The limits of the UDP relay (ICMP errors, path MTU) are in the
    documents.
  • The fake DNS pool refuses at its end, and names match with no case.
  • A differential check compares the socket calls with the host kernel. It
    closed six TCP gaps.

WARP:

  • A probe of the TCP data path renews a session that carries no TCP.
    warp tun has a SYN probe and --session-max-age, and sets rp_filter
    to 0 on its interface.
  • warp exec, warp shell and warp nc find a running warp up that has
    another state directory. warp exec and warp shell take --backend,
    and name the backend in one line.
  • warp forward has the pins of --resolve and a list of the forwards.
  • status, the ready document and warp status have data_path and the
    time of the last TCP probe. warp status names the warp-tun instance.
  • warp up --tun forwards --replace and refuses the flags that it cannot
    forward. warp down and warp up --persist own the fish file only when
    podnet wrote it.
  • warp ssh-config prints a ProxyCommand with the same quote as --write.
  • warp proxy --dns has a bound and a counter.

Tunnel and DNS:

  • tunnel verify keeps the tunnel up when this host cannot resolve the name
    yet, pins the new public name while the process runs, and names the remedy
    when the name does not resolve. Quick-tunnel provisioning does not retry a
    DNS failure that cannot recover.
  • The DoH resolver keeps one connection for each server.
  • WebSocketTunnel dials through the egress layer and parses IPv6.
  • An http:// proxy URL with no port has one default port in podnet and
    podssh.
  • The errors of an ingress or config file name the line. The tailnet front
    door warns when tailscaled is not logged in.

Virtual network and relay:

  • The switch counts each packet that it drops. A stack over a switch link has
    bounded queues.
  • The listener table of net doctor names each command that listens.
  • net proxy --forward takes a name as a real target, reports the failed hop
    and reports a failed bind before it prints the forward. net proxy --map
    fills the gateway resolver and the shim table.
  • The doors of net proxy, net tailscale and pod --serve have a deadline
    for the client handshake. A unix listener claims its socket path first. The
    datagram socket of the vnet shim takes the same user only.
  • A relay close aborts the session task of the node. The relay node waits
    after a local end of stream. relay connect --listen has the instance
    surface of connect -L.

Other commands:

  • serve of a directory with no index.html logs no WARN for the 404 at /.
  • A nested detached start does not inherit PODNET_DETACH_SUPERVISED.
  • agent status --json prints the status as JSON.
  • --no-verify is in the README with its limits.
  • The start of a session no longer changes the global git identity (a
    development fix).

Checks:

  • A CI job runs the tests with the loopback down.
  • The source tree moved: src/main.rs is split into the module src/cli/.
    The behaviour is the same (a parity snapshot checks it).

What to report

Open an issue in PodUtils/podnet with the output of podnet bug-report.

Limits

  • This is a beta. Each item of Breaking can change again before the stable
    release.
  • No crates.io release of podnet exists.
  • The Rekor inclusion proof is not checked by podnet update.

The licenses of the crates in the binaries, with their texts: THIRD-PARTY-LICENSES.md.

The commits of this release

WARP and the virtual network

  • warp register: a 2xx answer is never the limit of error 1015 (3bed023)
  • warp: the nameservers of cloudflare-dns are not empty after the take (T-137) (3db91c7)
  • warp: the pins of --resolve come first, ps prints each forward, warp forward --list (T-073) (bbfe527)
  • warp: data_path and last_probe in the record, warp status and podnet status (T-140) (da611f5)
  • pod: seccomp: hand a plain Unix upstream to the program (T-065) (075b83a)

Tunnel and commands

  • podnet-todo: copy crates/podssh-todo of podssh at 427f890 (6969b63)
  • podnet-todo: format the copy with the rustfmt defaults of this workspace (7da2d97)
  • podnet-todo: adapt the copy to this repository; cargo todo (17b9136)
  • podnet-todo: do not read docs/research/; T-005 to T-007 after the rulings of 2026-11-05 (46a0c73)

Documents

  • maintenance: v0.3.0-beta.12 is published (d24e3cd)
  • maintenance: name the handoff file with no path in backticks (802edc8)
  • docs, TODO: the work of a session with no messages from podcrates (ec06f1b)
  • CLAUDE.md: the protocol of a session of PodUtils (cf1b9f6)
  • CLAUDE.md: pin the watcher of the organization at podcrates 54427f6 (3df7fc8)
  • maintenance: how to ask for a run when a push starts no workflow (a new issue for each run) (61c70aa)
  • maintenance: map each request of a run and each COORD issue in the record (e1f3ae1)
  • maintenance: the rule of the owner for a request of a run (one sh block, set -e, echo the run ids) (5aa4c43)
  • maintenance: one workflow in each request of a run; map #338 (7fd3840)

Build, tests and CI

  • ci: check the work record on each push (1c41cf0)
  • secrets: allow the three test proxy URLs that the rename commit wrote again (35f9261)
  • ci: a run by hand (workflow_dispatch), when a push starts no workflow (f05e662)
  • live: the DNS step reads the debug line of pod-dns after the take (T-137) (c970da1)
  • live: the grep of the DoH server takes the form of pod-dns (no quotes) (4094fee)
  • tests: skip the loopback tests on a host with no loopback (T-065, T-076) (dfded5b)
  • deps: trufflehog image 3.99.7 to 3.99.8 (Dependabot #381) (0f490ad)
  • deps: sigstore/cosign-installer 4.1.3 and taiki-e/install-action 2.90.1 (Dependabot #382) (d2f58db)
  • deps: russh 0.64.1 to 0.65.1 (Dependabot #383) (a481ecb)
  • deps: getrandom 0.3 to 0.4 (Dependabot #314) (26371dd)
  • deps: tower-http 0.6 to 0.7 (Dependabot #313) (83fb22f)
  • deps: fuzz/Cargo.lock follows russh 0.65.1, getrandom 0.4 and tower-http 0.7 (13d7c6d)
  • deps: taiki-e/install-action 2.90.2 (Dependabot #415) (d2ae5be)

Other

  • HANDOFF: removed; each item is done (7135237)
  • decisions, research: the podnet rulings and studies of 2026-11-05 (bcd9aa7)
  • TODO: the work record, with the 7 deferred issues as entries (2474f28)
  • check-size: 800 lines for each Rust file, with an allowlist that only shrinks (23aae7a)
  • TODO: the plan of podnet, T-008 to T-135 (f1acf33)
  • rename: cfrs is podnet (T-016, T-018, T-019, T-020) (091b40f)
  • home: the repository is PodUtils/podnet, the image ghcr.io/podutils/podnet (29c35be)
  • TODO: GitHub #311 is T-136; #224 is closed (e409631)
  • rebuild.sh: one binary, no loop (shellcheck SC2043) (e05fecf)
  • decisions, TODO: shared crates in PodUtils/podcrates; only the move goes on (T-137) (af3a57f)
  • decisions, TODO: the design of PodUtils/podcrates (T-137, T-049) (b7682c5)
  • publish.yml: the publish to crates.io by trusted publishing; decisions of 2026-11-05 (5a86129)
  • T-137, T-021, T-136: podnet-todo uses pod-todo v0.1.0; the move is verified (6c210ed)
  • T-017: rebuild.sh rebuilds a cfrs tag; the crates.io facts (db89b7e)
  • decisions, TODO: the rulings Q1 (version beside git) and ghcr package (T-025) (6b1638a)
  • HANDOFF: the state after the move; the next crates (T-137) (c493a27)
  • decisions, TODO: the toolchain of podcrates is Rust 1.99 (T-137) (c7a31f3)
  • T-137: podnet takes pod-tls and pod-core v0.2.0 of PodUtils/podcrates (a5894fe)
  • T-137: version beside git and tag for pod-tls and pod-core (8973052)
  • TODO, docs: the record after the migration to PodUtils/podcrates (a2af228)
  • decisions, TODO: shared CI scripts and the relay watch go to podcrates (T-133, T-134) (542f40b)
  • decisions, TODO: the services crate pod-services (T-137) (66c9512)
  • reports: the inventory of the services of other parties (T-137, pod-services) (aaf6f4c)
  • decisions: the parts of pod-services (T-137) (a8071b1)
  • HANDOFF: the files frozen for pod-proxy and pod-services (T-137) (d60bede)
  • T-133: release.yml takes zig through fetch-zig.sh of PodUtils/podcrates (7ac7681)
  • T-138: the live failures of GitHub #316; the numbers 311 to 317; COORD issues (95d1cf2)
  • T-137: release.yml builds armv7 with cargo-zigbuild (5535ffb)
  • T-133: done; the release dry run 42074286318 passed with fetch-zig.sh of podcrates (a89eb63)
  • T-137: podnet takes pod-proxy v0.3.0 of PodUtils/podcrates (380d9a4)
  • HANDOFF: src/resolve.rs is frozen for pod-dns (T-137) (a0e1ffb)
  • HANDOFF: podcrates v0.4.0 brings pod-dns and pod-services in one patch (T-137) (5ab3da4)
  • T-139: session-start.sh sets the identity of the repository only and drops no commit of main (ef55f3a)
  • HANDOFF, TODO: the checkpoint at ef55f3a; #318 is a pull request (57cfc0b)
  • T-008: parity-snapshot.sh records the commands, the public items and the tests, and names each lost one (fb89bef)
  • T-008: done (fb89bef) (2d59cd1)
  • T-010: check-layers.py fails on a reference to a crate that the crate of the module may not use (72fd502)
  • T-010: done (72fd502) (ef58453)
  • T-011: tests of bug-report, qr, net demo, autostart run and agent status (b5aa31b)
  • T-011: done (b5aa31b) (12f1a52)
  • T-070: warp exec, warp shell and warp nc find a running warp up with another state directory (0293f91)
  • T-070: done (0293f91) (1885f9f)
  • T-063: seccomp: a TCP socket keeps its entry after its connect (7614ddb)
  • T-063: done (7614ddb) (7dfbea0)
  • T-068: WARP: a TCP probe of the data path renews a session that carries no TCP (86050ee)
  • T-068: done (86050ee); T-140: the data path in the status documents (f3d3e6b)
  • T-069: warp tun: a SYN probe of the session, and --session-max-age (7382ff4)
  • T-069: done (7382ff4) (e2c01f8)
  • T-072: warp tun sets rp_filter to 0 on its interface (fb151ca)
  • T-072: done (fb151ca) (e51e9dc)
  • T-075: the datagram socket of the vnet shim takes the same user only (55e8570)
  • T-075: done (55e8570) (6007b39)
  • T-064: seccomp: key the socket table by the socket inode (7c3d1d8)
  • T-064: done (7c3d1d8) (c21700d)
  • T-077: an ingress path: rule matches the decoded path, as cloudflared does (7fe9a2c)
  • T-077: done (7fe9a2c) (689da72)
  • T-081: the tailnet front door warns when tailscaled is not logged in (3807970)
  • T-081: done (3807970) (ceec2df)
  • HANDOFF: the state of the session of 2026-11-06 (e0848b2)
  • T-076: a CI job runs the tests with the loopback down (2ddb0ed)
  • T-078: pod doctor uses the verdict words of doctor and has a schema key (43b3559)
  • T-078: done (43b3559) (8a280e3)
  • T-080: an error of an ingress rule names the line of the rule (7e3d835)
  • T-080: done (7e3d835) (4576438)
  • gitignore: the worktrees of the agents of a session (00ca0a5)
  • T-071: warp exec and warp shell take --backend and name the backend (ee9b44c)
  • T-071: done (ee9b44c) (c19f773)
  • T-070: the help of --socket has no (rustdoc read it as an HTML tag) (61f2e17)
  • T-076: done (2ddb0ed; ci run 42183709673) (c0f1fa4)
  • T-066: seccomp: ICMP datagram sockets, recvmmsg, and UDP names over 255 bytes (f50da2e)
  • T-066: done (f50da2e) (389998b)
  • T-067: seccomp: a slow connect dial does not stop the supervisor (39ab845)
  • T-067: done (39ab845) (eda81fc)
  • T-137: take pod-dns and pod-services of PodUtils/podcrates v0.4.0 (bf0c7ca)
  • T-137: the record of the take of pod-dns and pod-services (bf0c7ca, COORD #320) (1301fb6)
  • T-137: move each podcrates dependency to the tag v0.5.0 (dfd8bd8)
  • T-137: the record of v0.5.0 (dfd8bd8, COORD #321) (64a5ae1)
  • record: map GitHub #319 to #324 (COORD issues and requests of runs) (9d5afa0)
  • record: #323 closed (ci run 42222918056 at 61c70aa: success) (e5c5e6d)
  • T-141: live failed two runs in a row after the take (GitHub #325); map #324 to #326 (72ad352)
  • T-141: done (c970da1, 3db91c7; live run 42226303514); #325 and #326 closed (a2bbc55)
  • T-073: done (bbfe527) (44fa74e)
  • record: map #327 (a request of a ci run) (581e4a5)
  • record: #327 closed (ci run 42245546264 at 581e4a5: success) (f88aacf)
  • T-074: warp export: the reserved bytes, --check, and the probe of the WireGuard leg (3e57e0a)
  • T-074: done (3e57e0a) (2cd9928)
  • record: map #328 and #329 (requests of runs) (3bf268a)
  • record: #328 closed (ci run 42253187093 at 3bf268a: success) (76735c2)
  • record: #329 closed; the runs of T-073 and T-074 (ci 42253187093, live 42253174816 at 3bf268a) (2f80b8e)
  • T-140: done (da611f5) (7f7bcd5)
  • record: map #330 and #331 (requests of runs) (0c4ff75)
  • record: #330 and #331 closed, #332 (the form of the rule of the owner) (1ded7e7)
  • T-137: move each podcrates dependency to the tag v0.6.0 (872a276)
  • T-137: the record of v0.6.0 (872a276, COORD #333); map #333 and #334 (eb836d3)
  • record: #332 closed (T-140 green in ci and live at 0c4ff75); map #335 (3ce7995)
  • record: #334 and #335 closed; map #336 (0b3dfcb)
  • record: v0.6.0 green (ci 42263403147, live 42265938003); #322 and #336 closed (370788d)
  • T-065: done (075b83a) (68098d1)
  • record: map #337 (a request of a run) (4c5ca94)
  • record: #337 and #338 closed; map #339 (cedec16)
  • record: T-065 green (ci 42278745845 at dfded5b, live 42275332991); #339 closed (f1ef274)
  • T-079: done (live run 42275332991: the medians of #206 under 1.5 times; #184 finds the IPv6 exit) (a9fa955)
  • T-026: the tests of src/vnet/switch.rs and podnet-netns upstream.rs in child files (1a724fc)
  • T-026: done (1a724fc) (093938f)
  • record: map #340 (a request of a run) (2cf53f2)
  • record: #340 closed (ci 42283721494 at 093938f: success, T-026) (b39aa1a)
  • T-027: move the stop signals and the waits of src/main.rs to src/cli/signals.rs (968d130)
  • T-027: move the help and the argument rewrites of src/main.rs to src/cli/ (0cb193a)
  • T-027: move the shared options of src/main.rs to src/cli/opts.rs (4493510)
  • T-027: move Cli, Command and the dispatch of src/main.rs to src/cli/mod.rs (e3bf47a)
  • T-027: done (e3bf47a) (8a3ec2c)
  • record: map #341 (a request of a run) (230919f)
  • T-028: move the host commands and the net commands of src/main.rs to src/cli/cmd/ (db1e2a3)
  • T-028: done (db1e2a3) (dfb2a11)
  • record: #341 closed (ci 42286291297 at 8a3ec2c: success, T-027) (b385489)
  • record: map #342 (a request of a run) (12fc22d)
  • T-029: move the server commands of src/main.rs to src/cli/cmd/ (77782e3)
  • T-029: done (77782e3) (4c06607)
  • record: #342 closed (ci 42290515084 at b385489: success, T-028) (416574b)
  • record: map #343 and #344 (requests of runs) (a40fddb)
  • T-030: move the WARP arguments, the client and warp up to src/cli/cmd/warp/ (23759ba)
  • T-030: done (23759ba) (e6e579c)
  • record: T-029 green (ci 42292498940, live 42292490990 at 416574b); #343 and #344 closed (c52b8e0)
  • record: #345 and #346 closed (ci 42296502041, live 42296493409 at c52b8e0); COORD #320, #321 and #333 closed; #312 and #315 closed (29ba18a)
  • T-137: move each podcrates tag to v0.7.0 (86b99de)
  • record: T-142 to T-215 from #347 to #412 (triage) (22f28f3)
  • record: additions to T-055, T-058, T-061, T-096 to T-099 and T-111 from #372 to #377, #384 (triage) (5b59bba)
  • record: map #347 to #412 and the pull requests #381 to #383 in issues.md and github.txt (2ba11cc)
  • record: work order for T-142 to T-215 in PROGRESS.md (0f7b554)
  • T-137: take the metered stream and the clock of pod-core (421eeb9)
  • record: the rulings of 2026-11-09 (betas allowed, no crates.io; the cfb tunnel set waits; Linux only; no test accounts) (1a50c22)
  • record: map COORD-006 (#413), the asks to podcrates (904fb7e)
  • record: the asks of cfb for podnet (PodUtils/podcrates#40): T-216 to T-222 (d1f0716)
  • record: map COORD-007 (#414), the answer to podcrates#37 and #40 (12c2f3b)
  • T-031: move the other WARP subcommands to src/cli/cmd/warp/ (12adeb5)
  • T-031: done (1ca7759)
  • record: Dependabot #381 to #383 closed (0f490ad, d2f58db, a481ecb); #415 open (013b755)
  • record: the ruling Priority of 2026-11-09: the asks of cfb (T-216 to T-222) after podnet's own work (f14ffba)
  • record: COORD-007 (#414) closed (podcrates c229926) (8a5bff1)
  • T-159: Mark the research documents as readings; correct T-040 counts (9738eb9)
  • T-212, T-198, T-164: Fix README, protocol and help text (be7b624)
  • T-212, T-198, T-164, T-159: done (b9af908, 3321ed6) (f878374)
  • record: T-198: the count of alternates is a fact of docs/protocol.md, not a ruling; remove the row of docs/decisions.md (6353319)
  • record: T-159, T-164, T-198, T-212: the Done sections name the commits on main (be7b624, 9738eb9) (dbfcfd6)
  • T-208: warp up --tun forwards --replace and refuses the proxy flags (dd02a91)
  • T-208: done (dd02a91) (43b1d76)
  • T-209: warp status names the warp-tun instance (57ff81c)
  • T-209: done (57ff81c) (cfe88b1)
  • T-211: warp down and warp up --persist own the fish file only when podnet wrote it (9ece848)
  • T-211: done (9ece848) (b9fefa0)
  • T-214: warp ssh-config prints a ProxyCommand with the quote of --write (3f9c205)
  • T-214: done (3f9c205) (bfe3127)
  • T-215: warp proxy --dns has a bound and a counter (be1c8dc)
  • T-215: done (be1c8dc) (4b6fd37)
  • T-213: the WireGuard endpoint of a device record has one derivation (23cb347)
  • T-213: done (23cb347) (48da095)
  • record: T-210: no record of the live account types; the measurement needs a live device (712ec36)
  • T-173: a WARP identity of another uid is a Config error (exit 78) (5a21d81)
  • record: T-173: item 2 done (5a21d81); item 1 waits for pod-warp (d19ef94)
  • Merge the WARP fixes T-208, T-209, T-211, T-213, T-214, T-215 and T-173 (partial) (699163f)
  • T-194: a relay close aborts the session task (699d002)
  • T-194: done (699d002) (4f2babd)
  • T-195: relay stop checks the pair before it stops the local node (77a70f6)
  • T-195: done (77a70f6) (ed79896)
  • T-197: the pair file is always mode 0600, and load checks the file (7efd1d8)
  • T-197: done (7efd1d8) (1a1e729)
  • T-196: the relay node waits after a local end of stream (0682f98)
  • T-196: done (0682f98) (171eebb)
  • T-199: relay connect --listen has the instance surface of connect -L (456c7d9)
  • T-199: done (456c7d9) (06864bb)
  • Merge the relay fixes T-194, T-195, T-196, T-197 and T-199 (20b16c2)
  • record: Dependabot #313, #314 and #415 closed (83fb22f, 26371dd, d2ae5be) (e784949)
  • record: #356, #361, #395 and #409 closed (T-159, T-164, T-198, T-212; ci 42638635724, live 42638635442 at dbfcfd6) (918a4b4)
  • T-142: the close of a UDP socket stops its relay (f974e6b)
  • T-142: done (f974e6b) (bd97737)
  • T-143: a datagram written with write(2) leaves the pod (eb4a8ba)
  • T-143: done (eb4a8ba) (d11f789)
  • T-144: bind on a UDP socket is recorded, and getsockname reports it (bd0db77)
  • T-144: done (bd0db77) (5ad36f6)
  • T-145: the fake-IP pool refuses at its end, and names match with no case (0c3206c)
  • T-145: done (0c3206c) (baada08)
  • T-146: connect(AF_UNSPEC) dissolves the association of a UDP socket (d324710)
  • T-146: done (d324710) (4248684)
  • T-147: a connected UDP socket takes datagrams from its peer only (f2568d4)
  • T-147: done (f2568d4) (6fff0a1)
  • T-148: UDP and ICMP sockets keep their IP-level options (c6aa374)
  • T-148: done (c6aa374) (fa429ca)
  • T-149: the fidelity of UDP stops at the proxy; MSG_ERRQUEUE gets EAGAIN (ba83a3e)
  • T-149: done (ba83a3e) (25ad25e)
  • T-155: a differential check of the socket calls against the host kernel (46b130b)
  • T-155: done (46b130b) (349ace1)
  • Merge the pod backend fixes T-142 to T-149 and T-155; T-223 new (e47d71e)
  • T-185: Bound the opening of a proxy client by 30 s (e0daff1)
  • T-186: The unix listeners claim the socket path first (864fea6)
  • T-185: done (e0daff1) (5221cdf)
  • T-186: done (864fea6) (ede4ac8)
  • T-186: record: the work order drops T-185 and T-186 (f9153f9)
  • T-183: The default port of an http:// proxy URL is 80 (cca2e0a)
  • T-183: done (cca2e0a) (be24804)
  • T-184: doctor: the relay row follows --relay and keeps a loopback relay (aff90d5)
  • T-184: done (aff90d5) (98ef4d8)
  • T-188: net proxy --forward reports a failed bind before it prints the forward (6360717)
  • T-188: done (6360717) (2c3a500)
  • T-188: record: the work order drops T-188 (ff441f1)
  • T-187: net proxy --forward takes a name and uses the process proxy (76d8993)
  • T-187: done (76d8993) (8cd94ba)
  • T-189: The switch counts each packet that it drops (da010b5)
  • T-189: done (da010b5) (e136c03)
  • T-190: A stack over a switch link has bounded queues (b40d290)
  • T-190: done (b40d290) (2ba28f2)
  • T-191: The listener table of net doctor names each command that listens (a1d4666)
  • T-191: done (a1d4666) (831fd5f)
  • T-192: A refused TCP bind exits 69 in each listener command (56ee2fa)
  • T-192: done (56ee2fa) (36c4a7c)
  • T-193: net proxy --map fills the gateway resolver and the shim table (96c43d0)
  • T-193: done (96c43d0) (a286083)
  • T-193: done (96c43d0) (99653fd)
  • Merge the net, doctor and proxy fixes T-183 to T-193 (075a03b)
  • record: #391 to #394, #396, #405, #406, #408 and #410 to #412 closed (ci 42641451152, live 42641450984 at e784949) (27a1ad8)
  • T-137: move each podcrates tag to v0.8.0 (0df677d)
  • record: T-172, T-175 and T-182 open again (podcrates v0.8.0 has their parts); the datagram path of upstream.rs is frozen (PodUtils/podcrates#42) (9c452a1)
  • record: map COORD-008 (#416) (74e31a3)
  • T-175: one DoH connection for each server; a startup line when the egress resolves names (b61a90e)
  • T-175: done (b61a90e) (b107c6f)
  • T-175: done; the work order drops it (8e8d300)
  • T-172: read the pins again at each verify attempt (8b0c546)
  • T-172: done (8b0c546) (2a00a1e)
  • T-182: doctor --agent checks the file host of pip, cargo and docker (9c5eda7)
  • T-182: done (9c5eda7) (6e3a491)
  • Merge T-175, T-172 and T-182 (the parts of podcrates v0.8.0) (76c6645)
  • T-142, T-155: the datagram tests and the differential check skip on a host with no loopback (13e5ada)
  • T-160, T-171: a verify that fails before the edge keeps the tunnel up (ebc94ea)
  • T-160, T-171: done (ebc94ea) (11e6805)
  • T-169: put the IPv6 front door first with no IPv4 route (243720f)
  • T-169: partial (243720f): the flag waits for pod-warp (ec88076)
  • T-170: retry a DNS failure of the quick-tunnel provision once (99aa461)
  • T-170: done (99aa461) (9d53b42)
  • T-201: WebSocketTunnel dials through the egress layer and parses IPv6 (35d2a3b)
  • T-201: done (35d2a3b) (254a0ab)
  • T-202: serve of a directory with no index.html expects 404 at / (7074262)
  • T-203: the ready line of share --json has schema and podnet (6197ff3)
  • T-202, T-203: done (7074262, 6197ff3) (9f30e2f)
  • T-204: tunnel --config refuses the origin flags (71a0afe)
  • T-204: done (71a0afe) (9b2fc77)
  • T-205: a detached child does not inherit PODNET_DETACH_SUPERVISED (e4ad540)
  • T-205: done (e4ad540) (b9b3698)
  • T-206: agent status --json (25435fb)
  • T-206: done (25435fb) (014ff96)
  • T-207: the library static path keeps + as a plus (76ec99a)
  • T-207: done (76ec99a) (8a931db)
  • Merge the tunnel, share, serve and CLI fixes T-160, T-170, T-171, T-201 to T-207; T-169 partial (93bafc2)
  • T-032: move the unit tests of src/main.rs to the modules that they test (ac018b1)
  • T-032: done (ac018b1) (2955f83)
  • Merge T-032: the unit tests of src/main.rs go to their modules (b80c472)
  • T-223: seccomp: close the six TCP gaps of the differential check (d68a51c)
  • T-223: done (d68a51c) (622dec9)
  • Merge T-223: the TCP gaps of the seccomp backend (ab6f0f8)
  • record: 23 issues closed (#347 to #350, #357, #367, #370, #378 to #380, #385 to #390, #398 to #404; ci 42710206231, live 42710206544 at 93bafc2) (eb4ab90)
  • T-022: the version 0.4.0-beta.1, its release note, and the scan of each beta tag (8709d20)
  • T-022: done (8709d20) (0333487)
  • Merge T-022: the version 0.4.0-beta.1 and its release note (e756ce2)