Skip to content

Commit

Permalink
refactor: add tr_buffer::add_adddress()
Browse files Browse the repository at this point in the history
  • Loading branch information
tearfur committed Oct 18, 2023
1 parent d29d573 commit 5f755d4
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 7 deletions.
18 changes: 13 additions & 5 deletions libtransmission/announcer-udp.cc
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,10 @@ struct tau_scrape_request

struct tau_announce_request
{
tau_announce_request(uint32_t announce_ip, tr_announce_request const& in, tr_announce_response_func on_response)
tau_announce_request(
std::optional<tr_address> announce_ip,
tr_announce_request const& in,
tr_announce_response_func on_response)
: on_response_{ std::move(on_response) }
{
// https://www.bittorrent.org/beps/bep_0015.html sets key size at 32 bits
Expand All @@ -187,7 +190,14 @@ struct tau_announce_request
buf.add_uint64(in.leftUntilComplete);
buf.add_uint64(in.up);
buf.add_uint32(get_tau_announce_event(in.event));
buf.add_uint32_n(announce_ip);
if (announce_ip && announce_ip->is_ipv4())
{
buf.add_address(*announce_ip);
}
else
{
buf.add_uint32(0U);
}
buf.add_uint32(in.key);
buf.add_uint32(in.numwant);
buf.add_port(in.port);
Expand Down Expand Up @@ -585,9 +595,7 @@ class tr_announcer_udp_impl final : public tr_announcer_udp
}

// Since size of IP field is only 4 bytes long, we can only announce IPv4 addresses
auto const addr = mediator_.announce_ip();
uint32_t const announce_ip = addr && addr->is_ipv4() ? addr->addr.addr4.s_addr : 0;
tracker->announces.emplace_back(announce_ip, request, std::move(on_response));
tracker->announces.emplace_back(mediator_.announce_ip(), request, std::move(on_response));
tracker->upkeep(false);
}

Expand Down
4 changes: 2 additions & 2 deletions libtransmission/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -181,13 +181,13 @@ struct tr_address
template<typename OutputIt>
static OutputIt to_compact_ipv4(OutputIt out, in_addr const& addr4)
{
return std::copy_n(reinterpret_cast<std::byte const*>(&addr4), sizeof(addr4), out);
return std::copy_n(reinterpret_cast<std::byte const*>(&addr4.s_addr), sizeof(addr4.s_addr), out);
}

template<typename OutputIt>
static OutputIt to_compact_ipv6(OutputIt out, in6_addr const& addr6)
{
return std::copy_n(reinterpret_cast<std::byte const*>(&addr6), sizeof(addr6), out);
return std::copy_n(reinterpret_cast<std::byte const*>(&addr6.s6_addr), sizeof(addr6.s6_addr), out);
}

template<typename OutputIt>
Expand Down
16 changes: 16 additions & 0 deletions libtransmission/tr-buffer.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,22 @@ class BufferWriter
add(&nport, sizeof(nport));
}

void add_address(tr_address const& addr)
{
switch (addr.type)
{
case TR_AF_INET:
add(&addr.addr.addr4, sizeof(addr.addr.addr4.s_addr));
break;
case TR_AF_INET6:
add(&addr.addr.addr6, sizeof(addr.addr.addr6.s6_addr));
break;
default:
TR_ASSERT_MSG(false, "invalid type");
break;
}
}

size_t add_socket(tr_socket_t sockfd, size_t n_bytes, tr_error** error = nullptr)
{
auto const [buf, buflen] = reserve_space(n_bytes);
Expand Down

0 comments on commit 5f755d4

Please sign in to comment.