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