| 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 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 66 // Consults delegate whether a packet should be generated. | 66 // Consults delegate whether a packet should be generated. |
| 67 virtual bool ShouldGeneratePacket(HasRetransmittableData retransmittable, | 67 virtual bool ShouldGeneratePacket(HasRetransmittableData retransmittable, |
| 68 IsHandshake handshake) = 0; | 68 IsHandshake handshake) = 0; |
| 69 virtual const QuicFrame GetUpdatedAckFrame() = 0; | 69 virtual const QuicFrame GetUpdatedAckFrame() = 0; |
| 70 virtual void PopulateStopWaitingFrame( | 70 virtual void PopulateStopWaitingFrame( |
| 71 QuicStopWaitingFrame* stop_waiting) = 0; | 71 QuicStopWaitingFrame* stop_waiting) = 0; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 QuicPacketGenerator(QuicConnectionId connection_id, | 74 QuicPacketGenerator(QuicConnectionId connection_id, |
| 75 QuicFramer* framer, | 75 QuicFramer* framer, |
| 76 QuicRandom* random_generator, |
| 76 QuicBufferAllocator* buffer_allocator, | 77 QuicBufferAllocator* buffer_allocator, |
| 77 DelegateInterface* delegate); | 78 DelegateInterface* delegate); |
| 78 | 79 |
| 79 ~QuicPacketGenerator(); | 80 ~QuicPacketGenerator(); |
| 80 | 81 |
| 81 // Indicates that an ACK frame should be sent. | 82 // Indicates that an ACK frame should be sent. |
| 82 // If |also_send_stop_waiting| is true, then it also indicates that a | 83 // If |also_send_stop_waiting| is true, then it also indicates that a |
| 83 // STOP_WAITING frame should be sent as well. | 84 // STOP_WAITING frame should be sent as well. |
| 84 // The contents of the frame(s) will be generated via a call to the delegate | 85 // The contents of the frame(s) will be generated via a call to the delegate |
| 85 // CreateAckFrame() when the packet is serialized. | 86 // CreateAckFrame() when the packet is serialized. |
| 86 void SetShouldSendAck(bool also_send_stop_waiting); | 87 void SetShouldSendAck(bool also_send_stop_waiting); |
| 87 | 88 |
| 88 void AddControlFrame(const QuicFrame& frame); | 89 void AddControlFrame(const QuicFrame& frame); |
| 89 | 90 |
| 90 // Given some data, may consume part or all of it and pass it to the | 91 // Given some data, may consume part or all of it and pass it to the |
| 91 // packet creator to be serialized into packets. If not in batch | 92 // packet creator to be serialized into packets. If not in batch |
| 92 // mode, these packets will also be sent during this call. | 93 // mode, these packets will also be sent during this call. |
| 93 // |delegate| (if not nullptr) will be informed once all packets sent as a | 94 // |delegate| (if not nullptr) will be informed once all packets sent as a |
| 94 // result of this call are ACKed by the peer. | 95 // result of this call are ACKed by the peer. |
| 96 // When |state| is FIN_AND_PADDING, random padding of size [1, 256] will be |
| 97 // added after stream frames. If current constructed packet cannot |
| 98 // accommodate, the padding will overflow to the next packet(s). |
| 95 QuicConsumedData ConsumeData( | 99 QuicConsumedData ConsumeData( |
| 96 QuicStreamId id, | 100 QuicStreamId id, |
| 97 QuicIOVector iov, | 101 QuicIOVector iov, |
| 98 QuicStreamOffset offset, | 102 QuicStreamOffset offset, |
| 99 bool fin, | 103 StreamSendingState state, |
| 100 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener); | 104 QuicReferenceCountedPointer<QuicAckListenerInterface> ack_listener); |
| 101 | 105 |
| 102 // Sends as many data only packets as allowed by the send algorithm and the | 106 // Sends as many data only packets as allowed by the send algorithm and the |
| 103 // available iov. | 107 // available iov. |
| 104 // This path does not support FEC, padding, or bundling pending frames. | 108 // This path does not support FEC, padding, or bundling pending frames. |
| 105 QuicConsumedData ConsumeDataFastPath( | 109 QuicConsumedData ConsumeDataFastPath( |
| 106 QuicStreamId id, | 110 QuicStreamId id, |
| 107 const QuicIOVector& iov, | 111 const QuicIOVector& iov, |
| 108 QuicStreamOffset offset, | 112 QuicStreamOffset offset, |
| 109 bool fin, | 113 bool fin, |
| (...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 189 bool HasPendingFrames() const; | 193 bool HasPendingFrames() const; |
| 190 // Returns true if addition of a pending frame (which might be | 194 // Returns true if addition of a pending frame (which might be |
| 191 // retransmittable) would still allow the resulting packet to be sent now. | 195 // retransmittable) would still allow the resulting packet to be sent now. |
| 192 bool CanSendWithNextPendingFrameAddition() const; | 196 bool CanSendWithNextPendingFrameAddition() const; |
| 193 // Add exactly one pending frame, preferring ack frames over control frames. | 197 // Add exactly one pending frame, preferring ack frames over control frames. |
| 194 // Returns true if a pending frame is successfully added. | 198 // Returns true if a pending frame is successfully added. |
| 195 // Returns false and flushes current open packet if the pending frame cannot | 199 // Returns false and flushes current open packet if the pending frame cannot |
| 196 // fit into current open packet. | 200 // fit into current open packet. |
| 197 bool AddNextPendingFrame(); | 201 bool AddNextPendingFrame(); |
| 198 | 202 |
| 203 // Adds a random amount of padding (between 1 to 256 bytes). |
| 204 void AddRandomPadding(); |
| 205 |
| 206 // Sends remaining pending padding. |
| 207 // Pending paddings should only be sent when there is nothing else to send. |
| 208 void SendRemainingPendingPadding(); |
| 209 |
| 199 DelegateInterface* delegate_; | 210 DelegateInterface* delegate_; |
| 200 | 211 |
| 201 QuicPacketCreator packet_creator_; | 212 QuicPacketCreator packet_creator_; |
| 202 QuicFrames queued_control_frames_; | 213 QuicFrames queued_control_frames_; |
| 203 | 214 |
| 204 // True if batch mode is currently enabled. | 215 // True if batch mode is currently enabled. |
| 205 bool batch_mode_; | 216 bool batch_mode_; |
| 206 | 217 |
| 207 // Flags to indicate the need for just-in-time construction of a frame. | 218 // Flags to indicate the need for just-in-time construction of a frame. |
| 208 bool should_send_ack_; | 219 bool should_send_ack_; |
| 209 bool should_send_stop_waiting_; | 220 bool should_send_stop_waiting_; |
| 210 // If we put a non-retransmittable frame in this packet, then we have to hold | 221 // If we put a non-retransmittable frame in this packet, then we have to hold |
| 211 // a reference to it until we flush (and serialize it). Retransmittable frames | 222 // a reference to it until we flush (and serialize it). Retransmittable frames |
| 212 // are referenced elsewhere so that they can later be (optionally) | 223 // are referenced elsewhere so that they can later be (optionally) |
| 213 // retransmitted. | 224 // retransmitted. |
| 214 QuicStopWaitingFrame pending_stop_waiting_frame_; | 225 QuicStopWaitingFrame pending_stop_waiting_frame_; |
| 215 | 226 |
| 227 QuicRandom* random_generator_; |
| 228 |
| 216 DISALLOW_COPY_AND_ASSIGN(QuicPacketGenerator); | 229 DISALLOW_COPY_AND_ASSIGN(QuicPacketGenerator); |
| 217 }; | 230 }; |
| 218 | 231 |
| 219 } // namespace net | 232 } // namespace net |
| 220 | 233 |
| 221 #endif // NET_QUIC_CORE_QUIC_PACKET_GENERATOR_H_ | 234 #endif // NET_QUIC_CORE_QUIC_PACKET_GENERATOR_H_ |
| OLD | NEW |