refactor: make tr_socket_address a class (#5772)
This commit is contained in:
parent
bc562eb9a5
commit
a9a6e54858
|
@ -90,7 +90,7 @@ namespace global_source_ip_helpers
|
|||
{
|
||||
tr_net_close_socket(sock);
|
||||
errno = save;
|
||||
return addrport->first;
|
||||
return addrport->address();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {};
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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(),
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 },
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue