Index: net/quic/quic_multipath_received_packet_manager.h |
diff --git a/net/quic/quic_multipath_received_packet_manager.h b/net/quic/quic_multipath_received_packet_manager.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..e33c5fccdb6bea2f2a09540f5d73de1cdd1018c1 |
--- /dev/null |
+++ b/net/quic/quic_multipath_received_packet_manager.h |
@@ -0,0 +1,78 @@ |
+// 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. |
+ |
+// A connection level received packet manager which manages multiple per path |
+// received packet managers. |
+ |
+#ifndef NET_QUIC_QUIC_MULTIPATH_RECEIVED_PACKET_MANAGER_H_ |
+#define NET_QUIC_QUIC_MULTIPATH_RECEIVED_PACKET_MANAGER_H_ |
+ |
+#include <vector> |
+ |
+#include "net/quic/quic_protocol.h" |
+#include "net/quic/quic_received_packet_manager.h" |
+ |
+namespace net { |
+ |
+namespace test { |
+class QuicMultipathReceivedPacketManagerPeer; |
+} // namespace test |
+ |
+class NET_EXPORT_PRIVATE QuicMultipathReceivedPacketManager { |
+ public: |
+ typedef base::hash_map<QuicPathId, QuicReceivedPacketManager*> |
+ MultipathReceivedPacketManagerMap; |
+ |
+ explicit QuicMultipathReceivedPacketManager(QuicConnectionStats* stats); |
+ ~QuicMultipathReceivedPacketManager(); |
+ |
+ // Called when a new path with |path_id| is created. |
+ void OnPathCreated(QuicPathId path_id, QuicConnectionStats* stats); |
+ |
+ // Called when path with |path_id| is closed. |
+ void OnPathClosed(QuicPathId path_id); |
+ |
+ // Records packet receipt information on path with |path_id|. |
+ void RecordPacketReceived(QuicPathId path_id, |
+ QuicByteCount bytes, |
+ const QuicPacketHeader& header, |
+ QuicTime receipt_time); |
+ |
+ // Called when packet with |packet_number| is revived on path with |path_id|. |
+ void RecordPacketRevived(QuicPathId path_id, QuicPacketNumber packet_number); |
+ |
+ // Checks whether |packet_number| is missing on path with |path_id|. |
+ bool IsMissing(QuicPathId path_id, QuicPacketNumber packet_number); |
+ |
+ // Checks if we're still waiting for the packet with |packet_number| on path |
+ // with |path_id|. |
+ bool IsAwaitingPacket(QuicPathId path_id, QuicPacketNumber packet_number); |
+ |
+ // If |force_all_paths| is false, populates ack information for paths whose |
+ // ack has been updated since UpdateReceivedPacketInfo was called last time. |
+ // Otherwise, populates ack for all paths. |
+ void UpdateReceivedPacketInfo(std::vector<QuicAckFrame>* ack_frames, |
+ QuicTime approximate_now, |
+ bool force_all_paths); |
+ |
+ // Updates internal state based on stop_waiting frames for corresponding path. |
+ void UpdatePacketInformationSentByPeer( |
+ const std::vector<QuicStopWaitingFrame>& stop_waitings); |
+ |
+ // Returns true when there are new missing packets to be reported within 3 |
+ // packets of the largest observed on path with |path_id|. |
+ bool HasNewMissingPackets(QuicPathId path_id) const; |
+ |
+ QuicPacketNumber GetPeerLeastPacketAwaitingAck(QuicPathId path_id); |
+ |
+ private: |
+ friend class test::QuicMultipathReceivedPacketManagerPeer; |
+ |
+ // Map mapping path id to path received packet manager. |
+ MultipathReceivedPacketManagerMap path_managers_; |
+}; |
+ |
+} // namespace net |
+ |
+#endif // NET_QUIC_QUIC_MULTIPATH_RECEIVED_PACKET_MANAGER_H_ |