config.go 4.5 KB

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