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

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

Issue 14083012: QUIC: retransmit packets with the correct encryption. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Moved HandshakeMode enum to MockCryptoClientStream Created 7 years, 7 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 | Annotate | Revision Log
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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/logging.h" 9 #include "base/logging.h"
10 #include "base/stl_util.h" 10 #include "base/stl_util.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 } // namespace 72 } // namespace
73 73
74 #define ENDPOINT (is_server_ ? "Server: " : " Client: ") 74 #define ENDPOINT (is_server_ ? "Server: " : " Client: ")
75 75
76 QuicConnection::QuicConnection(QuicGuid guid, 76 QuicConnection::QuicConnection(QuicGuid guid,
77 IPEndPoint address, 77 IPEndPoint address,
78 QuicConnectionHelperInterface* helper, 78 QuicConnectionHelperInterface* helper,
79 bool is_server) 79 bool is_server)
80 : helper_(helper), 80 : helper_(helper),
81 framer_(kQuicVersion1, 81 framer_(kQuicVersion1,
82 QuicDecrypter::Create(kNULL),
83 QuicEncrypter::Create(kNULL),
84 helper->GetClock()->ApproximateNow(), 82 helper->GetClock()->ApproximateNow(),
85 is_server), 83 is_server),
84 encryption_level_(ENCRYPTION_NONE),
86 clock_(helper->GetClock()), 85 clock_(helper->GetClock()),
87 random_generator_(helper->GetRandomGenerator()), 86 random_generator_(helper->GetRandomGenerator()),
88 guid_(guid), 87 guid_(guid),
89 peer_address_(address), 88 peer_address_(address),
90 largest_seen_packet_with_ack_(0), 89 largest_seen_packet_with_ack_(0),
91 peer_largest_observed_packet_(0), 90 peer_largest_observed_packet_(0),
92 least_packet_awaited_by_peer_(1), 91 least_packet_awaited_by_peer_(1),
93 peer_least_packet_awaiting_ack_(0), 92 peer_least_packet_awaiting_ack_(0),
94 handling_retransmission_timeout_(false), 93 handling_retransmission_timeout_(false),
95 write_blocked_(false), 94 write_blocked_(false),
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
144 return false; 143 return false;
145 } 144 }
146 145
147 // Right now we only support kQuicVersion1 so it's okay not to 146 // Right now we only support kQuicVersion1 so it's okay not to
148 // update the framer and quic_version_. When start supporting more 147 // update the framer and quic_version_. When start supporting more
149 // versions please update both. 148 // versions please update both.
150 return true; 149 return true;
151 } 150 }
152 151
153 void QuicConnection::OnError(QuicFramer* framer) { 152 void QuicConnection::OnError(QuicFramer* framer) {
154 if (!connected_) { 153 // Packets that we cannot decrypt are dropped.
154 // TODO(rch): add stats to measure this.
155 if (!connected_ || framer->error() == QUIC_DECRYPTION_FAILURE) {
155 return; 156 return;
156 } 157 }
157 SendConnectionClose(framer->error()); 158 SendConnectionClose(framer->error());
158 } 159 }
159 160
160 void QuicConnection::OnPacket() { 161 void QuicConnection::OnPacket() {
161 // TODO(satyamshekhar): Validate packet before updating the time 162 // TODO(satyamshekhar): Validate packet before updating the time
162 // since it affects the timeout of the connection. 163 // since it affects the timeout of the connection.
163 time_of_last_received_packet_ = clock_->Now(); 164 time_of_last_received_packet_ = clock_->Now();
164 DVLOG(1) << "time of last received packet: " 165 DVLOG(1) << "time of last received packet: "
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
720 debug_visitor_->OnPacketReceived(self_address, peer_address, packet); 721 debug_visitor_->OnPacketReceived(self_address, peer_address, packet);
721 } 722 }
722 last_packet_revived_ = false; 723 last_packet_revived_ = false;
723 last_size_ = packet.length(); 724 last_size_ = packet.length();
724 last_self_address_ = self_address; 725 last_self_address_ = self_address;
725 last_peer_address_ = peer_address; 726 last_peer_address_ = peer_address;
726 727
727 stats_.bytes_received += packet.length(); 728 stats_.bytes_received += packet.length();
728 ++stats_.packets_received; 729 ++stats_.packets_received;
729 730
730 framer_.ProcessPacket(packet); 731 if (!framer_.ProcessPacket(packet)) {
732 return;
733 }
731 MaybeProcessRevivedPacket(); 734 MaybeProcessRevivedPacket();
732 } 735 }
733 736
734 bool QuicConnection::OnCanWrite() { 737 bool QuicConnection::OnCanWrite() {
735 write_blocked_ = false; 738 write_blocked_ = false;
736 739
737 WriteQueuedPackets(); 740 WriteQueuedPackets();
738 741
739 // Sending queued packets may have caused the socket to become write blocked, 742 // Sending queued packets may have caused the socket to become write blocked,
740 // or the congestion manager to prohibit sending. If we've sent everything 743 // or the congestion manager to prohibit sending. If we've sent everything
(...skipping 22 matching lines...) Expand all
763 DCHECK(!write_blocked_); 766 DCHECK(!write_blocked_);
764 767
765 size_t num_queued_packets = queued_packets_.size() + 1; 768 size_t num_queued_packets = queued_packets_.size() + 1;
766 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); 769 QueuedPacketList::iterator packet_iterator = queued_packets_.begin();
767 while (!write_blocked_ && packet_iterator != queued_packets_.end()) { 770 while (!write_blocked_ && packet_iterator != queued_packets_.end()) {
768 // Ensure that from one iteration of this loop to the next we 771 // Ensure that from one iteration of this loop to the next we
769 // succeeded in sending a packet so we don't infinitely loop. 772 // succeeded in sending a packet so we don't infinitely loop.
770 // TODO(rch): clean up and close the connection if we really hit this. 773 // TODO(rch): clean up and close the connection if we really hit this.
771 DCHECK_LT(queued_packets_.size(), num_queued_packets); 774 DCHECK_LT(queued_packets_.size(), num_queued_packets);
772 num_queued_packets = queued_packets_.size(); 775 num_queued_packets = queued_packets_.size();
773 if (WritePacket(packet_iterator->sequence_number, 776 if (WritePacket(packet_iterator->encryption_level,
777 packet_iterator->sequence_number,
774 packet_iterator->packet, 778 packet_iterator->packet,
775 packet_iterator->retransmittable, 779 packet_iterator->retransmittable,
776 NO_FORCE)) { 780 NO_FORCE)) {
777 packet_iterator = queued_packets_.erase(packet_iterator); 781 packet_iterator = queued_packets_.erase(packet_iterator);
778 } else { 782 } else {
779 // Continue, because some queued packets may still be writable. 783 // Continue, because some queued packets may still be writable.
780 // This can happen if a retransmit send fail. 784 // This can happen if a retransmit send fail.
781 ++packet_iterator; 785 ++packet_iterator;
782 } 786 }
783 } 787 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
876 retransmission_info)); 880 retransmission_info));
877 // Remove info with old sequence number. 881 // Remove info with old sequence number.
878 unacked_packets_.erase(unacked_it); 882 unacked_packets_.erase(unacked_it);
879 retransmission_map_.erase(retransmission_it); 883 retransmission_map_.erase(retransmission_it);
880 DVLOG(1) << "Retransmitting unacked packet " << sequence_number << " as " 884 DVLOG(1) << "Retransmitting unacked packet " << sequence_number << " as "
881 << serialized_packet.sequence_number; 885 << serialized_packet.sequence_number;
882 DCHECK(unacked_packets_.empty() || 886 DCHECK(unacked_packets_.empty() ||
883 unacked_packets_.rbegin()->first < serialized_packet.sequence_number); 887 unacked_packets_.rbegin()->first < serialized_packet.sequence_number);
884 unacked_packets_.insert(make_pair(serialized_packet.sequence_number, 888 unacked_packets_.insert(make_pair(serialized_packet.sequence_number,
885 unacked)); 889 unacked));
886 SendOrQueuePacket(serialized_packet.sequence_number, 890 SendOrQueuePacket(unacked->encryption_level(),
891 serialized_packet.sequence_number,
887 serialized_packet.packet, 892 serialized_packet.packet,
888 serialized_packet.entropy_hash, 893 serialized_packet.entropy_hash,
889 HAS_RETRANSMITTABLE_DATA); 894 HAS_RETRANSMITTABLE_DATA);
890 } 895 }
891 896
892 bool QuicConnection::CanWrite(Retransmission retransmission, 897 bool QuicConnection::CanWrite(Retransmission retransmission,
893 HasRetransmittableData retransmittable) { 898 HasRetransmittableData retransmittable) {
894 // TODO(ianswett): If the packet is a retransmit, the current send alarm may 899 // TODO(ianswett): If the packet is a retransmit, the current send alarm may
895 // be too long. 900 // be too long.
896 if (write_blocked_ || helper_->IsSendAlarmSet()) { 901 if (write_blocked_ || helper_->IsSendAlarmSet()) {
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 // Do not set the retransmisson alarm if we're already handling the 944 // Do not set the retransmisson alarm if we're already handling the
940 // retransmission alarm because the retransmission alarm will be reset when 945 // retransmission alarm because the retransmission alarm will be reset when
941 // OnRetransmissionTimeout completes. 946 // OnRetransmissionTimeout completes.
942 if (!handling_retransmission_timeout_) { 947 if (!handling_retransmission_timeout_) {
943 helper_->SetRetransmissionAlarm(retransmission_delay); 948 helper_->SetRetransmissionAlarm(retransmission_delay);
944 } 949 }
945 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in 950 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in
946 // SendStreamData(). 951 // SendStreamData().
947 } 952 }
948 953
949 bool QuicConnection::WritePacket(QuicPacketSequenceNumber sequence_number, 954 bool QuicConnection::WritePacket(EncryptionLevel level,
955 QuicPacketSequenceNumber sequence_number,
950 QuicPacket* packet, 956 QuicPacket* packet,
951 HasRetransmittableData retransmittable, 957 HasRetransmittableData retransmittable,
952 Force forced) { 958 Force forced) {
953 if (!connected_) { 959 if (!connected_) {
954 DLOG(INFO) << ENDPOINT 960 DLOG(INFO) << ENDPOINT
955 << "Not sending packet as connection is disconnected."; 961 << "Not sending packet as connection is disconnected.";
956 delete packet; 962 delete packet;
957 // Returning true because we deleted the packet and the caller shouldn't 963 // Returning true because we deleted the packet and the caller shouldn't
958 // delete it again. 964 // delete it again.
959 return true; 965 return true;
960 } 966 }
961 967
962 Retransmission retransmission = IsRetransmission(sequence_number) ? 968 Retransmission retransmission = IsRetransmission(sequence_number) ?
963 IS_RETRANSMISSION : NOT_RETRANSMISSION; 969 IS_RETRANSMISSION : NOT_RETRANSMISSION;
964 // If we are not forced and we can't write, then simply return false; 970 // If we are not forced and we can't write, then simply return false;
965 if (forced == NO_FORCE && !CanWrite(retransmission, retransmittable)) { 971 if (forced == NO_FORCE && !CanWrite(retransmission, retransmittable)) {
966 return false; 972 return false;
967 } 973 }
968 974
969 scoped_ptr<QuicEncryptedPacket> encrypted( 975 scoped_ptr<QuicEncryptedPacket> encrypted(
970 framer_.EncryptPacket(sequence_number, *packet)); 976 framer_.EncryptPacket(level, sequence_number, *packet));
971 DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number 977 DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number
972 << " : " << (packet->is_fec_packet() ? "FEC " : 978 << " : " << (packet->is_fec_packet() ? "FEC " :
973 (retransmittable == HAS_RETRANSMITTABLE_DATA 979 (retransmittable == HAS_RETRANSMITTABLE_DATA
974 ? "data bearing " : " ack only ")) 980 ? "data bearing " : " ack only "))
975 << " Packet length:" << packet->length(); 981 << " Packet length:" << packet->length();
976 982
977 DCHECK(encrypted->length() <= kMaxPacketSize) 983 DCHECK(encrypted->length() <= kMaxPacketSize)
978 << "Packet " << sequence_number << " will not be read; too large: " 984 << "Packet " << sequence_number << " will not be read; too large: "
979 << packet->length() << " " << encrypted->length() << " " 985 << packet->length() << " " << encrypted->length() << " "
980 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no"); 986 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no");
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 delete packet; 1021 delete packet;
1016 return true; 1022 return true;
1017 } 1023 }
1018 1024
1019 bool QuicConnection::OnSerializedPacket( 1025 bool QuicConnection::OnSerializedPacket(
1020 const SerializedPacket& serialized_packet) { 1026 const SerializedPacket& serialized_packet) {
1021 if (serialized_packet.retransmittable_frames != NULL) { 1027 if (serialized_packet.retransmittable_frames != NULL) {
1022 DCHECK(unacked_packets_.empty() || 1028 DCHECK(unacked_packets_.empty() ||
1023 unacked_packets_.rbegin()->first < 1029 unacked_packets_.rbegin()->first <
1024 serialized_packet.sequence_number); 1030 serialized_packet.sequence_number);
1031 // Retransmitted frames will be sent with the same encryption level as the
1032 // original.
1033 serialized_packet.retransmittable_frames->set_encryption_level(
1034 encryption_level_);
1025 unacked_packets_.insert( 1035 unacked_packets_.insert(
1026 make_pair(serialized_packet.sequence_number, 1036 make_pair(serialized_packet.sequence_number,
1027 serialized_packet.retransmittable_frames)); 1037 serialized_packet.retransmittable_frames));
1028 // All unacked packets might be retransmitted. 1038 // All unacked packets might be retransmitted.
1029 retransmission_map_.insert( 1039 retransmission_map_.insert(
1030 make_pair(serialized_packet.sequence_number, 1040 make_pair(serialized_packet.sequence_number,
1031 RetransmissionInfo(serialized_packet.sequence_number))); 1041 RetransmissionInfo(serialized_packet.sequence_number)));
1032 } 1042 }
1033 return SendOrQueuePacket(serialized_packet.sequence_number, 1043 return SendOrQueuePacket(encryption_level_,
1044 serialized_packet.sequence_number,
1034 serialized_packet.packet, 1045 serialized_packet.packet,
1035 serialized_packet.entropy_hash, 1046 serialized_packet.entropy_hash,
1036 serialized_packet.retransmittable_frames != NULL ? 1047 serialized_packet.retransmittable_frames != NULL ?
1037 HAS_RETRANSMITTABLE_DATA : 1048 HAS_RETRANSMITTABLE_DATA :
1038 NO_RETRANSMITTABLE_DATA); 1049 NO_RETRANSMITTABLE_DATA);
1039 } 1050 }
1040 1051
1041 bool QuicConnection::SendOrQueuePacket(QuicPacketSequenceNumber sequence_number, 1052 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
1053 QuicPacketSequenceNumber sequence_number,
1042 QuicPacket* packet, 1054 QuicPacket* packet,
1043 QuicPacketEntropyHash entropy_hash, 1055 QuicPacketEntropyHash entropy_hash,
1044 HasRetransmittableData retransmittable) { 1056 HasRetransmittableData retransmittable) {
1045 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash); 1057 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash);
1046 if (!WritePacket(sequence_number, packet, retransmittable, NO_FORCE)) { 1058 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) {
1047 queued_packets_.push_back(QueuedPacket(sequence_number, packet, 1059 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level,
1048 retransmittable)); 1060 retransmittable));
1049 return false; 1061 return false;
1050 } 1062 }
1051 return true; 1063 return true;
1052 } 1064 }
1053 1065
1054 bool QuicConnection::ShouldSimulateLostPacket() { 1066 bool QuicConnection::ShouldSimulateLostPacket() {
1055 // TODO(rch): enable this 1067 // TODO(rch): enable this
1056 return false; 1068 return false;
1057 /* 1069 /*
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 1139
1128 if (retransmission_timeouts_.empty()) { 1140 if (retransmission_timeouts_.empty()) {
1129 return QuicTime::Zero(); 1141 return QuicTime::Zero();
1130 } 1142 }
1131 1143
1132 // We have packets remaining. Return the absolute RTO of the oldest packet 1144 // We have packets remaining. Return the absolute RTO of the oldest packet
1133 // on the list. 1145 // on the list.
1134 return retransmission_timeouts_.top().scheduled_time; 1146 return retransmission_timeouts_.top().scheduled_time;
1135 } 1147 }
1136 1148
1137 void QuicConnection::ChangeEncrypter(QuicEncrypter* encrypter) { 1149 void QuicConnection::SetEncrypter(EncryptionLevel level,
1138 framer_.set_encrypter(encrypter); 1150 QuicEncrypter* encrypter) {
1151 framer_.SetEncrypter(level, encrypter);
1139 } 1152 }
1140 1153
1141 void QuicConnection::PushDecrypter(QuicDecrypter* decrypter) { 1154 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const {
1142 framer_.push_decrypter(decrypter); 1155 return framer_.encrypter(level);
1143 } 1156 }
1144 1157
1145 void QuicConnection::PopDecrypter() { 1158 void QuicConnection::SetDefaultEncryptionLevel(
1146 framer_.pop_decrypter(); 1159 EncryptionLevel level) {
1160 encryption_level_ = level;
1161 }
1162
1163 void QuicConnection::SetDecrypter(QuicDecrypter* decrypter) {
1164 framer_.SetDecrypter(decrypter);
1165 }
1166
1167 void QuicConnection::SetAlternativeDecrypter(QuicDecrypter* decrypter,
1168 bool latch_once_used) {
1169 framer_.SetAlternativeDecrypter(decrypter, latch_once_used);
1170 }
1171
1172 const QuicDecrypter* QuicConnection::decrypter() const {
1173 return framer_.decrypter();
1174 }
1175
1176 const QuicDecrypter* QuicConnection::alternative_decrypter() const {
1177 return framer_.alternative_decrypter();
1147 } 1178 }
1148 1179
1149 void QuicConnection::MaybeProcessRevivedPacket() { 1180 void QuicConnection::MaybeProcessRevivedPacket() {
1150 QuicFecGroup* group = GetFecGroup(); 1181 QuicFecGroup* group = GetFecGroup();
1151 if (group == NULL || !group->CanRevive()) { 1182 if (group == NULL || !group->CanRevive()) {
1152 return; 1183 return;
1153 } 1184 }
1154 QuicPacketHeader revived_header; 1185 QuicPacketHeader revived_header;
1155 char revived_payload[kMaxPacketSize]; 1186 char revived_payload[kMaxPacketSize];
1156 size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize); 1187 size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize);
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1201 frame.ack_frame = outgoing_ack_; 1232 frame.ack_frame = outgoing_ack_;
1202 1233
1203 SerializedPacket serialized_packet = 1234 SerializedPacket serialized_packet =
1204 packet_creator_.SerializeConnectionClose(&frame); 1235 packet_creator_.SerializeConnectionClose(&frame);
1205 1236
1206 // We need to update the sent entrophy hash for all sent packets. 1237 // We need to update the sent entrophy hash for all sent packets.
1207 entropy_manager_.RecordSentPacketEntropyHash( 1238 entropy_manager_.RecordSentPacketEntropyHash(
1208 serialized_packet.sequence_number, 1239 serialized_packet.sequence_number,
1209 serialized_packet.entropy_hash); 1240 serialized_packet.entropy_hash);
1210 1241
1211 WritePacket(serialized_packet.sequence_number, 1242 WritePacket(encryption_level_,
1243 serialized_packet.sequence_number,
1212 serialized_packet.packet, 1244 serialized_packet.packet,
1213 serialized_packet.retransmittable_frames != NULL ? 1245 serialized_packet.retransmittable_frames != NULL ?
1214 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, 1246 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA,
1215 FORCE); 1247 FORCE);
1216 } 1248 }
1217 1249
1218 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, 1250 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error,
1219 const string& details) { 1251 const string& details) {
1220 SendConnectionClosePacket(error, details); 1252 SendConnectionClosePacket(error, details);
1221 CloseConnection(error, false); 1253 CloseConnection(error, false);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 << " delta:" << delta.ToMicroseconds(); 1304 << " delta:" << delta.ToMicroseconds();
1273 if (delta >= timeout_) { 1305 if (delta >= timeout_) {
1274 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); 1306 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT);
1275 return true; 1307 return true;
1276 } 1308 }
1277 helper_->SetTimeoutAlarm(timeout_.Subtract(delta)); 1309 helper_->SetTimeoutAlarm(timeout_.Subtract(delta));
1278 return false; 1310 return false;
1279 } 1311 }
1280 1312
1281 } // namespace net 1313 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698