Line data Source code
1 : #pragma once 2 : 3 : #include "envoy/config/tap/v3/common.pb.h" 4 : #include "envoy/data/tap/v3/transport.pb.h" 5 : #include "envoy/event/timer.h" 6 : #include "envoy/server/transport_socket_config.h" 7 : 8 : #include "source/extensions/common/tap/tap_config_base.h" 9 : #include "source/extensions/transport_sockets/tap/tap_config.h" 10 : 11 : namespace Envoy { 12 : namespace Extensions { 13 : namespace TransportSockets { 14 : namespace Tap { 15 : 16 : class PerSocketTapperImpl : public PerSocketTapper { 17 : public: 18 : PerSocketTapperImpl(SocketTapConfigSharedPtr config, const Network::Connection& connection); 19 : 20 : // PerSocketTapper 21 : void closeSocket(Network::ConnectionEvent event) override; 22 : void onRead(const Buffer::Instance& data, uint32_t bytes_read) override; 23 : void onWrite(const Buffer::Instance& data, uint32_t bytes_written, bool end_stream) override; 24 : 25 : private: 26 : void initEvent(envoy::data::tap::v3::SocketEvent&); 27 : void fillConnectionInfo(envoy::data::tap::v3::Connection& connection); 28 0 : void makeBufferedTraceIfNeeded() { 29 0 : if (buffered_trace_ == nullptr) { 30 0 : buffered_trace_ = Extensions::Common::Tap::makeTraceWrapper(); 31 0 : buffered_trace_->mutable_socket_buffered_trace()->set_trace_id(connection_.id()); 32 0 : } 33 0 : } 34 0 : Extensions::Common::Tap::TraceWrapperPtr makeTraceSegment() { 35 0 : Extensions::Common::Tap::TraceWrapperPtr trace = Extensions::Common::Tap::makeTraceWrapper(); 36 0 : trace->mutable_socket_streamed_trace_segment()->set_trace_id(connection_.id()); 37 0 : return trace; 38 0 : } 39 : 40 : SocketTapConfigSharedPtr config_; 41 : Extensions::Common::Tap::PerTapSinkHandleManagerPtr sink_handle_; 42 : const Network::Connection& connection_; 43 : Extensions::Common::Tap::Matcher::MatchStatusVector statuses_; 44 : // Must be a shared_ptr because of submitTrace(). 45 : Extensions::Common::Tap::TraceWrapperPtr buffered_trace_; 46 : uint32_t rx_bytes_buffered_{}; 47 : uint32_t tx_bytes_buffered_{}; 48 : }; 49 : 50 : class SocketTapConfigImpl : public Extensions::Common::Tap::TapConfigBaseImpl, 51 : public SocketTapConfig, 52 : public std::enable_shared_from_this<SocketTapConfigImpl> { 53 : public: 54 : SocketTapConfigImpl(const envoy::config::tap::v3::TapConfig& proto_config, 55 : Extensions::Common::Tap::Sink* admin_streamer, TimeSource& time_system, 56 : Server::Configuration::TransportSocketFactoryContext& context) 57 : : Extensions::Common::Tap::TapConfigBaseImpl(std::move(proto_config), admin_streamer, 58 : context), 59 0 : time_source_(time_system) {} 60 : 61 : // SocketTapConfig 62 0 : PerSocketTapperPtr createPerSocketTapper(const Network::Connection& connection) override { 63 0 : return std::make_unique<PerSocketTapperImpl>(shared_from_this(), connection); 64 0 : } 65 0 : TimeSource& timeSource() const override { return time_source_; } 66 : 67 : private: 68 : TimeSource& time_source_; 69 : 70 : friend class PerSocketTapperImpl; 71 : }; 72 : 73 : } // namespace Tap 74 : } // namespace TransportSockets 75 : } // namespace Extensions 76 : } // namespace Envoy