QuicConnection methods call CloseConnection rather than
TearDownLocalConnectionState
Some of the QuicConnection methods call TearDownLocalConnectionState
rather than CloseConnection. This changes then all to call CloseConnection,
specifying ConnectionCloseBehavior::SILENT_CLOSE.
Some tests modified to expect calls to CloseConnection (preventing test failure due to unexpected calls). Before this CL the connection closing happened via internal calls directly to TearDownLocalConnectionState; now these calls go through CloseConnection and trigger the expect.
This is done in preparation for landing another CL adding IETF QUIC Connection Close functionality.
QuicConnection::OnUnrecoverableError (which is an override of QuicPacketCreator::OnUnrecoverableError) called TearDownLocalConnectionState. It had to be modified to call CloseConnection. OnUnrecoverableError has a ConnectionCloseSource parameter, which CloseConnection does not take. Thus the parameter was removed from OnUnrecoverableError. This is OK since all of the calls to OnUnrecoverableError specified FROM_SELF as the source. CloseConnection uses FROM_SELF as the source (unless the error code is a stateless reject or public reset).
gfe-relnote: No flag protection as it is only moving existing functionality around.
PiperOrigin-RevId: 250341745
Change-Id: Iafe499eda682f3db678d0eddbf7e2e3e4367cebd
diff --git a/quic/core/quic_connection.cc b/quic/core/quic_connection.cc
index db717b0..6afc62d 100644
--- a/quic/core/quic_connection.cc
+++ b/quic/core/quic_connection.cc
@@ -632,8 +632,8 @@
if (perspective_ == Perspective::IS_CLIENT) {
const std::string error_details = "Protocol version mismatch.";
QUIC_BUG << ENDPOINT << error_details;
- TearDownLocalConnectionState(QUIC_INTERNAL_ERROR, error_details,
- ConnectionCloseSource::FROM_SELF);
+ CloseConnection(QUIC_INTERNAL_ERROR, error_details,
+ ConnectionCloseBehavior::SILENT_CLOSE);
return false;
}
if (no_version_negotiation_) {
@@ -706,8 +706,8 @@
"Server received version negotiation packet.";
QUIC_BUG << error_details;
QUIC_CODE_COUNT(quic_tear_down_local_connection_on_version_negotiation);
- TearDownLocalConnectionState(QUIC_INTERNAL_ERROR, error_details,
- ConnectionCloseSource::FROM_SELF);
+ CloseConnection(QUIC_INTERNAL_ERROR, error_details,
+ ConnectionCloseBehavior::SILENT_CLOSE);
return;
}
if (debug_visitor_ != nullptr) {
@@ -724,9 +724,8 @@
"Server already supports client's version and should have accepted the "
"connection.";
QUIC_DLOG(WARNING) << error_details;
- TearDownLocalConnectionState(QUIC_INVALID_VERSION_NEGOTIATION_PACKET,
- error_details,
- ConnectionCloseSource::FROM_SELF);
+ CloseConnection(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, error_details,
+ ConnectionCloseBehavior::SILENT_CLOSE);
return;
}
@@ -766,8 +765,8 @@
ParsedQuicVersionToString(original_version) + " and " +
ParsedQuicVersionToString(version()) + " is currently unsupported.";
QUIC_DLOG(WARNING) << error_details;
- TearDownLocalConnectionState(QUIC_INVALID_VERSION, error_details,
- ConnectionCloseSource::FROM_SELF);
+ CloseConnection(QUIC_INVALID_VERSION, error_details,
+ ConnectionCloseBehavior::SILENT_CLOSE);
return;
}
@@ -2735,8 +2734,8 @@
QUIC_CODE_COUNT(
quic_tear_down_local_connection_on_write_error_non_ietf);
}
- TearDownLocalConnectionState(QUIC_PACKET_WRITE_ERROR, error_details,
- ConnectionCloseSource::FROM_SELF);
+ CloseConnection(QUIC_PACKET_WRITE_ERROR, error_details,
+ ConnectionCloseBehavior::SILENT_CLOSE);
}
}
@@ -2747,7 +2746,7 @@
void QuicConnection::OnSerializedPacket(SerializedPacket* serialized_packet) {
if (serialized_packet->encrypted_buffer == nullptr) {
// We failed to serialize the packet, so close the connection.
- // TearDownLocalConnectionState does not send close packet, so no infinite
+ // Specify that the close is silent, that no packet be sent, so no infinite
// loop here.
// TODO(ianswett): This is actually an internal error, not an
// encryption failure.
@@ -2758,10 +2757,9 @@
QUIC_CODE_COUNT(
quic_tear_down_local_connection_on_serialized_packet_non_ietf);
}
- TearDownLocalConnectionState(
- QUIC_ENCRYPTION_FAILURE,
- "Serialized packet does not have an encrypted buffer.",
- ConnectionCloseSource::FROM_SELF);
+ CloseConnection(QUIC_ENCRYPTION_FAILURE,
+ "Serialized packet does not have an encrypted buffer.",
+ ConnectionCloseBehavior::SILENT_CLOSE);
return;
}
@@ -2777,8 +2775,7 @@
}
void QuicConnection::OnUnrecoverableError(QuicErrorCode error,
- const std::string& error_details,
- ConnectionCloseSource source) {
+ const std::string& error_details) {
// The packet creator or generator encountered an unrecoverable error: tear
// down local connection state immediately.
if (transport_version() > QUIC_VERSION_43) {
@@ -2788,7 +2785,7 @@
QUIC_CODE_COUNT(
quic_tear_down_local_connection_on_unrecoverable_error_non_ietf);
}
- TearDownLocalConnectionState(error, error_details, source);
+ CloseConnection(error, error_details, ConnectionCloseBehavior::SILENT_CLOSE);
}
void QuicConnection::OnCongestionChange() {
@@ -3120,6 +3117,7 @@
// Regard stateless rejected connection as closed by server.
source = ConnectionCloseSource::FROM_PEER;
}
+
TearDownLocalConnectionState(error, error_details, source);
}