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 © 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 }