mirror of
https://github.com/tailscale/tailscale.git
synced 2024-11-29 04:55:31 +00:00
wgengine: disable wireguard config trimming for now except iOS w/ many peers
Signed-off-by: Brad Fitzpatrick <bradfitz@tailscale.com>
This commit is contained in:
parent
9ff5b380cb
commit
b3fc61b132
@ -16,6 +16,7 @@
|
|||||||
"os"
|
"os"
|
||||||
"os/exec"
|
"os/exec"
|
||||||
"runtime"
|
"runtime"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"sync/atomic"
|
"sync/atomic"
|
||||||
@ -33,6 +34,7 @@
|
|||||||
"tailscale.com/tailcfg"
|
"tailscale.com/tailcfg"
|
||||||
"tailscale.com/types/key"
|
"tailscale.com/types/key"
|
||||||
"tailscale.com/types/logger"
|
"tailscale.com/types/logger"
|
||||||
|
"tailscale.com/version"
|
||||||
"tailscale.com/wgengine/filter"
|
"tailscale.com/wgengine/filter"
|
||||||
"tailscale.com/wgengine/magicsock"
|
"tailscale.com/wgengine/magicsock"
|
||||||
"tailscale.com/wgengine/monitor"
|
"tailscale.com/wgengine/monitor"
|
||||||
@ -560,6 +562,29 @@ func (e *userspaceEngine) pinger(peerKey wgcfg.Key, ips []wgcfg.IP) {
|
|||||||
p.run(ctx, peerKey, ips, srcIP)
|
p.run(ctx, peerKey, ips, srcIP)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var debugTrimWireguard, _ = strconv.ParseBool(os.Getenv("TS_DEBUG_TRIM_WIREGUARD"))
|
||||||
|
|
||||||
|
// forceFullWireguardConfig reports whether we should give wireguard
|
||||||
|
// our full network map, even for inactive peers
|
||||||
|
//
|
||||||
|
// TODO(bradfitz): remove this after our 1.0 launch; we don't want to
|
||||||
|
// enable wireguard config trimming quite yet because it just landed
|
||||||
|
// and we haven't got enough time testing it.
|
||||||
|
func forceFullWireguardConfig(numPeers int) bool {
|
||||||
|
// Did the user explicitly enable trimmming via the environment variable knob?
|
||||||
|
if debugTrimWireguard {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
// On iOS with large networks, it's critical, so turn on trimming.
|
||||||
|
// Otherwise we run out of memory from wireguard-go goroutine stacks+buffers.
|
||||||
|
// This will be the default later for all platforms and network sizes.
|
||||||
|
iOS := runtime.GOOS == "darwin" && version.IsMobile()
|
||||||
|
if iOS && numPeers > 50 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
// isTrimmablePeer reports whether p is a peer that we can trim out of the
|
// isTrimmablePeer reports whether p is a peer that we can trim out of the
|
||||||
// network map.
|
// network map.
|
||||||
//
|
//
|
||||||
@ -569,7 +594,10 @@ func (e *userspaceEngine) pinger(peerKey wgcfg.Key, ips []wgcfg.IP) {
|
|||||||
// simplicity, have only one IP address (an IPv4 /32), which is the
|
// simplicity, have only one IP address (an IPv4 /32), which is the
|
||||||
// common case for most peers. Subnet router nodes will just always be
|
// common case for most peers. Subnet router nodes will just always be
|
||||||
// created in the wireguard-go config.
|
// created in the wireguard-go config.
|
||||||
func isTrimmablePeer(p *wgcfg.Peer) bool {
|
func isTrimmablePeer(p *wgcfg.Peer, numPeers int) bool {
|
||||||
|
if forceFullWireguardConfig(numPeers) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
if len(p.AllowedIPs) != 1 || len(p.Endpoints) != 1 {
|
if len(p.AllowedIPs) != 1 || len(p.Endpoints) != 1 {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
@ -671,7 +699,7 @@ func (e *userspaceEngine) maybeReconfigWireguardLocked() error {
|
|||||||
|
|
||||||
for i := range full.Peers {
|
for i := range full.Peers {
|
||||||
p := &full.Peers[i]
|
p := &full.Peers[i]
|
||||||
if !isTrimmablePeer(p) {
|
if !isTrimmablePeer(p, len(full.Peers)) {
|
||||||
min.Peers = append(min.Peers, *p)
|
min.Peers = append(min.Peers, *p)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user