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 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 // mode, we should probably set a timer so that several independent | 46 // mode, we should probably set a timer so that several independent |
47 // operations can be grouped into the same FEC group. | 47 // operations can be grouped into the same FEC group. |
48 // | 48 // |
49 // When an FEC packet is generated, it will be send to the Delegate, | 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 | 50 // even if the Delegate has become unwritable after handling the |
51 // data packet immediately proceeding the FEC packet. | 51 // data packet immediately proceeding the FEC packet. |
52 | 52 |
53 #ifndef NET_QUIC_QUIC_PACKET_GENERATOR_H_ | 53 #ifndef NET_QUIC_QUIC_PACKET_GENERATOR_H_ |
54 #define NET_QUIC_QUIC_PACKET_GENERATOR_H_ | 54 #define NET_QUIC_QUIC_PACKET_GENERATOR_H_ |
55 | 55 |
| 56 #include "net/quic/quic_ack_notifier.h" |
56 #include "net/quic/quic_packet_creator.h" | 57 #include "net/quic/quic_packet_creator.h" |
57 #include "net/quic/quic_sent_packet_manager.h" | 58 #include "net/quic/quic_sent_packet_manager.h" |
58 #include "net/quic/quic_types.h" | 59 #include "net/quic/quic_types.h" |
59 | 60 |
60 namespace net { | 61 namespace net { |
61 | 62 |
62 namespace test { | 63 namespace test { |
63 class QuicPacketGeneratorPeer; | 64 class QuicPacketGeneratorPeer; |
64 } // namespace test | 65 } // namespace test |
65 | 66 |
66 class QuicAckNotifier; | |
67 | |
68 class NET_EXPORT_PRIVATE QuicPacketGenerator { | 67 class NET_EXPORT_PRIVATE QuicPacketGenerator { |
69 public: | 68 public: |
70 class NET_EXPORT_PRIVATE DelegateInterface { | 69 class NET_EXPORT_PRIVATE DelegateInterface { |
71 public: | 70 public: |
72 virtual ~DelegateInterface() {} | 71 virtual ~DelegateInterface() {} |
73 virtual bool ShouldGeneratePacket(TransmissionType transmission_type, | 72 virtual bool ShouldGeneratePacket(TransmissionType transmission_type, |
74 HasRetransmittableData retransmittable, | 73 HasRetransmittableData retransmittable, |
75 IsHandshake handshake) = 0; | 74 IsHandshake handshake) = 0; |
76 virtual QuicAckFrame* CreateAckFrame() = 0; | 75 virtual QuicAckFrame* CreateAckFrame() = 0; |
77 virtual QuicCongestionFeedbackFrame* CreateFeedbackFrame() = 0; | 76 virtual QuicCongestionFeedbackFrame* CreateFeedbackFrame() = 0; |
(...skipping 17 matching lines...) Expand all Loading... |
95 QuicPacketGenerator(QuicConnectionId connection_id, | 94 QuicPacketGenerator(QuicConnectionId connection_id, |
96 QuicFramer* framer, | 95 QuicFramer* framer, |
97 QuicRandom* random_generator, | 96 QuicRandom* random_generator, |
98 DelegateInterface* delegate); | 97 DelegateInterface* delegate); |
99 | 98 |
100 virtual ~QuicPacketGenerator(); | 99 virtual ~QuicPacketGenerator(); |
101 | 100 |
102 // Called by the connection in the event of the congestion window changing. | 101 // Called by the connection in the event of the congestion window changing. |
103 void OnCongestionWindowChange(QuicPacketCount max_packets_in_flight); | 102 void OnCongestionWindowChange(QuicPacketCount max_packets_in_flight); |
104 | 103 |
| 104 // Called by the connection when the RTT may have changed. |
| 105 void OnRttChange(QuicTime::Delta rtt); |
| 106 |
105 // Indicates that an ACK frame should be sent. If |also_send_feedback| is | 107 // Indicates that an ACK frame should be sent. If |also_send_feedback| is |
106 // true, then it also indicates a CONGESTION_FEEDBACK frame should be sent. | 108 // true, then it also indicates a CONGESTION_FEEDBACK frame should be sent. |
107 // If |also_send_stop_waiting| is true, then it also indicates that a | 109 // If |also_send_stop_waiting| is true, then it also indicates that a |
108 // STOP_WAITING frame should be sent as well. | 110 // STOP_WAITING frame should be sent as well. |
109 // The contents of the frame(s) will be generated via a call to the delegates | 111 // The contents of the frame(s) will be generated via a call to the delegates |
110 // CreateAckFrame() and CreateFeedbackFrame() when the packet is serialized. | 112 // CreateAckFrame() and CreateFeedbackFrame() when the packet is serialized. |
111 void SetShouldSendAck(bool also_send_feedback, | 113 void SetShouldSendAck(bool also_send_feedback, |
112 bool also_send_stop_waiting); | 114 bool also_send_stop_waiting); |
113 | 115 |
114 // Indicates that a STOP_WAITING frame should be sent. | 116 // Indicates that a STOP_WAITING frame should be sent. |
115 void SetShouldSendStopWaiting(); | 117 void SetShouldSendStopWaiting(); |
116 | 118 |
117 void AddControlFrame(const QuicFrame& frame); | 119 void AddControlFrame(const QuicFrame& frame); |
118 | 120 |
119 // Given some data, may consume part or all of it and pass it to the | 121 // Given some data, may consume part or all of it and pass it to the |
120 // packet creator to be serialized into packets. If not in batch | 122 // packet creator to be serialized into packets. If not in batch |
121 // mode, these packets will also be sent during this call. Also | 123 // mode, these packets will also be sent during this call. |
122 // attaches a QuicAckNotifier to any created stream frames, which | 124 // |delegate| (if not nullptr) will be informed once all packets sent as a |
123 // will be called once the frame is ACKed by the peer. The | 125 // result of this call are ACKed by the peer. |
124 // QuicAckNotifier is owned by the QuicConnection. |notifier| may | |
125 // be nullptr. | |
126 QuicConsumedData ConsumeData(QuicStreamId id, | 126 QuicConsumedData ConsumeData(QuicStreamId id, |
127 const IOVector& data, | 127 const IOVector& data, |
128 QuicStreamOffset offset, | 128 QuicStreamOffset offset, |
129 bool fin, | 129 bool fin, |
130 FecProtection fec_protection, | 130 FecProtection fec_protection, |
131 QuicAckNotifier* notifier); | 131 QuicAckNotifier::DelegateInterface* delegate); |
132 | 132 |
133 // Indicates whether batch mode is currently enabled. | 133 // Indicates whether batch mode is currently enabled. |
134 bool InBatchMode(); | 134 bool InBatchMode(); |
135 // Disables flushing. | 135 // Disables flushing. |
136 void StartBatchOperations(); | 136 void StartBatchOperations(); |
137 // Enables flushing and flushes queued data which can be sent. | 137 // Enables flushing and flushes queued data which can be sent. |
138 void FinishBatchOperations(); | 138 void FinishBatchOperations(); |
139 | 139 |
140 // Flushes all queued frames, even frames which are not sendable. | 140 // Flushes all queued frames, even frames which are not sendable. |
141 void FlushAllQueuedFrames(); | 141 void FlushAllQueuedFrames(); |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
178 QuicPacketSequenceNumber sequence_number() const; | 178 QuicPacketSequenceNumber sequence_number() const; |
179 | 179 |
180 QuicByteCount max_packet_length() const; | 180 QuicByteCount max_packet_length() const; |
181 | 181 |
182 void set_max_packet_length(QuicByteCount length); | 182 void set_max_packet_length(QuicByteCount length); |
183 | 183 |
184 void set_debug_delegate(DebugDelegate* debug_delegate) { | 184 void set_debug_delegate(DebugDelegate* debug_delegate) { |
185 debug_delegate_ = debug_delegate; | 185 debug_delegate_ = debug_delegate; |
186 } | 186 } |
187 | 187 |
| 188 QuicTime::Delta fec_timeout() { return fec_timeout_; } |
| 189 |
188 private: | 190 private: |
189 friend class test::QuicPacketGeneratorPeer; | 191 friend class test::QuicPacketGeneratorPeer; |
190 | 192 |
191 // Turn on FEC protection for subsequent packets in the generator. | 193 // Turn on FEC protection for subsequent packets in the generator. |
192 // If no FEC group is currently open in the creator, this method flushes any | 194 // If no FEC group is currently open in the creator, this method flushes any |
193 // queued frames in the generator and in the creator, and it then turns FEC on | 195 // queued frames in the generator and in the creator, and it then turns FEC on |
194 // in the creator. This method may be called with an open FEC group in the | 196 // in the creator. This method may be called with an open FEC group in the |
195 // creator, in which case, only the generator's state is altered. | 197 // creator, in which case, only the generator's state is altered. |
196 void MaybeStartFecProtection(); | 198 void MaybeStartFecProtection(); |
197 | 199 |
(...skipping 21 matching lines...) Expand all Loading... |
219 | 221 |
220 DelegateInterface* delegate_; | 222 DelegateInterface* delegate_; |
221 DebugDelegate* debug_delegate_; | 223 DebugDelegate* debug_delegate_; |
222 | 224 |
223 QuicPacketCreator packet_creator_; | 225 QuicPacketCreator packet_creator_; |
224 QuicFrames queued_control_frames_; | 226 QuicFrames queued_control_frames_; |
225 | 227 |
226 // True if batch mode is currently enabled. | 228 // True if batch mode is currently enabled. |
227 bool batch_mode_; | 229 bool batch_mode_; |
228 | 230 |
| 231 // Timeout used for FEC alarm. Can be set to zero. |
| 232 QuicTime::Delta fec_timeout_; |
| 233 |
229 // True if FEC protection is on. The creator may have an open FEC group even | 234 // True if FEC protection is on. The creator may have an open FEC group even |
230 // if this variable is false. | 235 // if this variable is false. |
231 bool should_fec_protect_; | 236 bool should_fec_protect_; |
232 | 237 |
233 // Flags to indicate the need for just-in-time construction of a frame. | 238 // Flags to indicate the need for just-in-time construction of a frame. |
234 bool should_send_ack_; | 239 bool should_send_ack_; |
235 bool should_send_feedback_; | 240 bool should_send_feedback_; |
236 bool should_send_stop_waiting_; | 241 bool should_send_stop_waiting_; |
237 // If we put a non-retransmittable frame (namley ack or feedback frame) in | 242 // If we put a non-retransmittable frame (namley ack or feedback frame) in |
238 // this packet, then we have to hold a reference to it until we flush (and | 243 // this packet, then we have to hold a reference to it until we flush (and |
239 // serialize it). Retransmittable frames are referenced elsewhere so that they | 244 // serialize it). Retransmittable frames are referenced elsewhere so that they |
240 // can later be (optionally) retransmitted. | 245 // can later be (optionally) retransmitted. |
241 scoped_ptr<QuicAckFrame> pending_ack_frame_; | 246 scoped_ptr<QuicAckFrame> pending_ack_frame_; |
242 scoped_ptr<QuicCongestionFeedbackFrame> pending_feedback_frame_; | 247 scoped_ptr<QuicCongestionFeedbackFrame> pending_feedback_frame_; |
243 scoped_ptr<QuicStopWaitingFrame> pending_stop_waiting_frame_; | 248 scoped_ptr<QuicStopWaitingFrame> pending_stop_waiting_frame_; |
244 | 249 |
245 DISALLOW_COPY_AND_ASSIGN(QuicPacketGenerator); | 250 DISALLOW_COPY_AND_ASSIGN(QuicPacketGenerator); |
246 }; | 251 }; |
247 | 252 |
248 } // namespace net | 253 } // namespace net |
249 | 254 |
250 #endif // NET_QUIC_QUIC_PACKET_GENERATOR_H_ | 255 #endif // NET_QUIC_QUIC_PACKET_GENERATOR_H_ |
OLD | NEW |