wgengine/magicsock: allow a CSV list for pretendpoint

Load Balancers often have more than one ingress IP, so allowing us to
add multiple means we can offer multiple options.

Updates #12578

Change-Id: I4aa49a698d457627d2f7011796d665c67d4c7952
Signed-off-by: Lee Briggs <lee@leebriggs.co.uk>
pull/12704/head
Lee Briggs 5 months ago committed by Brad Fitzpatrick
parent c6af5bbfe8
commit b546a6e758

@ -8,6 +8,7 @@ package magicsock
import ( import (
"log" "log"
"net/netip" "net/netip"
"strings"
"sync" "sync"
"tailscale.com/envknob" "tailscale.com/envknob"
@ -73,17 +74,24 @@ var (
// startup. // startup.
func inTest() bool { return envknob.Bool("IN_TS_TEST") } func inTest() bool { return envknob.Bool("IN_TS_TEST") }
// pretendpoint returns TS_DEBUG_PRETENDPOINT as an AddrPort, if set. // pretendpoints returns TS_DEBUG_PRETENDPOINT as []AddrPort, if set.
// See https://github.com/tailscale/tailscale/issues/12578 and // See https://github.com/tailscale/tailscale/issues/12578 and
// https://github.com/tailscale/tailscale/pull/12735. // https://github.com/tailscale/tailscale/pull/12735.
var pretendpoint = sync.OnceValue(func() (ap netip.AddrPort) { //
s := envknob.String("TS_DEBUG_PRETENDPOINT") // It can be between 0 and 3 comma-separated AddrPorts.
if s == "" { var pretendpoints = sync.OnceValue(func() (ret []netip.AddrPort) {
return all := envknob.String("TS_DEBUG_PRETENDPOINT")
} const max = 3
ap, err := netip.ParseAddrPort(s) remain := all
if err != nil { for remain != "" && len(ret) < max {
log.Printf("ignoring invalid TS_DEBUG_PRETENDPOINT %q: %v", s, err) var s string
s, remain, _ = strings.Cut(remain, ",")
ap, err := netip.ParseAddrPort(s)
if err != nil {
log.Printf("ignoring invalid AddrPort %q in TS_DEBUG_PRETENDPOINT %q: %v", s, all, err)
continue
}
ret = append(ret, ap)
} }
return ap return
}) })

@ -30,4 +30,4 @@ func debugEnablePMTUD() opt.Bool { return "" }
func debugRingBufferMaxSizeBytes() int { return 0 } func debugRingBufferMaxSizeBytes() int { return 0 }
func inTest() bool { return false } func inTest() bool { return false }
func debugPeerMap() bool { return false } func debugPeerMap() bool { return false }
func pretendpoint() netip.AddrPort { return netip.AddrPort{} } func pretendpoints() []netip.AddrPort { return []netip.AddrPort{} }

@ -920,10 +920,12 @@ func (c *Conn) determineEndpoints(ctx context.Context) ([]tailcfg.Endpoint, erro
} }
// Temporarily (2024-07-08) during investigations, allow setting // Temporarily (2024-07-08) during investigations, allow setting
// a pretend endpoint for testing NAT traversal scenarios. // pretend endpoint(s) for testing NAT traversal scenarios.
// TODO(bradfitz): probably promote this to the config file. // TODO(bradfitz): probably promote this to the config file.
// https://github.com/tailscale/tailscale/issues/12578 // https://github.com/tailscale/tailscale/issues/12578
addAddr(pretendpoint(), tailcfg.EndpointExplicitConf) for _, ap := range pretendpoints() {
addAddr(ap, tailcfg.EndpointExplicitConf)
}
// Update our set of endpoints by adding any endpoints that we // Update our set of endpoints by adding any endpoints that we
// previously found but haven't expired yet. This also updates the // previously found but haven't expired yet. This also updates the

Loading…
Cancel
Save