| // Copyright (c) 2019 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 QUICHE_QUIC_QBONE_QBONE_CLIENT_SESSION_H_ | 
 | #define QUICHE_QUIC_QBONE_QBONE_CLIENT_SESSION_H_ | 
 |  | 
 | #include "absl/strings/string_view.h" | 
 | #include "quic/core/quic_crypto_client_stream.h" | 
 | #include "quic/platform/api/quic_export.h" | 
 | #include "quic/qbone/qbone_control.pb.h" | 
 | #include "quic/qbone/qbone_control_stream.h" | 
 | #include "quic/qbone/qbone_packet_writer.h" | 
 | #include "quic/qbone/qbone_session_base.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | class QUIC_EXPORT_PRIVATE QboneClientSession | 
 |     : public QboneSessionBase, | 
 |       public QuicCryptoClientStream::ProofHandler { | 
 |  public: | 
 |   QboneClientSession(QuicConnection* connection, | 
 |                      QuicCryptoClientConfig* quic_crypto_client_config, | 
 |                      QuicSession::Visitor* owner, | 
 |                      const QuicConfig& config, | 
 |                      const ParsedQuicVersionVector& supported_versions, | 
 |                      const QuicServerId& server_id, | 
 |                      QbonePacketWriter* writer, | 
 |                      QboneClientControlStream::Handler* handler); | 
 |   QboneClientSession(const QboneClientSession&) = delete; | 
 |   QboneClientSession& operator=(const QboneClientSession&) = delete; | 
 |   ~QboneClientSession() override; | 
 |  | 
 |   // QuicSession overrides. This will initiate the crypto stream. | 
 |   void Initialize() override; | 
 |   // Override to create control stream at FORWARD_SECURE encryption level. | 
 |   void SetDefaultEncryptionLevel(quic::EncryptionLevel level) override; | 
 |  | 
 |   // Returns the number of client hello messages that have been sent on the | 
 |   // crypto stream. If the handshake has completed then this is one greater | 
 |   // than the number of round-trips needed for the handshake. | 
 |   int GetNumSentClientHellos() const; | 
 |  | 
 |   // Returns true if early data (0-RTT data) was sent and the server accepted | 
 |   // it. | 
 |   bool EarlyDataAccepted() const; | 
 |  | 
 |   // Returns true if the handshake was delayed one round trip by the server | 
 |   // because the server wanted proof the client controls its source address | 
 |   // before progressing further. In Google QUIC, this would be due to an | 
 |   // inchoate REJ in the QUIC Crypto handshake; in IETF QUIC this would be due | 
 |   // to a Retry packet. | 
 |   // TODO(nharper): Consider a better name for this method. | 
 |   bool ReceivedInchoateReject() const; | 
 |  | 
 |   int GetNumReceivedServerConfigUpdates() const; | 
 |  | 
 |   bool SendServerRequest(const QboneServerRequest& request); | 
 |  | 
 |   void ProcessPacketFromNetwork(absl::string_view packet) override; | 
 |   void ProcessPacketFromPeer(absl::string_view packet) override; | 
 |  | 
 |   // Returns true if there are active requests on this session. | 
 |   bool HasActiveRequests() const; | 
 |  | 
 |  protected: | 
 |   // QboneSessionBase interface implementation. | 
 |   std::unique_ptr<QuicCryptoStream> CreateCryptoStream() override; | 
 |  | 
 |   // Instantiate QboneClientControlStream. | 
 |   void CreateControlStream(); | 
 |  | 
 |   // ProofHandler interface implementation. | 
 |   void OnProofValid(const QuicCryptoClientConfig::CachedState& cached) override; | 
 |   void OnProofVerifyDetailsAvailable( | 
 |       const ProofVerifyDetails& verify_details) override; | 
 |  | 
 |   QuicServerId server_id() { return server_id_; } | 
 |   QuicCryptoClientConfig* crypto_client_config() { | 
 |     return quic_crypto_client_config_; | 
 |   } | 
 |  | 
 |  private: | 
 |   QuicServerId server_id_; | 
 |   // Config for QUIC crypto client stream, used by the client. | 
 |   QuicCryptoClientConfig* quic_crypto_client_config_; | 
 |   // Passed to the control stream. | 
 |   QboneClientControlStream::Handler* handler_; | 
 |   // The unowned control stream. | 
 |   QboneClientControlStream* control_stream_ = nullptr; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_QBONE_QBONE_CLIENT_SESSION_H_ |