Line data Source code
1 : #pragma once 2 : 3 : #include "envoy/config/core/v3/proxy_protocol.pb.h" 4 : #include "envoy/network/connection.h" 5 : #include "envoy/network/transport_socket.h" 6 : #include "envoy/stats/stats.h" 7 : 8 : #include "source/common/buffer/buffer_impl.h" 9 : #include "source/common/common/logger.h" 10 : #include "source/extensions/transport_sockets/common/passthrough.h" 11 : 12 : using envoy::config::core::v3::ProxyProtocolConfig; 13 : using envoy::config::core::v3::ProxyProtocolConfig_Version; 14 : 15 : namespace Envoy { 16 : namespace Extensions { 17 : namespace TransportSockets { 18 : namespace ProxyProtocol { 19 : 20 : #define ALL_PROXY_PROTOCOL_TRANSPORT_SOCKET_STATS(COUNTER) \ 21 : /* Upstream events counter. */ \ 22 0 : COUNTER(v2_tlvs_exceed_max_length) 23 : 24 : /** 25 : * Wrapper struct for upstream ProxyProtocol stats. @see stats_macros.h 26 : */ 27 : struct UpstreamProxyProtocolStats { 28 : ALL_PROXY_PROTOCOL_TRANSPORT_SOCKET_STATS(GENERATE_COUNTER_STRUCT) 29 : }; 30 : 31 : class UpstreamProxyProtocolSocket : public TransportSockets::PassthroughSocket, 32 : public Logger::Loggable<Logger::Id::connection> { 33 : public: 34 : UpstreamProxyProtocolSocket(Network::TransportSocketPtr&& transport_socket, 35 : Network::TransportSocketOptionsConstSharedPtr options, 36 : ProxyProtocolConfig config, Stats::Scope& scope); 37 : 38 : void setTransportSocketCallbacks(Network::TransportSocketCallbacks& callbacks) override; 39 : Network::IoResult doWrite(Buffer::Instance& buffer, bool end_stream) override; 40 : void onConnected() override; 41 : 42 : private: 43 : void generateHeader(); 44 : void generateHeaderV1(); 45 : void generateHeaderV2(); 46 : Network::IoResult writeHeader(); 47 : 48 : Network::TransportSocketOptionsConstSharedPtr options_; 49 : Network::TransportSocketCallbacks* callbacks_{}; 50 : Buffer::OwnedImpl header_buffer_{}; 51 : ProxyProtocolConfig_Version version_{ProxyProtocolConfig_Version::ProxyProtocolConfig_Version_V1}; 52 : UpstreamProxyProtocolStats stats_; 53 : const bool pass_all_tlvs_; 54 : absl::flat_hash_set<uint8_t> pass_through_tlvs_{}; 55 : }; 56 : 57 : class UpstreamProxyProtocolSocketFactory : public PassthroughFactory { 58 : public: 59 : UpstreamProxyProtocolSocketFactory( 60 : Network::UpstreamTransportSocketFactoryPtr transport_socket_factory, 61 : ProxyProtocolConfig config, Stats::Scope& scope); 62 : 63 : // Network::UpstreamTransportSocketFactory 64 : Network::TransportSocketPtr 65 : createTransportSocket(Network::TransportSocketOptionsConstSharedPtr options, 66 : Upstream::HostDescriptionConstSharedPtr host) const override; 67 : void hashKey(std::vector<uint8_t>& key, 68 : Network::TransportSocketOptionsConstSharedPtr options) const override; 69 : 70 : private: 71 : ProxyProtocolConfig config_; 72 : Stats::Scope& scope_; 73 : }; 74 : 75 : } // namespace ProxyProtocol 76 : } // namespace TransportSockets 77 : } // namespace Extensions 78 : } // namespace Envoy