Index: net/quic/quic_connection.cc |
diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
index 3db67294fbf4b822d7299ac88b6537edd713a94a..6a0eed32e371fd138bed9f4e43bd57708bebd912 100644 |
--- a/net/quic/quic_connection.cc |
+++ b/net/quic/quic_connection.cc |
@@ -686,7 +686,8 @@ bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { |
last_decrypted_packet_level_ == ENCRYPTION_NONE) { |
DLOG(WARNING) << ENDPOINT |
<< "Received an unencrypted data frame: closing connection"; |
- SendConnectionClose(QUIC_UNENCRYPTED_STREAM_DATA); |
+ SendConnectionCloseWithDetails(QUIC_UNENCRYPTED_STREAM_DATA, |
+ "Unencrypted stream data seen"); |
return false; |
} |
visitor_->OnStreamFrame(frame); |
@@ -707,8 +708,9 @@ bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { |
return true; |
} |
- if (!ValidateAckFrame(incoming_ack)) { |
- SendConnectionClose(QUIC_INVALID_ACK_DATA); |
+ const char* error = ValidateAckFrame(incoming_ack); |
+ if (error != nullptr) { |
+ SendConnectionCloseWithDetails(QUIC_INVALID_ACK_DATA, error); |
return false; |
} |
@@ -759,8 +761,9 @@ bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { |
return true; |
} |
- if (!ValidateStopWaitingFrame(frame)) { |
- SendConnectionClose(QUIC_INVALID_STOP_WAITING_DATA); |
+ const char* error = ValidateStopWaitingFrame(frame); |
+ if (error != nullptr) { |
+ SendConnectionCloseWithDetails(QUIC_INVALID_STOP_WAITING_DATA, error); |
return false; |
} |
@@ -781,13 +784,13 @@ bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
return true; |
} |
-bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
+const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
if (incoming_ack.largest_observed > packet_generator_.packet_number()) { |
LOG(WARNING) << ENDPOINT << "Peer's observed unsent packet:" |
<< incoming_ack.largest_observed << " vs " |
<< packet_generator_.packet_number(); |
// We got an error for data we have not sent. Error out. |
- return false; |
+ return "Largest observed too high"; |
} |
if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) { |
@@ -796,7 +799,7 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
<< sent_packet_manager_.largest_observed(); |
// A new ack has a diminished largest_observed value. Error out. |
// If this was an old packet, we wouldn't even have checked. |
- return false; |
+ return "Largest observed too low"; |
} |
if (!incoming_ack.missing_packets.Empty() && |
@@ -805,7 +808,7 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
<< incoming_ack.missing_packets.Max() |
<< " which is greater than largest observed: " |
<< incoming_ack.largest_observed; |
- return false; |
+ return "Missing packet higher than largest observed"; |
} |
if (!incoming_ack.missing_packets.Empty() && |
@@ -815,14 +818,14 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
<< incoming_ack.missing_packets.Min() |
<< " which is smaller than least_packet_awaited_by_peer_: " |
<< sent_packet_manager_.least_packet_awaited_by_peer(); |
- return false; |
+ return "Missing packet smaller than least awaited"; |
} |
if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, |
incoming_ack.missing_packets, |
incoming_ack.entropy_hash)) { |
LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."; |
- return false; |
+ return "Invalid entropy"; |
} |
if (incoming_ack.latest_revived_packet != 0 && |
@@ -830,12 +833,12 @@ bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
incoming_ack.latest_revived_packet)) { |
LOG(WARNING) << ENDPOINT |
<< "Peer specified revived packet which was not missing."; |
- return false; |
+ return "Invalid revived packet"; |
} |
- return true; |
+ return nullptr; |
} |
-bool QuicConnection::ValidateStopWaitingFrame( |
+const char* QuicConnection::ValidateStopWaitingFrame( |
const QuicStopWaitingFrame& stop_waiting) { |
if (stop_waiting.least_unacked < |
received_packet_manager_.peer_least_packet_awaiting_ack()) { |
@@ -843,7 +846,7 @@ bool QuicConnection::ValidateStopWaitingFrame( |
<< stop_waiting.least_unacked << " vs " |
<< received_packet_manager_.peer_least_packet_awaiting_ack(); |
// We never process old ack frames, so this number should only increase. |
- return false; |
+ return "Least unacked too small"; |
} |
if (stop_waiting.least_unacked > last_header_.packet_number) { |
@@ -851,10 +854,10 @@ bool QuicConnection::ValidateStopWaitingFrame( |
<< "Peer sent least_unacked:" << stop_waiting.least_unacked |
<< " greater than the enclosing packet number:" |
<< last_header_.packet_number; |
- return false; |
+ return "Least unacked too large"; |
} |
- return true; |
+ return nullptr; |
} |
void QuicConnection::OnFecData(StringPiece redundancy) { |
@@ -2180,7 +2183,8 @@ void QuicConnection::CheckForTimeout() { |
<< idle_network_timeout_.ToMicroseconds(); |
if (idle_duration >= idle_network_timeout_) { |
DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; |
- SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); |
+ SendConnectionCloseWithDetails(QUIC_CONNECTION_TIMED_OUT, |
+ "No recent network activity"); |
return; |
} |
@@ -2191,9 +2195,10 @@ void QuicConnection::CheckForTimeout() { |
<< connected_duration.ToMicroseconds() << " overall timeout: " |
<< overall_connection_timeout_.ToMicroseconds(); |
if (connected_duration >= overall_connection_timeout_) { |
- DVLOG(1) << ENDPOINT << |
- "Connection timedout due to overall connection timeout."; |
- SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); |
+ DVLOG(1) << ENDPOINT |
+ << "Connection timedout due to overall connection timeout."; |
+ SendConnectionCloseWithDetails(QUIC_CONNECTION_OVERALL_TIMED_OUT, |
+ "Overall timeout expired"); |
return; |
} |
} |