text: // 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_DISPATCHER_H_
  #define QUICHE_QUIC_MASQUE_MASQUE_DISPATCHER_H_
  
  #include "absl/container/flat_hash_map.h"
  #include "quic/masque/masque_server_backend.h"
  #include "quic/masque/masque_server_session.h"
  #include "quic/masque/masque_utils.h"
  #include "quic/platform/api/quic_epoll.h"
  #include "quic/platform/api/quic_export.h"
  #include "quic/tools/quic_simple_dispatcher.h"
  
  namespace quic {
  
  // QUIC dispatcher that handles new MASQUE connections and can proxy traffic
  // between MASQUE clients and QUIC servers.
  class QUIC_NO_EXPORT MasqueDispatcher : public QuicSimpleDispatcher,
                                          public MasqueServerSession::Visitor {
   public:
    explicit MasqueDispatcher(
        MasqueMode masque_mode,
        const QuicConfig* config,
        const QuicCryptoServerConfig* crypto_config,
        QuicVersionManager* version_manager,
        QuicEpollServer* epoll_server,
        std::unique_ptr<QuicConnectionHelperInterface> helper,
        std::unique_ptr<QuicCryptoServerStreamBase::Helper> session_helper,
        std::unique_ptr<QuicAlarmFactory> alarm_factory,
        MasqueServerBackend* masque_server_backend,
        uint8_t expected_server_connection_id_length);
  
    // Disallow copy and assign.
    MasqueDispatcher(const MasqueDispatcher&) = delete;
    MasqueDispatcher& operator=(const MasqueDispatcher&) = delete;
  
    // From QuicSimpleDispatcher.
    std::unique_ptr<QuicSession> CreateQuicSession(
        QuicConnectionId connection_id, const QuicSocketAddress& self_address,
        const QuicSocketAddress& peer_address, absl::string_view alpn,
        const ParsedQuicVersion& version,
        const quic::ParsedClientHello& parsed_chlo) override;
  
    bool OnFailedToDispatchPacket(const ReceivedPacketInfo& packet_info) override;
  
    // From MasqueServerSession::Visitor.
    void RegisterClientConnectionId(
        QuicConnectionId client_connection_id,
        MasqueServerSession* masque_server_session) override;
  
    void UnregisterClientConnectionId(
        QuicConnectionId client_connection_id) override;
  
   private:
    MasqueMode masque_mode_;
    QuicEpollServer* epoll_server_;               // Unowned.
    MasqueServerBackend* masque_server_backend_;  // Unowned.
    // Mapping from client connection IDs to server sessions, allows routing
    // incoming packets to the right MASQUE connection.
    absl::flat_hash_map<QuicConnectionId,
                        MasqueServerSession*,
                        QuicConnectionIdHash>
        client_connection_id_registrations_;
  };
  
  }  // namespace quic
  
  #endif  // QUICHE_QUIC_MASQUE_MASQUE_DISPATCHER_H_
  