| // Copyright 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_MASQUE_MASQUE_CLIENT_SESSION_H_ | 
 | #define QUICHE_QUIC_MASQUE_MASQUE_CLIENT_SESSION_H_ | 
 |  | 
 | #include "net/third_party/quiche/src/quic/core/http/quic_spdy_client_session.h" | 
 | #include "net/third_party/quiche/src/quic/masque/masque_compression_engine.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_export.h" | 
 | #include "net/third_party/quiche/src/quic/platform/api/quic_socket_address.h" | 
 | #include "net/third_party/quiche/src/common/platform/api/quiche_string_piece.h" | 
 |  | 
 | namespace quic { | 
 |  | 
 | // QUIC client session for connection to MASQUE proxy. This session establishes | 
 | // a connection to a MASQUE proxy and handles sending and receiving DATAGRAM | 
 | // frames for operation of the MASQUE protocol. Multiple end-to-end encapsulated | 
 | // sessions can then coexist inside this session. Once these are created, they | 
 | // need to be registered with this session. | 
 | class QUIC_NO_EXPORT MasqueClientSession : public QuicSpdyClientSession { | 
 |  public: | 
 |   // Interface meant to be implemented by the owner of the | 
 |   // MasqueClientSession instance. | 
 |   class QUIC_NO_EXPORT Owner { | 
 |    public: | 
 |     virtual ~Owner() {} | 
 |  | 
 |     // Notifies the owner that the client connection ID is no longer in use. | 
 |     virtual void UnregisterClientConnectionId( | 
 |         QuicConnectionId client_connection_id) = 0; | 
 |   }; | 
 |   // Interface meant to be implemented by encapsulated client sessions, i.e. | 
 |   // the end-to-end QUIC client sessions that run inside MASQUE encapsulation. | 
 |   class QUIC_NO_EXPORT EncapsulatedClientSession { | 
 |    public: | 
 |     virtual ~EncapsulatedClientSession() {} | 
 |  | 
 |     // Process packet that was just decapsulated. | 
 |     virtual void ProcessPacket(quiche::QuicheStringPiece packet, | 
 |                                QuicSocketAddress server_address) = 0; | 
 |   }; | 
 |  | 
 |   // Takes ownership of |connection|, but not of |crypto_config| or | 
 |   // |push_promise_index| or |owner|. All pointers must be non-null. Caller | 
 |   // must ensure that |push_promise_index| and |owner| stay valid for the | 
 |   // lifetime of the newly created MasqueClientSession. | 
 |   MasqueClientSession(const QuicConfig& config, | 
 |                       const ParsedQuicVersionVector& supported_versions, | 
 |                       QuicConnection* connection, | 
 |                       const QuicServerId& server_id, | 
 |                       QuicCryptoClientConfig* crypto_config, | 
 |                       QuicClientPushPromiseIndex* push_promise_index, | 
 |                       Owner* owner); | 
 |  | 
 |   // Disallow copy and assign. | 
 |   MasqueClientSession(const MasqueClientSession&) = delete; | 
 |   MasqueClientSession& operator=(const MasqueClientSession&) = delete; | 
 |  | 
 |   // From QuicSession. | 
 |   void OnMessageReceived(quiche::QuicheStringPiece message) override; | 
 |  | 
 |   void OnMessageAcked(QuicMessageId message_id, | 
 |                       QuicTime receive_timestamp) override; | 
 |  | 
 |   void OnMessageLost(QuicMessageId message_id) override; | 
 |  | 
 |   // Send encapsulated packet. | 
 |   void SendPacket(QuicConnectionId client_connection_id, | 
 |                   QuicConnectionId server_connection_id, | 
 |                   quiche::QuicheStringPiece packet, | 
 |                   const QuicSocketAddress& server_address); | 
 |  | 
 |   // Register encapsulated client. This allows clients that are encapsulated | 
 |   // within this MASQUE session to indicate they own a given client connection | 
 |   // ID so incoming packets with that connection ID are routed back to them. | 
 |   // Callers must not register a second different |encapsulated_client_session| | 
 |   // with the same |client_connection_id|. Every call must be matched with a | 
 |   // call to UnregisterConnectionId. | 
 |   void RegisterConnectionId( | 
 |       QuicConnectionId client_connection_id, | 
 |       EncapsulatedClientSession* encapsulated_client_session); | 
 |  | 
 |   // Unregister encapsulated client. |client_connection_id| must match a | 
 |   // value previously passed to RegisterConnectionId. | 
 |   void UnregisterConnectionId(QuicConnectionId client_connection_id); | 
 |  | 
 |  private: | 
 |   QuicUnorderedMap<QuicConnectionId, | 
 |                    EncapsulatedClientSession*, | 
 |                    QuicConnectionIdHash> | 
 |       client_connection_id_registrations_; | 
 |   Owner* owner_;  // Unowned; | 
 |   MasqueCompressionEngine compression_engine_; | 
 | }; | 
 |  | 
 | }  // namespace quic | 
 |  | 
 | #endif  // QUICHE_QUIC_MASQUE_MASQUE_CLIENT_SESSION_H_ |