Coverage Report

Created: 2023-11-12 09:30

/proc/self/cwd/source/common/network/happy_eyeballs_connection_impl.h
Line
Count
Source (jump to first uncovered line)
1
#pragma once
2
3
#include "envoy/upstream/upstream.h"
4
5
#include "source/common/network/multi_connection_base_impl.h"
6
7
namespace Envoy {
8
namespace Network {
9
10
/**
11
 * Implementation of ConnectionProvider for HappyEyeballs. It provides client
12
 * connections to multiple addresses in an specific order complying to
13
 * HappyEyeballs.
14
 */
15
class HappyEyeballsConnectionProvider : public ConnectionProvider,
16
                                        Logger::Loggable<Logger::Id::happy_eyeballs> {
17
public:
18
  HappyEyeballsConnectionProvider(
19
      Event::Dispatcher& dispatcher,
20
      const std::vector<Address::InstanceConstSharedPtr>& address_list,
21
      const std::shared_ptr<const Upstream::UpstreamLocalAddressSelector>&
22
          upstream_local_address_selector,
23
      UpstreamTransportSocketFactory& socket_factory,
24
      TransportSocketOptionsConstSharedPtr transport_socket_options,
25
      const Upstream::HostDescriptionConstSharedPtr& host,
26
      const ConnectionSocket::OptionsSharedPtr options);
27
  bool hasNextConnection() override;
28
  ClientConnectionPtr createNextConnection(const uint64_t id) override;
29
  size_t nextConnection() override;
30
  size_t totalConnections() override;
31
  // Returns a new vector containing the contents of |address_list| sorted
32
  // with address families interleaved, as per Section 4 of RFC 8305, Happy
33
  // Eyeballs v2. It is assumed that the list must already be sorted as per
34
  // Section 6 of RFC6724, which happens in the DNS implementations (ares_getaddrinfo()
35
  // and Apple DNS).
36
  static std::vector<Address::InstanceConstSharedPtr>
37
  sortAddresses(const std::vector<Address::InstanceConstSharedPtr>& address_list);
38
39
private:
40
  Event::Dispatcher& dispatcher_;
41
  // List of addresses to attempt to connect to.
42
  const std::vector<Address::InstanceConstSharedPtr> address_list_;
43
  const Upstream::UpstreamLocalAddressSelectorConstSharedPtr upstream_local_address_selector_;
44
  UpstreamTransportSocketFactory& socket_factory_;
45
  TransportSocketOptionsConstSharedPtr transport_socket_options_;
46
  const Upstream::HostDescriptionConstSharedPtr host_;
47
  const ConnectionSocket::OptionsSharedPtr options_;
48
  // Index of the next address to use.
49
  size_t next_address_ = 0;
50
  // True if the first connection has been created.
51
  bool first_connection_created_ = false;
52
};
53
54
/**
55
 * Implementation of ClientConnection which transparently attempts connections to
56
 * multiple different IP addresses, and uses the first connection that succeeds.
57
 * After a connection is established, all methods simply delegate to the
58
 * underlying connection. However, before the connection is established
59
 * their behavior depends on their semantics. For anything which can result
60
 * in up-call (e.g. filter registration) or which must only happen once (e.g.
61
 * writing data) the context is saved in until the connection completes, at
62
 * which point they are replayed to the underlying connection. For simple methods
63
 * they are applied to each open connection and applied when creating new ones.
64
 *
65
 * See the Happy Eyeballs RFC at https://datatracker.ietf.org/doc/html/rfc6555
66
 * TODO(RyanTheOptimist): Implement the Happy Eyeballs address sorting algorithm
67
 * either in the class or in the resolution code.
68
 */
69
class HappyEyeballsConnectionImpl : public MultiConnectionBaseImpl,
70
                                    Logger::Loggable<Logger::Id::happy_eyeballs> {
71
public:
72
  HappyEyeballsConnectionImpl(Event::Dispatcher& dispatcher,
73
                              const std::vector<Address::InstanceConstSharedPtr>& address_list,
74
                              const std::shared_ptr<const Upstream::UpstreamLocalAddressSelector>&
75
                                  upstream_local_address_selector,
76
                              UpstreamTransportSocketFactory& socket_factory,
77
                              TransportSocketOptionsConstSharedPtr transport_socket_options,
78
                              const Upstream::HostDescriptionConstSharedPtr& host,
79
                              const ConnectionSocket::OptionsSharedPtr options)
80
      : MultiConnectionBaseImpl(dispatcher,
81
                                std::make_unique<Network::HappyEyeballsConnectionProvider>(
82
                                    dispatcher, address_list, upstream_local_address_selector,
83
0
                                    socket_factory, transport_socket_options, host, options)) {}
Unexecuted instantiation: Envoy::Network::HappyEyeballsConnectionImpl::HappyEyeballsConnectionImpl(Envoy::Event::Dispatcher&, std::__1::vector<std::__1::shared_ptr<Envoy::Network::Address::Instance const>, std::__1::allocator<std::__1::shared_ptr<Envoy::Network::Address::Instance const> > > const&, std::__1::shared_ptr<Envoy::Upstream::UpstreamLocalAddressSelector const> const&, Envoy::Network::UpstreamTransportSocketFactory&, std::__1::shared_ptr<Envoy::Network::TransportSocketOptions const>, std::__1::shared_ptr<Envoy::Upstream::HostDescription const> const&, std::__1::shared_ptr<std::__1::vector<std::__1::shared_ptr<Envoy::Network::Socket::Option const>, std::__1::allocator<std::__1::shared_ptr<Envoy::Network::Socket::Option const> > > >)
Unexecuted instantiation: Envoy::Network::HappyEyeballsConnectionImpl::HappyEyeballsConnectionImpl(Envoy::Event::Dispatcher&, std::__1::vector<std::__1::shared_ptr<Envoy::Network::Address::Instance const>, std::__1::allocator<std::__1::shared_ptr<Envoy::Network::Address::Instance const> > > const&, std::__1::shared_ptr<Envoy::Upstream::UpstreamLocalAddressSelector const> const&, Envoy::Network::UpstreamTransportSocketFactory&, std::__1::shared_ptr<Envoy::Network::TransportSocketOptions const>, std::__1::shared_ptr<Envoy::Upstream::HostDescription const> const&, std::__1::shared_ptr<std::__1::vector<std::__1::shared_ptr<Envoy::Network::Socket::Option const>, std::__1::allocator<std::__1::shared_ptr<Envoy::Network::Socket::Option const> > > >)
84
};
85
86
} // namespace Network
87
} // namespace Envoy