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 |