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/logging.h" | 7 #include "base/logging.h" |
8 #include "net/quic/quic_fec_group.h" | 8 #include "net/quic/quic_fec_group.h" |
9 #include "net/quic/quic_utils.h" | 9 #include "net/quic/quic_utils.h" |
10 | 10 |
11 using base::StringPiece; | 11 using base::StringPiece; |
12 | 12 |
13 namespace net { | 13 namespace net { |
14 | 14 |
| 15 class QuicAckNotifier; |
| 16 |
15 QuicPacketGenerator::QuicPacketGenerator(DelegateInterface* delegate, | 17 QuicPacketGenerator::QuicPacketGenerator(DelegateInterface* delegate, |
16 DebugDelegateInterface* debug_delegate, | 18 DebugDelegateInterface* debug_delegate, |
17 QuicPacketCreator* creator) | 19 QuicPacketCreator* creator) |
18 : delegate_(delegate), | 20 : delegate_(delegate), |
19 debug_delegate_(debug_delegate), | 21 debug_delegate_(debug_delegate), |
20 packet_creator_(creator), | 22 packet_creator_(creator), |
21 batch_mode_(false), | 23 batch_mode_(false), |
22 should_send_ack_(false), | 24 should_send_ack_(false), |
23 should_send_feedback_(false) { | 25 should_send_feedback_(false) { |
24 } | 26 } |
(...skipping 28 matching lines...) Expand all Loading... |
53 } | 55 } |
54 } | 56 } |
55 } | 57 } |
56 | 58 |
57 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback) { | 59 void QuicPacketGenerator::SetShouldSendAck(bool also_send_feedback) { |
58 should_send_ack_ = true; | 60 should_send_ack_ = true; |
59 should_send_feedback_ = also_send_feedback; | 61 should_send_feedback_ = also_send_feedback; |
60 SendQueuedFrames(); | 62 SendQueuedFrames(); |
61 } | 63 } |
62 | 64 |
63 | |
64 void QuicPacketGenerator::AddControlFrame(const QuicFrame& frame) { | 65 void QuicPacketGenerator::AddControlFrame(const QuicFrame& frame) { |
65 queued_control_frames_.push_back(frame); | 66 queued_control_frames_.push_back(frame); |
66 SendQueuedFrames(); | 67 SendQueuedFrames(); |
67 } | 68 } |
68 | 69 |
69 QuicConsumedData QuicPacketGenerator::ConsumeData(QuicStreamId id, | 70 QuicConsumedData QuicPacketGenerator::ConsumeData(QuicStreamId id, |
70 StringPiece data, | 71 StringPiece data, |
71 QuicStreamOffset offset, | 72 QuicStreamOffset offset, |
72 bool fin) { | 73 bool fin) { |
| 74 return ConsumeData(id, data, offset, fin, NULL); |
| 75 } |
| 76 |
| 77 QuicConsumedData QuicPacketGenerator::ConsumeData(QuicStreamId id, |
| 78 StringPiece data, |
| 79 QuicStreamOffset offset, |
| 80 bool fin, |
| 81 QuicAckNotifier* notifier) { |
73 IsHandshake handshake = id == kCryptoStreamId ? IS_HANDSHAKE : NOT_HANDSHAKE; | 82 IsHandshake handshake = id == kCryptoStreamId ? IS_HANDSHAKE : NOT_HANDSHAKE; |
74 // The caller should have flushed pending frames before sending handshake | 83 // The caller should have flushed pending frames before sending handshake |
75 // messages. | 84 // messages. |
76 DCHECK(handshake == NOT_HANDSHAKE || !HasPendingFrames()); | 85 DCHECK(handshake == NOT_HANDSHAKE || !HasPendingFrames()); |
77 SendQueuedFrames(); | 86 SendQueuedFrames(); |
78 | 87 |
79 size_t total_bytes_consumed = 0; | 88 size_t total_bytes_consumed = 0; |
80 bool fin_consumed = false; | 89 bool fin_consumed = false; |
81 | 90 |
82 while (delegate_->CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, | 91 while (delegate_->CanWrite(NOT_RETRANSMISSION, HAS_RETRANSMITTABLE_DATA, |
83 handshake)) { | 92 handshake)) { |
84 QuicFrame frame; | 93 QuicFrame frame; |
85 size_t bytes_consumed = packet_creator_->CreateStreamFrame( | 94 size_t bytes_consumed; |
| 95 if (notifier != NULL) { |
| 96 // We want to track which packet this stream frame ends up in. |
| 97 bytes_consumed = packet_creator_->CreateStreamFrameWithNotifier( |
| 98 id, data, offset + total_bytes_consumed, fin, notifier, &frame); |
| 99 } else { |
| 100 bytes_consumed = packet_creator_->CreateStreamFrame( |
86 id, data, offset + total_bytes_consumed, fin, &frame); | 101 id, data, offset + total_bytes_consumed, fin, &frame); |
| 102 } |
87 bool success = AddFrame(frame); | 103 bool success = AddFrame(frame); |
88 DCHECK(success); | 104 DCHECK(success); |
89 | 105 |
90 total_bytes_consumed += bytes_consumed; | 106 total_bytes_consumed += bytes_consumed; |
91 fin_consumed = fin && bytes_consumed == data.size(); | 107 fin_consumed = fin && bytes_consumed == data.size(); |
92 data.remove_prefix(bytes_consumed); | 108 data.remove_prefix(bytes_consumed); |
93 DCHECK(data.empty() || packet_creator_->BytesFree() == 0u); | 109 DCHECK(data.empty() || packet_creator_->BytesFree() == 0u); |
94 | 110 |
95 // TODO(ianswett): Restore packet reordering. | 111 // TODO(ianswett): Restore packet reordering. |
96 if (!InBatchMode() || !packet_creator_->HasRoomForStreamFrame(id, offset)) { | 112 if (!InBatchMode() || !packet_creator_->HasRoomForStreamFrame(id, offset)) { |
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
220 | 236 |
221 if (packet_creator_->ShouldSendFec(false)) { | 237 if (packet_creator_->ShouldSendFec(false)) { |
222 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); | 238 SerializedPacket serialized_fec = packet_creator_->SerializeFec(); |
223 DCHECK(serialized_fec.packet); | 239 DCHECK(serialized_fec.packet); |
224 delegate_->OnSerializedPacket(serialized_fec); | 240 delegate_->OnSerializedPacket(serialized_fec); |
225 packet_creator_->MaybeStartFEC(); | 241 packet_creator_->MaybeStartFEC(); |
226 } | 242 } |
227 } | 243 } |
228 | 244 |
229 } // namespace net | 245 } // namespace net |
OLD | NEW |