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 // Responsible for generating packets on behalf of a QuicConnection. | 5 // Responsible for generating packets on behalf of a QuicConnection. |
6 // Packets are serialized just-in-time. Control frames are queued. | 6 // Packets are serialized just-in-time. Control frames are queued. |
7 // Ack and Feedback frames will be requested from the Connection | 7 // Ack and Feedback frames will be requested from the Connection |
8 // just-in-time. When a packet needs to be sent, the Generator | 8 // just-in-time. When a packet needs to be sent, the Generator |
9 // will serialize a packet and pass it to QuicConnection::SendOrQueuePacket() | 9 // will serialize a packet and pass it to QuicConnection::SendOrQueuePacket() |
10 // | 10 // |
(...skipping 18 matching lines...) Expand all Loading... |
29 // but has not been sent, then the Delegate will be asked to create | 29 // but has not been sent, then the Delegate will be asked to create |
30 // an Ack frame which will then be included in the packet. When | 30 // an Ack frame which will then be included in the packet. When |
31 // the write call completes, the current packet will be serialized | 31 // the write call completes, the current packet will be serialized |
32 // and sent to the Delegate, even if it is not full. | 32 // and sent to the Delegate, even if it is not full. |
33 // | 33 // |
34 // If the Generator is in batch mode, then each write operation will | 34 // If the Generator is in batch mode, then each write operation will |
35 // add data to the "current" packet. When the current packet becomes | 35 // add data to the "current" packet. When the current packet becomes |
36 // full, it will be serialized and sent to the packet. When batch | 36 // full, it will be serialized and sent to the packet. When batch |
37 // mode is ended via |FinishBatchOperations|, the current packet | 37 // mode is ended via |FinishBatchOperations|, the current packet |
38 // will be serialzied, even if it is not full. | 38 // will be serialzied, even if it is not full. |
39 // | |
40 // FEC behavior also depends on batch mode. In batch mode, FEC packets | |
41 // will be sent after |max_packets_per_group| have been sent, as well | |
42 // as after batch operations are complete. When not in batch mode, | |
43 // an FEC packet will be sent after each write call completes. | |
44 // | |
45 // TODO(rch): This behavior should probably be tuned. When not in batch | |
46 // mode, we should probably set a timer so that several independent | |
47 // operations can be grouped into the same FEC group. | |
48 // | |
49 // When an FEC packet is generated, it will be send to the Delegate, | |
50 // even if the Delegate has become unwritable after handling the | |
51 // data packet immediately proceeding the FEC packet. | |
52 | 39 |
53 #ifndef NET_QUIC_QUIC_PACKET_GENERATOR_H_ | 40 #ifndef NET_QUIC_QUIC_PACKET_GENERATOR_H_ |
54 #define NET_QUIC_QUIC_PACKET_GENERATOR_H_ | 41 #define NET_QUIC_QUIC_PACKET_GENERATOR_H_ |
55 | 42 |
56 #include <stddef.h> | 43 #include <stddef.h> |
57 #include <stdint.h> | 44 #include <stdint.h> |
58 | 45 |
59 #include <list> | 46 #include <list> |
60 | 47 |
61 #include "base/macros.h" | 48 #include "base/macros.h" |
(...skipping 22 matching lines...) Expand all Loading... |
84 }; | 71 }; |
85 | 72 |
86 QuicPacketGenerator(QuicConnectionId connection_id, | 73 QuicPacketGenerator(QuicConnectionId connection_id, |
87 QuicFramer* framer, | 74 QuicFramer* framer, |
88 QuicRandom* random_generator, | 75 QuicRandom* random_generator, |
89 QuicBufferAllocator* buffer_allocator, | 76 QuicBufferAllocator* buffer_allocator, |
90 DelegateInterface* delegate); | 77 DelegateInterface* delegate); |
91 | 78 |
92 ~QuicPacketGenerator(); | 79 ~QuicPacketGenerator(); |
93 | 80 |
94 // Called by the connection in the event of the congestion window changing. | |
95 void OnCongestionWindowChange(QuicPacketCount max_packets_in_flight); | |
96 | |
97 // Called by the connection when the RTT may have changed. | |
98 void OnRttChange(QuicTime::Delta rtt); | |
99 | |
100 // Indicates that an ACK frame should be sent. | 81 // Indicates that an ACK frame should be sent. |
101 // If |also_send_stop_waiting| is true, then it also indicates that a | 82 // If |also_send_stop_waiting| is true, then it also indicates that a |
102 // STOP_WAITING frame should be sent as well. | 83 // STOP_WAITING frame should be sent as well. |
103 // The contents of the frame(s) will be generated via a call to the delegate | 84 // The contents of the frame(s) will be generated via a call to the delegate |
104 // CreateAckFrame() when the packet is serialized. | 85 // CreateAckFrame() when the packet is serialized. |
105 void SetShouldSendAck(bool also_send_stop_waiting); | 86 void SetShouldSendAck(bool also_send_stop_waiting); |
106 | 87 |
107 void AddControlFrame(const QuicFrame& frame); | 88 void AddControlFrame(const QuicFrame& frame); |
108 | 89 |
109 // Given some data, may consume part or all of it and pass it to the | 90 // Given some data, may consume part or all of it and pass it to the |
110 // packet creator to be serialized into packets. If not in batch | 91 // packet creator to be serialized into packets. If not in batch |
111 // mode, these packets will also be sent during this call. | 92 // mode, these packets will also be sent during this call. |
112 // |delegate| (if not nullptr) will be informed once all packets sent as a | 93 // |delegate| (if not nullptr) will be informed once all packets sent as a |
113 // result of this call are ACKed by the peer. | 94 // result of this call are ACKed by the peer. |
114 QuicConsumedData ConsumeData(QuicStreamId id, | 95 QuicConsumedData ConsumeData(QuicStreamId id, |
115 QuicIOVector iov, | 96 QuicIOVector iov, |
116 QuicStreamOffset offset, | 97 QuicStreamOffset offset, |
117 bool fin, | 98 bool fin, |
118 FecProtection fec_protection, | |
119 QuicAckListenerInterface* listener); | 99 QuicAckListenerInterface* listener); |
120 | 100 |
121 // Generates an MTU discovery packet of specified size. | 101 // Generates an MTU discovery packet of specified size. |
122 void GenerateMtuDiscoveryPacket(QuicByteCount target_mtu, | 102 void GenerateMtuDiscoveryPacket(QuicByteCount target_mtu, |
123 QuicAckListenerInterface* listener); | 103 QuicAckListenerInterface* listener); |
124 | 104 |
125 // Indicates whether batch mode is currently enabled. | 105 // Indicates whether batch mode is currently enabled. |
126 bool InBatchMode(); | 106 bool InBatchMode(); |
127 // Disables flushing. | 107 // Disables flushing. |
128 void StartBatchOperations(); | 108 void StartBatchOperations(); |
(...skipping 10 matching lines...) Expand all Loading... |
139 | 119 |
140 // Creates a version negotiation packet which supports |supported_versions|. | 120 // Creates a version negotiation packet which supports |supported_versions|. |
141 // Caller owns the created packet. Also, sets the entropy hash of the | 121 // Caller owns the created packet. Also, sets the entropy hash of the |
142 // serialized packet to a random bool and returns that value as a member of | 122 // serialized packet to a random bool and returns that value as a member of |
143 // SerializedPacket. | 123 // SerializedPacket. |
144 QuicEncryptedPacket* SerializeVersionNegotiationPacket( | 124 QuicEncryptedPacket* SerializeVersionNegotiationPacket( |
145 const QuicVersionVector& supported_versions); | 125 const QuicVersionVector& supported_versions); |
146 | 126 |
147 // Re-serializes frames with the original packet's packet number length. | 127 // Re-serializes frames with the original packet's packet number length. |
148 // Used for retransmitting packets to ensure they aren't too long. | 128 // Used for retransmitting packets to ensure they aren't too long. |
149 // Caller must ensure that any open FEC group is closed before calling this | |
150 // method. | |
151 void ReserializeAllFrames(const PendingRetransmission& retransmission, | 129 void ReserializeAllFrames(const PendingRetransmission& retransmission, |
152 char* buffer, | 130 char* buffer, |
153 size_t buffer_len); | 131 size_t buffer_len); |
154 | 132 |
155 // Update the packet number length to use in future packets as soon as it | 133 // Update the packet number length to use in future packets as soon as it |
156 // can be safely changed. | 134 // can be safely changed. |
157 void UpdateSequenceNumberLength(QuicPacketNumber least_packet_awaited_by_peer, | 135 void UpdateSequenceNumberLength(QuicPacketNumber least_packet_awaited_by_peer, |
158 QuicPacketCount max_packets_in_flight); | 136 QuicPacketCount max_packets_in_flight); |
159 | 137 |
160 // Set the minimum number of bytes for the connection id length; | 138 // Set the minimum number of bytes for the connection id length; |
161 void SetConnectionIdLength(uint32_t length); | 139 void SetConnectionIdLength(uint32_t length); |
162 | 140 |
163 // Called when the FEC alarm fires. | |
164 void OnFecTimeout(); | |
165 | |
166 // Called after sending |packet_number| to determine whether an FEC alarm | |
167 // should be set for sending out an FEC packet. Returns a positive and finite | |
168 // timeout if an FEC alarm should be set, and infinite if no alarm should be | |
169 // set. OnFecTimeout should be called to send the FEC packet when the alarm | |
170 // fires. | |
171 QuicTime::Delta GetFecTimeout(QuicPacketNumber packet_number); | |
172 | |
173 // Sets the encrypter to use for the encryption level. | 141 // Sets the encrypter to use for the encryption level. |
174 void SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter); | 142 void SetEncrypter(EncryptionLevel level, QuicEncrypter* encrypter); |
175 | 143 |
176 // Sets the encryption level that will be applied to new packets. | 144 // Sets the encryption level that will be applied to new packets. |
177 void set_encryption_level(EncryptionLevel level); | 145 void set_encryption_level(EncryptionLevel level); |
178 | 146 |
179 // packet number of the last created packet, or 0 if no packets have been | 147 // packet number of the last created packet, or 0 if no packets have been |
180 // created. | 148 // created. |
181 QuicPacketNumber packet_number() const; | 149 QuicPacketNumber packet_number() const; |
182 | 150 |
183 // Returns the maximum packet length. Note that this is the long-term maximum | 151 // Returns the maximum packet length. Note that this is the long-term maximum |
184 // packet length, and it may not be the maximum length of the current packet, | 152 // packet length, and it may not be the maximum length of the current packet, |
185 // if the generator is in the middle of the packet (in batch mode) or FEC | 153 // if the generator is in the middle of the packet (in batch mode). |
186 // group. | |
187 QuicByteCount GetMaxPacketLength() const; | 154 QuicByteCount GetMaxPacketLength() const; |
188 // Returns the maximum length current packet can actually have. | 155 // Returns the maximum length current packet can actually have. |
189 QuicByteCount GetCurrentMaxPacketLength() const; | 156 QuicByteCount GetCurrentMaxPacketLength() const; |
190 | 157 |
191 // Set maximum packet length sent. If |force| is set to true, all pending | 158 // Set maximum packet length sent. If |force| is set to true, all pending |
192 // unfinished packets and FEC groups are closed, and the change is enacted | 159 // unfinished packets are closed, and the change is enacted immediately. |
193 // immediately. Otherwise, it is enacted at the next opportunity. | 160 // Otherwise, it is enacted at the next opportunity. |
194 void SetMaxPacketLength(QuicByteCount length, bool force); | 161 void SetMaxPacketLength(QuicByteCount length, bool force); |
195 | 162 |
196 // Sets |path_id| to be the path on which next packet is generated. | 163 // Sets |path_id| to be the path on which next packet is generated. |
197 void SetCurrentPath(QuicPathId path_id, | 164 void SetCurrentPath(QuicPathId path_id, |
198 QuicPacketNumber least_packet_awaited_by_peer, | 165 QuicPacketNumber least_packet_awaited_by_peer, |
199 QuicPacketCount max_packets_in_flight); | 166 QuicPacketCount max_packets_in_flight); |
200 | 167 |
201 void set_debug_delegate(QuicPacketCreator::DebugDelegate* debug_delegate) { | 168 void set_debug_delegate(QuicPacketCreator::DebugDelegate* debug_delegate) { |
202 packet_creator_.set_debug_delegate(debug_delegate); | 169 packet_creator_.set_debug_delegate(debug_delegate); |
203 } | 170 } |
204 | 171 |
205 void set_rtt_multiplier_for_fec_timeout(float rtt_multiplier_for_fec_timeout); | |
206 | |
207 FecSendPolicy fec_send_policy(); | |
208 void set_fec_send_policy(FecSendPolicy fec_send_policy); | |
209 | |
210 private: | 172 private: |
211 friend class test::QuicPacketGeneratorPeer; | 173 friend class test::QuicPacketGeneratorPeer; |
212 | 174 |
213 void SendQueuedFrames(bool flush, bool is_fec_timeout); | 175 void SendQueuedFrames(bool flush); |
214 | 176 |
215 // Test to see if we have pending ack, or control frames. | 177 // Test to see if we have pending ack, or control frames. |
216 bool HasPendingFrames() const; | 178 bool HasPendingFrames() const; |
217 // Returns true if addition of a pending frame (which might be | 179 // Returns true if addition of a pending frame (which might be |
218 // retransmittable) would still allow the resulting packet to be sent now. | 180 // retransmittable) would still allow the resulting packet to be sent now. |
219 bool CanSendWithNextPendingFrameAddition() const; | 181 bool CanSendWithNextPendingFrameAddition() const; |
220 // Add exactly one pending frame, preferring ack frames over control frames. | 182 // Add exactly one pending frame, preferring ack frames over control frames. |
221 // Returns true if a pending frame is successfully added. | 183 // Returns true if a pending frame is successfully added. |
222 // Returns false and flushes current open packet if the pending frame cannot | 184 // Returns false and flushes current open packet if the pending frame cannot |
223 // fit into current open packet. | 185 // fit into current open packet. |
(...skipping 21 matching lines...) Expand all Loading... |
245 // the maximum size we are actually using now, if we are in the middle of the | 207 // the maximum size we are actually using now, if we are in the middle of the |
246 // packet. | 208 // packet. |
247 QuicByteCount max_packet_length_; | 209 QuicByteCount max_packet_length_; |
248 | 210 |
249 DISALLOW_COPY_AND_ASSIGN(QuicPacketGenerator); | 211 DISALLOW_COPY_AND_ASSIGN(QuicPacketGenerator); |
250 }; | 212 }; |
251 | 213 |
252 } // namespace net | 214 } // namespace net |
253 | 215 |
254 #endif // NET_QUIC_QUIC_PACKET_GENERATOR_H_ | 216 #endif // NET_QUIC_QUIC_PACKET_GENERATOR_H_ |
OLD | NEW |