config.go 4.5 KB

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