Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(75)

Side by Side Diff: net/quic/quic_connection.cc

Issue 1782143003: Remove FEC code from receive path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@115997404
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_logger.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 13 matching lines...) Expand all
24 #include "net/base/address_family.h" 24 #include "net/base/address_family.h"
25 #include "net/base/ip_address.h" 25 #include "net/base/ip_address.h"
26 #include "net/base/net_errors.h" 26 #include "net/base/net_errors.h"
27 #include "net/quic/crypto/crypto_protocol.h" 27 #include "net/quic/crypto/crypto_protocol.h"
28 #include "net/quic/crypto/quic_decrypter.h" 28 #include "net/quic/crypto/quic_decrypter.h"
29 #include "net/quic/crypto/quic_encrypter.h" 29 #include "net/quic/crypto/quic_encrypter.h"
30 #include "net/quic/proto/cached_network_parameters.pb.h" 30 #include "net/quic/proto/cached_network_parameters.pb.h"
31 #include "net/quic/quic_bandwidth.h" 31 #include "net/quic/quic_bandwidth.h"
32 #include "net/quic/quic_bug_tracker.h" 32 #include "net/quic/quic_bug_tracker.h"
33 #include "net/quic/quic_config.h" 33 #include "net/quic/quic_config.h"
34 #include "net/quic/quic_fec_group.h"
35 #include "net/quic/quic_flags.h" 34 #include "net/quic/quic_flags.h"
36 #include "net/quic/quic_packet_generator.h" 35 #include "net/quic/quic_packet_generator.h"
37 #include "net/quic/quic_utils.h" 36 #include "net/quic/quic_utils.h"
38 37
39 using base::StringPiece; 38 using base::StringPiece;
40 using base::StringPrintf; 39 using base::StringPrintf;
41 using base::hash_map; 40 using base::hash_map;
42 using base::hash_set; 41 using base::hash_set;
43 using std::list; 42 using std::list;
44 using std::make_pair; 43 using std::make_pair;
45 using std::max; 44 using std::max;
46 using std::min; 45 using std::min;
47 using std::numeric_limits; 46 using std::numeric_limits;
48 using std::set; 47 using std::set;
49 using std::string; 48 using std::string;
50 using std::vector; 49 using std::vector;
51 50
52 namespace net { 51 namespace net {
53 52
54 class QuicDecrypter; 53 class QuicDecrypter;
55 class QuicEncrypter; 54 class QuicEncrypter;
56 55
57 namespace { 56 namespace {
58 57
59 // The largest gap in packets we'll accept without closing the connection. 58 // The largest gap in packets we'll accept without closing the connection.
60 // This will likely have to be tuned. 59 // This will likely have to be tuned.
61 const QuicPacketNumber kMaxPacketGap = 5000; 60 const QuicPacketNumber kMaxPacketGap = 5000;
62 61
63 // Limit the number of FEC groups to two. If we get enough out of order packets
64 // that this becomes limiting, we can revisit.
65 const size_t kMaxFecGroups = 2;
66
67 // Maximum number of acks received before sending an ack in response. 62 // Maximum number of acks received before sending an ack in response.
68 const QuicPacketCount kMaxPacketsReceivedBeforeAckSend = 20; 63 const QuicPacketCount kMaxPacketsReceivedBeforeAckSend = 20;
69 64
70 // Maximum number of retransmittable packets received before sending an ack. 65 // Maximum number of retransmittable packets received before sending an ack.
71 const QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2; 66 const QuicPacketCount kDefaultRetransmittablePacketsBeforeAck = 2;
72 // Minimum number of packets received before ack decimation is enabled. 67 // Minimum number of packets received before ack decimation is enabled.
73 // This intends to avoid the beginning of slow start, when CWNDs may be 68 // This intends to avoid the beginning of slow start, when CWNDs may be
74 // rapidly increasing. 69 // rapidly increasing.
75 const QuicPacketCount kMinReceivedBeforeAckDecimation = 100; 70 const QuicPacketCount kMinReceivedBeforeAckDecimation = 100;
76 // Wait for up to 10 retransmittable packets before sending an ack. 71 // Wait for up to 10 retransmittable packets before sending an ack.
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
241 owns_writer_(owns_writer), 236 owns_writer_(owns_writer),
242 encryption_level_(ENCRYPTION_NONE), 237 encryption_level_(ENCRYPTION_NONE),
243 has_forward_secure_encrypter_(false), 238 has_forward_secure_encrypter_(false),
244 first_required_forward_secure_packet_(0), 239 first_required_forward_secure_packet_(0),
245 clock_(helper->GetClock()), 240 clock_(helper->GetClock()),
246 random_generator_(helper->GetRandomGenerator()), 241 random_generator_(helper->GetRandomGenerator()),
247 connection_id_(connection_id), 242 connection_id_(connection_id),
248 peer_address_(address), 243 peer_address_(address),
249 migrating_peer_port_(0), 244 migrating_peer_port_(0),
250 last_packet_decrypted_(false), 245 last_packet_decrypted_(false),
251 last_packet_revived_(false),
252 last_size_(0), 246 last_size_(0),
253 last_decrypted_packet_level_(ENCRYPTION_NONE), 247 last_decrypted_packet_level_(ENCRYPTION_NONE),
254 should_last_packet_instigate_acks_(false), 248 should_last_packet_instigate_acks_(false),
255 largest_seen_packet_with_ack_(0), 249 largest_seen_packet_with_ack_(0),
256 largest_seen_packet_with_stop_waiting_(0), 250 largest_seen_packet_with_stop_waiting_(0),
257 max_undecryptable_packets_(0), 251 max_undecryptable_packets_(0),
258 pending_version_negotiation_packet_(false), 252 pending_version_negotiation_packet_(false),
259 save_crypto_packets_as_termination_packets_(false), 253 save_crypto_packets_as_termination_packets_(false),
260 silent_close_enabled_(false), 254 silent_close_enabled_(false),
261 received_packet_manager_(&stats_), 255 received_packet_manager_(&stats_),
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 } 326 }
333 327
334 QuicConnection::~QuicConnection() { 328 QuicConnection::~QuicConnection() {
335 if (owns_writer_) { 329 if (owns_writer_) {
336 delete writer_; 330 delete writer_;
337 } 331 }
338 STLDeleteElements(&undecryptable_packets_); 332 STLDeleteElements(&undecryptable_packets_);
339 if (termination_packets_.get() != nullptr) { 333 if (termination_packets_.get() != nullptr) {
340 STLDeleteElements(termination_packets_.get()); 334 STLDeleteElements(termination_packets_.get());
341 } 335 }
342 STLDeleteValues(&group_map_);
343 ClearQueuedPackets(); 336 ClearQueuedPackets();
344 } 337 }
345 338
346 void QuicConnection::ClearQueuedPackets() { 339 void QuicConnection::ClearQueuedPackets() {
347 for (QueuedPacketList::iterator it = queued_packets_.begin(); 340 for (QueuedPacketList::iterator it = queued_packets_.begin();
348 it != queued_packets_.end(); ++it) { 341 it != queued_packets_.end(); ++it) {
349 // Delete the buffer before calling ClearSerializedPacket, which sets 342 // Delete the buffer before calling ClearSerializedPacket, which sets
350 // encrypted_buffer to nullptr. 343 // encrypted_buffer to nullptr.
351 delete[] it->encrypted_buffer; 344 delete[] it->encrypted_buffer;
352 QuicUtils::ClearSerializedPacket(&(*it)); 345 QuicUtils::ClearSerializedPacket(&(*it));
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
442 // Packets that we can not or have not decrypted are dropped. 435 // Packets that we can not or have not decrypted are dropped.
443 // TODO(rch): add stats to measure this. 436 // TODO(rch): add stats to measure this.
444 if (!connected_ || last_packet_decrypted_ == false) { 437 if (!connected_ || last_packet_decrypted_ == false) {
445 return; 438 return;
446 } 439 }
447 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error()); 440 SendConnectionCloseWithDetails(framer->error(), framer->detailed_error());
448 } 441 }
449 442
450 void QuicConnection::OnPacket() { 443 void QuicConnection::OnPacket() {
451 last_packet_decrypted_ = false; 444 last_packet_decrypted_ = false;
452 last_packet_revived_ = false;
453 } 445 }
454 446
455 void QuicConnection::OnPublicResetPacket(const QuicPublicResetPacket& packet) { 447 void QuicConnection::OnPublicResetPacket(const QuicPublicResetPacket& packet) {
456 // Check that any public reset packet with a different connection ID that was 448 // Check that any public reset packet with a different connection ID that was
457 // routed to this QuicConnection has been redirected before control reaches 449 // routed to this QuicConnection has been redirected before control reaches
458 // here. (Check for a bug regression.) 450 // here. (Check for a bug regression.)
459 DCHECK_EQ(connection_id_, packet.public_header.connection_id); 451 DCHECK_EQ(connection_id_, packet.public_header.connection_id);
460 if (debug_visitor_ != nullptr) { 452 if (debug_visitor_ != nullptr) {
461 debug_visitor_->OnPublicResetPacket(packet); 453 debug_visitor_->OnPublicResetPacket(packet);
462 } 454 }
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
560 return; 552 return;
561 } 553 }
562 554
563 DVLOG(1) << ENDPOINT 555 DVLOG(1) << ENDPOINT
564 << "Negotiated version: " << QuicVersionToString(version()); 556 << "Negotiated version: " << QuicVersionToString(version());
565 server_supported_versions_ = packet.versions; 557 server_supported_versions_ = packet.versions;
566 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS; 558 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS;
567 RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION); 559 RetransmitUnackedPackets(ALL_UNACKED_RETRANSMISSION);
568 } 560 }
569 561
570 void QuicConnection::OnRevivedPacket() {}
571
572 bool QuicConnection::OnUnauthenticatedPublicHeader( 562 bool QuicConnection::OnUnauthenticatedPublicHeader(
573 const QuicPacketPublicHeader& header) { 563 const QuicPacketPublicHeader& header) {
574 if (header.connection_id == connection_id_) { 564 if (header.connection_id == connection_id_) {
575 return true; 565 return true;
576 } 566 }
577 567
578 ++stats_.packets_dropped; 568 ++stats_.packets_dropped;
579 DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected ConnectionId: " 569 DVLOG(1) << ENDPOINT << "Ignoring packet from unexpected ConnectionId: "
580 << header.connection_id << " instead of " << connection_id_; 570 << header.connection_id << " instead of " << connection_id_;
581 if (debug_visitor_ != nullptr) { 571 if (debug_visitor_ != nullptr) {
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
648 638
649 MaybeMigrateConnectionToNewPeerAddress(); 639 MaybeMigrateConnectionToNewPeerAddress();
650 640
651 --stats_.packets_dropped; 641 --stats_.packets_dropped;
652 DVLOG(1) << ENDPOINT << "Received packet header: " << header; 642 DVLOG(1) << ENDPOINT << "Received packet header: " << header;
653 last_header_ = header; 643 last_header_ = header;
654 DCHECK(connected_); 644 DCHECK(connected_);
655 return true; 645 return true;
656 } 646 }
657 647
658 void QuicConnection::OnFecProtectedPayload(StringPiece payload) {
659 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
660 DCHECK_NE(0u, last_header_.fec_group);
661 QuicFecGroup* group = GetFecGroup();
662 if (group != nullptr) {
663 group->Update(last_decrypted_packet_level_, last_header_, payload);
664 }
665 }
666
667 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) { 648 bool QuicConnection::OnStreamFrame(const QuicStreamFrame& frame) {
668 DCHECK(connected_); 649 DCHECK(connected_);
669 if (debug_visitor_ != nullptr) { 650 if (debug_visitor_ != nullptr) {
670 debug_visitor_->OnStreamFrame(frame); 651 debug_visitor_->OnStreamFrame(frame);
671 } 652 }
672 if (frame.stream_id != kCryptoStreamId && 653 if (frame.stream_id != kCryptoStreamId &&
673 last_decrypted_packet_level_ == ENCRYPTION_NONE) { 654 last_decrypted_packet_level_ == ENCRYPTION_NONE) {
674 QUIC_BUG << ENDPOINT 655 QUIC_BUG << ENDPOINT
675 << "Received an unencrypted data frame: closing connection" 656 << "Received an unencrypted data frame: closing connection"
676 << " packet_number:" << last_header_.packet_number 657 << " packet_number:" << last_header_.packet_number
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
732 713
733 // Always reset the retransmission alarm when an ack comes in, since we now 714 // Always reset the retransmission alarm when an ack comes in, since we now
734 // have a better estimate of the current rtt than when it was set. 715 // have a better estimate of the current rtt than when it was set.
735 SetRetransmissionAlarm(); 716 SetRetransmissionAlarm();
736 } 717 }
737 718
738 void QuicConnection::ProcessStopWaitingFrame( 719 void QuicConnection::ProcessStopWaitingFrame(
739 const QuicStopWaitingFrame& stop_waiting) { 720 const QuicStopWaitingFrame& stop_waiting) {
740 largest_seen_packet_with_stop_waiting_ = last_header_.packet_number; 721 largest_seen_packet_with_stop_waiting_ = last_header_.packet_number;
741 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); 722 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting);
742 // Possibly close any FecGroups which are now irrelevant.
743 CloseFecGroupsBefore(stop_waiting.least_unacked + 1);
744 } 723 }
745 724
746 bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) { 725 bool QuicConnection::OnStopWaitingFrame(const QuicStopWaitingFrame& frame) {
747 DCHECK(connected_); 726 DCHECK(connected_);
748 727
749 if (last_header_.packet_number <= largest_seen_packet_with_stop_waiting_) { 728 if (last_header_.packet_number <= largest_seen_packet_with_stop_waiting_) {
750 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring"; 729 DVLOG(1) << ENDPOINT << "Received an old stop waiting frame: ignoring";
751 return true; 730 return true;
752 } 731 }
753 732
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 792
814 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed, 793 if (!sent_entropy_manager_.IsValidEntropy(incoming_ack.largest_observed,
815 incoming_ack.missing_packets, 794 incoming_ack.missing_packets,
816 incoming_ack.entropy_hash)) { 795 incoming_ack.entropy_hash)) {
817 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy." 796 LOG(WARNING) << ENDPOINT << "Peer sent invalid entropy."
818 << " largest_observed:" << incoming_ack.largest_observed 797 << " largest_observed:" << incoming_ack.largest_observed
819 << " last_received:" << last_header_.packet_number; 798 << " last_received:" << last_header_.packet_number;
820 return "Invalid entropy"; 799 return "Invalid entropy";
821 } 800 }
822 801
823 if (incoming_ack.latest_revived_packet != 0 &&
824 !incoming_ack.missing_packets.Contains(
825 incoming_ack.latest_revived_packet)) {
826 LOG(WARNING) << ENDPOINT
827 << "Peer specified revived packet which was not missing."
828 << " revived_packet:" << incoming_ack.latest_revived_packet;
829 return "Invalid revived packet";
830 }
831 return nullptr; 802 return nullptr;
832 } 803 }
833 804
834 const char* QuicConnection::ValidateStopWaitingFrame( 805 const char* QuicConnection::ValidateStopWaitingFrame(
835 const QuicStopWaitingFrame& stop_waiting) { 806 const QuicStopWaitingFrame& stop_waiting) {
836 if (stop_waiting.least_unacked < 807 if (stop_waiting.least_unacked <
837 received_packet_manager_.peer_least_packet_awaiting_ack()) { 808 received_packet_manager_.peer_least_packet_awaiting_ack()) {
838 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: " 809 DLOG(ERROR) << ENDPOINT << "Peer's sent low least_unacked: "
839 << stop_waiting.least_unacked << " vs " 810 << stop_waiting.least_unacked << " vs "
840 << received_packet_manager_.peer_least_packet_awaiting_ack(); 811 << received_packet_manager_.peer_least_packet_awaiting_ack();
841 // We never process old ack frames, so this number should only increase. 812 // We never process old ack frames, so this number should only increase.
842 return "Least unacked too small"; 813 return "Least unacked too small";
843 } 814 }
844 815
845 if (stop_waiting.least_unacked > last_header_.packet_number) { 816 if (stop_waiting.least_unacked > last_header_.packet_number) {
846 DLOG(ERROR) << ENDPOINT 817 DLOG(ERROR) << ENDPOINT
847 << "Peer sent least_unacked:" << stop_waiting.least_unacked 818 << "Peer sent least_unacked:" << stop_waiting.least_unacked
848 << " greater than the enclosing packet number:" 819 << " greater than the enclosing packet number:"
849 << last_header_.packet_number; 820 << last_header_.packet_number;
850 return "Least unacked too large"; 821 return "Least unacked too large";
851 } 822 }
852 823
853 return nullptr; 824 return nullptr;
854 } 825 }
855 826
856 void QuicConnection::OnFecData(StringPiece redundancy) {
857 DCHECK_EQ(IN_FEC_GROUP, last_header_.is_in_fec_group);
858 DCHECK_NE(0u, last_header_.fec_group);
859 QuicFecGroup* group = GetFecGroup();
860 if (group != nullptr) {
861 group->UpdateFec(last_decrypted_packet_level_, last_header_, redundancy);
862 }
863 }
864
865 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) { 827 bool QuicConnection::OnRstStreamFrame(const QuicRstStreamFrame& frame) {
866 DCHECK(connected_); 828 DCHECK(connected_);
867 if (debug_visitor_ != nullptr) { 829 if (debug_visitor_ != nullptr) {
868 debug_visitor_->OnRstStreamFrame(frame); 830 debug_visitor_->OnRstStreamFrame(frame);
869 } 831 }
870 DVLOG(1) << ENDPOINT 832 DVLOG(1) << ENDPOINT
871 << "RST_STREAM_FRAME received for stream: " << frame.stream_id 833 << "RST_STREAM_FRAME received for stream: " << frame.stream_id
872 << " with error: " 834 << " with error: "
873 << QuicUtils::StreamErrorToString(frame.error_code); 835 << QuicUtils::StreamErrorToString(frame.error_code);
874 visitor_->OnRstStream(frame); 836 visitor_->OnRstStream(frame);
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 return connected_; 908 return connected_;
947 } 909 }
948 910
949 void QuicConnection::OnPacketComplete() { 911 void QuicConnection::OnPacketComplete() {
950 // Don't do anything if this packet closed the connection. 912 // Don't do anything if this packet closed the connection.
951 if (!connected_) { 913 if (!connected_) {
952 ClearLastFrames(); 914 ClearLastFrames();
953 return; 915 return;
954 } 916 }
955 917
956 DVLOG(1) << ENDPOINT << (last_packet_revived_ ? "Revived" : "Got") 918 DVLOG(1) << ENDPOINT << "Got packet " << last_header_.packet_number << " for "
957 << " packet " << last_header_.packet_number << " for "
958 << last_header_.public_header.connection_id; 919 << last_header_.public_header.connection_id;
959 920
960 // An ack will be sent if a missing retransmittable packet was received; 921 // An ack will be sent if a missing retransmittable packet was received;
961 const bool was_missing = 922 const bool was_missing =
962 should_last_packet_instigate_acks_ && 923 should_last_packet_instigate_acks_ &&
963 received_packet_manager_.IsMissing(last_header_.packet_number); 924 received_packet_manager_.IsMissing(last_header_.packet_number);
964 925
965 // Record received or revived packet to populate ack info correctly before 926 // Record received to populate ack info correctly before processing stream
966 // processing stream frames, since the processing may result in a response 927 // frames, since the processing may result in a response packet with a bundled
967 // packet with a bundled ack. 928 // ack.
968 if (last_packet_revived_) { 929 received_packet_manager_.RecordPacketReceived(last_size_, last_header_,
969 received_packet_manager_.RecordPacketRevived(last_header_.packet_number); 930 time_of_last_received_packet_);
970 } else {
971 received_packet_manager_.RecordPacketReceived(
972 last_size_, last_header_, time_of_last_received_packet_);
973 }
974 931
975 // Process stop waiting frames here, instead of inline, because the packet 932 // Process stop waiting frames here, instead of inline, because the packet
976 // needs to be considered 'received' before the entropy can be updated. 933 // needs to be considered 'received' before the entropy can be updated.
977 if (last_stop_waiting_frame_.least_unacked > 0) { 934 if (last_stop_waiting_frame_.least_unacked > 0) {
978 ProcessStopWaitingFrame(last_stop_waiting_frame_); 935 ProcessStopWaitingFrame(last_stop_waiting_frame_);
979 if (!connected_) { 936 if (!connected_) {
980 return; 937 return;
981 } 938 }
982 } 939 }
983 940
984 MaybeQueueAck(was_missing); 941 MaybeQueueAck(was_missing);
985 942
986 ClearLastFrames(); 943 ClearLastFrames();
987 MaybeCloseIfTooManyOutstandingPackets(); 944 MaybeCloseIfTooManyOutstandingPackets();
988 MaybeProcessRevivedPacket();
989 } 945 }
990 946
991 void QuicConnection::MaybeQueueAck(bool was_missing) { 947 void QuicConnection::MaybeQueueAck(bool was_missing) {
992 ++num_packets_received_since_last_ack_sent_; 948 ++num_packets_received_since_last_ack_sent_;
993 // Always send an ack every 20 packets in order to allow the peer to discard 949 // Always send an ack every 20 packets in order to allow the peer to discard
994 // information from the SentPacketManager and provide an RTT measurement. 950 // information from the SentPacketManager and provide an RTT measurement.
995 if (num_packets_received_since_last_ack_sent_ >= 951 if (num_packets_received_since_last_ack_sent_ >=
996 kMaxPacketsReceivedBeforeAckSend) { 952 kMaxPacketsReceivedBeforeAckSend) {
997 ack_queued_ = true; 953 ack_queued_ = true;
998 } 954 }
(...skipping 364 matching lines...) Expand 10 before | Expand all | Expand 10 after
1363 } 1319 }
1364 1320
1365 void QuicConnection::WriteAndBundleAcksIfNotBlocked() { 1321 void QuicConnection::WriteAndBundleAcksIfNotBlocked() {
1366 if (!writer_->IsWriteBlocked()) { 1322 if (!writer_->IsWriteBlocked()) {
1367 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK); 1323 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK);
1368 OnCanWrite(); 1324 OnCanWrite();
1369 } 1325 }
1370 } 1326 }
1371 1327
1372 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) { 1328 bool QuicConnection::ProcessValidatedPacket(const QuicPacketHeader& header) {
1329 if (header.fec_flag) {
1330 // Drop any FEC packet.
1331 return false;
1332 }
1333
1373 if (FLAGS_check_peer_address_change_after_decryption) { 1334 if (FLAGS_check_peer_address_change_after_decryption) {
1374 if (perspective_ == Perspective::IS_SERVER && 1335 if (perspective_ == Perspective::IS_SERVER &&
1375 IsInitializedIPEndPoint(self_address_) && 1336 IsInitializedIPEndPoint(self_address_) &&
1376 IsInitializedIPEndPoint(last_packet_destination_address_) && 1337 IsInitializedIPEndPoint(last_packet_destination_address_) &&
1377 (!(self_address_ == last_packet_destination_address_))) { 1338 (!(self_address_ == last_packet_destination_address_))) {
1378 SendConnectionCloseWithDetails( 1339 SendConnectionCloseWithDetails(
1379 QUIC_ERROR_MIGRATING_ADDRESS, 1340 QUIC_ERROR_MIGRATING_ADDRESS,
1380 "Self address migration is not supported at the server."); 1341 "Self address migration is not supported at the server.");
1381 return false; 1342 return false;
1382 } 1343 }
(...skipping 549 matching lines...) Expand 10 before | Expand all | Expand 10 after
1932 // undecryptable packets as the argument to OnUndecryptablePacket so that 1893 // undecryptable packets as the argument to OnUndecryptablePacket so that
1933 // we just need to call OnUndecryptablePacket once? 1894 // we just need to call OnUndecryptablePacket once?
1934 for (size_t i = 0; i < undecryptable_packets_.size(); ++i) { 1895 for (size_t i = 0; i < undecryptable_packets_.size(); ++i) {
1935 debug_visitor_->OnUndecryptablePacket(); 1896 debug_visitor_->OnUndecryptablePacket();
1936 } 1897 }
1937 } 1898 }
1938 STLDeleteElements(&undecryptable_packets_); 1899 STLDeleteElements(&undecryptable_packets_);
1939 } 1900 }
1940 } 1901 }
1941 1902
1942 void QuicConnection::MaybeProcessRevivedPacket() {
1943 QuicFecGroup* group = GetFecGroup();
1944 if (!connected_ || group == nullptr || !group->CanRevive()) {
1945 return;
1946 }
1947 QuicPacketHeader revived_header;
1948 char revived_payload[kMaxPacketSize];
1949 size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize);
1950 if (!received_packet_manager_.IsAwaitingPacket(
1951 revived_header.packet_number)) {
1952 // Close this FEC group because all packets in the group has been received.
1953 group_map_.erase(last_header_.fec_group);
1954 delete group;
1955 return;
1956 }
1957 revived_header.public_header.connection_id = connection_id_;
1958 revived_header.public_header.connection_id_length =
1959 last_header_.public_header.connection_id_length;
1960 revived_header.public_header.version_flag = false;
1961 revived_header.public_header.reset_flag = false;
1962 revived_header.public_header.packet_number_length =
1963 last_header_.public_header.packet_number_length;
1964 revived_header.fec_flag = false;
1965 revived_header.is_in_fec_group = NOT_IN_FEC_GROUP;
1966 revived_header.fec_group = 0;
1967 group_map_.erase(last_header_.fec_group);
1968 last_decrypted_packet_level_ = group->EffectiveEncryptionLevel();
1969 DCHECK_LT(last_decrypted_packet_level_, NUM_ENCRYPTION_LEVELS);
1970 delete group;
1971
1972 last_packet_revived_ = true;
1973 if (debug_visitor_ != nullptr) {
1974 debug_visitor_->OnRevivedPacket(revived_header,
1975 StringPiece(revived_payload, len));
1976 }
1977
1978 ++stats_.packets_revived;
1979 framer_.ProcessRevivedPacket(&revived_header,
1980 StringPiece(revived_payload, len));
1981 }
1982
1983 QuicFecGroup* QuicConnection::GetFecGroup() {
1984 QuicFecGroupNumber fec_group_num = last_header_.fec_group;
1985 if (fec_group_num == 0 ||
1986 (fec_group_num <
1987 received_packet_manager_.peer_least_packet_awaiting_ack() &&
1988 !ContainsKey(group_map_, fec_group_num))) {
1989 // If the group number is below peer_least_packet_awaiting_ack and this
1990 // group does not exist, which means this group has missing packets below
1991 // |peer_least_packet_awaiting_ack| which we would never receive, so return
1992 // nullptr.
1993 return nullptr;
1994 }
1995 if (!ContainsKey(group_map_, fec_group_num)) {
1996 if (group_map_.size() >= kMaxFecGroups) { // Too many groups
1997 if (fec_group_num < group_map_.begin()->first) {
1998 // The group being requested is a group we've seen before and deleted.
1999 // Don't recreate it.
2000 return nullptr;
2001 }
2002 // Clear the lowest group number.
2003 delete group_map_.begin()->second;
2004 group_map_.erase(group_map_.begin());
2005 }
2006 group_map_[fec_group_num] = new QuicFecGroup(fec_group_num);
2007 }
2008 return group_map_[fec_group_num];
2009 }
2010
2011 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, 1903 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error,
2012 const string& details) { 1904 const string& details) {
2013 if (!connected_) { 1905 if (!connected_) {
2014 DVLOG(1) << "Connection is already closed."; 1906 DVLOG(1) << "Connection is already closed.";
2015 return; 1907 return;
2016 } 1908 }
2017 // If we're write blocked, WritePacket() will not send, but will capture the 1909 // If we're write blocked, WritePacket() will not send, but will capture the
2018 // serialized packet. 1910 // serialized packet.
2019 SendConnectionClosePacket(error, details); 1911 SendConnectionClosePacket(error, details);
2020 CloseConnection(error, ConnectionCloseSource::FROM_SELF); 1912 CloseConnection(error, ConnectionCloseSource::FROM_SELF);
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
2074 1966
2075 DVLOG(1) << ENDPOINT << "Going away with error " 1967 DVLOG(1) << ENDPOINT << "Going away with error "
2076 << QuicUtils::ErrorToString(error) << " (" << error << ")"; 1968 << QuicUtils::ErrorToString(error) << " (" << error << ")";
2077 1969
2078 // Opportunistically bundle an ack with this outgoing packet. 1970 // Opportunistically bundle an ack with this outgoing packet.
2079 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1971 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK);
2080 packet_generator_.AddControlFrame( 1972 packet_generator_.AddControlFrame(
2081 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason))); 1973 QuicFrame(new QuicGoAwayFrame(error, last_good_stream_id, reason)));
2082 } 1974 }
2083 1975
2084 void QuicConnection::CloseFecGroupsBefore(QuicPacketNumber packet_number) {
2085 FecGroupMap::iterator it = group_map_.begin();
2086 while (it != group_map_.end()) {
2087 // If the group doesn't protect this packet we can ignore it.
2088 if (!it->second->IsWaitingForPacketBefore(packet_number)) {
2089 ++it;
2090 continue;
2091 }
2092 QuicFecGroup* fec_group = it->second;
2093 DCHECK(!fec_group->CanRevive());
2094 FecGroupMap::iterator next = it;
2095 ++next;
2096 group_map_.erase(it);
2097 delete fec_group;
2098 it = next;
2099 }
2100 }
2101
2102 QuicByteCount QuicConnection::max_packet_length() const { 1976 QuicByteCount QuicConnection::max_packet_length() const {
2103 return packet_generator_.GetMaxPacketLength(); 1977 return packet_generator_.GetMaxPacketLength();
2104 } 1978 }
2105 1979
2106 void QuicConnection::SetMaxPacketLength(QuicByteCount length) { 1980 void QuicConnection::SetMaxPacketLength(QuicByteCount length) {
2107 return packet_generator_.SetMaxPacketLength(LimitMaxPacketSize(length), 1981 return packet_generator_.SetMaxPacketLength(LimitMaxPacketSize(length),
2108 /*force=*/false); 1982 /*force=*/false);
2109 } 1983 }
2110 1984
2111 bool QuicConnection::HasQueuedData() const { 1985 bool QuicConnection::HasQueuedData() const {
(...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after
2459 void QuicConnection::OnPathClosed(QuicPathId path_id) { 2333 void QuicConnection::OnPathClosed(QuicPathId path_id) {
2460 // Stop receiving packets on this path. 2334 // Stop receiving packets on this path.
2461 framer_.OnPathClosed(path_id); 2335 framer_.OnPathClosed(path_id);
2462 } 2336 }
2463 2337
2464 bool QuicConnection::ack_frame_updated() const { 2338 bool QuicConnection::ack_frame_updated() const {
2465 return received_packet_manager_.ack_frame_updated(); 2339 return received_packet_manager_.ack_frame_updated();
2466 } 2340 }
2467 2341
2468 } // namespace net 2342 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_logger.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698