diff --git a/source/common/network/addr_family_aware_socket_option_impl.h b/source/common/network/addr_family_aware_socket_option_impl.h index 85a1075371eac..ff7ada58a947a 100644 --- a/source/common/network/addr_family_aware_socket_option_impl.h +++ b/source/common/network/addr_family_aware_socket_option_impl.h @@ -18,8 +18,17 @@ class AddrFamilyAwareSocketOptionImpl : public Socket::Option, AddrFamilyAwareSocketOptionImpl(envoy::config::core::v3::SocketOption::SocketState in_state, SocketOptionName ipv4_optname, SocketOptionName ipv6_optname, int value) - : ipv4_option_(std::make_unique(in_state, ipv4_optname, value)), - ipv6_option_(std::make_unique(in_state, ipv6_optname, value)) {} + : AddrFamilyAwareSocketOptionImpl(in_state, ipv4_optname, value, ipv6_optname, value) {} + AddrFamilyAwareSocketOptionImpl(envoy::config::core::v3::SocketOption::SocketState in_state, + SocketOptionName ipv4_optname, int ipv4_value, + SocketOptionName ipv6_optname, int ipv6_value) + : ipv4_option_(std::make_unique(in_state, ipv4_optname, ipv4_value)), + ipv6_option_(std::make_unique(in_state, ipv6_optname, ipv6_value)) {} + AddrFamilyAwareSocketOptionImpl(envoy::config::core::v3::SocketOption::SocketState in_state, + SocketOptionName ipv4_optname, absl::string_view ipv4_value, + SocketOptionName ipv6_optname, absl::string_view ipv6_value) + : ipv4_option_(std::make_unique(in_state, ipv4_optname, ipv4_value)), + ipv6_option_(std::make_unique(in_state, ipv6_optname, ipv6_value)) {} // Socket::Option bool setOption(Socket& socket, diff --git a/test/common/network/addr_family_aware_socket_option_impl_test.cc b/test/common/network/addr_family_aware_socket_option_impl_test.cc index cdea9a34f4801..f74f2896d0571 100644 --- a/test/common/network/addr_family_aware_socket_option_impl_test.cc +++ b/test/common/network/addr_family_aware_socket_option_impl_test.cc @@ -23,6 +23,36 @@ class AddrFamilyAwareSocketOptionImplTest : public SocketOptionTest { } }; +// Different values for v4 and v6 +TEST_F(AddrFamilyAwareSocketOptionImplTest, DifferentV4AndV6OptionValue) { + AddrFamilyAwareSocketOptionImpl socket_option{ + envoy::config::core::v3::SocketOption::STATE_PREBIND, ENVOY_MAKE_SOCKET_OPTION_NAME(5, 10), 1, + ENVOY_MAKE_SOCKET_OPTION_NAME(5, 10), 2}; + EXPECT_CALL(socket_, ipVersion()).WillRepeatedly(testing::Return(Address::IpVersion::v4)); + testSetSocketOptionSuccess(socket_option, ENVOY_MAKE_SOCKET_OPTION_NAME(5, 10), 1, + {envoy::config::core::v3::SocketOption::STATE_PREBIND}); + EXPECT_CALL(socket_, ipVersion()).WillRepeatedly(testing::Return(Address::IpVersion::v6)); + testSetSocketOptionSuccess(socket_option, ENVOY_MAKE_SOCKET_OPTION_NAME(5, 10), 2, + {envoy::config::core::v3::SocketOption::STATE_PREBIND}); +} + +// Different string values for v4 and v6. +TEST_F(AddrFamilyAwareSocketOptionImplTest, DifferentV4AndV6OptionData) { + AddrFamilyAwareSocketOptionImpl socket_option{ + envoy::config::core::v3::SocketOption::STATE_PREBIND, ENVOY_MAKE_SOCKET_OPTION_NAME(5, 10), + "hello", ENVOY_MAKE_SOCKET_OPTION_NAME(5, 10), "world"}; + EXPECT_CALL(socket_, ipVersion()).WillRepeatedly(testing::Return(Address::IpVersion::v4)); + EXPECT_EQ( + "hello", + socket_option.getOptionDetails(socket_, envoy::config::core::v3::SocketOption::STATE_PREBIND) + ->value_); + EXPECT_CALL(socket_, ipVersion()).WillRepeatedly(testing::Return(Address::IpVersion::v6)); + EXPECT_EQ( + "world", + socket_option.getOptionDetails(socket_, envoy::config::core::v3::SocketOption::STATE_PREBIND) + ->value_); +} + // We fail to set the option when the underlying setsockopt syscall fails. TEST_F(AddrFamilyAwareSocketOptionImplTest, SetOptionFailure) { EXPECT_CALL(socket_, ipVersion).WillRepeatedly(testing::Return(absl::nullopt));