| 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 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 82 } | 82 } |
| 83 } | 83 } |
| 84 | 84 |
| 85 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { | 85 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { |
| 86 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 && | 86 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 && |
| 87 (force_close || | 87 (force_close || |
| 88 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); | 88 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); |
| 89 } | 89 } |
| 90 | 90 |
| 91 InFecGroup QuicPacketCreator::MaybeStartFEC() { | 91 InFecGroup QuicPacketCreator::MaybeStartFEC() { |
| 92 // Don't send FEC until QUIC_VERSION_15. | 92 if (IsFecEnabled() && fec_group_.get() == NULL) { |
| 93 if (framer_->version() != QUIC_VERSION_13 && | |
| 94 options_.max_packets_per_fec_group > 0 && fec_group_.get() == NULL) { | |
| 95 DCHECK(queued_frames_.empty()); | 93 DCHECK(queued_frames_.empty()); |
| 96 // Set the fec group number to the sequence number of the next packet. | 94 // Set the fec group number to the sequence number of the next packet. |
| 97 fec_group_number_ = sequence_number() + 1; | 95 fec_group_number_ = sequence_number() + 1; |
| 98 fec_group_.reset(new QuicFecGroup()); | 96 fec_group_.reset(new QuicFecGroup()); |
| 99 } | 97 } |
| 100 return fec_group_.get() == NULL ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; | 98 return fec_group_.get() == NULL ? NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 101 } | 99 } |
| 102 | 100 |
| 103 // Stops serializing version of the protocol in packets sent after this call. | 101 // Stops serializing version of the protocol in packets sent after this call. |
| 104 // A packet that is already open might send kQuicVersionSize bytes less than the | 102 // A packet that is already open might send kQuicVersionSize bytes less than the |
| (...skipping 21 matching lines...) Expand all Loading... |
| 126 const uint64 delta = max(current_delta, congestion_window_packets); | 124 const uint64 delta = max(current_delta, congestion_window_packets); |
| 127 options_.send_sequence_number_length = | 125 options_.send_sequence_number_length = |
| 128 QuicFramer::GetMinSequenceNumberLength(delta * 4); | 126 QuicFramer::GetMinSequenceNumberLength(delta * 4); |
| 129 } | 127 } |
| 130 | 128 |
| 131 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, | 129 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, |
| 132 QuicStreamOffset offset) const { | 130 QuicStreamOffset offset) const { |
| 133 // TODO(jri): This is a simple safe decision for now, but make | 131 // TODO(jri): This is a simple safe decision for now, but make |
| 134 // is_in_fec_group a parameter. Same as with all public methods in | 132 // is_in_fec_group a parameter. Same as with all public methods in |
| 135 // QuicPacketCreator. | 133 // QuicPacketCreator. |
| 136 InFecGroup is_in_fec_group = options_.max_packets_per_fec_group == 0 ? | |
| 137 NOT_IN_FEC_GROUP : IN_FEC_GROUP; | |
| 138 return BytesFree() > | 134 return BytesFree() > |
| 139 QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true, | 135 QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true, |
| 140 is_in_fec_group); | 136 IsFecEnabled()); |
| 141 } | 137 } |
| 142 | 138 |
| 143 // static | 139 // static |
| 144 size_t QuicPacketCreator::StreamFramePacketOverhead( | 140 size_t QuicPacketCreator::StreamFramePacketOverhead( |
| 145 QuicVersion version, | 141 QuicVersion version, |
| 146 QuicConnectionIdLength connection_id_length, | 142 QuicConnectionIdLength connection_id_length, |
| 147 bool include_version, | 143 bool include_version, |
| 148 QuicSequenceNumberLength sequence_number_length, | 144 QuicSequenceNumberLength sequence_number_length, |
| 149 InFecGroup is_in_fec_group) { | 145 InFecGroup is_in_fec_group) { |
| 150 return GetPacketHeaderSize(connection_id_length, include_version, | 146 return GetPacketHeaderSize(connection_id_length, include_version, |
| (...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 270 } | 266 } |
| 271 | 267 |
| 272 size_t QuicPacketCreator::BytesFree() const { | 268 size_t QuicPacketCreator::BytesFree() const { |
| 273 const size_t max_plaintext_size = | 269 const size_t max_plaintext_size = |
| 274 framer_->GetMaxPlaintextSize(options_.max_packet_length); | 270 framer_->GetMaxPlaintextSize(options_.max_packet_length); |
| 275 DCHECK_GE(max_plaintext_size, PacketSize()); | 271 DCHECK_GE(max_plaintext_size, PacketSize()); |
| 276 return max_plaintext_size - min(max_plaintext_size, PacketSize() | 272 return max_plaintext_size - min(max_plaintext_size, PacketSize() |
| 277 + ExpansionOnNewFrame()); | 273 + ExpansionOnNewFrame()); |
| 278 } | 274 } |
| 279 | 275 |
| 276 InFecGroup QuicPacketCreator::IsFecEnabled() const { |
| 277 return (framer_->version() == QUIC_VERSION_13 || |
| 278 options_.max_packets_per_fec_group == 0) ? |
| 279 NOT_IN_FEC_GROUP : IN_FEC_GROUP; |
| 280 } |
| 281 |
| 280 size_t QuicPacketCreator::PacketSize() const { | 282 size_t QuicPacketCreator::PacketSize() const { |
| 281 if (queued_frames_.empty()) { | 283 if (queued_frames_.empty()) { |
| 282 // Only adjust the sequence number length when the FEC group is not open, | 284 // Only adjust the sequence number length when the FEC group is not open, |
| 283 // to ensure no packets in a group are too large. | 285 // to ensure no packets in a group are too large. |
| 284 if (fec_group_.get() == NULL || | 286 if (fec_group_.get() == NULL || |
| 285 fec_group_->NumReceivedPackets() == 0) { | 287 fec_group_->NumReceivedPackets() == 0) { |
| 286 sequence_number_length_ = options_.send_sequence_number_length; | 288 sequence_number_length_ = options_.send_sequence_number_length; |
| 287 } | 289 } |
| 288 packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length, | 290 packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length, |
| 289 send_version_in_packet_, | 291 send_version_in_packet_, |
| 290 sequence_number_length_, | 292 sequence_number_length_, |
| 291 options_.max_packets_per_fec_group == 0 ? | 293 IsFecEnabled()); |
| 292 NOT_IN_FEC_GROUP : IN_FEC_GROUP); | |
| 293 } | 294 } |
| 294 return packet_size_; | 295 return packet_size_; |
| 295 } | 296 } |
| 296 | 297 |
| 297 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { | 298 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { |
| 298 return AddFrame(frame, true); | 299 return AddFrame(frame, true); |
| 299 } | 300 } |
| 300 | 301 |
| 301 SerializedPacket QuicPacketCreator::SerializePacket() { | 302 SerializedPacket QuicPacketCreator::SerializePacket() { |
| 302 LOG_IF(DFATAL, queued_frames_.empty()) | 303 LOG_IF(DFATAL, queued_frames_.empty()) |
| (...skipping 23 matching lines...) Expand all Loading... |
| 326 if (!possibly_truncated) | 327 if (!possibly_truncated) |
| 327 DCHECK_EQ(packet_size_, serialized.packet->length()); | 328 DCHECK_EQ(packet_size_, serialized.packet->length()); |
| 328 | 329 |
| 329 packet_size_ = 0; | 330 packet_size_ = 0; |
| 330 queued_frames_.clear(); | 331 queued_frames_.clear(); |
| 331 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); | 332 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); |
| 332 return serialized; | 333 return serialized; |
| 333 } | 334 } |
| 334 | 335 |
| 335 SerializedPacket QuicPacketCreator::SerializeFec() { | 336 SerializedPacket QuicPacketCreator::SerializeFec() { |
| 336 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); | 337 if (fec_group_.get() == NULL || fec_group_->NumReceivedPackets() <= 0) { |
| 338 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group."; |
| 339 // TODO(jri): Make this a public method of framer? |
| 340 SerializedPacket kNoPacket(0, PACKET_1BYTE_SEQUENCE_NUMBER, NULL, 0, NULL); |
| 341 return kNoPacket; |
| 342 } |
| 337 DCHECK_EQ(0u, queued_frames_.size()); | 343 DCHECK_EQ(0u, queued_frames_.size()); |
| 338 QuicPacketHeader header; | 344 QuicPacketHeader header; |
| 339 FillPacketHeader(fec_group_number_, true, &header); | 345 FillPacketHeader(fec_group_number_, true, &header); |
| 340 QuicFecData fec_data; | 346 QuicFecData fec_data; |
| 341 fec_data.fec_group = fec_group_->min_protected_packet(); | 347 fec_data.fec_group = fec_group_->min_protected_packet(); |
| 342 fec_data.redundancy = fec_group_->payload_parity(); | 348 fec_data.redundancy = fec_group_->payload_parity(); |
| 343 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data); | 349 SerializedPacket serialized = framer_->BuildFecPacket(header, fec_data); |
| 344 fec_group_.reset(NULL); | 350 fec_group_.reset(NULL); |
| 345 fec_group_number_ = 0; | 351 fec_group_number_ = 0; |
| 346 packet_size_ = 0; | 352 packet_size_ = 0; |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 if (!is_handshake) { | 453 if (!is_handshake) { |
| 448 return; | 454 return; |
| 449 } | 455 } |
| 450 | 456 |
| 451 QuicPaddingFrame padding; | 457 QuicPaddingFrame padding; |
| 452 bool success = AddFrame(QuicFrame(&padding), false); | 458 bool success = AddFrame(QuicFrame(&padding), false); |
| 453 DCHECK(success); | 459 DCHECK(success); |
| 454 } | 460 } |
| 455 | 461 |
| 456 } // namespace net | 462 } // namespace net |
| OLD | NEW |