Line data Source code
1 : #pragma once 2 : 3 : #include <string> 4 : 5 : #include "envoy/network/listener.h" 6 : 7 : #include "source/common/quic/envoy_quic_server_crypto_stream_factory.h" 8 : #include "source/common/quic/envoy_quic_server_session.h" 9 : #include "source/common/quic/quic_stat_names.h" 10 : #include "source/server/listener_stats.h" 11 : 12 : #include "quiche/quic/core/quic_dispatcher.h" 13 : #include "quiche/quic/core/quic_utils.h" 14 : 15 : namespace Envoy { 16 : namespace Quic { 17 : 18 0 : #define QUIC_DISPATCHER_STATS(COUNTER) COUNTER(stateless_reset_packets_sent) 19 : 20 : struct QuicDispatcherStats { 21 : QUIC_DISPATCHER_STATS(GENERATE_COUNTER_STRUCT) 22 : }; 23 : 24 : // Dummy implementation only used by Google Quic. 25 : class EnvoyQuicCryptoServerStreamHelper : public quic::QuicCryptoServerStreamBase::Helper { 26 : public: 27 : // quic::QuicCryptoServerStream::Helper 28 : bool CanAcceptClientHello(const quic::CryptoHandshakeMessage& /*message*/, 29 : const quic::QuicSocketAddress& /*client_address*/, 30 : const quic::QuicSocketAddress& /*peer_address*/, 31 : const quic::QuicSocketAddress& /*self_address*/, 32 0 : std::string* /*error_details*/) const override { 33 0 : IS_ENVOY_BUG("Unexpected call to CanAcceptClientHello"); 34 0 : return false; 35 0 : } 36 : }; 37 : 38 : class EnvoyQuicTimeWaitListManager : public quic::QuicTimeWaitListManager { 39 : public: 40 : EnvoyQuicTimeWaitListManager(quic::QuicPacketWriter* writer, Visitor* visitor, 41 : const quic::QuicClock* clock, quic::QuicAlarmFactory* alarm_factory, 42 : QuicDispatcherStats& stats); 43 : 44 : void SendPublicReset(const quic::QuicSocketAddress& self_address, 45 : const quic::QuicSocketAddress& peer_address, 46 : quic::QuicConnectionId connection_id, bool ietf_quic, 47 : size_t received_packet_length, 48 : std::unique_ptr<quic::QuicPerPacketContext> packet_context) override; 49 : 50 : private: 51 : QuicDispatcherStats& stats_; 52 : }; 53 : 54 : class EnvoyQuicDispatcher : public quic::QuicDispatcher { 55 : public: 56 : EnvoyQuicDispatcher( 57 : const quic::QuicCryptoServerConfig* crypto_config, const quic::QuicConfig& quic_config, 58 : quic::QuicVersionManager* version_manager, 59 : std::unique_ptr<quic::QuicConnectionHelperInterface> helper, 60 : std::unique_ptr<quic::QuicAlarmFactory> alarm_factory, 61 : uint8_t expected_server_connection_id_length, Network::ConnectionHandler& connection_handler, 62 : Network::ListenerConfig& listener_config, Server::ListenerStats& listener_stats, 63 : Server::PerHandlerListenerStats& per_worker_stats, Event::Dispatcher& dispatcher, 64 : Network::Socket& listen_socket, QuicStatNames& quic_stat_names, 65 : EnvoyQuicCryptoServerStreamFactoryInterface& crypto_server_stream_factory, 66 : quic::ConnectionIdGeneratorInterface& generator); 67 : 68 : // quic::QuicDispatcher 69 : void OnConnectionClosed(quic::QuicConnectionId connection_id, quic::QuicErrorCode error, 70 : const std::string& error_details, 71 : quic::ConnectionCloseSource source) override; 72 : quic::QuicTimeWaitListManager* CreateQuicTimeWaitListManager() override; 73 : 74 : void closeConnectionsWithFilterChain(const Network::FilterChain* filter_chain); 75 : 76 : void updateListenerConfig(Network::ListenerConfig& new_listener_config); 77 : 78 : // Similar to quic::QuicDispatcher's ProcessPacket, but returns a bool. 79 : // @return false if the packet failed to dispatch, true if it succeeded. 80 : bool processPacket(const quic::QuicSocketAddress& self_address, 81 : const quic::QuicSocketAddress& peer_address, 82 : const quic::QuicReceivedPacket& packet); 83 : 84 : protected: 85 : // quic::QuicDispatcher 86 : std::unique_ptr<quic::QuicSession> CreateQuicSession( 87 : quic::QuicConnectionId server_connection_id, const quic::QuicSocketAddress& self_address, 88 : const quic::QuicSocketAddress& peer_address, absl::string_view alpn, 89 : const quic::ParsedQuicVersion& version, const quic::ParsedClientHello& parsed_chlo, 90 : quic::ConnectionIdGeneratorInterface& connection_id_generator) override; 91 : 92 : // quic::QuicDispatcher 93 : // Sets current_packet_dispatch_success_ to false for processPacket's return value, 94 : // then calls the parent class implementation. 95 : bool OnFailedToDispatchPacket(const quic::ReceivedPacketInfo& received_packet_info) override; 96 : 97 : private: 98 : Network::ConnectionHandler& connection_handler_; 99 : Network::ListenerConfig* listener_config_{nullptr}; 100 : Server::ListenerStats& listener_stats_; 101 : Server::PerHandlerListenerStats& per_worker_stats_; 102 : Event::Dispatcher& dispatcher_; 103 : Network::Socket& listen_socket_; 104 : QuicStatNames& quic_stat_names_; 105 : EnvoyQuicCryptoServerStreamFactoryInterface& crypto_server_stream_factory_; 106 : FilterChainToConnectionMap connections_by_filter_chain_; 107 : QuicDispatcherStats quic_stats_; 108 : QuicConnectionStats connection_stats_; 109 : bool current_packet_dispatch_success_; 110 : }; 111 : 112 : } // namespace Quic 113 : } // namespace Envoy