|  | // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #ifndef NET_QUIC_QUIC_STREAM_FACTORY_H_ | 
|  | #define NET_QUIC_QUIC_STREAM_FACTORY_H_ | 
|  |  | 
|  | #include <list> | 
|  | #include <map> | 
|  | #include <set> | 
|  | #include <string> | 
|  | #include <vector> | 
|  |  | 
|  | #include "base/gtest_prod_util.h" | 
|  | #include "base/logging.h" | 
|  | #include "base/macros.h" | 
|  | #include "base/memory/weak_ptr.h" | 
|  | #include "base/time/tick_clock.h" | 
|  | #include "base/time/time.h" | 
|  | #include "net/base/address_list.h" | 
|  | #include "net/base/completion_once_callback.h" | 
|  | #include "net/base/host_port_pair.h" | 
|  | #include "net/base/net_export.h" | 
|  | #include "net/base/network_change_notifier.h" | 
|  | #include "net/base/proxy_server.h" | 
|  | #include "net/cert/cert_database.h" | 
|  | #include "net/http/http_server_properties.h" | 
|  | #include "net/http/http_stream_factory.h" | 
|  | #include "net/log/net_log_with_source.h" | 
|  | #include "net/quic/network_connection.h" | 
|  | #include "net/quic/quic_chromium_client_session.h" | 
|  | #include "net/quic/quic_clock_skew_detector.h" | 
|  | #include "net/quic/quic_session_key.h" | 
|  | #include "net/socket/client_socket_pool.h" | 
|  | #include "net/ssl/ssl_config_service.h" | 
|  | #include "net/third_party/quic/core/http/quic_client_push_promise_index.h" | 
|  | #include "net/third_party/quic/core/quic_config.h" | 
|  | #include "net/third_party/quic/core/quic_crypto_stream.h" | 
|  | #include "net/third_party/quic/core/quic_packets.h" | 
|  | #include "net/third_party/quic/core/quic_server_id.h" | 
|  | #include "net/third_party/quic/platform/api/quic_string_piece.h" | 
|  | #include "starboard/types.h" | 
|  |  | 
|  | namespace base { | 
|  | class Value; | 
|  | namespace trace_event { | 
|  | class ProcessMemoryDump; | 
|  | } | 
|  | }  // namespace base | 
|  |  | 
|  | namespace quic { | 
|  | class QuicAlarmFactory; | 
|  | class QuicClock; | 
|  | class QuicRandom; | 
|  | }  // namespace quic | 
|  |  | 
|  | namespace net { | 
|  |  | 
|  | class CTPolicyEnforcer; | 
|  | class CertVerifier; | 
|  | class ClientSocketFactory; | 
|  | class CTVerifier; | 
|  | class HostResolver; | 
|  | class HttpServerProperties; | 
|  | class NetLog; | 
|  | class QuicChromiumConnectionHelper; | 
|  | class QuicCryptoClientStreamFactory; | 
|  | class QuicServerInfo; | 
|  | class QuicStreamFactory; | 
|  | class SocketPerformanceWatcherFactory; | 
|  | class SocketTag; | 
|  | class TransportSecurityState; | 
|  |  | 
|  | namespace test { | 
|  | class QuicStreamFactoryPeer; | 
|  | }  // namespace test | 
|  |  | 
|  | // When a connection is idle for 30 seconds it will be closed. | 
|  | const int kIdleConnectionTimeoutSeconds = 30; | 
|  |  | 
|  | // Sessions can migrate if they have been idle for less than this period. | 
|  | const int kDefaultIdleSessionMigrationPeriodSeconds = 30; | 
|  |  | 
|  | // The maximum time allowed to have no retransmittable packets on the wire | 
|  | // (after sending the first retransmittable packet) if | 
|  | // |migrate_session_early_v2_| is true. PING frames will be sent as needed to | 
|  | // enforce this. | 
|  | const int64_t kDefaultRetransmittableOnWireTimeoutMillisecs = 100; | 
|  |  | 
|  | // The default maximum time QUIC session could be on non-default network before | 
|  | // migrate back to default network. | 
|  | const int64_t kMaxTimeOnNonDefaultNetworkSecs = 128; | 
|  |  | 
|  | // The default maximum number of migrations to non default network on write | 
|  | // error per network. | 
|  | const int64_t kMaxMigrationsToNonDefaultNetworkOnWriteError = 5; | 
|  |  | 
|  | // The default maximum number of migrations to non default network on path | 
|  | // degrading per network. | 
|  | const int64_t kMaxMigrationsToNonDefaultNetworkOnPathDegrading = 5; | 
|  |  | 
|  | enum QuicPlatformNotification { | 
|  | NETWORK_CONNECTED, | 
|  | NETWORK_MADE_DEFAULT, | 
|  | NETWORK_DISCONNECTED, | 
|  | NETWORK_SOON_TO_DISCONNECT, | 
|  | NETWORK_IP_ADDRESS_CHANGED, | 
|  | NETWORK_NOTIFICATION_MAX | 
|  | }; | 
|  |  | 
|  | // Encapsulates a pending request for a QuicChromiumClientSession. | 
|  | // If the request is still pending when it is destroyed, it will | 
|  | // cancel the request with the factory. | 
|  | class NET_EXPORT_PRIVATE QuicStreamRequest { | 
|  | public: | 
|  | explicit QuicStreamRequest(QuicStreamFactory* factory); | 
|  | ~QuicStreamRequest(); | 
|  |  | 
|  | // |cert_verify_flags| is bitwise OR'd of CertVerifier::VerifyFlags and it is | 
|  | // passed to CertVerifier::Verify. | 
|  | // |destination| will be resolved and resulting IPEndPoint used to open a | 
|  | // quic::QuicConnection.  This can be different than | 
|  | // HostPortPair::FromURL(url). | 
|  | int Request(const HostPortPair& destination, | 
|  | quic::QuicTransportVersion quic_version, | 
|  | PrivacyMode privacy_mode, | 
|  | RequestPriority priority, | 
|  | const SocketTag& socket_tag, | 
|  | int cert_verify_flags, | 
|  | const GURL& url, | 
|  | const NetLogWithSource& net_log, | 
|  | NetErrorDetails* net_error_details, | 
|  | CompletionOnceCallback failed_on_default_network_callback, | 
|  | CompletionOnceCallback callback); | 
|  |  | 
|  | // This function must be called after Request() returns ERR_IO_PENDING. | 
|  | // Returns true if Request() requires host resolution and it hasn't completed | 
|  | // yet. If true is returned, |callback| will run when host resolution | 
|  | // completes. It will be called with the result after host resolution during | 
|  | // the connection process. For example, if host resolution returns OK and then | 
|  | // crypto handshake returns ERR_IO_PENDING, then |callback| will run with | 
|  | // ERR_IO_PENDING. | 
|  | bool WaitForHostResolution(CompletionOnceCallback callback); | 
|  |  | 
|  | // Tells QuicStreamRequest it should expect OnHostResolutionComplete() | 
|  | // to be called in the future. | 
|  | void ExpectOnHostResolution(); | 
|  |  | 
|  | // Will be called by the associated QuicStreamFactory::Job when host | 
|  | // resolution completes asynchronously after Request(). | 
|  | void OnHostResolutionComplete(int rv); | 
|  |  | 
|  | void OnRequestComplete(int rv); | 
|  |  | 
|  | // Called when the original connection created on the default network for | 
|  | // |this| fails and a new connection has been created on the alternate | 
|  | // network. | 
|  | void OnConnectionFailedOnDefaultNetwork(); | 
|  |  | 
|  | // Helper method that calls |factory_|'s GetTimeDelayForWaitingJob(). It | 
|  | // returns the amount of time waiting job should be delayed. | 
|  | base::TimeDelta GetTimeDelayForWaitingJob() const; | 
|  |  | 
|  | // If host resolution is underway, changes the priority of the host resolver | 
|  | // request. | 
|  | void SetPriority(RequestPriority priority); | 
|  |  | 
|  | // Releases the handle to the QUIC session retrieved as a result of Request(). | 
|  | std::unique_ptr<QuicChromiumClientSession::Handle> ReleaseSessionHandle(); | 
|  |  | 
|  | // Sets |session_|. | 
|  | void SetSession(std::unique_ptr<QuicChromiumClientSession::Handle> session); | 
|  |  | 
|  | NetErrorDetails* net_error_details() { return net_error_details_; } | 
|  |  | 
|  | const QuicSessionKey& session_key() const { return session_key_; } | 
|  |  | 
|  | const NetLogWithSource& net_log() const { return net_log_; } | 
|  |  | 
|  | private: | 
|  | QuicStreamFactory* factory_; | 
|  | QuicSessionKey session_key_; | 
|  | NetLogWithSource net_log_; | 
|  | CompletionOnceCallback callback_; | 
|  | CompletionOnceCallback failed_on_default_network_callback_; | 
|  | NetErrorDetails* net_error_details_;  // Unowned. | 
|  | std::unique_ptr<QuicChromiumClientSession::Handle> session_; | 
|  |  | 
|  | // Set in Request(). If true, then OnHostResolutionComplete() is expected to | 
|  | // be called in the future. | 
|  | bool expect_on_host_resolution_; | 
|  | // Callback passed to WaitForHostResolution(). | 
|  | CompletionOnceCallback host_resolution_callback_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(QuicStreamRequest); | 
|  | }; | 
|  |  | 
|  | // A factory for fetching QuicChromiumClientSessions. | 
|  | class NET_EXPORT_PRIVATE QuicStreamFactory | 
|  | : public NetworkChangeNotifier::IPAddressObserver, | 
|  | public NetworkChangeNotifier::NetworkObserver, | 
|  | public CertDatabase::Observer { | 
|  | public: | 
|  | // This class encompasses |destination| and |server_id|. | 
|  | // |destination| is a HostPortPair which is resolved | 
|  | // and a quic::QuicConnection is made to the resulting IP address. | 
|  | // |server_id| identifies the origin of the request, | 
|  | // the crypto handshake advertises |server_id.host()| to the server, | 
|  | // and the certificate is also matched against |server_id.host()|. | 
|  | class NET_EXPORT_PRIVATE QuicSessionAliasKey { | 
|  | public: | 
|  | QuicSessionAliasKey() = default; | 
|  | QuicSessionAliasKey(const HostPortPair& destination, | 
|  | const QuicSessionKey& session_key); | 
|  | ~QuicSessionAliasKey() = default; | 
|  |  | 
|  | // Needed to be an element of std::set. | 
|  | bool operator<(const QuicSessionAliasKey& other) const; | 
|  | bool operator==(const QuicSessionAliasKey& other) const; | 
|  |  | 
|  | const HostPortPair& destination() const { return destination_; } | 
|  | const quic::QuicServerId& server_id() const { | 
|  | return session_key_.server_id(); | 
|  | } | 
|  | const QuicSessionKey& session_key() const { return session_key_; } | 
|  |  | 
|  | // Returns the estimate of dynamically allocated memory in bytes. | 
|  | size_t EstimateMemoryUsage() const; | 
|  |  | 
|  | private: | 
|  | HostPortPair destination_; | 
|  | QuicSessionKey session_key_; | 
|  | }; | 
|  |  | 
|  | QuicStreamFactory( | 
|  | NetLog* net_log, | 
|  | HostResolver* host_resolver, | 
|  | SSLConfigService* ssl_config_service, | 
|  | ClientSocketFactory* client_socket_factory, | 
|  | HttpServerProperties* http_server_properties, | 
|  | CertVerifier* cert_verifier, | 
|  | CTPolicyEnforcer* ct_policy_enforcer, | 
|  | TransportSecurityState* transport_security_state, | 
|  | CTVerifier* cert_transparency_verifier, | 
|  | SocketPerformanceWatcherFactory* socket_performance_watcher_factory, | 
|  | QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory, | 
|  | quic::QuicRandom* random_generator, | 
|  | quic::QuicClock* clock, | 
|  | size_t max_packet_length, | 
|  | const std::string& user_agent_id, | 
|  | bool store_server_configs_in_properties, | 
|  | bool close_sessions_on_ip_change, | 
|  | bool goway_sessions_on_ip_change, | 
|  | bool mark_quic_broken_when_network_blackholes, | 
|  | int idle_connection_timeout_seconds, | 
|  | int reduced_ping_timeout_seconds, | 
|  | int retransmittable_on_wire_timeout_milliseconds_, | 
|  | int max_time_before_crypto_handshake_seconds, | 
|  | int max_idle_time_before_crypto_handshake_seconds, | 
|  | bool migrate_sessions_on_network_change_v2, | 
|  | bool migrate_sessions_early_v2, | 
|  | bool retry_on_alternate_network_before_handshake, | 
|  | bool migrate_idle_sessions, | 
|  | base::TimeDelta idle_session_migration_period, | 
|  | base::TimeDelta max_time_on_non_default_network, | 
|  | int max_migrations_to_non_default_network_on_write_error, | 
|  | int max_migrations_to_non_default_network_on_path_degrading, | 
|  | bool allow_server_migration, | 
|  | bool race_stale_dns_on_connection, | 
|  | bool go_away_on_path_degrading, | 
|  | bool race_cert_verification, | 
|  | bool estimate_initial_rtt, | 
|  | bool headers_include_h2_stream_dependency, | 
|  | const quic::QuicTagVector& connection_options, | 
|  | const quic::QuicTagVector& client_connection_options, | 
|  | bool enable_socket_recv_optimization); | 
|  | ~QuicStreamFactory() override; | 
|  |  | 
|  | // Returns true if there is an existing session for |session_key| or if the | 
|  | // request can be pooled to an existing session to the IP address of | 
|  | // |destination|. | 
|  | bool CanUseExistingSession(const QuicSessionKey& session_key, | 
|  | const HostPortPair& destination); | 
|  |  | 
|  | // Fetches a QuicChromiumClientSession to |host_port_pair| which will be | 
|  | // owned by |request|. | 
|  | // If a matching session already exists, this method will return OK.  If no | 
|  | // matching session exists, this will return ERR_IO_PENDING and will invoke | 
|  | // OnRequestComplete asynchronously. | 
|  | int Create(const QuicSessionKey& session_key, | 
|  | const HostPortPair& destination, | 
|  | quic::QuicTransportVersion quic_version, | 
|  | RequestPriority priority, | 
|  | int cert_verify_flags, | 
|  | const GURL& url, | 
|  | const NetLogWithSource& net_log, | 
|  | QuicStreamRequest* request); | 
|  |  | 
|  | // Called by a session when it is going away and no more streams should be | 
|  | // created on it. | 
|  | void OnSessionGoingAway(QuicChromiumClientSession* session); | 
|  |  | 
|  | // Called by a session after it shuts down. | 
|  | void OnSessionClosed(QuicChromiumClientSession* session); | 
|  |  | 
|  | // Called by a session when it blackholes after the handshake is confirmed. | 
|  | void OnBlackholeAfterHandshakeConfirmed(QuicChromiumClientSession* session); | 
|  |  | 
|  | // Cancels a pending request. | 
|  | void CancelRequest(QuicStreamRequest* request); | 
|  |  | 
|  | // Sets priority of a request. | 
|  | void SetRequestPriority(QuicStreamRequest* request, RequestPriority priority); | 
|  |  | 
|  | // Closes all current sessions with specified network, QUIC error codes. | 
|  | // It sends connection close packet when closing connections. | 
|  | void CloseAllSessions(int error, quic::QuicErrorCode quic_error); | 
|  |  | 
|  | std::unique_ptr<base::Value> QuicStreamFactoryInfoToValue() const; | 
|  |  | 
|  | // Delete cached state objects in |crypto_config_|. If |origin_filter| is not | 
|  | // null, only objects on matching origins will be deleted. | 
|  | void ClearCachedStatesInCryptoConfig( | 
|  | const base::Callback<bool(const GURL&)>& origin_filter); | 
|  |  | 
|  | // Helper method that configures a DatagramClientSocket. Socket is | 
|  | // bound to the default network if the |network| param is | 
|  | // NetworkChangeNotifier::kInvalidNetworkHandle. | 
|  | // Returns net_error code. | 
|  | int ConfigureSocket(DatagramClientSocket* socket, | 
|  | IPEndPoint addr, | 
|  | NetworkChangeNotifier::NetworkHandle network, | 
|  | const SocketTag& socket_tag); | 
|  |  | 
|  | // Finds an alternative to |old_network| from the platform's list of connected | 
|  | // networks. Returns NetworkChangeNotifier::kInvalidNetworkHandle if no | 
|  | // alternative is found. | 
|  | NetworkChangeNotifier::NetworkHandle FindAlternateNetwork( | 
|  | NetworkChangeNotifier::NetworkHandle old_network); | 
|  |  | 
|  | // Creates a datagram socket. |source| is the NetLogSource for the entity | 
|  | // trying to create the socket, if it has one. | 
|  | std::unique_ptr<DatagramClientSocket> CreateSocket( | 
|  | NetLog* net_log, | 
|  | const NetLogSource& source); | 
|  |  | 
|  | // NetworkChangeNotifier::IPAddressObserver methods: | 
|  |  | 
|  | // Until the servers support roaming, close all connections when the local | 
|  | // IP address changes. | 
|  | void OnIPAddressChanged() override; | 
|  |  | 
|  | // NetworkChangeNotifier::NetworkObserver methods: | 
|  | void OnNetworkConnected( | 
|  | NetworkChangeNotifier::NetworkHandle network) override; | 
|  | void OnNetworkDisconnected( | 
|  | NetworkChangeNotifier::NetworkHandle network) override; | 
|  | void OnNetworkSoonToDisconnect( | 
|  | NetworkChangeNotifier::NetworkHandle network) override; | 
|  | void OnNetworkMadeDefault( | 
|  | NetworkChangeNotifier::NetworkHandle network) override; | 
|  |  | 
|  | // CertDatabase::Observer methods: | 
|  |  | 
|  | // We close all sessions when certificate database is changed. | 
|  | void OnCertDBChanged() override; | 
|  |  | 
|  | bool require_confirmation() const { return require_confirmation_; } | 
|  |  | 
|  | bool allow_server_migration() const { return allow_server_migration_; } | 
|  |  | 
|  | void set_require_confirmation(bool require_confirmation); | 
|  |  | 
|  | // It returns the amount of time waiting job should be delayed. | 
|  | base::TimeDelta GetTimeDelayForWaitingJob( | 
|  | const quic::QuicServerId& server_id); | 
|  |  | 
|  | QuicChromiumConnectionHelper* helper() { return helper_.get(); } | 
|  |  | 
|  | quic::QuicAlarmFactory* alarm_factory() { return alarm_factory_.get(); } | 
|  |  | 
|  | void set_server_push_delegate(ServerPushDelegate* push_delegate) { | 
|  | push_delegate_ = push_delegate; | 
|  | } | 
|  |  | 
|  | bool mark_quic_broken_when_network_blackholes() const { | 
|  | return mark_quic_broken_when_network_blackholes_; | 
|  | } | 
|  |  | 
|  | NetworkChangeNotifier::NetworkHandle default_network() const { | 
|  | return default_network_; | 
|  | } | 
|  |  | 
|  | // Dumps memory allocation stats. |parent_dump_absolute_name| is the name | 
|  | // used by the parent MemoryAllocatorDump in the memory dump hierarchy. | 
|  | void DumpMemoryStats(base::trace_event::ProcessMemoryDump* pmd, | 
|  | const std::string& parent_absolute_name) const; | 
|  |  | 
|  | private: | 
|  | class Job; | 
|  | class CertVerifierJob; | 
|  | friend class test::QuicStreamFactoryPeer; | 
|  |  | 
|  | typedef std::map<QuicSessionKey, QuicChromiumClientSession*> SessionMap; | 
|  | typedef std::map<QuicChromiumClientSession*, QuicSessionAliasKey> | 
|  | SessionIdMap; | 
|  | typedef std::set<QuicSessionAliasKey> AliasSet; | 
|  | typedef std::map<QuicChromiumClientSession*, AliasSet> SessionAliasMap; | 
|  | typedef std::set<QuicChromiumClientSession*> SessionSet; | 
|  | typedef std::map<IPEndPoint, SessionSet> IPAliasMap; | 
|  | typedef std::map<QuicChromiumClientSession*, IPEndPoint> SessionPeerIPMap; | 
|  | typedef std::map<QuicSessionKey, std::unique_ptr<Job>> JobMap; | 
|  | typedef std::map<quic::QuicServerId, std::unique_ptr<CertVerifierJob>> | 
|  | CertVerifierJobMap; | 
|  |  | 
|  | bool HasMatchingIpSession(const QuicSessionAliasKey& key, | 
|  | const AddressList& address_list); | 
|  | void OnJobComplete(Job* job, int rv); | 
|  | void OnCertVerifyJobComplete(CertVerifierJob* job, int rv); | 
|  | bool HasActiveSession(const QuicSessionKey& session_key) const; | 
|  | bool HasActiveJob(const QuicSessionKey& session_key) const; | 
|  | bool HasActiveCertVerifierJob(const quic::QuicServerId& server_id) const; | 
|  | int CreateSession(const QuicSessionAliasKey& key, | 
|  | const quic::QuicTransportVersion& quic_version, | 
|  | int cert_verify_flags, | 
|  | bool require_confirmation, | 
|  | const AddressList& address_list, | 
|  | base::TimeTicks dns_resolution_start_time, | 
|  | base::TimeTicks dns_resolution_end_time, | 
|  | const NetLogWithSource& net_log, | 
|  | QuicChromiumClientSession** session, | 
|  | NetworkChangeNotifier::NetworkHandle* network); | 
|  | void ActivateSession(const QuicSessionAliasKey& key, | 
|  | QuicChromiumClientSession* session); | 
|  | void MarkAllActiveSessionsGoingAway(); | 
|  |  | 
|  | void ConfigureInitialRttEstimate(const quic::QuicServerId& server_id, | 
|  | quic::QuicConfig* config); | 
|  |  | 
|  | // Returns |srtt| in micro seconds from ServerNetworkStats. Returns 0 if there | 
|  | // is no |http_server_properties_| or if |http_server_properties_| doesn't | 
|  | // have ServerNetworkStats for the given |server_id|. | 
|  | int64_t GetServerNetworkStatsSmoothedRttInMicroseconds( | 
|  | const quic::QuicServerId& server_id) const; | 
|  |  | 
|  | // Returns |srtt| from ServerNetworkStats. Returns null if there | 
|  | // is no |http_server_properties_| or if |http_server_properties_| doesn't | 
|  | // have ServerNetworkStats for the given |server_id|. | 
|  | const base::TimeDelta* GetServerNetworkStatsSmoothedRtt( | 
|  | const quic::QuicServerId& server_id) const; | 
|  |  | 
|  | // Helper methods. | 
|  | bool WasQuicRecentlyBroken(const quic::QuicServerId& server_id) const; | 
|  |  | 
|  | bool CryptoConfigCacheIsEmpty(const quic::QuicServerId& server_id); | 
|  |  | 
|  | // Starts an asynchronous job for cert verification if | 
|  | // |race_cert_verification_| is enabled and if there are cached certs for the | 
|  | // given |server_id|. | 
|  | quic::QuicAsyncStatus StartCertVerifyJob(const quic::QuicServerId& server_id, | 
|  | int cert_verify_flags, | 
|  | const NetLogWithSource& net_log); | 
|  |  | 
|  | // Initializes the cached state associated with |server_id| in | 
|  | // |crypto_config_| with the information in |server_info|. Populates | 
|  | // |connection_id| with the next server designated connection id, | 
|  | // if any, and otherwise leaves it unchanged. | 
|  | void InitializeCachedStateInCryptoConfig( | 
|  | const quic::QuicServerId& server_id, | 
|  | const std::unique_ptr<QuicServerInfo>& server_info, | 
|  | quic::QuicConnectionId* connection_id); | 
|  |  | 
|  | void ProcessGoingAwaySession(QuicChromiumClientSession* session, | 
|  | const quic::QuicServerId& server_id, | 
|  | bool was_session_active); | 
|  |  | 
|  | bool require_confirmation_; | 
|  | NetLog* net_log_; | 
|  | HostResolver* host_resolver_; | 
|  | ClientSocketFactory* client_socket_factory_; | 
|  | HttpServerProperties* http_server_properties_; | 
|  | ServerPushDelegate* push_delegate_; | 
|  | TransportSecurityState* transport_security_state_; | 
|  | CTVerifier* cert_transparency_verifier_; | 
|  | QuicCryptoClientStreamFactory* quic_crypto_client_stream_factory_; | 
|  | quic::QuicRandom* random_generator_;  // Unowned. | 
|  | quic::QuicClock* clock_;              // Unowned. | 
|  | const size_t max_packet_length_; | 
|  | QuicClockSkewDetector clock_skew_detector_; | 
|  |  | 
|  | // Factory which is used to create socket performance watcher. A new watcher | 
|  | // is created for every QUIC connection. | 
|  | // |socket_performance_watcher_factory_| may be null. | 
|  | SocketPerformanceWatcherFactory* socket_performance_watcher_factory_; | 
|  |  | 
|  | // The helper used for all connections. | 
|  | std::unique_ptr<QuicChromiumConnectionHelper> helper_; | 
|  |  | 
|  | // The alarm factory used for all connections. | 
|  | std::unique_ptr<quic::QuicAlarmFactory> alarm_factory_; | 
|  |  | 
|  | // Contains owning pointers to all sessions that currently exist. | 
|  | SessionIdMap all_sessions_; | 
|  | // Contains non-owning pointers to currently active session | 
|  | // (not going away session, once they're implemented). | 
|  | SessionMap active_sessions_; | 
|  | // Map from session to set of aliases that this session is known by. | 
|  | SessionAliasMap session_aliases_; | 
|  | // Map from IP address to sessions which are connected to this address. | 
|  | IPAliasMap ip_aliases_; | 
|  | // Map from session to its original peer IP address. | 
|  | SessionPeerIPMap session_peer_ip_; | 
|  |  | 
|  | // Origins which have gone away recently. | 
|  | AliasSet gone_away_aliases_; | 
|  |  | 
|  | const quic::QuicConfig config_; | 
|  | quic::QuicCryptoClientConfig crypto_config_; | 
|  |  | 
|  | JobMap active_jobs_; | 
|  |  | 
|  | // Map of quic::QuicServerId to owning CertVerifierJob. | 
|  | CertVerifierJobMap active_cert_verifier_jobs_; | 
|  |  | 
|  | // True if QUIC should be marked as broken when a connection blackholes after | 
|  | // the handshake is confirmed. | 
|  | bool mark_quic_broken_when_network_blackholes_; | 
|  |  | 
|  | // Set if QUIC server configs should be stored in HttpServerProperties. | 
|  | bool store_server_configs_in_properties_; | 
|  |  | 
|  | // PING timeout for connections. | 
|  | quic::QuicTime::Delta ping_timeout_; | 
|  | quic::QuicTime::Delta reduced_ping_timeout_; | 
|  |  | 
|  | // Timeout for how long the wire can have no retransmittable packets. | 
|  | quic::QuicTime::Delta retransmittable_on_wire_timeout_; | 
|  |  | 
|  | // If more than |yield_after_packets_| packets have been read or more than | 
|  | // |yield_after_duration_| time has passed, then | 
|  | // QuicChromiumPacketReader::StartReading() yields by doing a PostTask(). | 
|  | int yield_after_packets_; | 
|  | quic::QuicTime::Delta yield_after_duration_; | 
|  |  | 
|  | // Set if all sessions should be closed when any local IP address changes. | 
|  | const bool close_sessions_on_ip_change_; | 
|  |  | 
|  | // Set if all sessions should be marked as go away when any local IP address | 
|  | // changes. | 
|  | const bool goaway_sessions_on_ip_change_; | 
|  |  | 
|  | // Set if migration should be attempted after probing. | 
|  | const bool migrate_sessions_on_network_change_v2_; | 
|  |  | 
|  | // Set if early migration should be attempted after probing when the | 
|  | // connection experiences poor connectivity. | 
|  | const bool migrate_sessions_early_v2_; | 
|  |  | 
|  | // Set if a new connection may be kicked off on an alternate network when a | 
|  | // connection fails on the default network before handshake is confirmed. | 
|  | const bool retry_on_alternate_network_before_handshake_; | 
|  |  | 
|  | // If |migrate_sessions_early_v2_| is true, tracks the current default | 
|  | // network, and is updated OnNetworkMadeDefault. | 
|  | // Otherwise, always set to NetworkChangeNotifier::kInvalidNetwork. | 
|  | NetworkChangeNotifier::NetworkHandle default_network_; | 
|  |  | 
|  | // Set if idle sessions can be migrated within | 
|  | // |idle_session_migration_period_| when connection migration is triggered. | 
|  | const bool migrate_idle_sessions_; | 
|  |  | 
|  | // Sessions can migrate if they have been idle for less than this period. | 
|  | const base::TimeDelta idle_session_migration_period_; | 
|  |  | 
|  | // Maximum time sessions could use on non-default network before try to | 
|  | // migrate back to default network. | 
|  | const base::TimeDelta max_time_on_non_default_network_; | 
|  |  | 
|  | // Maximum number of migrations to non default network on write error. | 
|  | const int max_migrations_to_non_default_network_on_write_error_; | 
|  |  | 
|  | // Maximum number of migrations to non default network on path degrading. | 
|  | const int max_migrations_to_non_default_network_on_path_degrading_; | 
|  |  | 
|  | // If set, allows migration of connection to server-specified alternate | 
|  | // server address. | 
|  | const bool allow_server_migration_; | 
|  |  | 
|  | // Set if stale DNS result may be speculatively used to connect and then | 
|  | // compared with the original DNS result. | 
|  | const bool race_stale_dns_on_connection_; | 
|  |  | 
|  | // Set if client should mark the session as GOAWAY when the connection | 
|  | // experiences poor connectivity | 
|  | const bool go_away_on_path_degrading_; | 
|  |  | 
|  | // Set if cert verification is to be raced with host resolution. | 
|  | bool race_cert_verification_; | 
|  |  | 
|  | // If true, estimate the initial RTT based on network type. | 
|  | bool estimate_initial_rtt; | 
|  |  | 
|  | // If true, client headers will include HTTP/2 stream dependency info | 
|  | // derived from spdy::SpdyPriority. | 
|  | bool headers_include_h2_stream_dependency_; | 
|  |  | 
|  | // Local address of socket that was created in CreateSession. | 
|  | IPEndPoint local_address_; | 
|  | // True if we need to check HttpServerProperties if QUIC was supported last | 
|  | // time. | 
|  | bool need_to_check_persisted_supports_quic_; | 
|  |  | 
|  | NetworkConnection network_connection_; | 
|  |  | 
|  | int num_push_streams_created_; | 
|  |  | 
|  | quic::QuicClientPushPromiseIndex push_promise_index_; | 
|  |  | 
|  | const base::TickClock* tick_clock_; | 
|  |  | 
|  | base::SequencedTaskRunner* task_runner_; | 
|  |  | 
|  | SSLConfigService* const ssl_config_service_; | 
|  |  | 
|  | // If set to true, the stream factory will create UDP Sockets with | 
|  | // experimental optimization enabled for receiving data. | 
|  | bool enable_socket_recv_optimization_; | 
|  |  | 
|  | base::WeakPtrFactory<QuicStreamFactory> weak_factory_; | 
|  |  | 
|  | DISALLOW_COPY_AND_ASSIGN(QuicStreamFactory); | 
|  | }; | 
|  |  | 
|  | }  // namespace net | 
|  |  | 
|  | #endif  // NET_QUIC_QUIC_STREAM_FACTORY_H_ |