1 // Copyright 2014 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 // A server specific QuicSession subclass. 6 7 #ifndef NET_QUIC_QUIC_SERVER_SESSION_H_ 8 #define NET_QUIC_QUIC_SERVER_SESSION_H_ 9 10 #include <set> 11 #include <vector> 12 13 #include "base/basictypes.h" 14 #include "base/containers/hash_tables.h" 15 #include "base/memory/scoped_ptr.h" 16 #include "net/quic/quic_crypto_server_stream.h" 17 #include "net/quic/quic_per_connection_packet_writer.h" 18 #include "net/quic/quic_protocol.h" 19 #include "net/quic/quic_session.h" 20 21 namespace net { 22 23 class QuicBlockedWriterInterface; 24 class QuicConfig; 25 class QuicConnection; 26 class QuicCryptoServerConfig; 27 class ReliableQuicStream; 28 29 namespace test { 30 class QuicServerSessionPeer; 31 } // namespace test 32 33 // An interface from the session to the entity owning the session. 34 // This lets the session notify its owner (the Dispatcher) when the connection 35 // is closed or blocked. 36 class QuicServerSessionVisitor { 37 public: 38 virtual ~QuicServerSessionVisitor() {} 39 40 virtual void OnConnectionClosed(QuicConnectionId connection_id, 41 QuicErrorCode error) = 0; 42 virtual void OnWriteBlocked(QuicBlockedWriterInterface* blocked_writer) = 0; 43 }; 44 45 class QuicServerSession : public QuicSession { 46 public: 47 QuicServerSession(const QuicConfig& config, 48 QuicConnection* connection, 49 QuicServerSessionVisitor* visitor); 50 51 // Override the base class to notify the owner of the connection close. 52 virtual void OnConnectionClosed(QuicErrorCode error, bool from_peer) OVERRIDE; 53 virtual void OnWriteBlocked() OVERRIDE; 54 55 // Sends a server config update to the client, containing new bandwidth 56 // estimate. 57 virtual void OnCongestionWindowChange(QuicTime now) OVERRIDE; 58 59 virtual ~QuicServerSession(); 60 61 virtual void InitializeSession(const QuicCryptoServerConfig& crypto_config); 62 63 const QuicCryptoServerStream* crypto_stream() const { 64 return crypto_stream_.get(); 65 } 66 67 // Override base class to process FEC config received from client. 68 virtual void OnConfigNegotiated() OVERRIDE; 69 70 void set_serving_region(string serving_region) { 71 serving_region_ = serving_region; 72 } 73 74 protected: 75 // QuicSession methods: 76 virtual QuicDataStream* CreateIncomingDataStream(QuicStreamId id) OVERRIDE; 77 virtual QuicDataStream* CreateOutgoingDataStream() OVERRIDE; 78 virtual QuicCryptoServerStream* GetCryptoStream() OVERRIDE; 79 80 // If we should create an incoming stream, returns true. Otherwise 81 // does error handling, including communicating the error to the client and 82 // possibly closing the connection, and returns false. 83 virtual bool ShouldCreateIncomingDataStream(QuicStreamId id); 84 85 virtual QuicCryptoServerStream* CreateQuicCryptoServerStream( 86 const QuicCryptoServerConfig& crypto_config); 87 88 private: 89 friend class test::QuicServerSessionPeer; 90 91 scoped_ptr<QuicCryptoServerStream> crypto_stream_; 92 QuicServerSessionVisitor* visitor_; 93 94 // The most recent bandwidth estimate sent to the client. 95 QuicBandwidth bandwidth_estimate_sent_to_client_; 96 97 // Text describing server location. Sent to the client as part of the bandwith 98 // estimate in the source-address token. Optional, can be left empty. 99 string serving_region_; 100 101 // Time at which we send the last SCUP to the client. 102 QuicTime last_server_config_update_time_; 103 104 DISALLOW_COPY_AND_ASSIGN(QuicServerSession); 105 }; 106 107 } // namespace net 108 109 #endif // NET_QUIC_QUIC_SERVER_SESSION_H_ 110