Skip to content

Commit 875fbdd

Browse files
authored
local address selector: take transport options in the extension call (#41866)
Change-Id: Ic1d2efb05da77b43c0b6419cd87e3ec68af4d51f Commit Message: Transport socket options can carry filter state which allows changing the address based on downstream attributes. Additional Description: We have a use case to change the linux network namespace to match the downstream connection local address. Risk Level: low, interface addition Testing: updated Docs Changes: none Release Notes: none --------- Signed-off-by: Kuat Yessenov <kuat@google.com>
1 parent 87eb239 commit 875fbdd

File tree

14 files changed

+71
-55
lines changed

14 files changed

+71
-55
lines changed

envoy/upstream/upstream.h

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -59,13 +59,16 @@ class UpstreamLocalAddressSelector {
5959
* Return UpstreamLocalAddress based on the endpoint address.
6060
* @param endpoint_address is the address used to select upstream local address.
6161
* @param socket_options applied to the selected address.
62+
* @param transport_socket_options transport-level options applied to the connection.
6263
* @return UpstreamLocalAddress which includes the selected upstream local address and socket
6364
* options.
6465
*/
65-
UpstreamLocalAddress
66-
getUpstreamLocalAddress(const Network::Address::InstanceConstSharedPtr& endpoint_address,
67-
const Network::ConnectionSocket::OptionsSharedPtr& socket_options) const {
68-
UpstreamLocalAddress local_address = getUpstreamLocalAddressImpl(endpoint_address);
66+
UpstreamLocalAddress getUpstreamLocalAddress(
67+
const Network::Address::InstanceConstSharedPtr& endpoint_address,
68+
const Network::ConnectionSocket::OptionsSharedPtr& socket_options,
69+
OptRef<const Network::TransportSocketOptions> transport_socket_options) const {
70+
UpstreamLocalAddress local_address =
71+
getUpstreamLocalAddressImpl(endpoint_address, transport_socket_options);
6972
Network::ConnectionSocket::OptionsSharedPtr connection_options =
7073
std::make_shared<Network::ConnectionSocket::Options>(
7174
socket_options ? *socket_options
@@ -83,7 +86,8 @@ class UpstreamLocalAddressSelector {
8386
* options is the responsibility of the base class.
8487
*/
8588
virtual UpstreamLocalAddress getUpstreamLocalAddressImpl(
86-
const Network::Address::InstanceConstSharedPtr& endpoint_address) const PURE;
89+
const Network::Address::InstanceConstSharedPtr& endpoint_address,
90+
OptRef<const Network::TransportSocketOptions> transport_socket_options) const PURE;
8791
};
8892

8993
using UpstreamLocalAddressSelectorConstSharedPtr =

source/common/http/http3/conn_pool.cc

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,14 +149,15 @@ Http3ConnPoolImpl::createClientConnection(Quic::QuicStatNames& quic_stat_names,
149149

150150
Network::Address::InstanceConstSharedPtr address =
151151
getHostAddress(host(), attempt_happy_eyeballs_);
152+
const auto& transport_options = transportSocketOptions();
152153
auto upstream_local_address_selector = host()->cluster().getUpstreamLocalAddressSelector();
153-
auto upstream_local_address =
154-
upstream_local_address_selector->getUpstreamLocalAddress(address, socketOptions());
154+
auto upstream_local_address = upstream_local_address_selector->getUpstreamLocalAddress(
155+
address, socketOptions(), makeOptRefFromPtr(transport_options.get()));
155156

156157
return Quic::createQuicNetworkConnection(
157158
quic_info_, std::move(crypto_config), server_id_, dispatcher(), address,
158159
upstream_local_address.address_, quic_stat_names, rtt_cache, scope,
159-
upstream_local_address.socket_options_, transportSocketOptions(), connection_id_generator_,
160+
upstream_local_address.socket_options_, transport_options, connection_id_generator_,
160161
host_->transportSocketFactory(), network_observer_registry_.ptr());
161162
}
162163

source/common/network/happy_eyeballs_connection_impl.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,8 @@ ClientConnectionPtr HappyEyeballsConnectionProvider::createNextConnection(const
3838
ENVOY_LOG_EVENT(debug, "happy_eyeballs_cx_attempt", "C[{}] address={}", id,
3939
address_list_[next_address_]->asStringView());
4040
auto& address = address_list_[next_address_++];
41-
auto upstream_local_address =
42-
upstream_local_address_selector_->getUpstreamLocalAddress(address, options_);
41+
auto upstream_local_address = upstream_local_address_selector_->getUpstreamLocalAddress(
42+
address, options_, makeOptRefFromPtr(transport_socket_options_.get()));
4343

4444
return dispatcher_.createClientConnection(
4545
address, upstream_local_address.address_,

source/common/upstream/default_local_address_selector.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,8 @@ DefaultUpstreamLocalAddressSelector::DefaultUpstreamLocalAddressSelector(
1414
}
1515

1616
UpstreamLocalAddress DefaultUpstreamLocalAddressSelector::getUpstreamLocalAddressImpl(
17-
const Network::Address::InstanceConstSharedPtr& endpoint_address) const {
17+
const Network::Address::InstanceConstSharedPtr& endpoint_address,
18+
OptRef<const Network::TransportSocketOptions>) const {
1819
for (auto& local_address : upstream_local_addresses_) {
1920
if (local_address.address_ == nullptr) {
2021
continue;

source/common/upstream/default_local_address_selector.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ class DefaultUpstreamLocalAddressSelector : public UpstreamLocalAddressSelector
2424

2525
// UpstreamLocalAddressSelector
2626
UpstreamLocalAddress getUpstreamLocalAddressImpl(
27-
const Network::Address::InstanceConstSharedPtr& endpoint_address) const override;
27+
const Network::Address::InstanceConstSharedPtr& endpoint_address,
28+
OptRef<const Network::TransportSocketOptions> transport_socket_options) const override;
2829

2930
private:
3031
std::vector<UpstreamLocalAddress> upstream_local_addresses_;

source/common/upstream/upstream_impl.cc

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -636,8 +636,8 @@ Host::CreateConnectionData HostImplBase::createConnection(
636636
// be redirected to a proxy, create the TCP connection to the proxy's address not the host's
637637
// address.
638638
if (proxy_address.has_value()) {
639-
auto upstream_local_address =
640-
source_address_selector->getUpstreamLocalAddress(address, options);
639+
auto upstream_local_address = source_address_selector->getUpstreamLocalAddress(
640+
address, options, makeOptRefFromPtr(transport_socket_options.get()));
641641
ENVOY_LOG(debug, "Connecting to configured HTTP/1.1 proxy at {}",
642642
proxy_address.value()->asString());
643643
connection = dispatcher.createClientConnection(
@@ -657,8 +657,8 @@ Host::CreateConnectionData HostImplBase::createConnection(
657657
dispatcher, *address_list_or_null, source_address_selector, socket_factory,
658658
transport_socket_options, host, options, happy_eyeballs_config);
659659
} else {
660-
auto upstream_local_address =
661-
source_address_selector->getUpstreamLocalAddress(address, options);
660+
auto upstream_local_address = source_address_selector->getUpstreamLocalAddress(
661+
address, options, makeOptRefFromPtr(transport_socket_options.get()));
662662
connection = dispatcher.createClientConnection(
663663
address, upstream_local_address.address_,
664664
socket_factory.createTransportSocket(transport_socket_options, host),

source/extensions/upstreams/http/udp/upstream_request.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ void UdpConnPool::newStream(Router::GenericConnectionPoolCallbacks* callbacks) {
2929
Envoy::Network::SocketPtr socket = createSocket(host_);
3030
auto source_address_selector = host_->cluster().getUpstreamLocalAddressSelector();
3131
auto upstream_local_address = source_address_selector->getUpstreamLocalAddress(
32-
host_->address(), /*socket_options=*/nullptr);
32+
host_->address(), /*socket_options=*/nullptr, /*transport_socket_options=*/{});
3333
if (!Envoy::Network::Socket::applyOptions(upstream_local_address.socket_options_, *socket,
3434
envoy::config::core::v3::SocketOption::STATE_PREBIND)) {
3535
callbacks->onPoolFailure(ConnectionPool::PoolFailureReason::LocalConnectionFailure,

test/common/http/http3/conn_pool_test.cc

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -62,9 +62,11 @@ class Http3ConnPoolImplTest : public Event::TestUsingSimulatedTime, public testi
6262
Network::ConnectionSocket::OptionsSharedPtr options =
6363
std::make_shared<Network::Socket::Options>();
6464
options->push_back(socket_option_);
65-
ON_CALL(*mockHost().cluster_.upstream_local_address_selector_, getUpstreamLocalAddressImpl(_))
65+
ON_CALL(*mockHost().cluster_.upstream_local_address_selector_,
66+
getUpstreamLocalAddressImpl(_, _))
6667
.WillByDefault(Invoke(
67-
[](const Network::Address::InstanceConstSharedPtr&) -> Upstream::UpstreamLocalAddress {
68+
[](const Network::Address::InstanceConstSharedPtr&,
69+
OptRef<const Network::TransportSocketOptions>) -> Upstream::UpstreamLocalAddress {
6870
return Upstream::UpstreamLocalAddress({nullptr, nullptr});
6971
}));
7072
Network::TransportSocketOptionsConstSharedPtr transport_options;
@@ -186,19 +188,21 @@ void Http3ConnPoolImplTest::createNewStream() {
186188
mockHost().cluster_.cluster_socket_options_ = std::make_shared<Network::Socket::Options>();
187189
std::shared_ptr<Network::MockSocketOption> cluster_socket_option{new Network::MockSocketOption()};
188190
mockHost().cluster_.cluster_socket_options_->push_back(cluster_socket_option);
189-
EXPECT_CALL(*mockHost().cluster_.upstream_local_address_selector_, getUpstreamLocalAddressImpl(_))
190-
.WillOnce(Invoke([&](const Network::Address::InstanceConstSharedPtr& address)
191-
-> Upstream::UpstreamLocalAddress {
192-
if (happy_eyeballs_ && address_list_->size() == 2) {
193-
EXPECT_EQ(address, (*address_list_)[1]);
194-
} else {
195-
EXPECT_EQ(address, test_address_);
196-
}
197-
Network::ConnectionSocket::OptionsSharedPtr options =
198-
std::make_shared<Network::ConnectionSocket::Options>();
199-
Network::Socket::appendOptions(options, mockHost().cluster_.cluster_socket_options_);
200-
return Upstream::UpstreamLocalAddress({nullptr, options});
201-
}));
191+
EXPECT_CALL(*mockHost().cluster_.upstream_local_address_selector_,
192+
getUpstreamLocalAddressImpl(_, _))
193+
.WillOnce(Invoke(
194+
[&](const Network::Address::InstanceConstSharedPtr& address,
195+
OptRef<const Network::TransportSocketOptions>) -> Upstream::UpstreamLocalAddress {
196+
if (happy_eyeballs_ && address_list_->size() == 2) {
197+
EXPECT_EQ(address, (*address_list_)[1]);
198+
} else {
199+
EXPECT_EQ(address, test_address_);
200+
}
201+
Network::ConnectionSocket::OptionsSharedPtr options =
202+
std::make_shared<Network::ConnectionSocket::Options>();
203+
Network::Socket::appendOptions(options, mockHost().cluster_.cluster_socket_options_);
204+
return Upstream::UpstreamLocalAddress({nullptr, options});
205+
}));
202206
EXPECT_CALL(*cluster_socket_option, setOption(_, _)).Times(3u);
203207
EXPECT_CALL(*socket_option_, setOption(_, _)).Times(3u);
204208
// NOLINTNEXTLINE(clang-analyzer-cplusplus.NewDeleteLeaks)

test/common/tcp/conn_pool_test.cc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ class TcpConnPoolImplTest : public Event::TestUsingSimulatedTime, public testing
243243
}
244244

245245
void initialize() {
246-
ON_CALL(*cluster_->upstream_local_address_selector_, getUpstreamLocalAddressImpl(_))
246+
ON_CALL(*cluster_->upstream_local_address_selector_, getUpstreamLocalAddressImpl(_, _))
247247
.WillByDefault(
248248
Return(Upstream::UpstreamLocalAddress({cluster_->source_address_, options_})));
249249
conn_pool_ = std::make_unique<ConnPoolBase>(dispatcher_, host_, upstream_ready_cb_, options_,

test/common/upstream/test_local_address_selector.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,8 @@ class TestUpstreamLocalAddressSelector : public UpstreamLocalAddressSelector {
1717
return_empty_source_address_{return_empty_source_address} {}
1818

1919
UpstreamLocalAddress
20-
getUpstreamLocalAddressImpl(const Network::Address::InstanceConstSharedPtr&) const override {
20+
getUpstreamLocalAddressImpl(const Network::Address::InstanceConstSharedPtr&,
21+
OptRef<const Network::TransportSocketOptions>) const override {
2122
++(*num_calls_);
2223
if (return_empty_source_address_) {
2324
return {};

0 commit comments

Comments
 (0)