diff --git a/cmd/syncthing/connections.go b/cmd/syncthing/connections.go
index d881729da..2ad8e86c8 100644
--- a/cmd/syncthing/connections.go
+++ b/cmd/syncthing/connections.go
@@ -45,8 +45,9 @@ type connectionSvc struct {
lastRelayCheck map[protocol.DeviceID]time.Time
- mut sync.RWMutex
- connType map[protocol.DeviceID]model.ConnectionType
+ mut sync.RWMutex
+ connType map[protocol.DeviceID]model.ConnectionType
+ relaysEnabled bool
}
func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Model, tlsCfg *tls.Config) *connectionSvc {
@@ -59,6 +60,7 @@ func newConnectionSvc(cfg *config.Wrapper, myID protocol.DeviceID, mdl *model.Mo
conns: make(chan model.IntermediateConnection),
connType: make(map[protocol.DeviceID]model.ConnectionType),
+ relaysEnabled: cfg.Options().RelaysEnabled,
lastRelayCheck: make(map[protocol.DeviceID]time.Time),
}
cfg.Subscribe(svc)
@@ -239,6 +241,7 @@ func (s *connectionSvc) connect() {
s.mut.RLock()
ct, ok := s.connType[deviceID]
+ relaysEnabled := s.relaysEnabled
s.mut.RUnlock()
if connected && ok && ct.IsDirect() {
continue
@@ -296,7 +299,8 @@ func (s *connectionSvc) connect() {
// Also, do not set lastRelayCheck time if we have no relays,
// as otherwise when we do discover relays, we might have to
// wait up to RelayReconnectIntervalM to connect again.
- if connected || len(relays) == 0 {
+ // Also, do not try relays if we are explicitly told not to.
+ if connected || len(relays) == 0 || !relaysEnabled {
continue nextDevice
}
@@ -394,6 +398,10 @@ func (s *connectionSvc) VerifyConfiguration(from, to config.Configuration) error
}
func (s *connectionSvc) CommitConfiguration(from, to config.Configuration) bool {
+ s.mut.Lock()
+ s.relaysEnabled = to.Options.RelaysEnabled
+ s.mut.Unlock()
+
// We require a restart if a device as been removed.
newDevices := make(map[protocol.DeviceID]bool, len(to.Devices))
diff --git a/cmd/syncthing/main.go b/cmd/syncthing/main.go
index 6409c9da1..bc18cdaf7 100644
--- a/cmd/syncthing/main.go
+++ b/cmd/syncthing/main.go
@@ -676,7 +676,7 @@ func syncthingMain() {
connectionSvc := newConnectionSvc(cfg, myID, m, tlsCfg)
mainSvc.Add(connectionSvc)
- if opts.GlobalAnnEnabled || opts.RelayWithoutGlobalAnn {
+ if opts.RelaysEnabled && (opts.GlobalAnnEnabled || opts.RelayWithoutGlobalAnn) {
relaySvc = relay.NewSvc(cfg, tlsCfg, connectionSvc.conns)
connectionSvc.Add(relaySvc)
}
diff --git a/lib/config/config.go b/lib/config/config.go
index 289ba1569..40ebdf655 100644
--- a/lib/config/config.go
+++ b/lib/config/config.go
@@ -223,6 +223,7 @@ type OptionsConfiguration struct {
MaxSendKbps int `xml:"maxSendKbps" json:"maxSendKbps"`
MaxRecvKbps int `xml:"maxRecvKbps" json:"maxRecvKbps"`
ReconnectIntervalS int `xml:"reconnectionIntervalS" json:"reconnectionIntervalS" default:"60"`
+ RelaysEnabled bool `xml:"relaysEnabled" json:"relaysEnabled" default:"true"`
RelayReconnectIntervalM int `xml:"relayReconnectIntervalM" json:"relayReconnectIntervalM" default:"10"`
RelayWithoutGlobalAnn bool `xml:"relayWithoutGlobalAnn" json:"relayWithoutGlobalAnn" default:"false"`
StartBrowser bool `xml:"startBrowser" json:"startBrowser" default:"true"`
diff --git a/lib/config/config_test.go b/lib/config/config_test.go
index ac741e518..06fbe9f3a 100644
--- a/lib/config/config_test.go
+++ b/lib/config/config_test.go
@@ -41,6 +41,7 @@ func TestDefaultValues(t *testing.T) {
MaxSendKbps: 0,
MaxRecvKbps: 0,
ReconnectIntervalS: 60,
+ RelaysEnabled: true,
RelayReconnectIntervalM: 10,
RelayWithoutGlobalAnn: false,
StartBrowser: true,
@@ -155,6 +156,7 @@ func TestOverriddenValues(t *testing.T) {
MaxSendKbps: 1234,
MaxRecvKbps: 2341,
ReconnectIntervalS: 6000,
+ RelaysEnabled: false,
RelayReconnectIntervalM: 20,
RelayWithoutGlobalAnn: true,
StartBrowser: false,
diff --git a/lib/config/testdata/overridenvalues.xml b/lib/config/testdata/overridenvalues.xml
index c9e06e530..41a08154c 100755
--- a/lib/config/testdata/overridenvalues.xml
+++ b/lib/config/testdata/overridenvalues.xml
@@ -13,6 +13,7 @@
1234
2341
6000
+ false
20
true
false