github.com/psiphon-labs/psiphon-tunnel-core@v2.0.28+incompatible/psiphon/common/quic/gquic-go/session.go (about) 1 package gquic 2 3 import ( 4 "context" 5 "crypto/rand" 6 "crypto/tls" 7 "errors" 8 "fmt" 9 "net" 10 "sync" 11 "time" 12 13 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/ackhandler" 14 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/congestion" 15 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/flowcontrol" 16 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/handshake" 17 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/protocol" 18 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/utils" 19 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/internal/wire" 20 "github.com/Psiphon-Labs/psiphon-tunnel-core/psiphon/common/quic/gquic-go/qerr" 21 "github.com/bifurcation/mint" 22 ) 23 24 type unpacker interface { 25 Unpack(headerBinary []byte, hdr *wire.Header, data []byte) (*unpackedPacket, error) 26 } 27 28 type streamGetter interface { 29 GetOrOpenReceiveStream(protocol.StreamID) (receiveStreamI, error) 30 GetOrOpenSendStream(protocol.StreamID) (sendStreamI, error) 31 } 32 33 type streamManager interface { 34 GetOrOpenSendStream(protocol.StreamID) (sendStreamI, error) 35 GetOrOpenReceiveStream(protocol.StreamID) (receiveStreamI, error) 36 OpenStream() (Stream, error) 37 OpenUniStream() (SendStream, error) 38 OpenStreamSync() (Stream, error) 39 OpenUniStreamSync() (SendStream, error) 40 AcceptStream() (Stream, error) 41 AcceptUniStream() (ReceiveStream, error) 42 DeleteStream(protocol.StreamID) error 43 UpdateLimits(*handshake.TransportParameters) 44 HandleMaxStreamIDFrame(*wire.MaxStreamIDFrame) error 45 CloseWithError(error) 46 } 47 48 type cryptoStreamHandler interface { 49 HandleCryptoStream() error 50 ConnectionState() handshake.ConnectionState 51 } 52 53 type divNonceSetter interface { 54 SetDiversificationNonce([]byte) error 55 } 56 57 type receivedPacket struct { 58 remoteAddr net.Addr 59 header *wire.Header 60 data []byte 61 rcvTime time.Time 62 } 63 64 var ( 65 newCryptoSetup = handshake.NewCryptoSetup 66 newCryptoSetupClient = handshake.NewCryptoSetupClient 67 ) 68 69 type closeError struct { 70 err error 71 remote bool 72 sendClose bool 73 } 74 75 // A Session is a QUIC session 76 type session struct { 77 sessionRunner sessionRunner 78 79 destConnID protocol.ConnectionID 80 srcConnID protocol.ConnectionID 81 82 perspective protocol.Perspective 83 version protocol.VersionNumber 84 config *Config 85 86 conn connection 87 88 streamsMap streamManager 89 cryptoStream cryptoStream 90 91 rttStats *congestion.RTTStats 92 93 sentPacketHandler ackhandler.SentPacketHandler 94 receivedPacketHandler ackhandler.ReceivedPacketHandler 95 framer *framer 96 windowUpdateQueue *windowUpdateQueue 97 connFlowController flowcontrol.ConnectionFlowController 98 99 unpacker unpacker 100 packer packer 101 102 cryptoStreamHandler cryptoStreamHandler 103 104 receivedPackets chan *receivedPacket 105 sendingScheduled chan struct{} 106 // closeChan is used to notify the run loop that it should terminate. 107 closeChan chan closeError 108 closeOnce sync.Once 109 110 ctx context.Context 111 ctxCancel context.CancelFunc 112 113 // when we receive too many undecryptable packets during the handshake, we send a Public reset 114 // but only after a time of protocol.PublicResetTimeout has passed 115 undecryptablePackets []*receivedPacket 116 receivedTooManyUndecrytablePacketsTime time.Time 117 118 // this channel is passed to the CryptoSetup and receives the transport parameters, as soon as the peer sends them 119 paramsChan <-chan handshake.TransportParameters 120 // the handshakeEvent channel is passed to the CryptoSetup. 121 // It receives when it makes sense to try decrypting undecryptable packets. 122 handshakeEvent <-chan struct{} 123 handshakeComplete bool 124 125 receivedFirstPacket bool // since packet numbers start at 0, we can't use largestRcvdPacketNumber != 0 for this 126 receivedFirstForwardSecurePacket bool 127 lastRcvdPacketNumber protocol.PacketNumber 128 // Used to calculate the next packet number from the truncated wire 129 // representation, and sent back in public reset packets 130 largestRcvdPacketNumber protocol.PacketNumber 131 132 sessionCreationTime time.Time 133 lastNetworkActivityTime time.Time 134 // pacingDeadline is the time when the next packet should be sent 135 pacingDeadline time.Time 136 137 peerParams *handshake.TransportParameters 138 139 timer *utils.Timer 140 // keepAlivePingSent stores whether a Ping frame was sent to the peer or not 141 // it is reset as soon as we receive a packet from the peer 142 keepAlivePingSent bool 143 144 logger utils.Logger 145 } 146 147 var _ Session = &session{} 148 var _ streamSender = &session{} 149 150 // newSession makes a new session 151 func newSession( 152 conn connection, 153 sessionRunner sessionRunner, 154 v protocol.VersionNumber, 155 destConnID protocol.ConnectionID, 156 srcConnID protocol.ConnectionID, 157 scfg *handshake.ServerConfig, 158 tlsConf *tls.Config, 159 config *Config, 160 logger utils.Logger, 161 ) (quicSession, error) { 162 logger.Debugf("Creating new session. Destination Connection ID: %s, Source Connection ID: %s", destConnID, srcConnID) 163 paramsChan := make(chan handshake.TransportParameters) 164 handshakeEvent := make(chan struct{}, 1) 165 s := &session{ 166 conn: conn, 167 sessionRunner: sessionRunner, 168 srcConnID: srcConnID, 169 destConnID: destConnID, 170 perspective: protocol.PerspectiveServer, 171 version: v, 172 config: config, 173 handshakeEvent: handshakeEvent, 174 paramsChan: paramsChan, 175 logger: logger, 176 } 177 s.preSetup() 178 transportParams := &handshake.TransportParameters{ 179 StreamFlowControlWindow: protocol.ReceiveStreamFlowControlWindow, 180 ConnectionFlowControlWindow: protocol.ReceiveConnectionFlowControlWindow, 181 MaxStreams: uint32(s.config.MaxIncomingStreams), 182 IdleTimeout: s.config.IdleTimeout, 183 } 184 divNonce := make([]byte, 32) 185 if _, err := rand.Read(divNonce); err != nil { 186 return nil, err 187 } 188 cs, err := newCryptoSetup( 189 s.cryptoStream, 190 srcConnID, 191 s.conn.RemoteAddr(), 192 s.version, 193 divNonce, 194 scfg, 195 transportParams, 196 s.config.Versions, 197 s.config.AcceptCookie, 198 paramsChan, 199 handshakeEvent, 200 s.logger, 201 ) 202 if err != nil { 203 return nil, err 204 } 205 s.cryptoStreamHandler = cs 206 s.unpacker = newPacketUnpackerGQUIC(cs, s.version) 207 s.streamsMap = newStreamsMapLegacy(s.newStream, s.config.MaxIncomingStreams, s.perspective) 208 s.framer = newFramer(s.cryptoStream, s.streamsMap, s.version) 209 s.packer = newPacketPackerLegacy( 210 destConnID, 211 srcConnID, 212 s.sentPacketHandler.GetPacketNumberLen, 213 s.RemoteAddr(), 214 divNonce, 215 s.cryptoStream, 216 cs, 217 s.framer, 218 sentAndReceivedPacketManager{s.sentPacketHandler, s.receivedPacketHandler}, 219 s.perspective, 220 s.version, 221 ) 222 return s, s.postSetup() 223 } 224 225 // declare this as a variable, so that we can it mock it in the tests 226 var newClientSession = func( 227 conn connection, 228 sessionRunner sessionRunner, 229 v protocol.VersionNumber, 230 destConnID protocol.ConnectionID, 231 srcConnID protocol.ConnectionID, 232 tlsConf *tls.Config, 233 config *Config, 234 initialVersion protocol.VersionNumber, 235 negotiatedVersions []protocol.VersionNumber, // needed for validation of the GQUIC version negotiation 236 logger utils.Logger, 237 ) (quicSession, error) { 238 logger.Debugf("Creating new session. Destination Connection ID: %s, Source Connection ID: %s", destConnID, srcConnID) 239 paramsChan := make(chan handshake.TransportParameters) 240 handshakeEvent := make(chan struct{}, 1) 241 s := &session{ 242 conn: conn, 243 sessionRunner: sessionRunner, 244 srcConnID: srcConnID, 245 destConnID: destConnID, 246 perspective: protocol.PerspectiveClient, 247 version: v, 248 config: config, 249 handshakeEvent: handshakeEvent, 250 paramsChan: paramsChan, 251 logger: logger, 252 } 253 s.preSetup() 254 transportParams := &handshake.TransportParameters{ 255 StreamFlowControlWindow: protocol.ReceiveStreamFlowControlWindow, 256 ConnectionFlowControlWindow: protocol.ReceiveConnectionFlowControlWindow, 257 MaxStreams: uint32(s.config.MaxIncomingStreams), 258 IdleTimeout: s.config.IdleTimeout, 259 OmitConnectionID: s.config.RequestConnectionIDOmission, 260 } 261 cs, err := newCryptoSetupClient( 262 s.cryptoStream, 263 destConnID, 264 s.version, 265 tlsConf, 266 transportParams, 267 paramsChan, 268 handshakeEvent, 269 initialVersion, 270 negotiatedVersions, 271 s.logger, 272 ) 273 if err != nil { 274 return nil, err 275 } 276 s.cryptoStreamHandler = cs 277 s.unpacker = newPacketUnpackerGQUIC(cs, s.version) 278 s.streamsMap = newStreamsMapLegacy(s.newStream, s.config.MaxIncomingStreams, s.perspective) 279 s.framer = newFramer(s.cryptoStream, s.streamsMap, s.version) 280 s.packer = newPacketPackerLegacy( 281 destConnID, 282 srcConnID, 283 s.sentPacketHandler.GetPacketNumberLen, 284 s.RemoteAddr(), 285 nil, // no diversification nonce 286 s.cryptoStream, 287 cs, 288 s.framer, 289 sentAndReceivedPacketManager{s.sentPacketHandler, s.receivedPacketHandler}, 290 s.perspective, 291 s.version, 292 ) 293 return s, s.postSetup() 294 } 295 296 func newTLSServerSession( 297 conn connection, 298 runner sessionRunner, 299 origConnID protocol.ConnectionID, 300 destConnID protocol.ConnectionID, 301 srcConnID protocol.ConnectionID, 302 initialPacketNumber protocol.PacketNumber, 303 config *Config, 304 mintConf *mint.Config, 305 paramsChan <-chan handshake.TransportParameters, 306 logger utils.Logger, 307 v protocol.VersionNumber, 308 ) (quicSession, error) { 309 handshakeEvent := make(chan struct{}, 1) 310 s := &session{ 311 conn: conn, 312 sessionRunner: runner, 313 config: config, 314 srcConnID: srcConnID, 315 destConnID: destConnID, 316 perspective: protocol.PerspectiveServer, 317 version: v, 318 handshakeEvent: handshakeEvent, 319 paramsChan: paramsChan, 320 logger: logger, 321 } 322 s.preSetup() 323 cs, err := handshake.NewCryptoSetupTLSServer( 324 s.cryptoStream, 325 origConnID, 326 mintConf, 327 handshakeEvent, 328 v, 329 ) 330 if err != nil { 331 return nil, err 332 } 333 s.cryptoStreamHandler = cs 334 s.streamsMap = newStreamsMap(s, s.newFlowController, s.config.MaxIncomingStreams, s.config.MaxIncomingUniStreams, s.perspective, s.version) 335 s.framer = newFramer(s.cryptoStream, s.streamsMap, s.version) 336 s.packer = newPacketPacker( 337 s.destConnID, 338 s.srcConnID, 339 initialPacketNumber, 340 s.sentPacketHandler.GetPacketNumberLen, 341 s.RemoteAddr(), 342 nil, // no token 343 s.cryptoStream, 344 cs, 345 s.framer, 346 sentAndReceivedPacketManager{s.sentPacketHandler, s.receivedPacketHandler}, 347 s.perspective, 348 s.version, 349 ) 350 if err := s.postSetup(); err != nil { 351 return nil, err 352 } 353 s.unpacker = newPacketUnpacker(cs, s.version) 354 return s, nil 355 } 356 357 // declare this as a variable, such that we can it mock it in the tests 358 var newTLSClientSession = func( 359 conn connection, 360 runner sessionRunner, 361 token []byte, 362 destConnID protocol.ConnectionID, 363 srcConnID protocol.ConnectionID, 364 conf *Config, 365 mintConf *mint.Config, 366 paramsChan <-chan handshake.TransportParameters, 367 initialPacketNumber protocol.PacketNumber, 368 logger utils.Logger, 369 v protocol.VersionNumber, 370 ) (quicSession, error) { 371 handshakeEvent := make(chan struct{}, 1) 372 s := &session{ 373 conn: conn, 374 sessionRunner: runner, 375 config: conf, 376 srcConnID: srcConnID, 377 destConnID: destConnID, 378 perspective: protocol.PerspectiveClient, 379 version: v, 380 handshakeEvent: handshakeEvent, 381 paramsChan: paramsChan, 382 logger: logger, 383 } 384 s.preSetup() 385 cs, err := handshake.NewCryptoSetupTLSClient( 386 s.cryptoStream, 387 s.destConnID, 388 mintConf, 389 handshakeEvent, 390 v, 391 ) 392 if err != nil { 393 return nil, err 394 } 395 s.cryptoStreamHandler = cs 396 s.unpacker = newPacketUnpacker(cs, s.version) 397 s.streamsMap = newStreamsMap(s, s.newFlowController, s.config.MaxIncomingStreams, s.config.MaxIncomingUniStreams, s.perspective, s.version) 398 s.framer = newFramer(s.cryptoStream, s.streamsMap, s.version) 399 s.packer = newPacketPacker( 400 s.destConnID, 401 s.srcConnID, 402 initialPacketNumber, 403 s.sentPacketHandler.GetPacketNumberLen, 404 s.RemoteAddr(), 405 token, 406 s.cryptoStream, 407 cs, 408 s.framer, 409 sentAndReceivedPacketManager{s.sentPacketHandler, s.receivedPacketHandler}, 410 s.perspective, 411 s.version, 412 ) 413 return s, s.postSetup() 414 } 415 416 func (s *session) preSetup() { 417 s.rttStats = &congestion.RTTStats{} 418 s.sentPacketHandler = ackhandler.NewSentPacketHandler(s.rttStats, s.logger, s.version) 419 s.receivedPacketHandler = ackhandler.NewReceivedPacketHandler(s.rttStats, s.logger, s.version) 420 s.connFlowController = flowcontrol.NewConnectionFlowController( 421 protocol.ReceiveConnectionFlowControlWindow, 422 protocol.ByteCount(s.config.MaxReceiveConnectionFlowControlWindow), 423 s.onHasConnectionWindowUpdate, 424 s.rttStats, 425 s.logger, 426 ) 427 s.cryptoStream = s.newCryptoStream() 428 } 429 430 func (s *session) postSetup() error { 431 s.receivedPackets = make(chan *receivedPacket, protocol.MaxSessionUnprocessedPackets) 432 s.closeChan = make(chan closeError, 1) 433 s.sendingScheduled = make(chan struct{}, 1) 434 s.undecryptablePackets = make([]*receivedPacket, 0, protocol.MaxUndecryptablePackets) 435 s.ctx, s.ctxCancel = context.WithCancel(context.Background()) 436 437 s.timer = utils.NewTimer() 438 now := time.Now() 439 s.lastNetworkActivityTime = now 440 s.sessionCreationTime = now 441 442 s.windowUpdateQueue = newWindowUpdateQueue(s.streamsMap, s.connFlowController, s.framer.QueueControlFrame) 443 return nil 444 } 445 446 // run the session main loop 447 func (s *session) run() error { 448 defer s.ctxCancel() 449 450 go func() { 451 if err := s.cryptoStreamHandler.HandleCryptoStream(); err != nil { 452 s.closeLocal(err) 453 } 454 }() 455 456 var closeErr closeError 457 458 runLoop: 459 for { 460 461 // Close immediately if requested 462 select { 463 case closeErr = <-s.closeChan: 464 break runLoop 465 case _, ok := <-s.handshakeEvent: 466 // when the handshake is completed, the channel will be closed 467 s.handleHandshakeEvent(!ok) 468 default: 469 } 470 471 s.maybeResetTimer() 472 473 select { 474 case closeErr = <-s.closeChan: 475 break runLoop 476 case <-s.timer.Chan(): 477 s.timer.SetRead() 478 // We do all the interesting stuff after the switch statement, so 479 // nothing to see here. 480 case <-s.sendingScheduled: 481 // We do all the interesting stuff after the switch statement, so 482 // nothing to see here. 483 case p := <-s.receivedPackets: 484 err := s.handlePacketImpl(p) 485 if err != nil { 486 if qErr, ok := err.(*qerr.QuicError); ok && qErr.ErrorCode == qerr.DecryptionFailure { 487 s.tryQueueingUndecryptablePacket(p) 488 continue 489 } 490 s.closeLocal(err) 491 continue 492 } 493 // This is a bit unclean, but works properly, since the packet always 494 // begins with the public header and we never copy it. 495 putPacketBuffer(&p.header.Raw) 496 case p := <-s.paramsChan: 497 s.processTransportParameters(&p) 498 continue 499 case _, ok := <-s.handshakeEvent: 500 // when the handshake is completed, the channel will be closed 501 s.handleHandshakeEvent(!ok) 502 } 503 504 now := time.Now() 505 if timeout := s.sentPacketHandler.GetAlarmTimeout(); !timeout.IsZero() && timeout.Before(now) { 506 // This could cause packets to be retransmitted. 507 // Check it before trying to send packets. 508 if err := s.sentPacketHandler.OnAlarm(); err != nil { 509 s.closeLocal(err) 510 } 511 } 512 513 var pacingDeadline time.Time 514 if s.pacingDeadline.IsZero() { // the timer didn't have a pacing deadline set 515 pacingDeadline = s.sentPacketHandler.TimeUntilSend() 516 } 517 if s.config.KeepAlive && !s.keepAlivePingSent && s.handshakeComplete && time.Since(s.lastNetworkActivityTime) >= s.peerParams.IdleTimeout/2 { 518 // send a PING frame since there is no activity in the session 519 s.logger.Debugf("Sending a keep-alive ping to keep the connection alive.") 520 s.framer.QueueControlFrame(&wire.PingFrame{}) 521 s.keepAlivePingSent = true 522 } else if !pacingDeadline.IsZero() && now.Before(pacingDeadline) { 523 // If we get to this point before the pacing deadline, we should wait until that deadline. 524 // This can happen when scheduleSending is called, or a packet is received. 525 // Set the timer and restart the run loop. 526 s.pacingDeadline = pacingDeadline 527 continue 528 } 529 530 if !s.receivedTooManyUndecrytablePacketsTime.IsZero() && s.receivedTooManyUndecrytablePacketsTime.Add(protocol.PublicResetTimeout).Before(now) && len(s.undecryptablePackets) != 0 { 531 s.closeLocal(qerr.Error(qerr.DecryptionFailure, "too many undecryptable packets received")) 532 continue 533 } 534 if !s.handshakeComplete && now.Sub(s.sessionCreationTime) >= s.config.HandshakeTimeout { 535 s.closeLocal(qerr.Error(qerr.HandshakeTimeout, "Crypto handshake did not complete in time.")) 536 continue 537 } 538 if s.handshakeComplete && now.Sub(s.lastNetworkActivityTime) >= s.config.IdleTimeout { 539 s.closeLocal(qerr.Error(qerr.NetworkIdleTimeout, "No recent network activity.")) 540 continue 541 } 542 543 if err := s.sendPackets(); err != nil { 544 s.closeLocal(err) 545 } 546 } 547 548 // [Psiphon] 549 // Stop timer to immediately release resources 550 s.timer.Reset(time.Time{}) 551 552 if err := s.handleCloseError(closeErr); err != nil { 553 s.logger.Infof("Handling close error failed: %s", err) 554 } 555 s.logger.Infof("Connection %s closed.", s.srcConnID) 556 s.sessionRunner.removeConnectionID(s.srcConnID) 557 return closeErr.err 558 } 559 560 func (s *session) Context() context.Context { 561 return s.ctx 562 } 563 564 func (s *session) ConnectionState() ConnectionState { 565 return s.cryptoStreamHandler.ConnectionState() 566 } 567 568 func (s *session) maybeResetTimer() { 569 var deadline time.Time 570 if s.config.KeepAlive && s.handshakeComplete && !s.keepAlivePingSent { 571 deadline = s.lastNetworkActivityTime.Add(s.peerParams.IdleTimeout / 2) 572 } else { 573 deadline = s.lastNetworkActivityTime.Add(s.config.IdleTimeout) 574 } 575 576 if ackAlarm := s.receivedPacketHandler.GetAlarmTimeout(); !ackAlarm.IsZero() { 577 deadline = utils.MinTime(deadline, ackAlarm) 578 } 579 if lossTime := s.sentPacketHandler.GetAlarmTimeout(); !lossTime.IsZero() { 580 deadline = utils.MinTime(deadline, lossTime) 581 } 582 if !s.handshakeComplete { 583 handshakeDeadline := s.sessionCreationTime.Add(s.config.HandshakeTimeout) 584 deadline = utils.MinTime(deadline, handshakeDeadline) 585 } 586 if !s.receivedTooManyUndecrytablePacketsTime.IsZero() { 587 deadline = utils.MinTime(deadline, s.receivedTooManyUndecrytablePacketsTime.Add(protocol.PublicResetTimeout)) 588 } 589 if !s.pacingDeadline.IsZero() { 590 deadline = utils.MinTime(deadline, s.pacingDeadline) 591 } 592 593 s.timer.Reset(deadline) 594 } 595 596 func (s *session) handleHandshakeEvent(completed bool) { 597 if !completed { 598 s.tryDecryptingQueuedPackets() 599 return 600 } 601 s.handshakeComplete = true 602 s.handshakeEvent = nil // prevent this case from ever being selected again 603 s.sessionRunner.onHandshakeComplete(s) 604 605 // In gQUIC, the server completes the handshake first (after sending the SHLO). 606 // In TLS 1.3, the client completes the handshake first (after sending the CFIN). 607 // We need to make sure they learn about the peer completing the handshake, 608 // in order to stop retransmitting handshake packets. 609 // They will stop retransmitting handshake packets when receiving the first forward-secure packet. 610 // We need to make sure that a retransmittable forward-secure packet is sent, 611 // independent from the application protocol. 612 if (!s.version.UsesTLS() && s.perspective == protocol.PerspectiveClient) || 613 (s.version.UsesTLS() && s.perspective == protocol.PerspectiveServer) { 614 s.queueControlFrame(&wire.PingFrame{}) 615 s.sentPacketHandler.SetHandshakeComplete() 616 } 617 } 618 619 func (s *session) handlePacketImpl(p *receivedPacket) error { 620 hdr := p.header 621 // The server can change the source connection ID with the first Handshake packet. 622 // After this, all packets with a different source connection have to be ignored. 623 if s.receivedFirstPacket && hdr.IsLongHeader && !hdr.SrcConnectionID.Equal(s.destConnID) { 624 s.logger.Debugf("Dropping packet with unexpected source connection ID: %s (expected %s)", p.header.SrcConnectionID, s.destConnID) 625 return nil 626 } 627 if s.perspective == protocol.PerspectiveClient { 628 if divNonce := p.header.DiversificationNonce; len(divNonce) > 0 { 629 if err := s.cryptoStreamHandler.(divNonceSetter).SetDiversificationNonce(divNonce); err != nil { 630 return err 631 } 632 } 633 } 634 635 if p.rcvTime.IsZero() { 636 // To simplify testing 637 p.rcvTime = time.Now() 638 } 639 640 // Calculate packet number 641 hdr.PacketNumber = protocol.InferPacketNumber( 642 hdr.PacketNumberLen, 643 s.largestRcvdPacketNumber, 644 hdr.PacketNumber, 645 s.version, 646 ) 647 648 packet, err := s.unpacker.Unpack(hdr.Raw, hdr, p.data) 649 if s.logger.Debug() { 650 if err != nil { 651 s.logger.Debugf("<- Reading packet 0x%x (%d bytes) for connection %s", hdr.PacketNumber, len(p.data)+len(hdr.Raw), hdr.DestConnectionID) 652 } else { 653 s.logger.Debugf("<- Reading packet 0x%x (%d bytes) for connection %s, %s", hdr.PacketNumber, len(p.data)+len(hdr.Raw), hdr.DestConnectionID, packet.encryptionLevel) 654 } 655 hdr.Log(s.logger) 656 } 657 // if the decryption failed, this might be a packet sent by an attacker 658 if err != nil { 659 return err 660 } 661 662 // The server can change the source connection ID with the first Handshake packet. 663 if s.perspective == protocol.PerspectiveClient && !s.receivedFirstPacket && hdr.IsLongHeader && !hdr.SrcConnectionID.Equal(s.destConnID) { 664 s.logger.Debugf("Received first packet. Switching destination connection ID to: %s", hdr.SrcConnectionID) 665 s.destConnID = hdr.SrcConnectionID 666 err = s.packer.ChangeDestConnectionID(s.destConnID) 667 // [Psiphon] 668 // - Check error return value. 669 if err != nil { 670 return err 671 } 672 // [Psiphon] 673 } 674 675 s.receivedFirstPacket = true 676 s.lastNetworkActivityTime = p.rcvTime 677 s.keepAlivePingSent = false 678 679 // In gQUIC, the server completes the handshake first (after sending the SHLO). 680 // In TLS 1.3, the client completes the handshake first (after sending the CFIN). 681 // We know that the peer completed the handshake as soon as we receive a forward-secure packet. 682 if (!s.version.UsesTLS() && s.perspective == protocol.PerspectiveServer) || 683 (s.version.UsesTLS() && s.perspective == protocol.PerspectiveClient) { 684 if !s.receivedFirstForwardSecurePacket && packet.encryptionLevel == protocol.EncryptionForwardSecure { 685 s.receivedFirstForwardSecurePacket = true 686 s.sentPacketHandler.SetHandshakeComplete() 687 } 688 } 689 690 s.lastRcvdPacketNumber = hdr.PacketNumber 691 // Only do this after decrypting, so we are sure the packet is not attacker-controlled 692 s.largestRcvdPacketNumber = utils.MaxPacketNumber(s.largestRcvdPacketNumber, hdr.PacketNumber) 693 694 // If this is a Retry packet, there's no need to send an ACK. 695 // The session will be closed and recreated as soon as the crypto setup processed the HRR. 696 if hdr.Type != protocol.PacketTypeRetry { 697 isRetransmittable := ackhandler.HasRetransmittableFrames(packet.frames) 698 if err := s.receivedPacketHandler.ReceivedPacket(hdr.PacketNumber, p.rcvTime, isRetransmittable); err != nil { 699 return err 700 } 701 } 702 703 return s.handleFrames(packet.frames, packet.encryptionLevel) 704 } 705 706 func (s *session) handleFrames(fs []wire.Frame, encLevel protocol.EncryptionLevel) error { 707 for _, ff := range fs { 708 var err error 709 wire.LogFrame(s.logger, ff, false) 710 switch frame := ff.(type) { 711 case *wire.StreamFrame: 712 err = s.handleStreamFrame(frame, encLevel) 713 case *wire.AckFrame: 714 err = s.handleAckFrame(frame, encLevel) 715 case *wire.ConnectionCloseFrame: 716 s.closeRemote(qerr.Error(frame.ErrorCode, frame.ReasonPhrase)) 717 case *wire.GoawayFrame: 718 err = errors.New("unimplemented: handling GOAWAY frames") 719 case *wire.StopWaitingFrame: // ignore STOP_WAITINGs 720 case *wire.RstStreamFrame: 721 err = s.handleRstStreamFrame(frame) 722 case *wire.MaxDataFrame: 723 s.handleMaxDataFrame(frame) 724 case *wire.MaxStreamDataFrame: 725 err = s.handleMaxStreamDataFrame(frame) 726 case *wire.MaxStreamIDFrame: 727 err = s.handleMaxStreamIDFrame(frame) 728 case *wire.BlockedFrame: 729 case *wire.StreamBlockedFrame: 730 case *wire.StreamIDBlockedFrame: 731 case *wire.StopSendingFrame: 732 err = s.handleStopSendingFrame(frame) 733 case *wire.PingFrame: 734 case *wire.PathChallengeFrame: 735 s.handlePathChallengeFrame(frame) 736 case *wire.PathResponseFrame: 737 // since we don't send PATH_CHALLENGEs, we don't expect PATH_RESPONSEs 738 err = errors.New("unexpected PATH_RESPONSE frame") 739 default: 740 return errors.New("Session BUG: unexpected frame type") 741 } 742 743 if err != nil { 744 return err 745 } 746 } 747 return nil 748 } 749 750 // handlePacket is called by the server with a new packet 751 func (s *session) handlePacket(p *receivedPacket) { 752 // Discard packets once the amount of queued packets is larger than 753 // the channel size, protocol.MaxSessionUnprocessedPackets 754 select { 755 case s.receivedPackets <- p: 756 default: 757 } 758 } 759 760 func (s *session) handleStreamFrame(frame *wire.StreamFrame, encLevel protocol.EncryptionLevel) error { 761 if frame.StreamID == s.version.CryptoStreamID() { 762 if frame.FinBit { 763 return errors.New("Received STREAM frame with FIN bit for the crypto stream") 764 } 765 return s.cryptoStream.handleStreamFrame(frame) 766 } else if encLevel <= protocol.EncryptionUnencrypted { 767 return qerr.Error(qerr.UnencryptedStreamData, fmt.Sprintf("received unencrypted stream data on stream %d", frame.StreamID)) 768 } 769 str, err := s.streamsMap.GetOrOpenReceiveStream(frame.StreamID) 770 if err != nil { 771 return err 772 } 773 if str == nil { 774 // Stream is closed and already garbage collected 775 // ignore this StreamFrame 776 return nil 777 } 778 return str.handleStreamFrame(frame) 779 } 780 781 func (s *session) handleMaxDataFrame(frame *wire.MaxDataFrame) { 782 s.connFlowController.UpdateSendWindow(frame.ByteOffset) 783 } 784 785 func (s *session) handleMaxStreamDataFrame(frame *wire.MaxStreamDataFrame) error { 786 if frame.StreamID == s.version.CryptoStreamID() { 787 s.cryptoStream.handleMaxStreamDataFrame(frame) 788 return nil 789 } 790 str, err := s.streamsMap.GetOrOpenSendStream(frame.StreamID) 791 if err != nil { 792 return err 793 } 794 if str == nil { 795 // stream is closed and already garbage collected 796 return nil 797 } 798 str.handleMaxStreamDataFrame(frame) 799 return nil 800 } 801 802 func (s *session) handleMaxStreamIDFrame(frame *wire.MaxStreamIDFrame) error { 803 return s.streamsMap.HandleMaxStreamIDFrame(frame) 804 } 805 806 func (s *session) handleRstStreamFrame(frame *wire.RstStreamFrame) error { 807 if frame.StreamID == s.version.CryptoStreamID() { 808 return errors.New("Received RST_STREAM frame for the crypto stream") 809 } 810 str, err := s.streamsMap.GetOrOpenReceiveStream(frame.StreamID) 811 if err != nil { 812 return err 813 } 814 if str == nil { 815 // stream is closed and already garbage collected 816 return nil 817 } 818 return str.handleRstStreamFrame(frame) 819 } 820 821 func (s *session) handleStopSendingFrame(frame *wire.StopSendingFrame) error { 822 if frame.StreamID == s.version.CryptoStreamID() { 823 return errors.New("Received a STOP_SENDING frame for the crypto stream") 824 } 825 str, err := s.streamsMap.GetOrOpenSendStream(frame.StreamID) 826 if err != nil { 827 return err 828 } 829 if str == nil { 830 // stream is closed and already garbage collected 831 return nil 832 } 833 str.handleStopSendingFrame(frame) 834 return nil 835 } 836 837 func (s *session) handlePathChallengeFrame(frame *wire.PathChallengeFrame) { 838 s.queueControlFrame(&wire.PathResponseFrame{Data: frame.Data}) 839 } 840 841 func (s *session) handleAckFrame(frame *wire.AckFrame, encLevel protocol.EncryptionLevel) error { 842 if err := s.sentPacketHandler.ReceivedAck(frame, s.lastRcvdPacketNumber, encLevel, s.lastNetworkActivityTime); err != nil { 843 return err 844 } 845 s.receivedPacketHandler.IgnoreBelow(s.sentPacketHandler.GetLowestPacketNotConfirmedAcked()) 846 return nil 847 } 848 849 // closeLocal closes the session and send a CONNECTION_CLOSE containing the error 850 func (s *session) closeLocal(e error) { 851 s.closeOnce.Do(func() { 852 s.closeChan <- closeError{err: e, sendClose: true, remote: false} 853 }) 854 } 855 856 // destroy closes the session without sending the error on the wire 857 func (s *session) destroy(e error) { 858 s.closeOnce.Do(func() { 859 s.closeChan <- closeError{err: e, sendClose: false, remote: false} 860 }) 861 } 862 863 func (s *session) closeRemote(e error) { 864 s.closeOnce.Do(func() { 865 s.closeChan <- closeError{err: e, remote: true} 866 }) 867 } 868 869 // Close the connection. It sends a qerr.PeerGoingAway. 870 // It waits until the run loop has stopped before returning 871 func (s *session) Close() error { 872 s.closeLocal(nil) 873 <-s.ctx.Done() 874 return nil 875 } 876 877 func (s *session) CloseWithError(code protocol.ApplicationErrorCode, e error) error { 878 s.closeLocal(qerr.Error(qerr.ErrorCode(code), e.Error())) 879 <-s.ctx.Done() 880 return nil 881 } 882 883 func (s *session) handleCloseError(closeErr closeError) error { 884 if closeErr.err == nil { 885 closeErr.err = qerr.PeerGoingAway 886 } 887 888 var quicErr *qerr.QuicError 889 var ok bool 890 if quicErr, ok = closeErr.err.(*qerr.QuicError); !ok { 891 quicErr = qerr.ToQuicError(closeErr.err) 892 } 893 // Don't log 'normal' reasons 894 if quicErr.ErrorCode == qerr.PeerGoingAway || quicErr.ErrorCode == qerr.NetworkIdleTimeout { 895 s.logger.Infof("Closing connection %s.", s.srcConnID) 896 } else { 897 s.logger.Errorf("Closing session with error: %s", closeErr.err.Error()) 898 } 899 900 s.cryptoStream.closeForShutdown(quicErr) 901 s.streamsMap.CloseWithError(quicErr) 902 903 if !closeErr.sendClose { 904 return nil 905 } 906 907 // If this is a remote close we're done here 908 if closeErr.remote { 909 return nil 910 } 911 912 if quicErr.ErrorCode == qerr.DecryptionFailure || 913 quicErr == handshake.ErrNSTPExperiment { 914 return s.sendPublicReset(s.lastRcvdPacketNumber) 915 } 916 return s.sendConnectionClose(quicErr) 917 } 918 919 func (s *session) processTransportParameters(params *handshake.TransportParameters) { 920 s.peerParams = params 921 s.streamsMap.UpdateLimits(params) 922 s.packer.HandleTransportParameters(params) 923 s.connFlowController.UpdateSendWindow(params.ConnectionFlowControlWindow) 924 // the crypto stream is the only open stream at this moment 925 // so we don't need to update stream flow control windows 926 } 927 928 func (s *session) sendPackets() error { 929 s.pacingDeadline = time.Time{} 930 931 sendMode := s.sentPacketHandler.SendMode() 932 if sendMode == ackhandler.SendNone { // shortcut: return immediately if there's nothing to send 933 return nil 934 } 935 936 numPackets := s.sentPacketHandler.ShouldSendNumPackets() 937 var numPacketsSent int 938 sendLoop: 939 for { 940 switch sendMode { 941 case ackhandler.SendNone: 942 break sendLoop 943 case ackhandler.SendAck: 944 // If we already sent packets, and the send mode switches to SendAck, 945 // we've just become congestion limited. 946 // There's no need to try to send an ACK at this moment. 947 if numPacketsSent > 0 { 948 return nil 949 } 950 // We can at most send a single ACK only packet. 951 // There will only be a new ACK after receiving new packets. 952 // SendAck is only returned when we're congestion limited, so we don't need to set the pacingt timer. 953 return s.maybeSendAckOnlyPacket() 954 case ackhandler.SendTLP, ackhandler.SendRTO: 955 if err := s.sendProbePacket(); err != nil { 956 return err 957 } 958 numPacketsSent++ 959 case ackhandler.SendRetransmission: 960 sentPacket, err := s.maybeSendRetransmission() 961 if err != nil { 962 return err 963 } 964 if sentPacket { 965 numPacketsSent++ 966 // This can happen if a retransmission queued, but it wasn't necessary to send it. 967 // e.g. when an Initial is queued, but we already received a packet from the server. 968 } 969 case ackhandler.SendAny: 970 sentPacket, err := s.sendPacket() 971 if err != nil { 972 return err 973 } 974 if !sentPacket { 975 break sendLoop 976 } 977 numPacketsSent++ 978 default: 979 return fmt.Errorf("BUG: invalid send mode %d", sendMode) 980 } 981 if numPacketsSent >= numPackets { 982 break 983 } 984 sendMode = s.sentPacketHandler.SendMode() 985 } 986 // Only start the pacing timer if we sent as many packets as we were allowed. 987 // There will probably be more to send when calling sendPacket again. 988 if numPacketsSent == numPackets { 989 s.pacingDeadline = s.sentPacketHandler.TimeUntilSend() 990 } 991 return nil 992 } 993 994 func (s *session) maybeSendAckOnlyPacket() error { 995 packet, err := s.packer.MaybePackAckPacket() 996 if err != nil { 997 return err 998 } 999 if packet == nil { 1000 return nil 1001 } 1002 s.sentPacketHandler.SentPacket(packet.ToAckHandlerPacket()) 1003 return s.sendPackedPacket(packet) 1004 } 1005 1006 // maybeSendRetransmission sends retransmissions for at most one packet. 1007 // It takes care that Initials aren't retransmitted, if a packet from the server was already received. 1008 func (s *session) maybeSendRetransmission() (bool, error) { 1009 var retransmitPacket *ackhandler.Packet 1010 for { 1011 retransmitPacket = s.sentPacketHandler.DequeuePacketForRetransmission() 1012 if retransmitPacket == nil { 1013 return false, nil 1014 } 1015 1016 // Don't retransmit Initial packets if we already received a response. 1017 // An Initial might have been retransmitted multiple times before we receive a response. 1018 // As soon as we receive one response, we don't need to send any more Initials. 1019 if s.receivedFirstPacket && retransmitPacket.PacketType == protocol.PacketTypeInitial { 1020 s.logger.Debugf("Skipping retransmission of packet %d. Already received a response to an Initial.", retransmitPacket.PacketNumber) 1021 continue 1022 } 1023 break 1024 } 1025 1026 if retransmitPacket.EncryptionLevel != protocol.EncryptionForwardSecure { 1027 s.logger.Debugf("Dequeueing handshake retransmission for packet 0x%x", retransmitPacket.PacketNumber) 1028 } else { 1029 s.logger.Debugf("Dequeueing retransmission for packet 0x%x", retransmitPacket.PacketNumber) 1030 } 1031 1032 packets, err := s.packer.PackRetransmission(retransmitPacket) 1033 if err != nil { 1034 return false, err 1035 } 1036 ackhandlerPackets := make([]*ackhandler.Packet, len(packets)) 1037 for i, packet := range packets { 1038 ackhandlerPackets[i] = packet.ToAckHandlerPacket() 1039 } 1040 s.sentPacketHandler.SentPacketsAsRetransmission(ackhandlerPackets, retransmitPacket.PacketNumber) 1041 for _, packet := range packets { 1042 if err := s.sendPackedPacket(packet); err != nil { 1043 return false, err 1044 } 1045 } 1046 return true, nil 1047 } 1048 1049 func (s *session) sendProbePacket() error { 1050 p, err := s.sentPacketHandler.DequeueProbePacket() 1051 if err != nil { 1052 return err 1053 } 1054 s.logger.Debugf("Sending a retransmission for %#x as a probe packet.", p.PacketNumber) 1055 1056 packets, err := s.packer.PackRetransmission(p) 1057 if err != nil { 1058 return err 1059 } 1060 ackhandlerPackets := make([]*ackhandler.Packet, len(packets)) 1061 for i, packet := range packets { 1062 ackhandlerPackets[i] = packet.ToAckHandlerPacket() 1063 } 1064 s.sentPacketHandler.SentPacketsAsRetransmission(ackhandlerPackets, p.PacketNumber) 1065 for _, packet := range packets { 1066 if err := s.sendPackedPacket(packet); err != nil { 1067 return err 1068 } 1069 } 1070 return nil 1071 } 1072 1073 func (s *session) sendPacket() (bool, error) { 1074 if isBlocked, offset := s.connFlowController.IsNewlyBlocked(); isBlocked { 1075 s.framer.QueueControlFrame(&wire.BlockedFrame{Offset: offset}) 1076 } 1077 s.windowUpdateQueue.QueueAll() 1078 1079 packet, err := s.packer.PackPacket() 1080 if err != nil || packet == nil { 1081 return false, err 1082 } 1083 s.sentPacketHandler.SentPacket(packet.ToAckHandlerPacket()) 1084 if err := s.sendPackedPacket(packet); err != nil { 1085 return false, err 1086 } 1087 return true, nil 1088 } 1089 1090 func (s *session) sendPackedPacket(packet *packedPacket) error { 1091 defer putPacketBuffer(&packet.raw) 1092 s.logPacket(packet) 1093 return s.conn.Write(packet.raw) 1094 } 1095 1096 func (s *session) sendConnectionClose(quicErr *qerr.QuicError) error { 1097 packet, err := s.packer.PackConnectionClose(&wire.ConnectionCloseFrame{ 1098 ErrorCode: quicErr.ErrorCode, 1099 ReasonPhrase: quicErr.ErrorMessage, 1100 }) 1101 if err != nil { 1102 return err 1103 } 1104 s.logPacket(packet) 1105 return s.conn.Write(packet.raw) 1106 } 1107 1108 func (s *session) logPacket(packet *packedPacket) { 1109 if !s.logger.Debug() { 1110 // We don't need to allocate the slices for calling the format functions 1111 return 1112 } 1113 s.logger.Debugf("-> Sending packet 0x%x (%d bytes) for connection %s, %s", packet.header.PacketNumber, len(packet.raw), s.srcConnID, packet.encryptionLevel) 1114 packet.header.Log(s.logger) 1115 for _, frame := range packet.frames { 1116 wire.LogFrame(s.logger, frame, true) 1117 } 1118 } 1119 1120 // GetOrOpenStream either returns an existing stream, a newly opened stream, or nil if a stream with the provided ID is already closed. 1121 // It is *only* needed for gQUIC's H2. 1122 // It will be removed as soon as gQUIC moves towards the IETF H2/QUIC stream mapping. 1123 func (s *session) GetOrOpenStream(id protocol.StreamID) (Stream, error) { 1124 str, err := s.streamsMap.GetOrOpenSendStream(id) 1125 if str != nil { 1126 if bstr, ok := str.(Stream); ok { 1127 return bstr, err 1128 } 1129 return nil, fmt.Errorf("Stream %d is not a bidirectional stream", id) 1130 } 1131 // make sure to return an actual nil value here, not an Stream with value nil 1132 return nil, err 1133 } 1134 1135 // AcceptStream returns the next stream openend by the peer 1136 func (s *session) AcceptStream() (Stream, error) { 1137 return s.streamsMap.AcceptStream() 1138 } 1139 1140 func (s *session) AcceptUniStream() (ReceiveStream, error) { 1141 return s.streamsMap.AcceptUniStream() 1142 } 1143 1144 // OpenStream opens a stream 1145 func (s *session) OpenStream() (Stream, error) { 1146 return s.streamsMap.OpenStream() 1147 } 1148 1149 func (s *session) OpenStreamSync() (Stream, error) { 1150 return s.streamsMap.OpenStreamSync() 1151 } 1152 1153 func (s *session) OpenUniStream() (SendStream, error) { 1154 return s.streamsMap.OpenUniStream() 1155 } 1156 1157 func (s *session) OpenUniStreamSync() (SendStream, error) { 1158 return s.streamsMap.OpenUniStreamSync() 1159 } 1160 1161 func (s *session) newStream(id protocol.StreamID) streamI { 1162 flowController := s.newFlowController(id) 1163 return newStream(id, s, flowController, s.version) 1164 } 1165 1166 func (s *session) newFlowController(id protocol.StreamID) flowcontrol.StreamFlowController { 1167 var initialSendWindow protocol.ByteCount 1168 if s.peerParams != nil { 1169 initialSendWindow = s.peerParams.StreamFlowControlWindow 1170 } 1171 return flowcontrol.NewStreamFlowController( 1172 id, 1173 s.version.StreamContributesToConnectionFlowControl(id), 1174 s.connFlowController, 1175 protocol.ReceiveStreamFlowControlWindow, 1176 protocol.ByteCount(s.config.MaxReceiveStreamFlowControlWindow), 1177 initialSendWindow, 1178 s.onHasStreamWindowUpdate, 1179 s.rttStats, 1180 s.logger, 1181 ) 1182 } 1183 1184 func (s *session) newCryptoStream() cryptoStream { 1185 id := s.version.CryptoStreamID() 1186 flowController := flowcontrol.NewStreamFlowController( 1187 id, 1188 s.version.StreamContributesToConnectionFlowControl(id), 1189 s.connFlowController, 1190 protocol.ReceiveStreamFlowControlWindow, 1191 protocol.ByteCount(s.config.MaxReceiveStreamFlowControlWindow), 1192 0, 1193 s.onHasStreamWindowUpdate, 1194 s.rttStats, 1195 s.logger, 1196 ) 1197 return newCryptoStream(s, flowController, s.version) 1198 } 1199 1200 func (s *session) sendPublicReset(rejectedPacketNumber protocol.PacketNumber) error { 1201 s.logger.Infof("Sending PUBLIC_RESET for connection %s, packet number %d", s.destConnID, rejectedPacketNumber) 1202 return s.conn.Write(wire.WritePublicReset(s.destConnID, rejectedPacketNumber, 0)) 1203 } 1204 1205 // scheduleSending signals that we have data for sending 1206 func (s *session) scheduleSending() { 1207 select { 1208 case s.sendingScheduled <- struct{}{}: 1209 default: 1210 } 1211 } 1212 1213 func (s *session) tryQueueingUndecryptablePacket(p *receivedPacket) { 1214 if s.handshakeComplete { 1215 s.logger.Debugf("Received undecryptable packet from %s after the handshake: %#v, %d bytes data", p.remoteAddr.String(), p.header, len(p.data)) 1216 return 1217 } 1218 if len(s.undecryptablePackets)+1 > protocol.MaxUndecryptablePackets { 1219 // if this is the first time the undecryptablePackets runs full, start the timer to send a Public Reset 1220 if s.receivedTooManyUndecrytablePacketsTime.IsZero() { 1221 s.receivedTooManyUndecrytablePacketsTime = time.Now() 1222 s.maybeResetTimer() 1223 } 1224 s.logger.Infof("Dropping undecrytable packet 0x%x (undecryptable packet queue full)", p.header.PacketNumber) 1225 return 1226 } 1227 s.logger.Infof("Queueing packet 0x%x for later decryption", p.header.PacketNumber) 1228 s.undecryptablePackets = append(s.undecryptablePackets, p) 1229 } 1230 1231 func (s *session) tryDecryptingQueuedPackets() { 1232 for _, p := range s.undecryptablePackets { 1233 s.handlePacket(p) 1234 } 1235 s.undecryptablePackets = s.undecryptablePackets[:0] 1236 } 1237 1238 func (s *session) queueControlFrame(f wire.Frame) { 1239 s.framer.QueueControlFrame(f) 1240 s.scheduleSending() 1241 } 1242 1243 func (s *session) onHasStreamWindowUpdate(id protocol.StreamID) { 1244 s.windowUpdateQueue.AddStream(id) 1245 s.scheduleSending() 1246 } 1247 1248 func (s *session) onHasConnectionWindowUpdate() { 1249 s.windowUpdateQueue.AddConnection() 1250 s.scheduleSending() 1251 } 1252 1253 func (s *session) onHasStreamData(id protocol.StreamID) { 1254 if id != s.version.CryptoStreamID() { 1255 s.framer.AddActiveStream(id) 1256 } 1257 s.scheduleSending() 1258 } 1259 1260 func (s *session) onStreamCompleted(id protocol.StreamID) { 1261 if err := s.streamsMap.DeleteStream(id); err != nil { 1262 s.closeLocal(err) 1263 } 1264 } 1265 1266 func (s *session) LocalAddr() net.Addr { 1267 return s.conn.LocalAddr() 1268 } 1269 1270 func (s *session) RemoteAddr() net.Addr { 1271 return s.conn.RemoteAddr() 1272 } 1273 1274 func (s *session) GetVersion() protocol.VersionNumber { 1275 return s.version 1276 }