| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 // | |
| 5 // The base class for client/server reliable streams. | |
| 6 | |
| 7 #ifndef NET_QUIC_RELIABLE_QUIC_STREAM_H_ | |
| 8 #define NET_QUIC_RELIABLE_QUIC_STREAM_H_ | |
| 9 | |
| 10 #include <sys/types.h> | |
| 11 | |
| 12 #include <list> | |
| 13 #include <string> | |
| 14 | |
| 15 #include "base/basictypes.h" | |
| 16 #include "base/memory/ref_counted.h" | |
| 17 #include "base/strings/string_piece.h" | |
| 18 #include "net/base/iovec.h" | |
| 19 #include "net/base/net_export.h" | |
| 20 #include "net/quic/quic_ack_notifier.h" | |
| 21 #include "net/quic/quic_flow_controller.h" | |
| 22 #include "net/quic/quic_protocol.h" | |
| 23 #include "net/quic/quic_stream_sequencer.h" | |
| 24 #include "net/quic/quic_types.h" | |
| 25 | |
| 26 namespace net { | |
| 27 | |
| 28 namespace test { | |
| 29 class ReliableQuicStreamPeer; | |
| 30 } // namespace test | |
| 31 | |
| 32 class QuicSession; | |
| 33 | |
| 34 class NET_EXPORT_PRIVATE ReliableQuicStream { | |
| 35 public: | |
| 36 ReliableQuicStream(QuicStreamId id, | |
| 37 QuicSession* session); | |
| 38 | |
| 39 virtual ~ReliableQuicStream(); | |
| 40 | |
| 41 // Called when a (potentially duplicate) stream frame has been received | |
| 42 // for this stream. | |
| 43 virtual void OnStreamFrame(const QuicStreamFrame& frame); | |
| 44 | |
| 45 // Called when the connection becomes writeable to allow the stream | |
| 46 // to write any pending data. | |
| 47 virtual void OnCanWrite(); | |
| 48 | |
| 49 // Called by the session just before the stream is deleted. | |
| 50 virtual void OnClose(); | |
| 51 | |
| 52 // Called when we get a stream reset from the peer. | |
| 53 virtual void OnStreamReset(const QuicRstStreamFrame& frame); | |
| 54 | |
| 55 // Called when we get or send a connection close, and should immediately | |
| 56 // close the stream. This is not passed through the sequencer, | |
| 57 // but is handled immediately. | |
| 58 virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer); | |
| 59 | |
| 60 // Called when the final data has been read. | |
| 61 virtual void OnFinRead(); | |
| 62 | |
| 63 virtual uint32 ProcessRawData(const char* data, uint32 data_len) = 0; | |
| 64 | |
| 65 // Called to reset the stream from this end. | |
| 66 virtual void Reset(QuicRstStreamErrorCode error); | |
| 67 | |
| 68 // Called to close the entire connection from this end. | |
| 69 virtual void CloseConnection(QuicErrorCode error); | |
| 70 virtual void CloseConnectionWithDetails(QuicErrorCode error, | |
| 71 const std::string& details); | |
| 72 | |
| 73 // Returns the effective priority for the stream. This value may change | |
| 74 // during the life of the stream. | |
| 75 virtual QuicPriority EffectivePriority() const = 0; | |
| 76 | |
| 77 QuicStreamId id() const { return id_; } | |
| 78 | |
| 79 QuicRstStreamErrorCode stream_error() const { return stream_error_; } | |
| 80 QuicErrorCode connection_error() const { return connection_error_; } | |
| 81 | |
| 82 bool read_side_closed() const { return read_side_closed_; } | |
| 83 bool write_side_closed() const { return write_side_closed_; } | |
| 84 | |
| 85 uint64 stream_bytes_read() const { return stream_bytes_read_; } | |
| 86 uint64 stream_bytes_written() const { return stream_bytes_written_; } | |
| 87 | |
| 88 QuicVersion version() const; | |
| 89 | |
| 90 void set_fin_sent(bool fin_sent) { fin_sent_ = fin_sent; } | |
| 91 void set_rst_sent(bool rst_sent) { rst_sent_ = rst_sent; } | |
| 92 | |
| 93 void set_fec_policy(FecPolicy fec_policy) { fec_policy_ = fec_policy; } | |
| 94 FecPolicy fec_policy() const { return fec_policy_; } | |
| 95 | |
| 96 // Adjust our flow control windows according to new offset in |frame|. | |
| 97 virtual void OnWindowUpdateFrame(const QuicWindowUpdateFrame& frame); | |
| 98 | |
| 99 int num_frames_received() const; | |
| 100 | |
| 101 int num_duplicate_frames_received() const; | |
| 102 | |
| 103 QuicFlowController* flow_controller() { return &flow_controller_; } | |
| 104 | |
| 105 // Called when we see a frame which could increase the highest offset. | |
| 106 // Returns true if the highest offset did increase. | |
| 107 bool MaybeIncreaseHighestReceivedOffset(QuicStreamOffset new_offset); | |
| 108 // Called when bytese are sent to the peer. | |
| 109 void AddBytesSent(QuicByteCount bytes); | |
| 110 // Called by the stream sequencer as bytes are consumed from the buffer. | |
| 111 // If our receive window has dropped below the threshold, then send a | |
| 112 // WINDOW_UPDATE frame. | |
| 113 void AddBytesConsumed(QuicByteCount bytes); | |
| 114 | |
| 115 // Updates the flow controller's send window offset and calls OnCanWrite if | |
| 116 // it was blocked before. | |
| 117 void UpdateSendWindowOffset(QuicStreamOffset new_offset); | |
| 118 | |
| 119 // Returns true if the stream is flow control blocked, by the stream flow | |
| 120 // control window or the connection flow control window. | |
| 121 bool IsFlowControlBlocked(); | |
| 122 | |
| 123 // Returns true if we have received either a RST or a FIN - either of which | |
| 124 // gives a definitive number of bytes which the peer has sent. If this is not | |
| 125 // true on stream termination the session must keep track of the stream's byte | |
| 126 // offset until a definitive final value arrives. | |
| 127 bool HasFinalReceivedByteOffset() const { | |
| 128 return fin_received_ || rst_received_; | |
| 129 } | |
| 130 | |
| 131 // Returns true if the stream has queued data waiting to write. | |
| 132 bool HasBufferedData() const; | |
| 133 | |
| 134 protected: | |
| 135 // Sends as much of 'data' to the connection as the connection will consume, | |
| 136 // and then buffers any remaining data in queued_data_. | |
| 137 void WriteOrBufferData( | |
| 138 base::StringPiece data, | |
| 139 bool fin, | |
| 140 QuicAckNotifier::DelegateInterface* ack_notifier_delegate); | |
| 141 | |
| 142 // Sends as many bytes in the first |count| buffers of |iov| to the connection | |
| 143 // as the connection will consume. | |
| 144 // If |ack_notifier_delegate| is provided, then it will be notified once all | |
| 145 // the ACKs for this write have been received. | |
| 146 // Returns the number of bytes consumed by the connection. | |
| 147 QuicConsumedData WritevData( | |
| 148 const struct iovec* iov, | |
| 149 int iov_count, | |
| 150 bool fin, | |
| 151 QuicAckNotifier::DelegateInterface* ack_notifier_delegate); | |
| 152 | |
| 153 // Helper method that returns FecProtection to use for writes to the session. | |
| 154 FecProtection GetFecProtection(); | |
| 155 | |
| 156 // Close the read side of the socket. Further frames will not be accepted. | |
| 157 virtual void CloseReadSide(); | |
| 158 | |
| 159 // Close the write side of the socket. Further writes will fail. | |
| 160 void CloseWriteSide(); | |
| 161 | |
| 162 bool fin_buffered() const { return fin_buffered_; } | |
| 163 | |
| 164 const QuicSession* session() const { return session_; } | |
| 165 QuicSession* session() { return session_; } | |
| 166 | |
| 167 const QuicStreamSequencer* sequencer() const { return &sequencer_; } | |
| 168 QuicStreamSequencer* sequencer() { return &sequencer_; } | |
| 169 | |
| 170 void DisableConnectionFlowControlForThisStream() { | |
| 171 stream_contributes_to_connection_flow_control_ = false; | |
| 172 } | |
| 173 | |
| 174 private: | |
| 175 friend class test::ReliableQuicStreamPeer; | |
| 176 friend class QuicStreamUtils; | |
| 177 class ProxyAckNotifierDelegate; | |
| 178 | |
| 179 struct PendingData { | |
| 180 PendingData(std::string data_in, | |
| 181 scoped_refptr<ProxyAckNotifierDelegate> delegate_in); | |
| 182 ~PendingData(); | |
| 183 | |
| 184 std::string data; | |
| 185 // Delegate that should be notified when the pending data is acked. | |
| 186 // Can be nullptr. | |
| 187 scoped_refptr<ProxyAckNotifierDelegate> delegate; | |
| 188 }; | |
| 189 | |
| 190 // Calls MaybeSendBlocked on our flow controller, and connection level flow | |
| 191 // controller. If we are flow control blocked, marks this stream as write | |
| 192 // blocked. | |
| 193 void MaybeSendBlocked(); | |
| 194 | |
| 195 std::list<PendingData> queued_data_; | |
| 196 | |
| 197 QuicStreamSequencer sequencer_; | |
| 198 QuicStreamId id_; | |
| 199 QuicSession* session_; | |
| 200 // Bytes read and written refer to payload bytes only: they do not include | |
| 201 // framing, encryption overhead etc. | |
| 202 uint64 stream_bytes_read_; | |
| 203 uint64 stream_bytes_written_; | |
| 204 | |
| 205 // Stream error code received from a RstStreamFrame or error code sent by the | |
| 206 // visitor or sequencer in the RstStreamFrame. | |
| 207 QuicRstStreamErrorCode stream_error_; | |
| 208 // Connection error code due to which the stream was closed. |stream_error_| | |
| 209 // is set to |QUIC_STREAM_CONNECTION_ERROR| when this happens and consumers | |
| 210 // should check |connection_error_|. | |
| 211 QuicErrorCode connection_error_; | |
| 212 | |
| 213 // True if the read side is closed and further frames should be rejected. | |
| 214 bool read_side_closed_; | |
| 215 // True if the write side is closed, and further writes should fail. | |
| 216 bool write_side_closed_; | |
| 217 | |
| 218 bool fin_buffered_; | |
| 219 bool fin_sent_; | |
| 220 | |
| 221 // True if this stream has received (and the sequencer has accepted) a | |
| 222 // StreamFrame with the FIN set. | |
| 223 bool fin_received_; | |
| 224 | |
| 225 // In combination with fin_sent_, used to ensure that a FIN and/or a RST is | |
| 226 // always sent before stream termination. | |
| 227 bool rst_sent_; | |
| 228 | |
| 229 // True if this stream has received a RST stream frame. | |
| 230 bool rst_received_; | |
| 231 | |
| 232 // FEC policy to be used for this stream. | |
| 233 FecPolicy fec_policy_; | |
| 234 | |
| 235 // True if the session this stream is running under is a server session. | |
| 236 bool is_server_; | |
| 237 | |
| 238 QuicFlowController flow_controller_; | |
| 239 | |
| 240 // The connection level flow controller. Not owned. | |
| 241 QuicFlowController* connection_flow_controller_; | |
| 242 | |
| 243 // Special streams, such as the crypto and headers streams, do not respect | |
| 244 // connection level flow control limits (but are stream level flow control | |
| 245 // limited). | |
| 246 bool stream_contributes_to_connection_flow_control_; | |
| 247 | |
| 248 DISALLOW_COPY_AND_ASSIGN(ReliableQuicStream); | |
| 249 }; | |
| 250 | |
| 251 } // namespace net | |
| 252 | |
| 253 #endif // NET_QUIC_RELIABLE_QUIC_STREAM_H_ | |
| OLD | NEW |