| 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 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 1426 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1437 << (packet->serialized_packet.is_fec_packet | 1437 << (packet->serialized_packet.is_fec_packet |
| 1438 ? "FEC " | 1438 ? "FEC " |
| 1439 : (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA | 1439 : (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA |
| 1440 ? "data bearing " | 1440 ? "data bearing " |
| 1441 : " ack only ")) << ", encryption level: " | 1441 : " ack only ")) << ", encryption level: " |
| 1442 << QuicUtils::EncryptionLevelToString(packet->encryption_level) | 1442 << QuicUtils::EncryptionLevelToString(packet->encryption_level) |
| 1443 << ", encrypted length:" << encrypted->length(); | 1443 << ", encrypted length:" << encrypted->length(); |
| 1444 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl | 1444 DVLOG(2) << ENDPOINT << "packet(" << sequence_number << "): " << std::endl |
| 1445 << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece()); | 1445 << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece()); |
| 1446 | 1446 |
| 1447 QuicTime packet_send_time = QuicTime::Zero(); | 1447 // Measure the RTT from before the write begins to avoid underestimating the |
| 1448 if (FLAGS_quic_record_send_time_before_write) { | 1448 // min_rtt_, especially in cases where the thread blocks or gets swapped out |
| 1449 // Measure the RTT from before the write begins to avoid underestimating the | 1449 // during the WritePacket below. |
| 1450 // min_rtt_, especially in cases where the thread blocks or gets swapped out | 1450 QuicTime packet_send_time = clock_->Now(); |
| 1451 // during the WritePacket below. | |
| 1452 packet_send_time = clock_->Now(); | |
| 1453 } | |
| 1454 WriteResult result = writer_->WritePacket(encrypted->data(), | 1451 WriteResult result = writer_->WritePacket(encrypted->data(), |
| 1455 encrypted->length(), | 1452 encrypted->length(), |
| 1456 self_address().address(), | 1453 self_address().address(), |
| 1457 peer_address()); | 1454 peer_address()); |
| 1458 if (result.error_code == ERR_IO_PENDING) { | 1455 if (result.error_code == ERR_IO_PENDING) { |
| 1459 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); | 1456 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); |
| 1460 } | 1457 } |
| 1461 | 1458 |
| 1462 if (result.status == WRITE_STATUS_BLOCKED) { | 1459 if (result.status == WRITE_STATUS_BLOCKED) { |
| 1463 visitor_->OnWriteBlocked(); | 1460 visitor_->OnWriteBlocked(); |
| 1464 // If the socket buffers the the data, then the packet should not | 1461 // If the socket buffers the the data, then the packet should not |
| 1465 // be queued and sent again, which would result in an unnecessary | 1462 // be queued and sent again, which would result in an unnecessary |
| 1466 // duplicate packet being sent. The helper must call OnCanWrite | 1463 // duplicate packet being sent. The helper must call OnCanWrite |
| 1467 // when the write completes, and OnWriteError if an error occurs. | 1464 // when the write completes, and OnWriteError if an error occurs. |
| 1468 if (!writer_->IsWriteBlockedDataBuffered()) { | 1465 if (!writer_->IsWriteBlockedDataBuffered()) { |
| 1469 return false; | 1466 return false; |
| 1470 } | 1467 } |
| 1471 } | 1468 } |
| 1472 if (!FLAGS_quic_record_send_time_before_write) { | |
| 1473 packet_send_time = clock_->Now(); | |
| 1474 } | |
| 1475 if (!packet_send_time.IsInitialized()) { | |
| 1476 // TODO(jokulik): This is only needed because of the two code paths for | |
| 1477 // initializing packet_send_time. Once "quic_record_send_time_before_write" | |
| 1478 // is deprecated, this check can be removed. | |
| 1479 LOG(DFATAL) << "The packet send time should never be zero. " | |
| 1480 << "This is a programming bug, please report it."; | |
| 1481 } | |
| 1482 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) { | 1469 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) { |
| 1483 // Pass the write result to the visitor. | 1470 // Pass the write result to the visitor. |
| 1484 debug_visitor_->OnPacketSent(packet->serialized_packet, | 1471 debug_visitor_->OnPacketSent(packet->serialized_packet, |
| 1485 packet->original_sequence_number, | 1472 packet->original_sequence_number, |
| 1486 packet->encryption_level, | 1473 packet->encryption_level, |
| 1487 packet->transmission_type, | 1474 packet->transmission_type, |
| 1488 *encrypted, | 1475 *encrypted, |
| 1489 packet_send_time); | 1476 packet_send_time); |
| 1490 } | 1477 } |
| 1491 if (packet->transmission_type == NOT_RETRANSMISSION) { | 1478 if (packet->transmission_type == NOT_RETRANSMISSION) { |
| 1492 time_of_last_sent_new_packet_ = packet_send_time; | 1479 time_of_last_sent_new_packet_ = packet_send_time; |
| 1493 } | 1480 } |
| 1494 SetPingAlarm(); | 1481 SetPingAlarm(); |
| 1495 MaybeSetFecAlarm(sequence_number); | 1482 MaybeSetFecAlarm(sequence_number); |
| 1496 DVLOG(1) << ENDPOINT << "time " | 1483 DVLOG(1) << ENDPOINT << "time we began writing last sent packet: " |
| 1497 << (FLAGS_quic_record_send_time_before_write ? | |
| 1498 "we began writing " : "we finished writing ") | |
| 1499 << "last sent packet: " | |
| 1500 << packet_send_time.ToDebuggingValue(); | 1484 << packet_send_time.ToDebuggingValue(); |
| 1501 | 1485 |
| 1502 // TODO(ianswett): Change the sequence number length and other packet creator | 1486 // TODO(ianswett): Change the sequence number length and other packet creator |
| 1503 // options by a more explicit API than setting a struct value directly, | 1487 // options by a more explicit API than setting a struct value directly, |
| 1504 // perhaps via the NetworkChangeVisitor. | 1488 // perhaps via the NetworkChangeVisitor. |
| 1505 packet_generator_.UpdateSequenceNumberLength( | 1489 packet_generator_.UpdateSequenceNumberLength( |
| 1506 sent_packet_manager_.least_packet_awaited_by_peer(), | 1490 sent_packet_manager_.least_packet_awaited_by_peer(), |
| 1507 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); | 1491 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); |
| 1508 | 1492 |
| 1509 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( | 1493 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( |
| (...skipping 588 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2098 } | 2082 } |
| 2099 for (const QuicFrame& frame : retransmittable_frames->frames()) { | 2083 for (const QuicFrame& frame : retransmittable_frames->frames()) { |
| 2100 if (frame.type == CONNECTION_CLOSE_FRAME) { | 2084 if (frame.type == CONNECTION_CLOSE_FRAME) { |
| 2101 return true; | 2085 return true; |
| 2102 } | 2086 } |
| 2103 } | 2087 } |
| 2104 return false; | 2088 return false; |
| 2105 } | 2089 } |
| 2106 | 2090 |
| 2107 } // namespace net | 2091 } // namespace net |
| OLD | NEW |