Landing Recent QUIC changes until Thu Mar 16 17:24:53 2017 +0000
Add a QUIC BBR ack aggregation mode which measures the number of bytes
acknowledged faster than the max bandwidth.
Protected by FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes.
De-flakes and re-enables BbrSenderTest::SimpleTransfer2RTTStartup.
Merge internal change: 150335661
https://codereview.chromium.org/2764653002/
Read and write connection ID (represented as uint64_t) in network byte
order (big endian).
Protected by FLAGS_quic_restart_flag_quic_big_endian_connection_id.
Merge internal change: 150218161
https://codereview.chromium.org/2761973002/
Review-Url: https://codereview.chromium.org/2759203003
Cr-Original-Commit-Position: refs/heads/master@{#458308}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 6b9ac5c7d7b50d5e419eb9aadc8a52497b3fecb5
diff --git a/quic/core/congestion_control/bbr_sender.cc b/quic/core/congestion_control/bbr_sender.cc
index 9fd9d3b..b64dc99 100644
--- a/quic/core/congestion_control/bbr_sender.cc
+++ b/quic/core/congestion_control/bbr_sender.cc
@@ -82,6 +82,9 @@
max_ack_spacing_(kBandwidthWindowSize, QuicTime::Delta::Zero(), 0),
largest_acked_time_(QuicTime::Zero()),
largest_acked_sent_time_(QuicTime::Zero()),
+ max_ack_height_(kBandwidthWindowSize, 0, 0),
+ aggregation_epoch_start_time_(QuicTime::Zero()),
+ aggregation_epoch_bytes_(0),
min_rtt_(QuicTime::Delta::Zero()),
min_rtt_timestamp_(QuicTime::Zero()),
congestion_window_(initial_tcp_congestion_window * kDefaultTCPMSS),
@@ -209,6 +212,12 @@
QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_ack_spacing2, 1, 2);
UpdateAckSpacing(event_time, last_acked_packet, acked_packets);
}
+ if (FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes) {
+ QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_ack_aggregation_bytes, 1,
+ 2);
+ UpdateAckAggregationBytes(
+ event_time, sampler_.total_bytes_acked() - total_bytes_acked_before);
+ }
}
// Handle logic specific to PROBE_BW mode.
@@ -508,6 +517,29 @@
max_ack_spacing_.Update(ack_spacing, round_trip_count_);
}
+// TODO(ianswett): Move this logic into BandwidthSampler.
+void BbrSender::UpdateAckAggregationBytes(QuicTime ack_time,
+ QuicByteCount newly_acked_bytes) {
+ // Compute how many bytes are expected to be delivered, assuming max bandwidth
+ // is correct.
+ QuicByteCount expected_bytes_acked =
+ max_bandwidth_.GetBest() * (ack_time - aggregation_epoch_start_time_);
+ // Reset the current aggregation epoch as soon as the ack arrival rate is less
+ // than or equal to the max bandwidth.
+ if (aggregation_epoch_bytes_ <= expected_bytes_acked) {
+ // Reset to start measuring a new aggregation epoch.
+ aggregation_epoch_bytes_ = newly_acked_bytes;
+ aggregation_epoch_start_time_ = ack_time;
+ return;
+ }
+
+ // Compute how many extra bytes were delivered vs max bandwidth.
+ // Include the bytes most recently acknowledged to account for stretch acks.
+ aggregation_epoch_bytes_ += newly_acked_bytes;
+ max_ack_height_.Update(aggregation_epoch_bytes_ - expected_bytes_acked,
+ round_trip_count_);
+}
+
void BbrSender::CalculatePacingRate() {
if (BandwidthEstimate().IsZero()) {
return;
@@ -547,6 +579,11 @@
QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_ack_spacing2, 2, 2);
// Add CWND for inter-ack spacing once STARTUP has been exited.
target_window += max_ack_spacing_.GetBest() * BandwidthEstimate();
+ } else if (FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes &&
+ is_at_full_bandwidth_) {
+ QUIC_FLAG_COUNT_N(quic_reloadable_flag_quic_bbr_ack_aggregation_bytes, 2,
+ 2);
+ target_window += max_ack_height_.GetBest();
}
// Instead of immediately setting the target CWND as the new one, BBR grows
diff --git a/quic/core/congestion_control/bbr_sender.h b/quic/core/congestion_control/bbr_sender.h
index b248cd2..be64437 100644
--- a/quic/core/congestion_control/bbr_sender.h
+++ b/quic/core/congestion_control/bbr_sender.h
@@ -147,6 +147,12 @@
QuicRoundTripCount>
MaxAckDelayFilter;
+ typedef WindowedFilter<QuicByteCount,
+ MaxFilter<QuicByteCount>,
+ QuicRoundTripCount,
+ QuicRoundTripCount>
+ MaxAckHeightFilter;
+
// Returns the current estimate of the RTT of the connection. Outside of the
// edge cases, this is minimum RTT.
QuicTime::Delta GetMinRtt() const;
@@ -195,6 +201,10 @@
QuicPacketNumber largest_newly_acked,
const CongestionVector& acked_packets);
+ // Updates the ack aggregation max filter in bytes.
+ void UpdateAckAggregationBytes(QuicTime ack_time,
+ QuicByteCount newly_acked_bytes);
+
// Determines the appropriate pacing rate for the connection.
void CalculatePacingRate();
// Determines the appropriate congestion window for the connection.
@@ -233,6 +243,13 @@
QuicTime largest_acked_time_;
QuicTime largest_acked_sent_time_;
+ // Tracks the maximum number of bytes acked faster than the sending rate.
+ MaxAckHeightFilter max_ack_height_;
+
+ // The time this aggregation started and the number of bytes acked during it.
+ QuicTime aggregation_epoch_start_time_;
+ QuicByteCount aggregation_epoch_bytes_;
+
// Minimum RTT estimate. Automatically expires within 10 seconds (and
// triggers PROBE_RTT mode) if no new value is sampled during that period.
QuicTime::Delta min_rtt_;
diff --git a/quic/core/congestion_control/bbr_sender_test.cc b/quic/core/congestion_control/bbr_sender_test.cc
index 64c0a15..f3aa680 100644
--- a/quic/core/congestion_control/bbr_sender_test.cc
+++ b/quic/core/congestion_control/bbr_sender_test.cc
@@ -232,7 +232,7 @@
}
// Test a simple long data transfer with 2 rtts of aggregation.
-TEST_F(BbrSenderTest, DISABLED_SimpleTransfer2RTTAggregation) {
+TEST_F(BbrSenderTest, SimpleTransfer2RTTAggregation) {
QuicFlagSaver flags;
FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = true;
CreateDefaultSetup();
@@ -242,16 +242,83 @@
// Transfer 12MB.
DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(35));
EXPECT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode);
- // It's possible to read a bandwidth as much as 25% too high with aggregation.
+ // It's possible to read a bandwidth as much as 50% too high with aggregation.
EXPECT_LE(kTestLinkBandwidth * 0.99f,
sender_->ExportDebugState().max_bandwidth);
// TODO(ianswett): Tighten this bound once we understand why BBR is
// overestimating bandwidth with aggregation. b/36022633
- EXPECT_GE(kTestLinkBandwidth * 1.25f,
+ EXPECT_GE(kTestLinkBandwidth * 1.5f,
+ sender_->ExportDebugState().max_bandwidth);
+ // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures
+ // bandwidth higher than the link rate.
+ // The margin here is high, because the aggregation greatly increases
+ // smoothed rtt.
+ EXPECT_GE(kTestRtt * 4, rtt_stats_->smoothed_rtt());
+ ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f);
+}
+
+// Test a simple long data transfer with 2 rtts of aggregation.
+TEST_F(BbrSenderTest, SimpleTransfer2RTTAggregationBytes) {
+ FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = false;
+ FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes = true;
+ CreateDefaultSetup();
+ // 2 RTTs of aggregation, with a max of 10kb.
+ EnableAggregation(10 * 1024, 2 * kTestRtt);
+
+ // Transfer 12MB.
+ DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(35));
+ EXPECT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode);
+ // It's possible to read a bandwidth as much as 50% too high with aggregation.
+ EXPECT_LE(kTestLinkBandwidth * 0.99f,
+ sender_->ExportDebugState().max_bandwidth);
+ // TODO(ianswett): Tighten this bound once we understand why BBR is
+ // overestimating bandwidth with aggregation. b/36022633
+ EXPECT_GE(kTestLinkBandwidth * 1.5f,
sender_->ExportDebugState().max_bandwidth);
// TODO(ianswett): Expect 0 packets are lost once BBR no longer measures
// bandwidth higher than the link rate.
EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited);
+ // The margin here is high, because the aggregation greatly increases
+ // smoothed rtt.
+ EXPECT_GE(kTestRtt * 4, rtt_stats_->smoothed_rtt());
+ ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f);
+}
+
+// Test a simple long data transfer with 2 rtts of aggregation.
+TEST_F(BbrSenderTest, SimpleTransferAckDecimation) {
+ FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2 = false;
+ FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes = true;
+ // Decrease the CWND gain so extra CWND is required with stretch acks.
+ base::SetFlag(&FLAGS_quic_bbr_cwnd_gain, 1.0);
+ sender_ = new BbrSender(
+ rtt_stats_,
+ QuicSentPacketManagerPeer::GetUnackedPacketMap(
+ QuicConnectionPeer::GetSentPacketManager(bbr_sender_.connection())),
+ kInitialCongestionWindowPackets, kDefaultMaxCongestionWindowPackets,
+ &random_);
+ QuicConnectionPeer::SetSendAlgorithm(bbr_sender_.connection(), sender_);
+ // Enable Ack Decimation on the receiver.
+ QuicConnectionPeer::SetAckMode(receiver_.connection(),
+ QuicConnection::AckMode::ACK_DECIMATION);
+ CreateDefaultSetup();
+
+ // Transfer 12MB.
+ DoSimpleTransfer(12 * 1024 * 1024, QuicTime::Delta::FromSeconds(35));
+ EXPECT_EQ(BbrSender::PROBE_BW, sender_->ExportDebugState().mode);
+ // It's possible to read a bandwidth as much as 50% too high with aggregation.
+ EXPECT_LE(kTestLinkBandwidth * 0.99f,
+ sender_->ExportDebugState().max_bandwidth);
+ // TODO(ianswett): Tighten this bound once we understand why BBR is
+ // overestimating bandwidth with aggregation. b/36022633
+ EXPECT_GE(kTestLinkBandwidth * 1.5f,
+ sender_->ExportDebugState().max_bandwidth);
+ // TODO(ianswett): Expect 0 packets are lost once BBR no longer measures
+ // bandwidth higher than the link rate.
+ EXPECT_FALSE(sender_->ExportDebugState().last_sample_is_app_limited);
+ // The margin here is high, because the aggregation greatly increases
+ // smoothed rtt.
+ EXPECT_GE(kTestRtt * 2, rtt_stats_->smoothed_rtt());
+ ExpectApproxEq(kTestRtt, rtt_stats_->min_rtt(), 0.1f);
}
// Test the number of losses incurred by the startup phase in a situation when
diff --git a/quic/core/quic_data_reader.cc b/quic/core/quic_data_reader.cc
index ea078de..c34034d 100644
--- a/quic/core/quic_data_reader.cc
+++ b/quic/core/quic_data_reader.cc
@@ -5,7 +5,9 @@
#include "net/quic/core/quic_data_reader.h"
#include "net/base/int128.h"
+#include "net/quic/core/quic_flags.h"
#include "net/quic/core/quic_packets.h"
+#include "net/quic/platform/api/quic_endian.h"
namespace net {
@@ -84,6 +86,18 @@
return true;
}
+bool QuicDataReader::ReadConnectionId(uint64_t* connection_id) {
+ if (!ReadUInt64(connection_id)) {
+ return false;
+ }
+
+ if (FLAGS_quic_restart_flag_quic_big_endian_connection_id) {
+ *connection_id = QuicEndian::NetToHost64(*connection_id);
+ }
+
+ return true;
+}
+
QuicStringPiece QuicDataReader::ReadRemainingPayload() {
QuicStringPiece payload = PeekRemainingPayload();
pos_ = len_;
diff --git a/quic/core/quic_data_reader.h b/quic/core/quic_data_reader.h
index 2e36503..61c4803 100644
--- a/quic/core/quic_data_reader.h
+++ b/quic/core/quic_data_reader.h
@@ -72,6 +72,15 @@
// Returns true on success, false otherwise.
bool ReadStringPiece(QuicStringPiece* result, size_t len);
+ // Reads connection ID represented as 64-bit unsigned integer into the given
+ // output parameter.
+ // Forwards the internal iterator on success.
+ // Returns true on success, false otherwise.
+ // TODO(fayang): Remove this method and use ReadUInt64() once deprecating
+ // quic_restart_flag_quic_rw_cid_in_big_endian and QuicDataReader has a mode
+ // indicating reading in little/big endian.
+ bool ReadConnectionId(uint64_t* connection_id);
+
// Returns the remaining payload as a QuicStringPiece.
//
// NOTE: Does not copy but rather references strings in the underlying buffer.
diff --git a/quic/core/quic_data_writer.cc b/quic/core/quic_data_writer.cc
index ac56e5e..90b2c03 100644
--- a/quic/core/quic_data_writer.cc
+++ b/quic/core/quic_data_writer.cc
@@ -7,6 +7,9 @@
#include <algorithm>
#include <limits>
+#include "net/quic/core/quic_flags.h"
+#include "net/quic/platform/api/quic_endian.h"
+
namespace net {
QuicDataWriter::QuicDataWriter(size_t size, char* buffer)
@@ -138,4 +141,12 @@
length_ = capacity_;
}
+bool QuicDataWriter::WriteConnectionId(uint64_t connection_id) {
+ if (FLAGS_quic_restart_flag_quic_big_endian_connection_id) {
+ connection_id = QuicEndian::HostToNet64(connection_id);
+ }
+
+ return WriteUInt64(connection_id);
+}
+
} // namespace net
diff --git a/quic/core/quic_data_writer.h b/quic/core/quic_data_writer.h
index d4bd367..367d559 100644
--- a/quic/core/quic_data_writer.h
+++ b/quic/core/quic_data_writer.h
@@ -53,6 +53,12 @@
// Fills the remaining buffer with null characters.
void WritePadding();
+ // Write connection ID as a 64-bit unsigned integer to the payload.
+ // TODO(fayang): Remove this method and use WriteUInt64() once deprecating
+ // quic_restart_flag_quic_rw_cid_in_big_endian and QuicDataWriter has a mode
+ // indicating writing in little/big endian.
+ bool WriteConnectionId(uint64_t connection_id);
+
size_t capacity() const { return capacity_; }
private:
diff --git a/quic/core/quic_data_writer_test.cc b/quic/core/quic_data_writer_test.cc
index fcd1a57..98ed83b 100644
--- a/quic/core/quic_data_writer_test.cc
+++ b/quic/core/quic_data_writer_test.cc
@@ -7,6 +7,8 @@
#include <cstdint>
#include "net/quic/core/quic_data_reader.h"
+#include "net/quic/core/quic_flags.h"
+#include "net/quic/test_tools/quic_test_utils.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace net {
@@ -196,6 +198,30 @@
}
}
+TEST(QuicDataWriterTest, WriteConnectionId) {
+ uint64_t connection_id = 0x0011223344556677;
+ char little_endian[] = {
+ 0x77, 0x66, 0x55, 0x44, 0x33, 0x22, 0x11, 0x00,
+ };
+ char big_endian[] = {
+ 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77,
+ };
+ const int kBufferLength = sizeof(connection_id);
+ char buffer[kBufferLength];
+ QuicDataWriter writer(kBufferLength, buffer);
+ writer.WriteConnectionId(connection_id);
+ test::CompareCharArraysWithHexError(
+ "connection_id", buffer, kBufferLength,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? big_endian
+ : little_endian,
+ kBufferLength);
+
+ uint64_t read_connection_id;
+ QuicDataReader reader(buffer, kBufferLength);
+ reader.ReadConnectionId(&read_connection_id);
+ EXPECT_EQ(connection_id, read_connection_id);
+}
+
} // namespace
} // namespace test
} // namespace net
diff --git a/quic/core/quic_flags_list.h b/quic/core/quic_flags_list.h
index 36ec22e..d8407d9 100644
--- a/quic/core/quic_flags_list.h
+++ b/quic/core/quic_flags_list.h
@@ -177,3 +177,13 @@
// Only consider using the ack spacing in QUIC BBR if 2 packets are acked at
// once.
QUIC_FLAG(bool, FLAGS_quic_reloadable_flag_quic_bbr_ack_spacing2, false)
+
+// If true, 8-byte connection ID in public header is read and written in big
+// endian.
+QUIC_FLAG(bool, FLAGS_quic_restart_flag_quic_big_endian_connection_id, false)
+
+// If true, QUIC BBR stores a max filtered number of bytes delivered at a rate
+// faster than the sending rate.
+QUIC_FLAG(bool,
+ FLAGS_quic_reloadable_flag_quic_bbr_ack_aggregation_bytes,
+ false)
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc
index bacec50..df4c849 100644
--- a/quic/core/quic_framer.cc
+++ b/quic/core/quic_framer.cc
@@ -442,7 +442,7 @@
return nullptr;
}
- if (!writer.WriteUInt64(packet.public_header.connection_id)) {
+ if (!writer.WriteConnectionId(packet.public_header.connection_id)) {
return nullptr;
}
@@ -470,7 +470,7 @@
return nullptr;
}
- if (!writer.WriteUInt64(connection_id)) {
+ if (!writer.WriteConnectionId(connection_id)) {
return nullptr;
}
@@ -674,7 +674,7 @@
public_flags |= PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID_OLD;
}
if (!writer->WriteUInt8(public_flags) ||
- !writer->WriteUInt64(header.public_header.connection_id)) {
+ !writer->WriteConnectionId(header.public_header.connection_id)) {
return false;
}
break;
@@ -787,7 +787,7 @@
switch (public_flags & PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID) {
case PACKET_PUBLIC_FLAGS_8BYTE_CONNECTION_ID:
- if (!reader->ReadUInt64(&public_header->connection_id)) {
+ if (!reader->ReadConnectionId(&public_header->connection_id)) {
set_detailed_error("Unable to read ConnectionId.");
return false;
}
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc
index 6115ab6..6e83d54 100644
--- a/quic/core/quic_framer_test.cc
+++ b/quic/core/quic_framer_test.cc
@@ -571,6 +571,17 @@
// private flags
0x00,
};
+
+ unsigned char packet_cid_be[kMaxPacketSize + 1] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+ // private flags
+ 0x00,
+ };
// clang-format on
const size_t header_size = GetPacketHeaderSize(
@@ -579,7 +590,14 @@
memset(packet + header_size, 0, kMaxPacketSize - header_size);
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_QUIC_BUG(framer_.ProcessPacket(encrypted), "Packet too large:1");
ASSERT_TRUE(visitor_.header_.get());
@@ -599,9 +617,25 @@
// packet number
0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -625,7 +659,10 @@
} else {
expected_error = "Unable to read packet number.";
}
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, QUIC_INVALID_PACKET_HEADER);
}
}
@@ -684,9 +721,27 @@
// packet number
0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version)
+ 0x39,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -713,7 +768,10 @@
} else {
expected_error = "Unable to read packet number.";
}
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, QUIC_INVALID_PACKET_HEADER);
}
}
@@ -729,9 +787,25 @@
// packet number
0xBC, 0x9A, 0x78, 0x56,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id and 4 byte packet number)
+ 0x28,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -755,7 +829,10 @@
} else {
expected_error = "Unable to read packet number.";
}
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, QUIC_INVALID_PACKET_HEADER);
}
}
@@ -771,9 +848,25 @@
// packet number
0xBC, 0x9A,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id and 2 byte packet number)
+ 0x18,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -799,7 +892,10 @@
} else {
expected_error = "Unable to read packet number.";
}
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, QUIC_INVALID_PACKET_HEADER);
}
}
@@ -815,9 +911,25 @@
// packet number
0xBC,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id and 1 byte packet number)
+ 0x08,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_MISSING_PAYLOAD, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -843,7 +955,10 @@
} else {
expected_error = "Unable to read packet number.";
}
- CheckProcessingFails(packet, i, expected_error, QUIC_INVALID_PACKET_HEADER);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, QUIC_INVALID_PACKET_HEADER);
}
}
@@ -925,9 +1040,35 @@
0x00,
0x00, 0x00, 0x00, 0x00
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags: includes nonce flag
+ static_cast<unsigned char>(
+ FLAGS_quic_reloadable_flag_quic_remove_multipath_bit ? 0x3C : 0x7C),
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // nonce
+ 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07,
+ 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f,
+ 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
+ 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (padding)
+ 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
ASSERT_TRUE(visitor_.public_header_->nonce != nullptr);
@@ -955,8 +1096,32 @@
0x00,
0x00, 0x00, 0x00, 0x00
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id, version flag and an unknown flag)
+ static_cast<unsigned char>(
+ FLAGS_quic_reloadable_flag_quic_remove_multipath_bit ? 0x39 : 0x79),
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '0', '0', '0',
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (padding frame)
+ 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -993,9 +1158,43 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (padding frame)
+ 0x00,
+ // Ignored data (which in this case is a stream frame)
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.header_.get());
@@ -1006,7 +1205,8 @@
EXPECT_EQ(0u, visitor_.ack_frames_.size());
// A packet with no frames is not acceptable.
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1039,9 +1239,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1057,7 +1288,10 @@
CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
// Now test framing boundaries.
- CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, !kIncludeVersion);
+ CheckStreamFrameBoundaries(
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
+ kQuicMaxStreamIdSize, !kIncludeVersion);
}
TEST_P(QuicFramerTest, MissingDiversificationNonce) {
@@ -1092,9 +1326,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_FALSE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_DECRYPTION_FAILURE, framer_.error());
}
@@ -1125,9 +1390,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFE,
+ // stream id
+ 0x04, 0x03, 0x02,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1145,7 +1441,10 @@
// Now test framing boundaries.
const size_t stream_id_size = 3;
- CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion);
+ CheckStreamFrameBoundaries(
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
+ stream_id_size, !kIncludeVersion);
}
TEST_P(QuicFramerTest, StreamFrame2ByteStreamId) {
@@ -1174,9 +1473,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFD,
+ // stream id
+ 0x04, 0x03,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1194,7 +1524,10 @@
// Now test framing boundaries.
const size_t stream_id_size = 2;
- CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion);
+ CheckStreamFrameBoundaries(
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
+ stream_id_size, !kIncludeVersion);
}
TEST_P(QuicFramerTest, StreamFrame1ByteStreamId) {
@@ -1223,9 +1556,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFC,
+ // stream id
+ 0x04,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1243,7 +1607,10 @@
// Now test framing boundaries.
const size_t stream_id_size = 1;
- CheckStreamFrameBoundaries(packet, stream_id_size, !kIncludeVersion);
+ CheckStreamFrameBoundaries(
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
+ stream_id_size, !kIncludeVersion);
}
TEST_P(QuicFramerTest, StreamFrameWithVersion) {
@@ -1274,9 +1641,42 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version, 8 byte connection_id)
+ 0x39,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1294,7 +1694,10 @@
CheckStreamFrameData("hello world!", visitor_.stream_frames_[0].get());
// Now test framing boundaries.
- CheckStreamFrameBoundaries(packet, kQuicMaxStreamIdSize, kIncludeVersion);
+ CheckStreamFrameBoundaries(
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
+ kQuicMaxStreamIdSize, kIncludeVersion);
}
TEST_P(QuicFramerTest, RejectPacket) {
@@ -1325,9 +1728,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1347,12 +1781,25 @@
// public flags (8 byte connection_id)
0x38,
// connection_id
- 0x10, 0x32, 0x54, 0x76,
- 0x98, 0xBA, 0xDC, 0xFE,
+ 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+ };
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
};
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1382,9 +1829,37 @@
// num timestamps.
0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x3C,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (ack frame)
+ // (one ack block, 2 byte largest observed, 2 byte block length)
+ 0x45,
+ // largest acked
+ 0x34, 0x12,
+ // Zero delta time.
+ 0x00, 0x00,
+ // first ack block length.
+ 0x34, 0x12,
+ // num timestamps.
+ 0x00,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1420,7 +1895,8 @@
expected_error = "Unable to read num received packets.";
}
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1476,9 +1952,63 @@
// Delta time.
0x10, 0x32,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x3C,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (ack frame)
+ // (more than one ack block, 2 byte largest observed, 2 byte block length)
+ 0x65,
+ // largest acked
+ 0x34, 0x12,
+ // Zero delta time.
+ 0x00, 0x00,
+ // num ack blocks ranges.
+ 0x04,
+ // first ack block length.
+ 0x01, 0x00,
+ // gap to next block.
+ 0x01,
+ // ack block length.
+ 0xaf, 0x0e,
+ // gap to next block.
+ 0xff,
+ // ack block length.
+ 0x00, 0x00,
+ // gap to next block.
+ 0x91,
+ // ack block length.
+ 0xea, 0x01,
+ // gap to next block.
+ 0x05,
+ // ack block length.
+ 0x04, 0x00,
+ // Number of timestamps.
+ 0x02,
+ // Delta from largest observed.
+ 0x01,
+ // Delta time.
+ 0x10, 0x32, 0x54, 0x76,
+ // Delta from largest observed.
+ 0x02,
+ // Delta time.
+ 0x10, 0x32,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1565,7 +2095,8 @@
}
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1590,9 +2121,31 @@
0x08, 0x00, 0x00, 0x00,
0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x3C,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xA8, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+ // frame type (stop waiting frame)
+ 0x06,
+ // least packet number awaiting an ack, delta from packet number.
+ 0x08, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1610,7 +2163,8 @@
string expected_error;
expected_error = "Unable to read least unacked delta.";
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1642,9 +2196,38 @@
// error code
0x01, 0x00, 0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (rst stream frame)
+ 0x01,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+
+ // sent byte offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+
+ // error code
+ 0x01, 0x00, 0x00, 0x00,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1670,7 +2253,8 @@
expected_error = "Unable to read rst stream error code.";
}
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1703,9 +2287,39 @@
'I', ' ', 'c', 'a',
'n',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (connection close frame)
+ 0x02,
+ // error code
+ 0x11, 0x00, 0x00, 0x00,
+
+ // error details length
+ 0x0d, 0x00,
+ // error details
+ 'b', 'e', 'c', 'a',
+ 'u', 's', 'e', ' ',
+ 'I', ' ', 'c', 'a',
+ 'n',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1730,7 +2344,8 @@
expected_error = "Unable to read connection close error details.";
}
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1764,9 +2379,40 @@
'I', ' ', 'c', 'a',
'n',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (go away frame)
+ 0x03,
+ // error code
+ 0x09, 0x00, 0x00, 0x00,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // error details length
+ 0x0d, 0x00,
+ // error details
+ 'b', 'e', 'c', 'a',
+ 'u', 's', 'e', ' ',
+ 'I', ' ', 'c', 'a',
+ 'n',
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1792,7 +2438,8 @@
expected_error = "Unable to read goaway reason.";
}
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1820,9 +2467,34 @@
0x54, 0x76, 0x10, 0x32,
0xDC, 0xFE, 0x98, 0xBA,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (window update frame)
+ 0x04,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // byte offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1843,7 +2515,8 @@
expected_error = "Unable to read window byte_offset.";
}
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1868,9 +2541,31 @@
// stream id
0x04, 0x03, 0x02, 0x01,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (blocked frame)
+ 0x05,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1885,7 +2580,8 @@
++i) {
string expected_error = "Unable to read stream_id.";
CheckProcessingFails(
- packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet,
i + GetPacketHeaderSize(framer_.version(), PACKET_8BYTE_CONNECTION_ID,
!kIncludeVersion, !kIncludeDiversificationNonce,
PACKET_6BYTE_PACKET_NUMBER),
@@ -1908,9 +2604,29 @@
// frame type (ping frame)
0x07,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (ping frame)
+ 0x07,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
@@ -1950,9 +2666,41 @@
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12, 0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte connection_id)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (2) + padding
+ 0x02, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.public_reset_packet_.get());
@@ -1967,20 +2715,41 @@
visitor_.public_reset_packet_->client_address.host().address_family());
// Now test framing boundaries.
- for (size_t i = 0; i < arraysize(packet); ++i) {
+ if (!FLAGS_quic_restart_flag_quic_big_endian_connection_id) {
+ for (size_t i = 0; i < arraysize(packet); ++i) {
+ string expected_error;
+ QUIC_DLOG(INFO) << "iteration: " << i;
+ if (i < kConnectionIdOffset) {
+ expected_error = "Unable to read public flags.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PACKET_HEADER);
+ } else if (i < kPublicResetPacketMessageTagOffset) {
+ expected_error = "Unable to read ConnectionId.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PACKET_HEADER);
+ } else {
+ expected_error = "Unable to read reset message.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PUBLIC_RST_PACKET);
+ }
+ }
+ return;
+ }
+
+ for (size_t i = 0; i < arraysize(packet_cid_be); ++i) {
string expected_error;
QUIC_DLOG(INFO) << "iteration: " << i;
if (i < kConnectionIdOffset) {
expected_error = "Unable to read public flags.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PACKET_HEADER);
} else if (i < kPublicResetPacketMessageTagOffset) {
expected_error = "Unable to read ConnectionId.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PACKET_HEADER);
} else {
expected_error = "Unable to read reset message.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PUBLIC_RST_PACKET);
}
}
@@ -2015,9 +2784,41 @@
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12, 0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte connection_id)
+ 0x0E,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (2) + padding
+ 0x02, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.public_reset_packet_.get());
@@ -2032,20 +2833,41 @@
visitor_.public_reset_packet_->client_address.host().address_family());
// Now test framing boundaries.
- for (size_t i = 0; i < arraysize(packet); ++i) {
+ if (!FLAGS_quic_restart_flag_quic_big_endian_connection_id) {
+ for (size_t i = 0; i < arraysize(packet); ++i) {
+ string expected_error;
+ QUIC_DLOG(INFO) << "iteration: " << i;
+ if (i < kConnectionIdOffset) {
+ expected_error = "Unable to read public flags.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PACKET_HEADER);
+ } else if (i < kPublicResetPacketMessageTagOffset) {
+ expected_error = "Unable to read ConnectionId.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PACKET_HEADER);
+ } else {
+ expected_error = "Unable to read reset message.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PUBLIC_RST_PACKET);
+ }
+ }
+ return;
+ }
+
+ for (size_t i = 0; i < arraysize(packet_cid_be); ++i) {
string expected_error;
QUIC_DLOG(INFO) << "iteration: " << i;
if (i < kConnectionIdOffset) {
expected_error = "Unable to read public flags.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PACKET_HEADER);
} else if (i < kPublicResetPacketMessageTagOffset) {
expected_error = "Unable to read ConnectionId.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PACKET_HEADER);
} else {
expected_error = "Unable to read reset message.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PUBLIC_RST_PACKET);
}
}
@@ -2080,11 +2902,43 @@
// trailing junk
'j', 'u', 'n', 'k',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte connection_id)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (2) + padding
+ 0x02, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ // trailing junk
+ 'j', 'u', 'n', 'k',
+ };
// clang-format on
string expected_error = "Unable to read reset message.";
- CheckProcessingFails(packet, arraysize(packet), expected_error,
- QUIC_INVALID_PUBLIC_RST_PACKET);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ expected_error, QUIC_INVALID_PUBLIC_RST_PACKET);
}
TEST_P(QuicFramerTest, PublicResetPacketWithClientAddress) {
@@ -2122,9 +2976,49 @@
0x04, 0x1F, 0xC6, 0x2C,
0xBB, 0x01,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte connection_id)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (3) + padding
+ 0x03, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // tag kCADR
+ 'C', 'A', 'D', 'R',
+ // end offset 24
+ 0x18, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ // client address: 4.31.198.44:443
+ 0x02, 0x00,
+ 0x04, 0x1F, 0xC6, 0x2C,
+ 0xBB, 0x01,
+ };
// clang-format on
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.public_reset_packet_.get());
@@ -2139,20 +3033,41 @@
EXPECT_EQ(443, visitor_.public_reset_packet_->client_address.port());
// Now test framing boundaries.
- for (size_t i = 0; i < arraysize(packet); ++i) {
+ if (!FLAGS_quic_restart_flag_quic_big_endian_connection_id) {
+ for (size_t i = 0; i < arraysize(packet); ++i) {
+ string expected_error;
+ QUIC_DLOG(INFO) << "iteration: " << i;
+ if (i < kConnectionIdOffset) {
+ expected_error = "Unable to read public flags.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PACKET_HEADER);
+ } else if (i < kPublicResetPacketMessageTagOffset) {
+ expected_error = "Unable to read ConnectionId.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PACKET_HEADER);
+ } else {
+ expected_error = "Unable to read reset message.";
+ CheckProcessingFails(packet, i, expected_error,
+ QUIC_INVALID_PUBLIC_RST_PACKET);
+ }
+ }
+ return;
+ }
+
+ for (size_t i = 0; i < arraysize(packet_cid_be); ++i) {
string expected_error;
QUIC_DLOG(INFO) << "iteration: " << i;
if (i < kConnectionIdOffset) {
expected_error = "Unable to read public flags.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PACKET_HEADER);
} else if (i < kPublicResetPacketMessageTagOffset) {
expected_error = "Unable to read ConnectionId.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PACKET_HEADER);
} else {
expected_error = "Unable to read reset message.";
- CheckProcessingFails(packet, i, expected_error,
+ CheckProcessingFails(packet_cid_be, i, expected_error,
QUIC_INVALID_PUBLIC_RST_PACKET);
}
}
@@ -2170,11 +3085,28 @@
'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
'Q', '2', '.', '0',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version, 8 byte connection_id)
+ 0x39,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+ 'Q', '2', '.', '0',
+ };
// clang-format on
QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
@@ -2192,7 +3124,10 @@
expected_error = "Unable to read supported version in negotiation.";
error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
}
- CheckProcessingFails(packet, i, expected_error, error_code);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, error_code);
}
}
@@ -2208,11 +3143,28 @@
'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
'Q', '2', '.', '0',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version, 8 byte connection_id)
+ 0x3D,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+ 'Q', '2', '.', '0',
+ };
// clang-format on
QuicFramerPeer::SetPerspective(&framer_, Perspective::IS_CLIENT);
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
ASSERT_EQ(QUIC_NO_ERROR, framer_.error());
ASSERT_TRUE(visitor_.version_negotiation_packet_.get());
@@ -2230,7 +3182,10 @@
expected_error = "Unable to read supported version in negotiation.";
error_code = QUIC_INVALID_VERSION_NEGOTIATION_PACKET;
}
- CheckProcessingFails(packet, i, expected_error, error_code);
+ CheckProcessingFails(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ i, expected_error, error_code);
}
}
@@ -2258,19 +3213,41 @@
0x00,
0x00, 0x00, 0x00, 0x00
};
+
+ unsigned char packet_cid_be[kMaxPacketSize] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (padding frame)
+ 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
// clang-format on
uint64_t header_size = GetPacketHeaderSize(
framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+ memset((FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet) +
+ header_size + 1,
+ 0x00, kMaxPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, Build4ByteSequenceNumberPaddingFramePacket) {
@@ -2297,19 +3274,40 @@
0x00,
0x00, 0x00, 0x00, 0x00
};
+
+ unsigned char packet_cid_be[kMaxPacketSize] = {
+ // public flags (8 byte connection_id and 4 byte packet number)
+ 0x28,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+
+ // frame type (padding frame)
+ 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
// clang-format on
uint64_t header_size = GetPacketHeaderSize(
framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_4BYTE_PACKET_NUMBER);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+ memset((FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet) +
+ header_size + 1,
+ 0x00, kMaxPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, Build2ByteSequenceNumberPaddingFramePacket) {
@@ -2336,19 +3334,40 @@
0x00,
0x00, 0x00, 0x00, 0x00
};
+
+ unsigned char packet_cid_be[kMaxPacketSize] = {
+ // public flags (8 byte connection_id and 2 byte packet number)
+ 0x18,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A,
+
+ // frame type (padding frame)
+ 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
// clang-format on
uint64_t header_size = GetPacketHeaderSize(
framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_2BYTE_PACKET_NUMBER);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+ memset((FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet) +
+ header_size + 1,
+ 0x00, kMaxPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, Build1ByteSequenceNumberPaddingFramePacket) {
@@ -2375,19 +3394,40 @@
0x00,
0x00, 0x00, 0x00, 0x00
};
+
+ unsigned char packet_cid_be[kMaxPacketSize] = {
+ // public flags (8 byte connection_id and 1 byte packet number)
+ 0x08,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC,
+
+ // frame type (padding frame)
+ 0x00,
+ 0x00, 0x00, 0x00, 0x00
+ };
// clang-format on
uint64_t header_size = GetPacketHeaderSize(
framer_.version(), PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
!kIncludeDiversificationNonce, PACKET_1BYTE_PACKET_NUMBER);
- memset(packet + header_size + 1, 0x00, kMaxPacketSize - header_size - 1);
+ memset((FLAGS_quic_restart_flag_quic_big_endian_connection_id ? packet_cid_be
+ : packet) +
+ header_size + 1,
+ 0x00, kMaxPacketSize - header_size - 1);
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildStreamFramePacket) {
@@ -2425,14 +3465,41 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin and no length)
+ 0xDF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildStreamFramePacketWithVersionFlag) {
@@ -2452,7 +3519,28 @@
static_cast<unsigned char>(
FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D),
// connection_id
- 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+ 0x10, 0x32, 0x54, 0x76, 0x98, 0xBA, 0xDC, 0xFE,
+ // version tag
+ 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (stream frame with fin and no length)
+ 0xDF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32, 0xDC, 0xFE, 0x98, 0xBA,
+ // data
+ 'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd', '!',
+ };
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version, 8 byte connection_id)
+ static_cast<unsigned char>(
+ FLAGS_quic_reloadable_flag_quic_remove_v33_hacks2 ? 0x39 : 0x3D),
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
// version tag
'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
// packet number
@@ -2473,9 +3561,14 @@
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildVersionNegotiationPacket) {
@@ -2488,15 +3581,29 @@
// version tag
'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version, 8 byte connection_id)
+ 0x0D,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '0', GetQuicVersionDigitTens(), GetQuicVersionDigitOnes(),
+ };
// clang-format on
QuicConnectionId connection_id = kConnectionId;
std::unique_ptr<QuicEncryptedPacket> data(
framer_.BuildVersionNegotiationPacket(connection_id,
SupportedVersions(GetParam())));
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildAckFramePacketOneAckBlock) {
@@ -2535,14 +3642,40 @@
// num timestamps.
0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (ack frame)
+ // (no ack blocks, 2 byte largest observed, 2 byte block length)
+ 0x45,
+ // largest acked
+ 0x34, 0x12,
+ // Zero delta time.
+ 0x00, 0x00,
+ // first ack block length.
+ 0x34, 0x12,
+ // num timestamps.
+ 0x00,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildAckFramePacketMultipleAckBlocks) {
@@ -2602,14 +3735,58 @@
// num timestamps.
0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (ack frame)
+ // (has ack blocks, 2 byte largest observed, 2 byte block length)
+ 0x65,
+ // largest acked
+ 0x34, 0x12,
+ // Zero delta time.
+ 0x00, 0x00,
+ // num ack blocks ranges.
+ 0x04,
+ // first ack block length.
+ 0x01, 0x00,
+ // gap to next block.
+ 0x01,
+ // ack block length.
+ 0xaf, 0x0e,
+ // gap to next block.
+ 0xff,
+ // ack block length.
+ 0x00, 0x00,
+ // gap to next block.
+ 0x91,
+ // ack block length.
+ 0xea, 0x01,
+ // gap to next block.
+ 0x05,
+ // ack block length.
+ 0x04, 0x00,
+ // num timestamps.
+ 0x00,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildAckFramePacketMaxAckBlocks) {
@@ -2725,12 +3902,111 @@
0x00,
};
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+ // frame type (ack frame)
+ // (has ack blocks, 2 byte largest observed, 2 byte block length)
+ 0x65,
+ // largest acked
+ 0x34, 0x12,
+ // Zero delta time.
+ 0x00, 0x00,
+ // num ack blocks ranges.
+ 0xff,
+ // first ack block length.
+ 0xdd, 0x0f,
+ // 255 = 4 * 63 + 3
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ 0x01, 0x01, 0x00, 0x01, 0x01, 0x00, 0x01, 0x01, 0x00,
+ // num timestamps.
+ 0x00,
+ };
+ // clang-format on
+
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildNewStopWaitingPacket) {
@@ -2761,14 +4037,34 @@
0x1C, 0x00, 0x00, 0x00,
0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56, 0x34, 0x12,
+
+ // frame type (stop waiting frame)
+ 0x06,
+ // least packet number awaiting an ack, delta from packet number.
+ 0x1C, 0x00, 0x00, 0x00,
+ 0x00, 0x00,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildRstFramePacketQuic) {
@@ -2804,6 +4100,26 @@
// error code
0x08, 0x07, 0x06, 0x05,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (rst stream frame)
+ 0x01,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // sent byte offset
+ 0x01, 0x02, 0x03, 0x04,
+ 0x05, 0x06, 0x07, 0x08,
+ // error code
+ 0x08, 0x07, 0x06, 0x05,
+ };
// clang-format on
QuicFrames frames = {QuicFrame(&rst_frame)};
@@ -2811,9 +4127,14 @@
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildCloseFramePacket) {
@@ -2852,14 +4173,41 @@
'I', ' ', 'c', 'a',
'n',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (connection close frame)
+ 0x02,
+ // error code
+ 0x08, 0x07, 0x06, 0x05,
+ // error details length
+ 0x0d, 0x00,
+ // error details
+ 'b', 'e', 'c', 'a',
+ 'u', 's', 'e', ' ',
+ 'I', ' ', 'c', 'a',
+ 'n',
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildGoAwayPacket) {
@@ -2901,14 +4249,43 @@
'I', ' ', 'c', 'a',
'n',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (go away frame)
+ 0x03,
+ // error code
+ 0x08, 0x07, 0x06, 0x05,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // error details length
+ 0x0d, 0x00,
+ // error details
+ 'b', 'e', 'c', 'a',
+ 'u', 's', 'e', ' ',
+ 'I', ' ', 'c', 'a',
+ 'n',
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildWindowUpdatePacket) {
@@ -2943,14 +4320,37 @@
0x88, 0x77, 0x66, 0x55,
0x44, 0x33, 0x22, 0x11,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (window update frame)
+ 0x04,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // byte offset
+ 0x88, 0x77, 0x66, 0x55,
+ 0x44, 0x33, 0x22, 0x11,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildBlockedPacket) {
@@ -2981,14 +4381,34 @@
// stream id
0x04, 0x03, 0x02, 0x01,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (blocked frame)
+ 0x05,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildPingPacket) {
@@ -3014,14 +4434,32 @@
// frame type (ping frame)
0x07,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (ping frame)
+ 0x07,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
// Test that the MTU discovery packet is serialized correctly as a PING packet.
@@ -3048,14 +4486,32 @@
// frame type (ping frame)
0x07,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (ping frame)
+ 0x07,
+ };
// clang-format on
std::unique_ptr<QuicPacket> data(BuildDataPacket(header, frames));
ASSERT_TRUE(data != nullptr);
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
TEST_P(QuicFramerTest, BuildPublicResetPacketOld) {
@@ -3093,6 +4549,32 @@
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12, 0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte ConnectionId)
+ 0x0E,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (2) + padding
+ 0x02, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ };
+
unsigned char packet_no_rejected_packet_number[] = {
// public flags (public reset, 8 byte ConnectionId)
0x0E,
@@ -3111,6 +4593,24 @@
0x89, 0x67, 0x45, 0x23,
0x01, 0xEF, 0xCD, 0xAB,
};
+
+ unsigned char packet_no_rejected_packet_number_cid_be[] = {
+ // public flags (public reset, 8 byte ConnectionId)
+ 0x0E,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (1) + padding
+ 0x01, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ };
// clang-format on
std::unique_ptr<QuicEncryptedPacket> data(
@@ -3119,12 +4619,21 @@
if (FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) {
test::CompareCharArraysWithHexError(
"constructed packet", data->data(), data->length(),
- AsChars(packet_no_rejected_packet_number),
- arraysize(packet_no_rejected_packet_number));
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_no_rejected_packet_number_cid_be
+ : packet_no_rejected_packet_number),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_no_rejected_packet_number_cid_be)
+ : arraysize(packet_no_rejected_packet_number));
} else {
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
}
@@ -3163,6 +4672,32 @@
0xBC, 0x9A, 0x78, 0x56,
0x34, 0x12, 0x00, 0x00,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte ConnectionId)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (2) + padding
+ 0x02, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ };
+
unsigned char packet_no_rejected_packet_number[] = {
// public flags (public reset, 8 byte ConnectionId)
0x0A,
@@ -3181,6 +4716,24 @@
0x89, 0x67, 0x45, 0x23,
0x01, 0xEF, 0xCD, 0xAB,
};
+
+ unsigned char packet_no_rejected_packet_number_cid_be[] = {
+ // public flags (public reset, 8 byte ConnectionId)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (1) + padding
+ 0x01, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ };
// clang-format on
std::unique_ptr<QuicEncryptedPacket> data(
@@ -3190,12 +4743,21 @@
if (FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) {
test::CompareCharArraysWithHexError(
"constructed packet", data->data(), data->length(),
- AsChars(packet_no_rejected_packet_number),
- arraysize(packet_no_rejected_packet_number));
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_no_rejected_packet_number_cid_be
+ : packet_no_rejected_packet_number),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_no_rejected_packet_number_cid_be)
+ : arraysize(packet_no_rejected_packet_number));
} else {
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
}
@@ -3244,6 +4806,40 @@
0x7F, 0x00, 0x00, 0x01,
0x34, 0x12,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (public reset, 8 byte ConnectionId)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (3) + padding
+ 0x03, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kRSEQ
+ 'R', 'S', 'E', 'Q',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // tag kCADR
+ 'C', 'A', 'D', 'R',
+ // end offset 24
+ 0x18, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // rejected packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12, 0x00, 0x00,
+ // client address
+ 0x02, 0x00,
+ 0x7F, 0x00, 0x00, 0x01,
+ 0x34, 0x12,
+ };
+
unsigned char packet_no_rejected_packet_number[] = {
// public flags (public reset, 8 byte ConnectionId)
0x0A,
@@ -3269,7 +4865,33 @@
0x02, 0x00,
0x7F, 0x00, 0x00, 0x01,
0x34, 0x12,
- };
+ };
+
+ unsigned char packet_no_rejected_packet_number_cid_be[] = {
+ // public flags (public reset, 8 byte ConnectionId)
+ 0x0A,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // message tag (kPRST)
+ 'P', 'R', 'S', 'T',
+ // num_entries (2) + padding
+ 0x02, 0x00, 0x00, 0x00,
+ // tag kRNON
+ 'R', 'N', 'O', 'N',
+ // end offset 8
+ 0x08, 0x00, 0x00, 0x00,
+ // tag kCADR
+ 'C', 'A', 'D', 'R',
+ // end offset 16
+ 0x10, 0x00, 0x00, 0x00,
+ // nonce proof
+ 0x89, 0x67, 0x45, 0x23,
+ 0x01, 0xEF, 0xCD, 0xAB,
+ // client address
+ 0x02, 0x00,
+ 0x7F, 0x00, 0x00, 0x01,
+ 0x34, 0x12,
+ };
// clang-format on
std::unique_ptr<QuicEncryptedPacket> data(
@@ -3279,12 +4901,23 @@
if (FLAGS_quic_reloadable_flag_quic_remove_packet_number_from_public_reset) {
test::CompareCharArraysWithHexError(
"constructed packet", data->data(), data->length(),
- AsChars(packet_no_rejected_packet_number),
- arraysize(packet_no_rejected_packet_number));
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_no_rejected_packet_number_cid_be
+ : packet_no_rejected_packet_number),
+
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_no_rejected_packet_number_cid_be)
+ : arraysize(packet_no_rejected_packet_number));
} else {
- test::CompareCharArraysWithHexError("constructed packet", data->data(),
- data->length(), AsChars(packet),
- arraysize(packet));
+ test::CompareCharArraysWithHexError(
+ "constructed packet", data->data(), data->length(),
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
}
@@ -3307,12 +4940,33 @@
'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // redundancy
+ 'a', 'b', 'c', 'd',
+ 'e', 'f', 'g', 'h',
+ 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p',
+ };
// clang-format on
std::unique_ptr<QuicPacket> raw(new QuicPacket(
- AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
- !kIncludeVersion, !kIncludeDiversificationNonce,
- PACKET_6BYTE_PACKET_NUMBER));
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false, PACKET_8BYTE_CONNECTION_ID, !kIncludeVersion,
+ !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER));
char buffer[kMaxPacketSize];
size_t encrypted_length = framer_.EncryptPayload(
ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize);
@@ -3342,12 +4996,35 @@
'i', 'j', 'k', 'l',
'm', 'n', 'o', 'p',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (version, 8 byte connection_id)
+ 0x39,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // version tag
+ 'Q', '.', '1', '0',
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // redundancy
+ 'a', 'b', 'c', 'd',
+ 'e', 'f', 'g', 'h',
+ 'i', 'j', 'k', 'l',
+ 'm', 'n', 'o', 'p',
+ };
// clang-format on
std::unique_ptr<QuicPacket> raw(new QuicPacket(
- AsChars(packet), arraysize(packet), false, PACKET_8BYTE_CONNECTION_ID,
- kIncludeVersion, !kIncludeDiversificationNonce,
- PACKET_6BYTE_PACKET_NUMBER));
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false, PACKET_8BYTE_CONNECTION_ID, kIncludeVersion,
+ !kIncludeDiversificationNonce, PACKET_6BYTE_PACKET_NUMBER));
char buffer[kMaxPacketSize];
size_t encrypted_length = framer_.EncryptPayload(
ENCRYPTION_NONE, packet_number, *raw, buffer, kMaxPacketSize);
@@ -3498,6 +5175,44 @@
0xBE, 0x9A, 0x78, 0x56,
0x34, 0x12,
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x38,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+
+ // frame type (ack frame)
+ 0x40,
+ // least packet number awaiting an ack
+ 0xA0, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+ // largest observed packet number
+ 0xBF, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+ // num missing packets
+ 0x01,
+ // missing packet
+ 0xBE, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+ };
// clang-format on
MockFramerVisitor visitor;
@@ -3511,7 +5226,14 @@
EXPECT_CALL(visitor, OnUnauthenticatedHeader(_)).WillOnce(Return(true));
EXPECT_CALL(visitor, OnDecryptedPacket(_));
- QuicEncryptedPacket encrypted(AsChars(packet), arraysize(packet), false);
+ QuicEncryptedPacket encrypted(
+ AsChars(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet),
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet),
+ false);
EXPECT_TRUE(framer_.ProcessPacket(encrypted));
EXPECT_EQ(QUIC_NO_ERROR, framer_.error());
}
@@ -3654,9 +5376,40 @@
'o', ' ', 'w', 'o',
'r', 'l', 'd', '!',
};
+
+ unsigned char packet_cid_be[] = {
+ // public flags (8 byte connection_id)
+ 0x3C,
+ // connection_id
+ 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10,
+ // packet number
+ 0xBC, 0x9A, 0x78, 0x56,
+ 0x34, 0x12,
+ // private flags
+ 0x00,
+
+ // frame type (stream frame with fin)
+ 0xFF,
+ // stream id
+ 0x04, 0x03, 0x02, 0x01,
+ // offset
+ 0x54, 0x76, 0x10, 0x32,
+ 0xDC, 0xFE, 0x98, 0xBA,
+ // data length
+ 0x0c, 0x00,
+ // data
+ 'h', 'e', 'l', 'l',
+ 'o', ' ', 'w', 'o',
+ 'r', 'l', 'd', '!',
+ };
// clang-format on
- QuicFramerFuzzFunc(packet, arraysize(packet));
+ QuicFramerFuzzFunc(FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? packet_cid_be
+ : packet,
+ FLAGS_quic_restart_flag_quic_big_endian_connection_id
+ ? arraysize(packet_cid_be)
+ : arraysize(packet));
}
} // namespace test