config.go 4.7 KB

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