connect: prefer endpoint metadata (#4409)

Signed-off-by: Kuat Yessenov <kuat@google.com>
This commit is contained in:
Kuat 2023-02-06 17:23:14 -08:00 committed by GitHub
parent ee61816a2f
commit 05dbcf3491
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 20 additions and 20 deletions

View File

@ -29,26 +29,7 @@ constexpr std::string_view TunnelAddressField = "address";
Envoy::Network::FilterStatus Filter::onAccept(Envoy::Network::ListenerFilterCallbacks& cb) {
auto& socket = cb.socket();
// First, check the filter state;
const auto* object = cb.filterState().getDataReadOnly<Authority>(FilterStateKey);
if (object) {
const auto local_address = Envoy::Network::Utility::parseInternetAddressAndPortNoThrow(
object->value_, /*v6only=*/false);
if (local_address) {
ENVOY_LOG_MISC(trace, "Restore local address from filter state: {}",
local_address->asString());
socket.connectionInfoProvider().restoreLocalAddress(local_address);
const auto tunnel_address =
Envoy::Network::Utility::getAddressWithPort(*local_address, object->port_);
cb.filterState().setData(Envoy::Network::DestinationAddress::key(),
std::make_shared<Envoy::Network::DestinationAddress>(tunnel_address),
Envoy::StreamInfo::FilterState::StateType::ReadOnly);
} else {
ENVOY_LOG_MISC(trace, "Failed to parse filter state address: {}", object->value_);
}
return Envoy::Network::FilterStatus::Continue;
}
// Second, try the dynamic metadata from the endpoint.
// First, try the dynamic metadata from the endpoint.
const auto iter = cb.dynamicMetadata().filter_metadata().find(MetadataKey);
if (iter != cb.dynamicMetadata().filter_metadata().end()) {
auto address_it = iter->second.fields().find(DestinationAddressField);
@ -83,9 +64,28 @@ Envoy::Network::FilterStatus Filter::onAccept(Envoy::Network::ListenerFilterCall
} else {
ENVOY_LOG_MISC(trace, "Missing metadata field '{}'", TunnelAddressField);
}
return Envoy::Network::FilterStatus::Continue;
} else {
ENVOY_LOG_MISC(trace, "Cannot find dynamic metadata '{}'", MetadataKey);
}
// Second, check the filter state;
const auto* object = cb.filterState().getDataReadOnly<Authority>(FilterStateKey);
if (object) {
const auto local_address = Envoy::Network::Utility::parseInternetAddressAndPortNoThrow(
object->value_, /*v6only=*/false);
if (local_address) {
ENVOY_LOG_MISC(trace, "Restore local address from filter state: {}",
local_address->asString());
socket.connectionInfoProvider().restoreLocalAddress(local_address);
const auto tunnel_address =
Envoy::Network::Utility::getAddressWithPort(*local_address, object->port_);
cb.filterState().setData(Envoy::Network::DestinationAddress::key(),
std::make_shared<Envoy::Network::DestinationAddress>(tunnel_address),
Envoy::StreamInfo::FilterState::StateType::ReadOnly);
} else {
ENVOY_LOG_MISC(trace, "Failed to parse filter state address: {}", object->value_);
}
}
return Envoy::Network::FilterStatus::Continue;
}