Line data Source code
1 : #include "source/extensions/transport_sockets/tcp_stats/config.h" 2 : 3 : #include "envoy/extensions/transport_sockets/tcp_stats/v3/tcp_stats.pb.validate.h" 4 : #include "envoy/registry/registry.h" 5 : #include "envoy/server/transport_socket_config.h" 6 : 7 : #include "source/common/config/utility.h" 8 : #include "source/extensions/transport_sockets/tcp_stats/tcp_stats.h" 9 : 10 : namespace Envoy { 11 : namespace Extensions { 12 : namespace TransportSockets { 13 : namespace TcpStats { 14 : 15 : TcpStatsSocketFactory::TcpStatsSocketFactory( 16 : Server::Configuration::TransportSocketFactoryContext& context, 17 0 : const envoy::extensions::transport_sockets::tcp_stats::v3::Config& config) { 18 0 : #if defined(__linux__) 19 0 : config_ = std::make_shared<Config>(config, context.statsScope()); 20 : #else 21 : UNREFERENCED_PARAMETER(config); 22 : UNREFERENCED_PARAMETER(context); 23 : throw EnvoyException("envoy.transport_sockets.tcp_stats is not supported on this platform."); 24 : #endif 25 0 : } 26 : 27 : UpstreamTcpStatsSocketFactory::UpstreamTcpStatsSocketFactory( 28 : Server::Configuration::TransportSocketFactoryContext& context, 29 : const envoy::extensions::transport_sockets::tcp_stats::v3::Config& config, 30 : Network::UpstreamTransportSocketFactoryPtr&& inner_factory) 31 0 : : TcpStatsSocketFactory(context, config), PassthroughFactory(std::move(inner_factory)) {} 32 : 33 : Network::TransportSocketPtr UpstreamTcpStatsSocketFactory::createTransportSocket( 34 : Network::TransportSocketOptionsConstSharedPtr options, 35 0 : Upstream::HostDescriptionConstSharedPtr host) const { 36 0 : #if defined(__linux__) 37 0 : auto inner_socket = transport_socket_factory_->createTransportSocket(options, host); 38 0 : if (inner_socket == nullptr) { 39 0 : return nullptr; 40 0 : } 41 0 : return std::make_unique<TcpStatsSocket>(config_, std::move(inner_socket)); 42 : #else 43 : UNREFERENCED_PARAMETER(options); 44 : UNREFERENCED_PARAMETER(host); 45 : return nullptr; 46 : #endif 47 0 : } 48 : 49 : DownstreamTcpStatsSocketFactory::DownstreamTcpStatsSocketFactory( 50 : Server::Configuration::TransportSocketFactoryContext& context, 51 : const envoy::extensions::transport_sockets::tcp_stats::v3::Config& config, 52 : Network::DownstreamTransportSocketFactoryPtr&& inner_factory) 53 : : TcpStatsSocketFactory(context, config), 54 0 : DownstreamPassthroughFactory(std::move(inner_factory)) {} 55 : 56 : Network::TransportSocketPtr 57 0 : DownstreamTcpStatsSocketFactory::createDownstreamTransportSocket() const { 58 0 : #if defined(__linux__) 59 0 : auto inner_socket = transport_socket_factory_->createDownstreamTransportSocket(); 60 0 : if (inner_socket == nullptr) { 61 0 : return nullptr; 62 0 : } 63 0 : return std::make_unique<TcpStatsSocket>(config_, std::move(inner_socket)); 64 : #else 65 : return nullptr; 66 : #endif 67 0 : } 68 : 69 : class TcpStatsConfigFactory : public virtual Server::Configuration::TransportSocketConfigFactory { 70 : public: 71 76 : std::string name() const override { return "envoy.transport_sockets.tcp_stats"; } 72 2 : ProtobufTypes::MessagePtr createEmptyConfigProto() override { 73 2 : return std::make_unique<envoy::extensions::transport_sockets::tcp_stats::v3::Config>(); 74 2 : } 75 : }; 76 : 77 : class UpstreamTcpStatsConfigFactory 78 : : public Server::Configuration::UpstreamTransportSocketConfigFactory, 79 : public TcpStatsConfigFactory { 80 : public: 81 : Network::UpstreamTransportSocketFactoryPtr createTransportSocketFactory( 82 : const Protobuf::Message& config, 83 0 : Server::Configuration::TransportSocketFactoryContext& context) override { 84 0 : const auto& outer_config = MessageUtil::downcastAndValidate< 85 0 : const envoy::extensions::transport_sockets::tcp_stats::v3::Config&>( 86 0 : config, context.messageValidationVisitor()); 87 0 : auto& inner_config_factory = Envoy::Config::Utility::getAndCheckFactory< 88 0 : Server::Configuration::UpstreamTransportSocketConfigFactory>( 89 0 : outer_config.transport_socket()); 90 0 : ProtobufTypes::MessagePtr inner_factory_config = 91 0 : Envoy::Config::Utility::translateToFactoryConfig(outer_config.transport_socket(), 92 0 : context.messageValidationVisitor(), 93 0 : inner_config_factory); 94 0 : auto inner_transport_factory = 95 0 : inner_config_factory.createTransportSocketFactory(*inner_factory_config, context); 96 0 : return std::make_unique<UpstreamTcpStatsSocketFactory>(context, outer_config, 97 0 : std::move(inner_transport_factory)); 98 0 : } 99 : }; 100 : 101 : class DownstreamTcpStatsConfigFactory 102 : : public Server::Configuration::DownstreamTransportSocketConfigFactory, 103 : public TcpStatsConfigFactory { 104 : public: 105 : Network::DownstreamTransportSocketFactoryPtr 106 : createTransportSocketFactory(const Protobuf::Message& config, 107 : Server::Configuration::TransportSocketFactoryContext& context, 108 0 : const std::vector<std::string>& server_names) override { 109 0 : const auto& outer_config = MessageUtil::downcastAndValidate< 110 0 : const envoy::extensions::transport_sockets::tcp_stats::v3::Config&>( 111 0 : config, context.messageValidationVisitor()); 112 0 : auto& inner_config_factory = Envoy::Config::Utility::getAndCheckFactory< 113 0 : Server::Configuration::DownstreamTransportSocketConfigFactory>( 114 0 : outer_config.transport_socket()); 115 0 : ProtobufTypes::MessagePtr inner_factory_config = 116 0 : Envoy::Config::Utility::translateToFactoryConfig(outer_config.transport_socket(), 117 0 : context.messageValidationVisitor(), 118 0 : inner_config_factory); 119 0 : auto inner_transport_factory = inner_config_factory.createTransportSocketFactory( 120 0 : *inner_factory_config, context, server_names); 121 0 : return std::make_unique<DownstreamTcpStatsSocketFactory>(context, outer_config, 122 0 : std::move(inner_transport_factory)); 123 0 : } 124 : }; 125 : 126 : REGISTER_FACTORY(UpstreamTcpStatsConfigFactory, 127 : Server::Configuration::UpstreamTransportSocketConfigFactory); 128 : 129 : REGISTER_FACTORY(DownstreamTcpStatsConfigFactory, 130 : Server::Configuration::DownstreamTransportSocketConfigFactory); 131 : 132 : } // namespace TcpStats 133 : } // namespace TransportSockets 134 : } // namespace Extensions 135 : } // namespace Envoy