| 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_packet_creator.h" | 5 #include "net/quic/quic_packet_creator.h" |
| 6 | 6 |
| 7 #include <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/logging.h" | 9 #include "base/logging.h" |
| 10 #include "base/macros.h" | 10 #include "base/macros.h" |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 63 QuicBufferAllocator* buffer_allocator, | 63 QuicBufferAllocator* buffer_allocator, |
| 64 DelegateInterface* delegate) | 64 DelegateInterface* delegate) |
| 65 : delegate_(delegate), | 65 : delegate_(delegate), |
| 66 debug_delegate_(nullptr), | 66 debug_delegate_(nullptr), |
| 67 framer_(framer), | 67 framer_(framer), |
| 68 random_bool_source_(new QuicRandomBoolSource(random_generator)), | 68 random_bool_source_(new QuicRandomBoolSource(random_generator)), |
| 69 buffer_allocator_(buffer_allocator), | 69 buffer_allocator_(buffer_allocator), |
| 70 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), | 70 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), |
| 71 send_path_id_in_packet_(false), | 71 send_path_id_in_packet_(false), |
| 72 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER), | 72 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER), |
| 73 have_diversification_nonce_(false), |
| 73 max_packet_length_(0), | 74 max_packet_length_(0), |
| 74 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), | 75 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), |
| 75 packet_size_(0), | 76 packet_size_(0), |
| 76 connection_id_(connection_id), | 77 connection_id_(connection_id), |
| 77 packet_(kDefaultPathId, | 78 packet_(kDefaultPathId, |
| 78 0, | 79 0, |
| 79 next_packet_number_length_, | 80 next_packet_number_length_, |
| 80 nullptr, | 81 nullptr, |
| 81 0, | 82 0, |
| 82 0, | 83 0, |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 // maximum packet size if we stop sending version before it is serialized. | 129 // maximum packet size if we stop sending version before it is serialized. |
| 129 void QuicPacketCreator::StopSendingVersion() { | 130 void QuicPacketCreator::StopSendingVersion() { |
| 130 DCHECK(send_version_in_packet_); | 131 DCHECK(send_version_in_packet_); |
| 131 send_version_in_packet_ = false; | 132 send_version_in_packet_ = false; |
| 132 if (packet_size_ > 0) { | 133 if (packet_size_ > 0) { |
| 133 DCHECK_LT(kQuicVersionSize, packet_size_); | 134 DCHECK_LT(kQuicVersionSize, packet_size_); |
| 134 packet_size_ -= kQuicVersionSize; | 135 packet_size_ -= kQuicVersionSize; |
| 135 } | 136 } |
| 136 } | 137 } |
| 137 | 138 |
| 139 void QuicPacketCreator::SetDiversificationNonce( |
| 140 const DiversificationNonce nonce) { |
| 141 DCHECK(!have_diversification_nonce_); |
| 142 have_diversification_nonce_ = true; |
| 143 memcpy(&diversification_nonce_, nonce, sizeof(diversification_nonce_)); |
| 144 } |
| 145 |
| 138 void QuicPacketCreator::UpdatePacketNumberLength( | 146 void QuicPacketCreator::UpdatePacketNumberLength( |
| 139 QuicPacketNumber least_packet_awaited_by_peer, | 147 QuicPacketNumber least_packet_awaited_by_peer, |
| 140 QuicPacketCount max_packets_in_flight) { | 148 QuicPacketCount max_packets_in_flight) { |
| 141 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1); | 149 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1); |
| 142 const QuicPacketNumber current_delta = | 150 const QuicPacketNumber current_delta = |
| 143 packet_.packet_number + 1 - least_packet_awaited_by_peer; | 151 packet_.packet_number + 1 - least_packet_awaited_by_peer; |
| 144 const uint64_t delta = max(current_delta, max_packets_in_flight); | 152 const uint64_t delta = max(current_delta, max_packets_in_flight); |
| 145 next_packet_number_length_ = | 153 next_packet_number_length_ = |
| 146 QuicFramer::GetMinSequenceNumberLength(delta * 4); | 154 QuicFramer::GetMinSequenceNumberLength(delta * 4); |
| 147 } | 155 } |
| (...skipping 23 matching lines...) Expand all Loading... |
| 171 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, | 179 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, |
| 172 QuicStreamOffset offset) { | 180 QuicStreamOffset offset) { |
| 173 return BytesFree() > QuicFramer::GetMinStreamFrameSize(id, offset, true); | 181 return BytesFree() > QuicFramer::GetMinStreamFrameSize(id, offset, true); |
| 174 } | 182 } |
| 175 | 183 |
| 176 // static | 184 // static |
| 177 size_t QuicPacketCreator::StreamFramePacketOverhead( | 185 size_t QuicPacketCreator::StreamFramePacketOverhead( |
| 178 QuicConnectionIdLength connection_id_length, | 186 QuicConnectionIdLength connection_id_length, |
| 179 bool include_version, | 187 bool include_version, |
| 180 bool include_path_id, | 188 bool include_path_id, |
| 189 bool include_diversification_nonce, |
| 181 QuicPacketNumberLength packet_number_length, | 190 QuicPacketNumberLength packet_number_length, |
| 182 QuicStreamOffset offset) { | 191 QuicStreamOffset offset) { |
| 183 return GetPacketHeaderSize(connection_id_length, include_version, | 192 return GetPacketHeaderSize(connection_id_length, include_version, |
| 184 include_path_id, packet_number_length) + | 193 include_path_id, include_diversification_nonce, |
| 194 packet_number_length) + |
| 185 // Assumes this is a stream with a single lone packet. | 195 // Assumes this is a stream with a single lone packet. |
| 186 QuicFramer::GetMinStreamFrameSize(1u, offset, true); | 196 QuicFramer::GetMinStreamFrameSize(1u, offset, true); |
| 187 } | 197 } |
| 188 | 198 |
| 189 void QuicPacketCreator::CreateStreamFrame(QuicStreamId id, | 199 void QuicPacketCreator::CreateStreamFrame(QuicStreamId id, |
| 190 QuicIOVector iov, | 200 QuicIOVector iov, |
| 191 size_t iov_offset, | 201 size_t iov_offset, |
| 192 QuicStreamOffset offset, | 202 QuicStreamOffset offset, |
| 193 bool fin, | 203 bool fin, |
| 194 QuicFrame* frame) { | 204 QuicFrame* frame) { |
| 195 DCHECK_GT(max_packet_length_, | 205 DCHECK_GT( |
| 196 StreamFramePacketOverhead(connection_id_length_, kIncludeVersion, | 206 max_packet_length_, |
| 197 kIncludePathId, | 207 StreamFramePacketOverhead(connection_id_length_, kIncludeVersion, |
| 198 PACKET_6BYTE_PACKET_NUMBER, offset)); | 208 kIncludePathId, IncludeNonceInPublicHeader(), |
| 209 PACKET_6BYTE_PACKET_NUMBER, offset)); |
| 199 | 210 |
| 200 MaybeUpdatePacketNumberLength(); | 211 MaybeUpdatePacketNumberLength(); |
| 201 | 212 |
| 202 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) | 213 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) |
| 203 << "No room for Stream frame, BytesFree: " << BytesFree() | 214 << "No room for Stream frame, BytesFree: " << BytesFree() |
| 204 << " MinStreamFrameSize: " | 215 << " MinStreamFrameSize: " |
| 205 << QuicFramer::GetMinStreamFrameSize(id, offset, true); | 216 << QuicFramer::GetMinStreamFrameSize(id, offset, true); |
| 206 | 217 |
| 207 if (iov_offset == iov.total_length) { | 218 if (iov_offset == iov.total_length) { |
| 208 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin."; | 219 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin."; |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 382 } | 393 } |
| 383 | 394 |
| 384 size_t QuicPacketCreator::PacketSize() { | 395 size_t QuicPacketCreator::PacketSize() { |
| 385 if (!queued_frames_.empty()) { | 396 if (!queued_frames_.empty()) { |
| 386 return packet_size_; | 397 return packet_size_; |
| 387 } | 398 } |
| 388 // Update packet number length on packet boundary. | 399 // Update packet number length on packet boundary. |
| 389 packet_.packet_number_length = next_packet_number_length_; | 400 packet_.packet_number_length = next_packet_number_length_; |
| 390 packet_size_ = GetPacketHeaderSize( | 401 packet_size_ = GetPacketHeaderSize( |
| 391 connection_id_length_, send_version_in_packet_, send_path_id_in_packet_, | 402 connection_id_length_, send_version_in_packet_, send_path_id_in_packet_, |
| 392 packet_.packet_number_length); | 403 IncludeNonceInPublicHeader(), packet_.packet_number_length); |
| 393 return packet_size_; | 404 return packet_size_; |
| 394 } | 405 } |
| 395 | 406 |
| 396 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { | 407 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { |
| 397 return AddFrame(frame, /*save_retransmittable_frames=*/true); | 408 return AddFrame(frame, /*save_retransmittable_frames=*/true); |
| 398 } | 409 } |
| 399 | 410 |
| 400 bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { | 411 bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { |
| 401 if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { | 412 if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { |
| 402 packet_.needs_padding = true; | 413 packet_.needs_padding = true; |
| (...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 474 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER, | 485 return SerializedPacket(kInvalidPathId, 0, PACKET_1BYTE_PACKET_NUMBER, |
| 475 nullptr, 0, 0, false, false); | 486 nullptr, 0, 0, false, false); |
| 476 } | 487 } |
| 477 | 488 |
| 478 void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) { | 489 void QuicPacketCreator::FillPacketHeader(QuicPacketHeader* header) { |
| 479 header->public_header.connection_id = connection_id_; | 490 header->public_header.connection_id = connection_id_; |
| 480 header->public_header.connection_id_length = connection_id_length_; | 491 header->public_header.connection_id_length = connection_id_length_; |
| 481 header->public_header.multipath_flag = send_path_id_in_packet_; | 492 header->public_header.multipath_flag = send_path_id_in_packet_; |
| 482 header->public_header.reset_flag = false; | 493 header->public_header.reset_flag = false; |
| 483 header->public_header.version_flag = send_version_in_packet_; | 494 header->public_header.version_flag = send_version_in_packet_; |
| 484 header->fec_flag = false; | 495 if (IncludeNonceInPublicHeader()) { |
| 496 DCHECK_EQ(Perspective::IS_SERVER, framer_->perspective()); |
| 497 header->public_header.nonce = &diversification_nonce_; |
| 498 } else { |
| 499 header->public_header.nonce = nullptr; |
| 500 } |
| 485 header->path_id = packet_.path_id; | 501 header->path_id = packet_.path_id; |
| 486 header->packet_number = ++packet_.packet_number; | 502 header->packet_number = ++packet_.packet_number; |
| 487 header->public_header.packet_number_length = packet_.packet_number_length; | 503 header->public_header.packet_number_length = packet_.packet_number_length; |
| 488 header->entropy_flag = random_bool_source_->RandBool(); | 504 header->entropy_flag = random_bool_source_->RandBool(); |
| 489 header->is_in_fec_group = NOT_IN_FEC_GROUP; | 505 header->is_in_fec_group = NOT_IN_FEC_GROUP; |
| 490 header->fec_group = 0; | 506 header->fec_group = 0; |
| 491 } | 507 } |
| 492 | 508 |
| 493 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) { | 509 bool QuicPacketCreator::ShouldRetransmit(const QuicFrame& frame) { |
| 494 switch (frame.type) { | 510 switch (frame.type) { |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 588 // If path_id is not in the map, it's a new path. Set packet_number to 0. | 604 // If path_id is not in the map, it's a new path. Set packet_number to 0. |
| 589 packet_.packet_number = it == multipath_packet_number_.end() ? 0 : it->second; | 605 packet_.packet_number = it == multipath_packet_number_.end() ? 0 : it->second; |
| 590 packet_.path_id = path_id; | 606 packet_.path_id = path_id; |
| 591 DCHECK(packet_.path_id != kInvalidPathId); | 607 DCHECK(packet_.path_id != kInvalidPathId); |
| 592 // Send path in packet if current path is not the default path. | 608 // Send path in packet if current path is not the default path. |
| 593 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false; | 609 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false; |
| 594 // Switching path needs to update packet number length. | 610 // Switching path needs to update packet number length. |
| 595 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); | 611 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); |
| 596 } | 612 } |
| 597 | 613 |
| 614 bool QuicPacketCreator::IncludeNonceInPublicHeader() { |
| 615 return have_diversification_nonce_ && |
| 616 packet_.encryption_level == ENCRYPTION_INITIAL; |
| 617 } |
| 618 |
| 598 } // namespace net | 619 } // namespace net |
| OLD | NEW |