From 460030bef8166a07d7d5840837bfa2ace0f79acd Mon Sep 17 00:00:00 2001 From: Raul Gutierrez Segales Date: Fri, 7 Jan 2022 14:10:16 -0500 Subject: [PATCH 1/2] IoHandle: simplify interfaceName() Was reading through #18531 and seeing the socket address being looked up for each interface confused me a bit, so let's do it only once. Signed-off-by: Raul Gutierrez Segales --- source/common/network/io_socket_handle_impl.cc | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/source/common/network/io_socket_handle_impl.cc b/source/common/network/io_socket_handle_impl.cc index c40e9f03d77e0..f7232267bd41c 100644 --- a/source/common/network/io_socket_handle_impl.cc +++ b/source/common/network/io_socket_handle_impl.cc @@ -587,11 +587,19 @@ absl::optional IoSocketHandleImpl::interfaceName() { return absl::nullopt; } + if (socket_address->ip()->version() != Address::IpVersion::v4 && + socket_address->ip()->version() != Address::IpVersion::v6) { + ENVOY_BUG(false, fmt::format("unexpected IP family {}", socket_address->ip()->version())); + } + Api::InterfaceAddressVector interface_addresses{}; const Api::SysCallIntResult rc = os_syscalls_singleton.getifaddrs(interface_addresses); RELEASE_ASSERT(!rc.return_value_, fmt::format("getiffaddrs error: {}", rc.errno_)); absl::optional selected_interface_name{}; + absl::uint128 socket_address_value = socket_address->ip()->version() == Address::IpVersion::v4 + ? socket_address->ip()->ipv4()->address() + : socket_address->ip()->ipv6()->address(); for (const auto& interface_address : interface_addresses) { if (!interface_address.interface_addr_) { continue; @@ -600,19 +608,16 @@ absl::optional IoSocketHandleImpl::interfaceName() { if (socket_address->ip()->version() == interface_address.interface_addr_->ip()->version()) { // Compare address _without port_. // TODO: create common addressAsStringWithoutPort method to simplify code here. - absl::uint128 socket_address_value; absl::uint128 interface_address_value; - switch (socket_address->ip()->version()) { + switch (interface_address.interface_addr_->ip()->version()) { case Address::IpVersion::v4: - socket_address_value = socket_address->ip()->ipv4()->address(); interface_address_value = interface_address.interface_addr_->ip()->ipv4()->address(); break; case Address::IpVersion::v6: - socket_address_value = socket_address->ip()->ipv6()->address(); interface_address_value = interface_address.interface_addr_->ip()->ipv6()->address(); break; default: - ENVOY_BUG(false, fmt::format("unexpected IP family {}", socket_address->ip()->version())); + NOT_REACHED_GCOVR_EXCL_LINE; } if (socket_address_value == interface_address_value) { From 26b46614a8bbe8df0a1fb817a4e769c565b3b867 Mon Sep 17 00:00:00 2001 From: Raul Gutierrez Segales Date: Fri, 7 Jan 2022 19:13:51 -0500 Subject: [PATCH 2/2] Drop the switch statement since we only have two options Signed-off-by: Raul Gutierrez Segales --- source/common/network/io_socket_handle_impl.cc | 15 ++++----------- 1 file changed, 4 insertions(+), 11 deletions(-) diff --git a/source/common/network/io_socket_handle_impl.cc b/source/common/network/io_socket_handle_impl.cc index f7232267bd41c..35708c61f508e 100644 --- a/source/common/network/io_socket_handle_impl.cc +++ b/source/common/network/io_socket_handle_impl.cc @@ -608,17 +608,10 @@ absl::optional IoSocketHandleImpl::interfaceName() { if (socket_address->ip()->version() == interface_address.interface_addr_->ip()->version()) { // Compare address _without port_. // TODO: create common addressAsStringWithoutPort method to simplify code here. - absl::uint128 interface_address_value; - switch (interface_address.interface_addr_->ip()->version()) { - case Address::IpVersion::v4: - interface_address_value = interface_address.interface_addr_->ip()->ipv4()->address(); - break; - case Address::IpVersion::v6: - interface_address_value = interface_address.interface_addr_->ip()->ipv6()->address(); - break; - default: - NOT_REACHED_GCOVR_EXCL_LINE; - } + absl::uint128 interface_address_value = + interface_address.interface_addr_->ip()->version() == Address::IpVersion::v4 + ? interface_address.interface_addr_->ip()->ipv4()->address() + : interface_address.interface_addr_->ip()->ipv6()->address(); if (socket_address_value == interface_address_value) { selected_interface_name = interface_address.interface_name_;