Index: net/quic/quic_multipath_received_packet_manager.cc |
diff --git a/net/quic/quic_multipath_received_packet_manager.cc b/net/quic/quic_multipath_received_packet_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a13acc687438baa400408d3cb2e6e8afc4c35467 |
--- /dev/null |
+++ b/net/quic/quic_multipath_received_packet_manager.cc |
@@ -0,0 +1,147 @@ |
+// Copyright (c) 2015 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "net/quic/quic_multipath_received_packet_manager.h" |
+ |
+#include "base/stl_util.h" |
+ |
+namespace net { |
+ |
+QuicMultipathReceivedPacketManager::QuicMultipathReceivedPacketManager( |
+ QuicConnectionStats* stats) { |
+ path_managers_[kDefaultPathId] = new QuicReceivedPacketManager(stats); |
+} |
+ |
+QuicMultipathReceivedPacketManager::~QuicMultipathReceivedPacketManager() { |
+ STLDeleteValues(&path_managers_); |
+} |
+ |
+void QuicMultipathReceivedPacketManager::OnPathCreated( |
+ QuicPathId path_id, |
+ QuicConnectionStats* stats) { |
+ if (path_managers_[path_id] != nullptr) { |
+ LOG(DFATAL) << "Received packet manager of path already exists: " |
+ << static_cast<uint32>(path_id); |
+ return; |
+ } |
+ |
+ path_managers_[path_id] = new QuicReceivedPacketManager(stats); |
+} |
+ |
+void QuicMultipathReceivedPacketManager::OnPathClosed(QuicPathId path_id) { |
+ QuicReceivedPacketManager* manager = path_managers_[path_id]; |
+ if (manager == nullptr) { |
+ LOG(DFATAL) << "Received packet manager of path does not exist: " |
+ << static_cast<uint32>(path_id); |
+ return; |
+ } |
+ |
+ delete manager; |
+ path_managers_.erase(path_id); |
+} |
+ |
+void QuicMultipathReceivedPacketManager::RecordPacketReceived( |
+ QuicPathId path_id, |
+ QuicByteCount bytes, |
+ const QuicPacketHeader& header, |
+ QuicTime receipt_time) { |
+ QuicReceivedPacketManager* manager = path_managers_[path_id]; |
+ if (manager == nullptr) { |
+ LOG(DFATAL) << "Received a packet on a non-existent path."; |
+ return; |
+ } |
+ |
+ manager->RecordPacketReceived(bytes, header, receipt_time); |
+} |
+ |
+void QuicMultipathReceivedPacketManager::RecordPacketRevived( |
+ QuicPathId path_id, |
+ QuicPacketNumber packet_number) { |
+ QuicReceivedPacketManager* manager = path_managers_[path_id]; |
+ if (manager == nullptr) { |
+ LOG(DFATAL) << "Revived a packet on a non-existent path."; |
+ return; |
+ } |
+ |
+ manager->RecordPacketRevived(packet_number); |
+} |
+ |
+bool QuicMultipathReceivedPacketManager::IsMissing( |
+ QuicPathId path_id, |
+ QuicPacketNumber packet_number) { |
+ QuicReceivedPacketManager* manager = path_managers_[path_id]; |
+ if (manager == nullptr) { |
+ LOG(DFATAL) << "Check whether a packet is missing on a non-existent path."; |
+ return true; |
+ } |
+ |
+ return manager->IsMissing(packet_number); |
+} |
+ |
+bool QuicMultipathReceivedPacketManager::IsAwaitingPacket( |
+ QuicPathId path_id, |
+ QuicPacketNumber packet_number) { |
+ QuicReceivedPacketManager* manager = path_managers_[path_id]; |
+ if (manager == nullptr) { |
+ LOG(DFATAL) << "Check whether a packet is awaited on a non-existent path."; |
+ return false; |
+ } |
+ |
+ return manager->IsAwaitingPacket(packet_number); |
+} |
+ |
+void QuicMultipathReceivedPacketManager::UpdateReceivedPacketInfo( |
+ std::vector<QuicAckFrame>* ack_frames, |
+ QuicTime approximate_now, |
+ bool force_all_paths) { |
+ QuicAckFrame ack_frame; |
+ for (std::pair<QuicPathId, QuicReceivedPacketManager*> |
+ per_path_received_packet_manager : path_managers_) { |
+ if (!force_all_paths && |
+ !per_path_received_packet_manager.second->ack_frame_updated()) { |
+ continue; |
+ } |
+ per_path_received_packet_manager.second->UpdateReceivedPacketInfo( |
+ &ack_frame, approximate_now); |
+ ack_frames->push_back(ack_frame); |
+ } |
+} |
+ |
+void QuicMultipathReceivedPacketManager::UpdatePacketInformationSentByPeer( |
+ const std::vector<QuicStopWaitingFrame>& stop_waitings) { |
+ for (QuicStopWaitingFrame stop_waiting : stop_waitings) { |
+ QuicReceivedPacketManager* manager = path_managers_[stop_waiting.path_id]; |
+ if (manager != nullptr) { |
+ manager->UpdatePacketInformationSentByPeer(stop_waiting); |
+ } |
+ } |
+} |
+ |
+bool QuicMultipathReceivedPacketManager::HasNewMissingPackets( |
+ QuicPathId path_id) const { |
+ MultipathReceivedPacketManagerMap::const_iterator it = |
+ path_managers_.find(path_id); |
+ if (it == path_managers_.end()) { |
+ LOG(DFATAL) |
+ << "Check whether has new missing packets on a non-existent path."; |
+ return false; |
+ } |
+ |
+ return it->second->HasNewMissingPackets(); |
+} |
+ |
+QuicPacketNumber |
+QuicMultipathReceivedPacketManager::GetPeerLeastPacketAwaitingAck( |
+ QuicPathId path_id) { |
+ QuicReceivedPacketManager* manager = path_managers_[path_id]; |
+ if (manager == nullptr) { |
+ LOG(DFATAL) |
+ << "Try to get peer_least_packet_awaiting_ack of a non-existent path."; |
+ return false; |
+ } |
+ |
+ return manager->peer_least_packet_awaiting_ack(); |
+} |
+ |
+} // namespace net |