Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(103)

Side by Side Diff: net/quic/quic_packet_creator.cc

Issue 266243004: Clang format slam. Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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"
11 #include "net/quic/quic_fec_group.h" 11 #include "net/quic/quic_fec_group.h"
12 #include "net/quic/quic_utils.h" 12 #include "net/quic/quic_utils.h"
13 13
14 using base::StringPiece; 14 using base::StringPiece;
15 using std::make_pair; 15 using std::make_pair;
16 using std::max; 16 using std::max;
17 using std::min; 17 using std::min;
18 using std::pair; 18 using std::pair;
19 using std::vector; 19 using std::vector;
20 20
21 namespace net { 21 namespace net {
22 22
23 // A QuicRandom wrapper that gets a bucket of entropy and distributes it 23 // A QuicRandom wrapper that gets a bucket of entropy and distributes it
24 // bit-by-bit. Replenishes the bucket as needed. Not thread-safe. Expose this 24 // bit-by-bit. Replenishes the bucket as needed. Not thread-safe. Expose this
25 // class if single bit randomness is needed elsewhere. 25 // class if single bit randomness is needed elsewhere.
26 class QuicRandomBoolSource { 26 class QuicRandomBoolSource {
27 public: 27 public:
28 // random: Source of entropy. Not owned. 28 // random: Source of entropy. Not owned.
29 explicit QuicRandomBoolSource(QuicRandom* random) 29 explicit QuicRandomBoolSource(QuicRandom* random)
30 : random_(random), 30 : random_(random), bit_bucket_(0), bit_mask_(0) {}
31 bit_bucket_(0),
32 bit_mask_(0) {}
33 31
34 ~QuicRandomBoolSource() {} 32 ~QuicRandomBoolSource() {}
35 33
36 // Returns the next random bit from the bucket. 34 // Returns the next random bit from the bucket.
37 bool RandBool() { 35 bool RandBool() {
38 if (bit_mask_ == 0) { 36 if (bit_mask_ == 0) {
39 bit_bucket_ = random_->RandUint64(); 37 bit_bucket_ = random_->RandUint64();
40 bit_mask_ = 1; 38 bit_mask_ = 1;
41 } 39 }
42 bool result = ((bit_bucket_ & bit_mask_) != 0); 40 bool result = ((bit_bucket_ & bit_mask_) != 0);
(...skipping 25 matching lines...) Expand all
68 send_version_in_packet_(!is_server), 66 send_version_in_packet_(!is_server),
69 sequence_number_length_(options_.send_sequence_number_length), 67 sequence_number_length_(options_.send_sequence_number_length),
70 packet_size_(0) { 68 packet_size_(0) {
71 framer_->set_fec_builder(this); 69 framer_->set_fec_builder(this);
72 } 70 }
73 71
74 QuicPacketCreator::~QuicPacketCreator() { 72 QuicPacketCreator::~QuicPacketCreator() {
75 } 73 }
76 74
77 void QuicPacketCreator::OnBuiltFecProtectedPayload( 75 void QuicPacketCreator::OnBuiltFecProtectedPayload(
78 const QuicPacketHeader& header, StringPiece payload) { 76 const QuicPacketHeader& header,
77 StringPiece payload) {
79 if (fec_group_.get()) { 78 if (fec_group_.get()) {
80 DCHECK_NE(0u, header.fec_group); 79 DCHECK_NE(0u, header.fec_group);
81 fec_group_->Update(header, payload); 80 fec_group_->Update(header, payload);
82 } 81 }
83 } 82 }
84 83
85 bool QuicPacketCreator::ShouldSendFec(bool force_close) const { 84 bool QuicPacketCreator::ShouldSendFec(bool force_close) const {
86 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 && 85 return fec_group_.get() != NULL && fec_group_->NumReceivedPackets() > 0 &&
87 (force_close || 86 (force_close ||
88 fec_group_->NumReceivedPackets() >= options_.max_packets_per_fec_group); 87 fec_group_->NumReceivedPackets() >=
88 options_.max_packets_per_fec_group);
89 } 89 }
90 90
91 InFecGroup QuicPacketCreator::MaybeStartFEC() { 91 InFecGroup QuicPacketCreator::MaybeStartFEC() {
92 if (IsFecEnabled() && fec_group_.get() == NULL) { 92 if (IsFecEnabled() && fec_group_.get() == NULL) {
93 DCHECK(queued_frames_.empty()); 93 DCHECK(queued_frames_.empty());
94 // 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.
95 fec_group_number_ = sequence_number() + 1; 95 fec_group_number_ = sequence_number() + 1;
96 fec_group_.reset(new QuicFecGroup()); 96 fec_group_.reset(new QuicFecGroup());
97 } 97 }
98 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;
99 } 99 }
100 100
101 // 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.
102 // 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
103 // maximum packet size if we stop sending version before it is serialized. 103 // maximum packet size if we stop sending version before it is serialized.
104 void QuicPacketCreator::StopSendingVersion() { 104 void QuicPacketCreator::StopSendingVersion() {
105 DCHECK(send_version_in_packet_); 105 DCHECK(send_version_in_packet_);
106 send_version_in_packet_ = false; 106 send_version_in_packet_ = false;
107 if (packet_size_ > 0) { 107 if (packet_size_ > 0) {
108 DCHECK_LT(kQuicVersionSize, packet_size_); 108 DCHECK_LT(kQuicVersionSize, packet_size_);
109 packet_size_ -= kQuicVersionSize; 109 packet_size_ -= kQuicVersionSize;
110 } 110 }
111 } 111 }
112 112
113 void QuicPacketCreator::UpdateSequenceNumberLength( 113 void QuicPacketCreator::UpdateSequenceNumberLength(
114 QuicPacketSequenceNumber least_packet_awaited_by_peer, 114 QuicPacketSequenceNumber least_packet_awaited_by_peer,
115 QuicByteCount congestion_window) { 115 QuicByteCount congestion_window) {
116 DCHECK_LE(least_packet_awaited_by_peer, sequence_number_ + 1); 116 DCHECK_LE(least_packet_awaited_by_peer, sequence_number_ + 1);
117 // Since the packet creator will not change sequence number length mid FEC 117 // Since the packet creator will not change sequence number length mid FEC
118 // group, include the size of an FEC group to be safe. 118 // group, include the size of an FEC group to be safe.
119 const QuicPacketSequenceNumber current_delta = 119 const QuicPacketSequenceNumber current_delta =
120 options_.max_packets_per_fec_group + sequence_number_ + 1 120 options_.max_packets_per_fec_group + sequence_number_ + 1 -
121 - least_packet_awaited_by_peer; 121 least_packet_awaited_by_peer;
122 const uint64 congestion_window_packets = 122 const uint64 congestion_window_packets =
123 congestion_window / options_.max_packet_length; 123 congestion_window / options_.max_packet_length;
124 const uint64 delta = max(current_delta, congestion_window_packets); 124 const uint64 delta = max(current_delta, congestion_window_packets);
125 options_.send_sequence_number_length = 125 options_.send_sequence_number_length =
126 QuicFramer::GetMinSequenceNumberLength(delta * 4); 126 QuicFramer::GetMinSequenceNumberLength(delta * 4);
127 } 127 }
128 128
129 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id, 129 bool QuicPacketCreator::HasRoomForStreamFrame(QuicStreamId id,
130 QuicStreamOffset offset) const { 130 QuicStreamOffset offset) const {
131 // 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
132 // 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
133 // QuicPacketCreator. 133 // QuicPacketCreator.
134 return BytesFree() > 134 return BytesFree() >
135 QuicFramer::GetMinStreamFrameSize(framer_->version(), id, offset, true, 135 QuicFramer::GetMinStreamFrameSize(
136 IsFecEnabled()); 136 framer_->version(), id, offset, true, IsFecEnabled());
137 } 137 }
138 138
139 // static 139 // static
140 size_t QuicPacketCreator::StreamFramePacketOverhead( 140 size_t QuicPacketCreator::StreamFramePacketOverhead(
141 QuicVersion version, 141 QuicVersion version,
142 QuicConnectionIdLength connection_id_length, 142 QuicConnectionIdLength connection_id_length,
143 bool include_version, 143 bool include_version,
144 QuicSequenceNumberLength sequence_number_length, 144 QuicSequenceNumberLength sequence_number_length,
145 InFecGroup is_in_fec_group) { 145 InFecGroup is_in_fec_group) {
146 return GetPacketHeaderSize(connection_id_length, include_version, 146 return GetPacketHeaderSize(connection_id_length,
147 sequence_number_length, is_in_fec_group) + 147 include_version,
148 // Assumes this is a stream with a single lone packet. 148 sequence_number_length,
149 QuicFramer::GetMinStreamFrameSize(version, 1u, 0u, true, is_in_fec_group); 149 is_in_fec_group) +
150 // Assumes this is a stream with a single lone packet.
151 QuicFramer::GetMinStreamFrameSize(
152 version, 1u, 0u, true, is_in_fec_group);
150 } 153 }
151 154
152 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id, 155 size_t QuicPacketCreator::CreateStreamFrame(QuicStreamId id,
153 const IOVector& data, 156 const IOVector& data,
154 QuicStreamOffset offset, 157 QuicStreamOffset offset,
155 bool fin, 158 bool fin,
156 QuicFrame* frame) { 159 QuicFrame* frame) {
157 DCHECK_GT(options_.max_packet_length, 160 DCHECK_GT(options_.max_packet_length,
158 StreamFramePacketOverhead( 161 StreamFramePacketOverhead(framer_->version(),
159 framer_->version(), PACKET_8BYTE_CONNECTION_ID, kIncludeVersion, 162 PACKET_8BYTE_CONNECTION_ID,
160 PACKET_6BYTE_SEQUENCE_NUMBER, IN_FEC_GROUP)); 163 kIncludeVersion,
164 PACKET_6BYTE_SEQUENCE_NUMBER,
165 IN_FEC_GROUP));
161 InFecGroup is_in_fec_group = MaybeStartFEC(); 166 InFecGroup is_in_fec_group = MaybeStartFEC();
162 167
163 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset)) 168 LOG_IF(DFATAL, !HasRoomForStreamFrame(id, offset))
164 << "No room for Stream frame, BytesFree: " << BytesFree() 169 << "No room for Stream frame, BytesFree: " << BytesFree()
165 << " MinStreamFrameSize: " 170 << " MinStreamFrameSize: "
166 << QuicFramer::GetMinStreamFrameSize( 171 << QuicFramer::GetMinStreamFrameSize(
167 framer_->version(), id, offset, true, is_in_fec_group); 172 framer_->version(), id, offset, true, is_in_fec_group);
168 173
169 if (data.Empty()) { 174 if (data.Empty()) {
170 LOG_IF(DFATAL, !fin) 175 LOG_IF(DFATAL, !fin) << "Creating a stream frame with no data or fin.";
171 << "Creating a stream frame with no data or fin.";
172 // Create a new packet for the fin, if necessary. 176 // Create a new packet for the fin, if necessary.
173 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, data)); 177 *frame = QuicFrame(new QuicStreamFrame(id, true, offset, data));
174 return 0; 178 return 0;
175 } 179 }
176 180
177 const size_t data_size = data.TotalBufferSize(); 181 const size_t data_size = data.TotalBufferSize();
178 size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( 182 size_t min_frame_size =
179 framer_->version(), id, offset, /*last_frame_in_packet=*/ true, 183 QuicFramer::GetMinStreamFrameSize(framer_->version(),
180 is_in_fec_group); 184 id,
185 offset,
186 /*last_frame_in_packet=*/true,
187 is_in_fec_group);
181 size_t bytes_consumed = min<size_t>(BytesFree() - min_frame_size, data_size); 188 size_t bytes_consumed = min<size_t>(BytesFree() - min_frame_size, data_size);
182 189
183 bool set_fin = fin && bytes_consumed == data_size; // Last frame. 190 bool set_fin = fin && bytes_consumed == data_size; // Last frame.
184 IOVector frame_data; 191 IOVector frame_data;
185 frame_data.AppendIovecAtMostBytes(data.iovec(), data.Size(), 192 frame_data.AppendIovecAtMostBytes(data.iovec(), data.Size(), bytes_consumed);
186 bytes_consumed);
187 DCHECK_EQ(frame_data.TotalBufferSize(), bytes_consumed); 193 DCHECK_EQ(frame_data.TotalBufferSize(), bytes_consumed);
188 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, frame_data)); 194 *frame = QuicFrame(new QuicStreamFrame(id, set_fin, offset, frame_data));
189 return bytes_consumed; 195 return bytes_consumed;
190 } 196 }
191 197
192 size_t QuicPacketCreator::CreateStreamFrameWithNotifier( 198 size_t QuicPacketCreator::CreateStreamFrameWithNotifier(
193 QuicStreamId id, 199 QuicStreamId id,
194 const IOVector& data, 200 const IOVector& data,
195 QuicStreamOffset offset, 201 QuicStreamOffset offset,
196 bool fin, 202 bool fin,
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 237
232 return serialized_packet; 238 return serialized_packet;
233 } 239 }
234 240
235 SerializedPacket QuicPacketCreator::SerializeAllFrames( 241 SerializedPacket QuicPacketCreator::SerializeAllFrames(
236 const QuicFrames& frames) { 242 const QuicFrames& frames) {
237 // TODO(satyamshekhar): Verify that this DCHECK won't fail. What about queued 243 // TODO(satyamshekhar): Verify that this DCHECK won't fail. What about queued
238 // frames from SendStreamData()[send_stream_should_flush_ == false && 244 // frames from SendStreamData()[send_stream_should_flush_ == false &&
239 // data.empty() == true] and retransmit due to RTO. 245 // data.empty() == true] and retransmit due to RTO.
240 DCHECK_EQ(0u, queued_frames_.size()); 246 DCHECK_EQ(0u, queued_frames_.size());
241 LOG_IF(DFATAL, frames.empty()) 247 LOG_IF(DFATAL, frames.empty()) << "Attempt to serialize empty packet";
242 << "Attempt to serialize empty packet";
243 for (size_t i = 0; i < frames.size(); ++i) { 248 for (size_t i = 0; i < frames.size(); ++i) {
244 bool success = AddFrame(frames[i], false); 249 bool success = AddFrame(frames[i], false);
245 DCHECK(success); 250 DCHECK(success);
246 } 251 }
247 SerializedPacket packet = SerializePacket(); 252 SerializedPacket packet = SerializePacket();
248 DCHECK(packet.retransmittable_frames == NULL); 253 DCHECK(packet.retransmittable_frames == NULL);
249 return packet; 254 return packet;
250 } 255 }
251 256
252 bool QuicPacketCreator::HasPendingFrames() { 257 bool QuicPacketCreator::HasPendingFrames() {
253 return !queued_frames_.empty(); 258 return !queued_frames_.empty();
254 } 259 }
255 260
256 size_t QuicPacketCreator::ExpansionOnNewFrame() const { 261 size_t QuicPacketCreator::ExpansionOnNewFrame() const {
257 // If packet is FEC protected, there's no expansion. 262 // If packet is FEC protected, there's no expansion.
258 if (fec_group_.get() != NULL) { 263 if (fec_group_.get() != NULL) {
259 return 0; 264 return 0;
260 } 265 }
261 // If the last frame in the packet is a stream frame, then it will expand to 266 // If the last frame in the packet is a stream frame, then it will expand to
262 // include the stream_length field when a new frame is added. 267 // include the stream_length field when a new frame is added.
263 bool has_trailing_stream_frame = 268 bool has_trailing_stream_frame =
264 !queued_frames_.empty() && queued_frames_.back().type == STREAM_FRAME; 269 !queued_frames_.empty() && queued_frames_.back().type == STREAM_FRAME;
265 return has_trailing_stream_frame ? kQuicStreamPayloadLengthSize : 0; 270 return has_trailing_stream_frame ? kQuicStreamPayloadLengthSize : 0;
266 } 271 }
267 272
268 size_t QuicPacketCreator::BytesFree() const { 273 size_t QuicPacketCreator::BytesFree() const {
269 const size_t max_plaintext_size = 274 const size_t max_plaintext_size =
270 framer_->GetMaxPlaintextSize(options_.max_packet_length); 275 framer_->GetMaxPlaintextSize(options_.max_packet_length);
271 DCHECK_GE(max_plaintext_size, PacketSize()); 276 DCHECK_GE(max_plaintext_size, PacketSize());
272 return max_plaintext_size - min(max_plaintext_size, PacketSize() 277 return max_plaintext_size -
273 + ExpansionOnNewFrame()); 278 min(max_plaintext_size, PacketSize() + ExpansionOnNewFrame());
274 } 279 }
275 280
276 InFecGroup QuicPacketCreator::IsFecEnabled() const { 281 InFecGroup QuicPacketCreator::IsFecEnabled() const {
277 return (options_.max_packets_per_fec_group == 0) ? 282 return (options_.max_packets_per_fec_group == 0) ? NOT_IN_FEC_GROUP
278 NOT_IN_FEC_GROUP : IN_FEC_GROUP; 283 : IN_FEC_GROUP;
279 } 284 }
280 285
281 size_t QuicPacketCreator::PacketSize() const { 286 size_t QuicPacketCreator::PacketSize() const {
282 if (queued_frames_.empty()) { 287 if (queued_frames_.empty()) {
283 // Only adjust the sequence number length when the FEC group is not open, 288 // Only adjust the sequence number length when the FEC group is not open,
284 // to ensure no packets in a group are too large. 289 // to ensure no packets in a group are too large.
285 if (fec_group_.get() == NULL || 290 if (fec_group_.get() == NULL || fec_group_->NumReceivedPackets() == 0) {
286 fec_group_->NumReceivedPackets() == 0) {
287 sequence_number_length_ = options_.send_sequence_number_length; 291 sequence_number_length_ = options_.send_sequence_number_length;
288 } 292 }
289 packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length, 293 packet_size_ = GetPacketHeaderSize(options_.send_connection_id_length,
290 send_version_in_packet_, 294 send_version_in_packet_,
291 sequence_number_length_, 295 sequence_number_length_,
292 IsFecEnabled()); 296 IsFecEnabled());
293 } 297 }
294 return packet_size_; 298 return packet_size_;
295 } 299 }
296 300
297 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) { 301 bool QuicPacketCreator::AddSavedFrame(const QuicFrame& frame) {
298 return AddFrame(frame, true); 302 return AddFrame(frame, true);
299 } 303 }
300 304
301 SerializedPacket QuicPacketCreator::SerializePacket() { 305 SerializedPacket QuicPacketCreator::SerializePacket() {
302 LOG_IF(DFATAL, queued_frames_.empty()) 306 LOG_IF(DFATAL, queued_frames_.empty()) << "Attempt to serialize empty packet";
303 << "Attempt to serialize empty packet";
304 QuicPacketHeader header; 307 QuicPacketHeader header;
305 FillPacketHeader(fec_group_number_, false, &header); 308 FillPacketHeader(fec_group_number_, false, &header);
306 309
307 MaybeAddPadding(); 310 MaybeAddPadding();
308 311
309 size_t max_plaintext_size = 312 size_t max_plaintext_size =
310 framer_->GetMaxPlaintextSize(options_.max_packet_length); 313 framer_->GetMaxPlaintextSize(options_.max_packet_length);
311 DCHECK_GE(max_plaintext_size, packet_size_); 314 DCHECK_GE(max_plaintext_size, packet_size_);
312 // ACK and CONNECTION_CLOSE Frames will be truncated only if they're 315 // ACK and CONNECTION_CLOSE Frames will be truncated only if they're
313 // the first frame in the packet. If truncation is to occur, then 316 // the first frame in the packet. If truncation is to occur, then
314 // GetSerializedFrameLength will have returned all bytes free. 317 // GetSerializedFrameLength will have returned all bytes free.
315 bool possibly_truncated = 318 bool possibly_truncated =
316 packet_size_ != max_plaintext_size || 319 packet_size_ != max_plaintext_size || queued_frames_.size() != 1 ||
317 queued_frames_.size() != 1 ||
318 (queued_frames_.back().type == ACK_FRAME || 320 (queued_frames_.back().type == ACK_FRAME ||
319 queued_frames_.back().type == CONNECTION_CLOSE_FRAME); 321 queued_frames_.back().type == CONNECTION_CLOSE_FRAME);
320 SerializedPacket serialized = 322 SerializedPacket serialized =
321 framer_->BuildDataPacket(header, queued_frames_, packet_size_); 323 framer_->BuildDataPacket(header, queued_frames_, packet_size_);
322 LOG_IF(DFATAL, !serialized.packet) 324 LOG_IF(DFATAL, !serialized.packet) << "Failed to serialize "
323 << "Failed to serialize " << queued_frames_.size() << " frames."; 325 << queued_frames_.size() << " frames.";
324 // Because of possible truncation, we can't be confident that our 326 // Because of possible truncation, we can't be confident that our
325 // packet size calculation worked correctly. 327 // packet size calculation worked correctly.
326 if (!possibly_truncated) 328 if (!possibly_truncated)
327 DCHECK_EQ(packet_size_, serialized.packet->length()); 329 DCHECK_EQ(packet_size_, serialized.packet->length());
328 330
329 packet_size_ = 0; 331 packet_size_ = 0;
330 queued_frames_.clear(); 332 queued_frames_.clear();
331 serialized.retransmittable_frames = queued_retransmittable_frames_.release(); 333 serialized.retransmittable_frames = queued_retransmittable_frames_.release();
332 return serialized; 334 return serialized;
333 } 335 }
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
400 return false; 402 return false;
401 default: 403 default:
402 return true; 404 return true;
403 } 405 }
404 } 406 }
405 407
406 bool QuicPacketCreator::AddFrame(const QuicFrame& frame, 408 bool QuicPacketCreator::AddFrame(const QuicFrame& frame,
407 bool save_retransmittable_frames) { 409 bool save_retransmittable_frames) {
408 DVLOG(1) << "Adding frame: " << frame; 410 DVLOG(1) << "Adding frame: " << frame;
409 InFecGroup is_in_fec_group = MaybeStartFEC(); 411 InFecGroup is_in_fec_group = MaybeStartFEC();
410 size_t frame_len = framer_->GetSerializedFrameLength( 412 size_t frame_len =
411 frame, BytesFree(), queued_frames_.empty(), true, is_in_fec_group, 413 framer_->GetSerializedFrameLength(frame,
412 options()->send_sequence_number_length); 414 BytesFree(),
415 queued_frames_.empty(),
416 true,
417 is_in_fec_group,
418 options()->send_sequence_number_length);
413 if (frame_len == 0) { 419 if (frame_len == 0) {
414 return false; 420 return false;
415 } 421 }
416 DCHECK_LT(0u, packet_size_); 422 DCHECK_LT(0u, packet_size_);
417 packet_size_ += ExpansionOnNewFrame() + frame_len; 423 packet_size_ += ExpansionOnNewFrame() + frame_len;
418 424
419 if (save_retransmittable_frames && ShouldRetransmit(frame)) { 425 if (save_retransmittable_frames && ShouldRetransmit(frame)) {
420 if (queued_retransmittable_frames_.get() == NULL) { 426 if (queued_retransmittable_frames_.get() == NULL) {
421 queued_retransmittable_frames_.reset(new RetransmittableFrames()); 427 queued_retransmittable_frames_.reset(new RetransmittableFrames());
422 } 428 }
(...skipping 29 matching lines...) Expand all
452 if (!is_handshake) { 458 if (!is_handshake) {
453 return; 459 return;
454 } 460 }
455 461
456 QuicPaddingFrame padding; 462 QuicPaddingFrame padding;
457 bool success = AddFrame(QuicFrame(&padding), false); 463 bool success = AddFrame(QuicFrame(&padding), false);
458 DCHECK(success); 464 DCHECK(success);
459 } 465 }
460 466
461 } // namespace net 467 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698