1
#pragma once
2

            
3
#include "envoy/network/listener.h"
4
#include "envoy/network/socket.h"
5
#include "envoy/network/socket_interface.h"
6

            
7
#include "source/common/common/assert.h"
8
#include "source/common/common/dump_state_utils.h"
9

            
10
namespace Envoy {
11
namespace Network {
12

            
13
class ConnectionInfoSetterImpl : public ConnectionInfoSetter {
14
public:
15
  ConnectionInfoSetterImpl(const Address::InstanceConstSharedPtr& local_address,
16
                           const Address::InstanceConstSharedPtr& remote_address)
17
188180
      : local_address_(local_address), direct_local_address_(local_address),
18
188180
        remote_address_(remote_address), direct_remote_address_(remote_address) {}
19

            
20
5
  void setDirectLocalAddressForTest(const Address::InstanceConstSharedPtr& direct_local_address) {
21
5
    direct_local_address_ = direct_local_address;
22
5
  }
23
21698
  void setDirectRemoteAddressForTest(const Address::InstanceConstSharedPtr& direct_remote_address) {
24
21698
    direct_remote_address_ = direct_remote_address;
25
21698
  }
26

            
27
4
  void dumpState(std::ostream& os, int indent_level) const override {
28
4
    const char* spaces = spacesForLevel(indent_level);
29
4
    os << spaces << "ConnectionInfoSetterImpl " << this
30
4
       << DUMP_NULLABLE_MEMBER(remote_address_, remote_address_->asStringView())
31
4
       << DUMP_NULLABLE_MEMBER(direct_remote_address_, direct_remote_address_->asStringView())
32
4
       << DUMP_NULLABLE_MEMBER(local_address_, local_address_->asStringView())
33
4
       << DUMP_MEMBER(server_name_) << "\n";
34
4
  }
35

            
36
  // ConnectionInfoSetter
37
1003015
  const Address::InstanceConstSharedPtr& localAddress() const override { return local_address_; }
38
56
  const Address::InstanceConstSharedPtr& directLocalAddress() const override {
39
56
    return direct_local_address_;
40
56
  }
41
145408
  void setLocalAddress(const Address::InstanceConstSharedPtr& local_address) override {
42
145408
    local_address_ = local_address;
43
145408
  }
44
158
  void restoreLocalAddress(const Address::InstanceConstSharedPtr& local_address) override {
45
158
    setLocalAddress(local_address);
46
158
    local_address_restored_ = true;
47
158
  }
48
184
  bool localAddressRestored() const override { return local_address_restored_; }
49
607972
  const Address::InstanceConstSharedPtr& remoteAddress() const override { return remote_address_; }
50
9682
  void setRemoteAddress(const Address::InstanceConstSharedPtr& remote_address) override {
51
9682
    remote_address_ = remote_address;
52
9682
  }
53
27807
  const Address::InstanceConstSharedPtr& directRemoteAddress() const override {
54
27807
    return direct_remote_address_;
55
27807
  }
56
27753
  absl::string_view requestedServerName() const override { return server_name_; }
57
8300
  void setRequestedServerName(const absl::string_view requested_server_name) override {
58
8300
    server_name_ = std::string(requested_server_name);
59
8300
  }
60
27464
  const std::vector<std::string>& requestedApplicationProtocols() const override {
61
27464
    return application_protocols_;
62
27464
  }
63
7827
  void setRequestedApplicationProtocols(const std::vector<absl::string_view>& protocols) override {
64
7827
    application_protocols_.clear();
65
7829
    for (const auto& protocol : protocols) {
66
7829
      application_protocols_.emplace_back(protocol);
67
7829
    }
68
7827
  }
69
189197
  absl::optional<uint64_t> connectionID() const override { return connection_id_; }
70
122656
  void setConnectionID(uint64_t id) override { connection_id_ = id; }
71
99903
  absl::optional<absl::string_view> interfaceName() const override { return interface_name_; }
72
30615
  void enableSettingInterfaceName(const bool enable) override {
73
30615
    allow_syscall_for_interface_name_ = enable;
74
30615
  }
75
53219
  void maybeSetInterfaceName(IoHandle& io_handle) override {
76
53219
    if (allow_syscall_for_interface_name_) {
77
9
      interface_name_ = io_handle.interfaceName();
78
9
    }
79
53219
  }
80
241675
  Ssl::ConnectionInfoConstSharedPtr sslConnection() const override { return ssl_info_; }
81
114891
  void setSslConnection(const Ssl::ConnectionInfoConstSharedPtr& ssl_connection_info) override {
82
114891
    ssl_info_ = ssl_connection_info;
83
114891
  }
84
85
  absl::string_view ja3Hash() const override { return ja3_hash_; }
85
12
  void setJA3Hash(const absl::string_view ja3_hash) override { ja3_hash_ = std::string(ja3_hash); }
86
14
  absl::string_view ja4Hash() const override { return ja4_hash_; }
87
12
  void setJA4Hash(const absl::string_view ja4_hash) override { ja4_hash_ = std::string(ja4_hash); }
88
719
  const absl::optional<std::chrono::milliseconds>& roundTripTime() const override {
89
719
    return round_trip_time_;
90
719
  }
91
54077
  void setRoundTripTime(std::chrono::milliseconds round_trip_time) override {
92
54077
    round_trip_time_ = round_trip_time;
93
54077
  }
94
15
  OptRef<const FilterChainInfo> filterChainInfo() const override {
95
15
    return makeOptRefFromPtr<const FilterChainInfo>(filter_chain_info_.get());
96
15
  }
97
54054
  void setFilterChainInfo(FilterChainInfoConstSharedPtr filter_chain_info) override {
98
54054
    filter_chain_info_ = std::move(filter_chain_info);
99
54054
  }
100
19
  OptRef<const ListenerInfo> listenerInfo() const override {
101
19
    return makeOptRefFromPtr<const ListenerInfo>(listener_info_.get());
102
19
  }
103
57161
  void setListenerInfo(ListenerInfoConstSharedPtr listener_info) override {
104
57161
    listener_info_ = std::move(listener_info);
105
57161
  }
106

            
107
private:
108
  Address::InstanceConstSharedPtr local_address_;
109
  Address::InstanceConstSharedPtr direct_local_address_;
110
  bool local_address_restored_{false};
111
  Address::InstanceConstSharedPtr remote_address_;
112
  Address::InstanceConstSharedPtr direct_remote_address_;
113
  std::string server_name_;
114
  std::vector<std::string> application_protocols_;
115
  absl::optional<uint64_t> connection_id_;
116
  bool allow_syscall_for_interface_name_{false};
117
  absl::optional<std::string> interface_name_;
118
  Ssl::ConnectionInfoConstSharedPtr ssl_info_;
119
  std::string ja3_hash_;
120
  std::string ja4_hash_;
121
  absl::optional<std::chrono::milliseconds> round_trip_time_;
122
  FilterChainInfoConstSharedPtr filter_chain_info_;
123
  ListenerInfoConstSharedPtr listener_info_;
124
};
125

            
126
class SocketImpl : public virtual Socket {
127
public:
128
  SocketImpl(Socket::Type socket_type, const Address::InstanceConstSharedPtr& address_for_io_handle,
129
             const Address::InstanceConstSharedPtr& remote_address,
130
             const SocketCreationOptions& options);
131

            
132
  // Network::Socket
133
1496607
  ConnectionInfoSetter& connectionInfoProvider() override { return *connection_info_provider_; }
134
187423
  const ConnectionInfoProvider& connectionInfoProvider() const override {
135
187423
    return *connection_info_provider_;
136
187423
  }
137
365127
  ConnectionInfoProviderSharedPtr connectionInfoProviderSharedPtr() const override {
138
365127
    return connection_info_provider_;
139
365127
  }
140
  SocketPtr duplicate() override {
141
    // Implementing the functionality here for all sockets is tricky because it leads
142
    // into object slicing issues.
143
    return nullptr;
144
  }
145

            
146
3780960
  IoHandle& ioHandle() override { return *io_handle_; }
147
2
  const IoHandle& ioHandle() const override { return *io_handle_; }
148
114349
  void close() override {
149
114359
    if (io_handle_ && io_handle_->isOpen()) {
150
114350
      io_handle_->close();
151
114350
    }
152
114349
  }
153
7477280
  bool isOpen() const override { return io_handle_ && io_handle_->isOpen(); }
154
60824
  void ensureOptions() {
155
60824
    if (!options_) {
156
46109
      options_ = std::make_shared<std::vector<OptionConstSharedPtr>>();
157
46109
    }
158
60824
  }
159
4
  void addOption(const OptionConstSharedPtr& option) override {
160
4
    ensureOptions();
161
4
    options_->emplace_back(std::move(option));
162
4
  }
163
60820
  void addOptions(const OptionsSharedPtr& options) override {
164
60820
    ensureOptions();
165
60820
    Network::Socket::appendOptions(options_, options);
166
60820
  }
167

            
168
  Api::SysCallIntResult bind(Network::Address::InstanceConstSharedPtr address) override;
169
  Api::SysCallIntResult listen(int backlog) override;
170
  Api::SysCallIntResult connect(const Address::InstanceConstSharedPtr addr) override;
171
  Api::SysCallIntResult setSocketOption(int level, int optname, const void* optval,
172
                                        socklen_t optlen) override;
173
  Api::SysCallIntResult getSocketOption(int level, int optname, void* optval,
174
                                        socklen_t* optlen) const override;
175
  Api::SysCallIntResult ioctl(unsigned long control_code, void* in_buffer,
176
                              unsigned long in_buffer_len, void* out_buffer,
177
                              unsigned long out_buffer_len, unsigned long* bytes_returned) override;
178

            
179
  Api::SysCallIntResult setBlockingForTest(bool blocking) override;
180

            
181
67097
  const OptionsSharedPtr& options() const override { return options_; }
182
16
  Socket::Type socketType() const override { return sock_type_; }
183
104265
  Address::Type addressType() const override { return addr_type_; }
184
  absl::optional<Address::IpVersion> ipVersion() const override;
185

            
186
protected:
187
  SocketImpl(IoHandlePtr&& io_handle, const Address::InstanceConstSharedPtr& local_address,
188
             const Address::InstanceConstSharedPtr& remote_address);
189

            
190
  const IoHandlePtr io_handle_;
191
  const std::shared_ptr<ConnectionInfoSetterImpl> connection_info_provider_;
192
  OptionsSharedPtr options_;
193
  Socket::Type sock_type_;
194
  Address::Type addr_type_;
195
};
196

            
197
} // namespace Network
198
} // namespace Envoy