From 2d281b681e13d177995cf21a07c109287467d5e0 Mon Sep 17 00:00:00 2001 From: Marek Hajduczenia Date: Wed, 15 Apr 2026 16:34:41 -0600 Subject: [PATCH] internal/tsutil: preserve advertised routes when toggling exit node AdvertiseExitNode was creating a fresh empty Prefs struct, so toggling the exit node switch sent an update that replaced all existing advertised routes. Fetch current prefs first so subnet routes are preserved, matching the pattern already used by AdvertiseRoutes. Fixes #257 --- internal/tsutil/client.go | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/internal/tsutil/client.go b/internal/tsutil/client.go index 7ab90f4..dc9c0ac 100644 --- a/internal/tsutil/client.go +++ b/internal/tsutil/client.go @@ -117,11 +117,14 @@ func SetUseExitNode(ctx context.Context, use bool) error { // AdvertiseExitNode enables and disables exit node advertisement for // the current node. func AdvertiseExitNode(ctx context.Context, enable bool) error { - var prefs ipn.Prefs + prefs, err := Prefs(ctx) + if err != nil { + return fmt.Errorf("get prefs: %w", err) + } prefs.SetAdvertiseExitNode(enable) - _, err := localClient.EditPrefs(ctx, &ipn.MaskedPrefs{ - Prefs: prefs, + _, err = localClient.EditPrefs(ctx, &ipn.MaskedPrefs{ + Prefs: *prefs, AdvertiseRoutesSet: true, }) if err != nil {