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/logging.h" | 7 #include "base/logging.h" |
8 #include "net/quic/crypto/quic_random.h" | 8 #include "net/quic/crypto/quic_random.h" |
| 9 #include "net/quic/quic_ack_notifier.h" |
9 #include "net/quic/quic_fec_group.h" | 10 #include "net/quic/quic_fec_group.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 using std::make_pair; | 14 using std::make_pair; |
14 using std::min; | 15 using std::min; |
15 using std::pair; | 16 using std::pair; |
16 using std::vector; | 17 using std::vector; |
17 | 18 |
18 namespace net { | 19 namespace net { |
19 | 20 |
20 QuicPacketCreator::QuicPacketCreator(QuicGuid guid, | 21 QuicPacketCreator::QuicPacketCreator(QuicGuid guid, |
21 QuicFramer* framer, | 22 QuicFramer* framer, |
22 QuicRandom* random_generator, | 23 QuicRandom* random_generator, |
23 bool is_server) | 24 bool is_server) |
24 : guid_(guid), | 25 : guid_(guid), |
25 framer_(framer), | 26 framer_(framer), |
26 random_generator_(random_generator), | 27 random_generator_(random_generator), |
27 sequence_number_(0), | 28 sequence_number_(0), |
28 fec_group_number_(0), | 29 fec_group_number_(0), |
29 is_server_(is_server), | 30 is_server_(is_server), |
30 send_version_in_packet_(!is_server), | 31 send_version_in_packet_(!is_server), |
31 sequence_number_length_(options_.send_sequence_number_length), | 32 sequence_number_length_(options_.send_sequence_number_length), |
32 packet_size_(0) { | 33 packet_size_(0) { |
33 framer_->set_fec_builder(this); | 34 framer_->set_fec_builder(reinterpret_cast<QuicFecBuilderInterface*>(this)); |
34 } | 35 } |
35 | 36 |
36 QuicPacketCreator::~QuicPacketCreator() { | 37 QuicPacketCreator::~QuicPacketCreator() { |
37 } | 38 } |
38 | 39 |
39 void QuicPacketCreator::OnBuiltFecProtectedPayload( | 40 void QuicPacketCreator::OnBuiltFecProtectedPayload( |
40 const QuicPacketHeader& header, StringPiece payload) { | 41 const QuicPacketHeader& header, StringPiece payload) { |
41 if (fec_group_.get()) { | 42 if (fec_group_.get()) { |
42 fec_group_->Update(header, payload); | 43 fec_group_->Update(header, payload); |
43 } | 44 } |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
131 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, data_frame)); | 132 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, data_frame)); |
132 } else { | 133 } else { |
133 DCHECK(fin); | 134 DCHECK(fin); |
134 // Create a new packet for the fin, if necessary. | 135 // Create a new packet for the fin, if necessary. |
135 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, "")); | 136 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, "")); |
136 } | 137 } |
137 | 138 |
138 return bytes_consumed; | 139 return bytes_consumed; |
139 } | 140 } |
140 | 141 |
| 142 size_t QuicPacketCreator::CreateStreamFrameWithNotifier( |
| 143 QuicStreamId id, |
| 144 StringPiece data, |
| 145 QuicStreamOffset offset, |
| 146 bool fin, |
| 147 QuicAckNotifier* notifier, |
| 148 QuicFrame* frame) { |
| 149 size_t bytes_consumed = CreateStreamFrame(id, data, offset, fin, frame); |
| 150 |
| 151 // The frame keeps track of the QuicAckNotifier until it is serialized into |
| 152 // a packet. At that point the notifier is informed of the sequence number |
| 153 // of the packet that this frame was eventually sent in. |
| 154 frame->stream_frame->notifier = notifier; |
| 155 |
| 156 return bytes_consumed; |
| 157 } |
| 158 |
141 SerializedPacket QuicPacketCreator::ReserializeAllFrames( | 159 SerializedPacket QuicPacketCreator::ReserializeAllFrames( |
142 const QuicFrames& frames, | 160 const QuicFrames& frames, |
143 QuicSequenceNumberLength original_length) { | 161 QuicSequenceNumberLength original_length) { |
144 // Temporarily set the sequence number length and disable FEC. | 162 // Temporarily set the sequence number length and disable FEC. |
145 const QuicSequenceNumberLength start_length = sequence_number_length_; | 163 const QuicSequenceNumberLength start_length = sequence_number_length_; |
146 const QuicSequenceNumberLength start_options_length = | 164 const QuicSequenceNumberLength start_options_length = |
147 options_.send_sequence_number_length; | 165 options_.send_sequence_number_length; |
148 const QuicFecGroupNumber start_fec_group = fec_group_number_; | 166 const QuicFecGroupNumber start_fec_group = fec_group_number_; |
149 sequence_number_length_ = original_length; | 167 sequence_number_length_ = original_length; |
150 options_.send_sequence_number_length = original_length; | 168 options_.send_sequence_number_length = original_length; |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 return AddFrame(frame, true); | 226 return AddFrame(frame, true); |
209 } | 227 } |
210 | 228 |
211 SerializedPacket QuicPacketCreator::SerializePacket() { | 229 SerializedPacket QuicPacketCreator::SerializePacket() { |
212 if (queued_frames_.empty()) { | 230 if (queued_frames_.empty()) { |
213 LOG(DFATAL) << "Attempt to serialize empty packet"; | 231 LOG(DFATAL) << "Attempt to serialize empty packet"; |
214 } | 232 } |
215 QuicPacketHeader header; | 233 QuicPacketHeader header; |
216 FillPacketHeader(fec_group_number_, false, false, &header); | 234 FillPacketHeader(fec_group_number_, false, false, &header); |
217 | 235 |
218 SerializedPacket serialized = framer_->BuildDataPacket( | 236 SerializedPacket serialized = |
219 header, queued_frames_, PacketSize()); | 237 framer_->BuildDataPacket(header, queued_frames_, packet_size_); |
| 238 |
| 239 // Run through all the included frames and if any of them have an AckNotifier |
| 240 // registered, then inform the AckNotifier that it should be interested in |
| 241 // this packet's sequence number. |
| 242 for (QuicFrames::iterator it = queued_frames_.begin(); |
| 243 it != queued_frames_.end(); ++it) { |
| 244 if (it->type == STREAM_FRAME && it->stream_frame->notifier != NULL) { |
| 245 it->stream_frame->notifier->AddSequenceNumber(serialized.sequence_number); |
| 246 } |
| 247 } |
| 248 |
220 packet_size_ = 0; | 249 packet_size_ = 0; |
221 queued_frames_.clear(); | 250 queued_frames_.clear(); |
222 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); | 251 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); |
223 return serialized; | 252 return serialized; |
224 } | 253 } |
225 | 254 |
226 SerializedPacket QuicPacketCreator::SerializeFec() { | 255 SerializedPacket QuicPacketCreator::SerializeFec() { |
227 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); | 256 DCHECK_LT(0u, fec_group_->NumReceivedPackets()); |
228 DCHECK_EQ(0u, queued_frames_.size()); | 257 DCHECK_EQ(0u, queued_frames_.size()); |
229 QuicPacketHeader header; | 258 QuicPacketHeader header; |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
318 queued_frames_.push_back( | 347 queued_frames_.push_back( |
319 queued_retransmittable_frames_->AddNonStreamFrame(frame)); | 348 queued_retransmittable_frames_->AddNonStreamFrame(frame)); |
320 } | 349 } |
321 } else { | 350 } else { |
322 queued_frames_.push_back(frame); | 351 queued_frames_.push_back(frame); |
323 } | 352 } |
324 return true; | 353 return true; |
325 } | 354 } |
326 | 355 |
327 } // namespace net | 356 } // namespace net |
OLD | NEW |