<feed xmlns='http://www.w3.org/2005/Atom'>
<title>tailscale/control/controlknobs/controlknobs.go, branch bradfitz/rm_lazy_wg</title>
<subtitle>The easiest, most secure way to use WireGuard and 2FA</subtitle>
<id>http://git.waynecole.info/tailscale/atom?h=bradfitz%2Frm_lazy_wg</id>
<link rel='self' href='http://git.waynecole.info/tailscale/atom?h=bradfitz%2Frm_lazy_wg'/>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/'/>
<updated>2026-04-25T01:53:13Z</updated>
<entry>
<title>wgengine, all: remove LazyWG, use wireguard-go callback API for on-demand peers</title>
<updated>2026-04-25T01:53:13Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-04-15T00:49:12Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=f9cd7ada42a79a0ce552ec597f230bc7bf9a5702'/>
<id>urn:sha1:f9cd7ada42a79a0ce552ec597f230bc7bf9a5702</id>
<content type='text'>
Replace the UAPI text protocol-based wireguard configuration with
wireguard-go's new direct callback API (SetPeerLookupFunc,
SetPeerByIPPacketFunc, RemoveMatchingPeers, SetPrivateKey).

Instead of computing a trimmed wireguard config ahead of time upon
control plane updates and pushing it via UAPI, install callbacks so
wireguard-go creates peers on demand when packets arrive. This removes
all the LazyWG trimming machinery: idle peer tracking, activity maps,
noteRecvActivity callbacks, the KeepFullWGConfig control knob, and the
ts_omit_lazywg build tag.

For incoming packets, PeerLookupFunc answers wireguard-go's questions
about unknown public keys by looking up the peer in the full config.
For outgoing packets, PeerByIPPacketFunc (installed from
LocalBackend.lookupPeerByIP) maps destination IPs to node public keys
using the existing nodeByAddr index.

Updates tailscale/corp#12345

Change-Id: I4cba80979ac49a1231d00a01fdba5f0c2af95dd8
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>all: use Go 1.26 things, run most gofix modernizers</title>
<updated>2026-03-06T21:32:03Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-03-05T21:13:57Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=bd2a2d53d3a4d632c9fae7c1b6426c3b5ef34010'/>
<id>urn:sha1:bd2a2d53d3a4d632c9fae7c1b6426c3b5ef34010</id>
<content type='text'>
I omitted a lot of the min/max modernizers because they didn't
result in more clear code.

Some of it's older "for x := range 123".

Also: errors.AsType, any, fmt.Appendf, etc.

Updates #18682

Change-Id: I83a451577f33877f962766a5b65ce86f7696471c
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>net/dns: make MagicDNS IPv6 registration opt-out now, not opt-in</title>
<updated>2026-02-17T17:29:12Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2026-02-17T04:56:51Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=a7a864419d3238756c4c15a532408fa475c9f992'/>
<id>urn:sha1:a7a864419d3238756c4c15a532408fa475c9f992</id>
<content type='text'>
This adds a new ControlKnob to make MagicDNS IPv6 registration
(telling systemd/etc) opt-out rather than opt-in.

Updates #15404

Change-Id: If008e1cb046b792c6aff7bb1d7c58638f7d650b1
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlknobs,net/dns,tailcfg: add a control knob that disables hosts file updates on Windows</title>
<updated>2026-02-13T17:59:37Z</updated>
<author>
<name>Nick Khyl</name>
<email>nickk@tailscale.com</email>
</author>
<published>2026-02-13T04:38:54Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=9741c1e846d0812f5b63c2ad9f6825b0f6753dcd'/>
<id>urn:sha1:9741c1e846d0812f5b63c2ad9f6825b0f6753dcd</id>
<content type='text'>
In the absence of a better mechanism, writing unqualified hostnames to the hosts file may be required
for MagicDNS to work on some Windows environments, such as domain-joined machines. It can also
improve MagicDNS performance on non-domain joined devices when we are not the device's primary
DNS resolver.

