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_flags.h" |
10 #include "net/quic/quic_utils.h" | 11 #include "net/quic/quic_utils.h" |
11 | 12 |
12 using base::StringPiece; | 13 using base::StringPiece; |
13 | 14 |
14 namespace net { | 15 namespace net { |
15 | 16 |
16 namespace { | 17 namespace { |
17 | 18 |
18 // We want to put some space between a protected packet and the FEC packet to | 19 // 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, | 20 // avoid losing them both within the same loss episode. On the other hand, |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
86 | 87 |
87 void QuicPacketGenerator::OnCongestionWindowChange( | 88 void QuicPacketGenerator::OnCongestionWindowChange( |
88 QuicPacketCount max_packets_in_flight) { | 89 QuicPacketCount max_packets_in_flight) { |
89 packet_creator_.set_max_packets_per_fec_group( | 90 packet_creator_.set_max_packets_per_fec_group( |
90 static_cast<size_t>(kMaxPacketsInFlightMultiplierForFecGroupSize * | 91 static_cast<size_t>(kMaxPacketsInFlightMultiplierForFecGroupSize * |
91 max_packets_in_flight)); | 92 max_packets_in_flight)); |
92 } | 93 } |
93 | 94 |
94 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback, | 95 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback, |
95 bool also_send_stop_waiting) { | 96 bool also_send_stop_waiting) { |
| 97 if (FLAGS_quic_disallow_multiple_pending_ack_frames) { |
| 98 if (pending_ack_frame_ != nullptr) { |
| 99 // Ack already queued, nothing to do. |
| 100 return; |
| 101 } |
| 102 |
| 103 if (also_send_feedback && pending_feedback_frame_ != nullptr) { |
| 104 LOG(DFATAL) << "Should only ever be one pending feedback frame."; |
| 105 return; |
| 106 } |
| 107 |
| 108 if (also_send_stop_waiting && pending_stop_waiting_frame_ != nullptr) { |
| 109 LOG(DFATAL) << "Should only ever be one pending stop waiting frame."; |
| 110 return; |
| 111 } |
| 112 } |
| 113 |
96 should_send_ack_ = true; | 114 should_send_ack_ = true; |
97 should_send_feedback_ = also_send_feedback; | 115 should_send_feedback_ = also_send_feedback; |
98 should_send_stop_waiting_ = also_send_stop_waiting; | 116 should_send_stop_waiting_ = also_send_stop_waiting; |
99 SendQueuedFrames(false); | 117 SendQueuedFrames(false); |
100 } | 118 } |
101 | 119 |
102 void QuicPacketGenerator::SetShouldSendStopWaiting() { | 120 void QuicPacketGenerator::SetShouldSendStopWaiting() { |
103 should_send_stop_waiting_ = true; | 121 should_send_stop_waiting_ = true; |
104 SendQueuedFrames(false); | 122 SendQueuedFrames(false); |
105 } | 123 } |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
340 debug_delegate_->OnFrameAddedToPacket(frame); | 358 debug_delegate_->OnFrameAddedToPacket(frame); |
341 } | 359 } |
342 return success; | 360 return success; |
343 } | 361 } |
344 | 362 |
345 void QuicPacketGenerator::SerializeAndSendPacket() { | 363 void QuicPacketGenerator::SerializeAndSendPacket() { |
346 SerializedPacket serialized_packet = packet_creator_.SerializePacket(); | 364 SerializedPacket serialized_packet = packet_creator_.SerializePacket(); |
347 DCHECK(serialized_packet.packet); | 365 DCHECK(serialized_packet.packet); |
348 delegate_->OnSerializedPacket(serialized_packet); | 366 delegate_->OnSerializedPacket(serialized_packet); |
349 MaybeSendFecPacketAndCloseGroup(false); | 367 MaybeSendFecPacketAndCloseGroup(false); |
| 368 |
| 369 // The packet has now been serialized, safe to delete pending frames. |
| 370 if (FLAGS_quic_disallow_multiple_pending_ack_frames) { |
| 371 pending_ack_frame_.reset(); |
| 372 pending_feedback_frame_.reset(); |
| 373 pending_stop_waiting_frame_.reset(); |
| 374 } |
350 } | 375 } |
351 | 376 |
352 void QuicPacketGenerator::StopSendingVersion() { | 377 void QuicPacketGenerator::StopSendingVersion() { |
353 packet_creator_.StopSendingVersion(); | 378 packet_creator_.StopSendingVersion(); |
354 } | 379 } |
355 | 380 |
356 QuicPacketSequenceNumber QuicPacketGenerator::sequence_number() const { | 381 QuicPacketSequenceNumber QuicPacketGenerator::sequence_number() const { |
357 return packet_creator_.sequence_number(); | 382 return packet_creator_.sequence_number(); |
358 } | 383 } |
359 | 384 |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
394 packet_creator_.set_connection_id_length(PACKET_8BYTE_CONNECTION_ID); | 419 packet_creator_.set_connection_id_length(PACKET_8BYTE_CONNECTION_ID); |
395 } | 420 } |
396 } | 421 } |
397 | 422 |
398 | 423 |
399 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { | 424 void QuicPacketGenerator::set_encryption_level(EncryptionLevel level) { |
400 packet_creator_.set_encryption_level(level); | 425 packet_creator_.set_encryption_level(level); |
401 } | 426 } |
402 | 427 |
403 } // namespace net | 428 } // namespace net |
OLD | NEW |