Line data Source code
1 : #include "source/extensions/transport_sockets/tap/tap.h" 2 : 3 : #include "envoy/extensions/transport_sockets/tap/v3/tap.pb.h" 4 : 5 : #include "source/common/buffer/buffer_impl.h" 6 : 7 : namespace Envoy { 8 : namespace Extensions { 9 : namespace TransportSockets { 10 : namespace Tap { 11 : 12 : TapSocket::TapSocket(SocketTapConfigSharedPtr config, 13 : Network::TransportSocketPtr&& transport_socket) 14 0 : : PassthroughSocket(std::move(transport_socket)), config_(config) {} 15 : 16 0 : void TapSocket::setTransportSocketCallbacks(Network::TransportSocketCallbacks& callbacks) { 17 0 : ASSERT(!tapper_); 18 0 : transport_socket_->setTransportSocketCallbacks(callbacks); 19 0 : tapper_ = config_ ? config_->createPerSocketTapper(callbacks.connection()) : nullptr; 20 0 : } 21 : 22 0 : void TapSocket::closeSocket(Network::ConnectionEvent event) { 23 0 : if (tapper_ != nullptr) { 24 0 : tapper_->closeSocket(event); 25 0 : } 26 : 27 0 : transport_socket_->closeSocket(event); 28 0 : } 29 : 30 0 : Network::IoResult TapSocket::doRead(Buffer::Instance& buffer) { 31 0 : Network::IoResult result = transport_socket_->doRead(buffer); 32 0 : if (tapper_ != nullptr && result.bytes_processed_ > 0) { 33 0 : tapper_->onRead(buffer, result.bytes_processed_); 34 0 : } 35 : 36 0 : return result; 37 0 : } 38 : 39 0 : Network::IoResult TapSocket::doWrite(Buffer::Instance& buffer, bool end_stream) { 40 : // TODO(htuch): avoid copy. 41 0 : Buffer::OwnedImpl copy(buffer); 42 0 : Network::IoResult result = transport_socket_->doWrite(buffer, end_stream); 43 0 : if (tapper_ != nullptr && result.bytes_processed_ > 0) { 44 0 : tapper_->onWrite(copy, result.bytes_processed_, end_stream); 45 0 : } 46 0 : return result; 47 0 : } 48 : 49 : TapSocketFactory::TapSocketFactory( 50 : const envoy::extensions::transport_sockets::tap::v3::Tap& proto_config, 51 : Common::Tap::TapConfigFactoryPtr&& config_factory, OptRef<Server::Admin> admin, 52 : Singleton::Manager& singleton_manager, ThreadLocal::SlotAllocator& tls, 53 : Event::Dispatcher& main_thread_dispatcher, 54 : Network::UpstreamTransportSocketFactoryPtr&& transport_socket_factory) 55 : : ExtensionConfigBase(proto_config.common_config(), std::move(config_factory), admin, 56 : singleton_manager, tls, main_thread_dispatcher), 57 0 : PassthroughFactory(std::move(transport_socket_factory)) {} 58 : 59 : Network::TransportSocketPtr 60 : TapSocketFactory::createTransportSocket(Network::TransportSocketOptionsConstSharedPtr options, 61 0 : Upstream::HostDescriptionConstSharedPtr host) const { 62 0 : return std::make_unique<TapSocket>( 63 0 : currentConfigHelper<SocketTapConfig>(), 64 0 : transport_socket_factory_->createTransportSocket(options, host)); 65 0 : } 66 : 67 : DownstreamTapSocketFactory::DownstreamTapSocketFactory( 68 : const envoy::extensions::transport_sockets::tap::v3::Tap& proto_config, 69 : Common::Tap::TapConfigFactoryPtr&& config_factory, OptRef<Server::Admin> admin, 70 : Singleton::Manager& singleton_manager, ThreadLocal::SlotAllocator& tls, 71 : Event::Dispatcher& main_thread_dispatcher, 72 : Network::DownstreamTransportSocketFactoryPtr&& transport_socket_factory) 73 : : ExtensionConfigBase(proto_config.common_config(), std::move(config_factory), admin, 74 : singleton_manager, tls, main_thread_dispatcher), 75 0 : DownstreamPassthroughFactory(std::move(transport_socket_factory)) {} 76 : 77 0 : Network::TransportSocketPtr DownstreamTapSocketFactory::createDownstreamTransportSocket() const { 78 0 : return std::make_unique<TapSocket>(currentConfigHelper<SocketTapConfig>(), 79 0 : transport_socket_factory_->createDownstreamTransportSocket()); 80 0 : } 81 : 82 : } // namespace Tap 83 : } // namespace TransportSockets 84 : } // namespace Extensions 85 : } // namespace Envoy