| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 | 
							- // Copyright (C) 2016 The Syncthing Authors.
 
- //
 
- // This Source Code Form is subject to the terms of the Mozilla Public
 
- // License, v. 2.0. If a copy of the MPL was not distributed with this file,
 
- // You can obtain one at https://mozilla.org/MPL/2.0/.
 
- package connections
 
- import (
 
- 	"crypto/tls"
 
- 	"net/url"
 
- 	"time"
 
- 	"github.com/syncthing/syncthing/lib/config"
 
- 	"github.com/syncthing/syncthing/lib/dialer"
 
- 	"github.com/syncthing/syncthing/lib/protocol"
 
- )
 
- const tcpPriority = 10
 
- func init() {
 
- 	factory := &tcpDialerFactory{}
 
- 	for _, scheme := range []string{"tcp", "tcp4", "tcp6"} {
 
- 		dialers[scheme] = factory
 
- 	}
 
- }
 
- type tcpDialer struct {
 
- 	cfg    config.Wrapper
 
- 	tlsCfg *tls.Config
 
- }
 
- func (d *tcpDialer) Dial(_ protocol.DeviceID, uri *url.URL) (internalConn, error) {
 
- 	uri = fixupPort(uri, config.DefaultTCPPort)
 
- 	conn, err := dialer.DialTimeout(uri.Scheme, uri.Host, 10*time.Second)
 
- 	if err != nil {
 
- 		return internalConn{}, err
 
- 	}
 
- 	err = dialer.SetTCPOptions(conn)
 
- 	if err != nil {
 
- 		l.Debugln("Dial (BEP/tcp): setting tcp options:", err)
 
- 	}
 
- 	err = dialer.SetTrafficClass(conn, d.cfg.Options().TrafficClass)
 
- 	if err != nil {
 
- 		l.Debugln("Dial (BEP/tcp): setting traffic class:", err)
 
- 	}
 
- 	tc := tls.Client(conn, d.tlsCfg)
 
- 	err = tlsTimedHandshake(tc)
 
- 	if err != nil {
 
- 		tc.Close()
 
- 		return internalConn{}, err
 
- 	}
 
- 	return internalConn{tc, connTypeTCPClient, tcpPriority}, nil
 
- }
 
- func (d *tcpDialer) RedialFrequency() time.Duration {
 
- 	return time.Duration(d.cfg.Options().ReconnectIntervalS) * time.Second
 
- }
 
- type tcpDialerFactory struct{}
 
- func (tcpDialerFactory) New(cfg config.Wrapper, tlsCfg *tls.Config) genericDialer {
 
- 	return &tcpDialer{
 
- 		cfg:    cfg,
 
- 		tlsCfg: tlsCfg,
 
- 	}
 
- }
 
- func (tcpDialerFactory) Priority() int {
 
- 	return tcpPriority
 
- }
 
- func (tcpDialerFactory) AlwaysWAN() bool {
 
- 	return false
 
- }
 
- func (tcpDialerFactory) Valid(_ config.Configuration) error {
 
- 	// Always valid
 
- 	return nil
 
- }
 
- func (tcpDialerFactory) String() string {
 
- 	return "TCP Dialer"
 
- }
 
 
  |