quic_session.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)// A QuicSession, which demuxes a single connection to individual streams.
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef NET_QUIC_QUIC_SESSION_H_
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define NET_QUIC_QUIC_SESSION_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/compiler_specific.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/hash_tables.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/base/ip_endpoint.h"
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "net/quic/blocked_list.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_connection.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_crypto_stream.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_packet_creator.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/quic_protocol.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "net/quic/reliable_quic_stream.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace net {
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicCryptoStream;
252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class ReliableQuicStream;
262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class VisitorShim;
272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace test {
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class QuicSessionPeer;
302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}  // namespace test
312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NET_EXPORT_PRIVATE QuicSession : public QuicConnectionVisitorInterface {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // CryptoHandshakeEvent enumerates the events generated by a QuicCryptoStream.
35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  enum CryptoHandshakeEvent {
36c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // ENCRYPTION_FIRST_ESTABLISHED indicates that a full client hello has been
37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // sent by a client and that subsequent packets will be encrypted. (Client
38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // only.)
39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ENCRYPTION_FIRST_ESTABLISHED,
40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // ENCRYPTION_REESTABLISHED indicates that a client hello was rejected by
41c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // the server and thus the encryption key has been updated. Therefore the
42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // connection should resend any packets that were sent under
43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // ENCRYPTION_INITIAL. (Client only.)
44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ENCRYPTION_REESTABLISHED,
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // HANDSHAKE_CONFIRMED, in a client, indicates the the server has accepted
46c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // our handshake. In a server it indicates that a full, valid client hello
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    // has been received. (Client and server.)
48c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    HANDSHAKE_CONFIRMED,
49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  };
50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicSession(QuicConnection* connection, bool is_server);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~QuicSession();
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // QuicConnectionVisitorInterface methods:
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool OnPacket(const IPEndPoint& self_address,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const IPEndPoint& peer_address,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const QuicPacketHeader& header,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        const std::vector<QuicStreamFrame>& frame) OVERRIDE;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnRstStream(const QuicRstStreamFrame& frame) OVERRIDE;
612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnGoAway(const QuicGoAwayFrame& frame) OVERRIDE;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void ConnectionClose(QuicErrorCode error, bool from_peer) OVERRIDE;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Not needed for HTTP.
642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void OnAck(const SequenceNumberSet& acked_packets) OVERRIDE {}
652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual bool OnCanWrite() OVERRIDE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by streams when they want to write data to the peer.
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns a pair with the number of bytes consumed from data, and a boolean
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // indicating if the fin bit was consumed.  This does not indicate the data
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // has been sent on the wire: it may have been turned into a packet and queued
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // if the socket was unexpectedly blocked.
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual QuicConsumedData WriteData(QuicStreamId id,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     base::StringPiece data,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     QuicStreamOffset offset,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                     bool fin);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Called by streams when they want to close the stream in both directions.
77c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void SendRstStream(QuicStreamId id, QuicRstStreamErrorCode error);
782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Called when the session wants to go away and not accept any new streams.
802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void SendGoAway(QuicErrorCode error_code, const std::string& reason);
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Removes the stream associated with 'stream_id' from the active stream map.
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void CloseStream(QuicStreamId stream_id);
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Returns true if outgoing packets will be encrypted, even if the server
86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // hasn't confirmed the handshake yet.
87c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsEncryptionEstablished();
88c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
89c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // For a client, returns true if the server has confirmed our handshake. For
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // a server, returns true if a full, valid client hello has been received.
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual bool IsCryptoHandshakeConfirmed();
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Called by the QuicCryptoStream when the handshake enters a new state.
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Clients will call this function in the order:
96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   ENCRYPTION_FIRST_ESTABLISHED
97c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   zero or more ENCRYPTION_REESTABLISHED
98c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //   HANDSHAKE_CONFIRMED
99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  //
100c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  // Servers will simply call it once with HANDSHAKE_CONFIRMED.
101c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  virtual void OnCryptoHandshakeEvent(CryptoHandshakeEvent event);
1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns true if the stream existed previously and has been closed.
1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Returns false if the stream is still active or if the stream has
1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // not yet been created.
1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool IsClosedStream(QuicStreamId id);
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicConnection* connection() { return connection_.get(); }
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t num_active_requests() const { return stream_map_.size(); }
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const IPEndPoint& peer_address() const {
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return connection_->peer_address();
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  QuicGuid guid() const { return connection_->guid(); }
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicPacketCreator::Options* options() { return connection()->options(); }
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the number of currently open streams, including those which have
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // been implicitly created.
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual size_t GetNumOpenStreams() const;
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  void MarkWriteBlocked(QuicStreamId id);
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool goaway_received() const {
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return goaway_received_;
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool goaway_sent() const {
1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return goaway_sent_;
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Creates a new stream, owned by the caller, to handle a peer-initiated
1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // stream.  Returns NULL and does error handling if the stream can not be
1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // created.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ReliableQuicStream* CreateIncomingReliableStream(QuicStreamId id) = 0;
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Create a new stream, owned by the caller, to handle a locally-initiated
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // stream.  Returns NULL if max streams have already been opened.
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ReliableQuicStream* CreateOutgoingReliableStream() = 0;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Return the reserved crypto stream.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual QuicCryptoStream* GetCryptoStream() = 0;
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Adds 'stream' to the active stream map.
1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void ActivateStream(ReliableQuicStream* stream);
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the stream id for a new stream.
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId GetNextStreamId();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReliableQuicStream* GetIncomingReliableStream(QuicStreamId stream_id);
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // This is called after every call other than OnConnectionClose from the
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // QuicConnectionVisitor to allow post-processing once the work has been done.
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // In this case, it deletes streams given that it's safe to do so (no other
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // operations are being done on the streams at this time)
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  virtual void PostProcessAfterData();
1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  base::hash_map<QuicStreamId, ReliableQuicStream*>* streams() {
1592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return &stream_map_;
1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<ReliableQuicStream*>* closed_streams() {
1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return &closed_streams_;
1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  }
1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size_t get_max_open_streams() const {
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return max_open_streams_;
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class test::QuicSessionPeer;
1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  friend class VisitorShim;
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  typedef base::hash_map<QuicStreamId, ReliableQuicStream*> ReliableStreamMap;
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReliableQuicStream* GetStream(const QuicStreamId stream_id);
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  scoped_ptr<QuicConnection> connection_;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A shim to stand between the connection and the session, to handle stream
1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // deletions.
1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  scoped_ptr<VisitorShim> visitor_shim_;
1822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  std::vector<ReliableQuicStream*> closed_streams_;
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns the maximum number of streams this connection can open.
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const size_t max_open_streams_;
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Map from StreamId to pointers to streams that are owned by the caller.
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ReliableStreamMap stream_map_;
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId next_stream_id_;
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool is_server_;
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Set of stream ids that have been "implicitly created" by receipt
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // of a stream id larger than the next expected stream id.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::hash_set<QuicStreamId> implicitly_created_streams_;
1962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // A list of streams which need to write more data.
1982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  BlockedList<QuicStreamId> write_blocked_streams_;
1992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  QuicStreamId largest_peer_created_stream_id_;
2012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether a GoAway has been received.
2032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool goaway_received_;
2042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Whether a GoAway has been sent.
2052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  bool goaway_sent_;
2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(QuicSession);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace net
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // NET_QUIC_QUIC_SESSION_H_
213