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

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

Issue 2104633002: Landing recent QUIC changes until 6/24/2016 14:00 UTC (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase 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_packet_creator.h ('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 && !queued_frames_.empty()) {
119 // Don't change creator state if there are frames queued.
120 QUIC_BUG << "Called UpdatePacketNumberLength with " << queued_frames_.size()
121 << " queued_frames.";
122 return;
123 }
124
117 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1); 125 DCHECK_LE(least_packet_awaited_by_peer, packet_.packet_number + 1);
118 const QuicPacketNumber current_delta = 126 const QuicPacketNumber current_delta =
119 packet_.packet_number + 1 - least_packet_awaited_by_peer; 127 packet_.packet_number + 1 - least_packet_awaited_by_peer;
120 const uint64_t delta = max(current_delta, max_packets_in_flight); 128 const uint64_t delta = max(current_delta, max_packets_in_flight);
121 next_packet_number_length_ = 129 if (FLAGS_quic_simple_packet_number_length) {
122 QuicFramer::GetMinSequenceNumberLength(delta * 4); 130 packet_.packet_number_length =
131 QuicFramer::GetMinSequenceNumberLength(delta * 4);
132 } else {
133 next_packet_number_length_ =
134 QuicFramer::GetMinSequenceNumberLength(delta * 4);
135 }
123 } 136 }
124 137
125 bool QuicPacketCreator::ConsumeData(QuicStreamId id, 138 bool QuicPacketCreator::ConsumeData(QuicStreamId id,
126 QuicIOVector iov, 139 QuicIOVector iov,
127 size_t iov_offset, 140 size_t iov_offset,
128 QuicStreamOffset offset, 141 QuicStreamOffset offset,
129 bool fin, 142 bool fin,
130 bool needs_full_padding, 143 bool needs_full_padding,
131 QuicFrame* frame) { 144 QuicFrame* frame) {
132 if (!HasRoomForStreamFrame(id, offset)) { 145 if (!HasRoomForStreamFrame(id, offset)) {
133 return false; 146 return false;
134 } 147 }
135 CreateStreamFrame(id, iov, iov_offset, offset, fin, frame); 148 CreateStreamFrame(id, iov, iov_offset, offset, fin, frame);
136 // Explicitly disallow multi-packet CHLOs. 149 // Explicitly disallow multi-packet CHLOs.
137 if (FLAGS_quic_disallow_multi_packet_chlo && id == kCryptoStreamId && 150 if (id == kCryptoStreamId &&
138 frame->stream_frame->data_length >= sizeof(kCHLO) && 151 frame->stream_frame->data_length >= sizeof(kCHLO) &&
139 strncmp(frame->stream_frame->data_buffer, 152 strncmp(frame->stream_frame->data_buffer,
140 reinterpret_cast<const char*>(&kCHLO), sizeof(kCHLO)) == 0) { 153 reinterpret_cast<const char*>(&kCHLO), sizeof(kCHLO)) == 0) {
141 DCHECK_EQ(static_cast<size_t>(0), iov_offset); 154 DCHECK_EQ(static_cast<size_t>(0), iov_offset);
142 if (frame->stream_frame->data_length < iov.iov->iov_len) { 155 if (frame->stream_frame->data_length < iov.iov->iov_len) {
143 const string error_details = "Client hello won't fit in a single packet."; 156 const string error_details = "Client hello won't fit in a single packet.";
144 QUIC_BUG << error_details << " Constructed stream frame length: " 157 QUIC_BUG << error_details << " Constructed stream frame length: "
145 << frame->stream_frame->data_length 158 << frame->stream_frame->data_length
146 << " CHLO length: " << iov.iov->iov_len; 159 << " CHLO length: " << iov.iov->iov_len;
147 delegate_->OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, error_details, 160 delegate_->OnUnrecoverableError(QUIC_CRYPTO_CHLO_TOO_LARGE, error_details,
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
187 size_t iov_offset, 200 size_t iov_offset,
188 QuicStreamOffset offset, 201 QuicStreamOffset offset,
189 bool fin, 202 bool fin,
190 QuicFrame* frame) { 203 QuicFrame* frame) {
191 DCHECK_GT(max_packet_length_, 204 DCHECK_GT(max_packet_length_,
192 StreamFramePacketOverhead(framer_->version(), connection_id_length_, 205 StreamFramePacketOverhead(framer_->version(), connection_id_length_,
193 kIncludeVersion, kIncludePathId, 206 kIncludeVersion, kIncludePathId,
194 IncludeNonceInPublicHeader(), 207 IncludeNonceInPublicHeader(),
195 PACKET_6BYTE_PACKET_NUMBER, offset)); 208 PACKET_6BYTE_PACKET_NUMBER, offset));
196 209
197 MaybeUpdatePacketNumberLength(); 210 if (!FLAGS_quic_simple_packet_number_length) {
198 211 MaybeUpdatePacketNumberLength();
199 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) 212 }
213 QUIC_BUG_IF(!HasRoomForStreamFrame(id, offset))
200 << "No room for Stream frame, BytesFree: " << BytesFree() 214 << "No room for Stream frame, BytesFree: " << BytesFree()
201 << " MinStreamFrameSize: " 215 << " MinStreamFrameSize: "
202 << QuicFramer::GetMinStreamFrameSize(id, offset, true); 216 << QuicFramer::GetMinStreamFrameSize(id, offset, true);
203 217
204 if (iov_offset == iov.total_length) { 218 if (iov_offset == iov.total_length) {
205 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.";
206 // Create a new packet for the fin, if necessary. 220 // Create a new packet for the fin, if necessary.
207 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece())); 221 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, StringPiece()));
208 return; 222 return;
209 } 223 }
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after
281 DCHECK(queued_frames_.empty()); 295 DCHECK(queued_frames_.empty());
282 DCHECK_EQ(0, packet_.num_padding_bytes); 296 DCHECK_EQ(0, packet_.num_padding_bytes);
283 QUIC_BUG_IF(retransmission.retransmittable_frames.empty()) 297 QUIC_BUG_IF(retransmission.retransmittable_frames.empty())
284 << "Attempt to serialize empty packet"; 298 << "Attempt to serialize empty packet";
285 const QuicPacketNumberLength saved_length = packet_.packet_number_length; 299 const QuicPacketNumberLength saved_length = packet_.packet_number_length;
286 const QuicPacketNumberLength saved_next_length = next_packet_number_length_; 300 const QuicPacketNumberLength saved_next_length = next_packet_number_length_;
287 const EncryptionLevel default_encryption_level = packet_.encryption_level; 301 const EncryptionLevel default_encryption_level = packet_.encryption_level;
288 302
289 // Temporarily set the packet number length and change the encryption level. 303 // Temporarily set the packet number length and change the encryption level.
290 packet_.packet_number_length = retransmission.packet_number_length; 304 packet_.packet_number_length = retransmission.packet_number_length;
291 next_packet_number_length_ = retransmission.packet_number_length; 305 if (!FLAGS_quic_simple_packet_number_length) {
306 next_packet_number_length_ = retransmission.packet_number_length;
307 }
292 packet_.num_padding_bytes = retransmission.num_padding_bytes; 308 packet_.num_padding_bytes = retransmission.num_padding_bytes;
293 // Only preserve the original encryption level if it's a handshake packet or 309 // Only preserve the original encryption level if it's a handshake packet or
294 // if we haven't gone forward secure. 310 // if we haven't gone forward secure.
295 if (retransmission.has_crypto_handshake || 311 if (retransmission.has_crypto_handshake ||
296 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) { 312 packet_.encryption_level != ENCRYPTION_FORWARD_SECURE) {
297 packet_.encryption_level = retransmission.encryption_level; 313 packet_.encryption_level = retransmission.encryption_level;
298 } 314 }
299 315
300 // Serialize the packet and restore packet number length state. 316 // Serialize the packet and restore packet number length state.
301 for (const QuicFrame& frame : retransmission.retransmittable_frames) { 317 for (const QuicFrame& frame : retransmission.retransmittable_frames) {
302 bool success = AddFrame(frame, false); 318 bool success = AddFrame(frame, false);
303 DCHECK(success); 319 LOG_IF(DFATAL, !success)
320 << " Failed to add frame of type:" << frame.type
321 << " num_frames:" << retransmission.retransmittable_frames.size()
322 << " retransmission.packet_number_length:"
323 << retransmission.packet_number_length
324 << " packet_.packet_number_length:" << packet_.packet_number_length;
304 } 325 }
305 SerializePacket(buffer, buffer_len); 326 SerializePacket(buffer, buffer_len);
306 packet_.original_path_id = retransmission.path_id; 327 packet_.original_path_id = retransmission.path_id;
307 packet_.original_packet_number = retransmission.packet_number; 328 packet_.original_packet_number = retransmission.packet_number;
308 packet_.transmission_type = retransmission.transmission_type; 329 packet_.transmission_type = retransmission.transmission_type;
309 OnSerializedPacket(); 330 OnSerializedPacket();
310 // Restore old values. 331 // Restore old values.
311 packet_.packet_number_length = saved_length; 332 if (!FLAGS_quic_simple_packet_number_length) {
312 next_packet_number_length_ = saved_next_length; 333 // OnSerializedPacket updates the packet_number_length, so it's incorrect to
334 // restore it here.
335 packet_.packet_number_length = saved_length;
336 next_packet_number_length_ = saved_next_length;
337 }
313 packet_.encryption_level = default_encryption_level; 338 packet_.encryption_level = default_encryption_level;
314 } 339 }
315 340
316 void QuicPacketCreator::Flush() { 341 void QuicPacketCreator::Flush() {
317 if (!HasPendingFrames()) { 342 if (!HasPendingFrames()) {
318 return; 343 return;
319 } 344 }
320 345
321 // TODO(rtenneti): Change the default 64 alignas value (used the default 346 // TODO(rtenneti): Change the default 64 alignas value (used the default
322 // value from CACHELINE_SIZE). 347 // value from CACHELINE_SIZE).
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 DCHECK_GE(max_plaintext_size_, PacketSize()); 476 DCHECK_GE(max_plaintext_size_, PacketSize());
452 return max_plaintext_size_ - 477 return max_plaintext_size_ -
453 min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame()); 478 min(max_plaintext_size_, PacketSize() + ExpansionOnNewFrame());
454 } 479 }
455 480
456 size_t QuicPacketCreator::PacketSize() { 481 size_t QuicPacketCreator::PacketSize() {
457 if (!queued_frames_.empty()) { 482 if (!queued_frames_.empty()) {
458 return packet_size_; 483 return packet_size_;
459 } 484 }
460 // Update packet number length on packet boundary. 485 // Update packet number length on packet boundary.
461 packet_.packet_number_length = next_packet_number_length_; 486 if (!FLAGS_quic_simple_packet_number_length) {
487 packet_.packet_number_length = next_packet_number_length_;
488 }
462 packet_size_ = GetPacketHeaderSize( 489 packet_size_ = GetPacketHeaderSize(
463 framer_->version(), connection_id_length_, send_version_in_packet_, 490 framer_->version(), connection_id_length_, send_version_in_packet_,
464 send_path_id_in_packet_, IncludeNonceInPublicHeader(), 491 send_path_id_in_packet_, IncludeNonceInPublicHeader(),
465 packet_.packet_number_length); 492 packet_.packet_number_length);
466 return packet_size_; 493 return packet_size_;
467 } 494 }
468 495
469 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { 496 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) {
470 return AddFrame(frame, /*save_retransmittable_frames=*/true); 497 return AddFrame(frame, /*save_retransmittable_frames=*/true);
471 } 498 }
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 if (FLAGS_quic_never_write_unencrypted_data && frame.type == STREAM_FRAME && 611 if (FLAGS_quic_never_write_unencrypted_data && frame.type == STREAM_FRAME &&
585 frame.stream_frame->stream_id != kCryptoStreamId && 612 frame.stream_frame->stream_id != kCryptoStreamId &&
586 packet_.encryption_level == ENCRYPTION_NONE) { 613 packet_.encryption_level == ENCRYPTION_NONE) {
587 const string error_details = "Cannot send stream data without encryption."; 614 const string error_details = "Cannot send stream data without encryption.";
588 QUIC_BUG << error_details; 615 QUIC_BUG << error_details;
589 delegate_->OnUnrecoverableError( 616 delegate_->OnUnrecoverableError(
590 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details, 617 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details,
591 ConnectionCloseSource::FROM_SELF); 618 ConnectionCloseSource::FROM_SELF);
592 return false; 619 return false;
593 } 620 }
594 MaybeUpdatePacketNumberLength(); 621 if (!FLAGS_quic_simple_packet_number_length) {
595 622 MaybeUpdatePacketNumberLength();
623 }
596 size_t frame_len = framer_->GetSerializedFrameLength( 624 size_t frame_len = framer_->GetSerializedFrameLength(
597 frame, BytesFree(), queued_frames_.empty(), true, 625 frame, BytesFree(), queued_frames_.empty(), true,
598 packet_.packet_number_length); 626 packet_.packet_number_length);
599 if (frame_len == 0) { 627 if (frame_len == 0) {
600 // Current open packet is full. 628 // Current open packet is full.
601 Flush(); 629 Flush();
602 return false; 630 return false;
603 } 631 }
604 DCHECK_LT(0u, packet_size_); 632 DCHECK_LT(0u, packet_size_);
605 packet_size_ += ExpansionOnNewFrame() + frame_len; 633 packet_size_ += ExpansionOnNewFrame() + frame_len;
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after
687 if (bit_mask_ == 0) { 715 if (bit_mask_ == 0) {
688 bit_bucket_ = random_->RandUint64(); 716 bit_bucket_ = random_->RandUint64();
689 bit_mask_ = 1; 717 bit_mask_ = 1;
690 } 718 }
691 bool result = ((bit_bucket_ & bit_mask_) != 0); 719 bool result = ((bit_bucket_ & bit_mask_) != 0);
692 bit_mask_ <<= 1; 720 bit_mask_ <<= 1;
693 return result; 721 return result;
694 } 722 }
695 723
696 } // namespace net 724 } // namespace net
OLDNEW
« no previous file with comments | « net/quic/quic_packet_creator.h ('k') | net/quic/quic_packet_creator_test.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698