server_session.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  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. default:
  41. // Note that this also drops 0-RTT packets.
  42. return fmt.Errorf("Received unsupported packet type: %s", hdr.Type)
  43. }
  44. }
  45. s.quicSession.handlePacket(p)
  46. return nil
  47. }
  48. func (s *serverSession) GetPerspective() protocol.Perspective {
  49. return protocol.PerspectiveServer
  50. }