<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tailscale/control, branch awly/deadcode-deb</title>
<subtitle>The easiest, most secure way to use WireGuard and 2FA</subtitle>
<id>http://git.waynecole.info/tailscale/atom?h=awly%2Fdeadcode-deb</id>
<link rel='self' href='http://git.waynecole.info/tailscale/atom?h=awly%2Fdeadcode-deb'/>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/'/>
<updated>2026-04-17T11:19:50Z</updated>
<entry>
<title>control/tsp: add lite map update support</title>
<updated>2026-04-17T11:19:50Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-17T04:21:29Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=00a08ea86de27192a6fe2349ff1bf080b7f23f6f'/>
<id>urn:sha1:00a08ea86de27192a6fe2349ff1bf080b7f23f6f</id>
<content type='text'>
Updates #12542
Updates tailscale/corp#40088

Change-Id: Idb4526f1bf1f3f424d6fb3d7e34ebe89a474b57b
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/tsp, cmd/tsp: add low-level Tailscale protocol client and tool</title>
<updated>2026-04-17T03:00:25Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-16T21:15:51Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=50d7176333c1be6519b4754bf9059a49dc58eb63'/>
<id>urn:sha1:50d7176333c1be6519b4754bf9059a49dc58eb63</id>
<content type='text'>
Add a new control/tsp package providing a client for speaking the
Tailscale protocol to a coordination server over Noise, along with a
cmd/tsp binary exposing it as a low-level composable tool for
generating keys, registering nodes, and issuing map requests.

Previously developed out-of-tree at github.com/bradfitz/tsp; imported
here without git history.

Updates #12542

