1
#pragma once
2

            
3
#include "envoy/event/timer.h"
4
#include "envoy/extensions/transport_sockets/tap/v3/tap.pb.h"
5
#include "envoy/network/transport_socket.h"
6

            
7
#include "source/extensions/common/tap/extension_config_base.h"
8
#include "source/extensions/transport_sockets/common/passthrough.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 TapSocket : public TransportSockets::PassthroughSocket {
17
public:
18
  TapSocket(SocketTapConfigSharedPtr config,
19
            const envoy::extensions::transport_sockets::tap::v3::SocketTapConfig& socket_tap_config,
20
            Stats::Scope& stats_scope, Network::TransportSocketPtr&& transport_socket);
21

            
22
  // Network::TransportSocket
23
  void setTransportSocketCallbacks(Network::TransportSocketCallbacks& callbacks) override;
24
  void closeSocket(Network::ConnectionEvent event) override;
25
  Network::IoResult doRead(Buffer::Instance& buffer) override;
26
  Network::IoResult doWrite(Buffer::Instance& buffer, bool end_stream) override;
27

            
28
private:
29
  SocketTapConfigSharedPtr config_;
30
  PerSocketTapperPtr tapper_;
31
  const envoy::extensions::transport_sockets::tap::v3::SocketTapConfig socket_tap_config_;
32
  TransportTapStats stats_;
33
  static TransportTapStats generateStats(Stats::Scope& stats_scope, const std::string& prefix);
34
};
35

            
36
class TapSocketFactory : public Common::Tap::ExtensionConfigBase, public PassthroughFactory {
37
public:
38
  TapSocketFactory(const envoy::extensions::transport_sockets::tap::v3::Tap& proto_config,
39
                   Common::Tap::TapConfigFactoryPtr&& config_factory, OptRef<Server::Admin> admin,
40
                   Singleton::Manager& singleton_manager, ThreadLocal::SlotAllocator& tls,
41
                   Event::Dispatcher& main_thread_dispatcher, Stats::Scope& scope,
42
                   Network::UpstreamTransportSocketFactoryPtr&& transport_socket_factory);
43

            
44
  // Network::UpstreamTransportSocketFactory
45
  Network::TransportSocketPtr
46
  createTransportSocket(Network::TransportSocketOptionsConstSharedPtr options,
47
                        Upstream::HostDescriptionConstSharedPtr host) const override;
48

            
49
private:
50
  const envoy::extensions::transport_sockets::tap::v3::SocketTapConfig ts_tap_config_;
51
  Stats::Scope& stats_scope_;
52
};
53

            
54
class DownstreamTapSocketFactory : public Common::Tap::ExtensionConfigBase,
55
                                   public DownstreamPassthroughFactory {
56
public:
57
  DownstreamTapSocketFactory(
58
      const envoy::extensions::transport_sockets::tap::v3::Tap& proto_config,
59
      Common::Tap::TapConfigFactoryPtr&& config_factory, OptRef<Server::Admin> admin,
60
      Singleton::Manager& singleton_manager, ThreadLocal::SlotAllocator& tls,
61
      Event::Dispatcher& main_thread_dispatcher, Stats::Scope& scope,
62
      Network::DownstreamTransportSocketFactoryPtr&& transport_socket_factory);
63

            
64
  // Network::UpstreamTransportSocketFactory
65
  Network::TransportSocketPtr createDownstreamTransportSocket() const override;
66

            
67
private:
68
  const envoy::extensions::transport_sockets::tap::v3::SocketTapConfig ds_ts_tap_config_;
69
  Stats::Scope& stats_scope_;
70
};
71

            
72
} // namespace Tap
73
} // namespace TransportSockets
74
} // namespace Extensions
75
} // namespace Envoy