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 |