* fix: encode `ip` in network byte order for udp announce (#6126)
(cherry picked from commit c70c49e87b
)
* fixup! fix: encode `ip` in network byte order for udp announce (#6126)
This commit is contained in:
parent
ba36954c6c
commit
90b86a17d8
|
@ -166,7 +166,10 @@ private:
|
||||||
|
|
||||||
struct tau_announce_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) }
|
: on_response_{ std::move(on_response) }
|
||||||
{
|
{
|
||||||
// https://www.bittorrent.org/beps/bep_0015.html sets key size at 32 bits
|
// https://www.bittorrent.org/beps/bep_0015.html sets key size at 32 bits
|
||||||
|
@ -187,7 +190,14 @@ struct tau_announce_request
|
||||||
buf.add_uint64(in.leftUntilComplete);
|
buf.add_uint64(in.leftUntilComplete);
|
||||||
buf.add_uint64(in.up);
|
buf.add_uint64(in.up);
|
||||||
buf.add_uint32(get_tau_announce_event(in.event));
|
buf.add_uint32(get_tau_announce_event(in.event));
|
||||||
buf.add_uint32(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.key);
|
||||||
buf.add_uint32(in.numwant);
|
buf.add_uint32(in.numwant);
|
||||||
buf.add_port(in.port);
|
buf.add_port(in.port);
|
||||||
|
@ -588,9 +598,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Since size of IP field is only 4 bytes long, we can only announce IPv4 addresses
|
// Since size of IP field is only 4 bytes long, we can only announce IPv4 addresses
|
||||||
auto const addr = mediator_.announceIP();
|
tracker->announces.emplace_back(mediator_.announceIP(), request, std::move(on_response));
|
||||||
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->upkeep(false);
|
tracker->upkeep(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "net.h" // tr_socket_t
|
#include "net.h" // tr_socket_t
|
||||||
|
#include "tr-assert.h"
|
||||||
#include "utils-ev.h"
|
#include "utils-ev.h"
|
||||||
#include "utils.h" // for tr_htonll(), tr_ntohll()
|
#include "utils.h" // for tr_htonll(), tr_ntohll()
|
||||||
|
|
||||||
|
@ -355,6 +356,22 @@ public:
|
||||||
add(&nport, sizeof(nport));
|
add(&nport, sizeof(nport));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void add_address(tr_address const& addr)
|
||||||
|
{
|
||||||
|
switch (addr.type)
|
||||||
|
{
|
||||||
|
case TR_AF_INET:
|
||||||
|
add(&addr.addr.addr4.s_addr, sizeof(addr.addr.addr4.s_addr));
|
||||||
|
break;
|
||||||
|
case TR_AF_INET6:
|
||||||
|
add(&addr.addr.addr6.s6_addr, sizeof(addr.addr.addr6.s6_addr));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
TR_ASSERT_MSG(false, "invalid type");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void add_uint8(uint8_t uch)
|
void add_uint8(uint8_t uch)
|
||||||
{
|
{
|
||||||
add(&uch, 1);
|
add(&uch, 1);
|
||||||
|
|
Loading…
Reference in New Issue