1
#pragma once
2

            
3
#include "envoy/common/io/io_uring.h"
4
#include "envoy/network/socket.h"
5

            
6
#include "source/common/network/socket_interface.h"
7

            
8
namespace Envoy {
9
namespace Network {
10

            
11
class DefaultSocketInterfaceExtension : public Network::SocketInterfaceExtension {
12
public:
13
  DefaultSocketInterfaceExtension(Network::SocketInterface& sock_interface,
14
                                  std::shared_ptr<Io::IoUringWorkerFactory> io_uring_worker_factory)
15
6
      : Network::SocketInterfaceExtension(sock_interface),
16
6
        io_uring_worker_factory_(io_uring_worker_factory) {}
17

            
18
  // Server::BootstrapExtension
19
  void onWorkerThreadInitialized() override;
20

            
21
protected:
22
  std::shared_ptr<Io::IoUringWorkerFactory> io_uring_worker_factory_;
23
};
24

            
25
class SocketInterfaceImpl : public SocketInterfaceBase {
26
public:
27
  // SocketInterface
28
  IoHandlePtr socket(Socket::Type socket_type, Address::Type addr_type, Address::IpVersion version,
29
                     bool socket_v6only, const SocketCreationOptions& options) const override;
30
  IoHandlePtr socket(Socket::Type socket_type, const Address::InstanceConstSharedPtr addr,
31
                     const SocketCreationOptions& options) const override;
32
  bool ipFamilySupported(int domain) override;
33

            
34
  // Server::Configuration::BootstrapExtensionFactory
35
  Server::BootstrapExtensionPtr
36
  createBootstrapExtension(const Protobuf::Message& config,
37
                           Server::Configuration::ServerFactoryContext& context) override;
38

            
39
  ProtobufTypes::MessagePtr createEmptyConfigProto() override;
40
12343
  std::string name() const override {
41
12343
    return "envoy.extensions.network.socket_interface.default_socket_interface";
42
12343
  };
43

            
44
  static IoHandlePtr
45
  makePlatformSpecificSocket(int socket_fd, bool socket_v6only, absl::optional<int> domain,
46
                             const SocketCreationOptions& options,
47
                             Io::IoUringWorkerFactory* io_uring_worker_factory = nullptr);
48

            
49
protected:
50
  virtual IoHandlePtr makeSocket(int socket_fd, bool socket_v6only, Socket::Type socket_type,
51
                                 absl::optional<int> domain,
52
                                 const SocketCreationOptions& options) const;
53

            
54
private:
55
  std::weak_ptr<Io::IoUringWorkerFactory> io_uring_worker_factory_;
56
};
57

            
58
DECLARE_FACTORY(SocketInterfaceImpl);
59

            
60
} // namespace Network
61
} // namespace Envoy