forked from quic-go/quic-go
handle PATH_CHALLENGE frames, reject PATH_RESPONSE frames
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user