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 | 9 |
10 #include <algorithm> | 10 #include <algorithm> |
(...skipping 668 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
679 | 679 |
680 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { | 680 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { |
681 DCHECK(connected_); | 681 DCHECK(connected_); |
682 if (debug_visitor_ != nullptr) { | 682 if (debug_visitor_ != nullptr) { |
683 debug_visitor_->OnStreamFrame(frame); | 683 debug_visitor_->OnStreamFrame(frame); |
684 } | 684 } |
685 if (frame.stream_id != kCryptoStreamId && | 685 if (frame.stream_id != kCryptoStreamId && |
686 last_decrypted_packet_level_ == ENCRYPTION_NONE) { | 686 last_decrypted_packet_level_ == ENCRYPTION_NONE) { |
687 DLOG(WARNING) << ENDPOINT | 687 DLOG(WARNING) << ENDPOINT |
688 << "Received an unencrypted data frame: closing connection"; | 688 << "Received an unencrypted data frame: closing connection"; |
689 SendConnectionClose(QUIC_UNENCRYPTED_STREAM_DATA); | 689 SendConnectionCloseWithDetails(QUIC_UNENCRYPTED_STREAM_DATA, |
| 690 "Unencrypted stream data seen"); |
690 return false; | 691 return false; |
691 } | 692 } |
692 visitor_->OnStreamFrame(frame); | 693 visitor_->OnStreamFrame(frame); |
693 stats_.stream_bytes_received += frame.frame_length; | 694 stats_.stream_bytes_received += frame.frame_length; |
694 should_last_packet_instigate_acks_ = true; | 695 should_last_packet_instigate_acks_ = true; |
695 return connected_; | 696 return connected_; |
696 } | 697 } |
697 | 698 |
698 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { | 699 bool QuicConnection::OnAckFrame(const QuicAckFrame& incoming_ack) { |
699 DCHECK(connected_); | 700 DCHECK(connected_); |
700 if (debug_visitor_ != nullptr) { | 701 if (debug_visitor_ != nullptr) { |
701 debug_visitor_->OnAckFrame(incoming_ack); | 702 debug_visitor_->OnAckFrame(incoming_ack); |
702 } | 703 } |
703 DVLOG(1) << ENDPOINT << "OnAckFrame: " << incoming_ack; | 704 DVLOG(1) << ENDPOINT << "OnAckFrame: " << incoming_ack; |
704 | 705 |
705 if (last_header_.packet_number <= largest_seen_packet_with_ack_) { | 706 if (last_header_.packet_number <= largest_seen_packet_with_ack_) { |
706 DVLOG(1) << ENDPOINT << "Received an old ack frame: ignoring"; | 707 DVLOG(1) << ENDPOINT << "Received an old ack frame: ignoring"; |
707 return true; | 708 return true; |
708 } | 709 } |
709 | 710 |
710 if (!ValidateAckFrame(incoming_ack)) { | 711 const char* error = ValidateAckFrame(incoming_ack); |
711 SendConnectionClose(QUIC_INVALID_ACK_DATA); | 712 if (error != nullptr) { |
| 713 SendConnectionCloseWithDetails(QUIC_INVALID_ACK_DATA, error); |
712 return false; | 714 return false; |
713 } | 715 } |
714 | 716 |
715 if (FLAGS_quic_respect_send_alarm2 && send_alarm_->IsSet()) { | 717 if (FLAGS_quic_respect_send_alarm2 && send_alarm_->IsSet()) { |
716 send_alarm_->Cancel(); | 718 send_alarm_->Cancel(); |
717 } | 719 } |
718 ProcessAckFrame(incoming_ack); | 720 ProcessAckFrame(incoming_ack); |
719 if (incoming_ack.is_truncated) { | 721 if (incoming_ack.is_truncated) { |
720 should_last_packet_instigate_acks_ = true; | 722 should_last_packet_instigate_acks_ = true; |
721 } | 723 } |
(...skipping 30 matching lines...) Expand all Loading... |
752 } | 754 } |
753 | 755 |
754 bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { | 756 bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { |
755 DCHECK(connected_); | 757 DCHECK(connected_); |
756 | 758 |
757 if (last_header_.packet_number <= largest_seen_packet_with_stop_waiting_) { | 759 if (last_header_.packet_number <= largest_seen_packet_with_stop_waiting_) { |
758 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring"; | 760 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring"; |
759 return true; | 761 return true; |
760 } | 762 } |
761 | 763 |
762 if (!ValidateStopWaitingFrame(frame)) { | 764 const char* error = ValidateStopWaitingFrame(frame); |
763 SendConnectionClose(QUIC_INVALID_STOP_WAITING_DATA); | 765 if (error != nullptr) { |
| 766 SendConnectionCloseWithDetails(QUIC_INVALID_STOP_WAITING_DATA, error); |
764 return false; | 767 return false; |
765 } | 768 } |
766 | 769 |
767 if (debug_visitor_ != nullptr) { | 770 if (debug_visitor_ != nullptr) { |
768 debug_visitor_->OnStopWaitingFrame(frame); | 771 debug_visitor_->OnStopWaitingFrame(frame); |
769 } | 772 } |
770 | 773 |
771 last_stop_waiting_frame_ = frame; | 774 last_stop_waiting_frame_ = frame; |
772 return connected_; | 775 return connected_; |
773 } | 776 } |
774 | 777 |
775 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { | 778 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
776 DCHECK(connected_); | 779 DCHECK(connected_); |
777 if (debug_visitor_ != nullptr) { | 780 if (debug_visitor_ != nullptr) { |
778 debug_visitor_->OnPingFrame(frame); | 781 debug_visitor_->OnPingFrame(frame); |
779 } | 782 } |
780 should_last_packet_instigate_acks_ = true; | 783 should_last_packet_instigate_acks_ = true; |
781 return true; | 784 return true; |
782 } | 785 } |
783 | 786 |
784 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { | 787 const char* QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
785 if (incoming_ack.largest_observed > packet_generator_.packet_number()) { | 788 if (incoming_ack.largest_observed > packet_generator_.packet_number()) { |
786 LOG(WARNING) << ENDPOINT << "Peer's observed unsent packet:" | 789 LOG(WARNING) << ENDPOINT << "Peer's observed unsent packet:" |
787 << incoming_ack.largest_observed << " vs " | 790 << incoming_ack.largest_observed << " vs " |
788 << packet_generator_.packet_number(); | 791 << packet_generator_.packet_number(); |
789 // We got an error for data we have not sent. Error out. | 792 // We got an error for data we have not sent. Error out. |
790 return false; | 793 return "Largest observed too high"; |
791 } | 794 } |
792 | 795 |
793 if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) { | 796 if (incoming_ack.largest_observed < sent_packet_manager_.largest_observed()) { |
794 LOG(WARNING) << ENDPOINT << "Peer's largest_observed packet decreased:" | 797 LOG(WARNING) << ENDPOINT << "Peer's largest_observed packet decreased:" |
795 << incoming_ack.largest_observed << " vs " | 798 << incoming_ack.largest_observed << " vs " |
796 << sent_packet_manager_.largest_observed(); | 799 << sent_packet_manager_.largest_observed(); |
797 // A new ack has a diminished largest_observed value. Error out. | 800 // A new ack has a diminished largest_observed value. Error out. |
798 // If this was an old packet, we wouldn't even have checked. | 801 // If this was an old packet, we wouldn't even have checked. |
799 return false; | 802 return "Largest observed too low"; |
800 } | 803 } |
801 | 804 |
802 if (!incoming_ack.missing_packets.Empty() && | 805 if (!incoming_ack.missing_packets.Empty() && |
803 incoming_ack.missing_packets.Max() > incoming_ack.largest_observed) { | 806 incoming_ack.missing_packets.Max() > incoming_ack.largest_observed) { |
804 LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " | 807 LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " |
805 << incoming_ack.missing_packets.Max() | 808 << incoming_ack.missing_packets.Max() |
806 << " which is greater than largest observed: " | 809 << " which is greater than largest observed: " |
807 << incoming_ack.largest_observed; | 810 << incoming_ack.largest_observed; |
808 return false; | 811 return "Missing packet higher than largest observed"; |
809 } | 812 } |
810 | 813 |
811 if (!incoming_ack.missing_packets.Empty() && | 814 if (!incoming_ack.missing_packets.Empty() && |
812 incoming_ack.missing_packets.Min() < | 815 incoming_ack.missing_packets.Min() < |
813 sent_packet_manager_.least_packet_awaited_by_peer()) { | 816 sent_packet_manager_.least_packet_awaited_by_peer()) { |
814 LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " | 817 LOG(WARNING) << ENDPOINT << "Peer sent missing packet: " |
815 << incoming_ack.missing_packets.Min() | 818 << incoming_ack.missing_packets.Min() |
816 << " which is smaller than least_packet_awaited_by_peer_: " | 819 << " which is smaller than least_packet_awaited_by_peer_: " |
817 << sent_packet_manager_.least_packet_awaited_by_peer(); | 820 << sent_packet_manager_.least_packet_awaited_by_peer(); |
818 return false; | 821 return "Missing packet smaller than least awaited"; |
819 } | 822 } |
820 | 823 |
821 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, | 824 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, |
822 incoming_ack.missing_packets, | 825 incoming_ack.missing_packets, |
823 incoming_ack.entropy_hash)) { | 826 incoming_ack.entropy_hash)) { |
824 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."; | 827 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."; |
825 return false; | 828 return "Invalid entropy"; |
826 } | 829 } |
827 | 830 |
828 if (incoming_ack.latest_revived_packet != 0 && | 831 if (incoming_ack.latest_revived_packet != 0 && |
829 !incoming_ack.missing_packets.Contains( | 832 !incoming_ack.missing_packets.Contains( |
830 incoming_ack.latest_revived_packet)) { | 833 incoming_ack.latest_revived_packet)) { |
831 LOG(WARNING) << ENDPOINT | 834 LOG(WARNING) << ENDPOINT |
832 << "Peer specified revived packet which was not missing."; | 835 << "Peer specified revived packet which was not missing."; |
833 return false; | 836 return "Invalid revived packet"; |
834 } | 837 } |
835 return true; | 838 return nullptr; |
836 } | 839 } |
837 | 840 |
838 bool QuicConnection::ValidateStopWaitingFrame( | 841 const char* QuicConnection::ValidateStopWaitingFrame( |
839 const QuicStopWaitingFrame& stop_waiting) { | 842 const QuicStopWaitingFrame& stop_waiting) { |
840 if (stop_waiting.least_unacked < | 843 if (stop_waiting.least_unacked < |
841 received_packet_manager_.peer_least_packet_awaiting_ack()) { | 844 received_packet_manager_.peer_least_packet_awaiting_ack()) { |
842 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " | 845 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " |
843 << stop_waiting.least_unacked << " vs " | 846 << stop_waiting.least_unacked << " vs " |
844 << received_packet_manager_.peer_least_packet_awaiting_ack(); | 847 << received_packet_manager_.peer_least_packet_awaiting_ack(); |
845 // We never process old ack frames, so this number should only increase. | 848 // We never process old ack frames, so this number should only increase. |
846 return false; | 849 return "Least unacked too small"; |
847 } | 850 } |
848 | 851 |
849 if (stop_waiting.least_unacked > last_header_.packet_number) { | 852 if (stop_waiting.least_unacked > last_header_.packet_number) { |
850 DLOG(ERROR) << ENDPOINT | 853 DLOG(ERROR) << ENDPOINT |
851 << "Peer sent least_unacked:" << stop_waiting.least_unacked | 854 << "Peer sent least_unacked:" << stop_waiting.least_unacked |
852 << " greater than the enclosing packet number:" | 855 << " greater than the enclosing packet number:" |
853 << last_header_.packet_number; | 856 << last_header_.packet_number; |
854 return false; | 857 return "Least unacked too large"; |
855 } | 858 } |
856 | 859 |
857 return true; | 860 return nullptr; |
858 } | 861 } |
859 | 862 |
860 void QuicConnection::OnFecData(StringPiece redundancy) { | 863 void QuicConnection::OnFecData(StringPiece redundancy) { |
861 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); | 864 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group); |
862 DCHECK_NE(0u, last_header_.fec_group); | 865 DCHECK_NE(0u, last_header_.fec_group); |
863 QuicFecGroup* group = GetFecGroup(); | 866 QuicFecGroup* group = GetFecGroup(); |
864 if (group != nullptr) { | 867 if (group != nullptr) { |
865 group->UpdateFec(last_decrypted_packet_level_, last_header_, redundancy); | 868 group->UpdateFec(last_decrypted_packet_level_, last_header_, redundancy); |
866 } | 869 } |
867 } | 870 } |
(...skipping 1305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2173 // timeout handling. | 2176 // timeout handling. |
2174 QuicTime::Delta idle_duration = now.Subtract(time_of_last_packet); | 2177 QuicTime::Delta idle_duration = now.Subtract(time_of_last_packet); |
2175 DVLOG(1) << ENDPOINT << "last packet " | 2178 DVLOG(1) << ENDPOINT << "last packet " |
2176 << time_of_last_packet.ToDebuggingValue() | 2179 << time_of_last_packet.ToDebuggingValue() |
2177 << " now:" << now.ToDebuggingValue() | 2180 << " now:" << now.ToDebuggingValue() |
2178 << " idle_duration:" << idle_duration.ToMicroseconds() | 2181 << " idle_duration:" << idle_duration.ToMicroseconds() |
2179 << " idle_network_timeout: " | 2182 << " idle_network_timeout: " |
2180 << idle_network_timeout_.ToMicroseconds(); | 2183 << idle_network_timeout_.ToMicroseconds(); |
2181 if (idle_duration >= idle_network_timeout_) { | 2184 if (idle_duration >= idle_network_timeout_) { |
2182 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; | 2185 DVLOG(1) << ENDPOINT << "Connection timedout due to no network activity."; |
2183 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); | 2186 SendConnectionCloseWithDetails(QUIC_CONNECTION_TIMED_OUT, |
| 2187 "No recent network activity"); |
2184 return; | 2188 return; |
2185 } | 2189 } |
2186 | 2190 |
2187 if (!overall_connection_timeout_.IsInfinite()) { | 2191 if (!overall_connection_timeout_.IsInfinite()) { |
2188 QuicTime::Delta connected_duration = | 2192 QuicTime::Delta connected_duration = |
2189 now.Subtract(stats_.connection_creation_time); | 2193 now.Subtract(stats_.connection_creation_time); |
2190 DVLOG(1) << ENDPOINT << "connection time: " | 2194 DVLOG(1) << ENDPOINT << "connection time: " |
2191 << connected_duration.ToMicroseconds() << " overall timeout: " | 2195 << connected_duration.ToMicroseconds() << " overall timeout: " |
2192 << overall_connection_timeout_.ToMicroseconds(); | 2196 << overall_connection_timeout_.ToMicroseconds(); |
2193 if (connected_duration >= overall_connection_timeout_) { | 2197 if (connected_duration >= overall_connection_timeout_) { |
2194 DVLOG(1) << ENDPOINT << | 2198 DVLOG(1) << ENDPOINT |
2195 "Connection timedout due to overall connection timeout."; | 2199 << "Connection timedout due to overall connection timeout."; |
2196 SendConnectionClose(QUIC_CONNECTION_OVERALL_TIMED_OUT); | 2200 SendConnectionCloseWithDetails(QUIC_CONNECTION_OVERALL_TIMED_OUT, |
| 2201 "Overall timeout expired"); |
2197 return; | 2202 return; |
2198 } | 2203 } |
2199 } | 2204 } |
2200 | 2205 |
2201 SetTimeoutAlarm(); | 2206 SetTimeoutAlarm(); |
2202 } | 2207 } |
2203 | 2208 |
2204 void QuicConnection::SetTimeoutAlarm() { | 2209 void QuicConnection::SetTimeoutAlarm() { |
2205 QuicTime time_of_last_packet = max(time_of_last_received_packet_, | 2210 QuicTime time_of_last_packet = max(time_of_last_received_packet_, |
2206 time_of_last_sent_new_packet_); | 2211 time_of_last_sent_new_packet_); |
(...skipping 207 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2414 SendMtuDiscoveryPacket(mtu_discovery_target_); | 2419 SendMtuDiscoveryPacket(mtu_discovery_target_); |
2415 | 2420 |
2416 DCHECK(!mtu_discovery_alarm_->IsSet()); | 2421 DCHECK(!mtu_discovery_alarm_->IsSet()); |
2417 } | 2422 } |
2418 | 2423 |
2419 bool QuicConnection::ack_frame_updated() const { | 2424 bool QuicConnection::ack_frame_updated() const { |
2420 return received_packet_manager_.ack_frame_updated(); | 2425 return received_packet_manager_.ack_frame_updated(); |
2421 } | 2426 } |
2422 | 2427 |
2423 } // namespace net | 2428 } // namespace net |
OLD | NEW |