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

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

Issue 2101623003: Stop using next_packet_sequence_number_length in QuicPacketCreator. No functional change. Protect… (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@125703498
Patch Set: Created 4 years, 5 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_flags.cc ('k') | net/quic/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/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 27 matching lines...) Expand all
38 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), 38 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT),
39 send_path_id_in_packet_(false), 39 send_path_id_in_packet_(false),
40 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER), 40 next_packet_number_length_(PACKET_1BYTE_PACKET_NUMBER),
41 have_diversification_nonce_(false), 41 have_diversification_nonce_(false),
42 max_packet_length_(0), 42 max_packet_length_(0),
43 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), 43 connection_id_length_(PACKET_8BYTE_CONNECTION_ID),
44 packet_size_(0), 44 packet_size_(0),
45 connection_id_(connection_id), 45 connection_id_(connection_id),
46 packet_(kDefaultPathId, 46 packet_(kDefaultPathId,
47 0, 47 0,
48 next_packet_number_length_, 48 PACKET_1BYTE_PACKET_NUMBER,
49 nullptr, 49 nullptr,
50 0, 50 0,
51 0, 51 0,
52 false, 52 false,
53 false) { 53 false) {
54 SetMaxPacketLength(kDefaultMaxPacketSize); 54 SetMaxPacketLength(kDefaultMaxPacketSize);
55 } 55 }
56 56
57 QuicPacketCreator::~QuicPacketCreator() { 57 QuicPacketCreator::~QuicPacketCreator() {
58 QuicUtils::DeleteFrames(&packet_.retransmittable_frames); 58 QuicUtils::DeleteFrames(&packet_.retransmittable_frames);
(...skipping 17 matching lines...) Expand all
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() { 85 void QuicPacketCreator::MaybeUpdatePacketNumberLength() {
86 DCHECK(!FLAGS_quic_simple_packet_number_length);
86 if (!queued_frames_.empty()) { 87 if (!queued_frames_.empty()) {
87 // Don't change creator state if there are frames queued. 88 // Don't change creator state if there are frames queued.
88 return; 89 return;
89 } 90 }
90 91
91 // Update packet number length only on packet boundary. 92 // Update packet number length only on packet boundary.
92 packet_.packet_number_length = next_packet_number_length_; 93 packet_.packet_number_length = next_packet_number_length_;
93 } 94 }
94 95
95 // Stops serializing version of the protocol in packets sent after this call. 96 // Stops serializing version of the protocol in packets sent after this call.
(...skipping 11 matching lines...) Expand all
107 void QuicPacketCreator::SetDiversificationNonce( 108 void QuicPacketCreator::SetDiversificationNonce(
108 const DiversificationNonce nonce) { 109 const DiversificationNonce nonce) {
109 DCHECK(!have_diversification_nonce_); 110 DCHECK(!have_diversification_nonce_);
110 have_diversification_nonce_ = true; 111 have_diversification_nonce_ = true;
111 memcpy(&diversification_nonce_, nonce, sizeof(diversification_nonce_)); 112 memcpy(&diversification_nonce_, nonce, sizeof(diversification_nonce_));
112 } 113 }
113 114
114 void QuicPacketCreator::UpdatePacketNumberLength( 115 void QuicPacketCreator::UpdatePacketNumberLength(
115 QuicPacketNumber least_packet_awaited_by_peer, 116 QuicPacketNumber least_packet_awaited_by_peer,
116 QuicPacketCount max_packets_in_flight) { 117 QuicPacketCount max_packets_in_flight) {
118 if (FLAGS_quic_simple_packet_number_length &&
119 !queued_frames_.empty()) {
120 // Don't change creator state if there are frames queued.
121 QUIC_BUG << "Called UpdatePacketNumberLength with " << queued_frames_.size()
122 << " queued_frames.";
123 return;
124 }
125
117 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1); 126 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1);
118 const QuicPacketNumber current_delta = 127 const QuicPacketNumber current_delta =
119 packet_.packet_number + 1 - least_packet_awaited_by_peer; 128 packet_.packet_number + 1 - least_packet_awaited_by_peer;
120 const uint64_t delta = max(current_delta, max_packets_in_flight); 129 const uint64_t delta = max(current_delta, max_packets_in_flight);
121 next_packet_number_length_ = 130 if (FLAGS_quic_simple_packet_number_length) {
122 QuicFramer::GetMinSequenceNumberLength(delta * 4); 131 packet_.packet_number_length =
132 QuicFramer::GetMinSequenceNumberLength(delta * 4);
133 } else {
134 next_packet_number_length_ =
135 QuicFramer::GetMinSequenceNumberLength(delta * 4);
136 }
123 } 137 }
124 138
125 bool QuicPacketCreator::ConsumeData(QuicStreamId id, 139 bool QuicPacketCreator::ConsumeData(QuicStreamId id,
126 QuicIOVector iov, 140 QuicIOVector iov,
127 size_t iov_offset, 141 size_t iov_offset,
128 QuicStreamOffset offset, 142 QuicStreamOffset offset,
129 bool fin, 143 bool fin,
130 bool needs_full_padding, 144 bool needs_full_padding,
131 QuicFrame* frame) { 145 QuicFrame* frame) {
132 if (!HasRoomForStreamFrame(id, offset)) { 146 if (!HasRoomForStreamFrame(id, offset)) {
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 size_t iov_offset, 201 size_t iov_offset,
188 QuicStreamOffset offset, 202 QuicStreamOffset offset,
189 bool fin, 203 bool fin,
190 QuicFrame* frame) { 204 QuicFrame* frame) {
191 DCHECK_GT(max_packet_length_, 205 DCHECK_GT(max_packet_length_,
192 StreamFramePacketOverhead(framer_->version(), connection_id_length_, 206 StreamFramePacketOverhead(framer_->version(), connection_id_length_,
193 kIncludeVersion, kIncludePathId, 207 kIncludeVersion, kIncludePathId,
194 IncludeNonceInPublicHeader(), 208 IncludeNonceInPublicHeader(),
195 PACKET_6BYTE_PACKET_NUMBER, offset)); 209 PACKET_6BYTE_PACKET_NUMBER, offset));
196 210
197 MaybeUpdatePacketNumberLength(); 211 if (!FLAGS_quic_simple_packet_number_length) {
198 212 MaybeUpdatePacketNumberLength();
199 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) 213 }
214 QUIC_BUG_IF(!HasRoomForStreamFrame(id, offset))
200 << "No room for Stream frame, BytesFree: " << BytesFree() 215 << "No room for Stream frame, BytesFree: " << BytesFree()
201 << " MinStreamFrameSize: " 216 << " MinStreamFrameSize: "
202 << QuicFramer::GetMinStreamFrameSize(id, offset, true); 217 << QuicFramer::GetMinStreamFrameSize(id, offset, true);
203 218
204 if (iov_offset == iov.total_length) { 219 if (iov_offset == iov.total_length) {
205 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin."; 220 QUIC_BUG_IF(!fin) << "Creating a stream frame with no data or fin.";
206 // Create a new packet for the fin, if necessary. 221 // Create a new packet for the fin, if necessary.
207 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece())); 222 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece()));
208 return; 223 return;
209 } 224 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 DCHECK(queued_frames_.empty()); 296 DCHECK(queued_frames_.empty());
282 DCHECK_EQ(0, packet_.num_padding_bytes); 297 DCHECK_EQ(0, packet_.num_padding_bytes);
283 QUIC_BUG_IF(retransmission.retransmittable_frames.empty()) 298 QUIC_BUG_IF(retransmission.retransmittable_frames.empty())
284 << "Attempt to serialize empty packet"; 299 << "Attempt to serialize empty packet";
285 const QuicPacketNumberLength saved_length = packet_.packet_number_length; 300 const QuicPacketNumberLength saved_length = packet_.packet_number_length;
286 const QuicPacketNumberLength saved_next_length = next_packet_number_length_; 301 const QuicPacketNumberLength saved_next_length = next_packet_number_length_;
287 const EncryptionLevel default_encryption_level = packet_.encryption_level; 302 const EncryptionLevel default_encryption_level = packet_.encryption_level;
288 303
289 // Temporarily set the packet number length and change the encryption level. 304 // Temporarily set the packet number length and change the encryption level.
290 packet_.packet_number_length = retransmission.packet_number_length; 305 packet_.packet_number_length = retransmission.packet_number_length;
291 next_packet_number_length_ = retransmission.packet_number_length; 306 if (!FLAGS_quic_simple_packet_number_length) {
307 next_packet_number_length_ = retransmission.packet_number_length;
308 }
292 packet_.num_padding_bytes = retransmission.num_padding_bytes; 309 packet_.num_padding_bytes = retransmission.num_padding_bytes;
293 // Only preserve the original encryption level if it's a handshake packet or 310 // Only preserve the original encryption level if it's a handshake packet or
294 // if we haven't gone forward secure. 311 // if we haven't gone forward secure.
295 if (retransmission.has_crypto_handshake || 312 if (retransmission.has_crypto_handshake ||
296 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) { 313 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) {
297 packet_.encryption_level = retransmission.encryption_level; 314 packet_.encryption_level = retransmission.encryption_level;
298 } 315 }
299 316
300 // Serialize the packet and restore packet number length state. 317 // Serialize the packet and restore packet number length state.
301 for (const QuicFrame& frame : retransmission.retransmittable_frames) { 318 for (const QuicFrame& frame : retransmission.retransmittable_frames) {
302 bool success = AddFrame(frame, false); 319 bool success = AddFrame(frame, false);
303 DCHECK(success); 320 LOG_IF(DFATAL, !success)
321 << " Failed to add frame of type:" << frame.type
322 << " num_frames:" << retransmission.retransmittable_frames.size()
323 << " retransmission.packet_number_length:"
324 << retransmission.packet_number_length
325 << " packet_.packet_number_length:" << packet_.packet_number_length;
304 } 326 }
305 SerializePacket(buffer, buffer_len); 327 SerializePacket(buffer, buffer_len);
306 packet_.original_path_id = retransmission.path_id; 328 packet_.original_path_id = retransmission.path_id;
307 packet_.original_packet_number = retransmission.packet_number; 329 packet_.original_packet_number = retransmission.packet_number;
308 packet_.transmission_type = retransmission.transmission_type; 330 packet_.transmission_type = retransmission.transmission_type;
309 OnSerializedPacket(); 331 OnSerializedPacket();
310 // Restore old values. 332 // Restore old values.
311 packet_.packet_number_length = saved_length; 333 if (!FLAGS_quic_simple_packet_number_length) {
312 next_packet_number_length_ = saved_next_length; 334 // OnSerializedPacket updates the packet_number_length, so it's incorrect to
335 // restore it here.
336 packet_.packet_number_length = saved_length;
337 next_packet_number_length_ = saved_next_length;
338 }
313 packet_.encryption_level = default_encryption_level; 339 packet_.encryption_level = default_encryption_level;
314 } 340 }
315 341
316 void QuicPacketCreator::Flush() { 342 void QuicPacketCreator::Flush() {
317 if (!HasPendingFrames()) { 343 if (!HasPendingFrames()) {
318 return; 344 return;
319 } 345 }
320 346
321 // TODO(rtenneti): Change the default 64 alignas value (used the default 347 // TODO(rtenneti): Change the default 64 alignas value (used the default
322 // value from CACHELINE_SIZE). 348 // value from CACHELINE_SIZE).
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 DCHECK_GE(max_plaintext_size_, PacketSize()); 477 DCHECK_GE(max_plaintext_size_, PacketSize());
452 return max_plaintext_size_ - 478 return max_plaintext_size_ -
453 min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame()); 479 min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame());
454 } 480 }
455 481
456 size_t QuicPacketCreator::PacketSize() { 482 size_t QuicPacketCreator::PacketSize() {
457 if (!queued_frames_.empty()) { 483 if (!queued_frames_.empty()) {
458 return packet_size_; 484 return packet_size_;
459 } 485 }
460 // Update packet number length on packet boundary. 486 // Update packet number length on packet boundary.
461 packet_.packet_number_length = next_packet_number_length_; 487 if (!FLAGS_quic_simple_packet_number_length) {
488 packet_.packet_number_length = next_packet_number_length_;
489 }
462 packet_size_ = GetPacketHeaderSize( 490 packet_size_ = GetPacketHeaderSize(
463 framer_->version(), connection_id_length_, send_version_in_packet_, 491 framer_->version(), connection_id_length_, send_version_in_packet_,
464 send_path_id_in_packet_, IncludeNonceInPublicHeader(), 492 send_path_id_in_packet_, IncludeNonceInPublicHeader(),
465 packet_.packet_number_length); 493 packet_.packet_number_length);
466 return packet_size_; 494 return packet_size_;
467 } 495 }
468 496
469 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { 497 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) {
470 return AddFrame(frame, /*save_retransmittable_frames=*/true); 498 return AddFrame(frame, /*save_retransmittable_frames=*/true);
471 } 499 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 if (FLAGS_quic_never_write_unencrypted_data && frame.type == STREAM_FRAME && 612 if (FLAGS_quic_never_write_unencrypted_data && frame.type == STREAM_FRAME &&
585 frame.stream_frame->stream_id != kCryptoStreamId && 613 frame.stream_frame->stream_id != kCryptoStreamId &&
586 packet_.encryption_level == ENCRYPTION_NONE) { 614 packet_.encryption_level == ENCRYPTION_NONE) {
587 const string error_details = "Cannot send stream data without encryption."; 615 const string error_details = "Cannot send stream data without encryption.";
588 QUIC_BUG << error_details; 616 QUIC_BUG << error_details;
589 delegate_->OnUnrecoverableError( 617 delegate_->OnUnrecoverableError(
590 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details, 618 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details,
591 ConnectionCloseSource::FROM_SELF); 619 ConnectionCloseSource::FROM_SELF);
592 return false; 620 return false;
593 } 621 }
594 MaybeUpdatePacketNumberLength(); 622 if (!FLAGS_quic_simple_packet_number_length) {
595 623 MaybeUpdatePacketNumberLength();
624 }
596 size_t frame_len = framer_->GetSerializedFrameLength( 625 size_t frame_len = framer_->GetSerializedFrameLength(
597 frame, BytesFree(), queued_frames_.empty(), true, 626 frame, BytesFree(), queued_frames_.empty(), true,
598 packet_.packet_number_length); 627 packet_.packet_number_length);
599 if (frame_len == 0) { 628 if (frame_len == 0) {
600 // Current open packet is full. 629 // Current open packet is full.
601 Flush(); 630 Flush();
602 return false; 631 return false;
603 } 632 }
604 DCHECK_LT(0u, packet_size_); 633 DCHECK_LT(0u, packet_size_);
605 packet_size_ += ExpansionOnNewFrame() + frame_len; 634 packet_size_ += ExpansionOnNewFrame() + frame_len;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 if (bit_mask_ == 0) { 716 if (bit_mask_ == 0) {
688 bit_bucket_ = random_->RandUint64(); 717 bit_bucket_ = random_->RandUint64();
689 bit_mask_ = 1; 718 bit_mask_ = 1;
690 } 719 }
691 bool result = ((bit_bucket_ & bit_mask_) != 0); 720 bool result = ((bit_bucket_ & bit_mask_) != 0);
692 bit_mask_ <<= 1; 721 bit_mask_ <<= 1;
693 return result; 722 return result;
694 } 723 }
695 724
696 } // namespace net 725 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_flags.cc ('k') | net/quic/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698