At the same time, updating the hosts file can be slow and expensive, especially when it already contains
many entries, as was previously reported in #14327. It may also have negative side effects, such as interfering
with the system's DNS resolution policies.

Additionally, to fix #18712, we had to extend hosts file usage to domain-joined machines when we are not
the primary DNS resolver. For the reasons above, this change may introduce risk.

To allow customers to disable hosts file updates remotely without disabling MagicDNS entirely, whether on
domain-joined machines or not, this PR introduces the `disable-hosts-file-updates` node attribute.

Updates #18712
Updates #14327

Signed-off-by: Nick Khyl &lt;nickk@tailscale.com&gt;
</content>
</entry>
<entry>
<title>all: remove AUTHORS file and references to it</title>
<updated>2026-01-23T23:49:45Z</updated>
<author>
<name>Will Norris</name>
<email>will@tailscale.com</email>
</author>
<published>2026-01-23T21:21:57Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=3ec5be3f510f74738179c1023468343a62a7e00f'/>
<id>urn:sha1:3ec5be3f510f74738179c1023468343a62a7e00f</id>
<content type='text'>
This file was never truly necessary and has never actually been used in
the history of Tailscale's open source releases.

A Brief History of AUTHORS files
---

The AUTHORS file was a pattern developed at Google, originally for
Chromium, then adopted by Go and a bunch of other projects. The problem
was that Chromium originally had a copyright line only recognizing
Google as the copyright holder. Because Google (and most open source
projects) do not require copyright assignemnt for contributions, each
contributor maintains their copyright. Some large corporate contributors
then tried to add their own name to the copyright line in the LICENSE
file or in file headers. This quickly becomes unwieldy, and puts a
tremendous burden on anyone building on top of Chromium, since the
license requires that they keep all copyright lines intact.

The compromise was to create an AUTHORS file that would list all of the
copyright holders. The LICENSE file and source file headers would then
include that list by reference, listing the copyright holder as "The
Chromium Authors".

This also become cumbersome to simply keep the file up to date with a
high rate of new contributors. Plus it's not always obvious who the
copyright holder is. Sometimes it is the individual making the
contribution, but many times it may be their employer. There is no way
for the proejct maintainer to know.

Eventually, Google changed their policy to no longer recommend trying to
keep the AUTHORS file up to date proactively, and instead to only add to
it when requested: https://opensource.google/docs/releasing/authors.
They are also clear that:

&gt; Adding contributors to the AUTHORS file is entirely within the
&gt; project's discretion and has no implications for copyright ownership.

It was primarily added to appease a small number of large contributors
that insisted that they be recognized as copyright holders (which was
entirely their right to do). But it's not truly necessary, and not even
the most accurate way of identifying contributors and/or copyright
holders.

In practice, we've never added anyone to our AUTHORS file. It only lists
Tailscale, so it's not really serving any purpose. It also causes
confusion because Tailscalars put the "Tailscale Inc &amp; AUTHORS" header
in other open source repos which don't actually have an AUTHORS file, so
it's ambiguous what that means.

Instead, we just acknowledge that the contributors to Tailscale (whoever
they are) are copyright holders for their individual contributions. We
also have the benefit of using the DCO (developercertificate.org) which
provides some additional certification of their right to make the
contribution.

The source file changes were purely mechanical with:

    git ls-files | xargs sed -i -e 's/\(Tailscale Inc &amp;\) AUTHORS/\1 contributors/g'

Updates #cleanup

Change-Id: Ia101a4a3005adb9118051b3416f5a64a4a45987d
Signed-off-by: Will Norris &lt;will@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control, ipn, tailcfg: enable seamless key renewal by default</title>
<updated>2025-09-18T08:59:46Z</updated>
<author>
<name>Alex Chan</name>
<email>alexc@tailscale.com</email>
</author>
<published>2025-09-11T12:11:41Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=cd153aa644dd861602e386e71df20a61733b56a8'/>
<id>urn:sha1:cd153aa644dd861602e386e71df20a61733b56a8</id>
<content type='text'>
Previously, seamless key renewal was an opt-in feature.  Customers had
to set a `seamless-key-renewal` node attribute in their policy file.

