In QUIC, add TimeWaitConnectionInfo to record necessary information of connections which are going to be added to time wait list. Refactor only, no functional change expected, not protected.
In the next change, I am going to add more info to this struct (e.g., srtt)
PiperOrigin-RevId: 325285116
Change-Id: Iee053bda3f66a77bd0a5bf39d8b1fbb6f6d930b2
diff --git a/quic/core/quic_dispatcher.cc b/quic/core/quic_dispatcher.cc
index cfad1ac..2ba39e2 100644
--- a/quic/core/quic_dispatcher.cc
+++ b/quic/core/quic_dispatcher.cc
@@ -155,9 +155,9 @@
SerializeConnectionClosePacket(error_code, error_details);
time_wait_list_manager_->AddConnectionIdToTimeWait(
- server_connection_id_, ietf_quic,
+ server_connection_id_,
QuicTimeWaitListManager::SEND_TERMINATION_PACKETS,
- collector_.packets());
+ TimeWaitConnectionInfo(ietf_quic, collector_.packets()));
}
private:
@@ -781,8 +781,10 @@
QUIC_CODE_COUNT(quic_v44_add_to_time_wait_list_with_stateless_reset);
}
time_wait_list_manager_->AddConnectionIdToTimeWait(
- it->first, VersionHasIetfInvariantHeader(connection->transport_version()),
- action, connection->termination_packets());
+ it->first, action,
+ TimeWaitConnectionInfo(
+ VersionHasIetfInvariantHeader(connection->transport_version()),
+ connection->termination_packets()));
session_map_.erase(it);
}
@@ -931,7 +933,8 @@
<< ", error_code:" << error_code
<< ", error_details:" << error_details;
time_wait_list_manager_->AddConnectionIdToTimeWait(
- server_connection_id, format != GOOGLE_QUIC_PACKET, action, nullptr);
+ server_connection_id, action,
+ TimeWaitConnectionInfo(format != GOOGLE_QUIC_PACKET, nullptr));
return;
}
@@ -965,8 +968,9 @@
/*ietf_quic=*/format != GOOGLE_QUIC_PACKET, use_length_prefix,
/*versions=*/{}));
time_wait_list_manager()->AddConnectionIdToTimeWait(
- server_connection_id, /*ietf_quic=*/format != GOOGLE_QUIC_PACKET,
- QuicTimeWaitListManager::SEND_TERMINATION_PACKETS, &termination_packets);
+ server_connection_id, QuicTimeWaitListManager::SEND_TERMINATION_PACKETS,
+ TimeWaitConnectionInfo(/*ietf_quic=*/format != GOOGLE_QUIC_PACKET,
+ &termination_packets));
}
bool QuicDispatcher::ShouldCreateSessionForUnknownVersion(
diff --git a/quic/core/quic_dispatcher_test.cc b/quic/core/quic_dispatcher_test.cc
index 0dcf035..282bef7 100644
--- a/quic/core/quic_dispatcher_test.cc
+++ b/quic/core/quic_dispatcher_test.cc
@@ -868,7 +868,7 @@
EXPECT_CALL(*time_wait_list_manager_,
ProcessPacket(_, _, connection_id, _, _))
.Times(1);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
ProcessPacket(client_address, connection_id, true, "data");
}
@@ -884,7 +884,7 @@
EXPECT_CALL(*time_wait_list_manager_,
ProcessPacket(_, _, connection_id, _, _))
.Times(0);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
EXPECT_CALL(*time_wait_list_manager_, SendPublicReset(_, _, _, _, _))
.Times(1);
@@ -903,7 +903,7 @@
QuicReceivedPacket packet2(valid_size_packet, 23, QuicTime::Zero());
EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
// Verify small packet is silently dropped.
EXPECT_CALL(*time_wait_list_manager_, SendPublicReset(_, _, _, _, _))
@@ -1049,7 +1049,7 @@
CreateQuicSession(TestConnectionId(1), _, client_address, _, _))
.Times(0);
EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
ProcessPacket(client_address, TestConnectionId(1), /*has_version_flag=*/true,
"data");
@@ -1068,7 +1068,7 @@
EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, client_address, _, _))
.Times(0);
EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
ProcessFirstFlight(client_address, EmptyQuicConnectionId());
}
@@ -1389,7 +1389,7 @@
EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
EXPECT_CALL(*time_wait_list_manager_, SendPacket(_, _, _)).Times(0);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
ProcessPacket(client_address, TestConnectionId(1), /*has_version_flag=*/true,
version_, SerializeCHLO(), /*full_padding=*/false,
@@ -1540,7 +1540,7 @@
QuicConnectionId connection_id = TestConnectionId(1);
EXPECT_CALL(*dispatcher_, CreateQuicSession(_, _, _, _, _)).Times(0);
EXPECT_CALL(*time_wait_list_manager_, ProcessPacket(_, _, _, _, _)).Times(0);
- EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*time_wait_list_manager_, AddConnectionIdToTimeWait(_, _, _))
.Times(0);
ProcessPacket(client_address, connection_id, true, "data",
diff --git a/quic/core/quic_time_wait_list_manager.cc b/quic/core/quic_time_wait_list_manager.cc
index 274364c..1a88048 100644
--- a/quic/core/quic_time_wait_list_manager.cc
+++ b/quic/core/quic_time_wait_list_manager.cc
@@ -47,6 +47,15 @@
QuicTimeWaitListManager* time_wait_list_manager_;
};
+TimeWaitConnectionInfo::TimeWaitConnectionInfo(
+ bool ietf_quic,
+ std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets)
+ : ietf_quic(ietf_quic) {
+ if (termination_packets != nullptr) {
+ this->termination_packets.swap(*termination_packets);
+ }
+}
+
QuicTimeWaitListManager::QuicTimeWaitListManager(
QuicPacketWriter* writer,
Visitor* visitor,
@@ -68,11 +77,11 @@
void QuicTimeWaitListManager::AddConnectionIdToTimeWait(
QuicConnectionId connection_id,
- bool ietf_quic,
TimeWaitAction action,
- std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets) {
- DCHECK(action != SEND_TERMINATION_PACKETS || termination_packets != nullptr);
- DCHECK(action != DO_NOTHING || ietf_quic);
+ TimeWaitConnectionInfo info) {
+ DCHECK(action != SEND_TERMINATION_PACKETS ||
+ !info.termination_packets.empty());
+ DCHECK(action != DO_NOTHING || info.ietf_quic);
int num_packets = 0;
auto it = connection_id_map_.find(connection_id);
const bool new_connection_id = it == connection_id_map_.end();
@@ -85,11 +94,8 @@
GetQuicFlag(FLAGS_quic_time_wait_list_max_connections);
DCHECK(connection_id_map_.empty() ||
num_connections() < static_cast<size_t>(max_connections));
- ConnectionIdData data(num_packets, ietf_quic, clock_->ApproximateNow(),
- action);
- if (termination_packets != nullptr) {
- data.termination_packets.swap(*termination_packets);
- }
+ ConnectionIdData data(num_packets, clock_->ApproximateNow(), action,
+ std::move(info));
connection_id_map_.emplace(std::make_pair(connection_id, std::move(data)));
if (new_connection_id) {
visitor_->OnConnectionAddedToTimeWaitList(connection_id);
@@ -135,39 +141,39 @@
QUIC_DLOG(INFO) << "Processing " << connection_id << " in time wait state: "
<< "header format=" << header_format
- << " ietf=" << connection_data->ietf_quic
+ << " ietf=" << connection_data->info.ietf_quic
<< ", action=" << connection_data->action
<< ", number termination packets="
- << connection_data->termination_packets.size();
+ << connection_data->info.termination_packets.size();
switch (connection_data->action) {
case SEND_TERMINATION_PACKETS:
- if (connection_data->termination_packets.empty()) {
+ if (connection_data->info.termination_packets.empty()) {
QUIC_BUG << "There are no termination packets.";
return;
}
switch (header_format) {
case IETF_QUIC_LONG_HEADER_PACKET:
- if (!connection_data->ietf_quic) {
+ if (!connection_data->info.ietf_quic) {
QUIC_CODE_COUNT(quic_received_long_header_packet_for_gquic);
}
break;
case IETF_QUIC_SHORT_HEADER_PACKET:
- if (!connection_data->ietf_quic) {
+ if (!connection_data->info.ietf_quic) {
QUIC_CODE_COUNT(quic_received_short_header_packet_for_gquic);
}
// Send stateless reset in response to short header packets.
SendPublicReset(self_address, peer_address, connection_id,
- connection_data->ietf_quic,
+ connection_data->info.ietf_quic,
std::move(packet_context));
return;
case GOOGLE_QUIC_PACKET:
- if (connection_data->ietf_quic) {
+ if (connection_data->info.ietf_quic) {
QUIC_CODE_COUNT(quic_received_gquic_packet_for_ietf_quic);
}
break;
}
- for (const auto& packet : connection_data->termination_packets) {
+ for (const auto& packet : connection_data->info.termination_packets) {
SendOrQueuePacket(std::make_unique<QueuedPacket>(
self_address, peer_address, packet->Clone()),
packet_context.get());
@@ -175,11 +181,11 @@
return;
case SEND_CONNECTION_CLOSE_PACKETS:
- if (connection_data->termination_packets.empty()) {
+ if (connection_data->info.termination_packets.empty()) {
QUIC_BUG << "There are no termination packets.";
return;
}
- for (const auto& packet : connection_data->termination_packets) {
+ for (const auto& packet : connection_data->info.termination_packets) {
SendOrQueuePacket(std::make_unique<QueuedPacket>(
self_address, peer_address, packet->Clone()),
packet_context.get());
@@ -191,11 +197,12 @@
QUIC_CODE_COUNT(quic_stateless_reset_long_header_packet);
}
SendPublicReset(self_address, peer_address, connection_id,
- connection_data->ietf_quic, std::move(packet_context));
+ connection_data->info.ietf_quic,
+ std::move(packet_context));
return;
case DO_NOTHING:
QUIC_CODE_COUNT(quic_time_wait_list_do_nothing);
- DCHECK(connection_data->ietf_quic);
+ DCHECK(connection_data->info.ietf_quic);
}
}
@@ -394,13 +401,13 @@
QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData(
int num_packets,
- bool ietf_quic,
QuicTime time_added,
- TimeWaitAction action)
+ TimeWaitAction action,
+ TimeWaitConnectionInfo info)
: num_packets(num_packets),
- ietf_quic(ietf_quic),
time_added(time_added),
- action(action) {}
+ action(action),
+ info(std::move(info)) {}
QuicTimeWaitListManager::ConnectionIdData::ConnectionIdData(
ConnectionIdData&& other) = default;
diff --git a/quic/core/quic_time_wait_list_manager.h b/quic/core/quic_time_wait_list_manager.h
index dcbc528..429566b 100644
--- a/quic/core/quic_time_wait_list_manager.h
+++ b/quic/core/quic_time_wait_list_manager.h
@@ -26,6 +26,22 @@
class QuicTimeWaitListManagerPeer;
} // namespace test
+// TimeWaitConnectionInfo comprises information of a connection which is in the
+// time wait list.
+struct QUIC_EXPORT_PRIVATE TimeWaitConnectionInfo {
+ TimeWaitConnectionInfo(
+ bool ietf_quic,
+ std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets);
+
+ TimeWaitConnectionInfo(const TimeWaitConnectionInfo& other) = delete;
+ TimeWaitConnectionInfo(TimeWaitConnectionInfo&& other) = default;
+
+ ~TimeWaitConnectionInfo() = default;
+
+ bool ietf_quic;
+ std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
+};
+
// Maintains a list of all connection_ids that have been recently closed. A
// connection_id lives in this state for time_wait_period_. All packets received
// for connection_ids in this state are handed over to the
@@ -78,11 +94,9 @@
// will be move from |termination_packets| and will become owned by the
// manager. |action| specifies what the time wait list manager should do when
// processing packets of the connection.
- virtual void AddConnectionIdToTimeWait(
- QuicConnectionId connection_id,
- bool ietf_quic,
- TimeWaitAction action,
- std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets);
+ virtual void AddConnectionIdToTimeWait(QuicConnectionId connection_id,
+ TimeWaitAction action,
+ TimeWaitConnectionInfo info);
// Returns true if the connection_id is in time wait state, false otherwise.
// Packets received for this connection_id should not lead to creation of new
@@ -234,9 +248,9 @@
// connection_id.
struct QUIC_NO_EXPORT ConnectionIdData {
ConnectionIdData(int num_packets,
- bool ietf_quic,
QuicTime time_added,
- TimeWaitAction action);
+ TimeWaitAction action,
+ TimeWaitConnectionInfo info);
ConnectionIdData(const ConnectionIdData& other) = delete;
ConnectionIdData(ConnectionIdData&& other);
@@ -244,11 +258,9 @@
~ConnectionIdData();
int num_packets;
- bool ietf_quic;
QuicTime time_added;
- // These packets may contain CONNECTION_CLOSE frames, or SREJ messages.
- std::vector<std::unique_ptr<QuicEncryptedPacket>> termination_packets;
TimeWaitAction action;
+ TimeWaitConnectionInfo info;
};
// QuicLinkedHashMap allows lookup by ConnectionId and traversal in add order.
diff --git a/quic/core/quic_time_wait_list_manager_test.cc b/quic/core/quic_time_wait_list_manager_test.cc
index 2f764de..34c2b1e 100644
--- a/quic/core/quic_time_wait_list_manager_test.cc
+++ b/quic/core/quic_time_wait_list_manager_test.cc
@@ -153,8 +153,8 @@
termination_packets.push_back(std::unique_ptr<QuicEncryptedPacket>(
new QuicEncryptedPacket(nullptr, 0, false)));
time_wait_list_manager_.AddConnectionIdToTimeWait(
- connection_id, false, QuicTimeWaitListManager::SEND_TERMINATION_PACKETS,
- &termination_packets);
+ connection_id, QuicTimeWaitListManager::SEND_TERMINATION_PACKETS,
+ TimeWaitConnectionInfo(false, &termination_packets));
}
void AddConnectionId(
@@ -163,8 +163,9 @@
QuicTimeWaitListManager::TimeWaitAction action,
std::vector<std::unique_ptr<QuicEncryptedPacket>>* packets) {
time_wait_list_manager_.AddConnectionIdToTimeWait(
- connection_id, VersionHasIetfInvariantHeader(version.transport_version),
- action, packets);
+ connection_id, action,
+ TimeWaitConnectionInfo(
+ VersionHasIetfInvariantHeader(version.transport_version), packets));
}
bool IsConnectionIdInTimeWait(QuicConnectionId connection_id) {
@@ -630,8 +631,8 @@
std::unique_ptr<QuicEncryptedPacket>(new QuicEncryptedPacket(
new char[kConnectionCloseLength], kConnectionCloseLength, true)));
time_wait_list_manager_.AddConnectionIdToTimeWait(
- connection_id_, /*ietf_quic=*/true,
- QuicTimeWaitListManager::SEND_TERMINATION_PACKETS, &termination_packets);
+ connection_id_, QuicTimeWaitListManager::SEND_TERMINATION_PACKETS,
+ TimeWaitConnectionInfo(/*ietf_quic=*/true, &termination_packets));
// Termination packet is not encrypted, instead, send stateless reset.
EXPECT_CALL(writer_,
@@ -654,9 +655,8 @@
new char[kConnectionCloseLength], kConnectionCloseLength, true)));
// Add a CONNECTION_CLOSE termination packet.
time_wait_list_manager_.AddConnectionIdToTimeWait(
- connection_id_, /*ietf_quic=*/true,
- QuicTimeWaitListManager::SEND_CONNECTION_CLOSE_PACKETS,
- &termination_packets);
+ connection_id_, QuicTimeWaitListManager::SEND_CONNECTION_CLOSE_PACKETS,
+ TimeWaitConnectionInfo(/*ietf_quic=*/true, &termination_packets));
EXPECT_CALL(writer_, WritePacket(_, kConnectionCloseLength,
self_address_.host(), peer_address_, _))
.WillOnce(Return(WriteResult(WRITE_STATUS_OK, 1)));
diff --git a/quic/test_tools/mock_quic_time_wait_list_manager.cc b/quic/test_tools/mock_quic_time_wait_list_manager.cc
index ec63558..310a22b 100644
--- a/quic/test_tools/mock_quic_time_wait_list_manager.cc
+++ b/quic/test_tools/mock_quic_time_wait_list_manager.cc
@@ -18,9 +18,9 @@
: QuicTimeWaitListManager(writer, visitor, clock, alarm_factory) {
// Though AddConnectionIdToTimeWait is mocked, we want to retain its
// functionality.
- EXPECT_CALL(*this, AddConnectionIdToTimeWait(_, _, _, _))
+ EXPECT_CALL(*this, AddConnectionIdToTimeWait(_, _, _))
.Times(testing::AnyNumber());
- ON_CALL(*this, AddConnectionIdToTimeWait(_, _, _, _))
+ ON_CALL(*this, AddConnectionIdToTimeWait(_, _, _))
.WillByDefault(
Invoke(this, &MockTimeWaitListManager::
QuicTimeWaitListManager_AddConnectionIdToTimeWait));
diff --git a/quic/test_tools/mock_quic_time_wait_list_manager.h b/quic/test_tools/mock_quic_time_wait_list_manager.h
index 3dae5ad..24c261f 100644
--- a/quic/test_tools/mock_quic_time_wait_list_manager.h
+++ b/quic/test_tools/mock_quic_time_wait_list_manager.h
@@ -22,18 +22,16 @@
MOCK_METHOD(void,
AddConnectionIdToTimeWait,
(QuicConnectionId connection_id,
- bool ietf_quic,
QuicTimeWaitListManager::TimeWaitAction action,
- std::vector<std::unique_ptr<QuicEncryptedPacket>>*),
+ quic::TimeWaitConnectionInfo info),
(override));
void QuicTimeWaitListManager_AddConnectionIdToTimeWait(
QuicConnectionId connection_id,
- bool ietf_quic,
QuicTimeWaitListManager::TimeWaitAction action,
- std::vector<std::unique_ptr<QuicEncryptedPacket>>* termination_packets) {
- QuicTimeWaitListManager::AddConnectionIdToTimeWait(
- connection_id, ietf_quic, action, termination_packets);
+ quic::TimeWaitConnectionInfo info) {
+ QuicTimeWaitListManager::AddConnectionIdToTimeWait(connection_id, action,
+ std::move(info));
}
MOCK_METHOD(void,