You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
1.7 KiB
70 lines
1.7 KiB
#include "dvlnet/zerotier_native.h" |
|
|
|
#include <SDL.h> |
|
#include <atomic> |
|
|
|
#ifdef USE_SDL1 |
|
#include "utils/sdl2_to_1_2_backports.h" |
|
#else |
|
#include "utils/sdl2_backports.h" |
|
#endif |
|
|
|
#include <ZeroTierSockets.h> |
|
#include <cstdlib> |
|
|
|
#include "utils/paths.h" |
|
#include "utils/log.hpp" |
|
|
|
#include "dvlnet/zerotier_lwip.h" |
|
|
|
namespace devilution::net { |
|
|
|
//static constexpr uint64_t zt_earth = 0x8056c2e21c000001; |
|
static constexpr uint64_t ZtNetwork = 0xaf78bf943649eb12; |
|
|
|
static std::atomic_bool zt_network_ready(false); |
|
static std::atomic_bool zt_node_online(false); |
|
static std::atomic_bool zt_started(false); |
|
static std::atomic_bool zt_joined(false); |
|
|
|
static void Callback(struct zts_callback_msg *msg) |
|
{ |
|
//printf("callback %i\n", msg->eventCode); |
|
if (msg->eventCode == ZTS_EVENT_NODE_ONLINE) { |
|
Log("ZeroTier: ZTS_EVENT_NODE_ONLINE, nodeId={:x}", (unsigned long long)msg->node->address); |
|
zt_node_online = true; |
|
if (!zt_joined) { |
|
zts_join(ZtNetwork); |
|
zt_joined = true; |
|
} |
|
} else if (msg->eventCode == ZTS_EVENT_NODE_OFFLINE) { |
|
Log("ZeroTier: ZTS_EVENT_NODE_OFFLINE"); |
|
zt_node_online = false; |
|
} else if (msg->eventCode == ZTS_EVENT_NETWORK_READY_IP6) { |
|
Log("ZeroTier: ZTS_EVENT_NETWORK_READY_IP6, networkId={:x}", (unsigned long long)msg->network->nwid); |
|
zt_ip6setup(); |
|
zt_network_ready = true; |
|
} else if (msg->eventCode == ZTS_EVENT_ADDR_ADDED_IP6) { |
|
print_ip6_addr(&(msg->addr->addr)); |
|
} |
|
} |
|
|
|
bool zerotier_network_ready() |
|
{ |
|
return zt_network_ready && zt_node_online; |
|
} |
|
|
|
void zerotier_network_stop() |
|
{ |
|
zts_stop(); |
|
} |
|
|
|
void zerotier_network_start() |
|
{ |
|
if (zt_started) |
|
return; |
|
zts_start(paths::PrefPath().c_str(), (void (*)(void *))Callback, 0); |
|
std::atexit(zerotier_network_stop); |
|
} |
|
|
|
} // namespace devilution::net
|
|
|