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 210 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
221 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), | 221 timeout_alarm_(helper->CreateAlarm(new TimeoutAlarm(this))), |
222 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), | 222 ping_alarm_(helper->CreateAlarm(new PingAlarm(this))), |
223 packet_generator_(connection_id_, &framer_, random_generator_, this), | 223 packet_generator_(connection_id_, &framer_, random_generator_, this), |
224 idle_network_timeout_( | 224 idle_network_timeout_( |
225 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), | 225 QuicTime::Delta::FromSeconds(kDefaultInitialTimeoutSecs)), |
226 overall_connection_timeout_(QuicTime::Delta::Infinite()), | 226 overall_connection_timeout_(QuicTime::Delta::Infinite()), |
227 time_of_last_received_packet_(clock_->ApproximateNow()), | 227 time_of_last_received_packet_(clock_->ApproximateNow()), |
228 time_of_last_sent_new_packet_(clock_->ApproximateNow()), | 228 time_of_last_sent_new_packet_(clock_->ApproximateNow()), |
229 sequence_number_of_last_sent_packet_(0), | 229 sequence_number_of_last_sent_packet_(0), |
230 sent_packet_manager_( | 230 sent_packet_manager_( |
231 is_server, clock_, &stats_, kCubic, | 231 is_server, clock_, &stats_, |
| 232 FLAGS_quic_use_bbr_congestion_control ? kBBR : kCubic, |
232 FLAGS_quic_use_time_loss_detection ? kTime : kNack), | 233 FLAGS_quic_use_time_loss_detection ? kTime : kNack), |
233 version_negotiation_state_(START_NEGOTIATION), | 234 version_negotiation_state_(START_NEGOTIATION), |
234 is_server_(is_server), | 235 is_server_(is_server), |
235 connected_(true), | 236 connected_(true), |
236 peer_ip_changed_(false), | 237 peer_ip_changed_(false), |
237 peer_port_changed_(false), | 238 peer_port_changed_(false), |
238 self_ip_changed_(false), | 239 self_ip_changed_(false), |
239 self_port_changed_(false) { | 240 self_port_changed_(false) { |
240 #if 0 | 241 #if 0 |
241 // TODO(rtenneti): Should we enable this code in chromium? | 242 // TODO(rtenneti): Should we enable this code in chromium? |
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 CloseConnection(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, false); | 402 CloseConnection(QUIC_INVALID_VERSION_NEGOTIATION_PACKET, false); |
402 return; | 403 return; |
403 } | 404 } |
404 | 405 |
405 if (!SelectMutualVersion(packet.versions)) { | 406 if (!SelectMutualVersion(packet.versions)) { |
406 SendConnectionCloseWithDetails(QUIC_INVALID_VERSION, | 407 SendConnectionCloseWithDetails(QUIC_INVALID_VERSION, |
407 "no common version found"); | 408 "no common version found"); |
408 return; | 409 return; |
409 } | 410 } |
410 | 411 |
411 DVLOG(1) << ENDPOINT << "negotiating version " << version(); | 412 DVLOG(1) << ENDPOINT |
| 413 << "Negotiated version: " << QuicVersionToString(version()); |
412 server_supported_versions_ = packet.versions; | 414 server_supported_versions_ = packet.versions; |
413 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS; | 415 version_negotiation_state_ = NEGOTIATION_IN_PROGRESS; |
414 RetransmitUnackedPackets(ALL_PACKETS); | 416 RetransmitUnackedPackets(ALL_PACKETS); |
415 } | 417 } |
416 | 418 |
417 void QuicConnection::OnRevivedPacket() { | 419 void QuicConnection::OnRevivedPacket() { |
418 } | 420 } |
419 | 421 |
420 bool QuicConnection::OnUnauthenticatedPublicHeader( | 422 bool QuicConnection::OnUnauthenticatedPublicHeader( |
421 const QuicPacketPublicHeader& header) { | 423 const QuicPacketPublicHeader& header) { |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
562 received_packet_manager_.least_packet_awaited_by_peer() - 1); | 564 received_packet_manager_.least_packet_awaited_by_peer() - 1); |
563 | 565 |
564 sent_packet_manager_.OnIncomingAck(incoming_ack, | 566 sent_packet_manager_.OnIncomingAck(incoming_ack, |
565 time_of_last_received_packet_); | 567 time_of_last_received_packet_); |
566 if (sent_packet_manager_.HasPendingRetransmissions()) { | 568 if (sent_packet_manager_.HasPendingRetransmissions()) { |
567 WriteIfNotBlocked(); | 569 WriteIfNotBlocked(); |
568 } | 570 } |
569 | 571 |
570 // Always reset the retransmission alarm when an ack comes in, since we now | 572 // Always reset the retransmission alarm when an ack comes in, since we now |
571 // have a better estimate of the current rtt than when it was set. | 573 // have a better estimate of the current rtt than when it was set. |
572 retransmission_alarm_->Cancel(); | |
573 QuicTime retransmission_time = | 574 QuicTime retransmission_time = |
574 sent_packet_manager_.GetRetransmissionTime(); | 575 sent_packet_manager_.GetRetransmissionTime(); |
575 if (retransmission_time != QuicTime::Zero()) { | 576 retransmission_alarm_->Update(retransmission_time, |
576 retransmission_alarm_->Set(retransmission_time); | 577 QuicTime::Delta::FromMilliseconds(1)); |
577 } | |
578 } | 578 } |
579 | 579 |
580 void QuicConnection::ProcessStopWaitingFrame( | 580 void QuicConnection::ProcessStopWaitingFrame( |
581 const QuicStopWaitingFrame& stop_waiting) { | 581 const QuicStopWaitingFrame& stop_waiting) { |
582 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number; | 582 largest_seen_packet_with_stop_waiting_ = last_header_.packet_sequence_number; |
583 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); | 583 received_packet_manager_.UpdatePacketInformationSentByPeer(stop_waiting); |
584 // Possibly close any FecGroups which are now irrelevant. | 584 // Possibly close any FecGroups which are now irrelevant. |
585 CloseFecGroupsBefore(stop_waiting.least_unacked + 1); | 585 CloseFecGroupsBefore(stop_waiting.least_unacked + 1); |
586 } | 586 } |
587 | 587 |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
963 } | 963 } |
964 } | 964 } |
965 | 965 |
966 void QuicConnection::SendVersionNegotiationPacket() { | 966 void QuicConnection::SendVersionNegotiationPacket() { |
967 // TODO(alyssar): implement zero server state negotiation. | 967 // TODO(alyssar): implement zero server state negotiation. |
968 pending_version_negotiation_packet_ = true; | 968 pending_version_negotiation_packet_ = true; |
969 if (writer_->IsWriteBlocked()) { | 969 if (writer_->IsWriteBlocked()) { |
970 visitor_->OnWriteBlocked(); | 970 visitor_->OnWriteBlocked(); |
971 return; | 971 return; |
972 } | 972 } |
| 973 DVLOG(1) << ENDPOINT << "Sending version negotiation packet: {" |
| 974 << QuicVersionVectorToString(framer_.supported_versions()) << "}"; |
973 scoped_ptr<QuicEncryptedPacket> version_packet( | 975 scoped_ptr<QuicEncryptedPacket> version_packet( |
974 packet_generator_.SerializeVersionNegotiationPacket( | 976 packet_generator_.SerializeVersionNegotiationPacket( |
975 framer_.supported_versions())); | 977 framer_.supported_versions())); |
976 WriteResult result = writer_->WritePacket( | 978 WriteResult result = writer_->WritePacket( |
977 version_packet->data(), version_packet->length(), | 979 version_packet->data(), version_packet->length(), |
978 self_address().address(), peer_address()); | 980 self_address().address(), peer_address()); |
979 | 981 |
980 if (result.status == WRITE_STATUS_ERROR) { | 982 if (result.status == WRITE_STATUS_ERROR) { |
981 // We can't send an error as the socket is presumably borked. | 983 // We can't send an error as the socket is presumably borked. |
982 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); | 984 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); |
(...skipping 288 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1271 void QuicConnection::RetransmitUnackedPackets( | 1273 void QuicConnection::RetransmitUnackedPackets( |
1272 RetransmissionType retransmission_type) { | 1274 RetransmissionType retransmission_type) { |
1273 sent_packet_manager_.RetransmitUnackedPackets(retransmission_type); | 1275 sent_packet_manager_.RetransmitUnackedPackets(retransmission_type); |
1274 | 1276 |
1275 WriteIfNotBlocked(); | 1277 WriteIfNotBlocked(); |
1276 } | 1278 } |
1277 | 1279 |
1278 void QuicConnection::NeuterUnencryptedPackets() { | 1280 void QuicConnection::NeuterUnencryptedPackets() { |
1279 sent_packet_manager_.NeuterUnencryptedPackets(); | 1281 sent_packet_manager_.NeuterUnencryptedPackets(); |
1280 // This may have changed the retransmission timer, so re-arm it. | 1282 // This may have changed the retransmission timer, so re-arm it. |
1281 retransmission_alarm_->Cancel(); | |
1282 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); | 1283 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); |
1283 if (retransmission_time != QuicTime::Zero()) { | 1284 retransmission_alarm_->Update(retransmission_time, |
1284 retransmission_alarm_->Set(retransmission_time); | 1285 QuicTime::Delta::FromMilliseconds(1)); |
1285 } | |
1286 } | 1286 } |
1287 | 1287 |
1288 bool QuicConnection::ShouldGeneratePacket( | 1288 bool QuicConnection::ShouldGeneratePacket( |
1289 TransmissionType transmission_type, | 1289 TransmissionType transmission_type, |
1290 HasRetransmittableData retransmittable, | 1290 HasRetransmittableData retransmittable, |
1291 IsHandshake handshake) { | 1291 IsHandshake handshake) { |
1292 // We should serialize handshake packets immediately to ensure that they | 1292 // We should serialize handshake packets immediately to ensure that they |
1293 // end up sent at the right encryption level. | 1293 // end up sent at the right encryption level. |
1294 if (handshake == IS_HANDSHAKE) { | 1294 if (handshake == IS_HANDSHAKE) { |
1295 return true; | 1295 return true; |
1296 } | 1296 } |
1297 | 1297 |
1298 return CanWrite(retransmittable); | 1298 return CanWrite(retransmittable); |
1299 } | 1299 } |
1300 | 1300 |
1301 bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) { | 1301 bool QuicConnection::CanWrite(HasRetransmittableData retransmittable) { |
1302 if (writer_->IsWriteBlocked()) { | 1302 if (writer_->IsWriteBlocked()) { |
1303 visitor_->OnWriteBlocked(); | 1303 visitor_->OnWriteBlocked(); |
1304 return false; | 1304 return false; |
1305 } | 1305 } |
1306 | 1306 |
1307 send_alarm_->Cancel(); | |
1308 QuicTime now = clock_->Now(); | 1307 QuicTime now = clock_->Now(); |
1309 QuicTime::Delta delay = sent_packet_manager_.TimeUntilSend( | 1308 QuicTime::Delta delay = sent_packet_manager_.TimeUntilSend( |
1310 now, retransmittable); | 1309 now, retransmittable); |
1311 if (delay.IsInfinite()) { | 1310 if (delay.IsInfinite()) { |
| 1311 send_alarm_->Cancel(); |
1312 return false; | 1312 return false; |
1313 } | 1313 } |
1314 | 1314 |
1315 // If the scheduler requires a delay, then we can not send this packet now. | 1315 // If the scheduler requires a delay, then we can not send this packet now. |
1316 if (!delay.IsZero()) { | 1316 if (!delay.IsZero()) { |
1317 send_alarm_->Set(now.Add(delay)); | 1317 send_alarm_->Update(now.Add(delay), QuicTime::Delta::FromMilliseconds(1)); |
1318 DVLOG(1) << "Delaying sending."; | 1318 DVLOG(1) << "Delaying sending."; |
1319 return false; | 1319 return false; |
1320 } | 1320 } |
| 1321 send_alarm_->Cancel(); |
1321 return true; | 1322 return true; |
1322 } | 1323 } |
1323 | 1324 |
1324 bool QuicConnection::WritePacket(QueuedPacket packet) { | 1325 bool QuicConnection::WritePacket(QueuedPacket packet) { |
1325 QuicPacketSequenceNumber sequence_number = packet.sequence_number; | 1326 QuicPacketSequenceNumber sequence_number = packet.sequence_number; |
1326 if (ShouldDiscardPacket(packet.encryption_level, | 1327 if (ShouldDiscardPacket(packet.encryption_level, |
1327 sequence_number, | 1328 sequence_number, |
1328 packet.retransmittable)) { | 1329 packet.retransmittable)) { |
1329 ++stats_.packets_discarded; | 1330 ++stats_.packets_discarded; |
1330 return true; | 1331 return true; |
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 // options by a more explicit API than setting a struct value directly. | 1505 // options by a more explicit API than setting a struct value directly. |
1505 packet_generator_.UpdateSequenceNumberLength( | 1506 packet_generator_.UpdateSequenceNumberLength( |
1506 received_packet_manager_.least_packet_awaited_by_peer(), | 1507 received_packet_manager_.least_packet_awaited_by_peer(), |
1507 sent_packet_manager_.GetCongestionWindow()); | 1508 sent_packet_manager_.GetCongestionWindow()); |
1508 | 1509 |
1509 bool reset_retransmission_alarm = | 1510 bool reset_retransmission_alarm = |
1510 sent_packet_manager_.OnPacketSent(sequence_number, now, length, | 1511 sent_packet_manager_.OnPacketSent(sequence_number, now, length, |
1511 transmission_type, retransmittable); | 1512 transmission_type, retransmittable); |
1512 | 1513 |
1513 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { | 1514 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { |
1514 retransmission_alarm_->Cancel(); | |
1515 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); | 1515 QuicTime retransmission_time = sent_packet_manager_.GetRetransmissionTime(); |
1516 if (retransmission_time != QuicTime::Zero()) { | 1516 retransmission_alarm_->Update(retransmission_time, |
1517 retransmission_alarm_->Set(retransmission_time); | 1517 QuicTime::Delta::FromMilliseconds(1)); |
1518 } | |
1519 } | 1518 } |
1520 | 1519 |
1521 stats_.bytes_sent += result.bytes_written; | 1520 stats_.bytes_sent += result.bytes_written; |
1522 ++stats_.packets_sent; | 1521 ++stats_.packets_sent; |
1523 | 1522 |
1524 if (transmission_type != NOT_RETRANSMISSION) { | 1523 if (transmission_type != NOT_RETRANSMISSION) { |
1525 stats_.bytes_retransmitted += result.bytes_written; | 1524 stats_.bytes_retransmitted += result.bytes_written; |
1526 ++stats_.packets_retransmitted; | 1525 ++stats_.packets_retransmitted; |
1527 } | 1526 } |
1528 | 1527 |
(...skipping 96 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1625 // to send new data before retransmitting. | 1624 // to send new data before retransmitting. |
1626 if (sent_packet_manager_.MaybeRetransmitTailLossProbe()) { | 1625 if (sent_packet_manager_.MaybeRetransmitTailLossProbe()) { |
1627 // Send the pending retransmission now that it's been queued. | 1626 // Send the pending retransmission now that it's been queued. |
1628 WriteIfNotBlocked(); | 1627 WriteIfNotBlocked(); |
1629 } | 1628 } |
1630 | 1629 |
1631 // Ensure the retransmission alarm is always set if there are unacked packets | 1630 // Ensure the retransmission alarm is always set if there are unacked packets |
1632 // and nothing waiting to be sent. | 1631 // and nothing waiting to be sent. |
1633 if (!HasQueuedData() && !retransmission_alarm_->IsSet()) { | 1632 if (!HasQueuedData() && !retransmission_alarm_->IsSet()) { |
1634 QuicTime rto_timeout = sent_packet_manager_.GetRetransmissionTime(); | 1633 QuicTime rto_timeout = sent_packet_manager_.GetRetransmissionTime(); |
1635 if (rto_timeout != QuicTime::Zero()) { | 1634 if (rto_timeout.IsInitialized()) { |
1636 retransmission_alarm_->Set(rto_timeout); | 1635 retransmission_alarm_->Set(rto_timeout); |
1637 } | 1636 } |
1638 } | 1637 } |
1639 } | 1638 } |
1640 | 1639 |
1641 void QuicConnection::SetEncrypter(EncryptionLevel level, | 1640 void QuicConnection::SetEncrypter(EncryptionLevel level, |
1642 QuicEncrypter* encrypter) { | 1641 QuicEncrypter* encrypter) { |
1643 framer_.SetEncrypter(level, encrypter); | 1642 framer_.SetEncrypter(level, encrypter); |
1644 } | 1643 } |
1645 | 1644 |
(...skipping 229 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1875 IS_HANDSHAKE : NOT_HANDSHAKE; | 1874 IS_HANDSHAKE : NOT_HANDSHAKE; |
1876 // Sending queued packets may have caused the socket to become write blocked, | 1875 // Sending queued packets may have caused the socket to become write blocked, |
1877 // or the congestion manager to prohibit sending. If we've sent everything | 1876 // or the congestion manager to prohibit sending. If we've sent everything |
1878 // we had queued and we're still not blocked, let the visitor know it can | 1877 // we had queued and we're still not blocked, let the visitor know it can |
1879 // write more. | 1878 // write more. |
1880 return ShouldGeneratePacket(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, | 1879 return ShouldGeneratePacket(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, |
1881 pending_handshake); | 1880 pending_handshake); |
1882 } | 1881 } |
1883 | 1882 |
1884 void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { | 1883 void QuicConnection::SetIdleNetworkTimeout(QuicTime::Delta timeout) { |
| 1884 // Adjust the idle timeout on client and server to prevent clients from |
| 1885 // sending requests to servers which have already closed the connection. |
| 1886 if (is_server_) { |
| 1887 timeout = timeout.Add(QuicTime::Delta::FromSeconds(1)); |
| 1888 } else if (timeout > QuicTime::Delta::FromSeconds(1)) { |
| 1889 timeout = timeout.Subtract(QuicTime::Delta::FromSeconds(1)); |
| 1890 } |
| 1891 |
1885 if (timeout < idle_network_timeout_) { | 1892 if (timeout < idle_network_timeout_) { |
1886 idle_network_timeout_ = timeout; | 1893 idle_network_timeout_ = timeout; |
1887 CheckForTimeout(); | 1894 CheckForTimeout(); |
1888 } else { | 1895 } else { |
1889 idle_network_timeout_ = timeout; | 1896 idle_network_timeout_ = timeout; |
1890 } | 1897 } |
1891 } | 1898 } |
1892 | 1899 |
1893 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { | 1900 void QuicConnection::SetOverallConnectionTimeout(QuicTime::Delta timeout) { |
1894 if (timeout < overall_connection_timeout_) { | 1901 if (timeout < overall_connection_timeout_) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1937 | 1944 |
1938 // Take the min timeout. | 1945 // Take the min timeout. |
1939 QuicTime::Delta connection_timeout = | 1946 QuicTime::Delta connection_timeout = |
1940 overall_connection_timeout_.Subtract(connected_time); | 1947 overall_connection_timeout_.Subtract(connected_time); |
1941 if (connection_timeout < timeout) { | 1948 if (connection_timeout < timeout) { |
1942 timeout = connection_timeout; | 1949 timeout = connection_timeout; |
1943 } | 1950 } |
1944 } | 1951 } |
1945 | 1952 |
1946 timeout_alarm_->Cancel(); | 1953 timeout_alarm_->Cancel(); |
1947 timeout_alarm_->Set(clock_->ApproximateNow().Add(timeout)); | 1954 timeout_alarm_->Set(now.Add(timeout)); |
1948 return false; | 1955 return false; |
1949 } | 1956 } |
1950 | 1957 |
1951 void QuicConnection::SetPingAlarm() { | 1958 void QuicConnection::SetPingAlarm() { |
1952 if (is_server_) { | 1959 if (is_server_) { |
1953 // Only clients send pings. | 1960 // Only clients send pings. |
1954 return; | 1961 return; |
1955 } | 1962 } |
1956 ping_alarm_->Cancel(); | |
1957 if (!visitor_->HasOpenDataStreams()) { | 1963 if (!visitor_->HasOpenDataStreams()) { |
| 1964 ping_alarm_->Cancel(); |
1958 // Don't send a ping unless there are open streams. | 1965 // Don't send a ping unless there are open streams. |
1959 return; | 1966 return; |
1960 } | 1967 } |
1961 QuicTime::Delta ping_timeout = QuicTime::Delta::FromSeconds(kPingTimeoutSecs); | 1968 QuicTime::Delta ping_timeout = QuicTime::Delta::FromSeconds(kPingTimeoutSecs); |
1962 ping_alarm_->Set(clock_->ApproximateNow().Add(ping_timeout)); | 1969 ping_alarm_->Update(clock_->ApproximateNow().Add(ping_timeout), |
| 1970 QuicTime::Delta::FromSeconds(1)); |
1963 } | 1971 } |
1964 | 1972 |
1965 QuicConnection::ScopedPacketBundler::ScopedPacketBundler( | 1973 QuicConnection::ScopedPacketBundler::ScopedPacketBundler( |
1966 QuicConnection* connection, | 1974 QuicConnection* connection, |
1967 AckBundling send_ack) | 1975 AckBundling send_ack) |
1968 : connection_(connection), | 1976 : connection_(connection), |
1969 already_in_batch_mode_(connection != NULL && | 1977 already_in_batch_mode_(connection != NULL && |
1970 connection->packet_generator_.InBatchMode()) { | 1978 connection->packet_generator_.InBatchMode()) { |
1971 if (connection_ == NULL) { | 1979 if (connection_ == NULL) { |
1972 return; | 1980 return; |
(...skipping 21 matching lines...) Expand all Loading... |
1994 // If we changed the generator's batch state, restore original batch state. | 2002 // If we changed the generator's batch state, restore original batch state. |
1995 if (!already_in_batch_mode_) { | 2003 if (!already_in_batch_mode_) { |
1996 DVLOG(1) << "Leaving Batch Mode."; | 2004 DVLOG(1) << "Leaving Batch Mode."; |
1997 connection_->packet_generator_.FinishBatchOperations(); | 2005 connection_->packet_generator_.FinishBatchOperations(); |
1998 } | 2006 } |
1999 DCHECK_EQ(already_in_batch_mode_, | 2007 DCHECK_EQ(already_in_batch_mode_, |
2000 connection_->packet_generator_.InBatchMode()); | 2008 connection_->packet_generator_.InBatchMode()); |
2001 } | 2009 } |
2002 | 2010 |
2003 } // namespace net | 2011 } // namespace net |
OLD | NEW |