server_session.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. package quic
  2. import (
  3. "fmt"
  4. "github.com/lucas-clemente/quic-go/internal/protocol"
  5. "github.com/lucas-clemente/quic-go/internal/utils"
  6. )
  7. type serverSession struct {
  8. quicSession
  9. config *Config
  10. logger utils.Logger
  11. }
  12. var _ packetHandler = &serverSession{}
  13. func newServerSession(sess quicSession, config *Config, logger utils.Logger) packetHandler {
  14. return &serverSession{
  15. quicSession: sess,
  16. config: config,
  17. logger: logger,
  18. }
  19. }
  20. func (s *serverSession) handlePacket(p *receivedPacket) {
  21. if err := s.handlePacketImpl(p); err != nil {
  22. s.logger.Debugf("error handling packet from %s: %s", p.remoteAddr, err)
  23. }
  24. }
  25. func (s *serverSession) handlePacketImpl(p *receivedPacket) error {
  26. hdr := p.header
  27. // ignore all Public Reset packets
  28. if hdr.ResetFlag {
  29. return fmt.Errorf("Received unexpected Public Reset for connection %s", hdr.DestConnectionID)
  30. }
  31. // Probably an old packet that was sent by the client before the version was negotiated.
  32. // It is safe to drop it.
  33. if (hdr.VersionFlag || hdr.IsLongHeader) && hdr.Version != s.quicSession.GetVersion() {
  34. return nil
  35. }
  36. if hdr.IsLongHeader {
  37. switch hdr.Type {
  38. case protocol.PacketTypeHandshake, protocol.PacketType0RTT: // 0-RTT accepted for gQUIC 44
  39. // nothing to do here. Packet will be passed to the session.
  40. case protocol.PacketTypeInitial:
  41. if hdr.Version == protocol.Version44 {
  42. break
  43. }
  44. fallthrough
  45. default:
  46. // Note that this also drops 0-RTT packets.
  47. return fmt.Errorf("Received unsupported packet type: %s", hdr.Type)
  48. }
  49. }
  50. s.quicSession.handlePacket(p)
  51. return nil
  52. }
  53. func (s *serverSession) GetPerspective() protocol.Perspective {
  54. return protocol.PerspectiveServer
  55. }