<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tailscale, branch awly/deadcode-sysresources</title>
<subtitle>The easiest, most secure way to use WireGuard and 2FA</subtitle>
<id>http://git.waynecole.info/tailscale/atom?h=awly%2Fdeadcode-sysresources</id>
<link rel='self' href='http://git.waynecole.info/tailscale/atom?h=awly%2Fdeadcode-sysresources'/>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/'/>
<updated>2026-04-24T22:57:18Z</updated>
<entry>
<title>util/sysresources: remove unused package</title>
<updated>2026-04-24T22:57:18Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-24T22:56:00Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=00132f2615c9d1f1dab615a85cfa3fe6598f6677'/>
<id>urn:sha1:00132f2615c9d1f1dab615a85cfa3fe6598f6677</id>
<content type='text'>
Added a few years ago and appears to be unused.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;
</content>
</entry>
<entry>
<title>wgengine/netstack: absorb all quad-100 traffic locally, never leak to peers</title>
<updated>2026-04-24T19:42:16Z</updated>
<author>
<name>James Tucker</name>
<email>james@tailscale.com</email>
</author>
<published>2026-04-24T02:18:44Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=1b40911611b37947bdc905dec30b2914af540920'/>
<id>urn:sha1:1b40911611b37947bdc905dec30b2914af540920</id>
<content type='text'>
Previously, handleLocalPackets intercepted traffic to the Tailscale
service IP (100.100.100.100 / fd7a:115c:a1e0::53) only for an allow-list
of ports: TCP 53/80/8080 and UDP 53. Any other port returned
filter.Accept, letting the packet fall through to the ACL filter and
wireguard-go, which would attempt a peer lookup. No peer owns the
quad-100 AllowedIP, so after ~5s pendopen.go would log:

    open-conn-track: timeout opening ...; no associated peer node

This is the common "conntrack error no peer found for 100.100.100.100:853"
log spam seen in the wild (e.g. from systemd-resolved or another
resolver speculatively trying DoT on quad-100). It also leaks quad-100
packets onto the tailnet.

Remove the port allow-list so handleLocalPackets absorbs every quad-100
packet into netstack regardless of IP protocol or port. Traffic never
reaches the conntrack / peer-routing layers.

With the allow-list gone, acceptTCP needs a corresponding guard: on a
quad-100 TCP port we don't serve, execution used to fall through to the
isTailscaleIP case (quad-100 is in the tailscale IP range), which
rewrote the dial target to 127.0.0.1:&lt;port&gt; and forwardTCP'd the
connection to whatever happened to be listening on the host's loopback
at that port. Add a hittingServiceIP case that RSTs cleanly instead,
placed before the isTailscaleIP fallthrough.

TestQuad100UnservedTCPPortDoesNotForward is a new integration test that
injects a TCP SYN to 100.100.100.100:853 via handleLocalPackets, stubs
forwardDialFunc, and asserts the dialer is not invoked; it catches
regressions of the acceptTCP recursion/loopback-redirection case.

Fixes #15796
Fixes #19421
Updates #3261
Updates #11305

Signed-off-by: James Tucker &lt;james@tailscale.com&gt;
</content>
</entry>
<entry>
<title>version: use debug.ReadBuildInfo in CmdName on non-Windows</title>
<updated>2026-04-24T16:48:11Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-22T04:38:55Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=006d7e180e4a46112b1905f1e2c2e1060ef31d8b'/>
<id>urn:sha1:006d7e180e4a46112b1905f1e2c2e1060ef31d8b</id>
<content type='text'>
CmdName was re-opening the running executable and scanning it in
64KiB chunks for the Go modinfo markers on every call. The same
modinfo is already parsed at startup and exposed via
runtime/debug.ReadBuildInfo, so prefer that on non-Windows. Windows
still takes the scanning path because its GUI-binary override keys
off the on-disk executable name.

benchstat of BenchmarkCmdName (Linux, before vs after):

    goos: linux
    goarch: amd64
    pkg: tailscale.com/version
    cpu: Intel(R) Xeon(R) 6975P-C
               │  /tmp/old.txt  │            /tmp/new.txt             │
               │     sec/op     │   sec/op     vs base                │
    CmdName-16   556045.5n ± 1%   825.6n ± 1%  -99.85% (p=0.000 n=10)

               │ /tmp/old.txt  │             /tmp/new.txt             │
               │     B/op      │     B/op      vs base                │
    CmdName-16   64.587Ki ± 0%   1.156Ki ± 0%  -98.21% (p=0.000 n=10)

               │ /tmp/old.txt │            /tmp/new.txt            │
               │  allocs/op   │ allocs/op   vs base                │
    CmdName-16     8.000 ± 0%   7.000 ± 0%  -12.50% (p=0.000 n=10)

