refactor: make tr_socket_address a class (#5772)

This commit is contained in:
Charles Kerr 2023-07-12 17:29:47 -05:00 committed by GitHub
parent bc562eb9a5
commit a9a6e54858
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 91 additions and 38 deletions

View File

@ -90,7 +90,7 @@ namespace global_source_ip_helpers
{
tr_net_close_socket(sock);
errno = save;
return addrport->first;
return addrport->address();
}
}
}

View File

@ -538,7 +538,7 @@ std::pair<tr_address, std::byte const*> tr_address::from_compact_ipv6(std::byte
return std::make_pair(address, compact);
}
std::optional<std::pair<tr_address, tr_port>> tr_address::from_sockaddr(struct sockaddr const* from)
std::optional<tr_socket_address> tr_address::from_sockaddr(struct sockaddr const* from)
{
if (from == nullptr)
{
@ -551,7 +551,7 @@ std::optional<std::pair<tr_address, tr_port>> tr_address::from_sockaddr(struct s
auto addr = tr_address{};
addr.type = TR_AF_INET;
addr.addr.addr4 = sin->sin_addr;
return std::make_pair(addr, tr_port::fromNetwork(sin->sin_port));
return tr_socket_address{ addr, tr_port::fromNetwork(sin->sin_port) };
}
if (from->sa_family == AF_INET6)
@ -560,7 +560,7 @@ std::optional<std::pair<tr_address, tr_port>> tr_address::from_sockaddr(struct s
auto addr = tr_address{};
addr.type = TR_AF_INET6;
addr.addr.addr6 = sin6->sin6_addr;
return std::make_pair(addr, tr_port::fromNetwork(sin6->sin6_port));
return tr_socket_address{ addr, tr_port::fromNetwork(sin6->sin6_port) };
}
return {};

View File

@ -59,7 +59,8 @@ using tr_socket_t = int;
#define sockerrno errno
#endif
#include "tr-assert.h"
#include "libtransmission/tr-assert.h"
#include "libtransmission/utils.h"
/**
* Literally just a port number.
@ -144,10 +145,12 @@ enum tr_address_type
NUM_TR_AF_INET_TYPES
};
struct tr_socket_address;
struct tr_address
{
[[nodiscard]] static std::optional<tr_address> from_string(std::string_view address_sv);
[[nodiscard]] static std::optional<std::pair<tr_address, tr_port>> from_sockaddr(struct sockaddr const*);
[[nodiscard]] static std::optional<tr_socket_address> from_sockaddr(struct sockaddr const*);
[[nodiscard]] static std::pair<tr_address, std::byte const*> from_compact_ipv4(std::byte const* compact) noexcept;
[[nodiscard]] static std::pair<tr_address, std::byte const*> from_compact_ipv6(std::byte const* compact) noexcept;
@ -316,7 +319,59 @@ struct tr_address
[[nodiscard]] bool is_valid_for_peers(tr_port port) const noexcept;
};
using tr_socket_address = std::pair<tr_address, tr_port>;
struct tr_socket_address
{
tr_socket_address() = default;
tr_socket_address(tr_address const& address, tr_port port)
: address_{ address }
, port_{ port }
{
}
[[nodiscard]] constexpr auto const& address() const noexcept
{
return address_;
}
[[nodiscard]] constexpr auto port() const noexcept
{
return port_;
}
[[nodiscard]] auto display_name() const noexcept
{
return address_.display_name(port_);
}
[[nodiscard]] auto is_valid() const noexcept
{
return address_.is_valid();
}
[[nodiscard]] int compare(tr_socket_address const& that) const noexcept
{
if (auto const val = tr_compare_3way(address_, that.address_); val != 0)
{
return val;
}
return tr_compare_3way(port_, that.port_);
}
[[nodiscard]] auto operator<(tr_socket_address const& that) const noexcept
{
return compare(that) < 0;
}
[[nodiscard]] auto operator==(tr_socket_address const& that) const noexcept
{
return compare(that) == 0;
}
tr_address address_;
tr_port port_;
};
template<>
class std::hash<tr_socket_address>

View File

@ -133,8 +133,8 @@ private:
*/
struct peer_atom
{
peer_atom(tr_socket_address socket_address_in, uint8_t flags_in, uint8_t from)
: socket_address{ std::move(socket_address_in) }
peer_atom(tr_socket_address const& socket_address_in, uint8_t flags_in, uint8_t from)
: socket_address{ socket_address_in }
, fromFirst{ from }
, fromBest{ from }
, flags{ flags_in }
@ -165,22 +165,22 @@ struct peer_atom
[[nodiscard]] constexpr auto const& addr() const noexcept
{
return socket_address.first;
return socket_address.address();
}
[[nodiscard]] constexpr auto& port() noexcept
{
return socket_address.second;
return socket_address.port_;
}
[[nodiscard]] constexpr auto const& port() const noexcept
[[nodiscard]] constexpr auto port() const noexcept
{
return socket_address.second;
return socket_address.port();
}
[[nodiscard]] auto display_name() const
{
return addr().display_name(port());
return socket_address.display_name();
}
[[nodiscard]] bool isBlocklisted(tr_session const* session) const
@ -504,7 +504,7 @@ public:
peer_atom* ensure_atom_exists(tr_socket_address const& socket_address, uint8_t const flags, uint8_t const from)
{
TR_ASSERT(socket_address.first.is_valid());
TR_ASSERT(socket_address.is_valid());
TR_ASSERT(from < TR_PEER_FROM__MAX);
auto&& [atom_it, is_new] = pool.try_emplace(socket_address, socket_address, flags, from);
@ -1204,9 +1204,9 @@ void tr_peerMgrAddIncoming(tr_peerMgr* manager, tr_peer_socket&& socket)
}
else /* we don't have a connection to them yet... */
{
auto sock_addr = tr_socket_address{ socket.socketAddress() };
auto socket_address = socket.socketAddress();
manager->incoming_handshakes.try_emplace(
std::move(sock_addr),
socket_address,
&manager->handshake_mediator_,
tr_peerIo::new_incoming(session, &session->top_bandwidth_, std::move(socket)),
session->encryptionMode(),

View File

@ -18,9 +18,9 @@
#define tr_logAddDebugIo(io, msg) tr_logAddDebug(msg, (io)->display_name())
#define tr_logAddTraceIo(io, msg) tr_logAddTrace(msg, (io)->display_name())
tr_peer_socket::tr_peer_socket(tr_session const* session, tr_socket_address socket_address, tr_socket_t sock)
tr_peer_socket::tr_peer_socket(tr_session const* session, tr_socket_address const& socket_address, tr_socket_t sock)
: handle{ sock }
, socket_address_{ std::move(socket_address) }
, socket_address_{ socket_address }
, type_{ Type::TCP }
{
TR_ASSERT(sock != TR_BAD_SOCKET);
@ -36,8 +36,8 @@ tr_peer_socket::tr_peer_socket(tr_session const* session, tr_socket_address sock
tr_logAddTraceIo(this, fmt::format("socket (tcp) is {}", handle.tcp));
}
tr_peer_socket::tr_peer_socket(tr_socket_address socket_address, struct UTPSocket* const sock)
: socket_address_{ std::move(socket_address) }
tr_peer_socket::tr_peer_socket(tr_socket_address const& socket_address, struct UTPSocket* const sock)
: socket_address_{ socket_address }
, type_{ Type::UTP }
{
TR_ASSERT(sock != nullptr);

View File

@ -32,8 +32,8 @@ public:
using OutBuf = libtransmission::BufferReader<std::byte>;
tr_peer_socket() = default;
tr_peer_socket(tr_session const* session, tr_socket_address socket_address, tr_socket_t sock);
tr_peer_socket(tr_socket_address socket_address, struct UTPSocket* sock);
tr_peer_socket(tr_session const* session, tr_socket_address const& socket_address, tr_socket_t sock);
tr_peer_socket(tr_socket_address const& socket_address, struct UTPSocket* sock);
tr_peer_socket(tr_peer_socket&& s) noexcept
{
*this = std::move(s);
@ -67,12 +67,12 @@ public:
[[nodiscard]] constexpr auto const& address() const noexcept
{
return socket_address_.first;
return socket_address_.address();
}
[[nodiscard]] constexpr auto const& port() const noexcept
[[nodiscard]] constexpr auto port() const noexcept
{
return socket_address_.second;
return socket_address_.port();
}
template<typename OutputIt>

View File

@ -575,7 +575,7 @@ private:
{
if (auto addrport = tr_address::from_sockaddr(infop->ai_addr); addrport)
{
nodes.emplace_back(addrport->first, addrport->second);
nodes.emplace_back(*addrport);
}
}

View File

@ -253,7 +253,7 @@ void tr_session::tr_udp_core::sendto(void const* buf, size_t buflen, struct sock
return;
}
else if (
addrport && addrport->first.is_global_unicast_address() &&
addrport && addrport->address().is_global_unicast_address() &&
!session_.global_source_address(to->sa_family == AF_INET ? TR_AF_INET : TR_AF_INET6))
{
// don't try to connect to a global address if we don't have connectivity to public internet

View File

@ -383,7 +383,7 @@ protected:
MockTimerMaker mock_timer_maker_;
};
[[nodiscard]] static std::pair<tr_address, tr_port> getSockaddr(std::string_view name, tr_port port)
[[nodiscard]] static tr_socket_address getSockaddr(std::string_view name, tr_port port)
{
auto hints = addrinfo{};
hints.ai_socktype = SOCK_DGRAM;
@ -605,9 +605,9 @@ TEST_F(DhtTest, usesBootstrapFile)
5s);
ASSERT_EQ(1U, std::size(pinged));
auto const actual = pinged.front();
EXPECT_EQ(expected.first, actual.address);
EXPECT_EQ(expected.second, actual.port);
EXPECT_EQ(expected.first.display_name(expected.second), actual.address.display_name(actual.port));
EXPECT_EQ(expected.address(), actual.address);
EXPECT_EQ(expected.port(), actual.port);
EXPECT_EQ(expected.display_name(), actual.address.display_name(actual.port));
}
TEST_F(DhtTest, pingsAddedNodes)

View File

@ -116,8 +116,7 @@ public:
return private_key_;
}
void set_utp_failed(tr_sha1_digest_t const& /*info_hash*/, std::pair<tr_address, tr_port> const& /*socket_address*/)
override
void set_utp_failed(tr_sha1_digest_t const& /*info_hash*/, tr_socket_address const& /*socket_address*/) override
{
}
@ -161,8 +160,7 @@ public:
static auto constexpr ReservedBytesNoExtensions = std::array<uint8_t, 8>{ 0, 0, 0, 0, 0, 0, 0, 0 };
static auto constexpr PlaintextProtocolName = "\023BitTorrent protocol"sv;
std::pair<tr_address, tr_port> const DefaultPeerSockAddr{ *tr_address::from_string("127.0.0.1"sv),
tr_port::fromHost(8080) };
tr_socket_address const DefaultPeerSockAddr{ *tr_address::from_string("127.0.0.1"sv), tr_port::fromHost(8080) };
tr_handshake::Mediator::TorrentInfo const TorrentWeAreSeeding{ tr_sha1::digest("abcde"sv),
tr_peerIdInit(),
tr_torrent_id_t{ 100 },

View File

@ -43,8 +43,8 @@ TEST_F(NetTest, conversionsIPv4)
auto addrport = tr_address::from_sockaddr(reinterpret_cast<sockaddr const*>(&ss));
ASSERT_TRUE(addrport.has_value());
assert(addrport.has_value());
EXPECT_EQ(addr, addrport->first);
EXPECT_EQ(Port, addrport->second);
EXPECT_EQ(addr, addrport->address());
EXPECT_EQ(Port, addrport->port());
}
TEST_F(NetTest, trAddress)