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 931 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
942 } | 942 } |
943 | 943 |
944 void QuicConnection::MaybeSendInResponseToPacket() { | 944 void QuicConnection::MaybeSendInResponseToPacket() { |
945 if (!connected_) { | 945 if (!connected_) { |
946 return; | 946 return; |
947 } | 947 } |
948 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK); | 948 ScopedPacketBundler bundler(this, ack_queued_ ? SEND_ACK : NO_ACK); |
949 | 949 |
950 // Now that we have received an ack, we might be able to send packets which | 950 // Now that we have received an ack, we might be able to send packets which |
951 // are queued locally, or drain streams which are blocked. | 951 // are queued locally, or drain streams which are blocked. |
952 if (CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { | 952 if (CanWrite(HAS_RETRANSMITTABLE_DATA)) { |
953 OnCanWrite(); | 953 OnCanWrite(); |
954 } | 954 } |
955 } | 955 } |
956 | 956 |
957 void QuicConnection::SendVersionNegotiationPacket() { | 957 void QuicConnection::SendVersionNegotiationPacket() { |
958 // TODO(alyssar): implement zero server state negotiation. | 958 // TODO(alyssar): implement zero server state negotiation. |
959 pending_version_negotiation_packet_ = true; | 959 pending_version_negotiation_packet_ = true; |
960 if (writer_->IsWriteBlocked()) { | 960 if (writer_->IsWriteBlocked()) { |
961 visitor_->OnWriteBlocked(); | 961 visitor_->OnWriteBlocked(); |
962 return; | 962 return; |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1131 void QuicConnection::OnCanWrite() { | 1131 void QuicConnection::OnCanWrite() { |
1132 DCHECK(!writer_->IsWriteBlocked()); | 1132 DCHECK(!writer_->IsWriteBlocked()); |
1133 | 1133 |
1134 WriteQueuedPackets(); | 1134 WriteQueuedPackets(); |
1135 WritePendingRetransmissions(); | 1135 WritePendingRetransmissions(); |
1136 | 1136 |
1137 // Sending queued packets may have caused the socket to become write blocked, | 1137 // Sending queued packets may have caused the socket to become write blocked, |
1138 // or the congestion manager to prohibit sending. If we've sent everything | 1138 // or the congestion manager to prohibit sending. If we've sent everything |
1139 // we had queued and we're still not blocked, let the visitor know it can | 1139 // we had queued and we're still not blocked, let the visitor know it can |
1140 // write more. | 1140 // write more. |
1141 if (!CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { | 1141 if (!CanWrite(HAS_RETRANSMITTABLE_DATA)) { |
1142 return; | 1142 return; |
1143 } | 1143 } |
1144 | 1144 |
1145 { // Limit the scope of the bundler. | 1145 { // Limit the scope of the bundler. |
1146 // Set |include_ack| to false in bundler; ack inclusion happens elsewhere. | 1146 // Set |include_ack| to false in bundler; ack inclusion happens elsewhere. |
1147 ScopedPacketBundler bundler(this, NO_ACK); | 1147 ScopedPacketBundler bundler(this, NO_ACK); |
1148 visitor_->OnCanWrite(); | 1148 visitor_->OnCanWrite(); |
1149 } | 1149 } |
1150 | 1150 |
1151 // After the visitor writes, it may have caused the socket to become write | 1151 // After the visitor writes, it may have caused the socket to become write |
1152 // blocked or the congestion manager to prohibit sending, so check again. | 1152 // blocked or the congestion manager to prohibit sending, so check again. |
1153 if (visitor_->WillingAndAbleToWrite() && | 1153 if (visitor_->WillingAndAbleToWrite() && |
1154 !resume_writes_alarm_->IsSet() && | 1154 !resume_writes_alarm_->IsSet() && |
1155 CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA)) { | 1155 CanWrite(HAS_RETRANSMITTABLE_DATA)) { |
1156 // We're not write blocked, but some stream didn't write out all of its | 1156 // We're not write blocked, but some stream didn't write out all of its |
1157 // bytes. Register for 'immediate' resumption so we'll keep writing after | 1157 // bytes. Register for 'immediate' resumption so we'll keep writing after |
1158 // other connections and events have had a chance to use the thread. | 1158 // other connections and events have had a chance to use the thread. |
1159 resume_writes_alarm_->Set(clock_->ApproximateNow()); | 1159 resume_writes_alarm_->Set(clock_->ApproximateNow()); |
1160 } | 1160 } |
1161 } | 1161 } |
1162 | 1162 |
1163 void QuicConnection::WriteIfNotBlocked() { | 1163 void QuicConnection::WriteIfNotBlocked() { |
1164 if (!writer_->IsWriteBlocked()) { | 1164 if (!writer_->IsWriteBlocked()) { |
1165 OnCanWrite(); | 1165 OnCanWrite(); |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1216 } | 1216 } |
1217 } | 1217 } |
1218 | 1218 |
1219 void QuicConnection::WritePendingRetransmissions() { | 1219 void QuicConnection::WritePendingRetransmissions() { |
1220 // Keep writing as long as there's a pending retransmission which can be | 1220 // Keep writing as long as there's a pending retransmission which can be |
1221 // written. | 1221 // written. |
1222 while (sent_packet_manager_.HasPendingRetransmissions()) { | 1222 while (sent_packet_manager_.HasPendingRetransmissions()) { |
1223 const QuicSentPacketManager::PendingRetransmission pending = | 1223 const QuicSentPacketManager::PendingRetransmission pending = |
1224 sent_packet_manager_.NextPendingRetransmission(); | 1224 sent_packet_manager_.NextPendingRetransmission(); |
1225 if (GetPacketType(&pending.retransmittable_frames) == NORMAL && | 1225 if (GetPacketType(&pending.retransmittable_frames) == NORMAL && |
1226 !CanWrite(pending.transmission_type, HAS_RETRANSMITTABLE_DATA)) { | 1226 !CanWrite(HAS_RETRANSMITTABLE_DATA)) { |
1227 break; | 1227 break; |
1228 } | 1228 } |
1229 | 1229 |
1230 // Re-packetize the frames with a new sequence number for retransmission. | 1230 // Re-packetize the frames with a new sequence number for retransmission. |
1231 // Retransmitted data packets do not use FEC, even when it's enabled. | 1231 // Retransmitted data packets do not use FEC, even when it's enabled. |
1232 // Retransmitted packets use the same sequence number length as the | 1232 // Retransmitted packets use the same sequence number length as the |
1233 // original. | 1233 // original. |
1234 // Flush the packet creator before making a new packet. | 1234 // Flush the packet creator before making a new packet. |
1235 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that | 1235 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that |
1236 // does not require the creator to be flushed. | 1236 // does not require the creator to be flushed. |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1274 bool QuicConnection::ShouldGeneratePacket( | 1274 bool QuicConnection::ShouldGeneratePacket( |
1275 TransmissionType transmission_type, | 1275 TransmissionType transmission_type, |
1276 HasRetransmittableData retransmittable, | 1276 HasRetransmittableData retransmittable, |
1277 IsHandshake handshake) { | 1277 IsHandshake handshake) { |
1278 // We should serialize handshake packets immediately to ensure that they | 1278 // We should serialize handshake packets immediately to ensure that they |
1279 // end up sent at the right encryption level. | 1279 // end up sent at the right encryption level. |
1280 if (handshake == IS_HANDSHAKE) { | 1280 if (handshake == IS_HANDSHAKE) { |
1281 return true; | 1281 return true; |
1282 } | 1282 } |
1283 | 1283 |
1284 return CanWrite(transmission_type, retransmittable); | 1284 return CanWrite(retransmittable); |
1285 } | 1285 } |
1286 | 1286 |
1287 bool QuicConnection::CanWrite(TransmissionType transmission_type, | 1287 bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) { |
1288 HasRetransmittableData retransmittable) { | |
1289 if (writer_->IsWriteBlocked()) { | 1288 if (writer_->IsWriteBlocked()) { |
1290 visitor_->OnWriteBlocked(); | 1289 visitor_->OnWriteBlocked(); |
1291 return false; | 1290 return false; |
1292 } | 1291 } |
1293 | 1292 |
1294 send_alarm_->Cancel(); | 1293 send_alarm_->Cancel(); |
1295 QuicTime now = clock_->Now(); | 1294 QuicTime now = clock_->Now(); |
1296 QuicTime::Delta delay = sent_packet_manager_.TimeUntilSend( | 1295 QuicTime::Delta delay = sent_packet_manager_.TimeUntilSend( |
1297 now, transmission_type, retransmittable); | 1296 now, retransmittable); |
1298 if (delay.IsInfinite()) { | 1297 if (delay.IsInfinite()) { |
1299 return false; | 1298 return false; |
1300 } | 1299 } |
1301 | 1300 |
1302 // If the scheduler requires a delay, then we can not send this packet now. | 1301 // If the scheduler requires a delay, then we can not send this packet now. |
1303 if (!delay.IsZero()) { | 1302 if (!delay.IsZero()) { |
1304 send_alarm_->Set(now.Add(delay)); | 1303 send_alarm_->Set(now.Add(delay)); |
1305 DVLOG(1) << "Delaying sending."; | 1304 DVLOG(1) << "Delaying sending."; |
1306 return false; | 1305 return false; |
1307 } | 1306 } |
1308 return true; | 1307 return true; |
1309 } | 1308 } |
1310 | 1309 |
1311 bool QuicConnection::WritePacket(QueuedPacket packet) { | 1310 bool QuicConnection::WritePacket(QueuedPacket packet) { |
1312 QuicPacketSequenceNumber sequence_number = packet.sequence_number; | 1311 QuicPacketSequenceNumber sequence_number = packet.sequence_number; |
1313 if (ShouldDiscardPacket(packet.encryption_level, | 1312 if (ShouldDiscardPacket(packet.encryption_level, |
1314 sequence_number, | 1313 sequence_number, |
1315 packet.retransmittable)) { | 1314 packet.retransmittable)) { |
1316 ++stats_.packets_discarded; | 1315 ++stats_.packets_discarded; |
1317 return true; | 1316 return true; |
1318 } | 1317 } |
1319 | 1318 |
1320 // If the packet is CONNECTION_CLOSE, we need to try to send it immediately | 1319 // If the packet is CONNECTION_CLOSE, we need to try to send it immediately |
1321 // and encrypt it to hand it off to TimeWaitListManager. | 1320 // and encrypt it to hand it off to TimeWaitListManager. |
1322 // If the packet is QUEUED, we don't re-consult the congestion control. | 1321 // If the packet is QUEUED, we don't re-consult the congestion control. |
1323 // This ensures packets are sent in sequence number order. | 1322 // This ensures packets are sent in sequence number order. |
1324 // TODO(ianswett): The congestion control should have been consulted before | 1323 // TODO(ianswett): The congestion control should have been consulted before |
1325 // serializing the packet, so this could be turned into a LOG_IF(DFATAL). | 1324 // serializing the packet, so this could be turned into a LOG_IF(DFATAL). |
1326 if (packet.type == NORMAL && !CanWrite(packet.transmission_type, | 1325 if (packet.type == NORMAL && !CanWrite(packet.retransmittable)) { |
1327 packet.retransmittable)) { | |
1328 return false; | 1326 return false; |
1329 } | 1327 } |
1330 | 1328 |
1331 // Some encryption algorithms require the packet sequence numbers not be | 1329 // Some encryption algorithms require the packet sequence numbers not be |
1332 // repeated. | 1330 // repeated. |
1333 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); | 1331 DCHECK_LE(sequence_number_of_last_sent_packet_, sequence_number); |
1334 sequence_number_of_last_sent_packet_ = sequence_number; | 1332 sequence_number_of_last_sent_packet_ = sequence_number; |
1335 | 1333 |
1336 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( | 1334 QuicEncryptedPacket* encrypted = framer_.EncryptPacket( |
1337 packet.encryption_level, sequence_number, *packet.packet); | 1335 packet.encryption_level, sequence_number, *packet.packet); |
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1957 // If we changed the generator's batch state, restore original batch state. | 1955 // If we changed the generator's batch state, restore original batch state. |
1958 if (!already_in_batch_mode_) { | 1956 if (!already_in_batch_mode_) { |
1959 DVLOG(1) << "Leaving Batch Mode."; | 1957 DVLOG(1) << "Leaving Batch Mode."; |
1960 connection_->packet_generator_.FinishBatchOperations(); | 1958 connection_->packet_generator_.FinishBatchOperations(); |
1961 } | 1959 } |
1962 DCHECK_EQ(already_in_batch_mode_, | 1960 DCHECK_EQ(already_in_batch_mode_, |
1963 connection_->packet_generator_.InBatchMode()); | 1961 connection_->packet_generator_.InBatchMode()); |
1964 } | 1962 } |
1965 | 1963 |
1966 } // namespace net | 1964 } // namespace net |
OLD | NEW |