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/core/quic_packet_creator.h" | 5 #include "net/quic/core/quic_packet_creator.h" |
6 | 6 |
7 #include <algorithm> | 7 #include <algorithm> |
8 | 8 |
9 #include "base/logging.h" | 9 #include "base/logging.h" |
10 #include "base/macros.h" | 10 #include "base/macros.h" |
(...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
386 packet_.listeners.clear(); | 386 packet_.listeners.clear(); |
387 } | 387 } |
388 | 388 |
389 void QuicPacketCreator::CreateAndSerializeStreamFrame( | 389 void QuicPacketCreator::CreateAndSerializeStreamFrame( |
390 QuicStreamId id, | 390 QuicStreamId id, |
391 const QuicIOVector& iov, | 391 const QuicIOVector& iov, |
392 QuicStreamOffset iov_offset, | 392 QuicStreamOffset iov_offset, |
393 QuicStreamOffset stream_offset, | 393 QuicStreamOffset stream_offset, |
394 bool fin, | 394 bool fin, |
395 QuicAckListenerInterface* listener, | 395 QuicAckListenerInterface* listener, |
396 char* encrypted_buffer, | |
397 size_t encrypted_buffer_len, | |
398 size_t* num_bytes_consumed) { | 396 size_t* num_bytes_consumed) { |
399 DCHECK(queued_frames_.empty()); | 397 DCHECK(queued_frames_.empty()); |
400 // Write out the packet header | 398 // Write out the packet header |
401 QuicPacketHeader header; | 399 QuicPacketHeader header; |
402 FillPacketHeader(&header); | 400 FillPacketHeader(&header); |
403 QuicDataWriter writer(kMaxPacketSize, encrypted_buffer); | 401 ALIGNAS(64) char encrypted_buffer[kMaxPacketSize]; |
| 402 QuicDataWriter writer(arraysize(encrypted_buffer), encrypted_buffer); |
404 if (!framer_->AppendPacketHeader(header, &writer)) { | 403 if (!framer_->AppendPacketHeader(header, &writer)) { |
405 QUIC_BUG << "AppendPacketHeader failed"; | 404 QUIC_BUG << "AppendPacketHeader failed"; |
406 return; | 405 return; |
407 } | 406 } |
408 | 407 |
409 // Create a Stream frame with the remaining space. | 408 // Create a Stream frame with the remaining space. |
410 QUIC_BUG_IF(iov_offset == iov.total_length && !fin) | 409 QUIC_BUG_IF(iov_offset == iov.total_length && !fin) |
411 << "Creating a stream frame with no data or fin."; | 410 << "Creating a stream frame with no data or fin."; |
412 const size_t remaining_data_size = iov.total_length - iov_offset; | 411 const size_t remaining_data_size = iov.total_length - iov_offset; |
413 const size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( | 412 const size_t min_frame_size = QuicFramer::GetMinStreamFrameSize( |
(...skipping 20 matching lines...) Expand all Loading... |
434 } | 433 } |
435 if (!framer_->AppendStreamFrame(*frame, /* no stream frame length */ true, | 434 if (!framer_->AppendStreamFrame(*frame, /* no stream frame length */ true, |
436 &writer)) { | 435 &writer)) { |
437 QUIC_BUG << "AppendStreamFrame failed"; | 436 QUIC_BUG << "AppendStreamFrame failed"; |
438 return; | 437 return; |
439 } | 438 } |
440 | 439 |
441 size_t encrypted_length = framer_->EncryptInPlace( | 440 size_t encrypted_length = framer_->EncryptInPlace( |
442 packet_.encryption_level, packet_.path_id, packet_.packet_number, | 441 packet_.encryption_level, packet_.path_id, packet_.packet_number, |
443 GetStartOfEncryptedData(framer_->version(), header), writer.length(), | 442 GetStartOfEncryptedData(framer_->version(), header), writer.length(), |
444 encrypted_buffer_len, encrypted_buffer); | 443 arraysize(encrypted_buffer), encrypted_buffer); |
445 if (encrypted_length == 0) { | 444 if (encrypted_length == 0) { |
446 QUIC_BUG << "Failed to encrypt packet number " << header.packet_number; | 445 QUIC_BUG << "Failed to encrypt packet number " << header.packet_number; |
447 return; | 446 return; |
448 } | 447 } |
449 // TODO(ianswett): Optimize the storage so RetransmitableFrames can be | 448 // TODO(ianswett): Optimize the storage so RetransmitableFrames can be |
450 // unioned with a QuicStreamFrame and a UniqueStreamBuffer. | 449 // unioned with a QuicStreamFrame and a UniqueStreamBuffer. |
451 *num_bytes_consumed = bytes_consumed; | 450 *num_bytes_consumed = bytes_consumed; |
452 packet_size_ = 0; | 451 packet_size_ = 0; |
453 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header); | 452 packet_.entropy_hash = QuicFramer::GetPacketEntropyHash(header); |
454 packet_.encrypted_buffer = encrypted_buffer; | 453 packet_.encrypted_buffer = encrypted_buffer; |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
605 case MTU_DISCOVERY_FRAME: | 604 case MTU_DISCOVERY_FRAME: |
606 return false; | 605 return false; |
607 default: | 606 default: |
608 return true; | 607 return true; |
609 } | 608 } |
610 } | 609 } |
611 | 610 |
612 bool QuicPacketCreator::AddFrame(const QuicFrame& frame, | 611 bool QuicPacketCreator::AddFrame(const QuicFrame& frame, |
613 bool save_retransmittable_frames) { | 612 bool save_retransmittable_frames) { |
614 DVLOG(1) << "Adding frame: " << frame; | 613 DVLOG(1) << "Adding frame: " << frame; |
615 if (FLAGS_quic_never_write_unencrypted_data && frame.type == STREAM_FRAME && | 614 if (frame.type == STREAM_FRAME && |
616 frame.stream_frame->stream_id != kCryptoStreamId && | 615 frame.stream_frame->stream_id != kCryptoStreamId && |
617 packet_.encryption_level == ENCRYPTION_NONE) { | 616 packet_.encryption_level == ENCRYPTION_NONE) { |
618 const string error_details = "Cannot send stream data without encryption."; | 617 const string error_details = "Cannot send stream data without encryption."; |
619 QUIC_BUG << error_details; | 618 QUIC_BUG << error_details; |
620 delegate_->OnUnrecoverableError( | 619 delegate_->OnUnrecoverableError( |
621 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details, | 620 QUIC_ATTEMPT_TO_SEND_UNENCRYPTED_STREAM_DATA, error_details, |
622 ConnectionCloseSource::FROM_SELF); | 621 ConnectionCloseSource::FROM_SELF); |
623 return false; | 622 return false; |
624 } | 623 } |
625 if (!FLAGS_quic_simple_packet_number_length_2) { | 624 if (!FLAGS_quic_simple_packet_number_length_2) { |
(...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
719 if (bit_mask_ == 0) { | 718 if (bit_mask_ == 0) { |
720 bit_bucket_ = random_->RandUint64(); | 719 bit_bucket_ = random_->RandUint64(); |
721 bit_mask_ = 1; | 720 bit_mask_ = 1; |
722 } | 721 } |
723 bool result = ((bit_bucket_ & bit_mask_) != 0); | 722 bool result = ((bit_bucket_ & bit_mask_) != 0); |
724 bit_mask_ <<= 1; | 723 bit_mask_ <<= 1; |
725 return result; | 724 return result; |
726 } | 725 } |
727 | 726 |
728 } // namespace net | 727 } // namespace net |
OLD | NEW |