#include "dvlnet/zerotier_native.h" #include #include #ifdef USE_SDL1 #include "utils/sdl2_to_1_2_backports.h" #else #include "utils/sdl2_backports.h" #endif #include #include #include "utils/log.hpp" #include "utils/paths.h" #include "dvlnet/zerotier_lwip.h" namespace devilution { namespace 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; std::string ztpath = paths::PrefPath() + "zerotier"; zts_start(ztpath.c_str(), (void (*)(void *))Callback, 0); std::atexit(zerotier_network_stop); } } // namespace net } // namespace devilution