github.com/ooni/psiphon/tunnel-core@v0.0.0-20230105123940-fe12a24c96ee/oovendor/quic-go/config.go (about)

     1  package quic
     2  
     3  import (
     4  	"errors"
     5  	"time"
     6  
     7  	"github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/internal/protocol"
     8  
     9  	"github.com/ooni/psiphon/tunnel-core/oovendor/quic-go/internal/utils"
    10  )
    11  
    12  // Clone clones a Config
    13  func (c *Config) Clone() *Config {
    14  	copy := *c
    15  	return &copy
    16  }
    17  
    18  func (c *Config) handshakeTimeout() time.Duration {
    19  	return utils.MaxDuration(protocol.DefaultHandshakeTimeout, 2*c.HandshakeIdleTimeout)
    20  }
    21  
    22  func validateConfig(config *Config) error {
    23  	if config == nil {
    24  		return nil
    25  	}
    26  	if config.MaxIncomingStreams > 1<<60 {
    27  		return errors.New("invalid value for Config.MaxIncomingStreams")
    28  	}
    29  	if config.MaxIncomingUniStreams > 1<<60 {
    30  		return errors.New("invalid value for Config.MaxIncomingUniStreams")
    31  	}
    32  	return nil
    33  }
    34  
    35  // populateServerConfig populates fields in the quic.Config with their default values, if none are set
    36  // it may be called with nil
    37  func populateServerConfig(config *Config) *Config {
    38  	config = populateConfig(config)
    39  	if config.ConnectionIDLength == 0 {
    40  		config.ConnectionIDLength = protocol.DefaultConnectionIDLength
    41  	}
    42  	if config.AcceptToken == nil {
    43  		config.AcceptToken = defaultAcceptToken
    44  	}
    45  	return config
    46  }
    47  
    48  // populateClientConfig populates fields in the quic.Config with their default values, if none are set
    49  // it may be called with nil
    50  func populateClientConfig(config *Config, createdPacketConn bool) *Config {
    51  	config = populateConfig(config)
    52  	if config.ConnectionIDLength == 0 && !createdPacketConn {
    53  		config.ConnectionIDLength = protocol.DefaultConnectionIDLength
    54  	}
    55  	return config
    56  }
    57  
    58  func populateConfig(config *Config) *Config {
    59  	if config == nil {
    60  		config = &Config{}
    61  	}
    62  	versions := config.Versions
    63  	if len(versions) == 0 {
    64  		versions = protocol.SupportedVersions
    65  	}
    66  	handshakeIdleTimeout := protocol.DefaultHandshakeIdleTimeout
    67  	if config.HandshakeIdleTimeout != 0 {
    68  		handshakeIdleTimeout = config.HandshakeIdleTimeout
    69  	}
    70  	idleTimeout := protocol.DefaultIdleTimeout
    71  	if config.MaxIdleTimeout != 0 {
    72  		idleTimeout = config.MaxIdleTimeout
    73  	}
    74  	initialStreamReceiveWindow := config.InitialStreamReceiveWindow
    75  	if initialStreamReceiveWindow == 0 {
    76  		initialStreamReceiveWindow = protocol.DefaultInitialMaxStreamData
    77  	}
    78  	maxStreamReceiveWindow := config.MaxStreamReceiveWindow
    79  	if maxStreamReceiveWindow == 0 {
    80  		maxStreamReceiveWindow = protocol.DefaultMaxReceiveStreamFlowControlWindow
    81  	}
    82  	initialConnectionReceiveWindow := config.InitialConnectionReceiveWindow
    83  	if initialConnectionReceiveWindow == 0 {
    84  		initialConnectionReceiveWindow = protocol.DefaultInitialMaxData
    85  	}
    86  	maxConnectionReceiveWindow := config.MaxConnectionReceiveWindow
    87  	if maxConnectionReceiveWindow == 0 {
    88  		maxConnectionReceiveWindow = protocol.DefaultMaxReceiveConnectionFlowControlWindow
    89  	}
    90  	maxIncomingStreams := config.MaxIncomingStreams
    91  	if maxIncomingStreams == 0 {
    92  		maxIncomingStreams = protocol.DefaultMaxIncomingStreams
    93  	} else if maxIncomingStreams < 0 {
    94  		maxIncomingStreams = 0
    95  	}
    96  	maxIncomingUniStreams := config.MaxIncomingUniStreams
    97  	if maxIncomingUniStreams == 0 {
    98  		maxIncomingUniStreams = protocol.DefaultMaxIncomingUniStreams
    99  	} else if maxIncomingUniStreams < 0 {
   100  		maxIncomingUniStreams = 0
   101  	}
   102  
   103  	return &Config{
   104  		Versions:                         versions,
   105  		HandshakeIdleTimeout:             handshakeIdleTimeout,
   106  		MaxIdleTimeout:                   idleTimeout,
   107  		AcceptToken:                      config.AcceptToken,
   108  		KeepAlive:                        config.KeepAlive,
   109  		InitialStreamReceiveWindow:       initialStreamReceiveWindow,
   110  		MaxStreamReceiveWindow:           maxStreamReceiveWindow,
   111  		InitialConnectionReceiveWindow:   initialConnectionReceiveWindow,
   112  		MaxConnectionReceiveWindow:       maxConnectionReceiveWindow,
   113  		AllowConnectionWindowIncrease:    config.AllowConnectionWindowIncrease,
   114  		MaxIncomingStreams:               maxIncomingStreams,
   115  		MaxIncomingUniStreams:            maxIncomingUniStreams,
   116  		ConnectionIDLength:               config.ConnectionIDLength,
   117  		StatelessResetKey:                config.StatelessResetKey,
   118  		TokenStore:                       config.TokenStore,
   119  		EnableDatagrams:                  config.EnableDatagrams,
   120  		DisablePathMTUDiscovery:          config.DisablePathMTUDiscovery,
   121  		DisableVersionNegotiationPackets: config.DisableVersionNegotiationPackets,
   122  		Tracer:                           config.Tracer,
   123  
   124  		// [Psiphon]
   125  		ClientHelloSeed:               config.ClientHelloSeed,
   126  		GetClientHelloRandom:          config.GetClientHelloRandom,
   127  		VerifyClientHelloRandom:       config.VerifyClientHelloRandom,
   128  		ClientMaxPacketSizeAdjustment: config.ClientMaxPacketSizeAdjustment,
   129  		ServerMaxPacketSizeAdjustment: config.ServerMaxPacketSizeAdjustment,
   130  	}
   131  }