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 531 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
542 SendConnectionClose(QUIC_INVALID_ACK_DATA); | 542 SendConnectionClose(QUIC_INVALID_ACK_DATA); |
543 return false; | 543 return false; |
544 } | 544 } |
545 | 545 |
546 last_ack_frames_.push_back(incoming_ack); | 546 last_ack_frames_.push_back(incoming_ack); |
547 return connected_; | 547 return connected_; |
548 } | 548 } |
549 | 549 |
550 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { | 550 void QuicConnection::ProcessAckFrame(const QuicAckFrame& incoming_ack) { |
551 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; | 551 largest_seen_packet_with_ack_ = last_header_.packet_sequence_number; |
552 received_packet_manager_.UpdatePacketInformationReceivedByPeer( | 552 received_packet_manager_.UpdatePacketInformationReceivedByPeer(incoming_ack); |
553 incoming_ack.received_info); | |
554 | 553 |
555 sent_entropy_manager_.ClearEntropyBefore( | 554 sent_entropy_manager_.ClearEntropyBefore( |
556 received_packet_manager_.least_packet_awaited_by_peer() - 1); | 555 received_packet_manager_.least_packet_awaited_by_peer() - 1); |
557 | 556 |
558 sent_packet_manager_.OnIncomingAck(incoming_ack.received_info, | 557 sent_packet_manager_.OnIncomingAck(incoming_ack, |
559 time_of_last_received_packet_); | 558 time_of_last_received_packet_); |
560 if (sent_packet_manager_.HasPendingRetransmissions()) { | 559 if (sent_packet_manager_.HasPendingRetransmissions()) { |
561 WriteIfNotBlocked(); | 560 WriteIfNotBlocked(); |
562 } | 561 } |
563 | 562 |
564 // Always reset the retransmission alarm when an ack comes in, since we now | 563 // Always reset the retransmission alarm when an ack comes in, since we now |
565 // have a better estimate of the current rtt than when it was set. | 564 // have a better estimate of the current rtt than when it was set. |
566 retransmission_alarm_->Cancel(); | 565 retransmission_alarm_->Cancel(); |
567 QuicTime retransmission_time = | 566 QuicTime retransmission_time = |
568 sent_packet_manager_.GetRetransmissionTime(); | 567 sent_packet_manager_.GetRetransmissionTime(); |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
613 | 612 |
614 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { | 613 bool QuicConnection::OnPingFrame(const QuicPingFrame& frame) { |
615 DCHECK(connected_); | 614 DCHECK(connected_); |
616 if (debug_visitor_) { | 615 if (debug_visitor_) { |
617 debug_visitor_->OnPingFrame(frame); | 616 debug_visitor_->OnPingFrame(frame); |
618 } | 617 } |
619 return true; | 618 return true; |
620 } | 619 } |
621 | 620 |
622 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { | 621 bool QuicConnection::ValidateAckFrame(const QuicAckFrame& incoming_ack) { |
623 if (incoming_ack.received_info.largest_observed > | 622 if (incoming_ack.largest_observed > packet_generator_.sequence_number()) { |
624 packet_generator_.sequence_number()) { | |
625 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" | 623 DLOG(ERROR) << ENDPOINT << "Peer's observed unsent packet:" |
626 << incoming_ack.received_info.largest_observed << " vs " | 624 << incoming_ack.largest_observed << " vs " |
627 << packet_generator_.sequence_number(); | 625 << packet_generator_.sequence_number(); |
628 // We got an error for data we have not sent. Error out. | 626 // We got an error for data we have not sent. Error out. |
629 return false; | 627 return false; |
630 } | 628 } |
631 | 629 |
632 if (incoming_ack.received_info.largest_observed < | 630 if (incoming_ack.largest_observed < |
633 received_packet_manager_.peer_largest_observed_packet()) { | 631 received_packet_manager_.peer_largest_observed_packet()) { |
634 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" | 632 DLOG(ERROR) << ENDPOINT << "Peer's largest_observed packet decreased:" |
635 << incoming_ack.received_info.largest_observed << " vs " | 633 << incoming_ack.largest_observed << " vs " |
636 << received_packet_manager_.peer_largest_observed_packet(); | 634 << received_packet_manager_.peer_largest_observed_packet(); |
637 // A new ack has a diminished largest_observed value. Error out. | 635 // A new ack has a diminished largest_observed value. Error out. |
638 // If this was an old packet, we wouldn't even have checked. | 636 // If this was an old packet, we wouldn't even have checked. |
639 return false; | 637 return false; |
640 } | 638 } |
641 | 639 |
642 if (!incoming_ack.received_info.missing_packets.empty() && | 640 if (!incoming_ack.missing_packets.empty() && |
643 *incoming_ack.received_info.missing_packets.rbegin() > | 641 *incoming_ack.missing_packets.rbegin() > incoming_ack.largest_observed) { |
644 incoming_ack.received_info.largest_observed) { | |
645 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " | 642 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " |
646 << *incoming_ack.received_info.missing_packets.rbegin() | 643 << *incoming_ack.missing_packets.rbegin() |
647 << " which is greater than largest observed: " | 644 << " which is greater than largest observed: " |
648 << incoming_ack.received_info.largest_observed; | 645 << incoming_ack.largest_observed; |
649 return false; | 646 return false; |
650 } | 647 } |
651 | 648 |
652 if (!incoming_ack.received_info.missing_packets.empty() && | 649 if (!incoming_ack.missing_packets.empty() && |
653 *incoming_ack.received_info.missing_packets.begin() < | 650 *incoming_ack.missing_packets.begin() < |
654 received_packet_manager_.least_packet_awaited_by_peer()) { | 651 received_packet_manager_.least_packet_awaited_by_peer()) { |
655 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " | 652 DLOG(ERROR) << ENDPOINT << "Peer sent missing packet: " |
656 << *incoming_ack.received_info.missing_packets.begin() | 653 << *incoming_ack.missing_packets.begin() |
657 << " which is smaller than least_packet_awaited_by_peer_: " | 654 << " which is smaller than least_packet_awaited_by_peer_: " |
658 << received_packet_manager_.least_packet_awaited_by_peer(); | 655 << received_packet_manager_.least_packet_awaited_by_peer(); |
659 return false; | 656 return false; |
660 } | 657 } |
661 | 658 |
662 if (!sent_entropy_manager_.IsValidEntropy( | 659 if (!sent_entropy_manager_.IsValidEntropy( |
663 incoming_ack.received_info.largest_observed, | 660 incoming_ack.largest_observed, |
664 incoming_ack.received_info.missing_packets, | 661 incoming_ack.missing_packets, |
665 incoming_ack.received_info.entropy_hash)) { | 662 incoming_ack.entropy_hash)) { |
666 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; | 663 DLOG(ERROR) << ENDPOINT << "Peer sent invalid entropy."; |
667 return false; | 664 return false; |
668 } | 665 } |
669 | 666 |
670 for (SequenceNumberSet::const_iterator iter = | 667 for (SequenceNumberSet::const_iterator iter = |
671 incoming_ack.received_info.revived_packets.begin(); | 668 incoming_ack.revived_packets.begin(); |
672 iter != incoming_ack.received_info.revived_packets.end(); ++iter) { | 669 iter != incoming_ack.revived_packets.end(); ++iter) { |
673 if (!ContainsKey(incoming_ack.received_info.missing_packets, *iter)) { | 670 if (!ContainsKey(incoming_ack.missing_packets, *iter)) { |
674 DLOG(ERROR) << ENDPOINT | 671 DLOG(ERROR) << ENDPOINT |
675 << "Peer specified revived packet which was not missing."; | 672 << "Peer specified revived packet which was not missing."; |
676 return false; | 673 return false; |
677 } | 674 } |
678 } | 675 } |
679 return true; | 676 return true; |
680 } | 677 } |
681 | 678 |
682 bool QuicConnection::ValidateStopWaitingFrame( | 679 bool QuicConnection::ValidateStopWaitingFrame( |
683 const QuicStopWaitingFrame& stop_waiting) { | 680 const QuicStopWaitingFrame& stop_waiting) { |
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
888 last_blocked_frames_.clear(); | 885 last_blocked_frames_.clear(); |
889 last_rst_frames_.clear(); | 886 last_rst_frames_.clear(); |
890 last_ack_frames_.clear(); | 887 last_ack_frames_.clear(); |
891 last_stop_waiting_frames_.clear(); | 888 last_stop_waiting_frames_.clear(); |
892 last_congestion_frames_.clear(); | 889 last_congestion_frames_.clear(); |
893 } | 890 } |
894 | 891 |
895 QuicAckFrame* QuicConnection::CreateAckFrame() { | 892 QuicAckFrame* QuicConnection::CreateAckFrame() { |
896 QuicAckFrame* outgoing_ack = new QuicAckFrame(); | 893 QuicAckFrame* outgoing_ack = new QuicAckFrame(); |
897 received_packet_manager_.UpdateReceivedPacketInfo( | 894 received_packet_manager_.UpdateReceivedPacketInfo( |
898 &(outgoing_ack->received_info), clock_->ApproximateNow()); | 895 outgoing_ack, clock_->ApproximateNow()); |
899 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; | 896 DVLOG(1) << ENDPOINT << "Creating ack frame: " << *outgoing_ack; |
900 return outgoing_ack; | 897 return outgoing_ack; |
901 } | 898 } |
902 | 899 |
903 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() { | 900 QuicCongestionFeedbackFrame* QuicConnection::CreateFeedbackFrame() { |
904 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); | 901 return new QuicCongestionFeedbackFrame(outgoing_congestion_feedback_); |
905 } | 902 } |
906 | 903 |
907 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { | 904 QuicStopWaitingFrame* QuicConnection::CreateStopWaitingFrame() { |
908 QuicStopWaitingFrame stop_waiting; | 905 QuicStopWaitingFrame stop_waiting; |
909 UpdateStopWaiting(&stop_waiting); | 906 UpdateStopWaiting(&stop_waiting); |
910 return new QuicStopWaitingFrame(stop_waiting); | 907 return new QuicStopWaitingFrame(stop_waiting); |
911 } | 908 } |
912 | 909 |
913 bool QuicConnection::ShouldLastPacketInstigateAck() const { | 910 bool QuicConnection::ShouldLastPacketInstigateAck() const { |
914 if (!last_stream_frames_.empty() || | 911 if (!last_stream_frames_.empty() || |
915 !last_goaway_frames_.empty() || | 912 !last_goaway_frames_.empty() || |
916 !last_rst_frames_.empty() || | 913 !last_rst_frames_.empty() || |
917 !last_window_update_frames_.empty() || | 914 !last_window_update_frames_.empty() || |
918 !last_blocked_frames_.empty()) { | 915 !last_blocked_frames_.empty()) { |
919 return true; | 916 return true; |
920 } | 917 } |
921 | 918 |
922 if (!last_ack_frames_.empty() && | 919 if (!last_ack_frames_.empty() && last_ack_frames_.back().is_truncated) { |
923 last_ack_frames_.back().received_info.is_truncated) { | |
924 return true; | 920 return true; |
925 } | 921 } |
926 return false; | 922 return false; |
927 } | 923 } |
928 | 924 |
929 void QuicConnection::UpdateStopWaitingCount() { | 925 void QuicConnection::UpdateStopWaitingCount() { |
930 if (last_ack_frames_.empty()) { | 926 if (last_ack_frames_.empty()) { |
931 return; | 927 return; |
932 } | 928 } |
933 | 929 |
934 // If the peer is still waiting for a packet that we are no longer planning to | 930 // If the peer is still waiting for a packet that we are no longer planning to |
935 // send, send an ack to raise the high water mark. | 931 // send, send an ack to raise the high water mark. |
936 if (!last_ack_frames_.back().received_info.missing_packets.empty() && | 932 if (!last_ack_frames_.back().missing_packets.empty() && |
937 GetLeastUnacked() > | 933 GetLeastUnacked() > *last_ack_frames_.back().missing_packets.begin()) { |
938 *last_ack_frames_.back().received_info.missing_packets.begin()) { | |
939 ++stop_waiting_count_; | 934 ++stop_waiting_count_; |
940 } else { | 935 } else { |
941 stop_waiting_count_ = 0; | 936 stop_waiting_count_ = 0; |
942 } | 937 } |
943 } | 938 } |
944 | 939 |
945 QuicPacketSequenceNumber QuicConnection::GetLeastUnacked() const { | 940 QuicPacketSequenceNumber QuicConnection::GetLeastUnacked() const { |
946 return sent_packet_manager_.HasUnackedPackets() ? | 941 return sent_packet_manager_.HasUnackedPackets() ? |
947 sent_packet_manager_.GetLeastUnackedSentPacket() : | 942 sent_packet_manager_.GetLeastUnackedSentPacket() : |
948 packet_generator_.sequence_number() + 1; | 943 packet_generator_.sequence_number() + 1; |
(...skipping 1027 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1976 // If we changed the generator's batch state, restore original batch state. | 1971 // If we changed the generator's batch state, restore original batch state. |
1977 if (!already_in_batch_mode_) { | 1972 if (!already_in_batch_mode_) { |
1978 DVLOG(1) << "Leaving Batch Mode."; | 1973 DVLOG(1) << "Leaving Batch Mode."; |
1979 connection_->packet_generator_.FinishBatchOperations(); | 1974 connection_->packet_generator_.FinishBatchOperations(); |
1980 } | 1975 } |
1981 DCHECK_EQ(already_in_batch_mode_, | 1976 DCHECK_EQ(already_in_batch_mode_, |
1982 connection_->packet_generator_.InBatchMode()); | 1977 connection_->packet_generator_.InBatchMode()); |
1983 } | 1978 } |
1984 | 1979 |
1985 } // namespace net | 1980 } // namespace net |
OLD | NEW |