Skip to content

Commit 3c188fb

Browse files
StephenCWillsAJenbo
authored andcommitted
Check if peers are ready before sending info request
1 parent 424cbe1 commit 3c188fb

5 files changed

Lines changed: 19 additions & 2 deletions

File tree

Source/dvlnet/base_protocol.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -126,9 +126,9 @@ bool base_protocol<P>::wait_firstpeer()
126126
template <class P>
127127
bool base_protocol<P>::send_info_request()
128128
{
129-
tl::expected<bool, PacketError> status = proto.network_online();
129+
tl::expected<bool, PacketError> status = proto.peers_ready();
130130
if (!status.has_value()) {
131-
LogError("network_online: {}", status.error().what());
131+
LogError("peers_ready: {}", status.error().what());
132132
return false;
133133
}
134134
if (!*status)

Source/dvlnet/protocol_zt.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,12 @@ tl::expected<bool, PacketError> protocol_zt::network_online()
9090
return true;
9191
}
9292

93+
tl::expected<bool, PacketError> protocol_zt::peers_ready()
94+
{
95+
return network_online()
96+
.map([&](bool isOnline) { return isOnline && zerotier_peers_ready(); });
97+
}
98+
9399
tl::expected<void, PacketError> protocol_zt::send(const endpoint &peer, const buffer_t &data)
94100
{
95101
tl::expected<buffer_t, PacketError> frame = frame_queue::MakeFrame(data);

Source/dvlnet/protocol_zt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@ class protocol_zt {
8282
bool recv(endpoint &peer, buffer_t &data);
8383
bool get_disconnected(endpoint &peer);
8484
tl::expected<bool, PacketError> network_online();
85+
tl::expected<bool, PacketError> peers_ready();
8586
bool is_peer_connected(endpoint &peer);
8687
bool is_peer_relayed(const endpoint &peer) const;
8788
static std::string make_default_gamename();

Source/dvlnet/zerotier_native.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ constexpr uint64_t ZtNetwork = 0xa84ac5c10a7ebb5f;
4646
std::atomic_bool zt_network_ready(false);
4747
std::atomic_bool zt_node_online(false);
4848
std::atomic_bool zt_joined(false);
49+
std::atomic_uint zt_peers_ready(0);
4950

5051
ankerl::unordered_dense::map<uint64_t, zts_event_t> ztPeerEvents;
5152

@@ -142,6 +143,7 @@ void Callback(void *ptr)
142143
Log("ZeroTier: ZTS_EVENT_NETWORK_READY_IP6, networkId={:x}", (unsigned long long)msg->network->net_id);
143144
zt_ip6setup();
144145
zt_network_ready = true;
146+
zt_peers_ready = SDL_GetTicks();
145147
break;
146148

147149
case ZTS_EVENT_ADDR_ADDED_IP6:
@@ -151,6 +153,8 @@ void Callback(void *ptr)
151153
case ZTS_EVENT_PEER_DIRECT:
152154
case ZTS_EVENT_PEER_RELAY:
153155
ztPeerEvents[msg->peer->peer_id] = static_cast<zts_event_t>(msg->event_code);
156+
if (!zerotier_peers_ready())
157+
zt_peers_ready = SDL_GetTicks();
154158
break;
155159

156160
case ZTS_EVENT_PEER_PATH_DEAD:
@@ -166,6 +170,11 @@ bool zerotier_network_ready()
166170
return zt_network_ready && zt_node_online;
167171
}
168172

173+
bool zerotier_peers_ready()
174+
{
175+
return SDL_GetTicks() - zt_peers_ready >= 5000;
176+
}
177+
169178
void zerotier_network_start()
170179
{
171180
std::string configPath = paths::ConfigPath();

Source/dvlnet/zerotier_native.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace devilution {
66
namespace net {
77

88
bool zerotier_network_ready();
9+
bool zerotier_peers_ready();
910
void zerotier_network_start();
1011
bool zerotier_is_relayed(uint64_t mac);
1112

0 commit comments

Comments
 (0)