Chromium Code Reviews| Index: net/quic/quic_connection.cc |
| diff --git a/net/quic/quic_connection.cc b/net/quic/quic_connection.cc |
| index 2a091ca604552821cce8348785155502156f8cee..9594fdd6982bad4c8ed79e8843a67846d7196cfe 100644 |
| --- a/net/quic/quic_connection.cc |
| +++ b/net/quic/quic_connection.cc |
| @@ -220,7 +220,6 @@ QuicConnection::QuicConnection(QuicConnectionId connection_id, |
| resume_writes_alarm_(helper->CreateAlarm(new SendAlarm(this))), |
| timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
| ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), |
| - debug_visitor_(NULL), |
| packet_generator_(connection_id_, &framer_, random_generator_, this), |
| idle_network_timeout_( |
| QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), |
| @@ -309,7 +308,7 @@ void QuicConnection::OnPacket() { |
| void QuicConnection::OnPublicResetPacket( |
| const QuicPublicResetPacket& packet) { |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnPublicResetPacket(packet); |
| } |
| CloseConnection(QUIC_PUBLIC_RESET, true); |
| @@ -330,7 +329,7 @@ bool QuicConnection::OnProtocolVersionMismatch(QuicVersion received_version) { |
| } |
| DCHECK_NE(version(), received_version); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnProtocolVersionMismatch(received_version); |
| } |
| @@ -381,7 +380,7 @@ void QuicConnection::OnVersionNegotiationPacket( |
| CloseConnection(QUIC_INTERNAL_ERROR, false); |
| return; |
| } |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnVersionNegotiationPacket(packet); |
| } |
| @@ -429,7 +428,7 @@ void QuicConnection::OnDecryptedPacket(EncryptionLevel level) { |
| } |
| bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnPacketHeader(header); |
| } |
| @@ -444,6 +443,10 @@ bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
| DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected ConnectionId: " |
| << header.public_header.connection_id << " instead of " |
| << connection_id_; |
| + if (debug_visitor_.get() != NULL) { |
| + debug_visitor_->OnIncorrectConnectionId( |
| + header.public_header.connection_id); |
| + } |
| return false; |
| } |
| @@ -462,8 +465,9 @@ bool QuicConnection::OnPacketHeader(const QuicPacketHeader& header) { |
| header.packet_sequence_number)) { |
| DVLOG(1) << ENDPOINT << "Packet " << header.packet_sequence_number |
| << " no longer being waited for. Discarding."; |
| - // TODO(jri): Log reception of duplicate packets or packets the peer has |
| - // told us to stop waiting for. |
| + if (debug_visitor_.get() != NULL) { |
| + debug_visitor_->OnDuplicatePacket(header.packet_sequence_number); |
| + } |
| return false; |
| } |
| @@ -512,7 +516,7 @@ void QuicConnection::OnFecProtectedPayload(StringPiece payload) { |
| bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnStreamFrame(frame); |
| } |
| if (frame.stream_id != kCryptoStreamId && |
| @@ -528,7 +532,7 @@ bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { |
| bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnAckFrame(incoming_ack); |
| } |
| DVLOG(1) << ENDPOINT << "OnAckFrame: " << incoming_ack; |
| @@ -549,16 +553,12 @@ bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { |
| void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { |
| largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; |
| - received_packet_manager_.UpdatePacketInformationReceivedByPeer( |
| - incoming_ack.received_info); |
| - if (version() <= QUIC_VERSION_15) { |
| - ProcessStopWaitingFrame(incoming_ack.sent_info); |
| - } |
| + received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack); |
| sent_entropy_manager_.ClearEntropyBefore( |
| received_packet_manager_.least_packet_awaited_by_peer() - 1); |
| - sent_packet_manager_.OnIncomingAck(incoming_ack.received_info, |
| + sent_packet_manager_.OnIncomingAck(incoming_ack, |
| time_of_last_received_packet_); |
| if (sent_packet_manager_.HasPendingRetransmissions()) { |
| WriteIfNotBlocked(); |
| @@ -585,7 +585,7 @@ void QuicConnection::ProcessStopWaitingFrame( |
| bool QuicConnection::OnCongestionFeedbackFrame( |
| const QuicCongestionFeedbackFrame& feedback) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnCongestionFeedbackFrame(feedback); |
| } |
| last_congestion_frames_.push_back(feedback); |
| @@ -606,7 +606,7 @@ bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { |
| return false; |
| } |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnStopWaitingFrame(frame); |
| } |
| @@ -616,70 +616,62 @@ bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { |
| bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnPingFrame(frame); |
| } |
| return true; |
| } |
| bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
| - if (incoming_ack.received_info.largest_observed > |
| - packet_generator_.sequence_number()) { |
| + if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { |
| DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" |
| - << incoming_ack.received_info.largest_observed << " vs " |
| + << incoming_ack.largest_observed << " vs " |
| << packet_generator_.sequence_number(); |
| // We got an error for data we have not sent. Error out. |
| return false; |
| } |
| - if (incoming_ack.received_info.largest_observed < |
| + if (incoming_ack.largest_observed < |
| received_packet_manager_.peer_largest_observed_packet()) { |
| DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" |
| - << incoming_ack.received_info.largest_observed << " vs " |
| + << incoming_ack.largest_observed << " vs " |
| << received_packet_manager_.peer_largest_observed_packet(); |
| // 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; |
| } |
| - if (version() <= QUIC_VERSION_15) { |
| - if (!ValidateStopWaitingFrame(incoming_ack.sent_info)) { |
| - return false; |
| - } |
| - } |
| - |
| - if (!incoming_ack.received_info.missing_packets.empty() && |
| - *incoming_ack.received_info.missing_packets.rbegin() > |
| - incoming_ack.received_info.largest_observed) { |
| + if (!incoming_ack.missing_packets.empty() && |
| + *incoming_ack.missing_packets.rbegin() > incoming_ack.largest_observed) { |
| DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " |
| - << *incoming_ack.received_info.missing_packets.rbegin() |
| + << *incoming_ack.missing_packets.rbegin() |
| << " which is greater than largest observed: " |
| - << incoming_ack.received_info.largest_observed; |
| + << incoming_ack.largest_observed; |
| return false; |
| } |
| - if (!incoming_ack.received_info.missing_packets.empty() && |
| - *incoming_ack.received_info.missing_packets.begin() < |
| + if (!incoming_ack.missing_packets.empty() && |
| + *incoming_ack.missing_packets.begin() < |
| received_packet_manager_.least_packet_awaited_by_peer()) { |
| DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " |
| - << *incoming_ack.received_info.missing_packets.begin() |
| + << *incoming_ack.missing_packets.begin() |
| << " which is smaller than least_packet_awaited_by_peer_: " |
| << received_packet_manager_.least_packet_awaited_by_peer(); |
| return false; |
| } |
| if (!sent_entropy_manager_.IsValidEntropy( |
| - incoming_ack.received_info.largest_observed, |
| - incoming_ack.received_info.missing_packets, |
| - incoming_ack.received_info.entropy_hash)) { |
| + incoming_ack.largest_observed, |
| + incoming_ack.missing_packets, |
| + incoming_ack.entropy_hash)) { |
| DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; |
| return false; |
| } |
| for (SequenceNumberSet::const_iterator iter = |
| - incoming_ack.received_info.revived_packets.begin(); |
| - iter != incoming_ack.received_info.revived_packets.end(); ++iter) { |
| - if (!ContainsKey(incoming_ack.received_info.missing_packets, *iter)) { |
| + incoming_ack.revived_packets.begin(); |
| + iter != incoming_ack.revived_packets.end(); ++iter) { |
| + if (!ContainsKey(incoming_ack.missing_packets, *iter)) { |
| DLOG(ERROR) << ENDPOINT |
| << "Peer specified revived packet which was not missing."; |
| return false; |
| @@ -723,7 +715,7 @@ void QuicConnection::OnFecData(const QuicFecData& fec) { |
| bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnRstStreamFrame(frame); |
| } |
| DVLOG(1) << ENDPOINT << "Stream reset with error " |
| @@ -735,7 +727,7 @@ bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { |
| bool QuicConnection::OnConnectionCloseFrame( |
| const QuicConnectionCloseFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnConnectionCloseFrame(frame); |
| } |
| DVLOG(1) << ENDPOINT << "Connection " << connection_id() |
| @@ -748,7 +740,7 @@ bool QuicConnection::OnConnectionCloseFrame( |
| bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnGoAwayFrame(frame); |
| } |
| DVLOG(1) << ENDPOINT << "Go away received with error " |
| @@ -760,7 +752,7 @@ bool QuicConnection::OnGoAwayFrame(const QuicGoAwayFrame& frame) { |
| bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnWindowUpdateFrame(frame); |
| } |
| DVLOG(1) << ENDPOINT << "WindowUpdate received for stream: " |
| @@ -771,7 +763,7 @@ bool QuicConnection::OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame) { |
| bool QuicConnection::OnBlockedFrame(const QuicBlockedFrame& frame) { |
| DCHECK(connected_); |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnBlockedFrame(frame); |
| } |
| DVLOG(1) << ENDPOINT << "Blocked frame received for stream: " |
| @@ -904,8 +896,7 @@ void QuicConnection::ClearLastFrames() { |
| QuicAckFrame* QuicConnection::CreateAckFrame() { |
| QuicAckFrame* outgoing_ack = new QuicAckFrame(); |
| received_packet_manager_.UpdateReceivedPacketInfo( |
| - &(outgoing_ack->received_info), clock_->ApproximateNow()); |
| - UpdateStopWaiting(&(outgoing_ack->sent_info)); |
| + outgoing_ack, clock_->ApproximateNow()); |
| DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; |
| return outgoing_ack; |
| } |
| @@ -929,8 +920,7 @@ bool QuicConnection::ShouldLastPacketInstigateAck() const { |
| return true; |
| } |
| - if (!last_ack_frames_.empty() && |
| - last_ack_frames_.back().received_info.is_truncated) { |
| + if (!last_ack_frames_.empty() && last_ack_frames_.back().is_truncated) { |
| return true; |
| } |
| return false; |
| @@ -943,9 +933,8 @@ void QuicConnection::UpdateStopWaitingCount() { |
| // If the peer is still waiting for a packet that we are no longer planning to |
| // send, send an ack to raise the high water mark. |
| - if (!last_ack_frames_.back().received_info.missing_packets.empty() && |
| - GetLeastUnacked() > |
| - *last_ack_frames_.back().received_info.missing_packets.begin()) { |
| + if (!last_ack_frames_.back().missing_packets.empty() && |
| + GetLeastUnacked() > *last_ack_frames_.back().missing_packets.begin()) { |
| ++stop_waiting_count_; |
| } else { |
| stop_waiting_count_ = 0; |
| @@ -1089,7 +1078,7 @@ void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address, |
| if (!connected_) { |
| return; |
| } |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnPacketReceived(self_address, peer_address, packet); |
| } |
| last_packet_revived_ = false; |
| @@ -1103,10 +1092,13 @@ void QuicConnection::ProcessUdpPacket(const IPEndPoint& self_address, |
| if (!framer_.ProcessPacket(packet)) { |
| // If we are unable to decrypt this packet, it might be |
| // because the CHLO or SHLO packet was lost. |
| - if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && |
| - framer_.error() == QUIC_DECRYPTION_FAILURE && |
| - undecryptable_packets_.size() < kMaxUndecryptablePackets) { |
| - QueueUndecryptablePacket(packet); |
| + if (framer_.error() == QUIC_DECRYPTION_FAILURE) { |
| + if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && |
| + undecryptable_packets_.size() < kMaxUndecryptablePackets) { |
| + QueueUndecryptablePacket(packet); |
| + } else if (debug_visitor_.get() != NULL) { |
| + debug_visitor_->OnUndecryptablePacket(); |
| + } |
| } |
| DVLOG(1) << ENDPOINT << "Unable to process packet. Last packet processed: " |
| << last_header_.packet_sequence_number; |
| @@ -1261,7 +1253,7 @@ void QuicConnection::WritePendingRetransmissions() { |
| DVLOG(1) << ENDPOINT << "Retransmitting " << pending.sequence_number |
| << " as " << serialized_packet.sequence_number; |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnPacketRetransmitted( |
| pending.sequence_number, serialized_packet.sequence_number); |
| } |
| @@ -1410,7 +1402,7 @@ bool QuicConnection::WritePacket(QueuedPacket packet) { |
| if (result.error_code == ERR_IO_PENDING) { |
| DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); |
| } |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| // Pass the write result to the visitor. |
| debug_visitor_->OnPacketSent(sequence_number, |
| packet.encryption_level, |
| @@ -1583,7 +1575,7 @@ void QuicConnection::SendPing() { |
| if (retransmission_alarm_->IsSet()) { |
| return; |
| } |
| - if (version() <= QUIC_VERSION_16) { |
| + if (version() == QUIC_VERSION_16) { |
| // TODO(rch): remove this when we remove version 15 and 16. |
| // This is a horrible hideous hack which we should not support. |
| IOVector data; |
| @@ -1614,8 +1606,7 @@ void QuicConnection::SendAck() { |
| send_feedback = true; |
| } |
| - packet_generator_.SetShouldSendAck(send_feedback, |
| - version() > QUIC_VERSION_15); |
| + packet_generator_.SetShouldSendAck(send_feedback, true); |
| } |
| void QuicConnection::OnRetransmissionTimeout() { |
| @@ -1704,6 +1695,11 @@ void QuicConnection::MaybeProcessUndecryptablePackets() { |
| // new keys installed and hence any undecryptable packets will |
| // never be able to be decrypted. |
| if (encryption_level_ == ENCRYPTION_FORWARD_SECURE) { |
| + if (debug_visitor_ != NULL) { |
|
wtc
2014/08/04 23:28:12
debug_visitor_ => debug_visitor_.get()
ramant (doing other things)
2014/08/09 02:53:19
Done.
|
| + for (size_t i = 0; i < undecryptable_packets_.size(); ++i) { |
| + debug_visitor_->OnUndecryptablePacket(); |
|
wtc
2014/08/04 23:28:12
Nit: perhaps more efficient to pass the number of
ramant (doing other things)
2014/08/09 02:53:19
Good point. We are not using this method yet. Adde
|
| + } |
| + } |
| STLDeleteElements(&undecryptable_packets_); |
| } |
| } |
| @@ -1732,7 +1728,7 @@ void QuicConnection::MaybeProcessRevivedPacket() { |
| delete group; |
| last_packet_revived_ = true; |
| - if (debug_visitor_) { |
| + if (debug_visitor_.get() != NULL) { |
| debug_visitor_->OnRevivedPacket(revived_header, |
| StringPiece(revived_payload, len)); |
| } |