config.go 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. package quic
  2. import (
  3. "errors"
  4. "net"
  5. "time"
  6. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  7. "github.com/Psiphon-Labs/quic-go/internal/utils"
  8. )
  9. // Clone clones a Config
  10. func (c *Config) Clone() *Config {
  11. copy := *c
  12. return &copy
  13. }
  14. func (c *Config) handshakeTimeout() time.Duration {
  15. return utils.Max(protocol.DefaultHandshakeTimeout, 2*c.HandshakeIdleTimeout)
  16. }
  17. func validateConfig(config *Config) error {
  18. if config == nil {
  19. return nil
  20. }
  21. if config.MaxIncomingStreams > 1<<60 {
  22. return errors.New("invalid value for Config.MaxIncomingStreams")
  23. }
  24. if config.MaxIncomingUniStreams > 1<<60 {
  25. return errors.New("invalid value for Config.MaxIncomingUniStreams")
  26. }
  27. return nil
  28. }
  29. // populateServerConfig populates fields in the quic.Config with their default values, if none are set
  30. // it may be called with nil
  31. func populateServerConfig(config *Config) *Config {
  32. config = populateConfig(config, protocol.DefaultConnectionIDLength)
  33. if config.MaxTokenAge == 0 {
  34. config.MaxTokenAge = protocol.TokenValidity
  35. }
  36. if config.MaxRetryTokenAge == 0 {
  37. config.MaxRetryTokenAge = protocol.RetryTokenValidity
  38. }
  39. if config.RequireAddressValidation == nil {
  40. config.RequireAddressValidation = func(net.Addr) bool { return false }
  41. }
  42. return config
  43. }
  44. // populateClientConfig populates fields in the quic.Config with their default values, if none are set
  45. // it may be called with nil
  46. func populateClientConfig(config *Config, createdPacketConn bool) *Config {
  47. defaultConnIDLen := protocol.DefaultConnectionIDLength
  48. if createdPacketConn {
  49. defaultConnIDLen = 0
  50. }
  51. config = populateConfig(config, defaultConnIDLen)
  52. return config
  53. }
  54. func populateConfig(config *Config, defaultConnIDLen int) *Config {
  55. if config == nil {
  56. config = &Config{}
  57. }
  58. versions := config.Versions
  59. if len(versions) == 0 {
  60. versions = protocol.SupportedVersions
  61. }
  62. conIDLen := config.ConnectionIDLength
  63. if config.ConnectionIDLength == 0 {
  64. conIDLen = defaultConnIDLen
  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. connIDGenerator := config.ConnectionIDGenerator
  103. if connIDGenerator == nil {
  104. connIDGenerator = &protocol.DefaultConnectionIDGenerator{ConnLen: conIDLen}
  105. }
  106. return &Config{
  107. Versions: versions,
  108. HandshakeIdleTimeout: handshakeIdleTimeout,
  109. MaxIdleTimeout: idleTimeout,
  110. MaxTokenAge: config.MaxTokenAge,
  111. MaxRetryTokenAge: config.MaxRetryTokenAge,
  112. RequireAddressValidation: config.RequireAddressValidation,
  113. KeepAlivePeriod: config.KeepAlivePeriod,
  114. InitialStreamReceiveWindow: initialStreamReceiveWindow,
  115. MaxStreamReceiveWindow: maxStreamReceiveWindow,
  116. InitialConnectionReceiveWindow: initialConnectionReceiveWindow,
  117. MaxConnectionReceiveWindow: maxConnectionReceiveWindow,
  118. AllowConnectionWindowIncrease: config.AllowConnectionWindowIncrease,
  119. MaxIncomingStreams: maxIncomingStreams,
  120. MaxIncomingUniStreams: maxIncomingUniStreams,
  121. ConnectionIDLength: conIDLen,
  122. ConnectionIDGenerator: connIDGenerator,
  123. StatelessResetKey: config.StatelessResetKey,
  124. TokenStore: config.TokenStore,
  125. EnableDatagrams: config.EnableDatagrams,
  126. DisablePathMTUDiscovery: config.DisablePathMTUDiscovery,
  127. DisableVersionNegotiationPackets: config.DisableVersionNegotiationPackets,
  128. Tracer: config.Tracer,
  129. // [Psiphon]
  130. ClientHelloSeed: config.ClientHelloSeed,
  131. GetClientHelloRandom: config.GetClientHelloRandom,
  132. VerifyClientHelloRandom: config.VerifyClientHelloRandom,
  133. ClientMaxPacketSizeAdjustment: config.ClientMaxPacketSizeAdjustment,
  134. ServerMaxPacketSizeAdjustment: config.ServerMaxPacketSizeAdjustment,
  135. }
  136. }