| OLD | NEW |
| (Empty) | |
| 1 // Copyright 2013 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #ifndef NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ |
| 6 #define NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ |
| 7 |
| 8 #include <deque> |
| 9 #include <list> |
| 10 #include <map> |
| 11 #include <queue> |
| 12 #include <set> |
| 13 #include <utility> |
| 14 #include <vector> |
| 15 |
| 16 #include "base/containers/hash_tables.h" |
| 17 #include "net/base/linked_hash_map.h" |
| 18 #include "net/quic/quic_protocol.h" |
| 19 |
| 20 namespace net { |
| 21 |
| 22 class NET_EXPORT_PRIVATE QuicSentPacketManager { |
| 23 public: |
| 24 class NET_EXPORT_PRIVATE HelperInterface { |
| 25 public: |
| 26 virtual QuicPacketSequenceNumber GetPeerLargestObservedPacket() = 0; |
| 27 virtual QuicPacketSequenceNumber GetNextPacketSequenceNumber() = 0; |
| 28 |
| 29 // Called when a packet has been explicitly NACKd |
| 30 virtual void OnPacketNacked(QuicPacketSequenceNumber sequence_number, |
| 31 size_t nack_count) = 0; |
| 32 virtual ~HelperInterface(); |
| 33 }; |
| 34 |
| 35 QuicSentPacketManager(bool is_server, HelperInterface* helper); |
| 36 virtual ~QuicSentPacketManager(); |
| 37 |
| 38 // Called when a new packet is serialized. If the packet contains |
| 39 // retransmittable data, it will be added to the unacked packet map. |
| 40 void OnSerializedPacket(const SerializedPacket& serialized_packet); |
| 41 |
| 42 // Called when a packet is retransmitted with a new sequence number. |
| 43 // Replaces the old entry in the unacked packet map with the new |
| 44 // sequence number. |
| 45 void OnRetransmittedPacket(QuicPacketSequenceNumber old_sequence_number, |
| 46 QuicPacketSequenceNumber new_sequence_number); |
| 47 |
| 48 // Process the incoming ack looking for newly ack'd data packets. |
| 49 void HandleAckForSentPackets(const QuicAckFrame& incoming_ack, |
| 50 SequenceNumberSet* acked_packets); |
| 51 |
| 52 // Process the incoming ack looking for newly ack'd FEC packets. |
| 53 void HandleAckForSentFecPackets(const QuicAckFrame& incoming_ack, |
| 54 SequenceNumberSet* acked_packets); |
| 55 |
| 56 // Discards all information about packet |sequence_number|. |
| 57 void DiscardPacket(QuicPacketSequenceNumber sequence_number); |
| 58 |
| 59 // Returns true if |sequence_number| is a retransmission of a packet. |
| 60 bool IsRetransmission(QuicPacketSequenceNumber sequence_number) const; |
| 61 |
| 62 // Returns the number of times the data in the packet |sequence_number| |
| 63 // has been transmitted. |
| 64 size_t GetRetransmissionCount( |
| 65 QuicPacketSequenceNumber sequence_number) const; |
| 66 |
| 67 // Returns true if the non-FEC packet |sequence_number| is unacked. |
| 68 bool IsUnacked(QuicPacketSequenceNumber sequence_number) const; |
| 69 |
| 70 // Returns true if the FEC packet |sequence_number| is unacked. |
| 71 bool IsFecUnacked(QuicPacketSequenceNumber sequence_number) const; |
| 72 |
| 73 // Returns the RetransmittableFrames for |sequence_number|. |
| 74 const RetransmittableFrames& GetRetransmittableFrames( |
| 75 QuicPacketSequenceNumber sequence_number) const; |
| 76 |
| 77 // Returns the length of the serialized sequence number for |
| 78 // the packet |sequence_number|. |
| 79 QuicSequenceNumberLength GetSequenceNumberLength( |
| 80 QuicPacketSequenceNumber sequence_number) const; |
| 81 |
| 82 // Returns true if there are any unacked packets. |
| 83 bool HasUnackedPackets() const; |
| 84 |
| 85 // Returns the number of unacked packets. |
| 86 size_t GetNumUnackedPackets() const; |
| 87 |
| 88 // Returns the smallest sequence number of a sent packet which has not |
| 89 // been acked by the peer. If all packets have been acked, returns the |
| 90 // sequence number of the next packet that will be sent. |
| 91 QuicPacketSequenceNumber GetLeastUnackedSentPacket() const; |
| 92 |
| 93 // Returns the set of unacked packet sequence numbers. |
| 94 SequenceNumberSet GetUnackedPackets() const; |
| 95 |
| 96 private: |
| 97 struct RetransmissionInfo { |
| 98 RetransmissionInfo() {} |
| 99 explicit RetransmissionInfo(QuicPacketSequenceNumber sequence_number, |
| 100 QuicSequenceNumberLength sequence_number_length) |
| 101 : sequence_number(sequence_number), |
| 102 sequence_number_length(sequence_number_length), |
| 103 number_nacks(0), |
| 104 number_retransmissions(0) { |
| 105 } |
| 106 |
| 107 QuicPacketSequenceNumber sequence_number; |
| 108 QuicSequenceNumberLength sequence_number_length; |
| 109 size_t number_nacks; |
| 110 size_t number_retransmissions; |
| 111 }; |
| 112 |
| 113 typedef linked_hash_map<QuicPacketSequenceNumber, |
| 114 RetransmittableFrames*> UnackedPacketMap; |
| 115 typedef base::hash_map<QuicPacketSequenceNumber, |
| 116 RetransmissionInfo> RetransmissionMap; |
| 117 |
| 118 // When new packets are created which may be retransmitted, they are added |
| 119 // to this map, which contains owning pointers to the contained frames. |
| 120 UnackedPacketMap unacked_packets_; |
| 121 |
| 122 // Pending fec packets that have not been acked yet. These packets need to be |
| 123 // cleared out of the cgst_window after a timeout since FEC packets are never |
| 124 // retransmitted. |
| 125 // TODO(satyamshekhar): What should be the timeout for these packets? |
| 126 UnackedPacketMap unacked_fec_packets_; |
| 127 |
| 128 // Map from sequence number to the retransmission info. |
| 129 RetransmissionMap retransmission_map_; |
| 130 |
| 131 // Tracks if the connection was created by the server. |
| 132 bool is_server_; |
| 133 HelperInterface* helper_; |
| 134 |
| 135 DISALLOW_COPY_AND_ASSIGN(QuicSentPacketManager); |
| 136 }; |
| 137 |
| 138 } // namespace net |
| 139 |
| 140 #endif // NET_QUIC_QUIC_SENT_PACKET_MANAGER_H_ |
| OLD | NEW |