diff options
| author | Felix Fietkau | 2025-01-29 20:43:02 +0000 |
|---|---|---|
| committer | Felix Fietkau | 2025-01-29 20:45:36 +0000 |
| commit | 082b5482b97f20dc4745bc3d645e33b584cc28e4 (patch) | |
| tree | eba265a165e688a9422dd0a1d612e0b3a4894cc5 | |
| parent | 24e4aafaaa2fba1e073491627fe56e0e143ac956 (diff) | |
| download | unetd-082b5482b97f20dc4745bc3d645e33b584cc28e4.tar.gz | |
pex: improve keepalive handling
Whenever idle time exceeds keepalive time, ping up to once
every 1+keepalive/2 interval. Avoids spuriously treating a peer as
disconnected.
Signed-off-by: Felix Fietkau <nbd@nbd.name>
| -rw-r--r-- | host.h | 2 | ||||
| -rw-r--r-- | pex.c | 4 | ||||
| -rw-r--r-- | wg.c | 3 |
3 files changed, 5 insertions, 4 deletions
@@ -30,7 +30,6 @@ struct network_peer { bool connected; bool handshake; bool has_local_ep_addr; - bool pinged; union network_addr local_ep_addr; union network_endpoint endpoint; @@ -43,6 +42,7 @@ struct network_peer { uint64_t last_request; uint64_t last_query_sent; + int ping_wait; int last_handshake_diff; int idle; int num_net_queries; @@ -389,12 +389,12 @@ network_pex_query_hosts(struct network *net) static void network_pex_send_ping(struct network *net, struct network_peer *peer) { - if (peer->state.pinged || !peer->state.endpoint.sa.sa_family) + if (peer->state.ping_wait > 0 || !peer->state.endpoint.sa.sa_family) return; pex_msg_init(net, PEX_MSG_PING); pex_msg_send(net, peer); - peer->state.pinged = true; + peer->state.ping_wait = 1 + net->net_config.keepalive / 2; } static void @@ -52,6 +52,8 @@ struct network_peer *wg_peer_update_start(struct network *net, const uint8_t *ke peer->state.handshake = false; peer->state.idle++; + if (peer->state.ping_wait > 0) + peer->state.ping_wait--; if (peer->state.idle >= 2 * net->net_config.keepalive) wg_peer_set_connected(net, peer, false); if (peer->state.idle > net->net_config.keepalive) @@ -80,7 +82,6 @@ void wg_peer_set_last_handshake(struct network *net, struct network_peer *peer, if (peer->state.idle > sec) peer->state.idle = sec; wg_peer_set_connected(net, peer, true); - peer->state.pinged = false; } } |