refactor: replace all evutil_make_listen_socket_ipv6only usages (#7779)

This commit is contained in:
Yat Ho
2025-11-09 06:36:54 +08:00
committed by GitHub
parent d0996479de
commit ace36c922d
4 changed files with 14 additions and 7 deletions

View File

@@ -99,6 +99,15 @@ tr_address_type tr_af_to_ip_protocol(int af)
}
}
int tr_make_listen_socket_ipv6only(tr_socket_t const sock)
{
#if defined(IPV6_V6ONLY)
int optval = 1;
return setsockopt(sock, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char const*>(&optval), sizeof(optval));
#endif
return 0;
}
// - TCP Sockets
[[nodiscard]] std::optional<tr_tos_t> tr_tos_t::from_string(std::string_view name)
@@ -325,17 +334,13 @@ tr_socket_t tr_netBindTCPImpl(tr_address const& addr, tr_port port, bool suppres
(void)setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, reinterpret_cast<char const*>(&optval), sizeof(optval));
(void)evutil_make_listen_socket_reuseable(fd);
#ifdef IPV6_V6ONLY
// TODO(tearfur): Consider using `evutil_make_listen_socket_ipv6only` once minimum libevent version is bumped to 2.1.9 or above
if (addr.is_ipv6() &&
setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, reinterpret_cast<char const*>(&optval), sizeof(optval)) == -1 &&
if (addr.is_ipv6() && tr_make_listen_socket_ipv6only(fd) == -1 &&
sockerrno != ENOPROTOOPT) // if the kernel doesn't support it, ignore it
{
*err_out = sockerrno;
tr_net_close_socket(fd);
return TR_BAD_SOCKET;
}
#endif
auto const [sock, addrlen] = tr_socket_address::to_sockaddr(addr, port);

View File

@@ -556,3 +556,5 @@ void tr_netSetTOS(tr_socket_t sock, int tos, tr_address_type type);
* @param err an errno on Unix/Linux and an WSAError on win32)
*/
[[nodiscard]] std::string tr_net_strerror(int err);
[[nodiscard]] int tr_make_listen_socket_ipv6only(tr_socket_t sock);

View File

@@ -335,7 +335,7 @@ private:
if constexpr (ip_protocol == TR_AF_INET6)
{
// must be done before binding on Linux
if (evutil_make_listen_socket_ipv6only(sock) == -1)
if (tr_make_listen_socket_ipv6only(sock) == -1)
{
return false;
}

View File

@@ -213,7 +213,7 @@ tr_session::tr_udp_core::tr_udp_core(tr_session& session, tr_port udp_port)
else if (auto sock = socket(PF_INET6, SOCK_DGRAM, 0); sock != TR_BAD_SOCKET)
{
(void)evutil_make_listen_socket_reuseable(sock);
(void)evutil_make_listen_socket_ipv6only(sock);
(void)tr_make_listen_socket_ipv6only(sock);
auto const addr = session_.bind_address(TR_AF_INET6);
auto const [ss, sslen] = tr_socket_address::to_sockaddr(addr, udp_port_);