Add retry_token to ReceivedPacketInfo. The token can be used later to extract cached network parameters. PiperOrigin-RevId: 405479428
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc index 02a0c8f..61f79dd 100644 --- a/quic/core/quic_dispatcher.cc +++ b/quic/core/quic_dispatcher.cc
@@ -266,16 +266,15 @@ QuicVersionLabel version_label; ParsedQuicVersion parsed_version = ParsedQuicVersion::Unsupported(); QuicConnectionId destination_connection_id, source_connection_id; - bool retry_token_present; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; std::string detailed_error; const QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( QuicEncryptedPacket(legacy_version_encapsulation_inner_packet.data(), legacy_version_encapsulation_inner_packet.length()), kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_present, &has_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); if (error != QUIC_NO_ERROR) { QUIC_DLOG(ERROR) << "Failed to parse Legacy Version Encapsulation inner packet:" @@ -389,14 +388,12 @@ absl::string_view(packet.data(), packet.length())); ReceivedPacketInfo packet_info(self_address, peer_address, packet); std::string detailed_error; - bool retry_token_present; - absl::string_view retry_token; const QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( packet, expected_server_connection_id_length_, &packet_info.form, &packet_info.long_packet_type, &packet_info.version_flag, &packet_info.use_length_prefix, &packet_info.version_label, &packet_info.version, &packet_info.destination_connection_id, - &packet_info.source_connection_id, &retry_token_present, &retry_token, + &packet_info.source_connection_id, &packet_info.retry_token, &detailed_error); if (error != QUIC_NO_ERROR) { // Packet has framing error.
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc index 2180962..276f59c 100644 --- a/quic/core/quic_dispatcher_test.cc +++ b/quic/core/quic_dispatcher_test.cc
@@ -635,15 +635,14 @@ QuicVersionLabel version_label; ParsedQuicVersion parsed_version = ParsedQuicVersion::Unsupported(); QuicConnectionId destination_connection_id, source_connection_id; - bool retry_token_present; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; std::string detailed_error; const QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( QuicEncryptedPacket(packets[0]->data(), packets[0]->length()), kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_present, &has_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); ASSERT_THAT(error, IsQuicNoError()) << detailed_error; EXPECT_EQ(format, GOOGLE_QUIC_PACKET); EXPECT_TRUE(version_present); @@ -651,7 +650,7 @@ EXPECT_EQ(parsed_version, LegacyVersionForEncapsulation()); EXPECT_EQ(destination_connection_id, server_connection_id); EXPECT_EQ(source_connection_id, EmptyQuicConnectionId()); - EXPECT_FALSE(retry_token_present); + EXPECT_FALSE(retry_token.has_value()); EXPECT_TRUE(detailed_error.empty()); // Processing the packet should create a new session.
diff --git a/quic/core/quic_framer.cc b/quic/core/quic_framer.cc index 4e0f639..7e78e64 100644 --- a/quic/core/quic_framer.cc +++ b/quic/core/quic_framer.cc
@@ -6591,16 +6591,12 @@ QuicErrorCode QuicFramer::ParsePublicHeaderDispatcher( const QuicEncryptedPacket& packet, uint8_t expected_destination_connection_id_length, - PacketHeaderFormat* format, - QuicLongHeaderType* long_packet_type, - bool* version_present, - bool* has_length_prefix, - QuicVersionLabel* version_label, - ParsedQuicVersion* parsed_version, + PacketHeaderFormat* format, QuicLongHeaderType* long_packet_type, + bool* version_present, bool* has_length_prefix, + QuicVersionLabel* version_label, ParsedQuicVersion* parsed_version, QuicConnectionId* destination_connection_id, QuicConnectionId* source_connection_id, - bool* retry_token_present, - absl::string_view* retry_token, + absl::optional<absl::string_view>* retry_token, std::string* detailed_error) { QuicDataReader reader(packet.data(), packet.length()); if (reader.IsDoneReading()) { @@ -6629,14 +6625,18 @@ const bool ietf_format = QuicUtils::IsIetfPacketHeader(first_byte); uint8_t unused_first_byte; QuicVariableLengthIntegerLength retry_token_length_length; + absl::string_view maybe_retry_token; QuicErrorCode error_code = ParsePublicHeader( &reader, expected_destination_connection_id_length, ietf_format, &unused_first_byte, format, version_present, has_length_prefix, version_label, parsed_version, destination_connection_id, source_connection_id, long_packet_type, &retry_token_length_length, - retry_token, detailed_error); - *retry_token_present = - retry_token_length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0; + &maybe_retry_token, detailed_error); + if (retry_token_length_length != VARIABLE_LENGTH_INTEGER_LENGTH_0) { + *retry_token = maybe_retry_token; + } else { + retry_token->reset(); + } return error_code; }
diff --git a/quic/core/quic_framer.h b/quic/core/quic_framer.h index b1fe416..2878888 100644 --- a/quic/core/quic_framer.h +++ b/quic/core/quic_framer.h
@@ -453,16 +453,12 @@ static QuicErrorCode ParsePublicHeaderDispatcher( const QuicEncryptedPacket& packet, uint8_t expected_destination_connection_id_length, - PacketHeaderFormat* format, - QuicLongHeaderType* long_packet_type, - bool* version_present, - bool* has_length_prefix, - QuicVersionLabel* version_label, - ParsedQuicVersion* parsed_version, + PacketHeaderFormat* format, QuicLongHeaderType* long_packet_type, + bool* version_present, bool* has_length_prefix, + QuicVersionLabel* version_label, ParsedQuicVersion* parsed_version, QuicConnectionId* destination_connection_id, QuicConnectionId* source_connection_id, - bool* retry_token_present, - absl::string_view* retry_token, + absl::optional<absl::string_view>* retry_token, std::string* detailed_error); // Serializes a packet containing |frames| into |buffer|.
diff --git a/quic/core/quic_framer_test.cc b/quic/core/quic_framer_test.cc index f630867..28b7c20 100644 --- a/quic/core/quic_framer_test.cc +++ b/quic/core/quic_framer_test.cc
@@ -1139,15 +1139,15 @@ QuicConnectionId destination_connection_id, source_connection_id; QuicVersionLabel version_label; std::string detailed_error; - bool retry_token_present, use_length_prefix; - absl::string_view retry_token; + bool use_length_prefix; + absl::optional<absl::string_view> retry_token; ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher( *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_flag, &use_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); - EXPECT_FALSE(retry_token_present); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); + EXPECT_FALSE(retry_token.has_value()); EXPECT_FALSE(use_length_prefix); EXPECT_THAT(error_code, IsQuicNoError()); EXPECT_EQ(GOOGLE_QUIC_PACKET, format); @@ -1204,17 +1204,17 @@ QuicConnectionId destination_connection_id, source_connection_id; QuicVersionLabel version_label; std::string detailed_error; - bool retry_token_present, use_length_prefix; - absl::string_view retry_token; + bool use_length_prefix; + absl::optional<absl::string_view> retry_token; ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher( *encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_flag, &use_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); EXPECT_THAT(error_code, IsQuicNoError()); EXPECT_EQ("", detailed_error); - EXPECT_FALSE(retry_token_present); + EXPECT_FALSE(retry_token.has_value()); EXPECT_FALSE(use_length_prefix); EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format); EXPECT_TRUE(version_flag); @@ -1284,16 +1284,16 @@ QuicConnectionId destination_connection_id, source_connection_id; QuicVersionLabel version_label = 0; std::string detailed_error = ""; - bool retry_token_present, use_length_prefix; - absl::string_view retry_token; + bool use_length_prefix; + absl::optional<absl::string_view> retry_token; ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher( encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_flag, &use_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); EXPECT_THAT(error_code, IsQuicNoError()); - EXPECT_FALSE(retry_token_present); + EXPECT_FALSE(retry_token.has_value()); EXPECT_EQ(framer_.version().HasLengthPrefixedConnectionIds(), use_length_prefix); EXPECT_EQ("", detailed_error); @@ -1312,14 +1312,14 @@ QuicConnectionId destination_connection_id, source_connection_id; QuicVersionLabel version_label = 0; std::string detailed_error = ""; - bool retry_token_present, use_length_prefix; - absl::string_view retry_token; + bool use_length_prefix; + absl::optional<absl::string_view> retry_token; ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); const QuicErrorCode error_code = QuicFramer::ParsePublicHeaderDispatcher( encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_flag, &use_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); EXPECT_EQ(error_code, QUIC_INVALID_PACKET_HEADER); EXPECT_EQ(detailed_error, "Invalid flags."); } @@ -14495,14 +14495,13 @@ ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); QuicConnectionId destination_connection_id = TestConnectionId(1); QuicConnectionId source_connection_id = TestConnectionId(2); - bool retry_token_present = true; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; std::string detailed_error = "foobar"; QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher( encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_present, &has_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); EXPECT_THAT(header_parse_result, IsQuicNoError()); EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format); EXPECT_TRUE(version_present); @@ -14510,7 +14509,7 @@ EXPECT_EQ(0xcabadaba, version_label); EXPECT_EQ(expected_destination_connection_id, destination_connection_id); EXPECT_EQ(EmptyQuicConnectionId(), source_connection_id); - EXPECT_FALSE(retry_token_present); + EXPECT_FALSE(retry_token.has_value()); EXPECT_EQ("", detailed_error); } @@ -14574,14 +14573,13 @@ ParsedQuicVersion parsed_version = UnsupportedQuicVersion(); QuicConnectionId destination_connection_id = TestConnectionId(1); QuicConnectionId source_connection_id = TestConnectionId(2); - bool retry_token_present = true; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; std::string detailed_error = "foobar"; QuicErrorCode header_parse_result = QuicFramer::ParsePublicHeaderDispatcher( encrypted, kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_present, &has_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); EXPECT_THAT(header_parse_result, IsQuicNoError()); EXPECT_EQ(IETF_QUIC_LONG_HEADER_PACKET, format); EXPECT_TRUE(version_present);
diff --git a/quic/core/quic_legacy_version_encapsulator_test.cc b/quic/core/quic_legacy_version_encapsulator_test.cc index 2f74d3a..b0e11a3 100644 --- a/quic/core/quic_legacy_version_encapsulator_test.cc +++ b/quic/core/quic_legacy_version_encapsulator_test.cc
@@ -41,15 +41,14 @@ QuicVersionLabel version_label; ParsedQuicVersion parsed_version = ParsedQuicVersion::Unsupported(); QuicConnectionId destination_connection_id, source_connection_id; - bool retry_token_present; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; std::string detailed_error; const QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( QuicEncryptedPacket(outer_buffer_, encapsulated_length_), kQuicDefaultConnectionIdLength, &format, &long_packet_type, &version_present, &has_length_prefix, &version_label, &parsed_version, - &destination_connection_id, &source_connection_id, &retry_token_present, - &retry_token, &detailed_error); + &destination_connection_id, &source_connection_id, &retry_token, + &detailed_error); ASSERT_THAT(error, IsQuicNoError()) << detailed_error; EXPECT_EQ(format, GOOGLE_QUIC_PACKET); EXPECT_TRUE(version_present); @@ -57,7 +56,7 @@ EXPECT_EQ(parsed_version, LegacyVersionForEncapsulation()); EXPECT_EQ(destination_connection_id, server_connection_id_); EXPECT_EQ(source_connection_id, EmptyQuicConnectionId()); - EXPECT_FALSE(retry_token_present); + EXPECT_FALSE(retry_token.has_value()); EXPECT_TRUE(detailed_error.empty()); }
diff --git a/quic/core/quic_packets.h b/quic/core/quic_packets.h index a3fc59d..c79e5a5 100644 --- a/quic/core/quic_packets.h +++ b/quic/core/quic_packets.h
@@ -455,6 +455,7 @@ ParsedQuicVersion version; QuicConnectionId destination_connection_id; QuicConnectionId source_connection_id; + absl::optional<absl::string_view> retry_token; }; } // namespace quic
diff --git a/quic/core/tls_chlo_extractor_test.cc b/quic/core/tls_chlo_extractor_test.cc index f5a6e85..8b5ee42 100644 --- a/quic/core/tls_chlo_extractor_test.cc +++ b/quic/core/tls_chlo_extractor_test.cc
@@ -30,16 +30,14 @@ QuicSocketAddress(TestPeerIPAddress(), kTestPort), QuicSocketAddress(TestPeerIPAddress(), kTestPort), *packet); std::string detailed_error; - bool retry_token_present; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; const QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( *packet, /*expected_destination_connection_id_length=*/0, &packet_info.form, &packet_info.long_packet_type, &packet_info.version_flag, &packet_info.use_length_prefix, &packet_info.version_label, &packet_info.version, &packet_info.destination_connection_id, - &packet_info.source_connection_id, &retry_token_present, &retry_token, - &detailed_error); + &packet_info.source_connection_id, &retry_token, &detailed_error); ASSERT_THAT(error, IsQuicNoError()) << detailed_error; tls_chlo_extractor_.IngestPacket(packet_info.version, packet_info.packet); } @@ -127,15 +125,14 @@ QuicSocketAddress(TestPeerIPAddress(), kTestPort), QuicSocketAddress(TestPeerIPAddress(), kTestPort), *packets_[0]); std::string detailed_error; - bool retry_token_present; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; const QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( *packets_[0], /*expected_destination_connection_id_length=*/0, &packet_info.form, &packet_info.long_packet_type, &packet_info.version_flag, &packet_info.use_length_prefix, &packet_info.version_label, &packet_info.version, &packet_info.destination_connection_id, &packet_info.source_connection_id, - &retry_token_present, &retry_token, &detailed_error); + &retry_token, &detailed_error); ASSERT_THAT(error, IsQuicNoError()) << detailed_error; other_extractor.IngestPacket(packet_info.version, packet_info.packet); // Remove the first packet from the list.
diff --git a/quic/test_tools/quic_test_utils.cc b/quic/test_tools/quic_test_utils.cc index 9a7fd85..da095dc 100644 --- a/quic/test_tools/quic_test_utils.cc +++ b/quic/test_tools/quic_test_utils.cc
@@ -1583,18 +1583,18 @@ QuicEncryptedPacket encrypted_packet(packet_bytes, packet_length); PacketHeaderFormat format; QuicLongHeaderType long_packet_type; - bool version_present, has_length_prefix, retry_token_present; + bool version_present, has_length_prefix; QuicVersionLabel version_label; ParsedQuicVersion parsed_version = ParsedQuicVersion::Unsupported(); QuicConnectionId destination_connection_id, source_connection_id; - absl::string_view retry_token; + absl::optional<absl::string_view> retry_token; std::string detailed_error; QuicErrorCode error = QuicFramer::ParsePublicHeaderDispatcher( encrypted_packet, /*expected_destination_connection_id_length=*/0, &format, &long_packet_type, &version_present, &has_length_prefix, &version_label, &parsed_version, &destination_connection_id, &source_connection_id, - &retry_token_present, &retry_token, &detailed_error); + &retry_token, &detailed_error); if (error != QUIC_NO_ERROR) { QUIC_BUG(quic_bug_10256_9) << "Failed to parse packet: " << detailed_error; return false;