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

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

Issue 935333002: Update from https://crrev.com/316786 (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 10 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 "base/basictypes.h" 7 #include "base/basictypes.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "net/quic/crypto/quic_random.h" 9 #include "net/quic/crypto/quic_random.h"
10 #include "net/quic/quic_ack_notifier.h" 10 #include "net/quic/quic_ack_notifier.h"
11 #include "net/quic/quic_data_writer.h"
11 #include "net/quic/quic_fec_group.h" 12 #include "net/quic/quic_fec_group.h"
12 #include "net/quic/quic_utils.h" 13 #include "net/quic/quic_utils.h"
13 14
14 using base::StringPiece; 15 using base::StringPiece;
15 using std::make_pair; 16 using std::make_pair;
16 using std::max; 17 using std::max;
17 using std::min; 18 using std::min;
18 using std::pair; 19 using std::pair;
19 using std::vector; 20 using std::vector;
20 21
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after
255 bool set_fin = fin && bytes_consumed == data_size; // Last frame. 256 bool set_fin = fin && bytes_consumed == data_size; // Last frame.
256 IOVector frame_data; 257 IOVector frame_data;
257 frame_data.AppendIovecAtMostBytes(data.iovec(), data.Size(), 258 frame_data.AppendIovecAtMostBytes(data.iovec(), data.Size(),
258 bytes_consumed); 259 bytes_consumed);
259 DCHECK_EQ(frame_data.TotalBufferSize(), bytes_consumed); 260 DCHECK_EQ(frame_data.TotalBufferSize(), bytes_consumed);
260 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, frame_data)); 261 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, frame_data));
261 return bytes_consumed; 262 return bytes_consumed;
262 } 263 }
263 264
264 SerializedPacket QuicPacketCreator::ReserializeAllFrames( 265 SerializedPacket QuicPacketCreator::ReserializeAllFrames(
265 const QuicFrames& frames, 266 const RetransmittableFrames& frames,
266 QuicSequenceNumberLength original_length) { 267 QuicSequenceNumberLength original_length) {
267 DCHECK(fec_group_.get() == nullptr); 268 DCHECK(fec_group_.get() == nullptr);
268 const QuicSequenceNumberLength saved_length = sequence_number_length_; 269 const QuicSequenceNumberLength saved_length = sequence_number_length_;
269 const QuicSequenceNumberLength saved_next_length = 270 const QuicSequenceNumberLength saved_next_length =
270 next_sequence_number_length_; 271 next_sequence_number_length_;
271 const bool saved_should_fec_protect = should_fec_protect_; 272 const bool saved_should_fec_protect = should_fec_protect_;
273 const EncryptionLevel default_encryption_level = encryption_level_;
272 274
273 // Temporarily set the sequence number length and stop FEC protection. 275 // Temporarily set the sequence number length, stop FEC protection,
276 // and change the encryption level.
274 sequence_number_length_ = original_length; 277 sequence_number_length_ = original_length;
275 next_sequence_number_length_ = original_length; 278 next_sequence_number_length_ = original_length;
276 should_fec_protect_ = false; 279 should_fec_protect_ = false;
280 encryption_level_ = frames.encryption_level();
277 281
278 // Serialize the packet and restore the FEC and sequence number length state. 282 // Serialize the packet and restore the FEC and sequence number length state.
279 SerializedPacket serialized_packet = SerializeAllFrames(frames); 283 SerializedPacket serialized_packet = SerializeAllFrames(frames.frames());
280 sequence_number_length_ = saved_length; 284 sequence_number_length_ = saved_length;
281 next_sequence_number_length_ = saved_next_length; 285 next_sequence_number_length_ = saved_next_length;
282 should_fec_protect_ = saved_should_fec_protect; 286 should_fec_protect_ = saved_should_fec_protect;
287 encryption_level_ = default_encryption_level;
283 288
284 return serialized_packet; 289 return serialized_packet;
285 } 290 }
286 291
292 // TODO(ianswett): Remove this method, because it's test only.
287 SerializedPacket QuicPacketCreator::SerializeAllFrames( 293 SerializedPacket QuicPacketCreator::SerializeAllFrames(
288 const QuicFrames& frames) { 294 const QuicFrames& frames) {
289 // TODO(satyamshekhar): Verify that this DCHECK won't fail. What about queued 295 // TODO(satyamshekhar): Verify that this DCHECK won't fail. What about queued
290 // frames from SendStreamData()[send_stream_should_flush_ == false && 296 // frames from SendStreamData()[send_stream_should_flush_ == false &&
291 // data.empty() == true] and retransmit due to RTO. 297 // data.empty() == true] and retransmit due to RTO.
292 DCHECK_EQ(0u, queued_frames_.size()); 298 DCHECK_EQ(0u, queued_frames_.size());
293 LOG_IF(DFATAL, frames.empty()) 299 LOG_IF(DFATAL, frames.empty())
294 << "Attempt to serialize empty packet"; 300 << "Attempt to serialize empty packet";
295 for (size_t i = 0; i < frames.size(); ++i) { 301 for (const QuicFrame& frame : frames) {
296 bool success = AddFrame(frames[i], false); 302 bool success = AddFrame(frame, false);
297 DCHECK(success); 303 DCHECK(success);
298 } 304 }
299 SerializedPacket packet = SerializePacket(); 305 SerializedPacket packet = SerializePacket();
300 DCHECK(packet.retransmittable_frames == nullptr); 306 DCHECK(packet.retransmittable_frames == nullptr);
301 return packet; 307 return packet;
302 } 308 }
303 309
304 bool QuicPacketCreator::HasPendingFrames() const { 310 bool QuicPacketCreator::HasPendingFrames() const {
305 return !queued_frames_.empty(); 311 return !queued_frames_.empty();
306 } 312 }
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
360 size_t max_plaintext_size = 366 size_t max_plaintext_size =
361 framer_->GetMaxPlaintextSize(max_packet_length_); 367 framer_->GetMaxPlaintextSize(max_packet_length_);
362 DCHECK_GE(max_plaintext_size, packet_size_); 368 DCHECK_GE(max_plaintext_size, packet_size_);
363 // ACK Frames will be truncated due to length only if they're the only frame 369 // ACK Frames will be truncated due to length only if they're the only frame
364 // in the packet, and if packet_size_ was set to max_plaintext_size. If 370 // in the packet, and if packet_size_ was set to max_plaintext_size. If
365 // truncation due to length occurred, then GetSerializedFrameLength will have 371 // truncation due to length occurred, then GetSerializedFrameLength will have
366 // returned all bytes free. 372 // returned all bytes free.
367 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size && 373 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size &&
368 queued_frames_.size() == 1 && 374 queued_frames_.size() == 1 &&
369 queued_frames_.back().type == ACK_FRAME; 375 queued_frames_.back().type == ACK_FRAME;
370 SerializedPacket serialized = 376 char buffer[kMaxPacketSize];
371 framer_->BuildDataPacket(header, queued_frames_, packet_size_); 377 scoped_ptr<QuicPacket> packet;
372 LOG_IF(DFATAL, !serialized.packet) 378 // Use the packet_size_ instead of the buffer size to ensure smaller
373 << "Failed to serialize " << queued_frames_.size() << " frames."; 379 // packet sizes are properly used.
380 scoped_ptr<char[]> large_buffer;
381 if (packet_size_ <= kMaxPacketSize) {
382 packet.reset(
383 framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_));
384 } else {
385 large_buffer.reset(new char[packet_size_]);
386 packet.reset(framer_->BuildDataPacket(header, queued_frames_,
387 large_buffer.get(), packet_size_));
388 }
389 LOG_IF(DFATAL, packet == nullptr) << "Failed to serialize "
390 << queued_frames_.size() << " frames.";
374 // Because of possible truncation, we can't be confident that our 391 // Because of possible truncation, we can't be confident that our
375 // packet size calculation worked correctly. 392 // packet size calculation worked correctly.
376 if (!possibly_truncated_by_length) { 393 if (!possibly_truncated_by_length) {
377 DCHECK_EQ(packet_size_, serialized.packet->length()); 394 DCHECK_EQ(packet_size_, packet->length());
378 } 395 }
396 // Immediately encrypt the packet, to ensure we don't encrypt the same packet
397 // sequence number multiple times.
398 QuicEncryptedPacket* encrypted =
399 framer_->EncryptPacket(encryption_level_, sequence_number_, *packet);
400 if (encrypted == nullptr) {
401 LOG(DFATAL) << "Failed to encrypt packet number " << sequence_number_;
402 SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0,
403 nullptr);
404 return kNoPacket;
405 }
406
379 packet_size_ = 0; 407 packet_size_ = 0;
380 queued_frames_.clear(); 408 queued_frames_.clear();
381 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 409 return SerializedPacket(header.packet_sequence_number,
382 return serialized; 410 header.public_header.sequence_number_length,
411 encrypted, QuicFramer::GetPacketEntropyHash(header),
412 queued_retransmittable_frames_.release());
383 } 413 }
384 414
385 SerializedPacket QuicPacketCreator::SerializeFec() { 415 SerializedPacket QuicPacketCreator::SerializeFec() {
386 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) { 416 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) {
387 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group."; 417 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group.";
388 // TODO(jri): Make this a public method of framer? 418 // TODO(jri): Make this a public method of framer?
389 SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0, 419 SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0,
390 nullptr); 420 nullptr);
391 return kNoPacket; 421 return kNoPacket;
392 } 422 }
393 DCHECK_EQ(0u, queued_frames_.size()); 423 DCHECK_EQ(0u, queued_frames_.size());
394 QuicPacketHeader header; 424 QuicPacketHeader header;
395 FillPacketHeader(fec_group_number_, true, &header); 425 FillPacketHeader(fec_group_number_, true, &header);
396 QuicFecData fec_data; 426 QuicFecData fec_data;
397 fec_data.fec_group = fec_group_->min_protected_packet(); 427 fec_data.fec_group = fec_group_->min_protected_packet();
398 fec_data.redundancy = fec_group_->payload_parity(); 428 fec_data.redundancy = fec_group_->payload_parity();
399 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data); 429 scoped_ptr<QuicPacket> packet(framer_->BuildFecPacket(header, fec_data));
400 fec_group_.reset(nullptr); 430 fec_group_.reset(nullptr);
401 packet_size_ = 0; 431 packet_size_ = 0;
402 LOG_IF(DFATAL, !serialized.packet) 432 LOG_IF(DFATAL, packet == nullptr)
403 << "Failed to serialize fec packet for group:" << fec_data.fec_group; 433 << "Failed to serialize fec packet for group:" << fec_data.fec_group;
404 DCHECK_GE(max_packet_length_, serialized.packet->length()); 434 DCHECK_GE(max_packet_length_, packet->length());
435 // Immediately encrypt the packet, to ensure we don't encrypt the same packet
436 // sequence number multiple times.
437 QuicEncryptedPacket* encrypted =
438 framer_->EncryptPacket(encryption_level_, sequence_number_, *packet);
439 if (encrypted == nullptr) {
440 LOG(DFATAL) << "Failed to encrypt packet number " << sequence_number_;
441 SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, nullptr, 0,
442 nullptr);
443 return kNoPacket;
444 }
445 SerializedPacket serialized(
446 header.packet_sequence_number,
447 header.public_header.sequence_number_length, encrypted,
448 QuicFramer::GetPacketEntropyHash(header), nullptr);
449 serialized.is_fec_packet = true;
405 return serialized; 450 return serialized;
406 } 451 }
407 452
408 SerializedPacket QuicPacketCreator::SerializeConnectionClose( 453 SerializedPacket QuicPacketCreator::SerializeConnectionClose(
409 QuicConnectionCloseFrame* close_frame) { 454 QuicConnectionCloseFrame* close_frame) {
410 QuicFrames frames; 455 QuicFrames frames;
411 frames.push_back(QuicFrame(close_frame)); 456 frames.push_back(QuicFrame(close_frame));
412 return SerializeAllFrames(frames); 457 return SerializeAllFrames(frames);
413 } 458 }
414 459
(...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after
509 if (!is_handshake) { 554 if (!is_handshake) {
510 return; 555 return;
511 } 556 }
512 557
513 QuicPaddingFrame padding; 558 QuicPaddingFrame padding;
514 bool success = AddFrame(QuicFrame(&padding), false); 559 bool success = AddFrame(QuicFrame(&padding), false);
515 DCHECK(success); 560 DCHECK(success);
516 } 561 }
517 562
518 } // namespace net 563 } // 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