Fixes #19486

Change-Id: I925c5e28b64815a602459beb6c8dab8779339a6c
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>feature/conn25: add the ability to return addresses to the IP Pools</title>
<updated>2026-04-24T15:48:48Z</updated>
<author>
<name>Fran Bull</name>
<email>fran@tailscale.com</email>
</author>
<published>2026-04-21T14:49:43Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=306fab796cd9d071b412a751cf002890a32788bb'/>
<id>urn:sha1:306fab796cd9d071b412a751cf002890a32788bb</id>
<content type='text'>
This will be used as part of the address assignment expiry work.

Updates tailscale/corp#39975

Signed-off-by: Fran Bull &lt;fran@tailscale.com&gt;
</content>
</entry>
<entry>
<title>ipnlocal/drive: reduce noisey per-peer remote logs (#19493)</title>
<updated>2026-04-24T15:26:33Z</updated>
<author>
<name>kari-ts</name>
<email>135075563+kari-ts@users.noreply.github.com</email>
</author>
<published>2026-04-24T15:26:33Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=aa740cb393c05e973400e05b7485cdda36181ce7'/>
<id>urn:sha1:aa740cb393c05e973400e05b7485cdda36181ce7</id>
<content type='text'>
This drops the per peer "appending remote" log while constructing the remote list, which can get noisy on big tailnets, and keeps logs around remote availability checks, including whether a peer is missing, offline, lacks PeerAPI reachability, lacks sharing permission, or is available.

Updates tailscale/corp#40580

Signed-off-by: kari-ts &lt;kari@tailscale.com&gt;</content>
</entry>
<entry>
<title>go.mod: bump github.com/google/go-containerregistry (#19500)</title>
<updated>2026-04-23T17:39:27Z</updated>
<author>
<name>Andrew Lytvynov</name>
<email>awly@tailscale.com</email>
</author>
<published>2026-04-23T17:39:27Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=ad9e6c19257a13fd619fbbd07468830925c8e520'/>
<id>urn:sha1:ad9e6c19257a13fd619fbbd07468830925c8e520</id>
<content type='text'>
This drops an indirect dependency on the old github.com/docker/docker
(which was replaced with github.com/moby/moby) and fixes a couple recent
CVEs.

Updates #cleanup

Signed-off-by: Andrew Lytvynov &lt;awly@tailscale.com&gt;</content>
</entry>
<entry>
<title>wgengine/magicsock: do not send TSMP disco when connected (#19497)</title>
<updated>2026-04-23T16:23:57Z</updated>
<author>
<name>Claus Lensbøl</name>
<email>claus@tailscale.com</email>
</author>
<published>2026-04-23T16:23:57Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=ee76a7d3f8a8d4bcdb7620f64dd0d9715643559b'/>
<id>urn:sha1:ee76a7d3f8a8d4bcdb7620f64dd0d9715643559b</id>
<content type='text'>
When there is an active connection between devices, do not send new
disco keys via TSMP.

Updates #12639

Signed-off-by: Claus Lensbøl &lt;claus@tailscale.com&gt;</content>
</entry>
<entry>
<title>misc/genreadme,tempfork/pkgdoc,tsnet: generate README.md files from godoc</title>
<updated>2026-04-22T22:13:09Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-22T21:08:16Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=a7d8aeb8aebc4bb01066eb6ffa69b9d8fe178b81'/>
<id>urn:sha1:a7d8aeb8aebc4bb01066eb6ffa69b9d8fe178b81</id>
<content type='text'>
Adds a CI check to keep opted-in directories' README.md files in sync
with their package godoc. For now tsnet (and its sub-packages under
tsnet/example) is the only opted-in tree. The list of directories
lives in misc/genreadme/genreadme.go as defaultRoots, so CI and humans
both just run `./tool/go run ./misc/genreadme` with no arguments.

The check piggybacks on the existing go_generate job in test.yml and
fails if any README.md is out of date, pointing the user at the same
command.

Along the way:

 - tempfork/pkgdoc now emits Markdown instead of plain text: headings
   become level-2 with no {#hdr-...} anchors, and [Symbol] doc links
   resolve to pkg.go.dev URLs, including for symbols in the current
   package (which the default Printer would otherwise emit as bare
   #Name fragments with no backing anchor in a README). Parsing no
   longer uses parser.ImportsOnly, so doc.Package knows the package's
   symbols and can resolve [Symbol] links at all.

 - genreadme also emits a pkg.go.dev Go Reference badge at the top of
   a library package's README; suppressed for package main.

 - tsnet/tsnet.go's package godoc is expanded in idiomatic godoc
   syntax — [Type], [Type.Method], reference-style [link]: URL
   definitions — rather than Markdown-flavored [text](url) or
   backtick-quoted identifiers, so that both pkg.go.dev and the
   generated README.md render cleanly from a single source.

Fixes #19431
Fixes #19483
Fixes #19470

Change-Id: I8ca37e9e7b3bd446b8bfa7a91ac548f142688cb1
Co-authored-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
Signed-off-by: Walter Poupore &lt;walterp@tailscale.com&gt;
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>wgengine/magicsock: replace peers slice with peersByID map; add Upsert/RemovePeer</title>
<updated>2026-04-22T22:07:11Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-21T19:19:35Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=311dd3839da3b41c515eec87d3dc040861e6dea6'/>
<id>urn:sha1:311dd3839da3b41c515eec87d3dc040861e6dea6</id>
<content type='text'>
Replace Conn.peers (sorted views.Slice) with peersByID, a
map[tailcfg.NodeID]tailcfg.NodeView. The only caller that needed
the sorted slice (the disco message receive path's binary search)
becomes a single map lookup. Drop nodesEqual.

Add Conn.UpsertPeer / Conn.RemovePeer for O(1) single-peer endpoint
work. RemovePeer also performs a targeted single-disco-key cleanup
(previously that scan was O(discoInfo)).

Extract the shared per-peer upsert body as upsertPeerLocked; still
used by SetNetworkMap's bulk path. SetNetworkMap is documented as
the bulk / initial / self-change path; UpsertPeer and RemovePeer
are preferred for single-peer changes.

Make the relay server set update O(1) per peer: add serverUpsertCh
/ serverRemoveCh to relayManager with matching run-loop handlers.
UpsertPeer / RemovePeer evaluate the per-peer relay predicate
locally and dispatch upsert or remove. The full-rebuild
updateRelayServersSet stays for the initial netmap, filter
changes, and fallback.

Move the hasPeerRelayServers atomic from Conn onto relayManager,
next to the serversByNodeKey map it summarizes. The run loop is
now the single writer and needs no back-pointer to Conn;
endpoint's two hot-path readers take one extra hop to
de.c.relayManager.hasPeerRelayServers but the cost is the same
atomic load.

No callers use UpsertPeer/RemovePeer yet; a subsequent change will
plumb per-peer add/remove through the incremental map update path.

Updates #12542

Change-Id: If6a3442fe29ccbd77890ea61b754a4d1ad6ef225
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>tstest/natlab/vmtest,cmd/tta: add TestSiteToSite</title>
<updated>2026-04-22T19:11:30Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-22T03:39:15Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=f289f7e77c66c4870897eb21f1b3a0ba6e83bb14'/>
<id>urn:sha1:f289f7e77c66c4870897eb21f1b3a0ba6e83bb14</id>
<content type='text'>
Verifies that site-to-site Tailscale subnet routing with
--snat-subnet-routes=false preserves the original source IP
end-to-end.

Topology: two sites, each with a Linux subnet router on a NATted WAN
plus an internal LAN, and a non-Tailscale backend on each LAN. Backends
are given static routes pointing to their local subnet router for the
remote site's prefix; an HTTP GET from backend-a to backend-b over
Tailscale returns a body containing backend-a's LAN IP.

Adds the supporting vmtest.SNATSubnetRoutes NodeOption and plumbs
snat-subnet-routes through TTA's /up handler. The webserver started by
vmtest.WebServer now also echoes the remote IP, for the preservation
assertion.

Adds a /add-route TTA endpoint (Linux-only for now) and a vmtest
Env.AddRoute helper so the test can install the backend static routes
through TTA rather than needing a host SSH key and debug NIC.

ensureGokrazy now always rebuilds the natlab qcow2 (once per test
process, via sync.Once) so the test picks up the new TTA and webserver
behavior.

This is pulled out of a larger pending change that adds FreeBSD
site-to-site subnet routing support; figured we should have at least
the Linux test covering what works today.

Updates #5573

Change-Id: I881c55b0f118ac9094546b5fbe68dddf179bb042
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
</feed>
