|
|
|
@ -1,5 +1,6 @@ |
|
|
|
#include "dvlnet/protocol_zt.h" |
|
|
|
#include "dvlnet/protocol_zt.h" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include <optional> |
|
|
|
#include <random> |
|
|
|
#include <random> |
|
|
|
|
|
|
|
|
|
|
|
#ifdef USE_SDL3 |
|
|
|
#ifdef USE_SDL3 |
|
|
|
@ -26,6 +27,31 @@ |
|
|
|
namespace devilution { |
|
|
|
namespace devilution { |
|
|
|
namespace net { |
|
|
|
namespace net { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
namespace { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
bool GetMAC(const protocol_zt::endpoint &peer, uint64_t &mac) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ip6_addr_t address = {}; |
|
|
|
|
|
|
|
IP6_ADDR_PART(&address, 0, peer.addr[0], peer.addr[1], peer.addr[2], peer.addr[3]); |
|
|
|
|
|
|
|
IP6_ADDR_PART(&address, 1, peer.addr[4], peer.addr[5], peer.addr[6], peer.addr[7]); |
|
|
|
|
|
|
|
IP6_ADDR_PART(&address, 2, peer.addr[8], peer.addr[9], peer.addr[10], peer.addr[11]); |
|
|
|
|
|
|
|
IP6_ADDR_PART(&address, 3, peer.addr[12], peer.addr[13], peer.addr[14], peer.addr[15]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const u8_t *hwaddr; |
|
|
|
|
|
|
|
if (nd6_get_next_hop_addr_or_queue(netif_default, nullptr, &address, &hwaddr) != ERR_OK) |
|
|
|
|
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
mac = hwaddr[0]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[1]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[2]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[3]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[4]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[5]; |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} // namespace
|
|
|
|
|
|
|
|
|
|
|
|
protocol_zt::protocol_zt() |
|
|
|
protocol_zt::protocol_zt() |
|
|
|
{ |
|
|
|
{ |
|
|
|
zerotier_network_start(); |
|
|
|
zerotier_network_start(); |
|
|
|
@ -346,27 +372,22 @@ bool protocol_zt::is_peer_connected(endpoint &peer) |
|
|
|
return it != peer_list.end() && it->second.fd != -1; |
|
|
|
return it != peer_list.end() && it->second.fd != -1; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
bool protocol_zt::is_peer_relayed(const endpoint &peer) const |
|
|
|
std::optional<bool> protocol_zt::is_peer_relayed(const endpoint &peer) const |
|
|
|
{ |
|
|
|
{ |
|
|
|
ip6_addr_t address = {}; |
|
|
|
uint64_t mac; |
|
|
|
IP6_ADDR_PART(&address, 0, peer.addr[0], peer.addr[1], peer.addr[2], peer.addr[3]); |
|
|
|
if (!GetMAC(peer, mac)) |
|
|
|
IP6_ADDR_PART(&address, 1, peer.addr[4], peer.addr[5], peer.addr[6], peer.addr[7]); |
|
|
|
return std::nullopt; |
|
|
|
IP6_ADDR_PART(&address, 2, peer.addr[8], peer.addr[9], peer.addr[10], peer.addr[11]); |
|
|
|
|
|
|
|
IP6_ADDR_PART(&address, 3, peer.addr[12], peer.addr[13], peer.addr[14], peer.addr[15]); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const u8_t *hwaddr; |
|
|
|
|
|
|
|
if (nd6_get_next_hop_addr_or_queue(netif_default, nullptr, &address, &hwaddr) != ERR_OK) |
|
|
|
|
|
|
|
return true; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
uint64_t mac = hwaddr[0]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[1]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[2]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[3]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[4]; |
|
|
|
|
|
|
|
mac = (mac << 8) | hwaddr[5]; |
|
|
|
|
|
|
|
return zerotier_is_relayed(mac); |
|
|
|
return zerotier_is_relayed(mac); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
std::optional<int> protocol_zt::get_latency_to(const endpoint &peer) const |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
uint64_t mac; |
|
|
|
|
|
|
|
if (!GetMAC(peer, mac)) |
|
|
|
|
|
|
|
return std::nullopt; |
|
|
|
|
|
|
|
return zerotier_latency(mac); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
std::string protocol_zt::make_default_gamename() |
|
|
|
std::string protocol_zt::make_default_gamename() |
|
|
|
{ |
|
|
|
{ |
|
|
|
std::string ret; |
|
|
|
std::string ret; |
|
|
|
|