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

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

Issue 14718011: Land Recent QUIC Changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: 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
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_helper_test.cc » ('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 <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()) {
897 return false; 902 return false;
898 } 903 }
899 904
900 QuicTime now = clock_->Now(); 905 QuicTime now = clock_->Now();
901 QuicTime::Delta delay = congestion_manager_.TimeUntilSend( 906 QuicTime::Delta delay = congestion_manager_.TimeUntilSend(
902 now, retransmission, retransmittable); 907 now, retransmission, retransmittable);
903 if (delay.IsInfinite()) { 908 if (delay.IsInfinite()) {
904 return false; 909 // TODO(pwestin): should be false but trigger other bugs see b/8350327.
910 return true;
905 } 911 }
906 912
907 // If the scheduler requires a delay, then we can not send this packet now. 913 // If the scheduler requires a delay, then we can not send this packet now.
908 if (!delay.IsZero()) { 914 if (!delay.IsZero()) {
909 helper_->SetSendAlarm(now.Add(delay)); 915 helper_->SetSendAlarm(now.Add(delay));
910 return false; 916 return false;
911 } 917 }
912 return true; 918 return true;
913 } 919 }
914 920
(...skipping 24 matching lines...) Expand all
939 // Do not set the retransmisson alarm if we're already handling the 945 // Do not set the retransmisson alarm if we're already handling the
940 // retransmission alarm because the retransmission alarm will be reset when 946 // retransmission alarm because the retransmission alarm will be reset when
941 // OnRetransmissionTimeout completes. 947 // OnRetransmissionTimeout completes.
942 if (!handling_retransmission_timeout_) { 948 if (!handling_retransmission_timeout_) {
943 helper_->SetRetransmissionAlarm(retransmission_delay); 949 helper_->SetRetransmissionAlarm(retransmission_delay);
944 } 950 }
945 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in 951 // TODO(satyamshekhar): restore packet reordering with Ian's TODO in
946 // SendStreamData(). 952 // SendStreamData().
947 } 953 }
948 954
949 bool QuicConnection::WritePacket(QuicPacketSequenceNumber sequence_number, 955 bool QuicConnection::WritePacket(EncryptionLevel level,
956 QuicPacketSequenceNumber sequence_number,
950 QuicPacket* packet, 957 QuicPacket* packet,
951 HasRetransmittableData retransmittable, 958 HasRetransmittableData retransmittable,
952 Force forced) { 959 Force forced) {
953 if (!connected_) { 960 if (!connected_) {
954 DLOG(INFO) << ENDPOINT 961 DLOG(INFO) << ENDPOINT
955 << "Not sending packet as connection is disconnected."; 962 << "Not sending packet as connection is disconnected.";
956 delete packet; 963 delete packet;
957 // Returning true because we deleted the packet and the caller shouldn't 964 // Returning true because we deleted the packet and the caller shouldn't
958 // delete it again. 965 // delete it again.
959 return true; 966 return true;
960 } 967 }
961 968
962 Retransmission retransmission = IsRetransmission(sequence_number) ? 969 Retransmission retransmission = IsRetransmission(sequence_number) ?
963 IS_RETRANSMISSION : NOT_RETRANSMISSION; 970 IS_RETRANSMISSION : NOT_RETRANSMISSION;
964 // If we are not forced and we can't write, then simply return false; 971 // If we are not forced and we can't write, then simply return false;
965 if (forced == NO_FORCE && !CanWrite(retransmission, retransmittable)) { 972 if (forced == NO_FORCE && !CanWrite(retransmission, retransmittable)) {
966 return false; 973 return false;
967 } 974 }
968 975
969 scoped_ptr<QuicEncryptedPacket> encrypted( 976 scoped_ptr<QuicEncryptedPacket> encrypted(
970 framer_.EncryptPacket(sequence_number, *packet)); 977 framer_.EncryptPacket(level, sequence_number, *packet));
971 DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number 978 DLOG(INFO) << ENDPOINT << "Sending packet number " << sequence_number
972 << " : " << (packet->is_fec_packet() ? "FEC " : 979 << " : " << (packet->is_fec_packet() ? "FEC " :
973 (retransmittable == HAS_RETRANSMITTABLE_DATA 980 (retransmittable == HAS_RETRANSMITTABLE_DATA
974 ? "data bearing " : " ack only ")) 981 ? "data bearing " : " ack only "))
975 << " Packet length:" << packet->length(); 982 << " Packet length:" << packet->length();
976 983
977 DCHECK(encrypted->length() <= kMaxPacketSize) 984 DCHECK(encrypted->length() <= kMaxPacketSize)
978 << "Packet " << sequence_number << " will not be read; too large: " 985 << "Packet " << sequence_number << " will not be read; too large: "
979 << packet->length() << " " << encrypted->length() << " " 986 << packet->length() << " " << encrypted->length() << " "
980 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no"); 987 << outgoing_ack_ << " forced: " << (forced == FORCE ? "yes" : "no");
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
1015 delete packet; 1022 delete packet;
1016 return true; 1023 return true;
1017 } 1024 }
1018 1025
1019 bool QuicConnection::OnSerializedPacket( 1026 bool QuicConnection::OnSerializedPacket(
1020 const SerializedPacket& serialized_packet) { 1027 const SerializedPacket& serialized_packet) {
1021 if (serialized_packet.retransmittable_frames != NULL) { 1028 if (serialized_packet.retransmittable_frames != NULL) {
1022 DCHECK(unacked_packets_.empty() || 1029 DCHECK(unacked_packets_.empty() ||
1023 unacked_packets_.rbegin()->first < 1030 unacked_packets_.rbegin()->first <
1024 serialized_packet.sequence_number); 1031 serialized_packet.sequence_number);
1032 // Retransmitted frames will be sent with the same encryption level as the
1033 // original.
1034 serialized_packet.retransmittable_frames->set_encryption_level(
1035 encryption_level_);
1025 unacked_packets_.insert( 1036 unacked_packets_.insert(
1026 make_pair(serialized_packet.sequence_number, 1037 make_pair(serialized_packet.sequence_number,
1027 serialized_packet.retransmittable_frames)); 1038 serialized_packet.retransmittable_frames));
1028 // All unacked packets might be retransmitted. 1039 // All unacked packets might be retransmitted.
1029 retransmission_map_.insert( 1040 retransmission_map_.insert(
1030 make_pair(serialized_packet.sequence_number, 1041 make_pair(serialized_packet.sequence_number,
1031 RetransmissionInfo(serialized_packet.sequence_number))); 1042 RetransmissionInfo(serialized_packet.sequence_number)));
1032 } 1043 }
1033 return SendOrQueuePacket(serialized_packet.sequence_number, 1044 return SendOrQueuePacket(encryption_level_,
1045 serialized_packet.sequence_number,
1034 serialized_packet.packet, 1046 serialized_packet.packet,
1035 serialized_packet.entropy_hash, 1047 serialized_packet.entropy_hash,
1036 serialized_packet.retransmittable_frames != NULL ? 1048 serialized_packet.retransmittable_frames != NULL ?
1037 HAS_RETRANSMITTABLE_DATA : 1049 HAS_RETRANSMITTABLE_DATA :
1038 NO_RETRANSMITTABLE_DATA); 1050 NO_RETRANSMITTABLE_DATA);
1039 } 1051 }
1040 1052
1041 bool QuicConnection::SendOrQueuePacket(QuicPacketSequenceNumber sequence_number, 1053 bool QuicConnection::SendOrQueuePacket(EncryptionLevel level,
1054 QuicPacketSequenceNumber sequence_number,
1042 QuicPacket* packet, 1055 QuicPacket* packet,
1043 QuicPacketEntropyHash entropy_hash, 1056 QuicPacketEntropyHash entropy_hash,
1044 HasRetransmittableData retransmittable) { 1057 HasRetransmittableData retransmittable) {
1045 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash); 1058 entropy_manager_.RecordSentPacketEntropyHash(sequence_number, entropy_hash);
1046 if (!WritePacket(sequence_number, packet, retransmittable, NO_FORCE)) { 1059 if (!WritePacket(level, sequence_number, packet, retransmittable, NO_FORCE)) {
1047 queued_packets_.push_back(QueuedPacket(sequence_number, packet, 1060 queued_packets_.push_back(QueuedPacket(sequence_number, packet, level,
1048 retransmittable)); 1061 retransmittable));
1049 return false; 1062 return false;
1050 } 1063 }
1051 return true; 1064 return true;
1052 } 1065 }
1053 1066
1054 bool QuicConnection::ShouldSimulateLostPacket() { 1067 bool QuicConnection::ShouldSimulateLostPacket() {
1055 // TODO(rch): enable this 1068 // TODO(rch): enable this
1056 return false; 1069 return false;
1057 /* 1070 /*
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
1127 1140
1128 if (retransmission_timeouts_.empty()) { 1141 if (retransmission_timeouts_.empty()) {
1129 return QuicTime::Zero(); 1142 return QuicTime::Zero();
1130 } 1143 }
1131 1144
1132 // We have packets remaining. Return the absolute RTO of the oldest packet 1145 // We have packets remaining. Return the absolute RTO of the oldest packet
1133 // on the list. 1146 // on the list.
1134 return retransmission_timeouts_.top().scheduled_time; 1147 return retransmission_timeouts_.top().scheduled_time;
1135 } 1148 }
1136 1149
1137 void QuicConnection::ChangeEncrypter(QuicEncrypter* encrypter) { 1150 void QuicConnection::SetEncrypter(EncryptionLevel level,
1138 framer_.set_encrypter(encrypter); 1151 QuicEncrypter* encrypter) {
1152 framer_.SetEncrypter(level, encrypter);
1139 } 1153 }
1140 1154
1141 void QuicConnection::PushDecrypter(QuicDecrypter* decrypter) { 1155 const QuicEncrypter* QuicConnection::encrypter(EncryptionLevel level) const {
1142 framer_.push_decrypter(decrypter); 1156 return framer_.encrypter(level);
1143 } 1157 }
1144 1158
1145 void QuicConnection::PopDecrypter() { 1159 void QuicConnection::SetDefaultEncryptionLevel(
1146 framer_.pop_decrypter(); 1160 EncryptionLevel level) {
1161 encryption_level_ = level;
1162 }
1163
1164 void QuicConnection::SetDecrypter(QuicDecrypter* decrypter) {
1165 framer_.SetDecrypter(decrypter);
1166 }
1167
1168 void QuicConnection::SetAlternativeDecrypter(QuicDecrypter* decrypter,
1169 bool latch_once_used) {
1170 framer_.SetAlternativeDecrypter(decrypter, latch_once_used);
1171 }
1172
1173 const QuicDecrypter* QuicConnection::decrypter() const {
1174 return framer_.decrypter();
1175 }
1176
1177 const QuicDecrypter* QuicConnection::alternative_decrypter() const {
1178 return framer_.alternative_decrypter();
1147 } 1179 }
1148 1180
1149 void QuicConnection::MaybeProcessRevivedPacket() { 1181 void QuicConnection::MaybeProcessRevivedPacket() {
1150 QuicFecGroup* group = GetFecGroup(); 1182 QuicFecGroup* group = GetFecGroup();
1151 if (group == NULL || !group->CanRevive()) { 1183 if (group == NULL || !group->CanRevive()) {
1152 return; 1184 return;
1153 } 1185 }
1154 QuicPacketHeader revived_header; 1186 QuicPacketHeader revived_header;
1155 char revived_payload[kMaxPacketSize]; 1187 char revived_payload[kMaxPacketSize];
1156 size_t len = group->Revive(&revived_header, revived_payload, kMaxPacketSize); 1188 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_; 1233 frame.ack_frame = outgoing_ack_;
1202 1234
1203 SerializedPacket serialized_packet = 1235 SerializedPacket serialized_packet =
1204 packet_creator_.SerializeConnectionClose(&frame); 1236 packet_creator_.SerializeConnectionClose(&frame);
1205 1237
1206 // We need to update the sent entrophy hash for all sent packets. 1238 // We need to update the sent entrophy hash for all sent packets.
1207 entropy_manager_.RecordSentPacketEntropyHash( 1239 entropy_manager_.RecordSentPacketEntropyHash(
1208 serialized_packet.sequence_number, 1240 serialized_packet.sequence_number,
1209 serialized_packet.entropy_hash); 1241 serialized_packet.entropy_hash);
1210 1242
1211 WritePacket(serialized_packet.sequence_number, 1243 WritePacket(encryption_level_,
1244 serialized_packet.sequence_number,
1212 serialized_packet.packet, 1245 serialized_packet.packet,
1213 serialized_packet.retransmittable_frames != NULL ? 1246 serialized_packet.retransmittable_frames != NULL ?
1214 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA, 1247 HAS_RETRANSMITTABLE_DATA : NO_RETRANSMITTABLE_DATA,
1215 FORCE); 1248 FORCE);
1216 } 1249 }
1217 1250
1218 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error, 1251 void QuicConnection::SendConnectionCloseWithDetails(QuicErrorCode error,
1219 const string& details) { 1252 const string& details) {
1220 SendConnectionClosePacket(error, details); 1253 SendConnectionClosePacket(error, details);
1221 CloseConnection(error, false); 1254 CloseConnection(error, false);
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 << " delta:" << delta.ToMicroseconds(); 1305 << " delta:" << delta.ToMicroseconds();
1273 if (delta >= timeout_) { 1306 if (delta >= timeout_) {
1274 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT); 1307 SendConnectionClose(QUIC_CONNECTION_TIMED_OUT);
1275 return true; 1308 return true;
1276 } 1309 }
1277 helper_->SetTimeoutAlarm(timeout_.Subtract(delta)); 1310 helper_->SetTimeoutAlarm(timeout_.Subtract(delta));
1278 return false; 1311 return false;
1279 } 1312 }
1280 1313
1281 } // namespace net 1314 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_connection_helper_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698