| 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_generator.h" | 5 #include "net/quic/quic_packet_generator.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/quic_fec_group.h" | 9 #include "net/quic/quic_fec_group.h" |
| 10 #include "net/quic/quic_utils.h" | 10 #include "net/quic/quic_utils.h" |
| 11 | 11 |
| 12 using base::StringPiece; | 12 using base::StringPiece; |
| 13 | 13 |
| 14 namespace net { | 14 namespace net { |
| 15 | 15 |
| 16 namespace { | 16 namespace { |
| 17 | 17 |
| 18 // We want to put some space between a protected packet and the FEC packet to | 18 // We want to put some space between a protected packet and the FEC packet to |
| 19 // avoid losing them both within the same loss episode. On the other hand, | 19 // avoid losing them both within the same loss episode. On the other hand, |
| 20 // we expect to be able to recover from any loss in about an RTT. | 20 // we expect to be able to recover from any loss in about an RTT. |
| 21 // We resolve this tradeoff by sending an FEC packet atmost half an RTT, | 21 // We resolve this tradeoff by sending an FEC packet atmost half an RTT, |
| 22 // or equivalently, half a cwnd, after the first protected packet. Since we | 22 // or equivalently, half the max number of in-flight packets, the first |
| 23 // don't want to delay an FEC packet past half an RTT, we set the max FEC | 23 // protected packet. Since we don't want to delay an FEC packet past half an |
| 24 // group size to be half the current congestion window. | 24 // RTT, we set the max FEC group size to be half the current congestion window. |
| 25 const float kCongestionWindowMultiplierForFecGroupSize = 0.5; | 25 const float kMaxPacketsInFlightMultiplierForFecGroupSize = 0.5; |
| 26 | 26 |
| 27 } // namespace | 27 } // namespace |
| 28 | 28 |
| 29 class QuicAckNotifier; | 29 class QuicAckNotifier; |
| 30 | 30 |
| 31 QuicPacketGenerator::QuicPacketGenerator(QuicConnectionId connection_id, | 31 QuicPacketGenerator::QuicPacketGenerator(QuicConnectionId connection_id, |
| 32 QuicFramer* framer, | 32 QuicFramer* framer, |
| 33 QuicRandom* random_generator, | 33 QuicRandom* random_generator, |
| 34 DelegateInterface* delegate) | 34 DelegateInterface* delegate) |
| 35 : delegate_(delegate), | 35 : delegate_(delegate), |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 78 case PING_FRAME: | 78 case PING_FRAME: |
| 79 delete it->ping_frame; | 79 delete it->ping_frame; |
| 80 break; | 80 break; |
| 81 case NUM_FRAME_TYPES: | 81 case NUM_FRAME_TYPES: |
| 82 DCHECK(false) << "Cannot delete type: " << it->type; | 82 DCHECK(false) << "Cannot delete type: " << it->type; |
| 83 } | 83 } |
| 84 } | 84 } |
| 85 } | 85 } |
| 86 | 86 |
| 87 void QuicPacketGenerator::OnCongestionWindowChange( | 87 void QuicPacketGenerator::OnCongestionWindowChange( |
| 88 QuicByteCount congestion_window) { | 88 QuicPacketCount max_packets_in_flight) { |
| 89 packet_creator_.set_max_packets_per_fec_group( | 89 packet_creator_.set_max_packets_per_fec_group( |
| 90 static_cast<size_t>(kCongestionWindowMultiplierForFecGroupSize * | 90 static_cast<size_t>(kMaxPacketsInFlightMultiplierForFecGroupSize * |
| 91 congestion_window / kDefaultTCPMSS)); | 91 max_packets_in_flight)); |
| 92 } | 92 } |
| 93 | 93 |
| 94 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback, | 94 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback, |
| 95 bool also_send_stop_waiting) { | 95 bool also_send_stop_waiting) { |
| 96 should_send_ack_ = true; | 96 should_send_ack_ = true; |
| 97 should_send_feedback_ = also_send_feedback; | 97 should_send_feedback_ = also_send_feedback; |
| 98 should_send_stop_waiting_ = also_send_stop_waiting; | 98 should_send_stop_waiting_ = also_send_stop_waiting; |
| 99 SendQueuedFrames(false); | 99 SendQueuedFrames(false); |
| 100 } | 100 } |
| 101 | 101 |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 371 } | 371 } |
| 372 | 372 |
| 373 SerializedPacket QuicPacketGenerator::ReserializeAllFrames( | 373 SerializedPacket QuicPacketGenerator::ReserializeAllFrames( |
| 374 const QuicFrames& frames, | 374 const QuicFrames& frames, |
| 375 QuicSequenceNumberLength original_length) { | 375 QuicSequenceNumberLength original_length) { |
| 376 return packet_creator_.ReserializeAllFrames(frames, original_length); | 376 return packet_creator_.ReserializeAllFrames(frames, original_length); |
| 377 } | 377 } |
| 378 | 378 |
| 379 void QuicPacketGenerator::UpdateSequenceNumberLength( | 379 void QuicPacketGenerator::UpdateSequenceNumberLength( |
| 380 QuicPacketSequenceNumber least_packet_awaited_by_peer, | 380 QuicPacketSequenceNumber least_packet_awaited_by_peer, |
| 381 QuicByteCount congestion_window) { | 381 QuicPacketCount max_packets_in_flight) { |
| 382 return packet_creator_.UpdateSequenceNumberLength( | 382 return packet_creator_.UpdateSequenceNumberLength( |
| 383 least_packet_awaited_by_peer, congestion_window); | 383 least_packet_awaited_by_peer, max_packets_in_flight); |
| 384 } | 384 } |
| 385 | 385 |
| 386 void QuicPacketGenerator::SetConnectionIdLength(uint32 length) { | 386 void QuicPacketGenerator::SetConnectionIdLength(uint32 length) { |
| 387 if (length == 0) { | 387 if (length == 0) { |
| 388 packet_creator_.set_connection_id_length(PACKET_0BYTE_CONNECTION_ID); | 388 packet_creator_.set_connection_id_length(PACKET_0BYTE_CONNECTION_ID); |
| 389 } else if (length == 1) { | 389 } else if (length == 1) { |
| 390 packet_creator_.set_connection_id_length(PACKET_1BYTE_CONNECTION_ID); | 390 packet_creator_.set_connection_id_length(PACKET_1BYTE_CONNECTION_ID); |
| 391 } else if (length <= 4) { | 391 } else if (length <= 4) { |
| 392 packet_creator_.set_connection_id_length(PACKET_4BYTE_CONNECTION_ID); | 392 packet_creator_.set_connection_id_length(PACKET_4BYTE_CONNECTION_ID); |
| 393 } else { | 393 } else { |
| 394 packet_creator_.set_connection_id_length(PACKET_8BYTE_CONNECTION_ID); | 394 packet_creator_.set_connection_id_length(PACKET_8BYTE_CONNECTION_ID); |
| 395 } | 395 } |
| 396 } | 396 } |
| 397 | 397 |
| 398 | 398 |
| 399 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { | 399 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { |
| 400 packet_creator_.set_encryption_level(level); | 400 packet_creator_.set_encryption_level(level); |
| 401 } | 401 } |
| 402 | 402 |
| 403 } // namespace net | 403 } // namespace net |
| OLD | NEW |