| 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 "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" |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 69 QuicFramer* framer, | 69 QuicFramer* framer, |
| 70 QuicRandom* random_generator) | 70 QuicRandom* random_generator) |
| 71 : connection_id_(connection_id), | 71 : connection_id_(connection_id), |
| 72 encryption_level_(ENCRYPTION_NONE), | 72 encryption_level_(ENCRYPTION_NONE), |
| 73 framer_(framer), | 73 framer_(framer), |
| 74 random_bool_source_(new QuicRandomBoolSource(random_generator)), | 74 random_bool_source_(new QuicRandomBoolSource(random_generator)), |
| 75 sequence_number_(0), | 75 sequence_number_(0), |
| 76 should_fec_protect_(false), | 76 should_fec_protect_(false), |
| 77 fec_group_number_(0), | 77 fec_group_number_(0), |
| 78 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), | 78 send_version_in_packet_(framer->perspective() == Perspective::IS_CLIENT), |
| 79 max_packet_length_(kDefaultMaxPacketSize), | |
| 80 max_packets_per_fec_group_(kDefaultMaxPacketsPerFecGroup), | 79 max_packets_per_fec_group_(kDefaultMaxPacketsPerFecGroup), |
| 81 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), | 80 connection_id_length_(PACKET_8BYTE_CONNECTION_ID), |
| 82 next_sequence_number_length_(PACKET_1BYTE_SEQUENCE_NUMBER), | 81 next_sequence_number_length_(PACKET_1BYTE_SEQUENCE_NUMBER), |
| 83 sequence_number_length_(next_sequence_number_length_), | 82 sequence_number_length_(next_sequence_number_length_), |
| 84 packet_size_(0) { | 83 packet_size_(0) { |
| 84 SetMaxPacketLength(kDefaultMaxPacketSize); |
| 85 framer_->set_fec_builder(this); | 85 framer_->set_fec_builder(this); |
| 86 } | 86 } |
| 87 | 87 |
| 88 QuicPacketCreator::~QuicPacketCreator() { | 88 QuicPacketCreator::~QuicPacketCreator() { |
| 89 } | 89 } |
| 90 | 90 |
| 91 void QuicPacketCreator::OnBuiltFecProtectedPayload( | 91 void QuicPacketCreator::OnBuiltFecProtectedPayload( |
| 92 const QuicPacketHeader& header, StringPiece payload) { | 92 const QuicPacketHeader& header, StringPiece payload) { |
| 93 if (fec_group_.get()) { | 93 if (fec_group_.get()) { |
| 94 DCHECK_NE(0u, header.fec_group); | 94 DCHECK_NE(0u, header.fec_group); |
| 95 fec_group_->Update(encryption_level_, header, payload); | 95 fec_group_->Update(encryption_level_, header, payload); |
| 96 } | 96 } |
| 97 } | 97 } |
| 98 | 98 |
| 99 void QuicPacketCreator::SetEncrypter(EncryptionLevel level, |
| 100 QuicEncrypter* encrypter) { |
| 101 framer_->SetEncrypter(level, encrypter); |
| 102 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_); |
| 103 } |
| 104 |
| 105 void QuicPacketCreator::SetMaxPacketLength(QuicByteCount length) { |
| 106 // |max_packet_length_| should not be changed mid-packet or mid-FEC group. |
| 107 DCHECK(fec_group_.get() == nullptr && queued_frames_.empty()); |
| 108 max_packet_length_ = length; |
| 109 max_plaintext_size_ = framer_->GetMaxPlaintextSize(max_packet_length_); |
| 110 } |
| 111 |
| 99 void QuicPacketCreator::set_max_packets_per_fec_group( | 112 void QuicPacketCreator::set_max_packets_per_fec_group( |
| 100 size_t max_packets_per_fec_group) { | 113 size_t max_packets_per_fec_group) { |
| 101 max_packets_per_fec_group_ = max(kLowestMaxPacketsPerFecGroup, | 114 max_packets_per_fec_group_ = max(kLowestMaxPacketsPerFecGroup, |
| 102 max_packets_per_fec_group); | 115 max_packets_per_fec_group); |
| 103 DCHECK_LT(0u, max_packets_per_fec_group_); | 116 DCHECK_LT(0u, max_packets_per_fec_group_); |
| 104 } | 117 } |
| 105 | 118 |
| 106 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { | 119 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { |
| 107 DCHECK(!HasPendingFrames()); | 120 DCHECK(!HasPendingFrames()); |
| 108 return fec_group_.get() != nullptr && fec_group_->NumReceivedPackets() > 0 && | 121 return fec_group_.get() != nullptr && fec_group_->NumReceivedPackets() > 0 && |
| (...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 322 return 0; | 335 return 0; |
| 323 } | 336 } |
| 324 // If the last frame in the packet is a stream frame, then it will expand to | 337 // If the last frame in the packet is a stream frame, then it will expand to |
| 325 // include the stream_length field when a new frame is added. | 338 // include the stream_length field when a new frame is added. |
| 326 bool has_trailing_stream_frame = | 339 bool has_trailing_stream_frame = |
| 327 !queued_frames_.empty() && queued_frames_.back().type == STREAM_FRAME; | 340 !queued_frames_.empty() && queued_frames_.back().type == STREAM_FRAME; |
| 328 return has_trailing_stream_frame ? kQuicStreamPayloadLengthSize : 0; | 341 return has_trailing_stream_frame ? kQuicStreamPayloadLengthSize : 0; |
| 329 } | 342 } |
| 330 | 343 |
| 331 size_t QuicPacketCreator::BytesFree() const { | 344 size_t QuicPacketCreator::BytesFree() const { |
| 332 const size_t max_plaintext_size = | 345 DCHECK_GE(max_plaintext_size_, PacketSize()); |
| 333 framer_->GetMaxPlaintextSize(max_packet_length_); | 346 return max_plaintext_size_ - min(max_plaintext_size_, PacketSize() |
| 334 DCHECK_GE(max_plaintext_size, PacketSize()); | 347 + ExpansionOnNewFrame()); |
| 335 return max_plaintext_size - min(max_plaintext_size, PacketSize() | |
| 336 + ExpansionOnNewFrame()); | |
| 337 } | 348 } |
| 338 | 349 |
| 339 size_t QuicPacketCreator::PacketSize() const { | 350 size_t QuicPacketCreator::PacketSize() const { |
| 340 if (!queued_frames_.empty()) { | 351 if (!queued_frames_.empty()) { |
| 341 return packet_size_; | 352 return packet_size_; |
| 342 } | 353 } |
| 343 if (fec_group_.get() == nullptr) { | 354 if (fec_group_.get() == nullptr) { |
| 344 // Update sequence number length on packet and FEC boundary. | 355 // Update sequence number length on packet and FEC boundary. |
| 345 sequence_number_length_ = next_sequence_number_length_; | 356 sequence_number_length_ = next_sequence_number_length_; |
| 346 } | 357 } |
| 347 packet_size_ = GetPacketHeaderSize( | 358 packet_size_ = GetPacketHeaderSize( |
| 348 connection_id_length_, send_version_in_packet_, sequence_number_length_, | 359 connection_id_length_, send_version_in_packet_, sequence_number_length_, |
| 349 should_fec_protect_ ? IN_FEC_GROUP : NOT_IN_FEC_GROUP); | 360 should_fec_protect_ ? IN_FEC_GROUP : NOT_IN_FEC_GROUP); |
| 350 return packet_size_; | 361 return packet_size_; |
| 351 } | 362 } |
| 352 | 363 |
| 353 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { | 364 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { |
| 354 return AddFrame(frame, true); | 365 return AddFrame(frame, true); |
| 355 } | 366 } |
| 356 | 367 |
| 357 SerializedPacket QuicPacketCreator::SerializePacket() { | 368 SerializedPacket QuicPacketCreator::SerializePacket() { |
| 358 LOG_IF(DFATAL, queued_frames_.empty()) | 369 LOG_IF(DFATAL, queued_frames_.empty()) |
| 359 << "Attempt to serialize empty packet"; | 370 << "Attempt to serialize empty packet"; |
| 360 DCHECK_GE(sequence_number_ + 1, fec_group_number_); | 371 DCHECK_GE(sequence_number_ + 1, fec_group_number_); |
| 361 QuicPacketHeader header; | 372 QuicPacketHeader header; |
| 362 FillPacketHeader(should_fec_protect_ ? fec_group_number_ : 0, false, &header); | 373 FillPacketHeader(should_fec_protect_ ? fec_group_number_ : 0, false, &header); |
| 363 | 374 |
| 364 MaybeAddPadding(); | 375 MaybeAddPadding(); |
| 365 | 376 |
| 366 size_t max_plaintext_size = | 377 DCHECK_GE(max_plaintext_size_, packet_size_); |
| 367 framer_->GetMaxPlaintextSize(max_packet_length_); | |
| 368 DCHECK_GE(max_plaintext_size, packet_size_); | |
| 369 // ACK Frames will be truncated due to length only if they're the only frame | 378 // ACK Frames will be truncated due to length only if they're the only frame |
| 370 // in the packet, and if packet_size_ was set to max_plaintext_size. If | 379 // in the packet, and if packet_size_ was set to max_plaintext_size_. If |
| 371 // truncation due to length occurred, then GetSerializedFrameLength will have | 380 // truncation due to length occurred, then GetSerializedFrameLength will have |
| 372 // returned all bytes free. | 381 // returned all bytes free. |
| 373 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size && | 382 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size_ && |
| 374 queued_frames_.size() == 1 && | 383 queued_frames_.size() == 1 && |
| 375 queued_frames_.back().type == ACK_FRAME; | 384 queued_frames_.back().type == ACK_FRAME; |
| 376 char buffer[kMaxPacketSize]; | 385 char buffer[kMaxPacketSize]; |
| 377 scoped_ptr<QuicPacket> packet; | 386 scoped_ptr<QuicPacket> packet; |
| 378 // Use the packet_size_ instead of the buffer size to ensure smaller | 387 // Use the packet_size_ instead of the buffer size to ensure smaller |
| 379 // packet sizes are properly used. | 388 // packet sizes are properly used. |
| 380 scoped_ptr<char[]> large_buffer; | 389 scoped_ptr<char[]> large_buffer; |
| 381 if (packet_size_ <= kMaxPacketSize) { | 390 if (packet_size_ <= kMaxPacketSize) { |
| 382 packet.reset( | 391 packet.reset( |
| 383 framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_)); | 392 framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_)); |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 546 if (!is_handshake) { | 555 if (!is_handshake) { |
| 547 return; | 556 return; |
| 548 } | 557 } |
| 549 | 558 |
| 550 QuicPaddingFrame padding; | 559 QuicPaddingFrame padding; |
| 551 bool success = AddFrame(QuicFrame(&padding), false); | 560 bool success = AddFrame(QuicFrame(&padding), false); |
| 552 DCHECK(success); | 561 DCHECK(success); |
| 553 } | 562 } |
| 554 | 563 |
| 555 } // namespace net | 564 } // namespace net |
| OLD | NEW |