1
#pragma once
2

            
3
#include "envoy/buffer/buffer.h"
4
#include "envoy/common/io/io_uring.h"
5
#include "envoy/network/io_handle.h"
6

            
7
#include "source/common/buffer/buffer_impl.h"
8
#include "source/common/common/logger.h"
9
#include "source/common/network/io_socket_handle_base_impl.h"
10

            
11
namespace Envoy {
12

            
13
namespace Network {
14

            
15
class IoUringSocketHandleImpl;
16

            
17
using IoUringSocketHandleImplOptRef =
18
    absl::optional<std::reference_wrapper<IoUringSocketHandleImpl>>;
19

            
20
enum class IoUringSocketType {
21
  Unknown,
22
  Accept,
23
  Server,
24
  Client,
25
};
26

            
27
/**
28
 * IoHandle derivative for sockets.
29
 */
30
class IoUringSocketHandleImpl : public IoSocketHandleBaseImpl {
31
public:
32
  IoUringSocketHandleImpl(Io::IoUringWorkerFactory& io_uring_worker_factory,
33
                          os_fd_t fd = INVALID_SOCKET, bool socket_v6only = false,
34
                          absl::optional<int> domain = absl::nullopt,
35
                          bool is_server_socket = false);
36
  ~IoUringSocketHandleImpl() override;
37

            
38
  Api::IoCallUint64Result close() override;
39
  Api::IoCallUint64Result readv(uint64_t max_length, Buffer::RawSlice* slices,
40
                                uint64_t num_slice) override;
41
  Api::IoCallUint64Result read(Buffer::Instance& buffer,
42
                               absl::optional<uint64_t> max_length_opt) override;
43
  Api::IoCallUint64Result writev(const Buffer::RawSlice* slices, uint64_t num_slice) override;
44
  Api::IoCallUint64Result write(Buffer::Instance& buffer) override;
45
  Api::IoCallUint64Result sendmsg(const Buffer::RawSlice* slices, uint64_t num_slice, int flags,
46
                                  const Address::Ip* self_ip,
47
                                  const Address::Instance& peer_address) override;
48
  Api::IoCallUint64Result recvmsg(Buffer::RawSlice* slices, const uint64_t num_slice,
49
                                  uint32_t self_port,
50
                                  const IoHandle::UdpSaveCmsgConfig& udp_save_cmsg_config,
51
                                  RecvMsgOutput& output) override;
52
  Api::IoCallUint64Result recvmmsg(RawSliceArrays& slices, uint32_t self_port,
53
                                   const IoHandle::UdpSaveCmsgConfig& udp_save_cmsg_config,
54
                                   RecvMsgOutput& output) override;
55
  Api::IoCallUint64Result recv(void* buffer, size_t length, int flags) override;
56
  Api::SysCallIntResult bind(Address::InstanceConstSharedPtr address) override;
57
  Api::SysCallIntResult listen(int backlog) override;
58
  IoHandlePtr accept(struct sockaddr* addr, socklen_t* addrlen) override;
59
  Api::SysCallIntResult connect(Address::InstanceConstSharedPtr address) override;
60
  Api::SysCallIntResult getOption(int level, int optname, void* optval, socklen_t* optlen) override;
61
  IoHandlePtr duplicate() override;
62
  void initializeFileEvent(Event::Dispatcher& dispatcher, Event::FileReadyCb cb,
63
                           Event::FileTriggerType trigger, uint32_t events) override;
64
  void activateFileEvents(uint32_t events) override;
65
  void enableFileEvents(uint32_t events) override;
66
  void resetFileEvents() override;
67
  Api::SysCallIntResult shutdown(int how) override;
68

            
69
protected:
70
  std::string ioUringSocketTypeStr() const {
71
    switch (io_uring_socket_type_) {
72
    case IoUringSocketType::Unknown:
73
      return "unknown";
74
    case IoUringSocketType::Accept:
75
      return "accept";
76
    case IoUringSocketType::Client:
77
      return "client";
78
    case IoUringSocketType::Server:
79
      return "server";
80
    }
81
    PANIC_DUE_TO_CORRUPT_ENUM;
82
  }
83

            
84
  Io::IoUringWorkerFactory& io_uring_worker_factory_;
85
  IoUringSocketType io_uring_socket_type_;
86
  OptRef<Io::IoUringSocket> io_uring_socket_{absl::nullopt};
87

            
88
  Event::FileEventPtr file_event_{nullptr};
89

            
90
  absl::optional<Api::IoCallUint64Result> checkReadResult() const;
91
  absl::optional<Api::IoCallUint64Result> checkWriteResult() const;
92
  Api::IoCallUint64Result copyOut(uint64_t max_length, Buffer::RawSlice* slices,
93
                                  uint64_t num_slice);
94
};
95

            
96
} // namespace Network
97
} // namespace Envoy