0001
0002
0003
0004
0005
0006 #include "timers.h"
0007 #include "device.h"
0008 #include "peer.h"
0009 #include "queueing.h"
0010 #include "socket.h"
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 static inline void mod_peer_timer(struct wg_peer *peer,
0031 struct timer_list *timer,
0032 unsigned long expires)
0033 {
0034 rcu_read_lock_bh();
0035 if (likely(netif_running(peer->device->dev) &&
0036 !READ_ONCE(peer->is_dead)))
0037 mod_timer(timer, expires);
0038 rcu_read_unlock_bh();
0039 }
0040
0041 static void wg_expired_retransmit_handshake(struct timer_list *timer)
0042 {
0043 struct wg_peer *peer = from_timer(peer, timer,
0044 timer_retransmit_handshake);
0045
0046 if (peer->timer_handshake_attempts > MAX_TIMER_HANDSHAKES) {
0047 pr_debug("%s: Handshake for peer %llu (%pISpfsc) did not complete after %d attempts, giving up\n",
0048 peer->device->dev->name, peer->internal_id,
0049 &peer->endpoint.addr, MAX_TIMER_HANDSHAKES + 2);
0050
0051 del_timer(&peer->timer_send_keepalive);
0052
0053
0054
0055 wg_packet_purge_staged_packets(peer);
0056
0057
0058
0059
0060 if (!timer_pending(&peer->timer_zero_key_material))
0061 mod_peer_timer(peer, &peer->timer_zero_key_material,
0062 jiffies + REJECT_AFTER_TIME * 3 * HZ);
0063 } else {
0064 ++peer->timer_handshake_attempts;
0065 pr_debug("%s: Handshake for peer %llu (%pISpfsc) did not complete after %d seconds, retrying (try %d)\n",
0066 peer->device->dev->name, peer->internal_id,
0067 &peer->endpoint.addr, REKEY_TIMEOUT,
0068 peer->timer_handshake_attempts + 1);
0069
0070
0071
0072
0073 wg_socket_clear_peer_endpoint_src(peer);
0074
0075 wg_packet_send_queued_handshake_initiation(peer, true);
0076 }
0077 }
0078
0079 static void wg_expired_send_keepalive(struct timer_list *timer)
0080 {
0081 struct wg_peer *peer = from_timer(peer, timer, timer_send_keepalive);
0082
0083 wg_packet_send_keepalive(peer);
0084 if (peer->timer_need_another_keepalive) {
0085 peer->timer_need_another_keepalive = false;
0086 mod_peer_timer(peer, &peer->timer_send_keepalive,
0087 jiffies + KEEPALIVE_TIMEOUT * HZ);
0088 }
0089 }
0090
0091 static void wg_expired_new_handshake(struct timer_list *timer)
0092 {
0093 struct wg_peer *peer = from_timer(peer, timer, timer_new_handshake);
0094
0095 pr_debug("%s: Retrying handshake with peer %llu (%pISpfsc) because we stopped hearing back after %d seconds\n",
0096 peer->device->dev->name, peer->internal_id,
0097 &peer->endpoint.addr, KEEPALIVE_TIMEOUT + REKEY_TIMEOUT);
0098
0099
0100
0101 wg_socket_clear_peer_endpoint_src(peer);
0102 wg_packet_send_queued_handshake_initiation(peer, false);
0103 }
0104
0105 static void wg_expired_zero_key_material(struct timer_list *timer)
0106 {
0107 struct wg_peer *peer = from_timer(peer, timer, timer_zero_key_material);
0108
0109 rcu_read_lock_bh();
0110 if (!READ_ONCE(peer->is_dead)) {
0111 wg_peer_get(peer);
0112 if (!queue_work(peer->device->handshake_send_wq,
0113 &peer->clear_peer_work))
0114
0115
0116
0117 wg_peer_put(peer);
0118 }
0119 rcu_read_unlock_bh();
0120 }
0121
0122 static void wg_queued_expired_zero_key_material(struct work_struct *work)
0123 {
0124 struct wg_peer *peer = container_of(work, struct wg_peer,
0125 clear_peer_work);
0126
0127 pr_debug("%s: Zeroing out all keys for peer %llu (%pISpfsc), since we haven't received a new one in %d seconds\n",
0128 peer->device->dev->name, peer->internal_id,
0129 &peer->endpoint.addr, REJECT_AFTER_TIME * 3);
0130 wg_noise_handshake_clear(&peer->handshake);
0131 wg_noise_keypairs_clear(&peer->keypairs);
0132 wg_peer_put(peer);
0133 }
0134
0135 static void wg_expired_send_persistent_keepalive(struct timer_list *timer)
0136 {
0137 struct wg_peer *peer = from_timer(peer, timer,
0138 timer_persistent_keepalive);
0139
0140 if (likely(peer->persistent_keepalive_interval))
0141 wg_packet_send_keepalive(peer);
0142 }
0143
0144
0145 void wg_timers_data_sent(struct wg_peer *peer)
0146 {
0147 if (!timer_pending(&peer->timer_new_handshake))
0148 mod_peer_timer(peer, &peer->timer_new_handshake,
0149 jiffies + (KEEPALIVE_TIMEOUT + REKEY_TIMEOUT) * HZ +
0150 prandom_u32_max(REKEY_TIMEOUT_JITTER_MAX_JIFFIES));
0151 }
0152
0153
0154 void wg_timers_data_received(struct wg_peer *peer)
0155 {
0156 if (likely(netif_running(peer->device->dev))) {
0157 if (!timer_pending(&peer->timer_send_keepalive))
0158 mod_peer_timer(peer, &peer->timer_send_keepalive,
0159 jiffies + KEEPALIVE_TIMEOUT * HZ);
0160 else
0161 peer->timer_need_another_keepalive = true;
0162 }
0163 }
0164
0165
0166
0167
0168 void wg_timers_any_authenticated_packet_sent(struct wg_peer *peer)
0169 {
0170 del_timer(&peer->timer_send_keepalive);
0171 }
0172
0173
0174
0175
0176 void wg_timers_any_authenticated_packet_received(struct wg_peer *peer)
0177 {
0178 del_timer(&peer->timer_new_handshake);
0179 }
0180
0181
0182 void wg_timers_handshake_initiated(struct wg_peer *peer)
0183 {
0184 mod_peer_timer(peer, &peer->timer_retransmit_handshake,
0185 jiffies + REKEY_TIMEOUT * HZ +
0186 prandom_u32_max(REKEY_TIMEOUT_JITTER_MAX_JIFFIES));
0187 }
0188
0189
0190
0191
0192 void wg_timers_handshake_complete(struct wg_peer *peer)
0193 {
0194 del_timer(&peer->timer_retransmit_handshake);
0195 peer->timer_handshake_attempts = 0;
0196 peer->sent_lastminute_handshake = false;
0197 ktime_get_real_ts64(&peer->walltime_last_handshake);
0198 }
0199
0200
0201
0202
0203 void wg_timers_session_derived(struct wg_peer *peer)
0204 {
0205 mod_peer_timer(peer, &peer->timer_zero_key_material,
0206 jiffies + REJECT_AFTER_TIME * 3 * HZ);
0207 }
0208
0209
0210
0211
0212 void wg_timers_any_authenticated_packet_traversal(struct wg_peer *peer)
0213 {
0214 if (peer->persistent_keepalive_interval)
0215 mod_peer_timer(peer, &peer->timer_persistent_keepalive,
0216 jiffies + peer->persistent_keepalive_interval * HZ);
0217 }
0218
0219 void wg_timers_init(struct wg_peer *peer)
0220 {
0221 timer_setup(&peer->timer_retransmit_handshake,
0222 wg_expired_retransmit_handshake, 0);
0223 timer_setup(&peer->timer_send_keepalive, wg_expired_send_keepalive, 0);
0224 timer_setup(&peer->timer_new_handshake, wg_expired_new_handshake, 0);
0225 timer_setup(&peer->timer_zero_key_material,
0226 wg_expired_zero_key_material, 0);
0227 timer_setup(&peer->timer_persistent_keepalive,
0228 wg_expired_send_persistent_keepalive, 0);
0229 INIT_WORK(&peer->clear_peer_work, wg_queued_expired_zero_key_material);
0230 peer->timer_handshake_attempts = 0;
0231 peer->sent_lastminute_handshake = false;
0232 peer->timer_need_another_keepalive = false;
0233 }
0234
0235 void wg_timers_stop(struct wg_peer *peer)
0236 {
0237 del_timer_sync(&peer->timer_retransmit_handshake);
0238 del_timer_sync(&peer->timer_send_keepalive);
0239 del_timer_sync(&peer->timer_new_handshake);
0240 del_timer_sync(&peer->timer_zero_key_material);
0241 del_timer_sync(&peer->timer_persistent_keepalive);
0242 flush_work(&peer->clear_peer_work);
0243 }