diff --git a/session.go b/session.go index 11b5d54cd..571c141b0 100644 --- a/session.go +++ b/session.go @@ -662,6 +662,11 @@ func (s *session) handleFrames(fs []wire.Frame, encLevel protocol.EncryptionLeve case *wire.StopSendingFrame: err = s.handleStopSendingFrame(frame) case *wire.PingFrame: + case *wire.PathChallengeFrame: + s.handlePathChallengeFrame(frame) + case *wire.PathResponseFrame: + // since we don't send PATH_CHALLENGEs, we don't expect PATH_RESPONSEs + err = errors.New("unexpected PATH_RESPONSE frame") default: return errors.New("Session BUG: unexpected frame type") } @@ -760,6 +765,10 @@ func (s *session) handleStopSendingFrame(frame *wire.StopSendingFrame) error { return nil } +func (s *session) handlePathChallengeFrame(frame *wire.PathChallengeFrame) { + s.queueControlFrame(&wire.PathResponseFrame{Data: frame.Data}) +} + func (s *session) handleAckFrame(frame *wire.AckFrame, encLevel protocol.EncryptionLevel) error { if err := s.sentPacketHandler.ReceivedAck(frame, s.lastRcvdPacketNumber, encLevel, s.lastNetworkActivityTime); err != nil { return err diff --git a/session_test.go b/session_test.go index 6e66e2d2c..109935f86 100644 --- a/session_test.go +++ b/session_test.go @@ -430,6 +430,19 @@ var _ = Describe("Session", func() { Expect(err).NotTo(HaveOccurred()) }) + It("rejects PATH_RESPONSE frames", func() { + err := sess.handleFrames([]wire.Frame{&wire.PathResponseFrame{Data: [8]byte{1, 2, 3, 4, 5, 6, 7, 8}}}, protocol.EncryptionUnspecified) + Expect(err).To(MatchError("unexpected PATH_RESPONSE frame")) + }) + + It("handles PATH_CHALLENGE frames", func() { + err := sess.handleFrames([]wire.Frame{&wire.PathChallengeFrame{Data: [8]byte{1, 2, 3, 4, 5, 6, 7, 8}}}, protocol.EncryptionUnspecified) + Expect(err).ToNot(HaveOccurred()) + Expect(sess.packer.controlFrames).To(HaveLen(1)) + Expect(sess.packer.controlFrames[0]).To(BeAssignableToTypeOf(&wire.PathResponseFrame{})) + Expect(sess.packer.controlFrames[0].(*wire.PathResponseFrame).Data).To(Equal([8]byte{1, 2, 3, 4, 5, 6, 7, 8})) + }) + It("handles BLOCKED frames", func() { err := sess.handleFrames([]wire.Frame{&wire.BlockedFrame{}}, protocol.EncryptionUnspecified) Expect(err).NotTo(HaveOccurred())