| 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 <algorithm> | 7 #include <algorithm> |
| 8 | 8 |
| 9 #include "base/basictypes.h" | 9 #include "base/basictypes.h" |
| 10 #include "base/logging.h" | 10 #include "base/logging.h" |
| (...skipping 435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 446 void QuicPacketCreator::Flush() { | 446 void QuicPacketCreator::Flush() { |
| 447 if (!HasPendingFrames()) { | 447 if (!HasPendingFrames()) { |
| 448 return; | 448 return; |
| 449 } | 449 } |
| 450 | 450 |
| 451 // TODO(rtenneti): Change the default 64 alignas value (used the default | 451 // TODO(rtenneti): Change the default 64 alignas value (used the default |
| 452 // value from CACHELINE_SIZE). | 452 // value from CACHELINE_SIZE). |
| 453 ALIGNAS(64) char seralized_packet_buffer[kMaxPacketSize]; | 453 ALIGNAS(64) char seralized_packet_buffer[kMaxPacketSize]; |
| 454 SerializedPacket serialized_packet = | 454 SerializedPacket serialized_packet = |
| 455 SerializePacket(seralized_packet_buffer, kMaxPacketSize); | 455 SerializePacket(seralized_packet_buffer, kMaxPacketSize); |
| 456 delegate_->OnSerializedPacket(&serialized_packet); | 456 OnSerializedPacket(&serialized_packet); |
| 457 } |
| 458 |
| 459 void QuicPacketCreator::OnSerializedPacket(SerializedPacket* packet) { |
| 460 if (packet->packet == nullptr) { |
| 461 LOG(DFATAL) << "Failed to SerializePacket. fec_policy:" << fec_send_policy() |
| 462 << " should_fec_protect_:" << should_fec_protect_next_packet(); |
| 463 delegate_->CloseConnection(QUIC_FAILED_TO_SERIALIZE_PACKET, false); |
| 464 return; |
| 465 } |
| 466 // There may be AckListeners interested in this packet. |
| 467 packet->listeners.swap(ack_listeners_); |
| 468 DCHECK(ack_listeners_.empty()); |
| 469 delegate_->OnSerializedPacket(packet); |
| 470 has_ack_ = false; |
| 471 has_stop_waiting_ = false; |
| 472 MaybeSendFecPacketAndCloseGroup(/*force_send_fec=*/false, |
| 473 /*is_fec_timeout=*/false); |
| 474 // Maximum packet size may be only enacted while no packet is currently being |
| 475 // constructed, so here we have a good opportunity to actually change it. |
| 476 if (CanSetMaxPacketLength()) { |
| 477 SetMaxPacketLength(max_packet_length_); |
| 478 } |
| 457 } | 479 } |
| 458 | 480 |
| 459 bool QuicPacketCreator::HasPendingFrames() const { | 481 bool QuicPacketCreator::HasPendingFrames() const { |
| 460 return !queued_frames_.empty(); | 482 return !queued_frames_.empty(); |
| 461 } | 483 } |
| 462 | 484 |
| 463 bool QuicPacketCreator::HasPendingRetransmittableFrames() const { | 485 bool QuicPacketCreator::HasPendingRetransmittableFrames() const { |
| 464 return queued_retransmittable_frames_.get() != nullptr && | 486 return queued_retransmittable_frames_.get() != nullptr && |
| 465 !queued_retransmittable_frames_->frames().empty(); | 487 !queued_retransmittable_frames_->frames().empty(); |
| 466 } | 488 } |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 502 } | 524 } |
| 503 | 525 |
| 504 bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { | 526 bool QuicPacketCreator::AddPaddedSavedFrame(const QuicFrame& frame) { |
| 505 if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { | 527 if (AddFrame(frame, /*save_retransmittable_frames=*/true)) { |
| 506 needs_padding_ = true; | 528 needs_padding_ = true; |
| 507 return true; | 529 return true; |
| 508 } | 530 } |
| 509 return false; | 531 return false; |
| 510 } | 532 } |
| 511 | 533 |
| 534 void QuicPacketCreator::AddAckListener(QuicAckListenerInterface* listener, |
| 535 QuicPacketLength length) { |
| 536 DCHECK(!queued_frames_.empty()); |
| 537 ack_listeners_.push_back(AckListenerWrapper(listener, length)); |
| 538 } |
| 539 |
| 512 SerializedPacket QuicPacketCreator::SerializePacket( | 540 SerializedPacket QuicPacketCreator::SerializePacket( |
| 513 char* encrypted_buffer, | 541 char* encrypted_buffer, |
| 514 size_t encrypted_buffer_len) { | 542 size_t encrypted_buffer_len) { |
| 515 DCHECK_LT(0u, encrypted_buffer_len); | 543 DCHECK_LT(0u, encrypted_buffer_len); |
| 516 LOG_IF(DFATAL, queued_frames_.empty()) | 544 LOG_IF(DFATAL, queued_frames_.empty()) |
| 517 << "Attempt to serialize empty packet"; | 545 << "Attempt to serialize empty packet"; |
| 518 if (fec_group_.get() != nullptr) { | 546 if (fec_group_.get() != nullptr) { |
| 519 DCHECK_GE(packet_number_ + 1, fec_group_->FecGroupNumber()); | 547 DCHECK_GE(packet_number_ + 1, fec_group_->FecGroupNumber()); |
| 520 } | 548 } |
| 521 QuicPacketHeader header; | 549 QuicPacketHeader header; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 } | 601 } |
| 574 | 602 |
| 575 // Update |needs_padding_| flag of |queued_retransmittable_frames_| here, and | 603 // Update |needs_padding_| flag of |queued_retransmittable_frames_| here, and |
| 576 // not in AddFrame, because when the first padded frame is added to the queue, | 604 // not in AddFrame, because when the first padded frame is added to the queue, |
| 577 // it might not be retransmittable, and hence the flag would end up being not | 605 // it might not be retransmittable, and hence the flag would end up being not |
| 578 // set. | 606 // set. |
| 579 if (queued_retransmittable_frames_.get() != nullptr) { | 607 if (queued_retransmittable_frames_.get() != nullptr) { |
| 580 queued_retransmittable_frames_->set_needs_padding(needs_padding_); | 608 queued_retransmittable_frames_->set_needs_padding(needs_padding_); |
| 581 } | 609 } |
| 582 | 610 |
| 583 const bool has_ack = has_ack_; | |
| 584 const bool has_stop_waiting = has_stop_waiting_; | |
| 585 has_ack_ = false; | |
| 586 has_stop_waiting_ = false; | |
| 587 packet_size_ = 0; | 611 packet_size_ = 0; |
| 588 queued_frames_.clear(); | 612 queued_frames_.clear(); |
| 589 needs_padding_ = false; | 613 needs_padding_ = false; |
| 590 return SerializedPacket( | 614 return SerializedPacket( |
| 591 header.packet_number, header.public_header.packet_number_length, | 615 header.packet_number, header.public_header.packet_number_length, |
| 592 encrypted_buffer, encrypted_length, /* owns_buffer*/ false, | 616 encrypted_buffer, encrypted_length, /* owns_buffer*/ false, |
| 593 QuicFramer::GetPacketEntropyHash(header), | 617 QuicFramer::GetPacketEntropyHash(header), |
| 594 queued_retransmittable_frames_.release(), has_ack, has_stop_waiting, | 618 queued_retransmittable_frames_.release(), has_ack_, has_stop_waiting_, |
| 595 encryption_level_); | 619 encryption_level_); |
| 596 } | 620 } |
| 597 | 621 |
| 598 SerializedPacket QuicPacketCreator::SerializeFec(char* buffer, | 622 SerializedPacket QuicPacketCreator::SerializeFec(char* buffer, |
| 599 size_t buffer_len) { | 623 size_t buffer_len) { |
| 600 DCHECK_LT(0u, buffer_len); | 624 DCHECK_LT(0u, buffer_len); |
| 601 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) { | 625 if (fec_group_.get() == nullptr || fec_group_->NumReceivedPackets() <= 0) { |
| 602 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group."; | 626 LOG(DFATAL) << "SerializeFEC called but no group or zero packets in group."; |
| 603 // TODO(jri): Make this a public method of framer? | 627 // TODO(jri): Make this a public method of framer? |
| 604 return NoPacket(); | 628 return NoPacket(); |
| (...skipping 139 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 744 if (ShouldSendFec(force_send_fec)) { | 768 if (ShouldSendFec(force_send_fec)) { |
| 745 if (fec_send_policy_ == FEC_ALARM_TRIGGER && !is_fec_timeout) { | 769 if (fec_send_policy_ == FEC_ALARM_TRIGGER && !is_fec_timeout) { |
| 746 ResetFecGroup(); | 770 ResetFecGroup(); |
| 747 delegate_->OnResetFecGroup(); | 771 delegate_->OnResetFecGroup(); |
| 748 } else { | 772 } else { |
| 749 // TODO(zhongyi): Change the default 64 alignas value (used the default | 773 // TODO(zhongyi): Change the default 64 alignas value (used the default |
| 750 // value from CACHELINE_SIZE). | 774 // value from CACHELINE_SIZE). |
| 751 ALIGNAS(64) char seralized_fec_buffer[kMaxPacketSize]; | 775 ALIGNAS(64) char seralized_fec_buffer[kMaxPacketSize]; |
| 752 SerializedPacket serialized_fec = | 776 SerializedPacket serialized_fec = |
| 753 SerializeFec(seralized_fec_buffer, kMaxPacketSize); | 777 SerializeFec(seralized_fec_buffer, kMaxPacketSize); |
| 754 delegate_->OnSerializedPacket(&serialized_fec); | 778 OnSerializedPacket(&serialized_fec); |
| 755 } | 779 } |
| 756 } | 780 } |
| 757 | 781 |
| 758 if (!should_fec_protect_next_packet_ && fec_protect_ && !IsFecGroupOpen()) { | 782 if (!should_fec_protect_next_packet_ && fec_protect_ && !IsFecGroupOpen()) { |
| 759 StopFecProtectingPackets(); | 783 StopFecProtectingPackets(); |
| 760 } | 784 } |
| 761 } | 785 } |
| 762 | 786 |
| 763 QuicTime::Delta QuicPacketCreator::GetFecTimeout( | 787 QuicTime::Delta QuicPacketCreator::GetFecTimeout( |
| 764 QuicPacketNumber packet_number) { | 788 QuicPacketNumber packet_number) { |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 804 hash_map<QuicPathId, QuicPacketNumber>::iterator it = | 828 hash_map<QuicPathId, QuicPacketNumber>::iterator it = |
| 805 multipath_packet_number_.find(path_id); | 829 multipath_packet_number_.find(path_id); |
| 806 // If path_id is not in the map, it's a new path. Set packet_number to 0. | 830 // If path_id is not in the map, it's a new path. Set packet_number to 0. |
| 807 packet_number_ = it == multipath_packet_number_.end() ? 0 : it->second; | 831 packet_number_ = it == multipath_packet_number_.end() ? 0 : it->second; |
| 808 current_path_ = path_id; | 832 current_path_ = path_id; |
| 809 // Switching path needs to update packet number length. | 833 // Switching path needs to update packet number length. |
| 810 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); | 834 UpdatePacketNumberLength(least_packet_awaited_by_peer, max_packets_in_flight); |
| 811 } | 835 } |
| 812 | 836 |
| 813 } // namespace net | 837 } // namespace net |
| OLD | NEW |