server.go 25 KB

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