| 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/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_data_writer.h" |
| 11 #include "net/quic/quic_fec_group.h" | 12 #include "net/quic/quic_fec_group.h" |
| 12 #include "net/quic/quic_utils.h" | 13 #include "net/quic/quic_utils.h" |
| 13 | 14 |
| 14 using base::StringPiece; | 15 using base::StringPiece; |
| 15 using std::make_pair; | 16 using std::make_pair; |
| 16 using std::max; | 17 using std::max; |
| 17 using std::min; | 18 using std::min; |
| 18 using std::pair; | 19 using std::pair; |
| 19 using std::vector; | 20 using std::vector; |
| 20 | 21 |
| (...skipping 269 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 | 291 |
| 291 // TODO(ianswett): Remove this method, because it's test only. | 292 // TODO(ianswett): Remove this method, because it's test only. |
| 292 SerializedPacket QuicPacketCreator::SerializeAllFrames( | 293 SerializedPacket QuicPacketCreator::SerializeAllFrames( |
| 293 const QuicFrames& frames) { | 294 const QuicFrames& frames) { |
| 294 // TODO(satyamshekhar): Verify that this DCHECK won't fail. What about queued | 295 // TODO(satyamshekhar): Verify that this DCHECK won't fail. What about queued |
| 295 // frames from SendStreamData()[send_stream_should_flush_ == false && | 296 // frames from SendStreamData()[send_stream_should_flush_ == false && |
| 296 // data.empty() == true] and retransmit due to RTO. | 297 // data.empty() == true] and retransmit due to RTO. |
| 297 DCHECK_EQ(0u, queued_frames_.size()); | 298 DCHECK_EQ(0u, queued_frames_.size()); |
| 298 LOG_IF(DFATAL, frames.empty()) | 299 LOG_IF(DFATAL, frames.empty()) |
| 299 << "Attempt to serialize empty packet"; | 300 << "Attempt to serialize empty packet"; |
| 300 for (size_t i = 0; i < frames.size(); ++i) { | 301 for (const QuicFrame& frame : frames) { |
| 301 bool success = AddFrame(frames[i], false); | 302 bool success = AddFrame(frame, false); |
| 302 DCHECK(success); | 303 DCHECK(success); |
| 303 } | 304 } |
| 304 SerializedPacket packet = SerializePacket(); | 305 SerializedPacket packet = SerializePacket(); |
| 305 DCHECK(packet.retransmittable_frames == nullptr); | 306 DCHECK(packet.retransmittable_frames == nullptr); |
| 306 return packet; | 307 return packet; |
| 307 } | 308 } |
| 308 | 309 |
| 309 bool QuicPacketCreator::HasPendingFrames() const { | 310 bool QuicPacketCreator::HasPendingFrames() const { |
| 310 return !queued_frames_.empty(); | 311 return !queued_frames_.empty(); |
| 311 } | 312 } |
| (...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 365 size_t max_plaintext_size = | 366 size_t max_plaintext_size = |
| 366 framer_->GetMaxPlaintextSize(max_packet_length_); | 367 framer_->GetMaxPlaintextSize(max_packet_length_); |
| 367 DCHECK_GE(max_plaintext_size, packet_size_); | 368 DCHECK_GE(max_plaintext_size, packet_size_); |
| 368 // ACK Frames will be truncated due to length only if they're the only frame | 369 // ACK Frames will be truncated due to length only if they're the only frame |
| 369 // in the packet, and if packet_size_ was set to max_plaintext_size. If | 370 // in the packet, and if packet_size_ was set to max_plaintext_size. If |
| 370 // truncation due to length occurred, then GetSerializedFrameLength will have | 371 // truncation due to length occurred, then GetSerializedFrameLength will have |
| 371 // returned all bytes free. | 372 // returned all bytes free. |
| 372 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size && | 373 bool possibly_truncated_by_length = packet_size_ == max_plaintext_size && |
| 373 queued_frames_.size() == 1 && | 374 queued_frames_.size() == 1 && |
| 374 queued_frames_.back().type == ACK_FRAME; | 375 queued_frames_.back().type == ACK_FRAME; |
| 375 scoped_ptr<QuicPacket> packet( | 376 char buffer[kMaxPacketSize]; |
| 376 framer_->BuildDataPacket(header, queued_frames_, packet_size_)); | 377 scoped_ptr<QuicPacket> packet; |
| 378 // Use the packet_size_ instead of the buffer size to ensure smaller |
| 379 // packet sizes are properly used. |
| 380 scoped_ptr<char[]> large_buffer; |
| 381 if (packet_size_ <= kMaxPacketSize) { |
| 382 packet.reset( |
| 383 framer_->BuildDataPacket(header, queued_frames_, buffer, packet_size_)); |
| 384 } else { |
| 385 large_buffer.reset(new char[packet_size_]); |
| 386 packet.reset(framer_->BuildDataPacket(header, queued_frames_, |
| 387 large_buffer.get(), packet_size_)); |
| 388 } |
| 377 LOG_IF(DFATAL, packet == nullptr) << "Failed to serialize " | 389 LOG_IF(DFATAL, packet == nullptr) << "Failed to serialize " |
| 378 << queued_frames_.size() << " frames."; | 390 << queued_frames_.size() << " frames."; |
| 379 // Because of possible truncation, we can't be confident that our | 391 // Because of possible truncation, we can't be confident that our |
| 380 // packet size calculation worked correctly. | 392 // packet size calculation worked correctly. |
| 381 if (!possibly_truncated_by_length) { | 393 if (!possibly_truncated_by_length) { |
| 382 DCHECK_EQ(packet_size_, packet->length()); | 394 DCHECK_EQ(packet_size_, packet->length()); |
| 383 } | 395 } |
| 384 // Immediately encrypt the packet, to ensure we don't encrypt the same packet | 396 // Immediately encrypt the packet, to ensure we don't encrypt the same packet |
| 385 // sequence number multiple times. | 397 // sequence number multiple times. |
| 386 QuicEncryptedPacket* encrypted = | 398 QuicEncryptedPacket* encrypted = |
| (...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 542 if (!is_handshake) { | 554 if (!is_handshake) { |
| 543 return; | 555 return; |
| 544 } | 556 } |
| 545 | 557 |
| 546 QuicPaddingFrame padding; | 558 QuicPaddingFrame padding; |
| 547 bool success = AddFrame(QuicFrame(&padding), false); | 559 bool success = AddFrame(QuicFrame(&padding), false); |
| 548 DCHECK(success); | 560 DCHECK(success); |
| 549 } | 561 } |
| 550 | 562 |
| 551 } // namespace net | 563 } // namespace net |
| OLD | NEW |