From 81af29e3e2a6481279b04f547c4c23c17994491a Mon Sep 17 00:00:00 2001 From: Jakob Borg Date: Tue, 7 Mar 2017 12:55:50 +0000 Subject: [PATCH] lib/config, lib/connections: Configurables for KCP, disable by default GitHub-Pull-Request: https://github.com/syncthing/syncthing/pull/4030 --- lib/config/config.go | 5 ++++- lib/config/config_test.go | 12 ++++++++++++ lib/config/optionsconfiguration.go | 7 +++++++ lib/config/testdata/overridenvalues.xml | 6 ++++++ lib/config/wrapper.go | 3 +++ lib/connections/config.go | 17 ----------------- lib/connections/kcp_dial.go | 6 ++++-- lib/connections/kcp_listen.go | 9 +++++---- lib/connections/kcp_misc.go | 7 +++++++ 9 files changed, 48 insertions(+), 24 deletions(-) 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 +}