Merge pull request #95067 from Faless/enet/fix_dtls_disconnect

[ENet] Better handle disconnected peers in DTLS server
This commit is contained in:
Rémi Verschelde 2024-08-06 12:31:33 +02:00
commit ed991f890e
No known key found for this signature in database
GPG Key ID: C3336907360768E1

View File

@ -299,7 +299,12 @@ public:
Error sendto(const uint8_t *p_buffer, int p_len, int &r_sent, IPAddress p_ip, uint16_t p_port) { Error sendto(const uint8_t *p_buffer, int p_len, int &r_sent, IPAddress p_ip, uint16_t p_port) {
String key = String(p_ip) + ":" + itos(p_port); String key = String(p_ip) + ":" + itos(p_port);
ERR_FAIL_COND_V(!peers.has(key), ERR_UNAVAILABLE); if (unlikely(!peers.has(key))) {
// The peer might have been disconnected due to a DTLS error.
// We need to wait for it to time out, just mark the packet as sent.
r_sent = p_len;
return OK;
}
Ref<PacketPeerDTLS> peer = peers[key]; Ref<PacketPeerDTLS> peer = peers[key];
Error err = peer->put_packet(p_buffer, p_len); Error err = peer->put_packet(p_buffer, p_len);
if (err == OK) { if (err == OK) {
@ -307,7 +312,10 @@ public:
} else if (err == ERR_BUSY) { } else if (err == ERR_BUSY) {
r_sent = 0; r_sent = 0;
} else { } else {
r_sent = -1; // The peer might have been disconnected due to a DTLS error.
// We need to wait for it to time out, just mark the packet as sent.
r_sent = p_len;
return OK;
} }
return err; return err;
} }
@ -331,7 +339,7 @@ public:
Error err = ERR_BUSY; Error err = ERR_BUSY;
// TODO this needs to be fair! // TODO this needs to be fair!
for (KeyValue<String, Ref<PacketPeerDTLS>> & E : peers) { for (KeyValue<String, Ref<PacketPeerDTLS>> &E : peers) {
Ref<PacketPeerDTLS> peer = E.value; Ref<PacketPeerDTLS> peer = E.value;
peer->poll(); peer->poll();
@ -349,7 +357,8 @@ public:
if (err != OK || p_len < r_read) { if (err != OK || p_len < r_read) {
// Something wrong with this peer, removing it. // Something wrong with this peer, removing it.
remove.push_back(E.key); remove.push_back(E.key);
err = FAILED; err = ERR_BUSY;
r_read = 0;
continue; continue;
} }
@ -549,7 +558,7 @@ int enet_socket_receive(ENetSocket socket, ENetAddress *address, ENetBuffer *buf
return read; return read;
} }
int enet_socket_get_address (ENetSocket socket, ENetAddress * address) { int enet_socket_get_address(ENetSocket socket, ENetAddress *address) {
IPAddress ip; IPAddress ip;
uint16_t port; uint16_t port;
ENetGodotSocket *sock = (ENetGodotSocket *)socket; ENetGodotSocket *sock = (ENetGodotSocket *)socket;