reliable_quic_stream.h revision a1401311d1ab56c4ed0a474bd38c108f75cb0cd9
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) 145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/basictypes.h" 15b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "base/strings/string_piece.h" 16b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/base/iovec.h" 17b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)#include "net/base/net_export.h" 18f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "net/quic/quic_ack_notifier.h" 195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "net/quic/quic_protocol.h" 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_stream_sequencer.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test { 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ReliableQuicStreamPeer; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace test 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class IPEndPoint; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class QuicSession; 307dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochclass SSLInfo; 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class NET_EXPORT_PRIVATE ReliableQuicStream { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ReliableQuicStream(QuicStreamId id, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ReliableQuicStream(); 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool WillAcceptStreamFrame(const QuicStreamFrame& frame) const; 40a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Called when a (potentially duplicate) stream frame has been received 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // for this stream. Returns false if this frame can not be accepted 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // because there is too much data already buffered. 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool OnStreamFrame(const QuicStreamFrame& frame); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Called when the connection becomes writeable to allow the stream 47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // to write any pending data. 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnCanWrite(); 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Called by the session just before the stream is deleted. 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void OnClose(); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 53a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Called when we get a stream reset from the peer. 545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void OnStreamReset(const QuicRstStreamFrame& frame); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called when we get or send a connection close, and should immediately 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // close the stream. This is not passed through the sequencer, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // but is handled immediately. 591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer); 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 61a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Called when the final data has been read. 62a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void OnFinRead(); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual uint32 ProcessRawData(const char* data, uint32 data_len) = 0; 65b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 66a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Called to reset the stream from this end. 67a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void Reset(QuicRstStreamErrorCode error); 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // Called to close the entire connection from this end. 701e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void CloseConnection(QuicErrorCode error); 711e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) virtual void CloseConnectionWithDetails(QuicErrorCode error, 721e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) const string& details); 731e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the effective priority for the stream. This value may change 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // during the life of the stream. 765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual QuicPriority EffectivePriority() const = 0; 77d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id() const { return id_; } 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicRstStreamErrorCode stream_error() const { return stream_error_; } 81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) QuicErrorCode connection_error() const { return connection_error_; } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool read_side_closed() const { return read_side_closed_; } 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool write_side_closed() const { return write_side_closed_; } 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 86a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint64 stream_bytes_read() const { return stream_bytes_read_; } 87a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) uint64 stream_bytes_written() const { return stream_bytes_written_; } 88b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 89a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) QuicVersion version() const; 9090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_fin_sent(bool fin_sent) { fin_sent_ = fin_sent; } 925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void set_rst_sent(bool rst_sent) { rst_sent_ = rst_sent; } 932385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sends as much of 'data' to the connection as the connection will consume, 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // and then buffers any remaining data in queued_data_. 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void WriteOrBufferData(base::StringPiece data, bool fin); 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sends as many bytes in the first |count| buffers of |iov| to the connection 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // as the connection will consume. 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // If |ack_notifier_delegate| is provided, then it will be notified once all 1025d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // the ACKs for this write have been received. 1035d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Returns the number of bytes consumed by the connection. 1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicConsumedData WritevData( 1055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const struct iovec* iov, 1065d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) int iov_count, 1075d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool fin, 1085d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicAckNotifier::DelegateInterface* ack_notifier_delegate); 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the read side of the socket. Further frames will not be accepted. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseReadSide(); 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close the write side of the socket. Further writes will fail. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CloseWriteSide(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 11658537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) bool HasBufferedData(); 11758537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles) 118b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) bool fin_buffered() { return fin_buffered_; } 119b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) 120a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const QuicSession* session() const { return session_; } 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session() { return session_; } 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const QuicStreamSequencer* sequencer() const { return &sequencer_; } 1245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) QuicStreamSequencer* sequencer() { return &sequencer_; } 125d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles) 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class test::ReliableQuicStreamPeer; 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend class QuicStreamUtils; 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::list<string> queued_data_; 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamSequencer sequencer_; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicStreamId id_; 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) QuicSession* session_; 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_; 1551e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // In combination with fin_sent_, used to ensure that a FIN and/or a RST is 1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // always sent before stream termination. 1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool rst_sent_; 1595d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) // True if the session this stream is running under is a server session. 1611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) bool is_server_; 1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ReliableQuicStream); 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace net 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // NET_QUIC_RELIABLE_QUIC_STREAM_H_ 169