@ -288,6 +288,11 @@ type Prefs struct {
// non-nil/enabled.
RelayServerPort * int ` json:",omitempty" `
// RelayServerStaticEndpoints are static IP:port endpoints to advertise as
// candidates for relay connections. Only relevant when RelayServerPort is
// non-nil.
RelayServerStaticEndpoints [ ] netip . AddrPort ` json:",omitempty" `
// AllowSingleHosts was a legacy field that was always true
// for the past 4.5 years. It controlled whether Tailscale
// peers got /32 or /128 routes for each other.
@ -350,38 +355,39 @@ type AppConnectorPrefs struct {
type MaskedPrefs struct {
Prefs
ControlURLSet bool ` json:",omitempty" `
RouteAllSet bool ` json:",omitempty" `
ExitNodeIDSet bool ` json:",omitempty" `
ExitNodeIPSet bool ` json:",omitempty" `
AutoExitNodeSet bool ` json:",omitempty" `
InternalExitNodePriorSet bool ` json:",omitempty" ` // Internal; can't be set by LocalAPI clients
ExitNodeAllowLANAccessSet bool ` json:",omitempty" `
CorpDNSSet bool ` json:",omitempty" `
RunSSHSet bool ` json:",omitempty" `
RunWebClientSet bool ` json:",omitempty" `
WantRunningSet bool ` json:",omitempty" `
LoggedOutSet bool ` json:",omitempty" `
ShieldsUpSet bool ` json:",omitempty" `
AdvertiseTagsSet bool ` json:",omitempty" `
HostnameSet bool ` json:",omitempty" `
NotepadURLsSet bool ` json:",omitempty" `
ForceDaemonSet bool ` json:",omitempty" `
EggSet bool ` json:",omitempty" `
AdvertiseRoutesSet bool ` json:",omitempty" `
AdvertiseServicesSet bool ` json:",omitempty" `
SyncSet bool ` json:",omitzero" `
NoSNATSet bool ` json:",omitempty" `
NoStatefulFilteringSet bool ` json:",omitempty" `
NetfilterModeSet bool ` json:",omitempty" `
OperatorUserSet bool ` json:",omitempty" `
ProfileNameSet bool ` json:",omitempty" `
AutoUpdateSet AutoUpdatePrefsMask ` json:",omitzero" `
AppConnectorSet bool ` json:",omitempty" `
PostureCheckingSet bool ` json:",omitempty" `
NetfilterKindSet bool ` json:",omitempty" `
DriveSharesSet bool ` json:",omitempty" `
RelayServerPortSet bool ` json:",omitempty" `
ControlURLSet bool ` json:",omitempty" `
RouteAllSet bool ` json:",omitempty" `
ExitNodeIDSet bool ` json:",omitempty" `
ExitNodeIPSet bool ` json:",omitempty" `
AutoExitNodeSet bool ` json:",omitempty" `
InternalExitNodePriorSet bool ` json:",omitempty" ` // Internal; can't be set by LocalAPI clients
ExitNodeAllowLANAccessSet bool ` json:",omitempty" `
CorpDNSSet bool ` json:",omitempty" `
RunSSHSet bool ` json:",omitempty" `
RunWebClientSet bool ` json:",omitempty" `
WantRunningSet bool ` json:",omitempty" `
LoggedOutSet bool ` json:",omitempty" `
ShieldsUpSet bool ` json:",omitempty" `
AdvertiseTagsSet bool ` json:",omitempty" `
HostnameSet bool ` json:",omitempty" `
NotepadURLsSet bool ` json:",omitempty" `
ForceDaemonSet bool ` json:",omitempty" `
EggSet bool ` json:",omitempty" `
AdvertiseRoutesSet bool ` json:",omitempty" `
AdvertiseServicesSet bool ` json:",omitempty" `
SyncSet bool ` json:",omitzero" `
NoSNATSet bool ` json:",omitempty" `
NoStatefulFilteringSet bool ` json:",omitempty" `
NetfilterModeSet bool ` json:",omitempty" `
OperatorUserSet bool ` json:",omitempty" `
ProfileNameSet bool ` json:",omitempty" `
AutoUpdateSet AutoUpdatePrefsMask ` json:",omitzero" `
AppConnectorSet bool ` json:",omitempty" `
PostureCheckingSet bool ` json:",omitempty" `
NetfilterKindSet bool ` json:",omitempty" `
DriveSharesSet bool ` json:",omitempty" `
RelayServerPortSet bool ` json:",omitempty" `
RelayServerStaticEndpointsSet bool ` json:",omitzero" `
}
// SetsInternal reports whether mp has any of the Internal*Set field bools set
@ -621,6 +627,9 @@ func (p *Prefs) pretty(goos string) string {
if buildfeatures . HasRelayServer && p . RelayServerPort != nil {
fmt . Fprintf ( & sb , "relayServerPort=%d " , * p . RelayServerPort )
}
if buildfeatures . HasRelayServer && len ( p . RelayServerStaticEndpoints ) > 0 {
fmt . Fprintf ( & sb , "relayServerStaticEndpoints=%v " , p . RelayServerStaticEndpoints )
}
if p . Persist != nil {
sb . WriteString ( p . Persist . Pretty ( ) )
} else {
@ -685,7 +694,8 @@ func (p *Prefs) Equals(p2 *Prefs) bool {
p . PostureChecking == p2 . PostureChecking &&
slices . EqualFunc ( p . DriveShares , p2 . DriveShares , drive . SharesEqual ) &&
p . NetfilterKind == p2 . NetfilterKind &&
compareIntPtrs ( p . RelayServerPort , p2 . RelayServerPort )
compareIntPtrs ( p . RelayServerPort , p2 . RelayServerPort ) &&
slices . Equal ( p . RelayServerStaticEndpoints , p2 . RelayServerStaticEndpoints )
}
func ( au AutoUpdatePrefs ) Pretty ( ) string {