| 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 |