1
#include "source/extensions/bootstrap/reverse_tunnel/downstream_socket_interface/reverse_connection_address.h"
2

            
3
#include <arpa/inet.h>
4
#include <netinet/in.h>
5
#include <sys/socket.h>
6

            
7
#include <cstring>
8
#include <functional>
9

            
10
#include "source/common/common/fmt.h"
11

            
12
namespace Envoy {
13
namespace Extensions {
14
namespace Bootstrap {
15
namespace ReverseConnection {
16

            
17
const std::string ReverseConnectionAddress::ReverseConnectionIp::address_str_ = "127.0.0.1";
18

            
19
ReverseConnectionAddress::ReverseConnectionAddress(const ReverseConnectionConfig& config)
20
42
    : config_(config) {
21

            
22
  // Create the logical name (rc:// address) for identification.
23
42
  logical_name_ = fmt::format("rc://{}:{}:{}@{}:{}", config.src_node_id, config.src_cluster_id,
24
42
                              config.src_tenant_id, config.remote_cluster, config.connection_count);
25

            
26
  // Use localhost with the placeholder port for the actual address string.
27
  // This will be used by the filter chain manager for matching.
28
42
  address_string_ = fmt::format("{}:{}", ReverseConnectionIp::address_str_,
29
42
                                kReverseConnectionListenerPortPlaceholder);
30

            
31
42
  ENVOY_LOG_MISC(debug, "reverse connection address: logical_name={}, address={}", logical_name_,
32
42
                 address_string_);
33
42
}
34

            
35
46
bool ReverseConnectionAddress::operator==(const Instance& rhs) const {
36
46
  const auto* reverse_conn_addr = dynamic_cast<const ReverseConnectionAddress*>(&rhs);
37
46
  if (reverse_conn_addr == nullptr) {
38
27
    return false;
39
27
  }
40
19
  return config_.src_node_id == reverse_conn_addr->config_.src_node_id &&
41
19
         config_.src_cluster_id == reverse_conn_addr->config_.src_cluster_id &&
42
19
         config_.src_tenant_id == reverse_conn_addr->config_.src_tenant_id &&
43
19
         config_.remote_cluster == reverse_conn_addr->config_.remote_cluster &&
44
19
         config_.connection_count == reverse_conn_addr->config_.connection_count;
45
46
}
46

            
47
115
const std::string& ReverseConnectionAddress::asString() const { return address_string_; }
48

            
49
17
absl::string_view ReverseConnectionAddress::asStringView() const { return address_string_; }
50

            
51
36
const std::string& ReverseConnectionAddress::logicalName() const { return logical_name_; }
52

            
53
1
const sockaddr* ReverseConnectionAddress::sockAddr() const {
54
  // Return a valid localhost sockaddr structure with placeholder port.
55
1
  static struct sockaddr_in addr;
56
1
  addr.sin_family = AF_INET;
57
1
  addr.sin_port = htons(kReverseConnectionListenerPortPlaceholder);
58
1
  addr.sin_addr.s_addr = htonl(INADDR_LOOPBACK); // 127.0.0.1
59
1
  return reinterpret_cast<const sockaddr*>(&addr);
60
1
}
61

            
62
1
socklen_t ReverseConnectionAddress::sockAddrLen() const { return sizeof(struct sockaddr_in); }
63

            
64
} // namespace ReverseConnection
65
} // namespace Bootstrap
66
} // namespace Extensions
67
} // namespace Envoy