reliable_quic_stream.h revision c2e0dbddbe15c98d52c4786dac06cb8952a8ae6d
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The base class for client/server reliable streams. 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_RELIABLE_QUIC_STREAM_H_ 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_RELIABLE_QUIC_STREAM_H_ 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <sys/types.h> 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include <list> 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_stream_sequencer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ReliableQuicStreamPeer; 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IPEndPoint; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicSession; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// All this does right now is send data to subclasses via the sequencer. 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE ReliableQuicStream { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Visitor receives callbacks from the stream. 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) class Visitor { 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Visitor() {} 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called when the stream is closed. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnClose(ReliableQuicStream* stream) = 0; 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) protected: 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual ~Visitor() {} 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(Visitor); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReliableQuicStream(QuicStreamId id, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session); 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ReliableQuicStream(); 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WillAcceptStreamFrame(const QuicStreamFrame& frame) const; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnStreamFrame(const QuicStreamFrame& frame); 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCanWrite(); 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called by the session just before the stream is deleted. 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnClose(); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we get a stream reset from the client. 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void OnStreamReset(QuicRstStreamErrorCode error); 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we get or send a connection close, and should immediately 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // close the stream. This is not passed through the sequencer, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but is handled immediately. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConnectionClose(QuicErrorCode error, bool from_peer); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called by the sequencer, when we should process a stream termination or 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // stream close from the peer. 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void TerminateFromPeer(bool half_close); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual uint32 ProcessData(const char* data, uint32 data_len) = 0; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to close the stream from this end. 71c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void Close(QuicRstStreamErrorCode error); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This block of functions wraps the sequencer's functions of the same 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // name. 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsHalfClosed() const; 76c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual bool IsClosed() const; 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool HasBytesToRead() const; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id() const { return id_; } 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicRstStreamErrorCode stream_error() const { return stream_error_; } 82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicErrorCode connection_error() const { return connection_error_; } 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool read_side_closed() const { return read_side_closed_; } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool write_side_closed() const { return write_side_closed_; } 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const IPEndPoint& GetPeerAddress() const; 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Visitor* visitor() { return visitor_; } 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void set_visitor(Visitor* visitor) { visitor_ = visitor; } 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 stream_bytes_read() const { return stream_bytes_read_; } 93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) uint64 stream_bytes_written() const { return stream_bytes_written_; } 94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns a pair with the number of bytes consumed from data, and a boolean 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // indicating if the fin bit was consumed. This does not indicate the data 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // has been sent on the wire: it may have been turned into a packet and queued 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // if the socket was unexpectedly blocked. 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The default implementation always consumed all bytes and any fin, but 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // this behavior is not guaranteed for subclasses so callers should check the 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // return value. 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual QuicConsumedData WriteData(base::StringPiece data, bool fin); 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the read side of the socket. Further frames will not be accepted. 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseReadSide(); 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the write side of the socket. Further writes will fail. 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseWriteSide(); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session() { return session_; } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends as much of 'data' to the connection as the connection will consume, 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // and then buffers any remaining data in queued_data_. 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns (data.size(), true) as it always consumed all data: it returns for 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // convenience to have the same return type as WriteDataInternal. 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicConsumedData WriteOrBuffer(base::StringPiece data, bool fin); 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Sends as much of 'data' to the connection as the connection will consume. 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Returns the number of bytes consumed by the connection. 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) QuicConsumedData WriteDataInternal(base::StringPiece data, bool fin); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class test::ReliableQuicStreamPeer; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class QuicStreamUtils; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<string> queued_data_; 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamSequencer sequencer_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id_; 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session_; 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Optional visitor of this stream to be notified when the stream is closed. 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Visitor* visitor_; 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Bytes read and written refer to payload bytes only: they do not include 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // framing, encryption overhead etc. 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 stream_bytes_read_; 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) uint64 stream_bytes_written_; 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Stream error code received from a RstStreamFrame or error code sent by the 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // visitor or sequencer in the RstStreamFrame. 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicRstStreamErrorCode stream_error_; 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Connection error code due to which the stream was closed. |stream_error_| 144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // is set to |QUIC_STREAM_CONNECTION_ERROR| when this happens and consumers 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // should check |connection_error_|. 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicErrorCode connection_error_; 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the read side is closed and further frames should be rejected. 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool read_side_closed_; 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the write side is closed, and further writes should fail. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool write_side_closed_; 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin_buffered_; 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool fin_sent_; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_RELIABLE_QUIC_STREAM_H_ 160