|
|
@@ -81,6 +81,15 @@ type Knobs struct {
|
|
|
// how to dial the destination address. When true, it also makes the DNS forwarder
|
|
|
// use UserDial instead of SystemDial when dialing resolvers.
|
|
|
UserDialUseRoutes atomic.Bool
|
|
|
+
|
|
|
+ // DisableSplitDNSWhenNoCustomResolvers indicates that the node's DNS manager
|
|
|
+ // should not adopt a split DNS configuration even though the Config of the
|
|
|
+ // resolver only contains routes that do not specify custom resolver(s), hence
|
|
|
+ // all DNS queries can be safely sent to the upstream DNS resolver and the
|
|
|
+ // node's DNS forwarder doesn't need to handle all DNS traffic.
|
|
|
+ // This is for now (2024-06-06) an iOS-specific battery life optimization,
|
|
|
+ // and this knob allows us to disable the optimization remotely if needed.
|
|
|
+ DisableSplitDNSWhenNoCustomResolvers atomic.Bool
|
|
|
}
|
|
|
|
|
|
// UpdateFromNodeAttributes updates k (if non-nil) based on the provided self
|
|
|
@@ -91,22 +100,23 @@ func (k *Knobs) UpdateFromNodeAttributes(capMap tailcfg.NodeCapMap) {
|
|
|
}
|
|
|
has := capMap.Contains
|
|
|
var (
|
|
|
- keepFullWG = has(tailcfg.NodeAttrDebugDisableWGTrim)
|
|
|
- disableDRPO = has(tailcfg.NodeAttrDebugDisableDRPO)
|
|
|
- disableUPnP = has(tailcfg.NodeAttrDisableUPnP)
|
|
|
- randomizeClientPort = has(tailcfg.NodeAttrRandomizeClientPort)
|
|
|
- disableDeltaUpdates = has(tailcfg.NodeAttrDisableDeltaUpdates)
|
|
|
- oneCGNAT opt.Bool
|
|
|
- forceBackgroundSTUN = has(tailcfg.NodeAttrDebugForceBackgroundSTUN)
|
|
|
- peerMTUEnable = has(tailcfg.NodeAttrPeerMTUEnable)
|
|
|
- dnsForwarderDisableTCPRetries = has(tailcfg.NodeAttrDNSForwarderDisableTCPRetries)
|
|
|
- silentDisco = has(tailcfg.NodeAttrSilentDisco)
|
|
|
- forceIPTables = has(tailcfg.NodeAttrLinuxMustUseIPTables)
|
|
|
- forceNfTables = has(tailcfg.NodeAttrLinuxMustUseNfTables)
|
|
|
- seamlessKeyRenewal = has(tailcfg.NodeAttrSeamlessKeyRenewal)
|
|
|
- probeUDPLifetime = has(tailcfg.NodeAttrProbeUDPLifetime)
|
|
|
- appCStoreRoutes = has(tailcfg.NodeAttrStoreAppCRoutes)
|
|
|
- userDialUseRoutes = has(tailcfg.NodeAttrUserDialUseRoutes)
|
|
|
+ keepFullWG = has(tailcfg.NodeAttrDebugDisableWGTrim)
|
|
|
+ disableDRPO = has(tailcfg.NodeAttrDebugDisableDRPO)
|
|
|
+ disableUPnP = has(tailcfg.NodeAttrDisableUPnP)
|
|
|
+ randomizeClientPort = has(tailcfg.NodeAttrRandomizeClientPort)
|
|
|
+ disableDeltaUpdates = has(tailcfg.NodeAttrDisableDeltaUpdates)
|
|
|
+ oneCGNAT opt.Bool
|
|
|
+ forceBackgroundSTUN = has(tailcfg.NodeAttrDebugForceBackgroundSTUN)
|
|
|
+ peerMTUEnable = has(tailcfg.NodeAttrPeerMTUEnable)
|
|
|
+ dnsForwarderDisableTCPRetries = has(tailcfg.NodeAttrDNSForwarderDisableTCPRetries)
|
|
|
+ silentDisco = has(tailcfg.NodeAttrSilentDisco)
|
|
|
+ forceIPTables = has(tailcfg.NodeAttrLinuxMustUseIPTables)
|
|
|
+ forceNfTables = has(tailcfg.NodeAttrLinuxMustUseNfTables)
|
|
|
+ seamlessKeyRenewal = has(tailcfg.NodeAttrSeamlessKeyRenewal)
|
|
|
+ probeUDPLifetime = has(tailcfg.NodeAttrProbeUDPLifetime)
|
|
|
+ appCStoreRoutes = has(tailcfg.NodeAttrStoreAppCRoutes)
|
|
|
+ userDialUseRoutes = has(tailcfg.NodeAttrUserDialUseRoutes)
|
|
|
+ disableSplitDNSWhenNoCustomResolvers = has(tailcfg.NodeAttrDisableSplitDNSWhenNoCustomResolvers)
|
|
|
)
|
|
|
|
|
|
if has(tailcfg.NodeAttrOneCGNATEnable) {
|
|
|
@@ -131,6 +141,7 @@ func (k *Knobs) UpdateFromNodeAttributes(capMap tailcfg.NodeCapMap) {
|
|
|
k.ProbeUDPLifetime.Store(probeUDPLifetime)
|
|
|
k.AppCStoreRoutes.Store(appCStoreRoutes)
|
|
|
k.UserDialUseRoutes.Store(userDialUseRoutes)
|
|
|
+ k.DisableSplitDNSWhenNoCustomResolvers.Store(disableSplitDNSWhenNoCustomResolvers)
|
|
|
}
|
|
|
|
|
|
// AsDebugJSON returns k as something that can be marshalled with json.Marshal
|
|
|
@@ -140,21 +151,22 @@ func (k *Knobs) AsDebugJSON() map[string]any {
|
|
|
return nil
|
|
|
}
|
|
|
return map[string]any{
|
|
|
- "DisableUPnP": k.DisableUPnP.Load(),
|
|
|
- "DisableDRPO": k.DisableDRPO.Load(),
|
|
|
- "KeepFullWGConfig": k.KeepFullWGConfig.Load(),
|
|
|
- "RandomizeClientPort": k.RandomizeClientPort.Load(),
|
|
|
- "OneCGNAT": k.OneCGNAT.Load(),
|
|
|
- "ForceBackgroundSTUN": k.ForceBackgroundSTUN.Load(),
|
|
|
- "DisableDeltaUpdates": k.DisableDeltaUpdates.Load(),
|
|
|
- "PeerMTUEnable": k.PeerMTUEnable.Load(),
|
|
|
- "DisableDNSForwarderTCPRetries": k.DisableDNSForwarderTCPRetries.Load(),
|
|
|
- "SilentDisco": k.SilentDisco.Load(),
|
|
|
- "LinuxForceIPTables": k.LinuxForceIPTables.Load(),
|
|
|
- "LinuxForceNfTables": k.LinuxForceNfTables.Load(),
|
|
|
- "SeamlessKeyRenewal": k.SeamlessKeyRenewal.Load(),
|
|
|
- "ProbeUDPLifetime": k.ProbeUDPLifetime.Load(),
|
|
|
- "AppCStoreRoutes": k.AppCStoreRoutes.Load(),
|
|
|
- "UserDialUseRoutes": k.UserDialUseRoutes.Load(),
|
|
|
+ "DisableUPnP": k.DisableUPnP.Load(),
|
|
|
+ "DisableDRPO": k.DisableDRPO.Load(),
|
|
|
+ "KeepFullWGConfig": k.KeepFullWGConfig.Load(),
|
|
|
+ "RandomizeClientPort": k.RandomizeClientPort.Load(),
|
|
|
+ "OneCGNAT": k.OneCGNAT.Load(),
|
|
|
+ "ForceBackgroundSTUN": k.ForceBackgroundSTUN.Load(),
|
|
|
+ "DisableDeltaUpdates": k.DisableDeltaUpdates.Load(),
|
|
|
+ "PeerMTUEnable": k.PeerMTUEnable.Load(),
|
|
|
+ "DisableDNSForwarderTCPRetries": k.DisableDNSForwarderTCPRetries.Load(),
|
|
|
+ "SilentDisco": k.SilentDisco.Load(),
|
|
|
+ "LinuxForceIPTables": k.LinuxForceIPTables.Load(),
|
|
|
+ "LinuxForceNfTables": k.LinuxForceNfTables.Load(),
|
|
|
+ "SeamlessKeyRenewal": k.SeamlessKeyRenewal.Load(),
|
|
|
+ "ProbeUDPLifetime": k.ProbeUDPLifetime.Load(),
|
|
|
+ "AppCStoreRoutes": k.AppCStoreRoutes.Load(),
|
|
|
+ "UserDialUseRoutes": k.UserDialUseRoutes.Load(),
|
|
|
+ "DisableSplitDNSWhenNoCustomResolvers": k.DisableSplitDNSWhenNoCustomResolvers.Load(),
|
|
|
}
|
|
|
}
|