diff --git a/source/extensions/filters/listener/set_internal_dst_address/filter.cc b/source/extensions/filters/listener/set_internal_dst_address/filter.cc index fdcb0cdf6..e0a5084a6 100644 --- a/source/extensions/filters/listener/set_internal_dst_address/filter.cc +++ b/source/extensions/filters/listener/set_internal_dst_address/filter.cc @@ -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(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(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(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(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; }