| 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 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 162 return false; | 162 return false; |
| 163 } | 163 } |
| 164 if (needs_padding) { | 164 if (needs_padding) { |
| 165 packet_.needs_padding = true; | 165 packet_.needs_padding = true; |
| 166 } | 166 } |
| 167 return true; | 167 return true; |
| 168 } | 168 } |
| 169 | 169 |
| 170 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, | 170 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, |
| 171 QuicStreamOffset offset) { | 171 QuicStreamOffset offset) { |
| 172 return BytesFree() > | 172 return BytesFree() > QuicFramer::GetMinStreamFrameSize(id, offset, true); |
| 173 QuicFramer::GetMinStreamFrameSize(id, offset, true, NOT_IN_FEC_GROUP); | |
| 174 } | 173 } |
| 175 | 174 |
| 176 // static | 175 // static |
| 177 size_t QuicPacketCreator::StreamFramePacketOverhead( | 176 size_t QuicPacketCreator::StreamFramePacketOverhead( |
| 178 QuicConnectionIdLength connection_id_length, | 177 QuicConnectionIdLength connection_id_length, |
| 179 bool include_version, | 178 bool include_version, |
| 180 bool include_path_id, | 179 bool include_path_id, |
| 181 QuicPacketNumberLength packet_number_length, | 180 QuicPacketNumberLength packet_number_length, |
| 182 QuicStreamOffset offset, | 181 QuicStreamOffset offset) { |
| 183 InFecGroup is_in_fec_group) { | |
| 184 return GetPacketHeaderSize(connection_id_length, include_version, | 182 return GetPacketHeaderSize(connection_id_length, include_version, |
| 185 include_path_id, packet_number_length, | 183 include_path_id, packet_number_length) + |
| 186 is_in_fec_group) + | |
| 187 // Assumes this is a stream with a single lone packet. | 184 // Assumes this is a stream with a single lone packet. |
| 188 QuicFramer::GetMinStreamFrameSize(1u, offset, true, is_in_fec_group); | 185 QuicFramer::GetMinStreamFrameSize(1u, offset, true); |
| 189 } | 186 } |
| 190 | 187 |
| 191 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, | 188 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, |
| 192 QuicIOVector iov, | 189 QuicIOVector iov, |
| 193 size_t iov_offset, | 190 size_t iov_offset, |
| 194 QuicStreamOffset offset, | 191 QuicStreamOffset offset, |
| 195 bool fin, | 192 bool fin, |
| 196 QuicFrame* frame) { | 193 QuicFrame* frame) { |
| 197 DCHECK_GT(max_packet_length_, | 194 DCHECK_GT(max_packet_length_, |
| 198 StreamFramePacketOverhead( | 195 StreamFramePacketOverhead(connection_id_length_, kIncludeVersion, |
| 199 connection_id_length_, kIncludeVersion, kIncludePathId, | 196 kIncludePathId, |
| 200 PACKET_6BYTE_PACKET_NUMBER, offset, IN_FEC_GROUP)); | 197 PACKET_6BYTE_PACKET_NUMBER, offset)); |
| 201 | 198 |
| 202 MaybeUpdatePacketNumberLength(); | 199 MaybeUpdatePacketNumberLength(); |
| 203 | 200 |
| 204 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) | 201 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) |
| 205 << "No room for Stream frame, BytesFree: " << BytesFree() | 202 << "No room for Stream frame, BytesFree: " << BytesFree() |
| 206 << " MinStreamFrameSize: " | 203 << " MinStreamFrameSize: " |
| 207 << QuicFramer::GetMinStreamFrameSize(id, offset, true, NOT_IN_FEC_GROUP); | 204 << QuicFramer::GetMinStreamFrameSize(id, offset, true); |
| 208 | 205 |
| 209 if (iov_offset == iov.total_length) { | 206 if (iov_offset == iov.total_length) { |
| 210 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin."; | 207 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin."; |
| 211 // Create a new packet for the fin, if necessary. | 208 // Create a new packet for the fin, if necessary. |
| 212 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece())); | 209 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece())); |
| 213 return 0; | 210 return 0; |
| 214 } | 211 } |
| 215 | 212 |
| 216 const size_t data_size = iov.total_length - iov_offset; | 213 const size_t data_size = iov.total_length - iov_offset; |
| 217 size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( | 214 size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( |
| 218 id, offset, /* last_frame_in_packet= */ true, NOT_IN_FEC_GROUP); | 215 id, offset, /* last_frame_in_packet= */ true); |
| 219 size_t bytes_consumed = min<size_t>(BytesFree() - min_frame_size, data_size); | 216 size_t bytes_consumed = min<size_t>(BytesFree() - min_frame_size, data_size); |
| 220 | 217 |
| 221 bool set_fin = fin && bytes_consumed == data_size; // Last frame. | 218 bool set_fin = fin && bytes_consumed == data_size; // Last frame. |
| 222 UniqueStreamBuffer buffer = | 219 UniqueStreamBuffer buffer = |
| 223 NewStreamBuffer(buffer_allocator_, bytes_consumed); | 220 NewStreamBuffer(buffer_allocator_, bytes_consumed); |
| 224 CopyToBuffer(iov, iov_offset, bytes_consumed, buffer.get()); | 221 CopyToBuffer(iov, iov_offset, bytes_consumed, buffer.get()); |
| 225 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, bytes_consumed, | 222 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, bytes_consumed, |
| 226 std::move(buffer))); | 223 std::move(buffer))); |
| 227 return bytes_consumed; | 224 return bytes_consumed; |
| 228 } | 225 } |
| (...skipping 156 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 } | 382 } |
| 386 | 383 |
| 387 size_t QuicPacketCreator::PacketSize() { | 384 size_t QuicPacketCreator::PacketSize() { |
| 388 if (!queued_frames_.empty()) { | 385 if (!queued_frames_.empty()) { |
| 389 return packet_size_; | 386 return packet_size_; |
| 390 } | 387 } |
| 391 // Update packet number length on packet boundary. | 388 // Update packet number length on packet boundary. |
| 392 packet_.packet_number_length = next_packet_number_length_; | 389 packet_.packet_number_length = next_packet_number_length_; |
| 393 packet_size_ = GetPacketHeaderSize( | 390 packet_size_ = GetPacketHeaderSize( |
| 394 connection_id_length_, send_version_in_packet_, send_path_id_in_packet_, | 391 connection_id_length_, send_version_in_packet_, send_path_id_in_packet_, |
| 395 packet_.packet_number_length, NOT_IN_FEC_GROUP); | 392 packet_.packet_number_length); |
| 396 return packet_size_; | 393 return packet_size_; |
| 397 } | 394 } |
| 398 | 395 |
| 399 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { | 396 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { |
| 400 return AddFrame(frame, /*save_retransmittable_frames=*/true); | 397 return AddFrame(frame, /*save_retransmittable_frames=*/true); |
| 401 } | 398 } |
| 402 | 399 |
| 403 bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { | 400 bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { |
| 404 if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { | 401 if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { |
| 405 packet_.needs_padding = true; | 402 packet_.needs_padding = true; |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 521 frame.stream_frame->stream_id != kCryptoStreamId && | 518 frame.stream_frame->stream_id != kCryptoStreamId && |
| 522 packet_.encryption_level == ENCRYPTION_NONE) { | 519 packet_.encryption_level == ENCRYPTION_NONE) { |
| 523 QUIC_BUG << "Cannot send stream data without encryption."; | 520 QUIC_BUG << "Cannot send stream data without encryption."; |
| 524 delegate_->OnUnrecoverableError(QUIC_UNENCRYPTED_STREAM_DATA, | 521 delegate_->OnUnrecoverableError(QUIC_UNENCRYPTED_STREAM_DATA, |
| 525 ConnectionCloseSource::FROM_SELF); | 522 ConnectionCloseSource::FROM_SELF); |
| 526 return false; | 523 return false; |
| 527 } | 524 } |
| 528 MaybeUpdatePacketNumberLength(); | 525 MaybeUpdatePacketNumberLength(); |
| 529 | 526 |
| 530 size_t frame_len = framer_->GetSerializedFrameLength( | 527 size_t frame_len = framer_->GetSerializedFrameLength( |
| 531 frame, BytesFree(), queued_frames_.empty(), true, NOT_IN_FEC_GROUP, | 528 frame, BytesFree(), queued_frames_.empty(), true, |
| 532 packet_.packet_number_length); | 529 packet_.packet_number_length); |
| 533 if (frame_len == 0) { | 530 if (frame_len == 0) { |
| 534 // Current open packet is full. | 531 // Current open packet is full. |
| 535 Flush(); | 532 Flush(); |
| 536 return false; | 533 return false; |
| 537 } | 534 } |
| 538 DCHECK_LT(0u, packet_size_); | 535 DCHECK_LT(0u, packet_size_); |
| 539 packet_size_ += ExpansionOnNewFrame() + frame_len; | 536 packet_size_ += ExpansionOnNewFrame() + frame_len; |
| 540 | 537 |
| 541 if (save_retransmittable_frames && ShouldRetransmit(frame)) { | 538 if (save_retransmittable_frames && ShouldRetransmit(frame)) { |
| (...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 599 packet_.packet_number = it == multipath_packet_number_.end() ? 0 : it->second; | 596 packet_.packet_number = it == multipath_packet_number_.end() ? 0 : it->second; |
| 600 packet_.path_id = path_id; | 597 packet_.path_id = path_id; |
| 601 DCHECK(packet_.path_id != kInvalidPathId); | 598 DCHECK(packet_.path_id != kInvalidPathId); |
| 602 // Send path in packet if current path is not the default path. | 599 // Send path in packet if current path is not the default path. |
| 603 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false; | 600 send_path_id_in_packet_ = packet_.path_id != kDefaultPathId ? true : false; |
| 604 // Switching path needs to update packet number length. | 601 // Switching path needs to update packet number length. |
| 605 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); | 602 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); |
| 606 } | 603 } |
| 607 | 604 |
| 608 } // namespace net | 605 } // namespace net |
| OLD | NEW |