Repository navigation
podnet v0.4.0-beta.1
Pre-releaseThe 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
- Run
cfrs autostart remove NAMEfor each entry, andcfrs warp down.
podnet does not see the markers and the units of cfrs. - Install podnet new.
cfrs updatecannot install it: it looks for the
assets ofcfrs. - To keep the WARP device, move
~/.local/state/cfrsto
~/.local/state/podnet, or setPODNET_STATE_DIR. podnet registers no
new device then. - 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.
- The binary is
podnet(wascfrs). The assets arepodnet-TARGET
(werecfrs-TARGET). The manual page ispodnet.1(wascfrs.1). The
repository isPodUtils/podnet, and the signature identity is
https://github.com/PodUtils/podnet/.github/workflows/release.yml@refs/tags/TAG. - The
pod-netnsbinary and its assets are gone. Usepodnet pod. It has
each option of the old command line, andpodnet pod doctor. The crate
podnet-netns(waspod-netns) is a library only. - The image is
ghcr.io/podutils/podnet(wasghcr.io/azathothas/cfrs). - The variables change:
CFRS_XisPODNET_X,CFRSNET_Xis
PODNET_VNET_X, andCFRSSOCKS_XisPODNET_SOCKS_X. The old names have
no effect. The variablesPOD_NETNS_QUIETandPOD_NETNS_TEST_MEMof the
pod library arePODNET_NETNS_QUIETandPODNET_NETNS_TEST_MEM. - The state directory is
~/.local/state/podnet(was
~/.local/state/cfrs). The run directory is$XDG_RUNTIME_DIR/podnet
(was$XDG_RUNTIME_DIR/cfrs), andpodnet-UIDin the temporary directory
(wascfrs-UID). podnet does not read the old directories. - The default name of the TUN interface is
podnet0(wascfrs0). - The units are
podnet-NAME.service(werecfrs-NAME.service). The cron
marker is# podnet autostart NAME. The blocks and files ofwarp up
have the namespodnet: the block# >>> podnet warp up >>>,
90-podnet-warp.confandconf.d/podnet-warp.fish.podnet warp down
does not remove the files of cfrs. - The metrics are
podnet_*(werecfrs_*). - The paths of the edge are
/__podnet/wsand/__podnet/unlock(were
/__cfrs/wsand/__cfrs/unlock). A client and a server must both be
podnet. - The User-Agent is
podnet/VERSION(wascfrs/VERSION). The realm of the
proxy login ispodnet. - The log filter is
podnet=LEVEL(wascfrs=LEVEL), for example
RUST_LOG=podnet=debug. - The default directories of the file commands are
~/Downloads/podnet
and~/podnet-uploads.
Output and exit codes:
podnet pod doctoruses the verdict words ofpodnet doctor. The text
form givesokorfailfor each probe and each backend (before:ok,
no,available,unavailable). The JSON form has the new keys
schema(1),verdictfor each capability, andverdicts(netns,
seccomp,any). The keysok,backend_netns,backend_seccompand
backend_availablestay. The exit code stays 3 when no backend can run.- A refused TCP bind exits 69 in
net switch,net proxy,warp proxy,
relay connect --listenandnet tailscale. tunnel --configwith an origin flag (--port,--forward,
--no-tls-verify) exits 64 and names the flag. It ignored the flag
before.relay stopchecks the pair before it stops the local node.- The ready line of
share --jsonhas the keysschemaandpodnet. doctor --agent: a row isokonly when the index host and the file host
both answer.doctor --relay URLchecks the relay that you name.
Behaviour:
- An ingress
path:rule matches the decoded path, as cloudflared does:
%XXis decoded,+stays. A rule for/a bnow matches/a%20b. - The library static path decodes
+as a plus. A bad escape (%zz) is
refused. - The pair file of the relay always has mode 0600.
loadchecks the file. warp exportwrites the reserved bytes in the file.warp export --checkchecks 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,
recvmmsgand UDP names over 255 bytes work. - A slow
connectdial does not stop the supervisor for other calls. - The close of a UDP socket stops its relay and frees its descriptors. A
datagram written withwrite(2)leaves the pod.bindon a datagram
socket is recorded, andgetsocknamereports 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 tunhas a SYN probe and--session-max-age, and setsrp_filter
to 0 on its interface. warp exec,warp shellandwarp ncfind a runningwarp upthat has
another state directory.warp execandwarp shelltake--backend,
and name the backend in one line.warp forwardhas the pins of--resolveand a list of the forwards.status, the ready document andwarp statushavedata_pathand the
time of the last TCP probe.warp statusnames thewarp-tuninstance.warp up --tunforwards--replaceand refuses the flags that it cannot
forward.warp downandwarp up --persistown the fish file only when
podnet wrote it.warp ssh-configprints aProxyCommandwith the same quote as--write.warp proxy --dnshas a bound and a counter.
Tunnel and DNS:
tunnel verifykeeps 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.
WebSocketTunneldials 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 whentailscaledis 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 doctornames each command that listens. net proxy --forwardtakes 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 tailscaleandpod --servehave 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
closeaborts the session task of the node. The relay node waits
after a local end of stream.relay connect --listenhas the instance
surface ofconnect -L.
Other commands:
serveof a directory with noindex.htmllogs no WARN for the 404 at/.- A nested detached start does not inherit
PODNET_DETACH_SUPERVISED. agent status --jsonprints the status as JSON.--no-verifyis 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.rsis split into the modulesrc/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
podnetexists. - 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)