server.go 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828
  1. package quic
  2. import (
  3. "context"
  4. "crypto/rand"
  5. "crypto/tls"
  6. "errors"
  7. "fmt"
  8. "net"
  9. "sync"
  10. "sync/atomic"
  11. "time"
  12. "github.com/Psiphon-Labs/quic-go/internal/handshake"
  13. "github.com/Psiphon-Labs/quic-go/internal/protocol"
  14. "github.com/Psiphon-Labs/quic-go/internal/qerr"
  15. "github.com/Psiphon-Labs/quic-go/internal/qtls"
  16. "github.com/Psiphon-Labs/quic-go/internal/utils"
  17. "github.com/Psiphon-Labs/quic-go/internal/wire"
  18. "github.com/Psiphon-Labs/quic-go/logging"
  19. )
  20. // ErrServerClosed is returned by the Listener or EarlyListener's Accept method after a call to Close.
  21. var ErrServerClosed = errors.New("quic: Server closed")
  22. // packetHandler handles packets
  23. type packetHandler interface {
  24. handlePacket(*receivedPacket)
  25. shutdown()
  26. destroy(error)
  27. getPerspective() protocol.Perspective
  28. }
  29. type unknownPacketHandler interface {
  30. handlePacket(*receivedPacket)
  31. setCloseError(error)
  32. }
  33. type packetHandlerManager interface {
  34. AddWithConnID(protocol.ConnectionID, protocol.ConnectionID, func() packetHandler) bool
  35. Destroy() error
  36. connRunner
  37. SetServer(unknownPacketHandler)
  38. CloseServer()
  39. }
  40. type quicConn interface {
  41. EarlyConnection
  42. earlyConnReady() <-chan struct{}
  43. handlePacket(*receivedPacket)
  44. GetVersion() protocol.VersionNumber
  45. getPerspective() protocol.Perspective
  46. run() error
  47. destroy(error)
  48. shutdown()
  49. }
  50. // A Listener of QUIC
  51. type baseServer struct {
  52. mutex sync.Mutex
  53. acceptEarlyConns bool
  54. tlsConf *tls.Config
  55. config *Config
  56. conn rawConn
  57. // If the server is started with ListenAddr, we create a packet conn.
  58. // If it is started with Listen, we take a packet conn as a parameter.
  59. createdPacketConn bool
  60. tokenGenerator *handshake.TokenGenerator
  61. connHandler packetHandlerManager
  62. receivedPackets chan *receivedPacket
  63. // set as a member, so they can be set in the tests
  64. newConn func(
  65. sendConn,
  66. connRunner,
  67. protocol.ConnectionID, /* original dest connection ID */
  68. *protocol.ConnectionID, /* retry src connection ID */
  69. protocol.ConnectionID, /* client dest connection ID */
  70. protocol.ConnectionID, /* destination connection ID */
  71. protocol.ConnectionID, /* source connection ID */
  72. protocol.StatelessResetToken,
  73. *Config,
  74. *tls.Config,
  75. *handshake.TokenGenerator,
  76. bool, /* client address validated by an address validation token */
  77. logging.ConnectionTracer,
  78. uint64,
  79. utils.Logger,
  80. protocol.VersionNumber,
  81. ) quicConn
  82. serverError error
  83. errorChan chan struct{}
  84. closed bool
  85. running chan struct{} // closed as soon as run() returns
  86. connQueue chan quicConn
  87. connQueueLen int32 // to be used as an atomic
  88. logger utils.Logger
  89. }
  90. var (
  91. _ Listener = &baseServer{}
  92. _ unknownPacketHandler = &baseServer{}
  93. )
  94. type earlyServer struct{ *baseServer }
  95. var _ EarlyListener = &earlyServer{}
  96. func (s *earlyServer) Accept(ctx context.Context) (EarlyConnection, error) {
  97. return s.baseServer.accept(ctx)
  98. }
  99. // ListenAddr creates a QUIC server listening on a given address.
  100. // The tls.Config must not be nil and must contain a certificate configuration.
  101. // The quic.Config may be nil, in that case the default values will be used.
  102. func ListenAddr(addr string, tlsConf *tls.Config, config *Config) (Listener, error) {
  103. return listenAddr(addr, tlsConf, config, false)
  104. }
  105. // ListenAddrEarly works like ListenAddr, but it returns connections before the handshake completes.
  106. func ListenAddrEarly(addr string, tlsConf *tls.Config, config *Config) (EarlyListener, error) {
  107. s, err := listenAddr(addr, tlsConf, config, true)
  108. if err != nil {
  109. return nil, err
  110. }
  111. return &earlyServer{s}, nil
  112. }
  113. func listenAddr(addr string, tlsConf *tls.Config, config *Config, acceptEarly bool) (*baseServer, error) {
  114. udpAddr, err := net.ResolveUDPAddr("udp", addr)
  115. if err != nil {
  116. return nil, err
  117. }
  118. conn, err := net.ListenUDP("udp", udpAddr)
  119. if err != nil {
  120. return nil, err
  121. }
  122. serv, err := listen(conn, tlsConf, config, acceptEarly)
  123. if err != nil {
  124. return nil, err
  125. }
  126. serv.createdPacketConn = true
  127. return serv, nil
  128. }
  129. // Listen listens for QUIC connections on a given net.PacketConn. If the
  130. // PacketConn satisfies the OOBCapablePacketConn interface (as a net.UDPConn
  131. // does), ECN and packet info support will be enabled. In this case, ReadMsgUDP
  132. // and WriteMsgUDP will be used instead of ReadFrom and WriteTo to read/write
  133. // packets. A single net.PacketConn only be used for a single call to Listen.
  134. // The PacketConn can be used for simultaneous calls to Dial. QUIC connection
  135. // IDs are used for demultiplexing the different connections. The tls.Config
  136. // must not be nil and must contain a certificate configuration. The
  137. // tls.Config.CipherSuites allows setting of TLS 1.3 cipher suites. Furthermore,
  138. // it must define an application control (using NextProtos). The quic.Config may
  139. // be nil, in that case the default values will be used.
  140. func Listen(conn net.PacketConn, tlsConf *tls.Config, config *Config) (Listener, error) {
  141. return listen(conn, tlsConf, config, false)
  142. }
  143. // ListenEarly works like Listen, but it returns connections before the handshake completes.
  144. func ListenEarly(conn net.PacketConn, tlsConf *tls.Config, config *Config) (EarlyListener, error) {
  145. s, err := listen(conn, tlsConf, config, true)
  146. if err != nil {
  147. return nil, err
  148. }
  149. return &earlyServer{s}, nil
  150. }
  151. func listen(conn net.PacketConn, tlsConf *tls.Config, config *Config, acceptEarly bool) (*baseServer, error) {
  152. if tlsConf == nil {
  153. return nil, errors.New("quic: tls.Config not set")
  154. }
  155. if err := validateConfig(config); err != nil {
  156. return nil, err
  157. }
  158. config = populateServerConfig(config)
  159. for _, v := range config.Versions {
  160. if !protocol.IsValidVersion(v) {
  161. return nil, fmt.Errorf("%s is not a valid QUIC version", v)
  162. }
  163. }
  164. connHandler, err := getMultiplexer().AddConn(conn, config.ConnectionIDGenerator.ConnectionIDLen(), config.StatelessResetKey, config.Tracer)
  165. if err != nil {
  166. return nil, err
  167. }
  168. tokenGenerator, err := handshake.NewTokenGenerator(rand.Reader)
  169. if err != nil {
  170. return nil, err
  171. }
  172. c, err := wrapConn(conn)
  173. if err != nil {
  174. return nil, err
  175. }
  176. s := &baseServer{
  177. conn: c,
  178. tlsConf: tlsConf,
  179. config: config,
  180. tokenGenerator: tokenGenerator,
  181. connHandler: connHandler,
  182. connQueue: make(chan quicConn),
  183. errorChan: make(chan struct{}),
  184. running: make(chan struct{}),
  185. receivedPackets: make(chan *receivedPacket, protocol.MaxServerUnprocessedPackets),
  186. newConn: newConnection,
  187. logger: utils.DefaultLogger.WithPrefix("server"),
  188. acceptEarlyConns: acceptEarly,
  189. }
  190. go s.run()
  191. connHandler.SetServer(s)
  192. s.logger.Debugf("Listening for %s connections on %s", conn.LocalAddr().Network(), conn.LocalAddr().String())
  193. return s, nil
  194. }
  195. func (s *baseServer) run() {
  196. defer close(s.running)
  197. for {
  198. select {
  199. case <-s.errorChan:
  200. return
  201. default:
  202. }
  203. select {
  204. case <-s.errorChan:
  205. return
  206. case p := <-s.receivedPackets:
  207. if bufferStillInUse := s.handlePacketImpl(p); !bufferStillInUse {
  208. p.buffer.Release()
  209. }
  210. }
  211. }
  212. }
  213. // Accept returns connections that already completed the handshake.
  214. // It is only valid if acceptEarlyConns is false.
  215. func (s *baseServer) Accept(ctx context.Context) (Connection, error) {
  216. return s.accept(ctx)
  217. }
  218. func (s *baseServer) accept(ctx context.Context) (quicConn, error) {
  219. select {
  220. case <-ctx.Done():
  221. return nil, ctx.Err()
  222. case conn := <-s.connQueue:
  223. atomic.AddInt32(&s.connQueueLen, -1)
  224. return conn, nil
  225. case <-s.errorChan:
  226. return nil, s.serverError
  227. }
  228. }
  229. // Close the server
  230. func (s *baseServer) Close() error {
  231. s.mutex.Lock()
  232. if s.closed {
  233. s.mutex.Unlock()
  234. return nil
  235. }
  236. if s.serverError == nil {
  237. s.serverError = ErrServerClosed
  238. }
  239. // If the server was started with ListenAddr, we created the packet conn.
  240. // We need to close it in order to make the go routine reading from that conn return.
  241. createdPacketConn := s.createdPacketConn
  242. s.closed = true
  243. close(s.errorChan)
  244. s.mutex.Unlock()
  245. <-s.running
  246. s.connHandler.CloseServer()
  247. if createdPacketConn {
  248. return s.connHandler.Destroy()
  249. }
  250. return nil
  251. }
  252. func (s *baseServer) setCloseError(e error) {
  253. s.mutex.Lock()
  254. defer s.mutex.Unlock()
  255. if s.closed {
  256. return
  257. }
  258. s.closed = true
  259. s.serverError = e
  260. close(s.errorChan)
  261. }
  262. // Addr returns the server's network address
  263. func (s *baseServer) Addr() net.Addr {
  264. return s.conn.LocalAddr()
  265. }
  266. func (s *baseServer) handlePacket(p *receivedPacket) {
  267. select {
  268. case s.receivedPackets <- p:
  269. default:
  270. s.logger.Debugf("Dropping packet from %s (%d bytes). Server receive queue full.", p.remoteAddr, p.Size())
  271. if s.config.Tracer != nil {
  272. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropDOSPrevention)
  273. }
  274. }
  275. }
  276. func (s *baseServer) handlePacketImpl(p *receivedPacket) bool /* is the buffer still in use? */ {
  277. if wire.IsVersionNegotiationPacket(p.data) {
  278. s.logger.Debugf("Dropping Version Negotiation packet.")
  279. if s.config.Tracer != nil {
  280. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeVersionNegotiation, p.Size(), logging.PacketDropUnexpectedPacket)
  281. }
  282. return false
  283. }
  284. // Short header packets should never end up here in the first place
  285. if !wire.IsLongHeaderPacket(p.data[0]) {
  286. panic(fmt.Sprintf("misrouted packet: %#v", p.data))
  287. }
  288. v, err := wire.ParseVersion(p.data)
  289. // send a Version Negotiation Packet if the client is speaking a different protocol version
  290. if err != nil || !protocol.IsSupportedVersion(s.config.Versions, v) {
  291. if err != nil || p.Size() < protocol.MinUnknownVersionPacketSize {
  292. s.logger.Debugf("Dropping a packet with an unknown version that is too small (%d bytes)", p.Size())
  293. if s.config.Tracer != nil {
  294. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropUnexpectedPacket)
  295. }
  296. return false
  297. }
  298. _, src, dest, err := wire.ParseArbitraryLenConnectionIDs(p.data)
  299. if err != nil { // should never happen
  300. s.logger.Debugf("Dropping a packet with an unknown version for which we failed to parse connection IDs")
  301. if s.config.Tracer != nil {
  302. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropUnexpectedPacket)
  303. }
  304. return false
  305. }
  306. if !s.config.DisableVersionNegotiationPackets {
  307. go s.sendVersionNegotiationPacket(p.remoteAddr, src, dest, p.info.OOB())
  308. }
  309. return false
  310. }
  311. // If we're creating a new connection, the packet will be passed to the connection.
  312. // The header will then be parsed again.
  313. hdr, _, _, err := wire.ParsePacket(p.data)
  314. if err != nil {
  315. if s.config.Tracer != nil {
  316. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeNotDetermined, p.Size(), logging.PacketDropHeaderParseError)
  317. }
  318. s.logger.Debugf("Error parsing packet: %s", err)
  319. return false
  320. }
  321. // [Psiphon]
  322. // To accomodate additional messages, obfuscated QUIC packets may reserve
  323. // significant space in the Initial packet and send less that 1200 QUIC
  324. // bytes. In this configuration, the obfuscation layer enforces the
  325. // anti-amplification 1200 byte rule, but it must be disabled here.
  326. isObfuscated := s.config.ServerMaxPacketSizeAdjustment != nil && s.config.ServerMaxPacketSizeAdjustment(p.remoteAddr) > 0
  327. if !isObfuscated &&
  328. hdr.Type == protocol.PacketTypeInitial && p.Size() < protocol.MinInitialPacketSize {
  329. s.logger.Debugf("Dropping a packet that is too small to be a valid Initial (%d bytes)", p.Size())
  330. if s.config.Tracer != nil {
  331. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropUnexpectedPacket)
  332. }
  333. return false
  334. }
  335. if hdr.Type != protocol.PacketTypeInitial {
  336. // Drop long header packets.
  337. // There's little point in sending a Stateless Reset, since the client
  338. // might not have received the token yet.
  339. s.logger.Debugf("Dropping long header packet of type %s (%d bytes)", hdr.Type, len(p.data))
  340. if s.config.Tracer != nil {
  341. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeFromHeader(hdr), p.Size(), logging.PacketDropUnexpectedPacket)
  342. }
  343. return false
  344. }
  345. s.logger.Debugf("<- Received Initial packet.")
  346. if err := s.handleInitialImpl(p, hdr); err != nil {
  347. s.logger.Errorf("Error occurred handling initial packet: %s", err)
  348. }
  349. // Don't put the packet buffer back.
  350. // handleInitialImpl deals with the buffer.
  351. return true
  352. }
  353. // [Psiphon]
  354. type stubCryptoSetup struct {
  355. initialOpener handshake.LongHeaderOpener
  356. }
  357. var notSupported = errors.New("not supported")
  358. func (s *stubCryptoSetup) RunHandshake() {
  359. }
  360. func (s *stubCryptoSetup) Close() error {
  361. return notSupported
  362. }
  363. func (s *stubCryptoSetup) ChangeConnectionID(protocol.ConnectionID) {
  364. }
  365. func (s *stubCryptoSetup) GetSessionTicket() ([]byte, error) {
  366. return nil, notSupported
  367. }
  368. func (s *stubCryptoSetup) HandleMessage([]byte, protocol.EncryptionLevel) bool {
  369. return false
  370. }
  371. func (s *stubCryptoSetup) SetLargest1RTTAcked(protocol.PacketNumber) error {
  372. return notSupported
  373. }
  374. func (s *stubCryptoSetup) SetHandshakeConfirmed() {
  375. }
  376. func (s *stubCryptoSetup) ConnectionState() handshake.ConnectionState {
  377. return handshake.ConnectionState{}
  378. }
  379. func (s *stubCryptoSetup) GetInitialOpener() (handshake.LongHeaderOpener, error) {
  380. return s.initialOpener, nil
  381. }
  382. func (s *stubCryptoSetup) GetHandshakeOpener() (handshake.LongHeaderOpener, error) {
  383. return nil, notSupported
  384. }
  385. func (s *stubCryptoSetup) Get0RTTOpener() (handshake.LongHeaderOpener, error) {
  386. return nil, notSupported
  387. }
  388. func (s *stubCryptoSetup) Get1RTTOpener() (handshake.ShortHeaderOpener, error) {
  389. return nil, notSupported
  390. }
  391. func (s *stubCryptoSetup) GetInitialSealer() (handshake.LongHeaderSealer, error) {
  392. return nil, notSupported
  393. }
  394. func (s *stubCryptoSetup) GetHandshakeSealer() (handshake.LongHeaderSealer, error) {
  395. return nil, notSupported
  396. }
  397. func (s *stubCryptoSetup) Get0RTTSealer() (handshake.LongHeaderSealer, error) {
  398. return nil, notSupported
  399. }
  400. func (s *stubCryptoSetup) Get1RTTSealer() (handshake.ShortHeaderSealer, error) {
  401. return nil, notSupported
  402. }
  403. // [Psiphon]
  404. // verifyClientHelloRandom unpacks an Initial packet, extracts the CRYPTO
  405. // frame, and calls Config.VerifyClientHelloRandom.
  406. func (s *baseServer) verifyClientHelloRandom(p *receivedPacket, hdr *wire.Header) error {
  407. // TODO: support QUICv2
  408. versionNumber := protocol.Version1
  409. _, initialOpener := handshake.NewInitialAEAD(
  410. hdr.DestConnectionID, protocol.PerspectiveServer, versionNumber)
  411. cs := &stubCryptoSetup{
  412. initialOpener: initialOpener,
  413. }
  414. // Make a copy of the packet data since this unpacking modifies it and the
  415. // original packet data must be retained for subsequent processing.
  416. data := append([]byte(nil), p.data...)
  417. unpacker := newPacketUnpacker(cs, 0)
  418. unpacked, err := unpacker.UnpackLongHeader(hdr, p.rcvTime, data, versionNumber)
  419. if err != nil {
  420. return fmt.Errorf("verifyClientHelloRandom: UnpackLongHeader: %w", err)
  421. }
  422. parser := wire.NewFrameParser(s.config.EnableDatagrams)
  423. d := unpacked.data
  424. for len(d) > 0 {
  425. l, frame, err := parser.ParseNext(d, protocol.EncryptionInitial, versionNumber)
  426. if err != nil {
  427. return fmt.Errorf("verifyClientHelloRandom: ParseNext: %w", err)
  428. }
  429. if frame == nil {
  430. return errors.New("verifyClientHelloRandom: missing CRYPTO frame")
  431. }
  432. d = d[l:]
  433. cryptoFrame, ok := frame.(*wire.CryptoFrame)
  434. if !ok {
  435. continue
  436. }
  437. if cryptoFrame.Offset != 0 {
  438. return errors.New("verifyClientHelloRandom: unexpected CRYPTO frame offset")
  439. }
  440. random, err := qtls.ReadClientHelloRandom(cryptoFrame.Data)
  441. if err != nil {
  442. return fmt.Errorf("verifyClientHelloRandom: ReadClientHelloRandom: %w", err)
  443. }
  444. if !s.config.VerifyClientHelloRandom(p.remoteAddr, random) {
  445. return fmt.Errorf("verifyClientHelloRandom: VerifyClientHelloRandom failed")
  446. }
  447. break
  448. }
  449. return nil
  450. }
  451. // validateToken returns false if:
  452. // - address is invalid
  453. // - token is expired
  454. // - token is null
  455. func (s *baseServer) validateToken(token *handshake.Token, addr net.Addr) bool {
  456. if token == nil {
  457. return false
  458. }
  459. if !token.ValidateRemoteAddr(addr) {
  460. return false
  461. }
  462. if !token.IsRetryToken && time.Since(token.SentTime) > s.config.MaxTokenAge {
  463. return false
  464. }
  465. if token.IsRetryToken && time.Since(token.SentTime) > s.config.MaxRetryTokenAge {
  466. return false
  467. }
  468. return true
  469. }
  470. func (s *baseServer) handleInitialImpl(p *receivedPacket, hdr *wire.Header) error {
  471. if len(hdr.Token) == 0 && hdr.DestConnectionID.Len() < protocol.MinConnectionIDLenInitial {
  472. p.buffer.Release()
  473. if s.config.Tracer != nil {
  474. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropUnexpectedPacket)
  475. }
  476. return errors.New("too short connection ID")
  477. }
  478. // [Psiphon]
  479. // Drop any Initial packet that fails verifyClientHelloRandom.
  480. if s.config.VerifyClientHelloRandom != nil {
  481. err := s.verifyClientHelloRandom(p, hdr)
  482. if err != nil {
  483. p.buffer.Release()
  484. return err
  485. }
  486. }
  487. var (
  488. token *handshake.Token
  489. retrySrcConnID *protocol.ConnectionID
  490. )
  491. origDestConnID := hdr.DestConnectionID
  492. if len(hdr.Token) > 0 {
  493. tok, err := s.tokenGenerator.DecodeToken(hdr.Token)
  494. if err == nil {
  495. if tok.IsRetryToken {
  496. origDestConnID = tok.OriginalDestConnectionID
  497. retrySrcConnID = &tok.RetrySrcConnectionID
  498. }
  499. token = tok
  500. }
  501. }
  502. clientAddrIsValid := s.validateToken(token, p.remoteAddr)
  503. if token != nil && !clientAddrIsValid {
  504. // For invalid and expired non-retry tokens, we don't send an INVALID_TOKEN error.
  505. // We just ignore them, and act as if there was no token on this packet at all.
  506. // This also means we might send a Retry later.
  507. if !token.IsRetryToken {
  508. token = nil
  509. } else {
  510. // For Retry tokens, we send an INVALID_ERROR if
  511. // * the token is too old, or
  512. // * the token is invalid, in case of a retry token.
  513. go func() {
  514. defer p.buffer.Release()
  515. if err := s.maybeSendInvalidToken(p, hdr); err != nil {
  516. s.logger.Debugf("Error sending INVALID_TOKEN error: %s", err)
  517. }
  518. }()
  519. return nil
  520. }
  521. }
  522. if token == nil && s.config.RequireAddressValidation(p.remoteAddr) {
  523. go func() {
  524. defer p.buffer.Release()
  525. if err := s.sendRetry(p.remoteAddr, hdr, p.info); err != nil {
  526. s.logger.Debugf("Error sending Retry: %s", err)
  527. }
  528. }()
  529. return nil
  530. }
  531. if queueLen := atomic.LoadInt32(&s.connQueueLen); queueLen >= protocol.MaxAcceptQueueSize {
  532. s.logger.Debugf("Rejecting new connection. Server currently busy. Accept queue length: %d (max %d)", queueLen, protocol.MaxAcceptQueueSize)
  533. go func() {
  534. defer p.buffer.Release()
  535. if err := s.sendConnectionRefused(p.remoteAddr, hdr, p.info); err != nil {
  536. s.logger.Debugf("Error rejecting connection: %s", err)
  537. }
  538. }()
  539. return nil
  540. }
  541. connID, err := s.config.ConnectionIDGenerator.GenerateConnectionID()
  542. if err != nil {
  543. return err
  544. }
  545. s.logger.Debugf("Changing connection ID to %s.", connID)
  546. var conn quicConn
  547. tracingID := nextConnTracingID()
  548. if added := s.connHandler.AddWithConnID(hdr.DestConnectionID, connID, func() packetHandler {
  549. var tracer logging.ConnectionTracer
  550. if s.config.Tracer != nil {
  551. // Use the same connection ID that is passed to the client's GetLogWriter callback.
  552. connID := hdr.DestConnectionID
  553. if origDestConnID.Len() > 0 {
  554. connID = origDestConnID
  555. }
  556. tracer = s.config.Tracer.TracerForConnection(
  557. context.WithValue(context.Background(), ConnectionTracingKey, tracingID),
  558. protocol.PerspectiveServer,
  559. connID,
  560. )
  561. }
  562. conn = s.newConn(
  563. newSendConn(s.conn, p.remoteAddr, p.info),
  564. s.connHandler,
  565. origDestConnID,
  566. retrySrcConnID,
  567. hdr.DestConnectionID,
  568. hdr.SrcConnectionID,
  569. connID,
  570. s.connHandler.GetStatelessResetToken(connID),
  571. s.config,
  572. s.tlsConf,
  573. s.tokenGenerator,
  574. clientAddrIsValid,
  575. tracer,
  576. tracingID,
  577. s.logger,
  578. hdr.Version,
  579. )
  580. conn.handlePacket(p)
  581. return conn
  582. }); !added {
  583. return nil
  584. }
  585. go conn.run()
  586. go s.handleNewConn(conn)
  587. if conn == nil {
  588. p.buffer.Release()
  589. return nil
  590. }
  591. return nil
  592. }
  593. func (s *baseServer) handleNewConn(conn quicConn) {
  594. connCtx := conn.Context()
  595. if s.acceptEarlyConns {
  596. // wait until the early connection is ready (or the handshake fails)
  597. select {
  598. case <-conn.earlyConnReady():
  599. case <-connCtx.Done():
  600. return
  601. }
  602. } else {
  603. // wait until the handshake is complete (or fails)
  604. select {
  605. case <-conn.HandshakeComplete().Done():
  606. case <-connCtx.Done():
  607. return
  608. }
  609. }
  610. atomic.AddInt32(&s.connQueueLen, 1)
  611. select {
  612. case s.connQueue <- conn:
  613. // blocks until the connection is accepted
  614. case <-connCtx.Done():
  615. atomic.AddInt32(&s.connQueueLen, -1)
  616. // don't pass connections that were already closed to Accept()
  617. }
  618. }
  619. func (s *baseServer) sendRetry(remoteAddr net.Addr, hdr *wire.Header, info *packetInfo) error {
  620. // Log the Initial packet now.
  621. // If no Retry is sent, the packet will be logged by the connection.
  622. (&wire.ExtendedHeader{Header: *hdr}).Log(s.logger)
  623. srcConnID, err := s.config.ConnectionIDGenerator.GenerateConnectionID()
  624. if err != nil {
  625. return err
  626. }
  627. token, err := s.tokenGenerator.NewRetryToken(remoteAddr, hdr.DestConnectionID, srcConnID)
  628. if err != nil {
  629. return err
  630. }
  631. replyHdr := &wire.ExtendedHeader{}
  632. replyHdr.Type = protocol.PacketTypeRetry
  633. replyHdr.Version = hdr.Version
  634. replyHdr.SrcConnectionID = srcConnID
  635. replyHdr.DestConnectionID = hdr.SrcConnectionID
  636. replyHdr.Token = token
  637. if s.logger.Debug() {
  638. s.logger.Debugf("Changing connection ID to %s.", srcConnID)
  639. s.logger.Debugf("-> Sending Retry")
  640. replyHdr.Log(s.logger)
  641. }
  642. buf := getPacketBuffer()
  643. defer buf.Release()
  644. buf.Data, err = replyHdr.Append(buf.Data, hdr.Version)
  645. if err != nil {
  646. return err
  647. }
  648. // append the Retry integrity tag
  649. tag := handshake.GetRetryIntegrityTag(buf.Data, hdr.DestConnectionID, hdr.Version)
  650. buf.Data = append(buf.Data, tag[:]...)
  651. if s.config.Tracer != nil {
  652. s.config.Tracer.SentPacket(remoteAddr, &replyHdr.Header, protocol.ByteCount(len(buf.Data)), nil)
  653. }
  654. _, err = s.conn.WritePacket(buf.Data, remoteAddr, info.OOB())
  655. return err
  656. }
  657. func (s *baseServer) maybeSendInvalidToken(p *receivedPacket, hdr *wire.Header) error {
  658. // Only send INVALID_TOKEN if we can unprotect the packet.
  659. // This makes sure that we won't send it for packets that were corrupted.
  660. sealer, opener := handshake.NewInitialAEAD(hdr.DestConnectionID, protocol.PerspectiveServer, hdr.Version)
  661. data := p.data[:hdr.ParsedLen()+hdr.Length]
  662. extHdr, err := unpackLongHeader(opener, hdr, data, hdr.Version)
  663. if err != nil {
  664. if s.config.Tracer != nil {
  665. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropHeaderParseError)
  666. }
  667. // don't return the error here. Just drop the packet.
  668. return nil
  669. }
  670. hdrLen := extHdr.ParsedLen()
  671. if _, err := opener.Open(data[hdrLen:hdrLen], data[hdrLen:], extHdr.PacketNumber, data[:hdrLen]); err != nil {
  672. // don't return the error here. Just drop the packet.
  673. if s.config.Tracer != nil {
  674. s.config.Tracer.DroppedPacket(p.remoteAddr, logging.PacketTypeInitial, p.Size(), logging.PacketDropPayloadDecryptError)
  675. }
  676. return nil
  677. }
  678. if s.logger.Debug() {
  679. s.logger.Debugf("Client sent an invalid retry token. Sending INVALID_TOKEN to %s.", p.remoteAddr)
  680. }
  681. return s.sendError(p.remoteAddr, hdr, sealer, qerr.InvalidToken, p.info)
  682. }
  683. func (s *baseServer) sendConnectionRefused(remoteAddr net.Addr, hdr *wire.Header, info *packetInfo) error {
  684. sealer, _ := handshake.NewInitialAEAD(hdr.DestConnectionID, protocol.PerspectiveServer, hdr.Version)
  685. return s.sendError(remoteAddr, hdr, sealer, qerr.ConnectionRefused, info)
  686. }
  687. // sendError sends the error as a response to the packet received with header hdr
  688. func (s *baseServer) sendError(remoteAddr net.Addr, hdr *wire.Header, sealer handshake.LongHeaderSealer, errorCode qerr.TransportErrorCode, info *packetInfo) error {
  689. b := getPacketBuffer()
  690. defer b.Release()
  691. ccf := &wire.ConnectionCloseFrame{ErrorCode: uint64(errorCode)}
  692. replyHdr := &wire.ExtendedHeader{}
  693. replyHdr.Type = protocol.PacketTypeInitial
  694. replyHdr.Version = hdr.Version
  695. replyHdr.SrcConnectionID = hdr.DestConnectionID
  696. replyHdr.DestConnectionID = hdr.SrcConnectionID
  697. replyHdr.PacketNumberLen = protocol.PacketNumberLen4
  698. replyHdr.Length = 4 /* packet number len */ + ccf.Length(hdr.Version) + protocol.ByteCount(sealer.Overhead())
  699. var err error
  700. b.Data, err = replyHdr.Append(b.Data, hdr.Version)
  701. if err != nil {
  702. return err
  703. }
  704. payloadOffset := len(b.Data)
  705. b.Data, err = ccf.Append(b.Data, hdr.Version)
  706. if err != nil {
  707. return err
  708. }
  709. _ = sealer.Seal(b.Data[payloadOffset:payloadOffset], b.Data[payloadOffset:], replyHdr.PacketNumber, b.Data[:payloadOffset])
  710. b.Data = b.Data[0 : len(b.Data)+sealer.Overhead()]
  711. pnOffset := payloadOffset - int(replyHdr.PacketNumberLen)
  712. sealer.EncryptHeader(
  713. b.Data[pnOffset+4:pnOffset+4+16],
  714. &b.Data[0],
  715. b.Data[pnOffset:payloadOffset],
  716. )
  717. replyHdr.Log(s.logger)
  718. wire.LogFrame(s.logger, ccf, true)
  719. if s.config.Tracer != nil {
  720. s.config.Tracer.SentPacket(remoteAddr, &replyHdr.Header, protocol.ByteCount(len(b.Data)), []logging.Frame{ccf})
  721. }
  722. _, err = s.conn.WritePacket(b.Data, remoteAddr, info.OOB())
  723. return err
  724. }
  725. func (s *baseServer) sendVersionNegotiationPacket(remote net.Addr, src, dest protocol.ArbitraryLenConnectionID, oob []byte) {
  726. s.logger.Debugf("Client offered version %s, sending Version Negotiation")
  727. data := wire.ComposeVersionNegotiation(dest, src, s.config.Versions)
  728. if s.config.Tracer != nil {
  729. s.config.Tracer.SentVersionNegotiationPacket(remote, src, dest, s.config.Versions)
  730. }
  731. if _, err := s.conn.WritePacket(data, remote, oob); err != nil {
  732. s.logger.Debugf("Error sending Version Negotiation: %s", err)
  733. }
  734. }