OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/quic/core/quic_framer.h" | 5 #include "net/quic/core/quic_framer.h" |
6 | 6 |
7 #include <string.h> | 7 #include <string.h> |
8 | 8 |
9 #include <algorithm> | 9 #include <algorithm> |
10 #include <map> | 10 #include <map> |
(...skipping 1686 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1697 0x98, 0xBA, 0xDC, 0xFE, | 1697 0x98, 0xBA, 0xDC, 0xFE, |
1698 // packet number | 1698 // packet number |
1699 0x01, 0x00, 0x00, 0x00, | 1699 0x01, 0x00, 0x00, 0x00, |
1700 0x00, 0x00, | 1700 0x00, 0x00, |
1701 // private flags (fec group) | 1701 // private flags (fec group) |
1702 0x02, | 1702 0x02, |
1703 // first fec protected packet offset | 1703 // first fec protected packet offset |
1704 0x10 | 1704 0x10 |
1705 }; | 1705 }; |
1706 // clang-format on | 1706 // clang-format on |
1707 if (framer_.version() > QUIC_VERSION_31) { | 1707 CheckProcessingFails(packet, arraysize(packet), |
1708 CheckProcessingFails(packet, arraysize(packet), | 1708 "Illegal private flags value.", |
1709 "Illegal private flags value.", | 1709 QUIC_INVALID_PACKET_HEADER); |
1710 QUIC_INVALID_PACKET_HEADER); | 1710 |
1711 } else { | |
1712 CheckProcessingFails(packet, arraysize(packet), | |
1713 "First fec protected packet offset must be less " | |
1714 "than the packet number.", | |
1715 QUIC_INVALID_PACKET_HEADER); | |
1716 } | |
1717 }; | 1711 }; |
1718 | 1712 |
1719 TEST_P(QuicFramerTest, PaddingFrame) { | 1713 TEST_P(QuicFramerTest, PaddingFrame) { |
1720 // clang-format off | 1714 // clang-format off |
1721 unsigned char packet[] = { | 1715 unsigned char packet[] = { |
1722 // public flags (8 byte connection_id) | 1716 // public flags (8 byte connection_id) |
1723 0x38, | 1717 0x38, |
1724 // connection_id | 1718 // connection_id |
1725 0x10, 0x32, 0x54, 0x76, | 1719 0x10, 0x32, 0x54, 0x76, |
1726 0x98, 0xBA, 0xDC, 0xFE, | 1720 0x98, 0xBA, 0xDC, 0xFE, |
(...skipping 642 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2369 // clang-format on | 2363 // clang-format on |
2370 | 2364 |
2371 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2365 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2372 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2366 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2373 | 2367 |
2374 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2368 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2375 ASSERT_TRUE(visitor_.public_header_.get()); | 2369 ASSERT_TRUE(visitor_.public_header_.get()); |
2376 ASSERT_FALSE(visitor_.header_.get()); | 2370 ASSERT_FALSE(visitor_.header_.get()); |
2377 } | 2371 } |
2378 | 2372 |
2379 TEST_P(QuicFramerTest, AckFrameTwoTimestamp) { | |
2380 // clang-format off | |
2381 unsigned char packet[] = { | |
2382 // public flags (8 byte connection_id) | |
2383 0x38, | |
2384 // connection_id | |
2385 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
2386 // packet number | |
2387 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
2388 // private flags (entropy) | |
2389 0x01, | |
2390 | |
2391 // frame type (ack frame) | |
2392 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2393 0x6C, | |
2394 // entropy hash of all received packets. | |
2395 0xBA, | |
2396 // largest observed packet number | |
2397 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
2398 // Zero delta time. | |
2399 0x00, 0x00, | |
2400 // Number of timestamps. | |
2401 0x02, | |
2402 // Delta from largest observed. | |
2403 0x01, | |
2404 // Delta time. | |
2405 0x10, 0x32, 0x54, 0x76, | |
2406 // Delta from largest observed. | |
2407 0x02, | |
2408 // Delta time. | |
2409 0x10, 0x32, | |
2410 // num missing packets | |
2411 0x01, | |
2412 // missing packet delta | |
2413 0x01, | |
2414 // 0 more missing packets in range. | |
2415 0x00, | |
2416 // Number of revived packets. | |
2417 0x00, | |
2418 }; | |
2419 // clang-format on | |
2420 | |
2421 if (framer_.version() > QUIC_VERSION_31) { | |
2422 return; | |
2423 } | |
2424 | |
2425 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2426 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2427 | |
2428 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2429 ASSERT_TRUE(visitor_.header_.get()); | |
2430 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
2431 !kIncludeDiversificationNonce)); | |
2432 | |
2433 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2434 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2435 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
2436 EXPECT_EQ(0xBA, frame.entropy_hash); | |
2437 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
2438 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
2439 ASSERT_EQ(2u, frame.received_packet_times.size()); | |
2440 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
2441 | |
2442 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
2443 const size_t kLargestObservedOffset = | |
2444 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
2445 const size_t kMissingDeltaTimeOffset = | |
2446 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
2447 const size_t kNumTimestampsOffset = | |
2448 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
2449 const size_t kTimestampDeltaLargestObserved1 = | |
2450 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
2451 const size_t kTimestampTimeDeltaLargestObserved1 = | |
2452 kTimestampDeltaLargestObserved1 + 1; | |
2453 const size_t kTimestampDeltaLargestObserved2 = | |
2454 kTimestampTimeDeltaLargestObserved1 + 4; | |
2455 const size_t kTimestampTimeDeltaLargestObserved2 = | |
2456 kTimestampDeltaLargestObserved2 + 1; | |
2457 const size_t kNumMissingPacketOffset = | |
2458 kTimestampTimeDeltaLargestObserved2 + 2; | |
2459 const size_t kMissingPacketsOffset = | |
2460 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
2461 const size_t kMissingPacketsRange = | |
2462 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | |
2463 const size_t kRevivedPacketsLength = | |
2464 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | |
2465 // Now test framing boundaries. | |
2466 const size_t ack_frame_size = | |
2467 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | |
2468 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
2469 string expected_error; | |
2470 if (i < kLargestObservedOffset) { | |
2471 expected_error = "Unable to read entropy hash for received packets."; | |
2472 } else if (i < kMissingDeltaTimeOffset) { | |
2473 expected_error = "Unable to read largest observed."; | |
2474 } else if (i < kNumTimestampsOffset) { | |
2475 expected_error = "Unable to read ack delay time."; | |
2476 } else if (i < kTimestampDeltaLargestObserved1) { | |
2477 expected_error = "Unable to read num received packets."; | |
2478 } else if (i < kTimestampTimeDeltaLargestObserved1) { | |
2479 expected_error = "Unable to read sequence delta in received packets."; | |
2480 } else if (i < kTimestampDeltaLargestObserved2) { | |
2481 expected_error = "Unable to read time delta in received packets."; | |
2482 } else if (i < kTimestampTimeDeltaLargestObserved2) { | |
2483 expected_error = "Unable to read sequence delta in received packets."; | |
2484 } else if (i < kNumMissingPacketOffset) { | |
2485 expected_error = | |
2486 "Unable to read incremental time delta in received packets."; | |
2487 } else if (i < kMissingPacketsOffset) { | |
2488 expected_error = "Unable to read num missing packet ranges."; | |
2489 } else if (i < kMissingPacketsRange) { | |
2490 expected_error = "Unable to read missing packet number delta."; | |
2491 } else if (i < kRevivedPacketsLength) { | |
2492 expected_error = "Unable to read missing packet number range."; | |
2493 } else { | |
2494 expected_error = "Unable to read num revived packets."; | |
2495 } | |
2496 CheckProcessingFails( | |
2497 packet, | |
2498 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
2499 !kIncludeVersion, !kIncludePathId, | |
2500 !kIncludeDiversificationNonce, | |
2501 PACKET_6BYTE_PACKET_NUMBER), | |
2502 expected_error, QUIC_INVALID_ACK_DATA); | |
2503 } | |
2504 } | |
2505 | |
2506 TEST_P(QuicFramerTest, AckFrameTwoTimestampVersion32) { | 2373 TEST_P(QuicFramerTest, AckFrameTwoTimestampVersion32) { |
2507 // clang-format off | 2374 // clang-format off |
2508 unsigned char packet[] = { | 2375 unsigned char packet[] = { |
2509 // public flags (8 byte connection_id) | 2376 // public flags (8 byte connection_id) |
2510 0x3C, | 2377 0x3C, |
2511 // connection_id | 2378 // connection_id |
2512 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2379 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2513 // packet number | 2380 // packet number |
2514 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2381 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2515 // private flags (entropy) | 2382 // private flags (entropy) |
(...skipping 20 matching lines...) Expand all Loading... |
2536 0x10, 0x32, | 2403 0x10, 0x32, |
2537 // num missing packets | 2404 // num missing packets |
2538 0x01, | 2405 0x01, |
2539 // missing packet delta | 2406 // missing packet delta |
2540 0x01, | 2407 0x01, |
2541 // 0 more missing packets in range. | 2408 // 0 more missing packets in range. |
2542 0x00, | 2409 0x00, |
2543 }; | 2410 }; |
2544 // clang-format on | 2411 // clang-format on |
2545 | 2412 |
2546 if (framer_.version() <= QUIC_VERSION_31 || | 2413 if (framer_.version() > QUIC_VERSION_33) { |
2547 framer_.version() > QUIC_VERSION_33) { | |
2548 return; | 2414 return; |
2549 } | 2415 } |
2550 | 2416 |
2551 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2417 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2552 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2418 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2553 | 2419 |
2554 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2420 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2555 ASSERT_TRUE(visitor_.header_.get()); | 2421 ASSERT_TRUE(visitor_.header_.get()); |
2556 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2422 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
2557 !kIncludeDiversificationNonce)); | 2423 !kIncludeDiversificationNonce)); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2613 CheckProcessingFails( | 2479 CheckProcessingFails( |
2614 packet, | 2480 packet, |
2615 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2481 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
2616 !kIncludeVersion, !kIncludePathId, | 2482 !kIncludeVersion, !kIncludePathId, |
2617 !kIncludeDiversificationNonce, | 2483 !kIncludeDiversificationNonce, |
2618 PACKET_6BYTE_PACKET_NUMBER), | 2484 PACKET_6BYTE_PACKET_NUMBER), |
2619 expected_error, QUIC_INVALID_ACK_DATA); | 2485 expected_error, QUIC_INVALID_ACK_DATA); |
2620 } | 2486 } |
2621 } | 2487 } |
2622 | 2488 |
2623 TEST_P(QuicFramerTest, AckFrameOneTimestamp) { | 2489 TEST_P(QuicFramerTest, AckFrameOneTimestampVersion32) { |
2624 // clang-format off | 2490 // clang-format off |
2625 unsigned char packet[] = { | 2491 unsigned char packet[] = { |
2626 // public flags (8 byte connection_id) | 2492 // public flags (8 byte connection_id) |
2627 0x38, | 2493 0x3C, |
2628 // connection_id | 2494 // connection_id |
2629 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2495 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2630 // packet number | 2496 // packet number |
2631 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2497 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2632 // private flags (entropy) | 2498 // private flags (entropy) |
2633 0x01, | 2499 0x01, |
2634 | 2500 |
2635 // frame type (ack frame) | 2501 // frame type (ack frame) |
2636 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2502 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
2637 0x6C, | 2503 0x6C, |
2638 // entropy hash of all received packets. | 2504 // entropy hash of all received packets. |
2639 0xBA, | 2505 0xBA, |
2640 // largest observed packet number | 2506 // largest observed packet number |
2641 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2507 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2642 // Zero delta time. | 2508 // Zero delta time. |
2643 0x00, 0x00, | 2509 0x00, 0x00, |
2644 // Number of timestamps. | 2510 // Number of timestamps. |
2645 0x01, | 2511 0x01, |
2646 // Delta from largest observed. | 2512 // Delta from largest observed. |
2647 0x01, | 2513 0x01, |
2648 // Delta time. | 2514 // Delta time. |
2649 0x10, 0x32, 0x54, 0x76, | 2515 0x10, 0x32, 0x54, 0x76, |
2650 // num missing packets | 2516 // num missing packets |
2651 0x01, | 2517 0x01, |
2652 // missing packet delta | 2518 // missing packet delta |
2653 0x01, | 2519 0x01, |
2654 // 0 more missing packets in range. | 2520 // 0 more missing packets in range. |
2655 0x00, | 2521 0x00, |
2656 // Number of revived packets. | |
2657 0x00, | |
2658 }; | 2522 }; |
2659 // clang-format on | 2523 // clang-format on |
2660 | 2524 |
2661 if (framer_.version() > QUIC_VERSION_31) { | 2525 if (framer_.version() > QUIC_VERSION_33) { |
2662 return; | 2526 return; |
2663 } | 2527 } |
2664 | 2528 |
2665 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2529 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2666 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2530 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2667 | 2531 |
2668 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2532 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2669 ASSERT_TRUE(visitor_.header_.get()); | 2533 ASSERT_TRUE(visitor_.header_.get()); |
2670 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2534 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
2671 !kIncludeDiversificationNonce)); | 2535 !kIncludeDiversificationNonce)); |
(...skipping 14 matching lines...) Expand all Loading... |
2686 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | 2550 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; |
2687 const size_t kNumTimestampsOffset = | 2551 const size_t kNumTimestampsOffset = |
2688 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | 2552 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
2689 const size_t kTimestampDeltaLargestObserved = | 2553 const size_t kTimestampDeltaLargestObserved = |
2690 kNumTimestampsOffset + kQuicNumTimestampsSize; | 2554 kNumTimestampsOffset + kQuicNumTimestampsSize; |
2691 const size_t kTimestampTimeDeltaLargestObserved = | 2555 const size_t kTimestampTimeDeltaLargestObserved = |
2692 kTimestampDeltaLargestObserved + 1; | 2556 kTimestampDeltaLargestObserved + 1; |
2693 const size_t kNumMissingPacketOffset = kTimestampTimeDeltaLargestObserved + 4; | 2557 const size_t kNumMissingPacketOffset = kTimestampTimeDeltaLargestObserved + 4; |
2694 const size_t kMissingPacketsOffset = | 2558 const size_t kMissingPacketsOffset = |
2695 kNumMissingPacketOffset + kNumberOfNackRangesSize; | 2559 kNumMissingPacketOffset + kNumberOfNackRangesSize; |
2696 const size_t kMissingPacketsRange = | |
2697 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | |
2698 const size_t kRevivedPacketsLength = | |
2699 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | |
2700 // Now test framing boundaries. | 2560 // Now test framing boundaries. |
2701 const size_t ack_frame_size = | 2561 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; |
2702 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | |
2703 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 2562 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
2704 string expected_error; | 2563 string expected_error; |
2705 if (i < kLargestObservedOffset) { | 2564 if (i < kLargestObservedOffset) { |
2706 expected_error = "Unable to read entropy hash for received packets."; | 2565 expected_error = "Unable to read entropy hash for received packets."; |
2707 } else if (i < kMissingDeltaTimeOffset) { | 2566 } else if (i < kMissingDeltaTimeOffset) { |
2708 expected_error = "Unable to read largest observed."; | 2567 expected_error = "Unable to read largest observed."; |
2709 } else if (i < kNumTimestampsOffset) { | 2568 } else if (i < kNumTimestampsOffset) { |
2710 expected_error = "Unable to read ack delay time."; | 2569 expected_error = "Unable to read ack delay time."; |
2711 } else if (i < kTimestampDeltaLargestObserved) { | 2570 } else if (i < kTimestampDeltaLargestObserved) { |
2712 expected_error = "Unable to read num received packets."; | 2571 expected_error = "Unable to read num received packets."; |
2713 } else if (i < kTimestampTimeDeltaLargestObserved) { | 2572 } else if (i < kTimestampTimeDeltaLargestObserved) { |
2714 expected_error = "Unable to read sequence delta in received packets."; | 2573 expected_error = "Unable to read sequence delta in received packets."; |
2715 } else if (i < kNumMissingPacketOffset) { | 2574 } else if (i < kNumMissingPacketOffset) { |
2716 expected_error = "Unable to read time delta in received packets."; | 2575 expected_error = "Unable to read time delta in received packets."; |
2717 } else if (i < kMissingPacketsOffset) { | 2576 } else if (i < kMissingPacketsOffset) { |
2718 expected_error = "Unable to read num missing packet ranges."; | 2577 expected_error = "Unable to read num missing packet ranges."; |
2719 } else if (i < kMissingPacketsRange) { | 2578 } else { |
2720 expected_error = "Unable to read missing packet number delta."; | 2579 expected_error = "Unable to read missing packet number delta."; |
2721 } else if (i < kRevivedPacketsLength) { | |
2722 expected_error = "Unable to read missing packet number range."; | |
2723 } else { | |
2724 expected_error = "Unable to read num revived packets."; | |
2725 } | 2580 } |
2726 CheckProcessingFails( | 2581 CheckProcessingFails( |
2727 packet, | 2582 packet, |
2728 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2583 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
2729 !kIncludeVersion, !kIncludePathId, | 2584 !kIncludeVersion, !kIncludePathId, |
2730 !kIncludeDiversificationNonce, | 2585 !kIncludeDiversificationNonce, |
2731 PACKET_6BYTE_PACKET_NUMBER), | 2586 PACKET_6BYTE_PACKET_NUMBER), |
2732 expected_error, QUIC_INVALID_ACK_DATA); | 2587 expected_error, QUIC_INVALID_ACK_DATA); |
2733 } | 2588 } |
2734 } | 2589 } |
2735 | 2590 |
2736 TEST_P(QuicFramerTest, AckFrameOneTimestampVersion32) { | 2591 TEST_P(QuicFramerTest, NewAckFrameOneAckBlock) { |
2737 // clang-format off | 2592 // clang-format off |
2738 unsigned char packet[] = { | 2593 unsigned char packet[] = { |
2739 // public flags (8 byte connection_id) | 2594 // public flags (8 byte connection_id) |
2740 0x3C, | 2595 0x3C, |
2741 // connection_id | 2596 // connection_id |
2742 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2597 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2743 // packet number | 2598 // packet number |
2744 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2599 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
2745 // private flags (entropy) | |
2746 0x01, | |
2747 | 2600 |
2748 // frame type (ack frame) | 2601 // frame type (ack frame) |
2749 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2602 // (one ack block, 2 byte largest observed, 2 byte block length) |
2750 0x6C, | 2603 0x45, |
2751 // entropy hash of all received packets. | 2604 // largest acked |
2752 0xBA, | 2605 0x34, 0x12, |
2753 // largest observed packet number | |
2754 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
2755 // Zero delta time. | 2606 // Zero delta time. |
2756 0x00, 0x00, | 2607 0x00, 0x00, |
2757 // Number of timestamps. | 2608 // first ack block length. |
2758 0x01, | 2609 0x34, 0x12, |
2759 // Delta from largest observed. | 2610 // num timestamps. |
2760 0x01, | |
2761 // Delta time. | |
2762 0x10, 0x32, 0x54, 0x76, | |
2763 // num missing packets | |
2764 0x01, | |
2765 // missing packet delta | |
2766 0x01, | |
2767 // 0 more missing packets in range. | |
2768 0x00, | 2611 0x00, |
2769 }; | 2612 }; |
2770 // clang-format on | 2613 // clang-format on |
2771 | 2614 |
2772 if (framer_.version() <= QUIC_VERSION_31 || | 2615 if (framer_.version() <= QUIC_VERSION_33) { |
2773 framer_.version() > QUIC_VERSION_33) { | |
2774 return; | 2616 return; |
2775 } | 2617 } |
2776 | 2618 |
2777 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2619 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
2778 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2620 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
2779 | 2621 |
2780 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2622 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
2781 ASSERT_TRUE(visitor_.header_.get()); | 2623 ASSERT_TRUE(visitor_.header_.get()); |
2782 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2624 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
2783 !kIncludeDiversificationNonce)); | 2625 !kIncludeDiversificationNonce)); |
2784 | 2626 |
2785 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2627 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
2786 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2628 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
2787 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | 2629 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
2788 EXPECT_EQ(0xBA, frame.entropy_hash); | 2630 EXPECT_EQ(kSmallLargestObserved, frame.largest_observed); |
2789 EXPECT_EQ(kLargestObserved, frame.largest_observed); | 2631 EXPECT_FALSE(frame.missing); |
2790 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | 2632 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow()); |
2791 ASSERT_EQ(1u, frame.received_packet_times.size()); | |
2792 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
2793 | 2633 |
2794 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | 2634 const size_t kLargestAckedOffset = kQuicFrameTypeSize; |
2795 const size_t kLargestObservedOffset = | 2635 const size_t kLargestAckedDeltaTimeOffset = |
2796 kReceivedEntropyOffset + kQuicEntropyHashSize; | 2636 kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER; |
2797 const size_t kMissingDeltaTimeOffset = | 2637 const size_t kFirstAckBlockLengthOffset = |
2798 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | 2638 kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
2799 const size_t kNumTimestampsOffset = | 2639 const size_t kNumTimestampsOffset = |
2800 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | 2640 kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER; |
2801 const size_t kTimestampDeltaLargestObserved = | |
2802 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
2803 const size_t kTimestampTimeDeltaLargestObserved = | |
2804 kTimestampDeltaLargestObserved + 1; | |
2805 const size_t kNumMissingPacketOffset = kTimestampTimeDeltaLargestObserved + 4; | |
2806 const size_t kMissingPacketsOffset = | |
2807 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
2808 // Now test framing boundaries. | 2641 // Now test framing boundaries. |
2809 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; | 2642 const size_t ack_frame_size = |
| 2643 kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER; |
2810 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | 2644 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
2811 string expected_error; | 2645 string expected_error; |
2812 if (i < kLargestObservedOffset) { | 2646 if (i < kLargestAckedDeltaTimeOffset) { |
2813 expected_error = "Unable to read entropy hash for received packets."; | 2647 expected_error = "Unable to read largest acked."; |
2814 } else if (i < kMissingDeltaTimeOffset) { | 2648 } else if (i < kFirstAckBlockLengthOffset) { |
2815 expected_error = "Unable to read largest observed."; | 2649 expected_error = "Unable to read ack delay time."; |
2816 } else if (i < kNumTimestampsOffset) { | 2650 } else if (i < kNumTimestampsOffset) { |
2817 expected_error = "Unable to read ack delay time."; | 2651 expected_error = "Unable to read first ack block length."; |
2818 } else if (i < kTimestampDeltaLargestObserved) { | 2652 } else { |
2819 expected_error = "Unable to read num received packets."; | 2653 expected_error = "Unable to read num received packets."; |
2820 } else if (i < kTimestampTimeDeltaLargestObserved) { | |
2821 expected_error = "Unable to read sequence delta in received packets."; | |
2822 } else if (i < kNumMissingPacketOffset) { | |
2823 expected_error = "Unable to read time delta in received packets."; | |
2824 } else if (i < kMissingPacketsOffset) { | |
2825 expected_error = "Unable to read num missing packet ranges."; | |
2826 } else { | |
2827 expected_error = "Unable to read missing packet number delta."; | |
2828 } | 2654 } |
2829 CheckProcessingFails( | 2655 CheckProcessingFails( |
2830 packet, | 2656 packet, |
2831 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | 2657 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
2832 !kIncludeVersion, !kIncludePathId, | 2658 !kIncludeVersion, !kIncludePathId, |
2833 !kIncludeDiversificationNonce, | 2659 !kIncludeDiversificationNonce, |
2834 PACKET_6BYTE_PACKET_NUMBER), | 2660 PACKET_6BYTE_PACKET_NUMBER), |
2835 expected_error, QUIC_INVALID_ACK_DATA); | 2661 expected_error, QUIC_INVALID_ACK_DATA); |
2836 } | 2662 } |
2837 } | 2663 } |
2838 | 2664 |
2839 TEST_P(QuicFramerTest, AckFrame) { | 2665 TEST_P(QuicFramerTest, NewAckFrameTwoTimeStampsMultipleAckBlocks) { |
2840 // clang-format off | 2666 // clang-format off |
2841 unsigned char packet[] = { | 2667 unsigned char packet[] = { |
2842 // public flags (8 byte connection_id) | 2668 // public flags (8 byte connection_id) |
2843 0x3C, | 2669 0x3C, |
2844 // connection_id | 2670 // connection_id |
2845 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2671 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
2846 // packet number | 2672 // packet number |
2847 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
2848 // private flags (entropy) | |
2849 0x01, | |
2850 | |
2851 // frame type (ack frame) | |
2852 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
2853 0x6C, | |
2854 // entropy hash of all received packets. | |
2855 0xBA, | |
2856 // largest observed packet number | |
2857 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
2858 // Zero delta time. | |
2859 0x00, 0x00, | |
2860 // Number of timestamps. | |
2861 0x00, | |
2862 // num missing packets | |
2863 0x01, | |
2864 // missing packet delta | |
2865 0x01, | |
2866 // 0 more missing packets in range. | |
2867 0x00, | |
2868 // Number of revived packets. | |
2869 0x00, | |
2870 }; | |
2871 // clang-format on | |
2872 | |
2873 if (framer_.version() > QUIC_VERSION_31) { | |
2874 return; | |
2875 } | |
2876 | |
2877 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2878 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2879 | |
2880 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2881 ASSERT_TRUE(visitor_.header_.get()); | |
2882 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
2883 !kIncludeDiversificationNonce)); | |
2884 | |
2885 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2886 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2887 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
2888 EXPECT_EQ(0xBA, frame.entropy_hash); | |
2889 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
2890 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
2891 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
2892 | |
2893 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
2894 const size_t kLargestObservedOffset = | |
2895 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
2896 const size_t kMissingDeltaTimeOffset = | |
2897 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
2898 const size_t kNumTimestampsOffset = | |
2899 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
2900 const size_t kNumMissingPacketOffset = | |
2901 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
2902 const size_t kMissingPacketsOffset = | |
2903 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
2904 const size_t kMissingPacketsRange = | |
2905 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | |
2906 const size_t kRevivedPacketsLength = | |
2907 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | |
2908 // Now test framing boundaries. | |
2909 const size_t ack_frame_size = | |
2910 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | |
2911 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
2912 string expected_error; | |
2913 if (i < kLargestObservedOffset) { | |
2914 expected_error = "Unable to read entropy hash for received packets."; | |
2915 } else if (i < kMissingDeltaTimeOffset) { | |
2916 expected_error = "Unable to read largest observed."; | |
2917 } else if (i < kNumTimestampsOffset) { | |
2918 expected_error = "Unable to read ack delay time."; | |
2919 } else if (i < kNumMissingPacketOffset) { | |
2920 expected_error = "Unable to read num received packets."; | |
2921 } else if (i < kMissingPacketsOffset) { | |
2922 expected_error = "Unable to read num missing packet ranges."; | |
2923 } else if (i < kMissingPacketsRange) { | |
2924 expected_error = "Unable to read missing packet number delta."; | |
2925 } else if (i < kRevivedPacketsLength) { | |
2926 expected_error = "Unable to read missing packet number range."; | |
2927 } else { | |
2928 expected_error = "Unable to read num revived packets."; | |
2929 } | |
2930 CheckProcessingFails( | |
2931 packet, | |
2932 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
2933 !kIncludeVersion, !kIncludePathId, | |
2934 !kIncludeDiversificationNonce, | |
2935 PACKET_6BYTE_PACKET_NUMBER), | |
2936 expected_error, QUIC_INVALID_ACK_DATA); | |
2937 } | |
2938 } | |
2939 | |
2940 TEST_P(QuicFramerTest, NewAckFrameOneAckBlock) { | |
2941 // clang-format off | |
2942 unsigned char packet[] = { | |
2943 // public flags (8 byte connection_id) | |
2944 0x3C, | |
2945 // connection_id | |
2946 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
2947 // packet number | |
2948 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
2949 | |
2950 // frame type (ack frame) | |
2951 // (one ack block, 2 byte largest observed, 2 byte block length) | |
2952 0x45, | |
2953 // largest acked | |
2954 0x34, 0x12, | |
2955 // Zero delta time. | |
2956 0x00, 0x00, | |
2957 // first ack block length. | |
2958 0x34, 0x12, | |
2959 // num timestamps. | |
2960 0x00, | |
2961 }; | |
2962 // clang-format on | |
2963 | |
2964 if (framer_.version() <= QUIC_VERSION_33) { | |
2965 return; | |
2966 } | |
2967 | |
2968 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
2969 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
2970 | |
2971 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
2972 ASSERT_TRUE(visitor_.header_.get()); | |
2973 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
2974 !kIncludeDiversificationNonce)); | |
2975 | |
2976 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
2977 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
2978 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
2979 EXPECT_EQ(kSmallLargestObserved, frame.largest_observed); | |
2980 EXPECT_FALSE(frame.missing); | |
2981 ASSERT_EQ(4660u, frame.packets.NumPacketsSlow()); | |
2982 | |
2983 const size_t kLargestAckedOffset = kQuicFrameTypeSize; | |
2984 const size_t kLargestAckedDeltaTimeOffset = | |
2985 kLargestAckedOffset + PACKET_2BYTE_PACKET_NUMBER; | |
2986 const size_t kFirstAckBlockLengthOffset = | |
2987 kLargestAckedDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
2988 const size_t kNumTimestampsOffset = | |
2989 kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER; | |
2990 // Now test framing boundaries. | |
2991 const size_t ack_frame_size = | |
2992 kFirstAckBlockLengthOffset + PACKET_2BYTE_PACKET_NUMBER; | |
2993 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
2994 string expected_error; | |
2995 if (i < kLargestAckedDeltaTimeOffset) { | |
2996 expected_error = "Unable to read largest acked."; | |
2997 } else if (i < kFirstAckBlockLengthOffset) { | |
2998 expected_error = "Unable to read ack delay time."; | |
2999 } else if (i < kNumTimestampsOffset) { | |
3000 expected_error = "Unable to read first ack block length."; | |
3001 } else { | |
3002 expected_error = "Unable to read num received packets."; | |
3003 } | |
3004 CheckProcessingFails( | |
3005 packet, | |
3006 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
3007 !kIncludeVersion, !kIncludePathId, | |
3008 !kIncludeDiversificationNonce, | |
3009 PACKET_6BYTE_PACKET_NUMBER), | |
3010 expected_error, QUIC_INVALID_ACK_DATA); | |
3011 } | |
3012 } | |
3013 | |
3014 TEST_P(QuicFramerTest, NewAckFrameTwoTimeStampsMultipleAckBlocks) { | |
3015 // clang-format off | |
3016 unsigned char packet[] = { | |
3017 // public flags (8 byte connection_id) | |
3018 0x3C, | |
3019 // connection_id | |
3020 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
3021 // packet number | |
3022 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2673 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3023 | 2674 |
3024 // frame type (ack frame) | 2675 // frame type (ack frame) |
3025 // (more than one ack block, 2 byte largest observed, 2 byte block length) | 2676 // (more than one ack block, 2 byte largest observed, 2 byte block length) |
3026 0x65, | 2677 0x65, |
3027 // largest acked | 2678 // largest acked |
3028 0x34, 0x12, | 2679 0x34, 0x12, |
3029 // Zero delta time. | 2680 // Zero delta time. |
3030 0x00, 0x00, | 2681 0x00, 0x00, |
3031 // num ack blocks ranges. | 2682 // num ack blocks ranges. |
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3163 } | 2814 } |
3164 | 2815 |
3165 TEST_P(QuicFramerTest, AckFrameVersion32) { | 2816 TEST_P(QuicFramerTest, AckFrameVersion32) { |
3166 // clang-format off | 2817 // clang-format off |
3167 unsigned char packet[] = { | 2818 unsigned char packet[] = { |
3168 // public flags (8 byte connection_id) | 2819 // public flags (8 byte connection_id) |
3169 0x38, | 2820 0x38, |
3170 // connection_id | 2821 // connection_id |
3171 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2822 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
3172 // packet number | 2823 // packet number |
3173 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3174 // private flags (entropy) | |
3175 0x01, | |
3176 | |
3177 // frame type (ack frame) | |
3178 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
3179 0x6C, | |
3180 // entropy hash of all received packets. | |
3181 0xBA, | |
3182 // largest observed packet number | |
3183 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3184 // Zero delta time. | |
3185 0x00, 0x00, | |
3186 // Number of timestamps. | |
3187 0x00, | |
3188 // num missing packets | |
3189 0x01, | |
3190 // missing packet delta | |
3191 0x01, | |
3192 // 0 more missing packets in range. | |
3193 0x00, | |
3194 }; | |
3195 // clang-format on | |
3196 | |
3197 if (framer_.version() <= QUIC_VERSION_31 || | |
3198 framer_.version() > QUIC_VERSION_33) { | |
3199 return; | |
3200 } | |
3201 | |
3202 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
3203 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
3204 | |
3205 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
3206 ASSERT_TRUE(visitor_.header_.get()); | |
3207 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
3208 !kIncludeDiversificationNonce)); | |
3209 | |
3210 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
3211 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
3212 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
3213 EXPECT_EQ(0xBA, frame.entropy_hash); | |
3214 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
3215 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
3216 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
3217 | |
3218 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
3219 const size_t kLargestObservedOffset = | |
3220 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
3221 const size_t kMissingDeltaTimeOffset = | |
3222 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
3223 const size_t kNumTimestampsOffset = | |
3224 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
3225 const size_t kNumMissingPacketOffset = | |
3226 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
3227 const size_t kMissingPacketsOffset = | |
3228 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
3229 // Now test framing boundaries. | |
3230 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; | |
3231 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
3232 string expected_error; | |
3233 if (i < kLargestObservedOffset) { | |
3234 expected_error = "Unable to read entropy hash for received packets."; | |
3235 } else if (i < kMissingDeltaTimeOffset) { | |
3236 expected_error = "Unable to read largest observed."; | |
3237 } else if (i < kNumTimestampsOffset) { | |
3238 expected_error = "Unable to read ack delay time."; | |
3239 } else if (i < kNumMissingPacketOffset) { | |
3240 expected_error = "Unable to read num received packets."; | |
3241 } else if (i < kMissingPacketsOffset) { | |
3242 expected_error = "Unable to read num missing packet ranges."; | |
3243 } else { | |
3244 expected_error = "Unable to read missing packet number delta."; | |
3245 } | |
3246 CheckProcessingFails( | |
3247 packet, | |
3248 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
3249 !kIncludeVersion, !kIncludePathId, | |
3250 !kIncludeDiversificationNonce, | |
3251 PACKET_6BYTE_PACKET_NUMBER), | |
3252 expected_error, QUIC_INVALID_ACK_DATA); | |
3253 } | |
3254 } | |
3255 | |
3256 TEST_P(QuicFramerTest, AckFrameRevivedPackets) { | |
3257 // clang-format off | |
3258 unsigned char packet[] = { | |
3259 // public flags (8 byte connection_id) | |
3260 0x38, | |
3261 // connection_id | |
3262 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
3263 // packet number | |
3264 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3265 // private flags (entropy) | |
3266 0x01, | |
3267 | |
3268 // frame type (ack frame) | |
3269 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
3270 0x6C, | |
3271 // entropy hash of all received packets. | |
3272 0xBA, | |
3273 // largest observed packet number | |
3274 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3275 // Zero delta time. | |
3276 0x00, 0x00, | |
3277 // num received packets. | |
3278 0x00, | |
3279 // num missing packets | |
3280 0x01, | |
3281 // missing packet delta | |
3282 0x01, | |
3283 // 0 more missing packets in range. | |
3284 0x00, | |
3285 // Number of revived packets. | |
3286 0x01, | |
3287 // Revived packet number. | |
3288 0xBE, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3289 // Number of revived packets. | |
3290 0x00, | |
3291 }; | |
3292 // clang-format on | |
3293 | |
3294 if (framer_.version() > QUIC_VERSION_31) { | |
3295 return; | |
3296 } | |
3297 | |
3298 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
3299 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
3300 | |
3301 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
3302 ASSERT_TRUE(visitor_.header_.get()); | |
3303 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
3304 !kIncludeDiversificationNonce)); | |
3305 | |
3306 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
3307 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
3308 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; | |
3309 EXPECT_EQ(0xBA, frame.entropy_hash); | |
3310 EXPECT_EQ(kLargestObserved, frame.largest_observed); | |
3311 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); | |
3312 EXPECT_EQ(kMissingPacket, frame.packets.Min()); | |
3313 | |
3314 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; | |
3315 const size_t kLargestObservedOffset = | |
3316 kReceivedEntropyOffset + kQuicEntropyHashSize; | |
3317 const size_t kMissingDeltaTimeOffset = | |
3318 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; | |
3319 const size_t kNumTimestampsOffset = | |
3320 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; | |
3321 const size_t kNumMissingPacketOffset = | |
3322 kNumTimestampsOffset + kQuicNumTimestampsSize; | |
3323 const size_t kMissingPacketsOffset = | |
3324 kNumMissingPacketOffset + kNumberOfNackRangesSize; | |
3325 const size_t kMissingPacketsRange = | |
3326 kMissingPacketsOffset + PACKET_1BYTE_PACKET_NUMBER; | |
3327 const size_t kRevivedPacketsLength = | |
3328 kMissingPacketsRange + PACKET_1BYTE_PACKET_NUMBER; | |
3329 const size_t kRevivedPacketSequenceNumberLength = | |
3330 kRevivedPacketsLength + PACKET_1BYTE_PACKET_NUMBER; | |
3331 // Now test framing boundaries. | |
3332 const size_t ack_frame_size = | |
3333 kRevivedPacketSequenceNumberLength + PACKET_6BYTE_PACKET_NUMBER; | |
3334 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { | |
3335 string expected_error; | |
3336 if (i < kReceivedEntropyOffset) { | |
3337 expected_error = "Unable to read least unacked delta."; | |
3338 } else if (i < kLargestObservedOffset) { | |
3339 expected_error = "Unable to read entropy hash for received packets."; | |
3340 } else if (i < kMissingDeltaTimeOffset) { | |
3341 expected_error = "Unable to read largest observed."; | |
3342 } else if (i < kNumTimestampsOffset) { | |
3343 expected_error = "Unable to read ack delay time."; | |
3344 } else if (i < kNumMissingPacketOffset) { | |
3345 expected_error = "Unable to read num received packets."; | |
3346 } else if (i < kMissingPacketsOffset) { | |
3347 expected_error = "Unable to read num missing packet ranges."; | |
3348 } else if (i < kMissingPacketsRange) { | |
3349 expected_error = "Unable to read missing packet number delta."; | |
3350 } else if (i < kRevivedPacketsLength) { | |
3351 expected_error = "Unable to read missing packet number range."; | |
3352 } else if (i < kRevivedPacketSequenceNumberLength) { | |
3353 expected_error = "Unable to read num revived packets."; | |
3354 } else { | |
3355 expected_error = "Unable to read revived packet."; | |
3356 } | |
3357 CheckProcessingFails( | |
3358 packet, | |
3359 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, | |
3360 !kIncludeVersion, !kIncludePathId, | |
3361 !kIncludeDiversificationNonce, | |
3362 PACKET_6BYTE_PACKET_NUMBER), | |
3363 expected_error, QUIC_INVALID_ACK_DATA); | |
3364 } | |
3365 } | |
3366 | |
3367 TEST_P(QuicFramerTest, AckFrameNoNacks) { | |
3368 // clang-format off | |
3369 unsigned char packet[] = { | |
3370 // public flags (8 byte connection_id) | |
3371 static_cast<unsigned char>( | |
3372 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
3373 // connection_id | |
3374 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
3375 // packet number | |
3376 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3377 // private flags (entropy) | |
3378 0x01, | |
3379 | |
3380 // frame type (ack frame) | |
3381 // (no nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
3382 0x4C, | |
3383 // entropy hash of all received packets. | |
3384 0xBA, | |
3385 // largest observed packet number | |
3386 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
3387 // Zero delta time. | |
3388 0x00, 0x00, | |
3389 // Number of received packets. | |
3390 0x00, | |
3391 }; | |
3392 // clang-format on | |
3393 if (framer_.version() >= QUIC_VERSION_31) { | |
3394 return; | |
3395 } | |
3396 | |
3397 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | |
3398 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | |
3399 | |
3400 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
3401 ASSERT_TRUE(visitor_.header_.get()); | |
3402 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | |
3403 !kIncludeDiversificationNonce)); | |
3404 | |
3405 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | |
3406 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | |
3407 QuicAckFrame* frame = visitor_.ack_frames_[0]; | |
3408 EXPECT_EQ(0xBA, frame->entropy_hash); | |
3409 EXPECT_EQ(kLargestObserved, frame->largest_observed); | |
3410 ASSERT_TRUE(frame->packets.Empty()); | |
3411 | |
3412 // Verify that the packet re-serializes identically. | |
3413 QuicFrames frames; | |
3414 frames.push_back(QuicFrame(frame)); | |
3415 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | |
3416 ASSERT_TRUE(data != nullptr); | |
3417 | |
3418 test::CompareCharArraysWithHexError("constructed packet", data->data(), | |
3419 data->length(), AsChars(packet), | |
3420 arraysize(packet)); | |
3421 } | |
3422 | |
3423 TEST_P(QuicFramerTest, AckFrame500Nacks) { | |
3424 // clang-format off | |
3425 unsigned char packet[] = { | |
3426 // public flags (8 byte connection_id) | |
3427 static_cast<unsigned char>( | |
3428 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | |
3429 // connection_id | |
3430 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
3431 // packet number | |
3432 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2824 0xA8, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3433 // private flags (entropy) | 2825 // private flags (entropy) |
3434 0x01, | 2826 0x01, |
3435 | 2827 |
3436 // frame type (ack frame) | 2828 // frame type (ack frame) |
3437 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | 2829 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) |
3438 0x6C, | 2830 0x6C, |
3439 // entropy hash of all received packets. | 2831 // entropy hash of all received packets. |
3440 0xBA, | 2832 0xBA, |
3441 // largest observed packet number | 2833 // largest observed packet number |
3442 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | 2834 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, |
3443 // Zero delta time. | 2835 // Zero delta time. |
3444 0x00, 0x00, | 2836 0x00, 0x00, |
3445 // No received packets. | 2837 // Number of timestamps. |
3446 0x00, | 2838 0x00, |
3447 // num missing packet ranges | 2839 // num missing packets |
3448 0x02, | 2840 0x01, |
3449 // missing packet delta | 2841 // missing packet delta |
3450 0x01, | 2842 0x01, |
3451 // 243 more missing packets in range. | 2843 // 0 more missing packets in range. |
3452 // The ranges are listed in this order so the re-constructed packet | |
3453 // matches. | |
3454 0xF3, | |
3455 // No gap between ranges | |
3456 0x00, | |
3457 // 255 more missing packets in range. | |
3458 0xFF, | |
3459 // No revived packets. | |
3460 0x00, | 2844 0x00, |
3461 }; | 2845 }; |
3462 // clang-format on | 2846 // clang-format on |
3463 | 2847 |
3464 if (framer_.version() > QUIC_VERSION_31) { | 2848 if (framer_.version() > QUIC_VERSION_33) { |
3465 return; | 2849 return; |
3466 } | 2850 } |
3467 | 2851 |
3468 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2852 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
3469 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2853 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
3470 | 2854 |
3471 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2855 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
3472 ASSERT_TRUE(visitor_.header_.get()); | 2856 ASSERT_TRUE(visitor_.header_.get()); |
3473 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2857 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
3474 !kIncludeDiversificationNonce)); | 2858 !kIncludeDiversificationNonce)); |
3475 | 2859 |
3476 EXPECT_EQ(0u, visitor_.stream_frames_.size()); | 2860 EXPECT_EQ(0u, visitor_.stream_frames_.size()); |
3477 ASSERT_EQ(1u, visitor_.ack_frames_.size()); | 2861 ASSERT_EQ(1u, visitor_.ack_frames_.size()); |
3478 QuicAckFrame* frame = visitor_.ack_frames_[0]; | 2862 const QuicAckFrame& frame = *visitor_.ack_frames_[0]; |
3479 EXPECT_EQ(0xBA, frame->entropy_hash); | 2863 EXPECT_EQ(0xBA, frame.entropy_hash); |
3480 EXPECT_EQ(kLargestObserved, frame->largest_observed); | 2864 EXPECT_EQ(kLargestObserved, frame.largest_observed); |
3481 ASSERT_EQ(500u, frame->packets.NumPacketsSlow()); | 2865 ASSERT_EQ(1u, frame.packets.NumPacketsSlow()); |
3482 EXPECT_EQ(kMissingPacket - 499, frame->packets.Min()); | 2866 EXPECT_EQ(kMissingPacket, frame.packets.Min()); |
3483 EXPECT_EQ(kMissingPacket, frame->packets.Max()); | |
3484 | 2867 |
3485 // Verify that the packet re-serializes identically. | 2868 const size_t kReceivedEntropyOffset = kQuicFrameTypeSize; |
3486 QuicFrames frames; | 2869 const size_t kLargestObservedOffset = |
3487 frames.push_back(QuicFrame(frame)); | 2870 kReceivedEntropyOffset + kQuicEntropyHashSize; |
3488 std::unique_ptr<QuicPacket> data(BuildDataPacket(*visitor_.header_, frames)); | 2871 const size_t kMissingDeltaTimeOffset = |
3489 ASSERT_TRUE(data != nullptr); | 2872 kLargestObservedOffset + PACKET_6BYTE_PACKET_NUMBER; |
3490 | 2873 const size_t kNumTimestampsOffset = |
3491 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 2874 kMissingDeltaTimeOffset + kQuicDeltaTimeLargestObservedSize; |
3492 data->length(), AsChars(packet), | 2875 const size_t kNumMissingPacketOffset = |
3493 arraysize(packet)); | 2876 kNumTimestampsOffset + kQuicNumTimestampsSize; |
| 2877 const size_t kMissingPacketsOffset = |
| 2878 kNumMissingPacketOffset + kNumberOfNackRangesSize; |
| 2879 // Now test framing boundaries. |
| 2880 const size_t ack_frame_size = PACKET_1BYTE_PACKET_NUMBER; |
| 2881 for (size_t i = kQuicFrameTypeSize; i < ack_frame_size; ++i) { |
| 2882 string expected_error; |
| 2883 if (i < kLargestObservedOffset) { |
| 2884 expected_error = "Unable to read entropy hash for received packets."; |
| 2885 } else if (i < kMissingDeltaTimeOffset) { |
| 2886 expected_error = "Unable to read largest observed."; |
| 2887 } else if (i < kNumTimestampsOffset) { |
| 2888 expected_error = "Unable to read ack delay time."; |
| 2889 } else if (i < kNumMissingPacketOffset) { |
| 2890 expected_error = "Unable to read num received packets."; |
| 2891 } else if (i < kMissingPacketsOffset) { |
| 2892 expected_error = "Unable to read num missing packet ranges."; |
| 2893 } else { |
| 2894 expected_error = "Unable to read missing packet number delta."; |
| 2895 } |
| 2896 CheckProcessingFails( |
| 2897 packet, |
| 2898 i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID, |
| 2899 !kIncludeVersion, !kIncludePathId, |
| 2900 !kIncludeDiversificationNonce, |
| 2901 PACKET_6BYTE_PACKET_NUMBER), |
| 2902 expected_error, QUIC_INVALID_ACK_DATA); |
| 2903 } |
3494 } | 2904 } |
3495 | 2905 |
3496 TEST_P(QuicFramerTest, AckFrame500NacksVersion32) { | 2906 TEST_P(QuicFramerTest, AckFrame500NacksVersion32) { |
3497 // clang-format off | 2907 // clang-format off |
3498 unsigned char packet[] = { | 2908 unsigned char packet[] = { |
3499 // public flags (8 byte connection_id) | 2909 // public flags (8 byte connection_id) |
3500 static_cast<unsigned char>( | 2910 static_cast<unsigned char>( |
3501 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | 2911 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), |
3502 // connection_id | 2912 // connection_id |
3503 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 2913 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
(...skipping 21 matching lines...) Expand all Loading... |
3525 // The ranges are listed in this order so the re-constructed packet | 2935 // The ranges are listed in this order so the re-constructed packet |
3526 // matches. | 2936 // matches. |
3527 0xF3, | 2937 0xF3, |
3528 // No gap between ranges | 2938 // No gap between ranges |
3529 0x00, | 2939 0x00, |
3530 // 255 more missing packets in range. | 2940 // 255 more missing packets in range. |
3531 0xFF, | 2941 0xFF, |
3532 }; | 2942 }; |
3533 // clang-format on | 2943 // clang-format on |
3534 | 2944 |
3535 if (framer_.version() <= QUIC_VERSION_31 || | 2945 if (framer_.version() > QUIC_VERSION_33) { |
3536 framer_.version() > QUIC_VERSION_33) { | |
3537 return; | 2946 return; |
3538 } | 2947 } |
3539 | 2948 |
3540 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 2949 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
3541 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 2950 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); |
3542 | 2951 |
3543 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | 2952 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); |
3544 ASSERT_TRUE(visitor_.header_.get()); | 2953 ASSERT_TRUE(visitor_.header_.get()); |
3545 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, | 2954 EXPECT_TRUE(CheckDecryption(encrypted, !kIncludeVersion, !kIncludePathId, |
3546 !kIncludeDiversificationNonce)); | 2955 !kIncludeDiversificationNonce)); |
(...skipping 985 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4532 // redundancy | 3941 // redundancy |
4533 'a', 'b', 'c', 'd', | 3942 'a', 'b', 'c', 'd', |
4534 'e', 'f', 'g', 'h', | 3943 'e', 'f', 'g', 'h', |
4535 'i', 'j', 'k', 'l', | 3944 'i', 'j', 'k', 'l', |
4536 'm', 'n', 'o', 'p', | 3945 'm', 'n', 'o', 'p', |
4537 }; | 3946 }; |
4538 if (framer_.version() > QUIC_VERSION_33) { | 3947 if (framer_.version() > QUIC_VERSION_33) { |
4539 return; | 3948 return; |
4540 } | 3949 } |
4541 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); | 3950 QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false); |
4542 if (framer_.version() <= QUIC_VERSION_31) { | 3951 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); |
4543 EXPECT_TRUE(framer_.ProcessPacket(encrypted)); | 3952 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); |
4544 EXPECT_EQ(QUIC_NO_ERROR, framer_.error()); | |
4545 } else { | |
4546 EXPECT_FALSE(framer_.ProcessPacket(encrypted)); | |
4547 EXPECT_EQ(QUIC_INVALID_PACKET_HEADER, framer_.error()); | |
4548 } | |
4549 EXPECT_FALSE(visitor_.header_.get()); | 3953 EXPECT_FALSE(visitor_.header_.get()); |
4550 } | 3954 } |
4551 | 3955 |
4552 TEST_P(QuicFramerTest, BuildPaddingFramePacket) { | 3956 TEST_P(QuicFramerTest, BuildPaddingFramePacket) { |
4553 QuicPacketHeader header; | 3957 QuicPacketHeader header; |
4554 header.public_header.connection_id = kConnectionId; | 3958 header.public_header.connection_id = kConnectionId; |
4555 header.public_header.reset_flag = false; | 3959 header.public_header.reset_flag = false; |
4556 header.public_header.version_flag = false; | 3960 header.public_header.version_flag = false; |
4557 header.fec_flag = false; | 3961 header.fec_flag = false; |
4558 header.entropy_flag = false; | 3962 header.entropy_flag = false; |
(...skipping 602 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5161 ack_frame.largest_observed = kLargestObserved; | 4565 ack_frame.largest_observed = kLargestObserved; |
5162 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); | 4566 ack_frame.ack_delay_time = QuicTime::Delta::Zero(); |
5163 ack_frame.packets.Add(kMissingPacket); | 4567 ack_frame.packets.Add(kMissingPacket); |
5164 | 4568 |
5165 QuicFrames frames; | 4569 QuicFrames frames; |
5166 frames.push_back(QuicFrame(&ack_frame)); | 4570 frames.push_back(QuicFrame(&ack_frame)); |
5167 | 4571 |
5168 // clang-format off | 4572 // clang-format off |
5169 unsigned char packet[] = { | 4573 unsigned char packet[] = { |
5170 // public flags (8 byte connection_id) | 4574 // public flags (8 byte connection_id) |
5171 0x3C, | |
5172 // connection_id | |
5173 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
5174 // packet number | |
5175 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
5176 // private flags (entropy) | |
5177 0x01, | |
5178 | |
5179 // frame type (ack frame) | |
5180 // (has nacks, not truncated, 6 byte largest observed, 1 byte delta) | |
5181 0x6C, | |
5182 // entropy hash of all received packets. | |
5183 0x43, | |
5184 // largest observed packet number | |
5185 0xBF, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
5186 // Zero delta time. | |
5187 0x00, 0x00, | |
5188 // num received packets. | |
5189 0x00, | |
5190 // num missing packet ranges | |
5191 0x01, | |
5192 // missing packet delta | |
5193 0x01, | |
5194 // 0 more missing packets in range. | |
5195 0x00, | |
5196 // 0 revived packets. | |
5197 0x00, | |
5198 }; | |
5199 // clang-format on | |
5200 | |
5201 // clang-format off | |
5202 unsigned char packet_version32[] = { | |
5203 // public flags (8 byte connection_id) | |
5204 static_cast<unsigned char>( | 4575 static_cast<unsigned char>( |
5205 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | 4576 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), |
5206 // connection_id | 4577 // connection_id |
5207 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 4578 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
5208 // packet number | 4579 // packet number |
5209 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 4580 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
5210 // private flags (entropy) | 4581 // private flags (entropy) |
5211 0x01, | 4582 0x01, |
5212 | 4583 |
5213 // frame type (ack frame) | 4584 // frame type (ack frame) |
(...skipping 12 matching lines...) Expand all Loading... |
5226 // missing packet delta | 4597 // missing packet delta |
5227 0x01, | 4598 0x01, |
5228 // 0 more missing packets in range. | 4599 // 0 more missing packets in range. |
5229 0x00, | 4600 0x00, |
5230 }; | 4601 }; |
5231 // clang-format on | 4602 // clang-format on |
5232 | 4603 |
5233 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 4604 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
5234 ASSERT_TRUE(data != nullptr); | 4605 ASSERT_TRUE(data != nullptr); |
5235 | 4606 |
5236 if (framer_.version() <= QUIC_VERSION_31) { | 4607 test::CompareCharArraysWithHexError( |
5237 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 4608 "constructed packet", data->data(), data->length(), |
5238 data->length(), AsChars(packet), | 4609 AsChars(packet), arraysize(packet)); |
5239 arraysize(packet)); | |
5240 } else { | |
5241 test::CompareCharArraysWithHexError( | |
5242 "constructed packet", data->data(), data->length(), | |
5243 AsChars(packet_version32), arraysize(packet_version32)); | |
5244 } | |
5245 } | 4610 } |
5246 | 4611 |
5247 // TODO(jri): Add test for tuncated packets in which the original ack frame had | 4612 // TODO(jri): Add test for tuncated packets in which the original ack frame had |
5248 // revived packets. (In both the large and small packet cases below). | 4613 // revived packets. (In both the large and small packet cases below). |
5249 | 4614 |
5250 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { | 4615 TEST_P(QuicFramerTest, BuildTruncatedAckFrameLargePacket) { |
5251 if (framer_.version() > QUIC_VERSION_33) { | 4616 if (framer_.version() > QUIC_VERSION_33) { |
5252 return; | 4617 return; |
5253 } | 4618 } |
5254 | 4619 |
(...skipping 15 matching lines...) Expand all Loading... |
5270 for (size_t i = 1; i < 2 * 300; i += 2) { | 4635 for (size_t i = 1; i < 2 * 300; i += 2) { |
5271 ack_frame.packets.Add(i); | 4636 ack_frame.packets.Add(i); |
5272 } | 4637 } |
5273 | 4638 |
5274 QuicFrames frames; | 4639 QuicFrames frames; |
5275 frames.push_back(QuicFrame(&ack_frame)); | 4640 frames.push_back(QuicFrame(&ack_frame)); |
5276 | 4641 |
5277 // clang-format off | 4642 // clang-format off |
5278 unsigned char packet[] = { | 4643 unsigned char packet[] = { |
5279 // public flags (8 byte connection_id) | 4644 // public flags (8 byte connection_id) |
5280 0x3C, | |
5281 // connection_id | |
5282 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
5283 // packet number | |
5284 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
5285 // private flags (entropy) | |
5286 0x01, | |
5287 | |
5288 // frame type (ack frame) | |
5289 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | |
5290 0x74, | |
5291 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | |
5292 // since ack is truncated. | |
5293 0x01, | |
5294 // 2-byte largest observed packet number. | |
5295 // Expected to be 510 (0x1FE), since only 255 nack ranges can fit. | |
5296 0xFE, 0x01, | |
5297 // Zero delta time. | |
5298 0x00, 0x00, | |
5299 // num missing packet ranges (limited to 255 by size of this field). | |
5300 0xFF, | |
5301 // {missing packet delta, further missing packets in range} | |
5302 // 6 nack ranges x 42 + 3 nack ranges | |
5303 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5304 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5305 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5306 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5307 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5308 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5309 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5310 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5311 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5312 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5313 | |
5314 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5315 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5316 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5317 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5318 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5319 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5320 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5321 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5322 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5323 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5324 | |
5325 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5326 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5327 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5328 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5329 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5330 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5331 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5332 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5333 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5334 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5335 | |
5336 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5337 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5338 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5339 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5340 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5341 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5342 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5343 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5344 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5345 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5346 | |
5347 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5348 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5349 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5350 | |
5351 // 0 revived packets. | |
5352 0x00, | |
5353 }; | |
5354 // clang-format on | |
5355 | |
5356 // clang-format off | |
5357 unsigned char packet_version32[] = { | |
5358 // public flags (8 byte connection_id) | |
5359 static_cast<unsigned char>( | 4645 static_cast<unsigned char>( |
5360 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | 4646 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), |
5361 // connection_id | 4647 // connection_id |
5362 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 4648 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
5363 // packet number | 4649 // packet number |
5364 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 4650 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
5365 // private flags (entropy) | 4651 // private flags (entropy) |
5366 0x01, | 4652 0x01, |
5367 | 4653 |
5368 // frame type (ack frame) | 4654 // frame type (ack frame) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5426 | 4712 |
5427 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 4713 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
5428 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 4714 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
5429 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 4715 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
5430 }; | 4716 }; |
5431 // clang-format on | 4717 // clang-format on |
5432 | 4718 |
5433 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); | 4719 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames)); |
5434 ASSERT_TRUE(data != nullptr); | 4720 ASSERT_TRUE(data != nullptr); |
5435 | 4721 |
5436 if (framer_.version() <= QUIC_VERSION_31) { | 4722 test::CompareCharArraysWithHexError( |
5437 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 4723 "constructed packet", data->data(), data->length(), |
5438 data->length(), AsChars(packet), | 4724 AsChars(packet), arraysize(packet)); |
5439 arraysize(packet)); | |
5440 } else { | |
5441 test::CompareCharArraysWithHexError( | |
5442 "constructed packet", data->data(), data->length(), | |
5443 AsChars(packet_version32), arraysize(packet_version32)); | |
5444 } | |
5445 } | 4725 } |
5446 | 4726 |
5447 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { | 4727 TEST_P(QuicFramerTest, BuildTruncatedAckFrameSmallPacket) { |
5448 if (framer_.version() > QUIC_VERSION_33) { | 4728 if (framer_.version() > QUIC_VERSION_33) { |
5449 return; | 4729 return; |
5450 } | 4730 } |
5451 | 4731 |
5452 QuicPacketHeader header; | 4732 QuicPacketHeader header; |
5453 header.public_header.connection_id = kConnectionId; | 4733 header.public_header.connection_id = kConnectionId; |
5454 header.public_header.reset_flag = false; | 4734 header.public_header.reset_flag = false; |
(...skipping 12 matching lines...) Expand all Loading... |
5467 for (size_t i = 1; i < 2 * 300; i += 2) { | 4747 for (size_t i = 1; i < 2 * 300; i += 2) { |
5468 ack_frame.packets.Add(i); | 4748 ack_frame.packets.Add(i); |
5469 } | 4749 } |
5470 | 4750 |
5471 QuicFrames frames; | 4751 QuicFrames frames; |
5472 frames.push_back(QuicFrame(&ack_frame)); | 4752 frames.push_back(QuicFrame(&ack_frame)); |
5473 | 4753 |
5474 // clang-format off | 4754 // clang-format off |
5475 unsigned char packet[] = { | 4755 unsigned char packet[] = { |
5476 // public flags (8 byte connection_id) | 4756 // public flags (8 byte connection_id) |
5477 0x3C, | |
5478 // connection_id | |
5479 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | |
5480 // packet number | |
5481 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | |
5482 // private flags (entropy) | |
5483 0x01, | |
5484 | |
5485 // frame type (ack frame) | |
5486 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | |
5487 0x74, | |
5488 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | |
5489 // since ack is truncated. | |
5490 0x01, | |
5491 // 2-byte largest observed packet number. | |
5492 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. | |
5493 0x0C, 0x00, | |
5494 // Zero delta time. | |
5495 0x00, 0x00, | |
5496 // num missing packet ranges (limited to 6 by packet size of 37). | |
5497 0x06, | |
5498 // {missing packet delta, further missing packets in range} | |
5499 // 6 nack ranges | |
5500 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | |
5501 // 0 revived packets. | |
5502 0x00, | |
5503 }; | |
5504 // clang-format on | |
5505 | |
5506 // clang-format off | |
5507 unsigned char packet_version32[] = { | |
5508 // public flags (8 byte connection_id) | |
5509 static_cast<unsigned char>( | 4757 static_cast<unsigned char>( |
5510 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), | 4758 framer_.version() > QUIC_VERSION_32 ? 0x38 : 0x3C), |
5511 // connection_id | 4759 // connection_id |
5512 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, | 4760 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE, |
5513 // packet number | 4761 // packet number |
5514 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, | 4762 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12, |
5515 // private flags (entropy) | 4763 // private flags (entropy) |
5516 0x01, | 4764 0x01, |
5517 | 4765 |
5518 // frame type (ack frame) | 4766 // frame type (ack frame) |
5519 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) | 4767 // (has nacks, is truncated, 2 byte largest observed, 1 byte delta) |
5520 0x74, | 4768 0x74, |
5521 // entropy hash of all received packets, set to 1 by TestEntropyCalculator | 4769 // entropy hash of all received packets, set to 1 by TestEntropyCalculator |
5522 // since ack is truncated. | 4770 // since ack is truncated. |
5523 0x01, | 4771 0x01, |
5524 // 2-byte largest observed packet number. | 4772 // 2-byte largest observed packet number. |
5525 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. | 4773 // Expected to be 12 (0x0C), since only 6 nack ranges can fit. |
5526 0x0C, 0x00, | 4774 0x0C, 0x00, |
5527 // Zero delta time. | 4775 // Zero delta time. |
5528 0x00, 0x00, | 4776 0x00, 0x00, |
5529 // num missing packet ranges (limited to 6 by packet size of 37). | 4777 // num missing packet ranges (limited to 6 by packet size of 37). |
5530 0x06, | 4778 0x06, |
5531 // {missing packet delta, further missing packets in range} | 4779 // {missing packet delta, further missing packets in range} |
5532 // 6 nack ranges | 4780 // 6 nack ranges |
5533 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, | 4781 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x00, |
5534 }; | 4782 }; |
5535 // clang-format on | 4783 // clang-format on |
5536 | 4784 |
5537 if (framer_.version() <= QUIC_VERSION_31) { | 4785 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames, 36u)); |
5538 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames, 37u)); | 4786 ASSERT_TRUE(data != nullptr); |
5539 ASSERT_TRUE(data != nullptr); | 4787 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. |
5540 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | 4788 EXPECT_EQ(35u, data->length()); |
5541 EXPECT_EQ(36u, data->length()); | 4789 test::CompareCharArraysWithHexError( |
5542 test::CompareCharArraysWithHexError("constructed packet", data->data(), | 4790 "constructed packet", data->data(), data->length(), |
5543 data->length(), AsChars(packet), | 4791 AsChars(packet), arraysize(packet)); |
5544 arraysize(packet)); | |
5545 } else { | |
5546 std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames, 36u)); | |
5547 ASSERT_TRUE(data != nullptr); | |
5548 // Expect 1 byte unused since at least 2 bytes are needed to fit more nacks. | |
5549 EXPECT_EQ(35u, data->length()); | |
5550 test::CompareCharArraysWithHexError( | |
5551 "constructed packet", data->data(), data->length(), | |
5552 AsChars(packet_version32), arraysize(packet_version32)); | |
5553 } | |
5554 } | 4792 } |
5555 | 4793 |
5556 TEST_P(QuicFramerTest, BuildNewAckFramePacketOneAckBlock) { | 4794 TEST_P(QuicFramerTest, BuildNewAckFramePacketOneAckBlock) { |
5557 if (framer_.version() <= QUIC_VERSION_33) { | 4795 if (framer_.version() <= QUIC_VERSION_33) { |
5558 return; | 4796 return; |
5559 } | 4797 } |
5560 | 4798 |
5561 QuicPacketHeader header; | 4799 QuicPacketHeader header; |
5562 header.public_header.connection_id = kConnectionId; | 4800 header.public_header.connection_id = kConnectionId; |
5563 header.public_header.reset_flag = false; | 4801 header.public_header.reset_flag = false; |
(...skipping 1699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7263 'o', ' ', 'w', 'o', | 6501 'o', ' ', 'w', 'o', |
7264 'r', 'l', 'd', '!', | 6502 'r', 'l', 'd', '!', |
7265 }; | 6503 }; |
7266 // clang-format on | 6504 // clang-format on |
7267 | 6505 |
7268 QuicFramerFuzzFunc(packet, arraysize(packet)); | 6506 QuicFramerFuzzFunc(packet, arraysize(packet)); |
7269 } | 6507 } |
7270 | 6508 |
7271 } // namespace test | 6509 } // namespace test |
7272 } // namespace net | 6510 } // namespace net |
OLD | NEW |