Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(89)

Side by Side Diff: net/quic/quic_sent_packet_manager.h

Issue 23691073: Land Recent QUIC changes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Compiler/unittests fix Created 7 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/quic/quic_packet_generator_test.cc ('k') | net/quic/quic_sent_packet_manager.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(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_
OLDNEW
« no previous file with comments | « net/quic/quic_packet_generator_test.cc ('k') | net/quic/quic_sent_packet_manager.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698