summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/config.c7
-rw-r--r--src/timers.c3
2 files changed, 8 insertions, 2 deletions
diff --git a/src/config.c b/src/config.c
index 3ca23f3..8750407 100644
--- a/src/config.c
+++ b/src/config.c
@@ -107,8 +107,11 @@ static int set_peer(struct wireguard_device *wg, void __user *user_peer, size_t
if (in_peer.persistent_keepalive_interval && (in_peer.persistent_keepalive_interval < 10 || in_peer.persistent_keepalive_interval > 3600))
ret = -EINVAL;
else {
- if (!peer->persistent_keepalive_interval && in_peer.persistent_keepalive_interval && netdev_pub(wg)->flags & IFF_UP)
- packet_send_keepalive(peer);
+ if (in_peer.persistent_keepalive_interval && netdev_pub(wg)->flags & IFF_UP) {
+ if (!peer->persistent_keepalive_interval)
+ packet_send_keepalive(peer);
+ set_timer_slack(&peer->timer_persistent_keepalive, max_t(int, HZ / 2, (unsigned long)in_peer.persistent_keepalive_interval * HZ / 256));
+ }
peer->persistent_keepalive_interval = (unsigned long)in_peer.persistent_keepalive_interval * HZ;
}
}
diff --git a/src/timers.c b/src/timers.c
index 190cb6e..4f840c6 100644
--- a/src/timers.c
+++ b/src/timers.c
@@ -154,10 +154,12 @@ void timers_init_peer(struct wireguard_peer *peer)
init_timer(&peer->timer_send_keepalive);
peer->timer_send_keepalive.function = expired_send_keepalive;
peer->timer_send_keepalive.data = (unsigned long)peer;
+ set_timer_slack(&peer->timer_send_keepalive, HZ / 4);
init_timer(&peer->timer_new_handshake);
peer->timer_new_handshake.function = expired_new_handshake;
peer->timer_new_handshake.data = (unsigned long)peer;
+ set_timer_slack(&peer->timer_new_handshake, HZ / 4);
init_timer(&peer->timer_kill_ephemerals);
peer->timer_kill_ephemerals.function = expired_kill_ephemerals;
@@ -166,6 +168,7 @@ void timers_init_peer(struct wireguard_peer *peer)
init_timer(&peer->timer_persistent_keepalive);
peer->timer_persistent_keepalive.function = expired_send_persistent_keepalive;
peer->timer_persistent_keepalive.data = (unsigned long)peer;
+ set_timer_slack(&peer->timer_persistent_keepalive, max_t(int, HZ / 2, peer->persistent_keepalive_interval / 256));
INIT_WORK(&peer->clear_peer_work, queued_expired_kill_ephemerals);
}