| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "net/quic/quic_connection.h" | 5 #include "net/quic/quic_connection.h" |
| 6 | 6 |
| 7 #include <string.h> | 7 #include <string.h> |
| 8 #include <sys/types.h> | 8 #include <sys/types.h> |
| 9 #include <algorithm> | 9 #include <algorithm> |
| 10 #include <iterator> | 10 #include <iterator> |
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 293 // Packets that we cannot decrypt are dropped. | 293 // Packets that we cannot decrypt are dropped. |
| 294 // TODO(rch): add stats to measure this. | 294 // TODO(rch): add stats to measure this. |
| 295 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { | 295 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) { |
| 296 return; | 296 return; |
| 297 } | 297 } |
| 298 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); | 298 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); |
| 299 } | 299 } |
| 300 | 300 |
| 301 void QuicConnection::OnPacket() { | 301 void QuicConnection::OnPacket() { |
| 302 DCHECK(last_stream_frames_.empty() && | 302 DCHECK(last_stream_frames_.empty() && |
| 303 last_ack_frames_.empty() && |
| 304 last_congestion_frames_.empty() && |
| 305 last_stop_waiting_frames_.empty() && |
| 306 last_rst_frames_.empty() && |
| 303 last_goaway_frames_.empty() && | 307 last_goaway_frames_.empty() && |
| 304 last_window_update_frames_.empty() && | 308 last_window_update_frames_.empty() && |
| 305 last_blocked_frames_.empty() && | 309 last_blocked_frames_.empty() && |
| 306 last_rst_frames_.empty() && | 310 last_ping_frames_.empty() && |
| 307 last_ack_frames_.empty() && | 311 last_close_frames_.empty()); |
| 308 last_congestion_frames_.empty() && | |
| 309 last_stop_waiting_frames_.empty()); | |
| 310 } | 312 } |
| 311 | 313 |
| 312 void QuicConnection::OnPublicResetPacket( | 314 void QuicConnection::OnPublicResetPacket( |
| 313 const QuicPublicResetPacket& packet) { | 315 const QuicPublicResetPacket& packet) { |
| 314 if (debug_visitor_.get() != NULL) { | 316 if (debug_visitor_.get() != NULL) { |
| 315 debug_visitor_->OnPublicResetPacket(packet); | 317 debug_visitor_->OnPublicResetPacket(packet); |
| 316 } | 318 } |
| 317 CloseConnection(QUIC_PUBLIC_RESET, true); | 319 CloseConnection(QUIC_PUBLIC_RESET, true); |
| 318 | 320 |
| 319 DVLOG(1) << ENDPOINT << "Connection " << connection_id() | 321 DVLOG(1) << ENDPOINT << "Connection " << connection_id() |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 610 | 612 |
| 611 last_stop_waiting_frames_.push_back(frame); | 613 last_stop_waiting_frames_.push_back(frame); |
| 612 return connected_; | 614 return connected_; |
| 613 } | 615 } |
| 614 | 616 |
| 615 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { | 617 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
| 616 DCHECK(connected_); | 618 DCHECK(connected_); |
| 617 if (debug_visitor_.get() != NULL) { | 619 if (debug_visitor_.get() != NULL) { |
| 618 debug_visitor_->OnPingFrame(frame); | 620 debug_visitor_->OnPingFrame(frame); |
| 619 } | 621 } |
| 622 last_ping_frames_.push_back(frame); |
| 620 return true; | 623 return true; |
| 621 } | 624 } |
| 622 | 625 |
| 623 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { | 626 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
| 624 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { | 627 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { |
| 625 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" | 628 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" |
| 626 << incoming_ack.largest_observed << " vs " | 629 << incoming_ack.largest_observed << " vs " |
| 627 << packet_generator_.sequence_number(); | 630 << packet_generator_.sequence_number(); |
| 628 // We got an error for data we have not sent. Error out. | 631 // We got an error for data we have not sent. Error out. |
| 629 return false; | 632 return false; |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 771 | 774 |
| 772 void QuicConnection::OnPacketComplete() { | 775 void QuicConnection::OnPacketComplete() { |
| 773 // Don't do anything if this packet closed the connection. | 776 // Don't do anything if this packet closed the connection. |
| 774 if (!connected_) { | 777 if (!connected_) { |
| 775 ClearLastFrames(); | 778 ClearLastFrames(); |
| 776 return; | 779 return; |
| 777 } | 780 } |
| 778 | 781 |
| 779 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") | 782 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") |
| 780 << " packet " << last_header_.packet_sequence_number | 783 << " packet " << last_header_.packet_sequence_number |
| 781 << " with " << last_ack_frames_.size() << " acks, " | 784 << " with " << last_stream_frames_.size()<< " stream frames " |
| 785 << last_ack_frames_.size() << " acks, " |
| 782 << last_congestion_frames_.size() << " congestions, " | 786 << last_congestion_frames_.size() << " congestions, " |
| 783 << last_stop_waiting_frames_.size() << " stop_waiting, " | 787 << last_stop_waiting_frames_.size() << " stop_waiting, " |
| 788 << last_rst_frames_.size() << " rsts, " |
| 784 << last_goaway_frames_.size() << " goaways, " | 789 << last_goaway_frames_.size() << " goaways, " |
| 785 << last_window_update_frames_.size() << " window updates, " | 790 << last_window_update_frames_.size() << " window updates, " |
| 786 << last_blocked_frames_.size() << " blocked, " | 791 << last_blocked_frames_.size() << " blocked, " |
| 787 << last_rst_frames_.size() << " rsts, " | 792 << last_ping_frames_.size() << " pings, " |
| 788 << last_close_frames_.size() << " closes, " | 793 << last_close_frames_.size() << " closes, " |
| 789 << last_stream_frames_.size() | 794 << "for " << last_header_.public_header.connection_id; |
| 790 << " stream frames for " | |
| 791 << last_header_.public_header.connection_id; | |
| 792 | 795 |
| 793 // Call MaybeQueueAck() before recording the received packet, since we want | 796 // Call MaybeQueueAck() before recording the received packet, since we want |
| 794 // to trigger an ack if the newly received packet was previously missing. | 797 // to trigger an ack if the newly received packet was previously missing. |
| 795 MaybeQueueAck(); | 798 MaybeQueueAck(); |
| 796 | 799 |
| 797 // Record received or revived packet to populate ack info correctly before | 800 // Record received or revived packet to populate ack info correctly before |
| 798 // processing stream frames, since the processing may result in a response | 801 // processing stream frames, since the processing may result in a response |
| 799 // packet with a bundled ack. | 802 // packet with a bundled ack. |
| 800 if (last_packet_revived_) { | 803 if (last_packet_revived_) { |
| 801 received_packet_manager_.RecordPacketRevived( | 804 received_packet_manager_.RecordPacketRevived( |
| (...skipping 72 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 874 } | 877 } |
| 875 } | 878 } |
| 876 | 879 |
| 877 if (ack_queued_) { | 880 if (ack_queued_) { |
| 878 ack_alarm_->Cancel(); | 881 ack_alarm_->Cancel(); |
| 879 } | 882 } |
| 880 } | 883 } |
| 881 | 884 |
| 882 void QuicConnection::ClearLastFrames() { | 885 void QuicConnection::ClearLastFrames() { |
| 883 last_stream_frames_.clear(); | 886 last_stream_frames_.clear(); |
| 887 last_ack_frames_.clear(); |
| 888 last_congestion_frames_.clear(); |
| 889 last_stop_waiting_frames_.clear(); |
| 890 last_rst_frames_.clear(); |
| 884 last_goaway_frames_.clear(); | 891 last_goaway_frames_.clear(); |
| 885 last_window_update_frames_.clear(); | 892 last_window_update_frames_.clear(); |
| 886 last_blocked_frames_.clear(); | 893 last_blocked_frames_.clear(); |
| 887 last_rst_frames_.clear(); | 894 last_ping_frames_.clear(); |
| 888 last_ack_frames_.clear(); | 895 last_close_frames_.clear(); |
| 889 last_stop_waiting_frames_.clear(); | |
| 890 last_congestion_frames_.clear(); | |
| 891 } | 896 } |
| 892 | 897 |
| 893 QuicAckFrame* QuicConnection::CreateAckFrame() { | 898 QuicAckFrame* QuicConnection::CreateAckFrame() { |
| 894 QuicAckFrame* outgoing_ack = new QuicAckFrame(); | 899 QuicAckFrame* outgoing_ack = new QuicAckFrame(); |
| 895 received_packet_manager_.UpdateReceivedPacketInfo( | 900 received_packet_manager_.UpdateReceivedPacketInfo( |
| 896 outgoing_ack, clock_->ApproximateNow()); | 901 outgoing_ack, clock_->ApproximateNow()); |
| 897 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; | 902 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; |
| 898 return outgoing_ack; | 903 return outgoing_ack; |
| 899 } | 904 } |
| 900 | 905 |
| 901 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() { | 906 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() { |
| 902 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); | 907 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); |
| 903 } | 908 } |
| 904 | 909 |
| 905 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { | 910 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { |
| 906 QuicStopWaitingFrame stop_waiting; | 911 QuicStopWaitingFrame stop_waiting; |
| 907 UpdateStopWaiting(&stop_waiting); | 912 UpdateStopWaiting(&stop_waiting); |
| 908 return new QuicStopWaitingFrame(stop_waiting); | 913 return new QuicStopWaitingFrame(stop_waiting); |
| 909 } | 914 } |
| 910 | 915 |
| 911 bool QuicConnection::ShouldLastPacketInstigateAck() const { | 916 bool QuicConnection::ShouldLastPacketInstigateAck() const { |
| 912 if (!last_stream_frames_.empty() || | 917 if (!last_stream_frames_.empty() || |
| 913 !last_goaway_frames_.empty() || | 918 !last_goaway_frames_.empty() || |
| 914 !last_rst_frames_.empty() || | 919 !last_rst_frames_.empty() || |
| 915 !last_window_update_frames_.empty() || | 920 !last_window_update_frames_.empty() || |
| 916 !last_blocked_frames_.empty()) { | 921 !last_blocked_frames_.empty() || |
| 922 !last_ping_frames_.empty()) { |
| 917 return true; | 923 return true; |
| 918 } | 924 } |
| 919 | 925 |
| 920 if (!last_ack_frames_.empty() && last_ack_frames_.back().is_truncated) { | 926 if (!last_ack_frames_.empty() && last_ack_frames_.back().is_truncated) { |
| 921 return true; | 927 return true; |
| 922 } | 928 } |
| 923 return false; | 929 return false; |
| 924 } | 930 } |
| 925 | 931 |
| 926 void QuicConnection::UpdateStopWaitingCount() { | 932 void QuicConnection::UpdateStopWaitingCount() { |
| (...skipping 1058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1985 // If we changed the generator's batch state, restore original batch state. | 1991 // If we changed the generator's batch state, restore original batch state. |
| 1986 if (!already_in_batch_mode_) { | 1992 if (!already_in_batch_mode_) { |
| 1987 DVLOG(1) << "Leaving Batch Mode."; | 1993 DVLOG(1) << "Leaving Batch Mode."; |
| 1988 connection_->packet_generator_.FinishBatchOperations(); | 1994 connection_->packet_generator_.FinishBatchOperations(); |
| 1989 } | 1995 } |
| 1990 DCHECK_EQ(already_in_batch_mode_, | 1996 DCHECK_EQ(already_in_batch_mode_, |
| 1991 connection_->packet_generator_.InBatchMode()); | 1997 connection_->packet_generator_.InBatchMode()); |
| 1992 } | 1998 } |
| 1993 | 1999 |
| 1994 } // namespace net | 2000 } // namespace net |
| OLD | NEW |