1
#pragma once
2

            
3
#include "envoy/config/tap/v3/common.pb.h"
4
#include "envoy/extensions/common/tap/v3/common.pb.h"
5
#include "envoy/thread_local/thread_local.h"
6

            
7
#include "source/extensions/common/tap/admin.h"
8
#include "source/extensions/common/tap/tap.h"
9

            
10
namespace Envoy {
11
namespace Extensions {
12
namespace Common {
13
namespace Tap {
14

            
15
/**
16
 * Base class for tap extension configuration. Used by all tap extensions.
17
 */
18
class ExtensionConfigBase : public ExtensionConfig, Logger::Loggable<Logger::Id::tap> {
19
public:
20
  // Extensions::Common::Tap::ExtensionConfig
21
  void clearTapConfig() override;
22
  const absl::string_view adminId() override;
23
  void newTapConfig(const envoy::config::tap::v3::TapConfig& proto_config,
24
                    Sink* admin_streamer) override;
25

            
26
protected:
27
  ExtensionConfigBase(const envoy::extensions::common::tap::v3::CommonExtensionConfig proto_config,
28
                      TapConfigFactoryPtr&& config_factory, OptRef<Server::Admin> admin,
29
                      Singleton::Manager& singleton_manager, ThreadLocal::SlotAllocator& tls,
30
                      Event::Dispatcher& main_thread_dispatcher);
31
  ~ExtensionConfigBase() override;
32

            
33
  // All tap configurations derive from TapConfig for type safety. In order to use a common
34
  // extension base class (with TLS logic, etc.) we must dynamic cast to the actual tap
35
  // configuration type that the extension expects (and is created by the configuration factory).
36
69
  template <class T> std::shared_ptr<T> currentConfigHelper() const {
37
69
    return std::dynamic_pointer_cast<T>(tls_slot_->config_);
38
69
  }
39

            
40
private:
41
  // Holds the functionality of installing a new tap config. This is the underlying method to the
42
  // virtual method newTapConfig.
43
  void installNewTap(const envoy::config::tap::v3::TapConfig& proto_config, Sink* admin_streamer);
44

            
45
  struct TlsFilterConfig : public ThreadLocal::ThreadLocalObject {
46
    TapConfigSharedPtr config_;
47
  };
48

            
49
  const envoy::extensions::common::tap::v3::CommonExtensionConfig proto_config_;
50
  TapConfigFactoryPtr config_factory_;
51
  ThreadLocal::TypedSlot<TlsFilterConfig> tls_slot_;
52
  AdminHandlerSharedPtr admin_handler_;
53
};
54

            
55
} // namespace Tap
56
} // namespace Common
57
} // namespace Extensions
58
} // namespace Envoy