This patch enables seamless key renewal by default for all clients.

It includes a `disable-seamless-key-renewal` node attribute we can set
in Control, so we can manage the rollout and disable the feature for
clients with known bugs.  This new attribute makes the feature opt-out.

Updates tailscale/corp#31479

Signed-off-by: Alex Chan &lt;alexc@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlknobs,tailcfg,wgengine/magicsock: deprecate NodeAttrDisableMagicSockCryptoRouting (#16818)</title>
<updated>2025-08-11T16:04:03Z</updated>
<author>
<name>Jordan Whited</name>
<email>jordan@tailscale.com</email>
</author>
<published>2025-08-11T16:04:03Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=d122f0350e8efc4ee80b295829d447ff9d5ddb08'/>
<id>urn:sha1:d122f0350e8efc4ee80b295829d447ff9d5ddb08</id>
<content type='text'>
Peer Relay is dependent on crypto routing, therefore crypto routing is
now mandatory.

Updates tailscale/corp#20732
Updates tailscale/corp#31083

Signed-off-by: Jordan Whited &lt;jordan@tailscale.com&gt;</content>
</entry>
<entry>
<title>control/controlknobs: make Knobs.AsDebugJSON automatic, not require maintenance</title>
<updated>2025-01-26T18:49:11Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2025-01-26T18:23:38Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=e701fde6b389a4a69b4d33aace8969530b25de8d'/>
<id>urn:sha1:e701fde6b389a4a69b4d33aace8969530b25de8d</id>
<content type='text'>
The AsDebugJSON method (used only for a LocalAPI debug call) always
needed to be updated whenever a new controlknob was added. We had a
test for it, which was nice, but it was a tedious step we don't need
to do. Use reflect instead.

Updates #14788

Change-Id: If59cd776920f3ce7c748f86ed2eddd9323039a0b
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>control/controlclient: skip SetControlClientStatus when queue has newer results later</title>
<updated>2025-01-25T00:16:22Z</updated>
<author>
<name>Brad Fitzpatrick</name>
<email>bradfitz@tailscale.com</email>
</author>
<published>2025-01-24T21:09:21Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=1a7274fccb0617f6d0bc31a45d835b61a9d5c5b7'/>
<id>urn:sha1:1a7274fccb0617f6d0bc31a45d835b61a9d5c5b7</id>
<content type='text'>
Updates #1909
Updates #12542
Updates tailscale/corp#26058

Change-Id: I3033d235ca49f9739fdf3deaf603eea4ec3e407e
Signed-off-by: Brad Fitzpatrick &lt;bradfitz@tailscale.com&gt;
</content>
</entry>
<entry>
<title>health: introduce captive-portal-detected Warnable (#12707)</title>
<updated>2024-07-26T18:25:55Z</updated>
<author>
<name>Andrea Gottardo</name>
<email>andrea@tailscale.com</email>
</author>
<published>2024-07-26T18:25:55Z</published>
<link rel='alternate' type='text/html' href='http://git.waynecole.info/tailscale/commit/?id=90be06bd5b79798fb0fdaa996750acceb96f831c'/>
<id>urn:sha1:90be06bd5b79798fb0fdaa996750acceb96f831c</id>
<content type='text'>
Updates tailscale/tailscale#1634

This PR introduces a new `captive-portal-detected` Warnable which is set to an unhealthy state whenever a captive portal is detected on the local network, preventing Tailscale from connecting.



ipn/ipnlocal: fix captive portal loop shutdown


Change-Id: I7cafdbce68463a16260091bcec1741501a070c95

net/captivedetection: fix mutex misuse

ipn/ipnlocal: ensure that we don't fail to start the timer


Change-Id: I3e43fb19264d793e8707c5031c0898e48e3e7465

Signed-off-by: Andrew Dunham &lt;andrew@du.nham.ca&gt;
Signed-off-by: Andrea Gottardo &lt;andrea@gottardo.me&gt;</content>
</entry>
</feed>
