diff --git a/lib/config/config.go b/lib/config/config.go
index 2aa36cd2c..2884b0597 100644
--- a/lib/config/config.go
+++ b/lib/config/config.go
@@ -44,9 +44,12 @@ var (
// config.
DefaultListenAddresses = []string{
util.Address("tcp", net.JoinHostPort("0.0.0.0", strconv.Itoa(DefaultTCPPort))),
- util.Address("kcp", net.JoinHostPort("0.0.0.0", strconv.Itoa(DefaultKCPPort))),
"dynamic+https://relays.syncthing.net/endpoint",
}
+ // DefaultKCPListenAddress gets added to the default listen address set
+ // when the appropriate feature flag is set. Feature flag stuff to be
+ // removed later.
+ DefaultKCPListenAddress = util.Address("kcp", net.JoinHostPort("0.0.0.0", strconv.Itoa(DefaultKCPPort)))
// DefaultDiscoveryServersV4 should be substituted when the configuration
// contains default-v4.
DefaultDiscoveryServersV4 = []string{
diff --git a/lib/config/config_test.go b/lib/config/config_test.go
index 5901ccb9d..6f4d0861a 100644
--- a/lib/config/config_test.go
+++ b/lib/config/config_test.go
@@ -67,6 +67,12 @@ func TestDefaultValues(t *testing.T) {
WeakHashSelectionMethod: WeakHashAuto,
StunKeepaliveS: 24,
StunServers: []string{"default"},
+ DefaultKCPEnabled: false,
+ KCPCongestionControl: true,
+ KCPReceiveWindowSize: 128,
+ KCPSendWindowSize: 128,
+ KCPUpdateIntervalMs: 100,
+ KCPFastResend: false,
}
cfg := New(device1)
@@ -207,6 +213,12 @@ func TestOverriddenValues(t *testing.T) {
WeakHashSelectionMethod: WeakHashNever,
StunKeepaliveS: 10,
StunServers: []string{"a.stun.com", "b.stun.com"},
+ DefaultKCPEnabled: true,
+ KCPCongestionControl: false,
+ KCPReceiveWindowSize: 1280,
+ KCPSendWindowSize: 1280,
+ KCPUpdateIntervalMs: 1000,
+ KCPFastResend: true,
}
os.Unsetenv("STNOUPGRADE")
diff --git a/lib/config/optionsconfiguration.go b/lib/config/optionsconfiguration.go
index 1ed671051..3f0e4d73c 100644
--- a/lib/config/optionsconfiguration.go
+++ b/lib/config/optionsconfiguration.go
@@ -133,6 +133,13 @@ type OptionsConfiguration struct {
WeakHashSelectionMethod WeakHashSelectionMethod `xml:"weakHashSelectionMethod" json:"weakHashSelectionMethod"`
StunServers []string `xml:"stunServer" json:"stunServers" default:"default"`
StunKeepaliveS int `xml:"stunKeepaliveSeconds" json:"stunKeepaliveSeconds" default:"24"`
+ DefaultKCPEnabled bool `xml:"defaultKCPEnabled" json:"defaultKCPEnabled" default:"false"`
+ KCPNoDelay bool `xml:"kcpNoDelay" json:"kcpNoDelay" default:"false"`
+ KCPUpdateIntervalMs int `xml:"kcpUpdateIntervalMs" json:"kcpUpdateIntervalMs" default:"100"`
+ KCPFastResend bool `xml:"kcpFastResend" json:"kcpFastResend" default:"false"`
+ KCPCongestionControl bool `xml:"kcpCongestionControl" json:"kcpCongestionControl" default:"true"`
+ KCPSendWindowSize int `xml:"kcpSendWindowSize" json:"kcpSendWindowSize" default:"128"`
+ KCPReceiveWindowSize int `xml:"kcpReceiveWindowSize" json:"kcpReceiveWindowSize" default:"128"`
DeprecatedUPnPEnabled bool `xml:"upnpEnabled,omitempty" json:"-"`
DeprecatedUPnPLeaseM int `xml:"upnpLeaseMinutes,omitempty" json:"-"`
diff --git a/lib/config/testdata/overridenvalues.xml b/lib/config/testdata/overridenvalues.xml
index 2fa791fb8..0a34fff10 100644
--- a/lib/config/testdata/overridenvalues.xml
+++ b/lib/config/testdata/overridenvalues.xml
@@ -38,5 +38,11 @@
10
a.stun.com
b.stun.com
+ true
+ false
+ 1280
+ 1280
+ 1000
+ true
diff --git a/lib/config/wrapper.go b/lib/config/wrapper.go
index 6eb1b0837..82553b460 100644
--- a/lib/config/wrapper.go
+++ b/lib/config/wrapper.go
@@ -391,6 +391,9 @@ func (w *Wrapper) ListenAddresses() []string {
switch addr {
case "default":
addresses = append(addresses, DefaultListenAddresses...)
+ if w.cfg.Options.DefaultKCPEnabled { // temporary feature flag
+ addresses = append(addresses, DefaultKCPListenAddress)
+ }
default:
addresses = append(addresses, addr)
}
diff --git a/lib/connections/config.go b/lib/connections/config.go
index abc319c59..837c181fa 100644
--- a/lib/connections/config.go
+++ b/lib/connections/config.go
@@ -22,23 +22,6 @@ const (
kcpNoFilterPriority = 100
kcpConversationFilterPriority = 20
kcpStunFilterPriority = 10
-
- // KCP SetNoDelay options
-
- // 0 - disabled (default)
- // 1 - enabled
- kcpNoDelay = 0
- kcpUpdateInterval = 100 // ms (default)
- // 0 - disable (default)
- // 1 - enabled
- kcpFastResend = 0
- // 0 - enabled (default)
- // 1 - disabled
- kcpCongestionControl = 0
-
- // KCP window sizes
- kcpSendWindowSize = 128
- kcpReceiveWindowSize = 128
)
var (
diff --git a/lib/connections/kcp_dial.go b/lib/connections/kcp_dial.go
index 3d453e2e1..dfafa6ad4 100644
--- a/lib/connections/kcp_dial.go
+++ b/lib/connections/kcp_dial.go
@@ -49,11 +49,13 @@ func (d *kcpDialer) Dial(id protocol.DeviceID, uri *url.URL) (internalConn, erro
return internalConn{}, err
}
+ opts := d.cfg.Options()
+
conn.SetKeepAlive(0) // yamux and stun service does keep-alives.
conn.SetStreamMode(true)
conn.SetACKNoDelay(false)
- conn.SetWindowSize(kcpSendWindowSize, kcpReceiveWindowSize)
- conn.SetNoDelay(kcpNoDelay, kcpUpdateInterval, kcpFastResend, kcpCongestionControl)
+ conn.SetWindowSize(opts.KCPSendWindowSize, opts.KCPReceiveWindowSize)
+ conn.SetNoDelay(boolInt(opts.KCPNoDelay), opts.KCPUpdateIntervalMs, boolInt(opts.KCPFastResend), boolInt(!opts.KCPCongestionControl))
ses, err := yamux.Client(conn, yamuxConfig)
if err != nil {
diff --git a/lib/connections/kcp_listen.go b/lib/connections/kcp_listen.go
index ceea22b14..2187e4831 100644
--- a/lib/connections/kcp_listen.go
+++ b/lib/connections/kcp_listen.go
@@ -107,12 +107,13 @@ func (t *kcpListener) Serve() {
continue
}
- conn.SetStreamMode(true)
- conn.SetACKNoDelay(false)
- conn.SetWindowSize(kcpSendWindowSize, kcpReceiveWindowSize)
- conn.SetNoDelay(kcpNoDelay, kcpUpdateInterval, kcpFastResend, kcpCongestionControl)
+ opts := t.cfg.Options()
conn.SetKeepAlive(0) // yamux and stun service does keep-alives.
+ conn.SetStreamMode(true)
+ conn.SetACKNoDelay(false)
+ conn.SetWindowSize(opts.KCPSendWindowSize, opts.KCPReceiveWindowSize)
+ conn.SetNoDelay(boolInt(opts.KCPNoDelay), opts.KCPUpdateIntervalMs, boolInt(opts.KCPFastResend), boolInt(!opts.KCPCongestionControl))
l.Debugln("connect from", conn.RemoteAddr())
diff --git a/lib/connections/kcp_misc.go b/lib/connections/kcp_misc.go
index a8babf85c..0e50acff7 100644
--- a/lib/connections/kcp_misc.go
+++ b/lib/connections/kcp_misc.go
@@ -180,3 +180,10 @@ func (w *sessionClosingStream) Close() error {
}
return err2
}
+
+func boolInt(b bool) int {
+ if b {
+ return 1
+ }
+ return 0
+}