github.com/mikelsr/quic-go@v0.36.1-0.20230701132136-1d9415b66898/internal/ackhandler/sent_packet_handler_test.go (about) 1 package ackhandler 2 3 import ( 4 "fmt" 5 "time" 6 7 "github.com/golang/mock/gomock" 8 9 "github.com/mikelsr/quic-go/internal/mocks" 10 "github.com/mikelsr/quic-go/internal/protocol" 11 "github.com/mikelsr/quic-go/internal/qerr" 12 "github.com/mikelsr/quic-go/internal/utils" 13 "github.com/mikelsr/quic-go/internal/wire" 14 15 . "github.com/onsi/ginkgo/v2" 16 . "github.com/onsi/gomega" 17 ) 18 19 type customFrameHandler struct { 20 onLost, onAcked func(wire.Frame) 21 } 22 23 func (h *customFrameHandler) OnLost(f wire.Frame) { 24 if h.onLost != nil { 25 h.onLost(f) 26 } 27 } 28 29 func (h *customFrameHandler) OnAcked(f wire.Frame) { 30 if h.onAcked != nil { 31 h.onAcked(f) 32 } 33 } 34 35 var _ = Describe("SentPacketHandler", func() { 36 var ( 37 handler *sentPacketHandler 38 streamFrame wire.StreamFrame 39 lostPackets []protocol.PacketNumber 40 perspective protocol.Perspective 41 ) 42 43 BeforeEach(func() { perspective = protocol.PerspectiveServer }) 44 45 JustBeforeEach(func() { 46 lostPackets = nil 47 rttStats := utils.NewRTTStats() 48 handler = newSentPacketHandler(42, protocol.InitialPacketSizeIPv4, rttStats, false, perspective, nil, utils.DefaultLogger) 49 streamFrame = wire.StreamFrame{ 50 StreamID: 5, 51 Data: []byte{0x13, 0x37}, 52 } 53 }) 54 55 getPacket := func(pn protocol.PacketNumber, encLevel protocol.EncryptionLevel) *packet { 56 for _, p := range handler.getPacketNumberSpace(encLevel).history.packets { 57 if p != nil && p.PacketNumber == pn { 58 return p 59 } 60 } 61 return nil 62 } 63 64 ackElicitingPacket := func(p *packet) *packet { 65 if p.EncryptionLevel == 0 { 66 p.EncryptionLevel = protocol.Encryption1RTT 67 } 68 if p.Length == 0 { 69 p.Length = 1 70 } 71 if p.SendTime.IsZero() { 72 p.SendTime = time.Now() 73 } 74 if len(p.Frames) == 0 { 75 p.Frames = []Frame{ 76 {Frame: &wire.PingFrame{}, Handler: &customFrameHandler{ 77 onLost: func(wire.Frame) { lostPackets = append(lostPackets, p.PacketNumber) }, 78 }}, 79 } 80 } 81 return p 82 } 83 84 nonAckElicitingPacket := func(p *packet) *packet { 85 p = ackElicitingPacket(p) 86 p.Frames = nil 87 p.LargestAcked = 1 88 return p 89 } 90 91 initialPacket := func(p *packet) *packet { 92 p = ackElicitingPacket(p) 93 p.EncryptionLevel = protocol.EncryptionInitial 94 return p 95 } 96 97 handshakePacket := func(p *packet) *packet { 98 p = ackElicitingPacket(p) 99 p.EncryptionLevel = protocol.EncryptionHandshake 100 return p 101 } 102 103 handshakePacketNonAckEliciting := func(p *packet) *packet { 104 p = nonAckElicitingPacket(p) 105 p.EncryptionLevel = protocol.EncryptionHandshake 106 return p 107 } 108 109 sentPacket := func(p *packet) { 110 handler.SentPacket(p.SendTime, p.PacketNumber, p.LargestAcked, p.StreamFrames, p.Frames, p.EncryptionLevel, p.Length, p.IsPathMTUProbePacket) 111 } 112 113 expectInPacketHistory := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) { 114 pnSpace := handler.getPacketNumberSpace(encLevel) 115 var length int 116 pnSpace.history.Iterate(func(p *packet) (bool, error) { 117 if !p.declaredLost && !p.skippedPacket { 118 length++ 119 } 120 return true, nil 121 }) 122 ExpectWithOffset(1, length).To(Equal(len(expected))) 123 for _, p := range expected { 124 ExpectWithOffset(2, getPacket(p, encLevel)).ToNot(BeNil()) 125 } 126 } 127 128 updateRTT := func(rtt time.Duration) { 129 handler.rttStats.UpdateRTT(rtt, 0, time.Now()) 130 ExpectWithOffset(1, handler.rttStats.SmoothedRTT()).To(Equal(rtt)) 131 } 132 133 Context("registering sent packets", func() { 134 It("accepts two consecutive packets", func() { 135 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.EncryptionHandshake})) 136 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, EncryptionLevel: protocol.EncryptionHandshake})) 137 Expect(handler.handshakePackets.largestSent).To(Equal(protocol.PacketNumber(2))) 138 expectInPacketHistory([]protocol.PacketNumber{1, 2}, protocol.EncryptionHandshake) 139 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2))) 140 }) 141 142 It("uses the same packet number space for 0-RTT and 1-RTT packets", func() { 143 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption0RTT})) 144 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, EncryptionLevel: protocol.Encryption1RTT})) 145 Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(2))) 146 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2))) 147 }) 148 149 It("accepts packet number 0", func() { 150 sentPacket(ackElicitingPacket(&packet{PacketNumber: 0, EncryptionLevel: protocol.Encryption1RTT})) 151 Expect(handler.appDataPackets.largestSent).To(BeZero()) 152 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, EncryptionLevel: protocol.Encryption1RTT})) 153 Expect(handler.appDataPackets.largestSent).To(Equal(protocol.PacketNumber(1))) 154 expectInPacketHistory([]protocol.PacketNumber{0, 1}, protocol.Encryption1RTT) 155 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(2))) 156 }) 157 158 It("stores the sent time", func() { 159 sendTime := time.Now().Add(-time.Minute) 160 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime})) 161 Expect(handler.appDataPackets.lastAckElicitingPacketTime).To(Equal(sendTime)) 162 }) 163 164 It("stores the sent time of Initial packets", func() { 165 sendTime := time.Now().Add(-time.Minute) 166 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime, EncryptionLevel: protocol.EncryptionInitial})) 167 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: sendTime.Add(time.Hour), EncryptionLevel: protocol.Encryption1RTT})) 168 Expect(handler.initialPackets.lastAckElicitingPacketTime).To(Equal(sendTime)) 169 }) 170 }) 171 172 Context("ACK processing", func() { 173 JustBeforeEach(func() { 174 for i := protocol.PacketNumber(0); i < 10; i++ { 175 sentPacket(ackElicitingPacket(&packet{PacketNumber: i})) 176 } 177 // Increase RTT, because the tests would be flaky otherwise 178 updateRTT(time.Hour) 179 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10))) 180 }) 181 182 Context("ACK processing", func() { 183 It("accepts ACKs sent in packet 0", func() { 184 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 5}}} 185 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 186 Expect(err).ToNot(HaveOccurred()) 187 Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(5))) 188 }) 189 190 It("says if a 1-RTT packet was acknowledged", func() { 191 sentPacket(ackElicitingPacket(&packet{PacketNumber: 10, EncryptionLevel: protocol.Encryption0RTT})) 192 sentPacket(ackElicitingPacket(&packet{PacketNumber: 11, EncryptionLevel: protocol.Encryption0RTT})) 193 sentPacket(ackElicitingPacket(&packet{PacketNumber: 12, EncryptionLevel: protocol.Encryption1RTT})) 194 acked1RTT, err := handler.ReceivedAck( 195 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}}, 196 protocol.Encryption1RTT, 197 time.Now(), 198 ) 199 Expect(err).ToNot(HaveOccurred()) 200 Expect(acked1RTT).To(BeFalse()) 201 acked1RTT, err = handler.ReceivedAck( 202 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 11, Largest: 12}}}, 203 protocol.Encryption1RTT, 204 time.Now(), 205 ) 206 Expect(err).ToNot(HaveOccurred()) 207 Expect(acked1RTT).To(BeTrue()) 208 }) 209 210 It("accepts multiple ACKs sent in the same packet", func() { 211 ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}} 212 ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 4}}} 213 _, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now()) 214 Expect(err).ToNot(HaveOccurred()) 215 Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(3))) 216 // this wouldn't happen in practice 217 // for testing purposes, we pretend to send a different ACK frame in a duplicated packet, to be able to verify that it actually doesn't get processed 218 _, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now()) 219 Expect(err).ToNot(HaveOccurred()) 220 Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(4))) 221 }) 222 223 It("rejects ACKs that acknowledge a skipped packet number", func() { 224 sentPacket(ackElicitingPacket(&packet{PacketNumber: 10})) 225 handler.appDataPackets.history.SkippedPacket(11) 226 sentPacket(ackElicitingPacket(&packet{PacketNumber: 12})) 227 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}}} 228 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 229 Expect(err).To(MatchError(&qerr.TransportError{ 230 ErrorCode: qerr.ProtocolViolation, 231 ErrorMessage: "received an ACK for skipped packet number: 11 (1-RTT)", 232 })) 233 }) 234 235 It("rejects ACKs with a too high LargestAcked packet number", func() { 236 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 9999}}} 237 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 238 Expect(err).To(MatchError(&qerr.TransportError{ 239 ErrorCode: qerr.ProtocolViolation, 240 ErrorMessage: "received ACK for an unsent packet", 241 })) 242 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10))) 243 }) 244 245 It("ignores repeated ACKs", func() { 246 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 3}}} 247 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 248 Expect(err).ToNot(HaveOccurred()) 249 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6))) 250 _, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 251 Expect(err).ToNot(HaveOccurred()) 252 Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(3))) 253 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6))) 254 }) 255 }) 256 257 Context("acks the right packets", func() { 258 expectInPacketHistoryOrLost := func(expected []protocol.PacketNumber, encLevel protocol.EncryptionLevel) { 259 pnSpace := handler.getPacketNumberSpace(encLevel) 260 var length int 261 pnSpace.history.Iterate(func(p *packet) (bool, error) { 262 if !p.declaredLost { 263 length++ 264 } 265 return true, nil 266 }) 267 ExpectWithOffset(1, length+len(lostPackets)).To(Equal(len(expected))) 268 expectedLoop: 269 for _, p := range expected { 270 if getPacket(p, encLevel) != nil { 271 continue 272 } 273 for _, lostP := range lostPackets { 274 if lostP == p { 275 continue expectedLoop 276 } 277 } 278 Fail(fmt.Sprintf("Packet %d not in packet history.", p)) 279 } 280 } 281 282 It("adjusts the LargestAcked, and adjusts the bytes in flight", func() { 283 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 5}}} 284 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 285 Expect(err).ToNot(HaveOccurred()) 286 Expect(handler.appDataPackets.largestAcked).To(Equal(protocol.PacketNumber(5))) 287 expectInPacketHistoryOrLost([]protocol.PacketNumber{6, 7, 8, 9}, protocol.Encryption1RTT) 288 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(4))) 289 }) 290 291 It("acks packet 0", func() { 292 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 0, Largest: 0}}} 293 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 294 Expect(err).ToNot(HaveOccurred()) 295 Expect(getPacket(0, protocol.Encryption1RTT)).To(BeNil()) 296 expectInPacketHistoryOrLost([]protocol.PacketNumber{1, 2, 3, 4, 5, 6, 7, 8, 9}, protocol.Encryption1RTT) 297 }) 298 299 It("calls the OnAcked callback", func() { 300 var acked bool 301 ping := &wire.PingFrame{} 302 sentPacket(ackElicitingPacket(&packet{ 303 PacketNumber: 10, 304 Frames: []Frame{{ 305 Frame: ping, 306 Handler: &customFrameHandler{ 307 onAcked: func(f wire.Frame) { 308 Expect(f).To(Equal(ping)) 309 acked = true 310 }, 311 }, 312 }}, 313 })) 314 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 10}}} 315 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 316 Expect(err).ToNot(HaveOccurred()) 317 Expect(acked).To(BeTrue()) 318 }) 319 320 It("handles an ACK frame with one missing packet range", func() { 321 ack := &wire.AckFrame{ // lose 4 and 5 322 AckRanges: []wire.AckRange{ 323 {Smallest: 6, Largest: 9}, 324 {Smallest: 1, Largest: 3}, 325 }, 326 } 327 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 328 Expect(err).ToNot(HaveOccurred()) 329 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 4, 5}, protocol.Encryption1RTT) 330 }) 331 332 It("does not ack packets below the LowestAcked", func() { 333 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 8}}} 334 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 335 Expect(err).ToNot(HaveOccurred()) 336 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 1, 2, 9}, protocol.Encryption1RTT) 337 }) 338 339 It("handles an ACK with multiple missing packet ranges", func() { 340 ack := &wire.AckFrame{ // packets 2, 4 and 5, and 8 were lost 341 AckRanges: []wire.AckRange{ 342 {Smallest: 9, Largest: 9}, 343 {Smallest: 6, Largest: 7}, 344 {Smallest: 3, Largest: 3}, 345 {Smallest: 1, Largest: 1}, 346 }, 347 } 348 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 349 Expect(err).ToNot(HaveOccurred()) 350 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 2, 4, 5, 8}, protocol.Encryption1RTT) 351 }) 352 353 It("processes an ACK frame that would be sent after a late arrival of a packet", func() { 354 ack1 := &wire.AckFrame{ // 5 lost 355 AckRanges: []wire.AckRange{ 356 {Smallest: 6, Largest: 6}, 357 {Smallest: 1, Largest: 4}, 358 }, 359 } 360 _, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now()) 361 Expect(err).ToNot(HaveOccurred()) 362 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 5, 7, 8, 9}, protocol.Encryption1RTT) 363 ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}} // now ack 5 364 _, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now()) 365 Expect(err).ToNot(HaveOccurred()) 366 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 7, 8, 9}, protocol.Encryption1RTT) 367 }) 368 369 It("processes an ACK that contains old ACK ranges", func() { 370 ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}} 371 _, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now()) 372 Expect(err).ToNot(HaveOccurred()) 373 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 7, 8, 9}, protocol.Encryption1RTT) 374 ack2 := &wire.AckFrame{ 375 AckRanges: []wire.AckRange{ 376 {Smallest: 8, Largest: 8}, 377 {Smallest: 3, Largest: 3}, 378 {Smallest: 1, Largest: 1}, 379 }, 380 } 381 _, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now()) 382 Expect(err).ToNot(HaveOccurred()) 383 expectInPacketHistoryOrLost([]protocol.PacketNumber{0, 7, 9}, protocol.Encryption1RTT) 384 }) 385 }) 386 387 Context("calculating RTT", func() { 388 It("computes the RTT", func() { 389 now := time.Now() 390 // First, fake the sent times of the first, second and last packet 391 getPacket(1, protocol.Encryption1RTT).SendTime = now.Add(-10 * time.Minute) 392 getPacket(2, protocol.Encryption1RTT).SendTime = now.Add(-5 * time.Minute) 393 getPacket(6, protocol.Encryption1RTT).SendTime = now.Add(-1 * time.Minute) 394 // Now, check that the proper times are used when calculating the deltas 395 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}} 396 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 397 Expect(err).ToNot(HaveOccurred()) 398 Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 10*time.Minute, 1*time.Second)) 399 ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}} 400 _, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 401 Expect(err).ToNot(HaveOccurred()) 402 Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 5*time.Minute, 1*time.Second)) 403 ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 6}}} 404 _, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 405 Expect(err).ToNot(HaveOccurred()) 406 Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 1*time.Minute, 1*time.Second)) 407 }) 408 409 It("ignores the DelayTime for Initial and Handshake packets", func() { 410 sentPacket(initialPacket(&packet{PacketNumber: 1})) 411 handler.rttStats.SetMaxAckDelay(time.Hour) 412 // make sure the rttStats have a min RTT, so that the delay is used 413 handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now()) 414 getPacket(1, protocol.EncryptionInitial).SendTime = time.Now().Add(-10 * time.Minute) 415 ack := &wire.AckFrame{ 416 AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}, 417 DelayTime: 5 * time.Minute, 418 } 419 _, err := handler.ReceivedAck(ack, protocol.EncryptionInitial, time.Now()) 420 Expect(err).ToNot(HaveOccurred()) 421 Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 10*time.Minute, 1*time.Second)) 422 }) 423 424 It("uses the DelayTime in the ACK frame", func() { 425 handler.rttStats.SetMaxAckDelay(time.Hour) 426 // make sure the rttStats have a min RTT, so that the delay is used 427 handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now()) 428 getPacket(1, protocol.Encryption1RTT).SendTime = time.Now().Add(-10 * time.Minute) 429 ack := &wire.AckFrame{ 430 AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}, 431 DelayTime: 5 * time.Minute, 432 } 433 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 434 Expect(err).ToNot(HaveOccurred()) 435 Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 5*time.Minute, 1*time.Second)) 436 }) 437 438 It("limits the DelayTime in the ACK frame to max_ack_delay", func() { 439 handler.rttStats.SetMaxAckDelay(time.Minute) 440 // make sure the rttStats have a min RTT, so that the delay is used 441 handler.rttStats.UpdateRTT(5*time.Minute, 0, time.Now()) 442 getPacket(1, protocol.Encryption1RTT).SendTime = time.Now().Add(-10 * time.Minute) 443 ack := &wire.AckFrame{ 444 AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}, 445 DelayTime: 5 * time.Minute, 446 } 447 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 448 Expect(err).ToNot(HaveOccurred()) 449 Expect(handler.rttStats.LatestRTT()).To(BeNumerically("~", 9*time.Minute, 1*time.Second)) 450 }) 451 }) 452 453 Context("determining which ACKs we have received an ACK for", func() { 454 JustBeforeEach(func() { 455 morePackets := []*packet{ 456 { 457 PacketNumber: 10, 458 LargestAcked: 100, 459 Frames: []Frame{{Frame: &streamFrame}}, 460 Length: 1, 461 EncryptionLevel: protocol.Encryption1RTT, 462 }, 463 { 464 PacketNumber: 11, 465 LargestAcked: 200, 466 Frames: []Frame{{Frame: &streamFrame}}, 467 Length: 1, 468 EncryptionLevel: protocol.Encryption1RTT, 469 }, 470 { 471 PacketNumber: 12, 472 Frames: []Frame{{Frame: &streamFrame}}, 473 Length: 1, 474 EncryptionLevel: protocol.Encryption1RTT, 475 }, 476 } 477 for _, packet := range morePackets { 478 sentPacket(packet) 479 } 480 }) 481 482 It("determines which ACK we have received an ACK for", func() { 483 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 12}}} 484 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 485 Expect(err).ToNot(HaveOccurred()) 486 Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201))) 487 }) 488 489 It("doesn't do anything when the acked packet didn't contain an ACK", func() { 490 ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 10}}} 491 ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 12, Largest: 12}}} 492 _, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now()) 493 Expect(err).ToNot(HaveOccurred()) 494 Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(101))) 495 _, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now()) 496 Expect(err).ToNot(HaveOccurred()) 497 Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(101))) 498 }) 499 500 It("doesn't decrease the value", func() { 501 ack1 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 11, Largest: 11}}} 502 ack2 := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 10}}} 503 _, err := handler.ReceivedAck(ack1, protocol.Encryption1RTT, time.Now()) 504 Expect(err).ToNot(HaveOccurred()) 505 Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201))) 506 _, err = handler.ReceivedAck(ack2, protocol.Encryption1RTT, time.Now()) 507 Expect(err).ToNot(HaveOccurred()) 508 Expect(handler.GetLowestPacketNotConfirmedAcked()).To(Equal(protocol.PacketNumber(201))) 509 }) 510 }) 511 }) 512 513 Context("congestion", func() { 514 var cong *mocks.MockSendAlgorithmWithDebugInfos 515 516 JustBeforeEach(func() { 517 cong = mocks.NewMockSendAlgorithmWithDebugInfos(mockCtrl) 518 handler.congestion = cong 519 }) 520 521 It("should call OnSent", func() { 522 cong.EXPECT().OnPacketSent( 523 gomock.Any(), 524 protocol.ByteCount(42), 525 protocol.PacketNumber(1), 526 protocol.ByteCount(42), 527 true, 528 ) 529 sentPacket(&packet{ 530 PacketNumber: 1, 531 Length: 42, 532 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 533 EncryptionLevel: protocol.Encryption1RTT, 534 }) 535 }) 536 537 It("should call MaybeExitSlowStart and OnPacketAcked", func() { 538 rcvTime := time.Now().Add(-5 * time.Second) 539 cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(3) 540 gomock.InOrder( 541 cong.EXPECT().MaybeExitSlowStart(), // must be called before packets are acked 542 cong.EXPECT().OnPacketAcked(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime), 543 cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(3), rcvTime), 544 ) 545 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1})) 546 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2})) 547 sentPacket(ackElicitingPacket(&packet{PacketNumber: 3})) 548 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}} 549 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, rcvTime) 550 Expect(err).ToNot(HaveOccurred()) 551 }) 552 553 It("doesn't call OnPacketAcked when a retransmitted packet is acked", func() { 554 cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2) 555 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)})) 556 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2})) 557 // lose packet 1 558 gomock.InOrder( 559 cong.EXPECT().MaybeExitSlowStart(), 560 cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(2)), 561 cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(2), gomock.Any()), 562 ) 563 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 564 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 565 Expect(err).ToNot(HaveOccurred()) 566 // don't EXPECT any further calls to the congestion controller 567 ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 2}}} 568 _, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 569 Expect(err).ToNot(HaveOccurred()) 570 }) 571 572 It("doesn't call OnPacketLost when a Path MTU probe packet is lost", func() { 573 cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(2) 574 var mtuPacketDeclaredLost bool 575 sentPacket(ackElicitingPacket(&packet{ 576 PacketNumber: 1, 577 SendTime: time.Now().Add(-time.Hour), 578 IsPathMTUProbePacket: true, 579 Frames: []Frame{ 580 { 581 Frame: &wire.PingFrame{}, 582 Handler: &customFrameHandler{onLost: func(wire.Frame) { mtuPacketDeclaredLost = true }}, 583 }, 584 }, 585 })) 586 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2})) 587 // lose packet 1, but don't EXPECT any calls to OnPacketLost() 588 gomock.InOrder( 589 cong.EXPECT().MaybeExitSlowStart(), 590 cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(2), gomock.Any()), 591 ) 592 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 593 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 594 Expect(err).ToNot(HaveOccurred()) 595 Expect(mtuPacketDeclaredLost).To(BeTrue()) 596 Expect(handler.bytesInFlight).To(BeZero()) 597 }) 598 599 It("calls OnPacketAcked and OnPacketLost with the right bytes_in_flight value", func() { 600 cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).Times(4) 601 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-time.Hour)})) 602 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: time.Now().Add(-30 * time.Minute)})) 603 sentPacket(ackElicitingPacket(&packet{PacketNumber: 3, SendTime: time.Now().Add(-30 * time.Minute)})) 604 sentPacket(ackElicitingPacket(&packet{PacketNumber: 4, SendTime: time.Now()})) 605 // receive the first ACK 606 gomock.InOrder( 607 cong.EXPECT().MaybeExitSlowStart(), 608 cong.EXPECT().OnPacketLost(protocol.PacketNumber(1), protocol.ByteCount(1), protocol.ByteCount(4)), 609 cong.EXPECT().OnPacketAcked(protocol.PacketNumber(2), protocol.ByteCount(1), protocol.ByteCount(4), gomock.Any()), 610 ) 611 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 612 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now().Add(-30*time.Minute)) 613 Expect(err).ToNot(HaveOccurred()) 614 // receive the second ACK 615 gomock.InOrder( 616 cong.EXPECT().MaybeExitSlowStart(), 617 cong.EXPECT().OnPacketLost(protocol.PacketNumber(3), protocol.ByteCount(1), protocol.ByteCount(2)), 618 cong.EXPECT().OnPacketAcked(protocol.PacketNumber(4), protocol.ByteCount(1), protocol.ByteCount(2), gomock.Any()), 619 ) 620 ack = &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 4, Largest: 4}}} 621 _, err = handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 622 Expect(err).ToNot(HaveOccurred()) 623 }) 624 625 It("passes the bytes in flight to the congestion controller", func() { 626 handler.ReceivedPacket(protocol.EncryptionHandshake) 627 cong.EXPECT().OnPacketSent(gomock.Any(), protocol.ByteCount(42), gomock.Any(), protocol.ByteCount(42), true) 628 sentPacket(&packet{ 629 Length: 42, 630 EncryptionLevel: protocol.EncryptionInitial, 631 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 632 SendTime: time.Now(), 633 }) 634 cong.EXPECT().CanSend(protocol.ByteCount(42)).Return(true) 635 cong.EXPECT().HasPacingBudget(gomock.Any()).Return(true) 636 handler.SendMode(time.Now()) 637 }) 638 639 It("allows sending of ACKs when congestion limited", func() { 640 handler.ReceivedPacket(protocol.EncryptionHandshake) 641 cong.EXPECT().CanSend(gomock.Any()).Return(true) 642 cong.EXPECT().HasPacingBudget(gomock.Any()).Return(true) 643 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 644 cong.EXPECT().CanSend(gomock.Any()).Return(false) 645 Expect(handler.SendMode(time.Now())).To(Equal(SendAck)) 646 }) 647 648 It("allows sending of ACKs when we're keeping track of MaxOutstandingSentPackets packets", func() { 649 handler.ReceivedPacket(protocol.EncryptionHandshake) 650 cong.EXPECT().CanSend(gomock.Any()).Return(true).AnyTimes() 651 cong.EXPECT().HasPacingBudget(gomock.Any()).Return(true).AnyTimes() 652 cong.EXPECT().OnPacketSent(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() 653 for i := protocol.PacketNumber(0); i < protocol.MaxOutstandingSentPackets; i++ { 654 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 655 sentPacket(ackElicitingPacket(&packet{PacketNumber: i})) 656 } 657 Expect(handler.SendMode(time.Now())).To(Equal(SendAck)) 658 }) 659 660 It("allows PTOs, even when congestion limited", func() { 661 handler.ReceivedPacket(protocol.EncryptionHandshake) 662 // note that we don't EXPECT a call to GetCongestionWindow 663 // that means retransmissions are sent without considering the congestion window 664 handler.numProbesToSend = 1 665 handler.ptoMode = SendPTOHandshake 666 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake)) 667 }) 668 669 It("returns the pacing delay", func() { 670 t := time.Now() 671 cong.EXPECT().TimeUntilSend(gomock.Any()).Return(t) 672 Expect(handler.TimeUntilSend()).To(Equal(t)) 673 }) 674 }) 675 676 It("doesn't set an alarm if there are no outstanding packets", func() { 677 handler.ReceivedPacket(protocol.EncryptionHandshake) 678 sentPacket(ackElicitingPacket(&packet{PacketNumber: 10})) 679 sentPacket(ackElicitingPacket(&packet{PacketNumber: 11})) 680 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 10, Largest: 11}}} 681 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 682 Expect(err).ToNot(HaveOccurred()) 683 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 684 }) 685 686 It("does nothing on OnAlarm if there are no outstanding packets", func() { 687 handler.ReceivedPacket(protocol.EncryptionHandshake) 688 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 689 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 690 }) 691 692 Context("probe packets", func() { 693 It("queues a probe packet", func() { 694 sentPacket(ackElicitingPacket(&packet{PacketNumber: 10})) 695 sentPacket(ackElicitingPacket(&packet{PacketNumber: 11})) 696 queued := handler.QueueProbePacket(protocol.Encryption1RTT) 697 Expect(queued).To(BeTrue()) 698 Expect(lostPackets).To(Equal([]protocol.PacketNumber{10})) 699 }) 700 701 It("says when it can't queue a probe packet", func() { 702 queued := handler.QueueProbePacket(protocol.Encryption1RTT) 703 Expect(queued).To(BeFalse()) 704 }) 705 706 It("implements exponential backoff", func() { 707 handler.peerAddressValidated = true 708 handler.SetHandshakeConfirmed() 709 sendTime := time.Now().Add(-time.Hour) 710 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: sendTime})) 711 timeout := handler.GetLossDetectionTimeout().Sub(sendTime) 712 Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(timeout)) 713 handler.ptoCount = 1 714 handler.setLossDetectionTimer() 715 Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(2 * timeout)) 716 handler.ptoCount = 2 717 handler.setLossDetectionTimer() 718 Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(4 * timeout)) 719 // truncated when the exponential gets too large 720 handler.ptoCount = 20 721 handler.setLossDetectionTimer() 722 Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(maxPTODuration)) 723 // protected from rollover 724 handler.ptoCount = 100 725 handler.setLossDetectionTimer() 726 Expect(handler.GetLossDetectionTimeout().Sub(sendTime)).To(Equal(maxPTODuration)) 727 }) 728 729 It("reset the PTO count when receiving an ACK", func() { 730 handler.ReceivedPacket(protocol.EncryptionHandshake) 731 now := time.Now() 732 handler.SetHandshakeConfirmed() 733 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)})) 734 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)})) 735 handler.appDataPackets.pns.(*skippingPacketNumberGenerator).next = 3 736 Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second)) 737 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 738 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 739 Expect(handler.ptoCount).To(BeEquivalentTo(1)) 740 _, err := handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, protocol.Encryption1RTT, time.Now()) 741 Expect(err).ToNot(HaveOccurred()) 742 Expect(handler.ptoCount).To(BeZero()) 743 }) 744 745 It("resets the PTO mode and PTO count when a packet number space is dropped", func() { 746 handler.ReceivedPacket(protocol.EncryptionHandshake) 747 748 now := time.Now() 749 handler.rttStats.UpdateRTT(time.Second/2, 0, now) 750 Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second / 2)) 751 Expect(handler.rttStats.PTO(true)).To(And( 752 BeNumerically(">", time.Second), 753 BeNumerically("<", 2*time.Second), 754 )) 755 sendTimeHandshake := now.Add(-2 * time.Minute) 756 sendTimeAppData := now.Add(-time.Minute) 757 758 sentPacket(ackElicitingPacket(&packet{ 759 PacketNumber: 1, 760 EncryptionLevel: protocol.EncryptionHandshake, 761 SendTime: sendTimeHandshake, 762 })) 763 sentPacket(ackElicitingPacket(&packet{ 764 PacketNumber: 2, 765 SendTime: sendTimeAppData, 766 })) 767 768 // PTO timer based on the Handshake packet 769 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 770 Expect(handler.ptoCount).To(BeEquivalentTo(1)) 771 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake)) 772 Expect(handler.GetLossDetectionTimeout()).To(Equal(sendTimeHandshake.Add(handler.rttStats.PTO(false) << 1))) 773 handler.SetHandshakeConfirmed() 774 handler.DropPackets(protocol.EncryptionHandshake) 775 // PTO timer based on the 1-RTT packet 776 Expect(handler.GetLossDetectionTimeout()).To(Equal(sendTimeAppData.Add(handler.rttStats.PTO(true)))) // no backoff. PTO count = 0 777 Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOHandshake)) 778 Expect(handler.ptoCount).To(BeZero()) 779 }) 780 781 It("allows two 1-RTT PTOs", func() { 782 handler.ReceivedPacket(protocol.EncryptionHandshake) 783 handler.SetHandshakeConfirmed() 784 var lostPackets []protocol.PacketNumber 785 sentPacket(ackElicitingPacket(&packet{ 786 PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT), 787 SendTime: time.Now().Add(-time.Hour), 788 Frames: []Frame{ 789 { 790 Frame: &wire.PingFrame{}, 791 Handler: &customFrameHandler{onLost: func(wire.Frame) { lostPackets = append(lostPackets, 1) }}, 792 }, 793 }, 794 })) 795 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 796 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 797 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 798 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 799 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 800 Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData)) 801 }) 802 803 It("only counts ack-eliciting packets as probe packets", func() { 804 handler.ReceivedPacket(protocol.EncryptionHandshake) 805 handler.SetHandshakeConfirmed() 806 sentPacket(ackElicitingPacket(&packet{ 807 PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT), 808 SendTime: time.Now().Add(-time.Hour), 809 })) 810 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 811 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 812 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 813 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 814 for i := 0; i < 30; i++ { 815 sentPacket(nonAckElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 816 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 817 } 818 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 819 Expect(handler.SendMode(time.Now())).ToNot(Equal(SendPTOAppData)) 820 }) 821 822 It("gets two probe packets if PTO expires", func() { 823 handler.ReceivedPacket(protocol.EncryptionHandshake) 824 handler.SetHandshakeConfirmed() 825 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 826 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 827 828 updateRTT(time.Hour) 829 Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue()) 830 831 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // TLP 832 Expect(handler.ptoCount).To(BeEquivalentTo(1)) 833 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 834 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 835 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 836 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 837 838 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) // PTO 839 Expect(handler.ptoCount).To(BeEquivalentTo(2)) 840 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 841 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 842 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 843 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 844 845 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 846 }) 847 848 It("gets two probe packets if PTO expires, for Handshake packets", func() { 849 handler.ReceivedPacket(protocol.EncryptionHandshake) 850 sentPacket(initialPacket(&packet{PacketNumber: 1})) 851 sentPacket(initialPacket(&packet{PacketNumber: 2})) 852 853 updateRTT(time.Hour) 854 Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue()) 855 856 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 857 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial)) 858 sentPacket(initialPacket(&packet{PacketNumber: 3})) 859 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial)) 860 sentPacket(initialPacket(&packet{PacketNumber: 4})) 861 862 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 863 }) 864 865 It("doesn't send 1-RTT probe packets before the handshake completes", func() { 866 handler.ReceivedPacket(protocol.EncryptionHandshake) 867 sentPacket(ackElicitingPacket(&packet{PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT)})) 868 updateRTT(time.Hour) 869 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 870 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 871 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 872 handler.SetHandshakeConfirmed() 873 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 874 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 875 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 876 }) 877 878 It("resets the send mode when it receives an acknowledgement after queueing probe packets", func() { 879 handler.ReceivedPacket(protocol.EncryptionHandshake) 880 handler.SetHandshakeConfirmed() 881 pn := handler.PopPacketNumber(protocol.Encryption1RTT) 882 sentPacket(ackElicitingPacket(&packet{PacketNumber: pn, SendTime: time.Now().Add(-time.Hour)})) 883 updateRTT(time.Second) 884 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 885 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOAppData)) 886 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: pn, Largest: pn}}} 887 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, time.Now()) 888 Expect(err).ToNot(HaveOccurred()) 889 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 890 }) 891 892 It("handles ACKs for the original packet", func() { 893 handler.ReceivedPacket(protocol.EncryptionHandshake) 894 sentPacket(ackElicitingPacket(&packet{ 895 PacketNumber: handler.PopPacketNumber(protocol.Encryption1RTT), 896 SendTime: time.Now().Add(-time.Hour), 897 })) 898 updateRTT(time.Second) 899 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 900 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 901 }) 902 903 It("doesn't set the PTO timer for Path MTU probe packets", func() { 904 handler.ReceivedPacket(protocol.EncryptionHandshake) 905 handler.SetHandshakeConfirmed() 906 updateRTT(time.Second) 907 sentPacket(ackElicitingPacket(&packet{PacketNumber: 5, SendTime: time.Now(), IsPathMTUProbePacket: true})) 908 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 909 }) 910 }) 911 912 Context("amplification limit, for the server", func() { 913 It("limits the window to 3x the bytes received, to avoid amplification attacks", func() { 914 now := time.Now() 915 handler.ReceivedPacket(protocol.EncryptionInitial) // receiving an Initial packet doesn't validate the client's address 916 handler.ReceivedBytes(200) 917 sentPacket(&packet{ 918 PacketNumber: 1, 919 Length: 599, 920 EncryptionLevel: protocol.EncryptionInitial, 921 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 922 SendTime: now, 923 }) 924 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 925 sentPacket(&packet{ 926 PacketNumber: 2, 927 Length: 1, 928 EncryptionLevel: protocol.EncryptionInitial, 929 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 930 SendTime: now, 931 }) 932 Expect(handler.SendMode(time.Now())).To(Equal(SendNone)) 933 }) 934 935 It("cancels the loss detection timer when it is amplification limited, and resets it when becoming unblocked", func() { 936 handler.ReceivedBytes(300) 937 sentPacket(&packet{ 938 PacketNumber: 1, 939 Length: 900, 940 EncryptionLevel: protocol.EncryptionInitial, 941 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 942 SendTime: time.Now(), 943 }) 944 // Amplification limited. We don't need to set a timer now. 945 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 946 // Unblock the server. Now we should fire up the timer. 947 handler.ReceivedBytes(1) 948 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 949 }) 950 951 It("resets the loss detection timer when the client's address is validated", func() { 952 handler.ReceivedBytes(300) 953 sentPacket(&packet{ 954 PacketNumber: 1, 955 Length: 900, 956 EncryptionLevel: protocol.EncryptionHandshake, 957 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 958 SendTime: time.Now(), 959 }) 960 // Amplification limited. We don't need to set a timer now. 961 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 962 handler.ReceivedPacket(protocol.EncryptionHandshake) 963 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 964 }) 965 966 It("cancels the loss detection alarm when all Handshake packets are acknowledged", func() { 967 t := time.Now().Add(-time.Second) 968 handler.ReceivedBytes(99999) 969 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: t})) 970 sentPacket(handshakePacket(&packet{PacketNumber: 3, SendTime: t})) 971 sentPacket(handshakePacket(&packet{PacketNumber: 4, SendTime: t})) 972 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 973 handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 3, Largest: 4}}}, protocol.EncryptionHandshake, time.Now()) 974 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 975 }) 976 }) 977 978 Context("amplification limit, for the server, with validated address", func() { 979 JustBeforeEach(func() { 980 rttStats := utils.NewRTTStats() 981 handler = newSentPacketHandler(42, protocol.InitialPacketSizeIPv4, rttStats, true, perspective, nil, utils.DefaultLogger) 982 }) 983 984 It("do not limits the window", func() { 985 handler.ReceivedBytes(0) 986 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 987 sentPacket(&packet{ 988 PacketNumber: 1, 989 Length: 900, 990 EncryptionLevel: protocol.EncryptionInitial, 991 Frames: []Frame{{Frame: &wire.PingFrame{}}}, 992 SendTime: time.Now(), 993 }) 994 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 995 }) 996 }) 997 998 Context("amplification limit, for the client", func() { 999 BeforeEach(func() { 1000 perspective = protocol.PerspectiveClient 1001 }) 1002 1003 It("sends an Initial packet to unblock the server", func() { 1004 sentPacket(initialPacket(&packet{PacketNumber: 1})) 1005 _, err := handler.ReceivedAck( 1006 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, 1007 protocol.EncryptionInitial, 1008 time.Now(), 1009 ) 1010 Expect(err).ToNot(HaveOccurred()) 1011 // No packets are outstanding at this point. 1012 // Make sure that a probe packet is sent. 1013 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 1014 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1015 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial)) 1016 1017 // send a single packet to unblock the server 1018 sentPacket(initialPacket(&packet{PacketNumber: 2})) 1019 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1020 1021 // Now receive an ACK for a Handshake packet. 1022 // This tells the client that the server completed address validation. 1023 sentPacket(handshakePacket(&packet{PacketNumber: 1})) 1024 _, err = handler.ReceivedAck( 1025 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, 1026 protocol.EncryptionHandshake, 1027 time.Now(), 1028 ) 1029 Expect(err).ToNot(HaveOccurred()) 1030 // Make sure that no timer is set at this point. 1031 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 1032 }) 1033 1034 It("sends a Handshake packet to unblock the server, if Initial keys were already dropped", func() { 1035 sentPacket(initialPacket(&packet{PacketNumber: 1})) 1036 _, err := handler.ReceivedAck( 1037 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, 1038 protocol.EncryptionInitial, 1039 time.Now(), 1040 ) 1041 Expect(err).ToNot(HaveOccurred()) 1042 1043 sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 1})) // also drops Initial packets 1044 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 1045 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1046 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake)) 1047 1048 // Now receive an ACK for this packet, and send another one. 1049 _, err = handler.ReceivedAck( 1050 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, 1051 protocol.EncryptionHandshake, 1052 time.Now(), 1053 ) 1054 Expect(err).ToNot(HaveOccurred()) 1055 sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 2})) 1056 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 1057 }) 1058 1059 It("doesn't send a packet to unblock the server after handshake confirmation, even if no Handshake ACK was received", func() { 1060 sentPacket(handshakePacket(&packet{PacketNumber: 1})) 1061 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 1062 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1063 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake)) 1064 // confirm the handshake 1065 handler.DropPackets(protocol.EncryptionHandshake) 1066 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 1067 }) 1068 1069 It("correctly sets the timer after the Initial packet number space has been dropped", func() { 1070 sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: time.Now().Add(-19 * time.Second)})) 1071 _, err := handler.ReceivedAck( 1072 &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, 1073 protocol.EncryptionInitial, 1074 time.Now(), 1075 ) 1076 Expect(err).ToNot(HaveOccurred()) 1077 sentPacket(handshakePacketNonAckEliciting(&packet{PacketNumber: 1, SendTime: time.Now()})) 1078 Expect(handler.initialPackets).To(BeNil()) 1079 1080 pto := handler.rttStats.PTO(false) 1081 Expect(pto).ToNot(BeZero()) 1082 // pto is approximately 19 * 3. Using a number > 19 above will 1083 // run into the maxPTODuration limit 1084 Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", time.Now().Add(pto), 10*time.Millisecond)) 1085 }) 1086 1087 It("doesn't reset the PTO count when receiving an ACK", func() { 1088 now := time.Now() 1089 sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)})) 1090 sentPacket(initialPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)})) 1091 Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second)) 1092 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1093 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial)) 1094 Expect(handler.ptoCount).To(BeEquivalentTo(1)) 1095 _, err := handler.ReceivedAck(&wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 1, Largest: 1}}}, protocol.EncryptionInitial, time.Now()) 1096 Expect(err).ToNot(HaveOccurred()) 1097 Expect(handler.ptoCount).To(BeEquivalentTo(1)) 1098 }) 1099 }) 1100 1101 Context("Packet-based loss detection", func() { 1102 It("declares packet below the packet loss threshold as lost", func() { 1103 now := time.Now() 1104 for i := protocol.PacketNumber(1); i <= 6; i++ { 1105 sentPacket(ackElicitingPacket(&packet{PacketNumber: i})) 1106 } 1107 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 6, Largest: 6}}} 1108 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now) 1109 Expect(err).ToNot(HaveOccurred()) 1110 expectInPacketHistory([]protocol.PacketNumber{4, 5}, protocol.Encryption1RTT) 1111 Expect(lostPackets).To(Equal([]protocol.PacketNumber{1, 2, 3})) 1112 }) 1113 }) 1114 1115 Context("Delay-based loss detection", func() { 1116 It("immediately detects old packets as lost when receiving an ACK", func() { 1117 now := time.Now() 1118 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Hour)})) 1119 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Second)})) 1120 Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue()) 1121 1122 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 1123 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now) 1124 Expect(err).ToNot(HaveOccurred()) 1125 // no need to set an alarm, since packet 1 was already declared lost 1126 Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue()) 1127 Expect(handler.bytesInFlight).To(BeZero()) 1128 }) 1129 1130 It("sets the early retransmit alarm", func() { 1131 handler.ReceivedPacket(protocol.EncryptionHandshake) 1132 handler.handshakeConfirmed = true 1133 now := time.Now() 1134 sentPacket(ackElicitingPacket(&packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)})) 1135 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)})) 1136 sentPacket(ackElicitingPacket(&packet{PacketNumber: 3, SendTime: now})) 1137 Expect(handler.appDataPackets.lossTime.IsZero()).To(BeTrue()) 1138 1139 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 1140 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now.Add(-time.Second)) 1141 Expect(err).ToNot(HaveOccurred()) 1142 Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second)) 1143 1144 // Packet 1 should be considered lost (1+1/8) RTTs after it was sent. 1145 Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.Encryption1RTT).SendTime)).To(Equal(time.Second * 9 / 8)) 1146 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1147 1148 expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.Encryption1RTT) 1149 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1150 expectInPacketHistory([]protocol.PacketNumber{3}, protocol.Encryption1RTT) 1151 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1152 }) 1153 1154 It("sets the early retransmit alarm for crypto packets", func() { 1155 handler.ReceivedBytes(1000) 1156 now := time.Now() 1157 sentPacket(initialPacket(&packet{PacketNumber: 1, SendTime: now.Add(-2 * time.Second)})) 1158 sentPacket(initialPacket(&packet{PacketNumber: 2, SendTime: now.Add(-2 * time.Second)})) 1159 sentPacket(initialPacket(&packet{PacketNumber: 3, SendTime: now})) 1160 Expect(handler.initialPackets.lossTime.IsZero()).To(BeTrue()) 1161 1162 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 1163 _, err := handler.ReceivedAck(ack, protocol.EncryptionInitial, now.Add(-time.Second)) 1164 Expect(err).ToNot(HaveOccurred()) 1165 Expect(handler.rttStats.SmoothedRTT()).To(Equal(time.Second)) 1166 1167 // Packet 1 should be considered lost (1+1/8) RTTs after it was sent. 1168 Expect(handler.GetLossDetectionTimeout().Sub(getPacket(1, protocol.EncryptionInitial).SendTime)).To(Equal(time.Second * 9 / 8)) 1169 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1170 1171 expectInPacketHistory([]protocol.PacketNumber{1, 3}, protocol.EncryptionInitial) 1172 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1173 expectInPacketHistory([]protocol.PacketNumber{3}, protocol.EncryptionInitial) 1174 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1175 }) 1176 1177 It("sets the early retransmit alarm for Path MTU probe packets", func() { 1178 var mtuPacketDeclaredLost bool 1179 now := time.Now() 1180 sentPacket(ackElicitingPacket(&packet{ 1181 PacketNumber: 1, 1182 SendTime: now.Add(-3 * time.Second), 1183 IsPathMTUProbePacket: true, 1184 Frames: []Frame{ 1185 { 1186 Frame: &wire.PingFrame{}, 1187 Handler: &customFrameHandler{onLost: func(wire.Frame) { mtuPacketDeclaredLost = true }}, 1188 }, 1189 }, 1190 })) 1191 sentPacket(ackElicitingPacket(&packet{PacketNumber: 2, SendTime: now.Add(-3 * time.Second)})) 1192 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 2, Largest: 2}}} 1193 _, err := handler.ReceivedAck(ack, protocol.Encryption1RTT, now.Add(-time.Second)) 1194 Expect(err).ToNot(HaveOccurred()) 1195 Expect(mtuPacketDeclaredLost).To(BeFalse()) 1196 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 1197 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1198 Expect(mtuPacketDeclaredLost).To(BeTrue()) 1199 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 1200 }) 1201 }) 1202 1203 Context("crypto packets", func() { 1204 It("rejects an ACK that acks packets with a higher encryption level", func() { 1205 sentPacket(ackElicitingPacket(&packet{ 1206 PacketNumber: 13, 1207 EncryptionLevel: protocol.Encryption1RTT, 1208 })) 1209 ack := &wire.AckFrame{AckRanges: []wire.AckRange{{Smallest: 13, Largest: 13}}} 1210 _, err := handler.ReceivedAck(ack, protocol.EncryptionHandshake, time.Now()) 1211 Expect(err).To(MatchError(&qerr.TransportError{ 1212 ErrorCode: qerr.ProtocolViolation, 1213 ErrorMessage: "received ACK for an unsent packet", 1214 })) 1215 }) 1216 1217 It("deletes Initial packets, as a server", func() { 1218 for i := protocol.PacketNumber(0); i < 6; i++ { 1219 sentPacket(ackElicitingPacket(&packet{ 1220 PacketNumber: i, 1221 EncryptionLevel: protocol.EncryptionInitial, 1222 })) 1223 } 1224 for i := protocol.PacketNumber(0); i < 10; i++ { 1225 sentPacket(ackElicitingPacket(&packet{ 1226 PacketNumber: i, 1227 EncryptionLevel: protocol.EncryptionHandshake, 1228 })) 1229 } 1230 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(16))) 1231 handler.DropPackets(protocol.EncryptionInitial) 1232 Expect(lostPackets).To(BeEmpty()) // frames must not be queued for retransmission 1233 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10))) 1234 Expect(handler.initialPackets).To(BeNil()) 1235 Expect(handler.handshakePackets.history.Len()).ToNot(BeZero()) 1236 }) 1237 1238 Context("deleting Initials", func() { 1239 BeforeEach(func() { perspective = protocol.PerspectiveClient }) 1240 1241 It("deletes Initials, as a client", func() { 1242 for i := 0; i < 6; i++ { 1243 sentPacket(ackElicitingPacket(&packet{ 1244 PacketNumber: handler.PopPacketNumber(protocol.EncryptionInitial), 1245 EncryptionLevel: protocol.EncryptionInitial, 1246 Length: 1, 1247 })) 1248 } 1249 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6))) 1250 handler.DropPackets(protocol.EncryptionInitial) 1251 // DropPackets should be ignored for clients and the Initial packet number space. 1252 // It has to be possible to send another Initial packets after this function was called. 1253 sentPacket(ackElicitingPacket(&packet{ 1254 PacketNumber: handler.PopPacketNumber(protocol.EncryptionInitial), 1255 EncryptionLevel: protocol.EncryptionInitial, 1256 Length: 1, 1257 })) 1258 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(7))) 1259 // Sending a Handshake packet triggers dropping of Initials. 1260 sentPacket(ackElicitingPacket(&packet{ 1261 PacketNumber: handler.PopPacketNumber(protocol.EncryptionHandshake), 1262 EncryptionLevel: protocol.EncryptionHandshake, 1263 })) 1264 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(1))) 1265 Expect(lostPackets).To(BeEmpty()) // frames must not be queued for retransmission 1266 Expect(handler.initialPackets).To(BeNil()) 1267 Expect(handler.handshakePackets.history.Len()).ToNot(BeZero()) 1268 }) 1269 }) 1270 1271 It("deletes Handshake packets", func() { 1272 for i := protocol.PacketNumber(0); i < 6; i++ { 1273 sentPacket(ackElicitingPacket(&packet{ 1274 PacketNumber: i, 1275 EncryptionLevel: protocol.EncryptionHandshake, 1276 })) 1277 } 1278 for i := protocol.PacketNumber(0); i < 10; i++ { 1279 sentPacket(ackElicitingPacket(&packet{ 1280 PacketNumber: i, 1281 EncryptionLevel: protocol.Encryption1RTT, 1282 })) 1283 } 1284 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(16))) 1285 handler.DropPackets(protocol.EncryptionHandshake) 1286 Expect(lostPackets).To(BeEmpty()) // frames must not be queued for retransmission 1287 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(10))) 1288 Expect(handler.handshakePackets).To(BeNil()) 1289 }) 1290 1291 It("doesn't retransmit 0-RTT packets when 0-RTT keys are dropped", func() { 1292 for i := protocol.PacketNumber(0); i < 6; i++ { 1293 if i == 3 { 1294 handler.appDataPackets.history.SkippedPacket(3) 1295 continue 1296 } 1297 sentPacket(ackElicitingPacket(&packet{ 1298 PacketNumber: i, 1299 EncryptionLevel: protocol.Encryption0RTT, 1300 })) 1301 } 1302 for i := protocol.PacketNumber(6); i < 12; i++ { 1303 sentPacket(ackElicitingPacket(&packet{PacketNumber: i})) 1304 } 1305 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(11))) 1306 handler.DropPackets(protocol.Encryption0RTT) 1307 Expect(lostPackets).To(BeEmpty()) 1308 Expect(handler.bytesInFlight).To(Equal(protocol.ByteCount(6))) 1309 }) 1310 1311 It("cancels the PTO when dropping a packet number space", func() { 1312 handler.ReceivedPacket(protocol.EncryptionHandshake) 1313 now := time.Now() 1314 sentPacket(handshakePacket(&packet{PacketNumber: 1, SendTime: now.Add(-time.Minute)})) 1315 sentPacket(handshakePacket(&packet{PacketNumber: 2, SendTime: now.Add(-time.Minute)})) 1316 Expect(handler.GetLossDetectionTimeout()).To(BeTemporally("~", now.Add(-time.Minute), time.Second)) 1317 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1318 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOHandshake)) 1319 Expect(handler.ptoCount).To(BeEquivalentTo(1)) 1320 handler.DropPackets(protocol.EncryptionHandshake) 1321 Expect(handler.ptoCount).To(BeZero()) 1322 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1323 }) 1324 }) 1325 1326 Context("peeking and popping packet number", func() { 1327 It("peeks and pops the initial packet number", func() { 1328 pn, _ := handler.PeekPacketNumber(protocol.EncryptionInitial) 1329 Expect(pn).To(Equal(protocol.PacketNumber(42))) 1330 Expect(handler.PopPacketNumber(protocol.EncryptionInitial)).To(Equal(protocol.PacketNumber(42))) 1331 }) 1332 1333 It("peeks and pops beyond the initial packet number", func() { 1334 Expect(handler.PopPacketNumber(protocol.EncryptionInitial)).To(Equal(protocol.PacketNumber(42))) 1335 Expect(handler.PopPacketNumber(protocol.EncryptionInitial)).To(BeNumerically(">", 42)) 1336 }) 1337 1338 It("starts at 0 for handshake and application-data packet number space", func() { 1339 pn, _ := handler.PeekPacketNumber(protocol.EncryptionHandshake) 1340 Expect(pn).To(BeZero()) 1341 Expect(handler.PopPacketNumber(protocol.EncryptionHandshake)).To(BeZero()) 1342 pn, _ = handler.PeekPacketNumber(protocol.Encryption1RTT) 1343 Expect(pn).To(BeZero()) 1344 Expect(handler.PopPacketNumber(protocol.Encryption1RTT)).To(BeZero()) 1345 }) 1346 }) 1347 1348 Context("for the client", func() { 1349 BeforeEach(func() { 1350 perspective = protocol.PerspectiveClient 1351 }) 1352 1353 It("considers the server's address validated right away", func() { 1354 }) 1355 1356 It("queues outstanding packets for retransmission, cancels alarms and resets PTO count when receiving a Retry", func() { 1357 sentPacket(initialPacket(&packet{PacketNumber: 42})) 1358 Expect(handler.GetLossDetectionTimeout()).ToNot(BeZero()) 1359 Expect(handler.bytesInFlight).ToNot(BeZero()) 1360 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1361 // now receive a Retry 1362 Expect(handler.ResetForRetry()).To(Succeed()) 1363 Expect(lostPackets).To(Equal([]protocol.PacketNumber{42})) 1364 Expect(handler.bytesInFlight).To(BeZero()) 1365 Expect(handler.GetLossDetectionTimeout()).To(BeZero()) 1366 Expect(handler.SendMode(time.Now())).To(Equal(SendAny)) 1367 Expect(handler.ptoCount).To(BeZero()) 1368 }) 1369 1370 It("queues outstanding frames for retransmission and cancels alarms when receiving a Retry", func() { 1371 var lostInitial, lost0RTT bool 1372 sentPacket(&packet{ 1373 PacketNumber: 13, 1374 EncryptionLevel: protocol.EncryptionInitial, 1375 Frames: []Frame{ 1376 { 1377 Frame: &wire.CryptoFrame{Data: []byte("foobar")}, 1378 Handler: &customFrameHandler{onLost: func(wire.Frame) { lostInitial = true }}, 1379 }, 1380 }, 1381 Length: 100, 1382 }) 1383 pn := handler.PopPacketNumber(protocol.Encryption0RTT) 1384 sentPacket(&packet{ 1385 PacketNumber: pn, 1386 EncryptionLevel: protocol.Encryption0RTT, 1387 Frames: []Frame{ 1388 { 1389 Frame: &wire.StreamFrame{Data: []byte("foobar")}, 1390 Handler: &customFrameHandler{onLost: func(wire.Frame) { lost0RTT = true }}, 1391 }, 1392 }, 1393 Length: 999, 1394 }) 1395 Expect(handler.bytesInFlight).ToNot(BeZero()) 1396 // now receive a Retry 1397 Expect(handler.ResetForRetry()).To(Succeed()) 1398 Expect(handler.bytesInFlight).To(BeZero()) 1399 Expect(lostInitial).To(BeTrue()) 1400 Expect(lost0RTT).To(BeTrue()) 1401 1402 // make sure we keep increasing the packet number for 0-RTT packets 1403 Expect(handler.PopPacketNumber(protocol.Encryption0RTT)).To(BeNumerically(">", pn)) 1404 }) 1405 1406 It("uses a Retry for an RTT estimate, if it was not retransmitted", func() { 1407 sentPacket(ackElicitingPacket(&packet{ 1408 PacketNumber: 42, 1409 EncryptionLevel: protocol.EncryptionInitial, 1410 SendTime: time.Now().Add(-500 * time.Millisecond), 1411 })) 1412 sentPacket(ackElicitingPacket(&packet{ 1413 PacketNumber: 43, 1414 EncryptionLevel: protocol.EncryptionInitial, 1415 SendTime: time.Now().Add(-10 * time.Millisecond), 1416 })) 1417 Expect(handler.ResetForRetry()).To(Succeed()) 1418 Expect(handler.rttStats.SmoothedRTT()).To(BeNumerically("~", 500*time.Millisecond, 100*time.Millisecond)) 1419 }) 1420 1421 It("uses a Retry for an RTT estimate, but doesn't set the RTT to a value lower than 5ms", func() { 1422 sentPacket(ackElicitingPacket(&packet{ 1423 PacketNumber: 42, 1424 EncryptionLevel: protocol.EncryptionInitial, 1425 SendTime: time.Now().Add(-500 * time.Microsecond), 1426 })) 1427 sentPacket(ackElicitingPacket(&packet{ 1428 PacketNumber: 43, 1429 EncryptionLevel: protocol.EncryptionInitial, 1430 SendTime: time.Now().Add(-10 * time.Microsecond), 1431 })) 1432 Expect(handler.ResetForRetry()).To(Succeed()) 1433 Expect(handler.rttStats.SmoothedRTT()).To(Equal(minRTTAfterRetry)) 1434 }) 1435 1436 It("doesn't use a Retry for an RTT estimate, if it was not retransmitted", func() { 1437 sentPacket(ackElicitingPacket(&packet{ 1438 PacketNumber: 42, 1439 EncryptionLevel: protocol.EncryptionInitial, 1440 SendTime: time.Now().Add(-800 * time.Millisecond), 1441 })) 1442 Expect(handler.OnLossDetectionTimeout()).To(Succeed()) 1443 Expect(handler.SendMode(time.Now())).To(Equal(SendPTOInitial)) 1444 sentPacket(ackElicitingPacket(&packet{ 1445 PacketNumber: 43, 1446 EncryptionLevel: protocol.EncryptionInitial, 1447 SendTime: time.Now().Add(-100 * time.Millisecond), 1448 })) 1449 Expect(handler.ResetForRetry()).To(Succeed()) 1450 Expect(handler.rttStats.SmoothedRTT()).To(BeZero()) 1451 }) 1452 }) 1453 })