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

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

Issue 1569823008: relnote: Merge all fields of QueuedPacket into SerializedPacket. No functional change. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: track previous cl Created 4 years, 11 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
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_protocol.h » ('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 <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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after
224 } 224 }
225 225
226 QuicConnection* connection_; 226 QuicConnection* connection_;
227 QuicByteCount probe_size_; 227 QuicByteCount probe_size_;
228 228
229 DISALLOW_COPY_AND_ASSIGN(MtuDiscoveryAckListener); 229 DISALLOW_COPY_AND_ASSIGN(MtuDiscoveryAckListener);
230 }; 230 };
231 231
232 } // namespace 232 } // namespace
233 233
234 QuicConnection::QueuedPacket::QueuedPacket(SerializedPacket packet)
235 : serialized_packet(packet),
236 transmission_type(NOT_RETRANSMISSION),
237 original_packet_number(0) {}
238
239 QuicConnection::QueuedPacket::QueuedPacket(
240 SerializedPacket packet,
241 TransmissionType transmission_type,
242 QuicPacketNumber original_packet_number)
243 : serialized_packet(packet),
244 transmission_type(transmission_type),
245 original_packet_number(original_packet_number) {}
246
247 #define ENDPOINT \ 234 #define ENDPOINT \
248 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ") 235 (perspective_ == Perspective::IS_SERVER ? "Server: " : "Client: ")
249 236
250 QuicConnection::QuicConnection(QuicConnectionId connection_id, 237 QuicConnection::QuicConnection(QuicConnectionId connection_id,
251 IPEndPoint address, 238 IPEndPoint address,
252 QuicConnectionHelperInterface* helper, 239 QuicConnectionHelperInterface* helper,
253 const PacketWriterFactory& writer_factory, 240 const PacketWriterFactory& writer_factory,
254 bool owns_writer, 241 bool owns_writer,
255 Perspective perspective, 242 Perspective perspective,
256 const QuicVersionVector& supported_versions) 243 const QuicVersionVector& supported_versions)
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
352 if (termination_packets_.get() != nullptr) { 339 if (termination_packets_.get() != nullptr) {
353 STLDeleteElements(termination_packets_.get()); 340 STLDeleteElements(termination_packets_.get());
354 } 341 }
355 STLDeleteValues(&group_map_); 342 STLDeleteValues(&group_map_);
356 ClearQueuedPackets(); 343 ClearQueuedPackets();
357 } 344 }
358 345
359 void QuicConnection::ClearQueuedPackets() { 346 void QuicConnection::ClearQueuedPackets() {
360 for (QueuedPacketList::iterator it = queued_packets_.begin(); 347 for (QueuedPacketList::iterator it = queued_packets_.begin();
361 it != queued_packets_.end(); ++it) { 348 it != queued_packets_.end(); ++it) {
362 delete it->serialized_packet.retransmittable_frames; 349 delete it->retransmittable_frames;
363 delete it->serialized_packet.packet; 350 delete it->packet;
364 } 351 }
365 queued_packets_.clear(); 352 queued_packets_.clear();
366 } 353 }
367 354
368 void QuicConnection::SetFromConfig(const QuicConfig& config) { 355 void QuicConnection::SetFromConfig(const QuicConfig& config) {
369 if (config.negotiated()) { 356 if (config.negotiated()) {
370 SetNetworkTimeouts(QuicTime::Delta::Infinite(), 357 SetNetworkTimeouts(QuicTime::Delta::Infinite(),
371 config.IdleConnectionStateLifetime()); 358 config.IdleConnectionStateLifetime());
372 if (config.SilentClose()) { 359 if (config.SilentClose()) {
373 silent_close_enabled_ = true; 360 silent_close_enabled_ = true;
(...skipping 780 matching lines...) Expand 10 before | Expand all | Expand 10 after
1154 // All data for streams which are reset with QUIC_STREAM_NO_ERROR must 1141 // All data for streams which are reset with QUIC_STREAM_NO_ERROR must
1155 // be received by the peer. 1142 // be received by the peer.
1156 return; 1143 return;
1157 } 1144 }
1158 1145
1159 sent_packet_manager_.CancelRetransmissionsForStream(id); 1146 sent_packet_manager_.CancelRetransmissionsForStream(id);
1160 // Remove all queued packets which only contain data for the reset stream. 1147 // Remove all queued packets which only contain data for the reset stream.
1161 QueuedPacketList::iterator packet_iterator = queued_packets_.begin(); 1148 QueuedPacketList::iterator packet_iterator = queued_packets_.begin();
1162 while (packet_iterator != queued_packets_.end()) { 1149 while (packet_iterator != queued_packets_.end()) {
1163 RetransmittableFrames* retransmittable_frames = 1150 RetransmittableFrames* retransmittable_frames =
1164 packet_iterator->serialized_packet.retransmittable_frames; 1151 packet_iterator->retransmittable_frames;
1165 if (!retransmittable_frames) { 1152 if (!retransmittable_frames) {
1166 ++packet_iterator; 1153 ++packet_iterator;
1167 continue; 1154 continue;
1168 } 1155 }
1169 retransmittable_frames->RemoveFramesForStream(id); 1156 retransmittable_frames->RemoveFramesForStream(id);
1170 if (!retransmittable_frames->frames().empty()) { 1157 if (!retransmittable_frames->frames().empty()) {
1171 ++packet_iterator; 1158 ++packet_iterator;
1172 continue; 1159 continue;
1173 } 1160 }
1174 delete packet_iterator->serialized_packet.retransmittable_frames; 1161 delete packet_iterator->retransmittable_frames;
1175 delete packet_iterator->serialized_packet.packet; 1162 delete packet_iterator->packet;
1176 packet_iterator->serialized_packet.retransmittable_frames = nullptr; 1163 packet_iterator->retransmittable_frames = nullptr;
1177 packet_iterator->serialized_packet.packet = nullptr; 1164 packet_iterator->packet = nullptr;
1178 packet_iterator = queued_packets_.erase(packet_iterator); 1165 packet_iterator = queued_packets_.erase(packet_iterator);
1179 } 1166 }
1180 } 1167 }
1181 1168
1182 void QuicConnection::SendWindowUpdate(QuicStreamId id, 1169 void QuicConnection::SendWindowUpdate(QuicStreamId id,
1183 QuicStreamOffset byte_offset) { 1170 QuicStreamOffset byte_offset) {
1184 // Opportunistically bundle an ack with this outgoing packet. 1171 // Opportunistically bundle an ack with this outgoing packet.
1185 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK); 1172 ScopedPacketBundler ack_bundler(this, BUNDLE_PENDING_ACK);
1186 packet_generator_.AddControlFrame( 1173 packet_generator_.AddControlFrame(
1187 QuicFrame(new QuicWindowUpdateFrame(id, byte_offset))); 1174 QuicFrame(new QuicWindowUpdateFrame(id, byte_offset)));
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
1464 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that 1451 // TODO(ianswett): Implement ReserializeAllFrames as a separate path that
1465 // does not require the creator to be flushed. 1452 // does not require the creator to be flushed.
1466 packet_generator_.FlushAllQueuedFrames(); 1453 packet_generator_.FlushAllQueuedFrames();
1467 char buffer[kMaxPacketSize]; 1454 char buffer[kMaxPacketSize];
1468 SerializedPacket serialized_packet = packet_generator_.ReserializeAllFrames( 1455 SerializedPacket serialized_packet = packet_generator_.ReserializeAllFrames(
1469 pending.retransmittable_frames, pending.encryption_level, 1456 pending.retransmittable_frames, pending.encryption_level,
1470 pending.packet_number_length, buffer, kMaxPacketSize); 1457 pending.packet_number_length, buffer, kMaxPacketSize);
1471 if (serialized_packet.packet == nullptr) { 1458 if (serialized_packet.packet == nullptr) {
1472 // We failed to serialize the packet, so close the connection. 1459 // We failed to serialize the packet, so close the connection.
1473 // CloseConnection does not send close packet, so no infinite loop here. 1460 // CloseConnection does not send close packet, so no infinite loop here.
1461 // TODO(ianswett): This is actually an internal error, not an encryption
1462 // failure.
1474 CloseConnection(QUIC_ENCRYPTION_FAILURE, false); 1463 CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
1475 return; 1464 return;
1476 } 1465 }
1477 1466
1478 DVLOG(1) << ENDPOINT << "Retransmitting " << pending.packet_number << " as " 1467 DVLOG(1) << ENDPOINT << "Retransmitting " << pending.packet_number << " as "
1479 << serialized_packet.packet_number; 1468 << serialized_packet.packet_number;
1480 SendOrQueuePacket(QueuedPacket(serialized_packet, pending.transmission_type, 1469 serialized_packet.original_packet_number = pending.packet_number;
1481 pending.packet_number)); 1470 serialized_packet.transmission_type = pending.transmission_type;
1471 SendOrQueuePacket(&serialized_packet);
1482 } 1472 }
1483 } 1473 }
1484 1474
1485 void QuicConnection::RetransmitUnackedPackets( 1475 void QuicConnection::RetransmitUnackedPackets(
1486 TransmissionType retransmission_type) { 1476 TransmissionType retransmission_type) {
1487 sent_packet_manager_.RetransmitUnackedPackets(retransmission_type); 1477 sent_packet_manager_.RetransmitUnackedPackets(retransmission_type);
1488 1478
1489 WriteIfNotBlocked(); 1479 WriteIfNotBlocked();
1490 } 1480 }
1491 1481
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
1544 DVLOG(1) << ENDPOINT << "Delaying sending " << delay.ToMilliseconds() 1534 DVLOG(1) << ENDPOINT << "Delaying sending " << delay.ToMilliseconds()
1545 << "ms"; 1535 << "ms";
1546 return false; 1536 return false;
1547 } 1537 }
1548 if (!FLAGS_quic_respect_send_alarm2) { 1538 if (!FLAGS_quic_respect_send_alarm2) {
1549 send_alarm_->Cancel(); 1539 send_alarm_->Cancel();
1550 } 1540 }
1551 return true; 1541 return true;
1552 } 1542 }
1553 1543
1554 bool QuicConnection::WritePacket(QueuedPacket* packet) { 1544 bool QuicConnection::WritePacket(SerializedPacket* packet) {
1555 if (!WritePacketInner(packet)) { 1545 if (!WritePacketInner(packet)) {
1556 return false; 1546 return false;
1557 } 1547 }
1558 delete packet->serialized_packet.retransmittable_frames; 1548 delete packet->retransmittable_frames;
1559 delete packet->serialized_packet.packet; 1549 delete packet->packet;
1560 packet->serialized_packet.retransmittable_frames = nullptr; 1550 packet->retransmittable_frames = nullptr;
1561 packet->serialized_packet.packet = nullptr; 1551 packet->packet = nullptr;
1562 return true; 1552 return true;
1563 } 1553 }
1564 1554
1565 bool QuicConnection::WritePacketInner(QueuedPacket* packet) { 1555 bool QuicConnection::WritePacketInner(SerializedPacket* packet) {
1566 if (packet->serialized_packet.packet_number < 1556 if (packet->packet_number < sent_packet_manager_.largest_sent_packet()) {
1567 sent_packet_manager_.largest_sent_packet()) { 1557 LOG(DFATAL) << "Attempt to write packet:" << packet->packet_number
1568 LOG(DFATAL) << "Attempt to write packet:"
1569 << packet->serialized_packet.packet_number
1570 << " after:" << sent_packet_manager_.largest_sent_packet(); 1558 << " after:" << sent_packet_manager_.largest_sent_packet();
1571 SendConnectionCloseWithDetails(QUIC_INTERNAL_ERROR, 1559 SendConnectionCloseWithDetails(QUIC_INTERNAL_ERROR,
1572 "Packet written out of order."); 1560 "Packet written out of order.");
1573 return true; 1561 return true;
1574 } 1562 }
1575 if (ShouldDiscardPacket(*packet)) { 1563 if (ShouldDiscardPacket(*packet)) {
1576 ++stats_.packets_discarded; 1564 ++stats_.packets_discarded;
1577 return true; 1565 return true;
1578 } 1566 }
1579 // Termination packets are encrypted and saved, so don't exit early. 1567 // Termination packets are encrypted and saved, so don't exit early.
1580 const bool is_termination_packet = IsTerminationPacket(*packet); 1568 const bool is_termination_packet = IsTerminationPacket(*packet);
1581 if (writer_->IsWriteBlocked() && !is_termination_packet) { 1569 if (writer_->IsWriteBlocked() && !is_termination_packet) {
1582 return false; 1570 return false;
1583 } 1571 }
1584 1572
1585 QuicPacketNumber packet_number = packet->serialized_packet.packet_number; 1573 QuicPacketNumber packet_number = packet->packet_number;
1586 DCHECK_LE(packet_number_of_last_sent_packet_, packet_number); 1574 DCHECK_LE(packet_number_of_last_sent_packet_, packet_number);
1587 packet_number_of_last_sent_packet_ = packet_number; 1575 packet_number_of_last_sent_packet_ = packet_number;
1588 1576
1589 QuicEncryptedPacket* encrypted = packet->serialized_packet.packet; 1577 QuicEncryptedPacket* encrypted = packet->packet;
1590 // Termination packets are eventually owned by TimeWaitListManager. 1578 // Termination packets are eventually owned by TimeWaitListManager.
1591 // Others are deleted at the end of this call. 1579 // Others are deleted at the end of this call.
1592 if (is_termination_packet) { 1580 if (is_termination_packet) {
1593 if (termination_packets_.get() == nullptr) { 1581 if (termination_packets_.get() == nullptr) {
1594 termination_packets_.reset(new std::vector<QuicEncryptedPacket*>); 1582 termination_packets_.reset(new std::vector<QuicEncryptedPacket*>);
1595 } 1583 }
1596 // Clone the packet so it's owned in the future. 1584 // Clone the packet so it's owned in the future.
1597 termination_packets_->push_back(encrypted->Clone()); 1585 termination_packets_->push_back(encrypted->Clone());
1598 // This assures we won't try to write *forced* packets when blocked. 1586 // This assures we won't try to write *forced* packets when blocked.
1599 // Return true to stop processing. 1587 // Return true to stop processing.
1600 if (writer_->IsWriteBlocked()) { 1588 if (writer_->IsWriteBlocked()) {
1601 visitor_->OnWriteBlocked(); 1589 visitor_->OnWriteBlocked();
1602 return true; 1590 return true;
1603 } 1591 }
1604 } 1592 }
1605 1593
1606 DCHECK_LE(encrypted->length(), kMaxPacketSize); 1594 DCHECK_LE(encrypted->length(), kMaxPacketSize);
1607 DCHECK_LE(encrypted->length(), packet_generator_.GetMaxPacketLength()); 1595 DCHECK_LE(encrypted->length(), packet_generator_.GetMaxPacketLength());
1608 DVLOG(1) << ENDPOINT << "Sending packet " << packet_number << " : " 1596 DVLOG(1) << ENDPOINT << "Sending packet " << packet_number << " : "
1609 << (packet->serialized_packet.is_fec_packet 1597 << (packet->is_fec_packet
1610 ? "FEC " 1598 ? "FEC "
1611 : (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA 1599 : (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA
1612 ? "data bearing " 1600 ? "data bearing "
1613 : " ack only ")) 1601 : " ack only "))
1614 << ", encryption level: " 1602 << ", encryption level: "
1615 << QuicUtils::EncryptionLevelToString( 1603 << QuicUtils::EncryptionLevelToString(packet->encryption_level)
1616 packet->serialized_packet.encryption_level)
1617 << ", encrypted length:" << encrypted->length(); 1604 << ", encrypted length:" << encrypted->length();
1618 DVLOG(2) << ENDPOINT << "packet(" << packet_number << "): " << std::endl 1605 DVLOG(2) << ENDPOINT << "packet(" << packet_number << "): " << std::endl
1619 << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece()); 1606 << QuicUtils::StringToHexASCIIDump(encrypted->AsStringPiece());
1620 1607
1621 // Measure the RTT from before the write begins to avoid underestimating the 1608 // Measure the RTT from before the write begins to avoid underestimating the
1622 // min_rtt_, especially in cases where the thread blocks or gets swapped out 1609 // min_rtt_, especially in cases where the thread blocks or gets swapped out
1623 // during the WritePacket below. 1610 // during the WritePacket below.
1624 QuicTime packet_send_time = clock_->Now(); 1611 QuicTime packet_send_time = clock_->Now();
1625 WriteResult result = 1612 WriteResult result =
1626 writer_->WritePacket(encrypted->data(), encrypted->length(), 1613 writer_->WritePacket(encrypted->data(), encrypted->length(),
1627 self_address().address(), peer_address()); 1614 self_address().address(), peer_address());
1628 if (result.error_code == ERR_IO_PENDING) { 1615 if (result.error_code == ERR_IO_PENDING) {
1629 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status); 1616 DCHECK_EQ(WRITE_STATUS_BLOCKED, result.status);
1630 } 1617 }
1631 1618
1632 if (result.status == WRITE_STATUS_BLOCKED) { 1619 if (result.status == WRITE_STATUS_BLOCKED) {
1633 visitor_->OnWriteBlocked(); 1620 visitor_->OnWriteBlocked();
1634 // If the socket buffers the the data, then the packet should not 1621 // If the socket buffers the the data, then the packet should not
1635 // be queued and sent again, which would result in an unnecessary 1622 // be queued and sent again, which would result in an unnecessary
1636 // duplicate packet being sent. The helper must call OnCanWrite 1623 // duplicate packet being sent. The helper must call OnCanWrite
1637 // when the write completes, and OnWriteError if an error occurs. 1624 // when the write completes, and OnWriteError if an error occurs.
1638 if (!writer_->IsWriteBlockedDataBuffered()) { 1625 if (!writer_->IsWriteBlockedDataBuffered()) {
1639 return false; 1626 return false;
1640 } 1627 }
1641 } 1628 }
1642 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) { 1629 if (result.status != WRITE_STATUS_ERROR && debug_visitor_ != nullptr) {
1643 // Pass the write result to the visitor. 1630 // Pass the write result to the visitor.
1644 debug_visitor_->OnPacketSent( 1631 debug_visitor_->OnPacketSent(*packet, packet->original_packet_number,
1645 packet->serialized_packet, packet->original_packet_number, 1632 packet->transmission_type, encrypted->length(),
1646 packet->transmission_type, encrypted->length(), packet_send_time); 1633 packet_send_time);
1647 } 1634 }
1648 if (packet->transmission_type == NOT_RETRANSMISSION) { 1635 if (packet->transmission_type == NOT_RETRANSMISSION) {
1649 time_of_last_sent_new_packet_ = packet_send_time; 1636 time_of_last_sent_new_packet_ = packet_send_time;
1650 if (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA && 1637 if (IsRetransmittable(*packet) == HAS_RETRANSMITTABLE_DATA &&
1651 last_send_for_timeout_ <= time_of_last_received_packet_) { 1638 last_send_for_timeout_ <= time_of_last_received_packet_) {
1652 last_send_for_timeout_ = packet_send_time; 1639 last_send_for_timeout_ = packet_send_time;
1653 } 1640 }
1654 } 1641 }
1655 SetPingAlarm(); 1642 SetPingAlarm();
1656 MaybeSetFecAlarm(packet_number); 1643 MaybeSetFecAlarm(packet_number);
1657 MaybeSetMtuAlarm(); 1644 MaybeSetMtuAlarm();
1658 DVLOG(1) << ENDPOINT << "time we began writing last sent packet: " 1645 DVLOG(1) << ENDPOINT << "time we began writing last sent packet: "
1659 << packet_send_time.ToDebuggingValue(); 1646 << packet_send_time.ToDebuggingValue();
1660 1647
1661 // TODO(ianswett): Change the packet number length and other packet creator 1648 // TODO(ianswett): Change the packet number length and other packet creator
1662 // options by a more explicit API than setting a struct value directly, 1649 // options by a more explicit API than setting a struct value directly,
1663 // perhaps via the NetworkChangeVisitor. 1650 // perhaps via the NetworkChangeVisitor.
1664 packet_generator_.UpdateSequenceNumberLength( 1651 packet_generator_.UpdateSequenceNumberLength(
1665 sent_packet_manager_.least_packet_awaited_by_peer(), 1652 sent_packet_manager_.least_packet_awaited_by_peer(),
1666 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length())); 1653 sent_packet_manager_.EstimateMaxPacketsInFlight(max_packet_length()));
1667 1654
1668 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent( 1655 bool reset_retransmission_alarm = sent_packet_manager_.OnPacketSent(
1669 &packet->serialized_packet, packet->original_packet_number, 1656 packet, packet->original_packet_number, packet_send_time,
1670 packet_send_time, encrypted->length(), packet->transmission_type, 1657 encrypted->length(), packet->transmission_type,
1671 IsRetransmittable(*packet)); 1658 IsRetransmittable(*packet));
1672 1659
1673 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) { 1660 if (reset_retransmission_alarm || !retransmission_alarm_->IsSet()) {
1674 SetRetransmissionAlarm(); 1661 SetRetransmissionAlarm();
1675 } 1662 }
1676 1663
1677 stats_.bytes_sent += result.bytes_written; 1664 stats_.bytes_sent += result.bytes_written;
1678 ++stats_.packets_sent; 1665 ++stats_.packets_sent;
1679 if (packet->transmission_type != NOT_RETRANSMISSION) { 1666 if (packet->transmission_type != NOT_RETRANSMISSION) {
1680 stats_.bytes_retransmitted += result.bytes_written; 1667 stats_.bytes_retransmitted += result.bytes_written;
1681 ++stats_.packets_retransmitted; 1668 ++stats_.packets_retransmitted;
1682 } 1669 }
1683 1670
1684 if (result.status == WRITE_STATUS_ERROR) { 1671 if (result.status == WRITE_STATUS_ERROR) {
1685 OnWriteError(result.error_code); 1672 OnWriteError(result.error_code);
1686 DLOG(ERROR) << ENDPOINT << "failed writing " << encrypted->length() 1673 DLOG(ERROR) << ENDPOINT << "failed writing " << encrypted->length()
1687 << " bytes " 1674 << " bytes "
1688 << " from host " << (self_address().address().empty() 1675 << " from host " << (self_address().address().empty()
1689 ? " empty address " 1676 ? " empty address "
1690 : self_address().ToStringWithoutPort()) 1677 : self_address().ToStringWithoutPort())
1691 << " to address " << peer_address().ToString(); 1678 << " to address " << peer_address().ToString();
1692 return false; 1679 return false;
1693 } 1680 }
1694 1681
1695 return true; 1682 return true;
1696 } 1683 }
1697 1684
1698 bool QuicConnection::ShouldDiscardPacket(const QueuedPacket& packet) { 1685 bool QuicConnection::ShouldDiscardPacket(const SerializedPacket& packet) {
1699 if (!connected_) { 1686 if (!connected_) {
1700 DVLOG(1) << ENDPOINT << "Not sending packet as connection is disconnected."; 1687 DVLOG(1) << ENDPOINT << "Not sending packet as connection is disconnected.";
1701 return true; 1688 return true;
1702 } 1689 }
1703 1690
1704 QuicPacketNumber packet_number = packet.serialized_packet.packet_number; 1691 QuicPacketNumber packet_number = packet.packet_number;
1705 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE && 1692 if (encryption_level_ == ENCRYPTION_FORWARD_SECURE &&
1706 packet.serialized_packet.encryption_level == ENCRYPTION_NONE) { 1693 packet.encryption_level == ENCRYPTION_NONE) {
1707 // Drop packets that are NULL encrypted since the peer won't accept them 1694 // Drop packets that are NULL encrypted since the peer won't accept them
1708 // anymore. 1695 // anymore.
1709 DVLOG(1) << ENDPOINT << "Dropping NULL encrypted packet: " << packet_number 1696 DVLOG(1) << ENDPOINT << "Dropping NULL encrypted packet: " << packet_number
1710 << " since the connection is forward secure."; 1697 << " since the connection is forward secure.";
1711 return true; 1698 return true;
1712 } 1699 }
1713 1700
1714 // If a retransmission has been acked before sending, don't send it. 1701 // If a retransmission has been acked before sending, don't send it.
1715 // This occurs if a packet gets serialized, queued, then discarded. 1702 // This occurs if a packet gets serialized, queued, then discarded.
1716 if (packet.transmission_type != NOT_RETRANSMISSION && 1703 if (packet.transmission_type != NOT_RETRANSMISSION &&
(...skipping 13 matching lines...) Expand all
1730 << ErrorToString(error_code) << ")"; 1717 << ErrorToString(error_code) << ")";
1731 // We can't send an error as the socket is presumably borked. 1718 // We can't send an error as the socket is presumably borked.
1732 CloseConnection(QUIC_PACKET_WRITE_ERROR, false); 1719 CloseConnection(QUIC_PACKET_WRITE_ERROR, false);
1733 } 1720 }
1734 1721
1735 void QuicConnection::OnSerializedPacket(SerializedPacket* serialized_packet) { 1722 void QuicConnection::OnSerializedPacket(SerializedPacket* serialized_packet) {
1736 DCHECK_NE(kInvalidPathId, serialized_packet->path_id); 1723 DCHECK_NE(kInvalidPathId, serialized_packet->path_id);
1737 if (serialized_packet->packet == nullptr) { 1724 if (serialized_packet->packet == nullptr) {
1738 // We failed to serialize the packet, so close the connection. 1725 // We failed to serialize the packet, so close the connection.
1739 // CloseConnection does not send close packet, so no infinite loop here. 1726 // CloseConnection does not send close packet, so no infinite loop here.
1727 // TODO(ianswett): This is actually an internal error, not an encryption
1728 // failure.
1740 CloseConnection(QUIC_ENCRYPTION_FAILURE, false); 1729 CloseConnection(QUIC_ENCRYPTION_FAILURE, false);
1741 return; 1730 return;
1742 } 1731 }
1743 if (serialized_packet->is_fec_packet && fec_alarm_->IsSet()) { 1732 if (serialized_packet->is_fec_packet && fec_alarm_->IsSet()) {
1744 // If an FEC packet is serialized with the FEC alarm set, cancel the alarm. 1733 // If an FEC packet is serialized with the FEC alarm set, cancel the alarm.
1745 fec_alarm_->Cancel(); 1734 fec_alarm_->Cancel();
1746 } 1735 }
1747 SendOrQueuePacket(QueuedPacket(*serialized_packet)); 1736 SendOrQueuePacket(serialized_packet);
1748 } 1737 }
1749 1738
1750 void QuicConnection::OnResetFecGroup() { 1739 void QuicConnection::OnResetFecGroup() {
1751 if (!fec_alarm_->IsSet()) { 1740 if (!fec_alarm_->IsSet()) {
1752 return; 1741 return;
1753 } 1742 }
1754 // If an FEC Group is closed with the FEC alarm set, cancel the alarm. 1743 // If an FEC Group is closed with the FEC alarm set, cancel the alarm.
1755 fec_alarm_->Cancel(); 1744 fec_alarm_->Cancel();
1756 } 1745 }
1757 1746
(...skipping 19 matching lines...) Expand all
1777 sent_packet_manager_.SetHandshakeConfirmed(); 1766 sent_packet_manager_.SetHandshakeConfirmed();
1778 // The client should immediately ack the SHLO to confirm the handshake is 1767 // The client should immediately ack the SHLO to confirm the handshake is
1779 // complete with the server. 1768 // complete with the server.
1780 if (perspective_ == Perspective::IS_CLIENT && !ack_queued_ && 1769 if (perspective_ == Perspective::IS_CLIENT && !ack_queued_ &&
1781 ack_frame_updated()) { 1770 ack_frame_updated()) {
1782 ack_alarm_->Cancel(); 1771 ack_alarm_->Cancel();
1783 ack_alarm_->Set(clock_->ApproximateNow()); 1772 ack_alarm_->Set(clock_->ApproximateNow());
1784 } 1773 }
1785 } 1774 }
1786 1775
1787 void QuicConnection::SendOrQueuePacket(QueuedPacket packet) { 1776 void QuicConnection::SendOrQueuePacket(SerializedPacket* packet) {
1788 // The caller of this function is responsible for checking CanWrite(). 1777 // The caller of this function is responsible for checking CanWrite().
1789 if (packet.serialized_packet.packet == nullptr) { 1778 if (packet->packet == nullptr) {
1790 LOG(DFATAL) 1779 LOG(DFATAL) << "packet.packet == nullptr in to SendOrQueuePacket";
1791 << "packet.serialized_packet.packet == nullptr in to SendOrQueuePacket";
1792 return; 1780 return;
1793 } 1781 }
1794 1782
1795 sent_entropy_manager_.RecordPacketEntropyHash( 1783 sent_entropy_manager_.RecordPacketEntropyHash(packet->packet_number,
1796 packet.serialized_packet.packet_number, 1784 packet->entropy_hash);
1797 packet.serialized_packet.entropy_hash);
1798 // If there are already queued packets, queue this one immediately to ensure 1785 // If there are already queued packets, queue this one immediately to ensure
1799 // it's written in sequence number order. 1786 // it's written in sequence number order.
1800 if (!queued_packets_.empty() || !WritePacket(&packet)) { 1787 if (!queued_packets_.empty() || !WritePacket(packet)) {
1801 // Take ownership of the underlying encrypted packet. 1788 // Take ownership of the underlying encrypted packet.
1802 if (!packet.serialized_packet.packet->owns_buffer()) { 1789 if (!packet->packet->owns_buffer()) {
1803 scoped_ptr<QuicEncryptedPacket> encrypted_deleter( 1790 scoped_ptr<QuicEncryptedPacket> encrypted_deleter(packet->packet);
1804 packet.serialized_packet.packet); 1791 packet->packet = packet->packet->Clone();
1805 packet.serialized_packet.packet =
1806 packet.serialized_packet.packet->Clone();
1807 } 1792 }
1808 queued_packets_.push_back(packet); 1793 queued_packets_.push_back(*packet);
1809 } 1794 }
1810 1795
1811 // If a forward-secure encrypter is available but is not being used and the 1796 // If a forward-secure encrypter is available but is not being used and the
1812 // next packet number is the first packet which requires 1797 // next packet number is the first packet which requires
1813 // forward security, start using the forward-secure encrypter. 1798 // forward security, start using the forward-secure encrypter.
1814 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE && 1799 if (encryption_level_ != ENCRYPTION_FORWARD_SECURE &&
1815 has_forward_secure_encrypter_ && 1800 has_forward_secure_encrypter_ &&
1816 packet.serialized_packet.packet_number >= 1801 packet->packet_number >= first_required_forward_secure_packet_ - 1) {
1817 first_required_forward_secure_packet_ - 1) {
1818 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE); 1802 SetDefaultEncryptionLevel(ENCRYPTION_FORWARD_SECURE);
1819 } 1803 }
1820 } 1804 }
1821 1805
1822 PeerAddressChangeType QuicConnection::DeterminePeerAddressChangeType() { 1806 PeerAddressChangeType QuicConnection::DeterminePeerAddressChangeType() {
1823 return UNKNOWN; 1807 return UNKNOWN;
1824 } 1808 }
1825 1809
1826 void QuicConnection::SendPing() { 1810 void QuicConnection::SendPing() {
1827 if (retransmission_alarm_->IsSet()) { 1811 if (retransmission_alarm_->IsSet()) {
(...skipping 493 matching lines...) Expand 10 before | Expand all | Expand 10 after
2321 return; 2305 return;
2322 } 2306 }
2323 connection_->delay_setting_retransmission_alarm_ = false; 2307 connection_->delay_setting_retransmission_alarm_ = false;
2324 if (connection_->pending_retransmission_alarm_) { 2308 if (connection_->pending_retransmission_alarm_) {
2325 connection_->SetRetransmissionAlarm(); 2309 connection_->SetRetransmissionAlarm();
2326 connection_->pending_retransmission_alarm_ = false; 2310 connection_->pending_retransmission_alarm_ = false;
2327 } 2311 }
2328 } 2312 }
2329 2313
2330 HasRetransmittableData QuicConnection::IsRetransmittable( 2314 HasRetransmittableData QuicConnection::IsRetransmittable(
2331 const QueuedPacket& packet) { 2315 const SerializedPacket& packet) {
2332 // Retransmitted packets retransmittable frames are owned by the unacked 2316 // Retransmitted packets retransmittable frames are owned by the unacked
2333 // packet map, but are not present in the serialized packet. 2317 // packet map, but are not present in the serialized packet.
2334 if (packet.transmission_type != NOT_RETRANSMISSION || 2318 if (packet.transmission_type != NOT_RETRANSMISSION ||
2335 packet.serialized_packet.retransmittable_frames != nullptr) { 2319 packet.retransmittable_frames != nullptr) {
2336 return HAS_RETRANSMITTABLE_DATA; 2320 return HAS_RETRANSMITTABLE_DATA;
2337 } else { 2321 } else {
2338 return NO_RETRANSMITTABLE_DATA; 2322 return NO_RETRANSMITTABLE_DATA;
2339 } 2323 }
2340 } 2324 }
2341 2325
2342 bool QuicConnection::IsTerminationPacket(const QueuedPacket& packet) { 2326 bool QuicConnection::IsTerminationPacket(const SerializedPacket& packet) {
2343 const RetransmittableFrames* retransmittable_frames = 2327 if (packet.retransmittable_frames == nullptr) {
2344 packet.serialized_packet.retransmittable_frames;
2345 if (retransmittable_frames == nullptr) {
2346 return false; 2328 return false;
2347 } 2329 }
2348 for (const QuicFrame& frame : retransmittable_frames->frames()) { 2330 for (const QuicFrame& frame : packet.retransmittable_frames->frames()) {
2349 if (frame.type == CONNECTION_CLOSE_FRAME) { 2331 if (frame.type == CONNECTION_CLOSE_FRAME) {
2350 return true; 2332 return true;
2351 } 2333 }
2352 if (save_crypto_packets_as_termination_packets_ && 2334 if (save_crypto_packets_as_termination_packets_ &&
2353 frame.type == STREAM_FRAME && 2335 frame.type == STREAM_FRAME &&
2354 frame.stream_frame->stream_id == kCryptoStreamId) { 2336 frame.stream_frame->stream_id == kCryptoStreamId) {
2355 return true; 2337 return true;
2356 } 2338 }
2357 } 2339 }
2358 return false; 2340 return false;
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
2418 SendMtuDiscoveryPacket(mtu_discovery_target_); 2400 SendMtuDiscoveryPacket(mtu_discovery_target_);
2419 2401
2420 DCHECK(!mtu_discovery_alarm_->IsSet()); 2402 DCHECK(!mtu_discovery_alarm_->IsSet());
2421 } 2403 }
2422 2404
2423 bool QuicConnection::ack_frame_updated() const { 2405 bool QuicConnection::ack_frame_updated() const {
2424 return received_packet_manager_.ack_frame_updated(); 2406 return received_packet_manager_.ack_frame_updated();
2425 } 2407 }
2426 2408
2427 } // namespace net 2409 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_connection.h ('k') | net/quic/quic_protocol.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698