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

Side by Side Diff: net/quic/core/quic_packet_creator.cc

Issue 2354563003: Deprecate quic_simple_packet_number_length_2. (Closed)
Patch Set: Created 4 years, 3 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/core/quic_packet_creator.h ('k') | net/quic/core/quic_packet_creator_test.cc » ('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/core/quic_packet_creator.h" 5 #include "net/quic/core/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 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
75 // Avoid recomputing |max_plaintext_size_| if the length does not actually 75 // Avoid recomputing |max_plaintext_size_| if the length does not actually
76 // change. 76 // change.
77 if (length == max_packet_length_) { 77 if (length == max_packet_length_) {
78 return; 78 return;
79 } 79 }
80 80
81 max_packet_length_ = length; 81 max_packet_length_ = length;
82 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_); 82 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_);
83 } 83 }
84 84
85 void QuicPacketCreator::MaybeUpdatePacketNumberLength() {
86 DCHECK(!FLAGS_quic_simple_packet_number_length_2);
87 if (!queued_frames_.empty()) {
88 // Don't change creator state if there are frames queued.
89 return;
90 }
91
92 // Update packet number length only on packet boundary.
93 packet_.packet_number_length = next_packet_number_length_;
94 }
95
96 // Stops serializing version of the protocol in packets sent after this call. 85 // Stops serializing version of the protocol in packets sent after this call.
97 // A packet that is already open might send kQuicVersionSize bytes less than the 86 // A packet that is already open might send kQuicVersionSize bytes less than the
98 // maximum packet size if we stop sending version before it is serialized. 87 // maximum packet size if we stop sending version before it is serialized.
99 void QuicPacketCreator::StopSendingVersion() { 88 void QuicPacketCreator::StopSendingVersion() {
100 DCHECK(send_version_in_packet_); 89 DCHECK(send_version_in_packet_);
101 send_version_in_packet_ = false; 90 send_version_in_packet_ = false;
102 if (packet_size_ > 0) { 91 if (packet_size_ > 0) {
103 DCHECK_LT(kQuicVersionSize, packet_size_); 92 DCHECK_LT(kQuicVersionSize, packet_size_);
104 packet_size_ -= kQuicVersionSize; 93 packet_size_ -= kQuicVersionSize;
105 } 94 }
106 } 95 }
107 96
108 void QuicPacketCreator::SetDiversificationNonce( 97 void QuicPacketCreator::SetDiversificationNonce(
109 const DiversificationNonce& nonce) { 98 const DiversificationNonce& nonce) {
110 DCHECK(!have_diversification_nonce_); 99 DCHECK(!have_diversification_nonce_);
111 have_diversification_nonce_ = true; 100 have_diversification_nonce_ = true;
112 diversification_nonce_ = nonce; 101 diversification_nonce_ = nonce;
113 } 102 }
114 103
115 void QuicPacketCreator::UpdatePacketNumberLength( 104 void QuicPacketCreator::UpdatePacketNumberLength(
116 QuicPacketNumber least_packet_awaited_by_peer, 105 QuicPacketNumber least_packet_awaited_by_peer,
117 QuicPacketCount max_packets_in_flight) { 106 QuicPacketCount max_packets_in_flight) {
118 if (FLAGS_quic_simple_packet_number_length_2 && !queued_frames_.empty()) { 107 if (!queued_frames_.empty()) {
119 // Don't change creator state if there are frames queued. 108 // Don't change creator state if there are frames queued.
120 QUIC_BUG << "Called UpdatePacketNumberLength with " << queued_frames_.size() 109 QUIC_BUG << "Called UpdatePacketNumberLength with " << queued_frames_.size()
121 << " queued_frames. First frame type:" 110 << " queued_frames. First frame type:"
122 << queued_frames_.front().type 111 << queued_frames_.front().type
123 << " last frame type:" << queued_frames_.back().type; 112 << " last frame type:" << queued_frames_.back().type;
124 return; 113 return;
125 } 114 }
126 115
127 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1); 116 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1);
128 const QuicPacketNumber current_delta = 117 const QuicPacketNumber current_delta =
129 packet_.packet_number + 1 - least_packet_awaited_by_peer; 118 packet_.packet_number + 1 - least_packet_awaited_by_peer;
130 const uint64_t delta = max(current_delta, max_packets_in_flight); 119 const uint64_t delta = max(current_delta, max_packets_in_flight);
131 if (FLAGS_quic_simple_packet_number_length_2) { 120 packet_.packet_number_length =
132 packet_.packet_number_length = 121 QuicFramer::GetMinSequenceNumberLength(delta * 4);
133 QuicFramer::GetMinSequenceNumberLength(delta * 4);
134 } else {
135 next_packet_number_length_ =
136 QuicFramer::GetMinSequenceNumberLength(delta * 4);
137 }
138 } 122 }
139 123
140 bool QuicPacketCreator::ConsumeData(QuicStreamId id, 124 bool QuicPacketCreator::ConsumeData(QuicStreamId id,
141 QuicIOVector iov, 125 QuicIOVector iov,
142 size_t iov_offset, 126 size_t iov_offset,
143 QuicStreamOffset offset, 127 QuicStreamOffset offset,
144 bool fin, 128 bool fin,
145 bool needs_full_padding, 129 bool needs_full_padding,
146 QuicFrame* frame) { 130 QuicFrame* frame) {
147 if (!HasRoomForStreamFrame(id, offset)) { 131 if (!HasRoomForStreamFrame(id, offset)) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 size_t iov_offset, 186 size_t iov_offset,
203 QuicStreamOffset offset, 187 QuicStreamOffset offset,
204 bool fin, 188 bool fin,
205 QuicFrame* frame) { 189 QuicFrame* frame) {
206 DCHECK_GT(max_packet_length_, 190 DCHECK_GT(max_packet_length_,
207 StreamFramePacketOverhead(framer_->version(), connection_id_length_, 191 StreamFramePacketOverhead(framer_->version(), connection_id_length_,
208 kIncludeVersion, kIncludePathId, 192 kIncludeVersion, kIncludePathId,
209 IncludeNonceInPublicHeader(), 193 IncludeNonceInPublicHeader(),
210 PACKET_6BYTE_PACKET_NUMBER, offset)); 194 PACKET_6BYTE_PACKET_NUMBER, offset));
211 195
212 if (!FLAGS_quic_simple_packet_number_length_2) {
213 MaybeUpdatePacketNumberLength();
214 }
215 QUIC_BUG_IF(!HasRoomForStreamFrame(id, offset)) 196 QUIC_BUG_IF(!HasRoomForStreamFrame(id, offset))
216 << "No room for Stream frame, BytesFree: " << BytesFree() 197 << "No room for Stream frame, BytesFree: " << BytesFree()
217 << " MinStreamFrameSize: " 198 << " MinStreamFrameSize: "
218 << QuicFramer::GetMinStreamFrameSize(id, offset, true); 199 << QuicFramer::GetMinStreamFrameSize(id, offset, true);
219 200
220 if (iov_offset == iov.total_length) { 201 if (iov_offset == iov.total_length) {
221 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin."; 202 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin.";
222 // Create a new packet for the fin, if necessary. 203 // Create a new packet for the fin, if necessary.
223 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece())); 204 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece()));
224 return; 205 return;
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 } 272 }
292 273
293 void QuicPacketCreator::ReserializeAllFrames( 274 void QuicPacketCreator::ReserializeAllFrames(
294 const PendingRetransmission& retransmission, 275 const PendingRetransmission& retransmission,
295 char* buffer, 276 char* buffer,
296 size_t buffer_len) { 277 size_t buffer_len) {
297 DCHECK(queued_frames_.empty()); 278 DCHECK(queued_frames_.empty());
298 DCHECK_EQ(0, packet_.num_padding_bytes); 279 DCHECK_EQ(0, packet_.num_padding_bytes);
299 QUIC_BUG_IF(retransmission.retransmittable_frames.empty()) 280 QUIC_BUG_IF(retransmission.retransmittable_frames.empty())
300 << "Attempt to serialize empty packet"; 281 << "Attempt to serialize empty packet";
301 const QuicPacketNumberLength saved_length = packet_.packet_number_length;
302 const QuicPacketNumberLength saved_next_length = next_packet_number_length_;
303 const EncryptionLevel default_encryption_level = packet_.encryption_level; 282 const EncryptionLevel default_encryption_level = packet_.encryption_level;
304 283
305 // Temporarily set the packet number length and change the encryption level. 284 // Temporarily set the packet number length and change the encryption level.
306 packet_.packet_number_length = retransmission.packet_number_length; 285 packet_.packet_number_length = retransmission.packet_number_length;
307 if (!FLAGS_quic_simple_packet_number_length_2) {
308 next_packet_number_length_ = retransmission.packet_number_length;
309 }
310 packet_.num_padding_bytes = retransmission.num_padding_bytes; 286 packet_.num_padding_bytes = retransmission.num_padding_bytes;
311 // Only preserve the original encryption level if it's a handshake packet or 287 // Only preserve the original encryption level if it's a handshake packet or
312 // if we haven't gone forward secure. 288 // if we haven't gone forward secure.
313 if (retransmission.has_crypto_handshake || 289 if (retransmission.has_crypto_handshake ||
314 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) { 290 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) {
315 packet_.encryption_level = retransmission.encryption_level; 291 packet_.encryption_level = retransmission.encryption_level;
316 } 292 }
317 293
318 // Serialize the packet and restore packet number length state. 294 // Serialize the packet and restore packet number length state.
319 for (const QuicFrame& frame : retransmission.retransmittable_frames) { 295 for (const QuicFrame& frame : retransmission.retransmittable_frames) {
320 bool success = AddFrame(frame, false); 296 bool success = AddFrame(frame, false);
321 QUIC_BUG_IF(!success) << " Failed to add frame of type:" << frame.type 297 QUIC_BUG_IF(!success) << " Failed to add frame of type:" << frame.type
322 << " num_frames:" 298 << " num_frames:"
323 << retransmission.retransmittable_frames.size() 299 << retransmission.retransmittable_frames.size()
324 << " retransmission.packet_number_length:" 300 << " retransmission.packet_number_length:"
325 << retransmission.packet_number_length 301 << retransmission.packet_number_length
326 << " packet_.packet_number_length:" 302 << " packet_.packet_number_length:"
327 << packet_.packet_number_length; 303 << packet_.packet_number_length;
328 } 304 }
329 SerializePacket(buffer, buffer_len); 305 SerializePacket(buffer, buffer_len);
330 packet_.original_path_id = retransmission.path_id; 306 packet_.original_path_id = retransmission.path_id;
331 packet_.original_packet_number = retransmission.packet_number; 307 packet_.original_packet_number = retransmission.packet_number;
332 packet_.transmission_type = retransmission.transmission_type; 308 packet_.transmission_type = retransmission.transmission_type;
333 OnSerializedPacket(); 309 OnSerializedPacket();
334 // Restore old values. 310 // Restore old values.
335 if (!FLAGS_quic_simple_packet_number_length_2) {
336 // OnSerializedPacket updates the packet_number_length, so it's incorrect to
337 // restore it here.
338 packet_.packet_number_length = saved_length;
339 next_packet_number_length_ = saved_next_length;
340 }
341 packet_.encryption_level = default_encryption_level; 311 packet_.encryption_level = default_encryption_level;
342 } 312 }
343 313
344 void QuicPacketCreator::Flush() { 314 void QuicPacketCreator::Flush() {
345 if (!HasPendingFrames()) { 315 if (!HasPendingFrames()) {
346 return; 316 return;
347 } 317 }
348 318
349 // TODO(rtenneti): Change the default 64 alignas value (used the default 319 // TODO(rtenneti): Change the default 64 alignas value (used the default
350 // value from CACHELINE_SIZE). 320 // value from CACHELINE_SIZE).
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
478 size_t QuicPacketCreator::BytesFree() { 448 size_t QuicPacketCreator::BytesFree() {
479 DCHECK_GE(max_plaintext_size_, PacketSize()); 449 DCHECK_GE(max_plaintext_size_, PacketSize());
480 return max_plaintext_size_ - 450 return max_plaintext_size_ -
481 min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame()); 451 min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame());
482 } 452 }
483 453
484 size_t QuicPacketCreator::PacketSize() { 454 size_t QuicPacketCreator::PacketSize() {
485 if (!queued_frames_.empty()) { 455 if (!queued_frames_.empty()) {
486 return packet_size_; 456 return packet_size_;
487 } 457 }
488 // Update packet number length on packet boundary.
489 if (!FLAGS_quic_simple_packet_number_length_2) {
490 packet_.packet_number_length = next_packet_number_length_;
491 }
492 packet_size_ = GetPacketHeaderSize( 458 packet_size_ = GetPacketHeaderSize(
493 framer_->version(), connection_id_length_, send_version_in_packet_, 459 framer_->version(), connection_id_length_, send_version_in_packet_,
494 send_path_id_in_packet_, IncludeNonceInPublicHeader(), 460 send_path_id_in_packet_, IncludeNonceInPublicHeader(),
495 packet_.packet_number_length); 461 packet_.packet_number_length);
496 return packet_size_; 462 return packet_size_;
497 } 463 }
498 464
499 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { 465 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) {
500 return AddFrame(frame, /*save_retransmittable_frames=*/true); 466 return AddFrame(frame, /*save_retransmittable_frames=*/true);
501 } 467 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
614 if (frame.type == STREAM_FRAME && 580 if (frame.type == STREAM_FRAME &&
615 frame.stream_frame->stream_id != kCryptoStreamId && 581 frame.stream_frame->stream_id != kCryptoStreamId &&
616 packet_.encryption_level == ENCRYPTION_NONE) { 582 packet_.encryption_level == ENCRYPTION_NONE) {
617 const string error_details = "Cannot send stream data without encryption."; 583 const string error_details = "Cannot send stream data without encryption.";
618 QUIC_BUG << error_details; 584 QUIC_BUG << error_details;
619 delegate_->OnUnrecoverableError( 585 delegate_->OnUnrecoverableError(
620 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details, 586 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details,
621 ConnectionCloseSource::FROM_SELF); 587 ConnectionCloseSource::FROM_SELF);
622 return false; 588 return false;
623 } 589 }
624 if (!FLAGS_quic_simple_packet_number_length_2) {
625 MaybeUpdatePacketNumberLength();
626 }
627 size_t frame_len = framer_->GetSerializedFrameLength( 590 size_t frame_len = framer_->GetSerializedFrameLength(
628 frame, BytesFree(), queued_frames_.empty(), true, 591 frame, BytesFree(), queued_frames_.empty(), true,
629 packet_.packet_number_length); 592 packet_.packet_number_length);
630 if (frame_len == 0) { 593 if (frame_len == 0) {
631 // Current open packet is full. 594 // Current open packet is full.
632 Flush(); 595 Flush();
633 return false; 596 return false;
634 } 597 }
635 DCHECK_LT(0u, packet_size_); 598 DCHECK_LT(0u, packet_size_);
636 packet_size_ += ExpansionOnNewFrame() + frame_len; 599 packet_size_ += ExpansionOnNewFrame() + frame_len;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 if (bit_mask_ == 0) { 681 if (bit_mask_ == 0) {
719 bit_bucket_ = random_->RandUint64(); 682 bit_bucket_ = random_->RandUint64();
720 bit_mask_ = 1; 683 bit_mask_ = 1;
721 } 684 }
722 bool result = ((bit_bucket_ & bit_mask_) != 0); 685 bool result = ((bit_bucket_ & bit_mask_) != 0);
723 bit_mask_ <<= 1; 686 bit_mask_ <<= 1;
724 return result; 687 return result;
725 } 688 }
726 689
727 } // namespace net 690 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/core/quic_packet_creator.h ('k') | net/quic/core/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698