| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- package quic
- import (
- "fmt"
- "net"
- "time"
- "github.com/Psiphon-Labs/quic-go/internal/protocol"
- "github.com/Psiphon-Labs/quic-go/quicvarint"
- )
- // Clone clones a Config
- func (c *Config) Clone() *Config {
- copy := *c
- return ©
- }
- func (c *Config) handshakeTimeout() time.Duration {
- return 2 * c.HandshakeIdleTimeout
- }
- func (c *Config) maxRetryTokenAge() time.Duration {
- return c.handshakeTimeout()
- }
- func validateConfig(config *Config) error {
- if config == nil {
- return nil
- }
- const maxStreams = 1 << 60
- if config.MaxIncomingStreams > maxStreams {
- config.MaxIncomingStreams = maxStreams
- }
- if config.MaxIncomingUniStreams > maxStreams {
- config.MaxIncomingUniStreams = maxStreams
- }
- if config.MaxStreamReceiveWindow > quicvarint.Max {
- config.MaxStreamReceiveWindow = quicvarint.Max
- }
- if config.MaxConnectionReceiveWindow > quicvarint.Max {
- config.MaxConnectionReceiveWindow = quicvarint.Max
- }
- // check that all QUIC versions are actually supported
- for _, v := range config.Versions {
- if !protocol.IsValidVersion(v) {
- return fmt.Errorf("invalid QUIC version: %s", v)
- }
- }
- return nil
- }
- // populateServerConfig populates fields in the quic.Config with their default values, if none are set
- // it may be called with nil
- func populateServerConfig(config *Config) *Config {
- config = populateConfig(config)
- if config.RequireAddressValidation == nil {
- config.RequireAddressValidation = func(net.Addr) bool { return false }
- }
- return config
- }
- // populateConfig populates fields in the quic.Config with their default values, if none are set
- // it may be called with nil
- func populateConfig(config *Config) *Config {
- if config == nil {
- config = &Config{}
- }
- versions := config.Versions
- if len(versions) == 0 {
- versions = protocol.SupportedVersions
- }
- handshakeIdleTimeout := protocol.DefaultHandshakeIdleTimeout
- if config.HandshakeIdleTimeout != 0 {
- handshakeIdleTimeout = config.HandshakeIdleTimeout
- }
- idleTimeout := protocol.DefaultIdleTimeout
- if config.MaxIdleTimeout != 0 {
- idleTimeout = config.MaxIdleTimeout
- }
- initialStreamReceiveWindow := config.InitialStreamReceiveWindow
- if initialStreamReceiveWindow == 0 {
- initialStreamReceiveWindow = protocol.DefaultInitialMaxStreamData
- }
- maxStreamReceiveWindow := config.MaxStreamReceiveWindow
- if maxStreamReceiveWindow == 0 {
- maxStreamReceiveWindow = protocol.DefaultMaxReceiveStreamFlowControlWindow
- }
- initialConnectionReceiveWindow := config.InitialConnectionReceiveWindow
- if initialConnectionReceiveWindow == 0 {
- initialConnectionReceiveWindow = protocol.DefaultInitialMaxData
- }
- maxConnectionReceiveWindow := config.MaxConnectionReceiveWindow
- if maxConnectionReceiveWindow == 0 {
- maxConnectionReceiveWindow = protocol.DefaultMaxReceiveConnectionFlowControlWindow
- }
- maxIncomingStreams := config.MaxIncomingStreams
- if maxIncomingStreams == 0 {
- maxIncomingStreams = protocol.DefaultMaxIncomingStreams
- } else if maxIncomingStreams < 0 {
- maxIncomingStreams = 0
- }
- maxIncomingUniStreams := config.MaxIncomingUniStreams
- if maxIncomingUniStreams == 0 {
- maxIncomingUniStreams = protocol.DefaultMaxIncomingUniStreams
- } else if maxIncomingUniStreams < 0 {
- maxIncomingUniStreams = 0
- }
- return &Config{
- GetConfigForClient: config.GetConfigForClient,
- Versions: versions,
- HandshakeIdleTimeout: handshakeIdleTimeout,
- MaxIdleTimeout: idleTimeout,
- RequireAddressValidation: config.RequireAddressValidation,
- KeepAlivePeriod: config.KeepAlivePeriod,
- InitialStreamReceiveWindow: initialStreamReceiveWindow,
- MaxStreamReceiveWindow: maxStreamReceiveWindow,
- InitialConnectionReceiveWindow: initialConnectionReceiveWindow,
- MaxConnectionReceiveWindow: maxConnectionReceiveWindow,
- AllowConnectionWindowIncrease: config.AllowConnectionWindowIncrease,
- MaxIncomingStreams: maxIncomingStreams,
- MaxIncomingUniStreams: maxIncomingUniStreams,
- TokenStore: config.TokenStore,
- EnableDatagrams: config.EnableDatagrams,
- DisablePathMTUDiscovery: config.DisablePathMTUDiscovery,
- Allow0RTT: config.Allow0RTT,
- Tracer: config.Tracer,
- // [Psiphon]
- ClientHelloSeed: config.ClientHelloSeed,
- GetClientHelloRandom: config.GetClientHelloRandom,
- VerifyClientHelloRandom: config.VerifyClientHelloRandom,
- ClientMaxPacketSizeAdjustment: config.ClientMaxPacketSizeAdjustment,
- ServerMaxPacketSizeAdjustment: config.ServerMaxPacketSizeAdjustment,
- }
- }
|