Change-Id: I6ad21143c4aefe8939d4a46ae65b2184173bf69f
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlclient: enable request signatures on macOS (#19317)</title>
<updated>2026-04-15T18:11:14Z</updated>
<author>
<name>Jonathan Nobels</name>
<email>jnobels@gmail.com</email>
</author>
<published>2026-04-15T18:11:14Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=acc43356c632cec5b642ab93fa393684cea09b6a'/>
<id>urn:sha1:acc43356c632cec5b642ab93fa393684cea09b6a</id>
<content type='text'>
fixes tailscale/corp#39422

Updates tailscale/certstore for properly macOS support and
builds the request signing support into macOS builds.  iOS and builds
that do not use cGo are omitted.

Signed-off-by: Jonathan Nobels &lt;jonathan@tailscale.com&gt;</content>
</entry>
<entry>
<title>control/controlclient: handle 429 responses during node registration</title>
<updated>2026-04-15T17:54:08Z</updated>
<author>
<name>Anton Tolchanov</name>
<email>anton@tailscale.com</email>
</author>
<published>2026-04-14T12:27:06Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=958bcda5bff512876c5d11aa10af4b056ca62c4b'/>
<id>urn:sha1:958bcda5bff512876c5d11aa10af4b056ca62c4b</id>
<content type='text'>
If we get a 429 response during node registration, use the `Retry-After`
header for backoff instead of the regular exponential backoff.

The rate limiter error is propagated to the user, just like other
registration errors are, e.g.

```
$ tailscale up
backend error: node registration rate limited; will retry after 57s
exit status 1
```

Updates tailscale/corp#39533

Signed-off-by: Anton Tolchanov &lt;anton@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlclient: add patchify miss stats</title>
<updated>2026-04-15T15:05:57Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-15T14:37:33Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=dbf468740b49f06828d5c8f9bc30f0c51cba4496'/>
<id>urn:sha1:dbf468740b49f06828d5c8f9bc30f0c51cba4496</id>
<content type='text'>
Add an opt-in metrics.LabelMap tracking why patchifyPeer fails to
convert a PeersChanged entry into a PeersChangedPatch. The stats are
gated behind the TS_DEBUG_PATCHIFY_PEER_MISS envknob so there is zero
overhead in normal operation.

peerChangeDiff now takes an optional onFalse callback that is called
with the field name on every non-patchable return path. When the
envknob is off, nil is passed and replaced with a no-op at the top of
peerChangeDiff.

The resulting metric renders as:

    counter_patchify_miss{why="Hostinfo"} 2
    counter_patchify_miss{why="peer_not_found"} 1170

Updates tailscale/corp#40088

Change-Id: I2d4b9074bf42ec03ab296c0629a54106bafa873e
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlclient: accept key if last seen on exist node is absent (#19402)</title>
<updated>2026-04-15T07:53:40Z</updated>
<author>
<name>Claus Lensbøl</name>
<email>claus@tailscale.com</email>
</author>
<published>2026-04-15T07:53:40Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=61c95f409c90728d3c3ad2627ea77fa4e1a48390'/>
<id>urn:sha1:61c95f409c90728d3c3ad2627ea77fa4e1a48390</id>
<content type='text'>
On some nodes (found via natlab), the existing nodes last seen could be
unset. For these cases, we would want to accept the key and write a last
seen. This was breaking the cached netmap natlab tests.

Updates #12639

Signed-off-by: Claus Lensbøl &lt;claus@tailscale.com&gt;</content>
</entry>
<entry>
<title>control/controlclient: improve filter on netmap updates (#19308)</title>
<updated>2026-04-14T12:43:07Z</updated>
<author>
<name>Claus Lensbøl</name>
<email>claus@tailscale.com</email>
</author>
<published>2026-04-14T12:43:07Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=27f1d4c15ddf725b83db1a34ed443b9165ce9e7a'/>
<id>urn:sha1:27f1d4c15ddf725b83db1a34ed443b9165ce9e7a</id>
<content type='text'>
The previous filters would allow for a handful of subtle issues such as
updating the last seen date when the key or online status had not
changed, and making online keys unconditionally make an engine update.

These have been fixed along side making no change updates from TSMP into
a no-op for the engine so we don't have to reconfigure.

A bunch of additional testing has been added as well.

Updates #12639

Signed-off-by: Claus Lensbøl &lt;claus@tailscale.com&gt;</content>
</entry>
<entry>
<title>control/controlclient: avoid calls to ms.netmap() (#19281)</title>
<updated>2026-04-08T13:01:07Z</updated>
<author>
<name>Claus Lensbøl</name>
<email>claus@tailscale.com</email>
</author>
<published>2026-04-08T13:01:07Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=9e68841939170ae132935e26e5e200066b1f62c3'/>
<id>urn:sha1:9e68841939170ae132935e26e5e200066b1f62c3</id>
<content type='text'>
Instead of generating the full netmap, just fetch the peers out the the
existing peers map.

The extra usage was introduced with netmap caching, but there is no need
to call the netmap to get this information, rather the existing peermap
can be used.

Updates #12639

Signed-off-by: Claus Lensbøl &lt;claus@tailscale.com&gt;</content>
</entry>
<entry>
<title>tsd, all: add Sys.ExtraRootCAs, plumb through TLS dial paths</title>
<updated>2026-04-08T01:10:54Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-07T19:09:19Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=a182b864ace45ee69830973a157fdaa07e9e4d3d'/>
<id>urn:sha1:a182b864ace45ee69830973a157fdaa07e9e4d3d</id>
<content type='text'>
Add ExtraRootCAs *x509.CertPool to tsd.System and plumb it through
the control client, noise transport, DERP, and wgengine layers so
that platforms like Android can inject user-installed CA certificates
into Go's TLS verification.

tlsdial.Config now honors base.RootCAs as additional trusted roots,
tried after system roots and before the baked-in LetsEncrypt fallback.
SetConfigExpectedCert gets the same treatment for domain-fronted DERP.

The Android client will set sys.ExtraRootCAs with a pool built from
x509.SystemCertPool + user-installed certs obtained via the Android
KeyStore API, replacing the current SSL_CERT_DIR environment variable
approach.

Updates #8085

Change-Id: Iecce0fd140cd5aa0331b124e55a7045e24d8e0c2
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlclient: add rwlock to peers in mapsession (#19261)</title>
<updated>2026-04-07T12:52:55Z</updated>
<author>
<name>Claus Lensbøl</name>
<email>claus@tailscale.com</email>
</author>
<published>2026-04-07T12:52:55Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=d44649a9e48137f5954fad6e7b1410f94a8a44c4'/>
<id>urn:sha1:d44649a9e48137f5954fad6e7b1410f94a8a44c4</id>
<content type='text'>
After moving around locks in 4334dfa7d5ccbee1daf5acf30b33557bbca66525,
a data race were made possible.

Introduce an RWlock to the mapSession itself for fetching peers.

Fixes #19260

Signed-off-by: Claus Lensbøl &lt;claus@tailscale.com&gt;</content>
</entry>
</feed>
