server.go 24 KB

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