xref: /linux/drivers/net/ovpn/peer.c (revision 2a611c4a1cbcb179cd8079a7ccadee390dac66f6)
1 // SPDX-License-Identifier: GPL-2.0
2 /*  OpenVPN data channel offload
3  *
4  *  Copyright (C) 2020-2025 OpenVPN, Inc.
5  *
6  *  Author:	James Yonan <james@openvpn.net>
7  *		Antonio Quartulli <antonio@openvpn.net>
8  */
9 
10 #include <linux/skbuff.h>
11 #include <linux/list.h>
12 #include <linux/hashtable.h>
13 #include <net/ip6_route.h>
14 
15 #include "ovpnpriv.h"
16 #include "bind.h"
17 #include "pktid.h"
18 #include "crypto.h"
19 #include "io.h"
20 #include "main.h"
21 #include "netlink.h"
22 #include "peer.h"
23 #include "socket.h"
24 
25 static void unlock_ovpn(struct ovpn_priv *ovpn,
26 			 struct llist_head *release_list)
27 	__releases(&ovpn->lock)
28 {
29 	struct ovpn_peer *peer, *next;
30 
31 	spin_unlock_bh(&ovpn->lock);
32 
33 	llist_for_each_entry_safe(peer, next, release_list->first,
34 				  release_entry) {
35 		ovpn_socket_release(peer);
36 		ovpn_peer_put(peer);
37 	}
38 }
39 
40 /**
41  * ovpn_peer_keepalive_set - configure keepalive values for peer
42  * @peer: the peer to configure
43  * @interval: outgoing keepalive interval
44  * @timeout: incoming keepalive timeout
45  */
46 void ovpn_peer_keepalive_set(struct ovpn_peer *peer, u32 interval, u32 timeout)
47 {
48 	time64_t now = ktime_get_boottime_seconds();
49 
50 	netdev_dbg(peer->ovpn->dev,
51 		   "scheduling keepalive for peer %u: interval=%u timeout=%u\n",
52 		   peer->id, interval, timeout);
53 
54 	peer->keepalive_interval = interval;
55 	WRITE_ONCE(peer->last_sent, now);
56 	peer->keepalive_xmit_exp = now + interval;
57 
58 	peer->keepalive_timeout = timeout;
59 	WRITE_ONCE(peer->last_recv, now);
60 	peer->keepalive_recv_exp = now + timeout;
61 
62 	/* now that interval and timeout have been changed, kick
63 	 * off the worker so that the next delay can be recomputed
64 	 */
65 	mod_delayed_work(system_percpu_wq, &peer->ovpn->keepalive_work, 0);
66 }
67 
68 /**
69  * ovpn_peer_keepalive_send - periodic worker sending keepalive packets
70  * @work: pointer to the work member of the related peer object
71  *
72  * NOTE: the reference to peer is not dropped because it gets inherited
73  * by ovpn_xmit_special()
74  */
75 static void ovpn_peer_keepalive_send(struct work_struct *work)
76 {
77 	struct ovpn_peer *peer = container_of(work, struct ovpn_peer,
78 					      keepalive_work);
79 
80 	local_bh_disable();
81 	ovpn_xmit_special(peer, ovpn_keepalive_message,
82 			  sizeof(ovpn_keepalive_message));
83 	local_bh_enable();
84 }
85 
86 /**
87  * ovpn_peer_new - allocate and initialize a new peer object
88  * @ovpn: the openvpn instance inside which the peer should be created
89  * @id: the ID assigned to this peer
90  *
91  * Return: a pointer to the new peer on success or an error code otherwise
92  */
93 struct ovpn_peer *ovpn_peer_new(struct ovpn_priv *ovpn, u32 id)
94 {
95 	struct ovpn_peer *peer;
96 	int ret;
97 
98 	/* alloc and init peer object */
99 	peer = kzalloc_obj(*peer);
100 	if (!peer)
101 		return ERR_PTR(-ENOMEM);
102 
103 	/* in the default case TX and RX IDs are the same.
104 	 * the user may set a different TX ID via netlink
105 	 */
106 	peer->id = id;
107 	peer->tx_id = id;
108 	peer->ovpn = ovpn;
109 
110 	peer->vpn_addrs.ipv4.s_addr = htonl(INADDR_ANY);
111 	peer->vpn_addrs.ipv6 = in6addr_any;
112 
113 	RCU_INIT_POINTER(peer->bind, NULL);
114 	ovpn_crypto_state_init(&peer->crypto);
115 	spin_lock_init(&peer->lock);
116 	kref_init(&peer->refcount);
117 	ovpn_peer_stats_init(&peer->vpn_stats);
118 	ovpn_peer_stats_init(&peer->link_stats);
119 	INIT_WORK(&peer->keepalive_work, ovpn_peer_keepalive_send);
120 
121 	ret = dst_cache_init(&peer->dst_cache, GFP_KERNEL);
122 	if (ret < 0) {
123 		netdev_err(ovpn->dev,
124 			   "cannot initialize dst cache for peer %u\n",
125 			   peer->id);
126 		kfree(peer);
127 		return ERR_PTR(ret);
128 	}
129 
130 	netdev_hold(ovpn->dev, &peer->dev_tracker, GFP_KERNEL);
131 
132 	return peer;
133 }
134 
135 /**
136  * ovpn_peer_reset_sockaddr - recreate binding for peer
137  * @peer: peer to recreate the binding for
138  * @ss: sockaddr to use as remote endpoint for the binding
139  * @local_ip: local IP for the binding
140  *
141  * Return: 0 on success or a negative error code otherwise
142  */
143 int ovpn_peer_reset_sockaddr(struct ovpn_peer *peer,
144 			     const struct sockaddr_storage *ss,
145 			     const void *local_ip)
146 {
147 	struct ovpn_bind *bind;
148 	size_t ip_len;
149 
150 	lockdep_assert_held(&peer->lock);
151 
152 	/* create new ovpn_bind object */
153 	bind = ovpn_bind_from_sockaddr(ss);
154 	if (IS_ERR(bind))
155 		return PTR_ERR(bind);
156 
157 	if (local_ip) {
158 		if (ss->ss_family == AF_INET) {
159 			ip_len = sizeof(struct in_addr);
160 		} else if (ss->ss_family == AF_INET6) {
161 			ip_len = sizeof(struct in6_addr);
162 		} else {
163 			net_dbg_ratelimited("%s: invalid family %u for remote endpoint for peer %u\n",
164 					    netdev_name(peer->ovpn->dev),
165 					    ss->ss_family, peer->id);
166 			kfree(bind);
167 			return -EINVAL;
168 		}
169 
170 		memcpy(&bind->local, local_ip, ip_len);
171 	}
172 
173 	/* set binding */
174 	ovpn_bind_reset(peer, bind);
175 
176 	return 0;
177 }
178 
179 /* variable name __tbl2 needs to be different from __tbl1
180  * in the macro below to avoid confusing clang
181  */
182 #define ovpn_get_hash_slot(_tbl, _key, _key_len) ({	\
183 	typeof(_tbl) *__tbl2 = &(_tbl);			\
184 	jhash(_key, _key_len, 0) % HASH_SIZE(*__tbl2);	\
185 })
186 
187 #define ovpn_get_hash_head(_tbl, _key, _key_len) ({		\
188 	typeof(_tbl) *__tbl1 = &(_tbl);				\
189 	&(*__tbl1)[ovpn_get_hash_slot(*__tbl1, _key, _key_len)];\
190 })
191 
192 /**
193  * ovpn_peer_endpoints_update - update remote or local endpoint for peer
194  * @peer: peer to update the remote endpoint for
195  * @skb: incoming packet to retrieve the source/destination address from
196  */
197 void ovpn_peer_endpoints_update(struct ovpn_peer *peer, struct sk_buff *skb)
198 {
199 	struct hlist_nulls_head *nhead;
200 	struct sockaddr_storage ss;
201 	struct sockaddr_in6 *sa6;
202 	bool reset_cache = false;
203 	struct sockaddr_in *sa;
204 	struct ovpn_bind *bind;
205 	const void *local_ip;
206 	size_t salen = 0;
207 
208 	spin_lock_bh(&peer->lock);
209 	bind = rcu_dereference_protected(peer->bind,
210 					 lockdep_is_held(&peer->lock));
211 	if (unlikely(!bind))
212 		goto unlock;
213 
214 	switch (skb->protocol) {
215 	case htons(ETH_P_IP):
216 		/* float check */
217 		if (unlikely(!ovpn_bind_skb_src_match(bind, skb))) {
218 			/* unconditionally save local endpoint in case
219 			 * of float, as it may have changed as well
220 			 */
221 			local_ip = &ip_hdr(skb)->daddr;
222 			sa = (struct sockaddr_in *)&ss;
223 			sa->sin_family = AF_INET;
224 			sa->sin_addr.s_addr = ip_hdr(skb)->saddr;
225 			sa->sin_port = udp_hdr(skb)->source;
226 			salen = sizeof(*sa);
227 			reset_cache = true;
228 			break;
229 		}
230 
231 		/* if no float happened, let's double check if the local endpoint
232 		 * has changed
233 		 */
234 		if (unlikely(bind->local.ipv4.s_addr != ip_hdr(skb)->daddr)) {
235 			net_dbg_ratelimited("%s: learning local IPv4 for peer %d (%pI4 -> %pI4)\n",
236 					    netdev_name(peer->ovpn->dev),
237 					    peer->id, &bind->local.ipv4.s_addr,
238 					    &ip_hdr(skb)->daddr);
239 			bind->local.ipv4.s_addr = ip_hdr(skb)->daddr;
240 			reset_cache = true;
241 		}
242 		break;
243 	case htons(ETH_P_IPV6):
244 		/* float check */
245 		if (unlikely(!ovpn_bind_skb_src_match(bind, skb))) {
246 			/* unconditionally save local endpoint in case
247 			 * of float, as it may have changed as well
248 			 */
249 			local_ip = &ipv6_hdr(skb)->daddr;
250 			sa6 = (struct sockaddr_in6 *)&ss;
251 			sa6->sin6_family = AF_INET6;
252 			sa6->sin6_addr = ipv6_hdr(skb)->saddr;
253 			sa6->sin6_port = udp_hdr(skb)->source;
254 			sa6->sin6_scope_id = ipv6_iface_scope_id(&ipv6_hdr(skb)->saddr,
255 								 skb->skb_iif);
256 			salen = sizeof(*sa6);
257 			reset_cache = true;
258 			break;
259 		}
260 
261 		/* if no float happened, let's double check if the local endpoint
262 		 * has changed
263 		 */
264 		if (unlikely(!ipv6_addr_equal(&bind->local.ipv6,
265 					      &ipv6_hdr(skb)->daddr))) {
266 			net_dbg_ratelimited("%s: learning local IPv6 for peer %d (%pI6c -> %pI6c)\n",
267 					    netdev_name(peer->ovpn->dev),
268 					    peer->id, &bind->local.ipv6,
269 					    &ipv6_hdr(skb)->daddr);
270 			bind->local.ipv6 = ipv6_hdr(skb)->daddr;
271 			reset_cache = true;
272 		}
273 		break;
274 	default:
275 		goto unlock;
276 	}
277 
278 	if (unlikely(reset_cache))
279 		dst_cache_reset(&peer->dst_cache);
280 
281 	/* if the peer did not float, we can bail out now */
282 	if (likely(!salen))
283 		goto unlock;
284 
285 	if (unlikely(ovpn_peer_reset_sockaddr(peer,
286 					      (struct sockaddr_storage *)&ss,
287 					      local_ip) < 0))
288 		goto unlock;
289 
290 	net_dbg_ratelimited("%s: peer %d floated to %pIScp",
291 			    netdev_name(peer->ovpn->dev), peer->id, &ss);
292 
293 	spin_unlock_bh(&peer->lock);
294 
295 	ovpn_nl_peer_float_notify(peer, &ss);
296 
297 	/* rehashing is required only in MP mode as P2P has one peer
298 	 * only and thus there is no hashtable
299 	 */
300 	if (peer->ovpn->mode == OVPN_MODE_MP) {
301 		spin_lock_bh(&peer->ovpn->lock);
302 		spin_lock_bh(&peer->lock);
303 		bind = rcu_dereference_protected(peer->bind,
304 						 lockdep_is_held(&peer->lock));
305 		if (unlikely(!bind)) {
306 			spin_unlock_bh(&peer->lock);
307 			spin_unlock_bh(&peer->ovpn->lock);
308 			return;
309 		}
310 
311 		/* This function may be invoked concurrently, therefore another
312 		 * float may have happened in parallel: perform rehashing
313 		 * using the peer->bind->remote directly as key
314 		 */
315 
316 		switch (bind->remote.in4.sin_family) {
317 		case AF_INET:
318 			salen = sizeof(*sa);
319 			break;
320 		case AF_INET6:
321 			salen = sizeof(*sa6);
322 			break;
323 		}
324 
325 		/* remove old hashing */
326 		hlist_nulls_del_init_rcu(&peer->hash_entry_transp_addr);
327 		/* re-add with new transport address */
328 		nhead = ovpn_get_hash_head(peer->ovpn->peers->by_transp_addr,
329 					   &bind->remote, salen);
330 		hlist_nulls_add_head_rcu(&peer->hash_entry_transp_addr, nhead);
331 		spin_unlock_bh(&peer->lock);
332 		spin_unlock_bh(&peer->ovpn->lock);
333 	}
334 	return;
335 unlock:
336 	spin_unlock_bh(&peer->lock);
337 }
338 
339 /**
340  * ovpn_peer_release_rcu - RCU callback performing last peer release steps
341  * @head: RCU member of the ovpn_peer
342  */
343 static void ovpn_peer_release_rcu(struct rcu_head *head)
344 {
345 	struct ovpn_peer *peer = container_of(head, struct ovpn_peer, rcu);
346 
347 	/* this call will immediately free the dst_cache, therefore we
348 	 * perform it in the RCU callback, when all contexts are done
349 	 */
350 	dst_cache_destroy(&peer->dst_cache);
351 	kfree(peer);
352 }
353 
354 /**
355  * ovpn_peer_release - release peer private members
356  * @peer: the peer to release
357  */
358 static void ovpn_peer_release(struct ovpn_peer *peer)
359 {
360 	ovpn_crypto_state_release(&peer->crypto);
361 	spin_lock_bh(&peer->lock);
362 	ovpn_bind_reset(peer, NULL);
363 	spin_unlock_bh(&peer->lock);
364 	call_rcu(&peer->rcu, ovpn_peer_release_rcu);
365 	netdev_put(peer->ovpn->dev, &peer->dev_tracker);
366 }
367 
368 /**
369  * ovpn_peer_release_kref - callback for kref_put
370  * @kref: the kref object belonging to the peer
371  */
372 void ovpn_peer_release_kref(struct kref *kref)
373 {
374 	struct ovpn_peer *peer = container_of(kref, struct ovpn_peer, refcount);
375 
376 	ovpn_peer_release(peer);
377 }
378 
379 /**
380  * ovpn_peer_skb_to_sockaddr - fill sockaddr with skb source address
381  * @skb: the packet to extract data from
382  * @ss: the sockaddr to fill
383  *
384  * Return: sockaddr length on success or -1 otherwise
385  */
386 static int ovpn_peer_skb_to_sockaddr(struct sk_buff *skb,
387 				     struct sockaddr_storage *ss)
388 {
389 	struct sockaddr_in6 *sa6;
390 	struct sockaddr_in *sa4;
391 
392 	switch (skb->protocol) {
393 	case htons(ETH_P_IP):
394 		sa4 = (struct sockaddr_in *)ss;
395 		sa4->sin_family = AF_INET;
396 		sa4->sin_addr.s_addr = ip_hdr(skb)->saddr;
397 		sa4->sin_port = udp_hdr(skb)->source;
398 		return sizeof(*sa4);
399 	case htons(ETH_P_IPV6):
400 		sa6 = (struct sockaddr_in6 *)ss;
401 		sa6->sin6_family = AF_INET6;
402 		sa6->sin6_addr = ipv6_hdr(skb)->saddr;
403 		sa6->sin6_port = udp_hdr(skb)->source;
404 		return sizeof(*sa6);
405 	}
406 
407 	return -1;
408 }
409 
410 /**
411  * ovpn_nexthop_from_skb4 - retrieve IPv4 nexthop for outgoing skb
412  * @skb: the outgoing packet
413  *
414  * Return: the IPv4 of the nexthop
415  */
416 static __be32 ovpn_nexthop_from_skb4(struct sk_buff *skb)
417 {
418 	const struct rtable *rt = skb_rtable(skb);
419 
420 	if (rt && rt->rt_uses_gateway)
421 		return rt->rt_gw4;
422 
423 	return ip_hdr(skb)->daddr;
424 }
425 
426 /**
427  * ovpn_nexthop_from_skb6 - retrieve IPv6 nexthop for outgoing skb
428  * @skb: the outgoing packet
429  *
430  * Return: the IPv6 of the nexthop
431  */
432 static struct in6_addr ovpn_nexthop_from_skb6(struct sk_buff *skb)
433 {
434 	const struct rt6_info *rt = skb_rt6_info(skb);
435 
436 	if (!rt || !(rt->rt6i_flags & RTF_GATEWAY))
437 		return ipv6_hdr(skb)->daddr;
438 
439 	return rt->rt6i_gateway;
440 }
441 
442 /**
443  * ovpn_peer_get_by_vpn_addr4 - retrieve peer by its VPN IPv4 address
444  * @ovpn: the openvpn instance to search
445  * @addr: VPN IPv4 to use as search key
446  *
447  * Refcounter is not increased for the returned peer.
448  *
449  * Return: the peer if found or NULL otherwise
450  */
451 static struct ovpn_peer *ovpn_peer_get_by_vpn_addr4(struct ovpn_priv *ovpn,
452 						    __be32 addr)
453 {
454 	struct hlist_nulls_head *nhead;
455 	struct hlist_nulls_node *ntmp;
456 	struct ovpn_peer *tmp;
457 	unsigned int slot;
458 
459 begin:
460 	slot = ovpn_get_hash_slot(ovpn->peers->by_vpn_addr4, &addr,
461 				  sizeof(addr));
462 	nhead = &ovpn->peers->by_vpn_addr4[slot];
463 
464 	hlist_nulls_for_each_entry_rcu(tmp, ntmp, nhead, hash_entry_addr4)
465 		if (addr == tmp->vpn_addrs.ipv4.s_addr)
466 			return tmp;
467 
468 	/* item may have moved during lookup - check nulls and restart
469 	 * if that's the case
470 	 */
471 	if (get_nulls_value(ntmp) != slot)
472 		goto begin;
473 
474 	return NULL;
475 }
476 
477 /**
478  * ovpn_peer_get_by_vpn_addr6 - retrieve peer by its VPN IPv6 address
479  * @ovpn: the openvpn instance to search
480  * @addr: VPN IPv6 to use as search key
481  *
482  * Refcounter is not increased for the returned peer.
483  *
484  * Return: the peer if found or NULL otherwise
485  */
486 static struct ovpn_peer *ovpn_peer_get_by_vpn_addr6(struct ovpn_priv *ovpn,
487 						    struct in6_addr *addr)
488 {
489 	struct hlist_nulls_head *nhead;
490 	struct hlist_nulls_node *ntmp;
491 	struct ovpn_peer *tmp;
492 	unsigned int slot;
493 
494 begin:
495 	slot = ovpn_get_hash_slot(ovpn->peers->by_vpn_addr6, addr,
496 				  sizeof(*addr));
497 	nhead = &ovpn->peers->by_vpn_addr6[slot];
498 
499 	hlist_nulls_for_each_entry_rcu(tmp, ntmp, nhead, hash_entry_addr6)
500 		if (ipv6_addr_equal(addr, &tmp->vpn_addrs.ipv6))
501 			return tmp;
502 
503 	/* item may have moved during lookup - check nulls and restart
504 	 * if that's the case
505 	 */
506 	if (get_nulls_value(ntmp) != slot)
507 		goto begin;
508 
509 	return NULL;
510 }
511 
512 /**
513  * ovpn_peer_transp_match - check if sockaddr and peer binding match
514  * @peer: the peer to get the binding from
515  * @ss: the sockaddr to match
516  *
517  * Return: true if sockaddr and binding match or false otherwise
518  */
519 static bool ovpn_peer_transp_match(const struct ovpn_peer *peer,
520 				   const struct sockaddr_storage *ss)
521 {
522 	struct ovpn_bind *bind = rcu_dereference(peer->bind);
523 	struct sockaddr_in6 *sa6;
524 	struct sockaddr_in *sa4;
525 
526 	if (unlikely(!bind))
527 		return false;
528 
529 	if (ss->ss_family != bind->remote.in4.sin_family)
530 		return false;
531 
532 	switch (ss->ss_family) {
533 	case AF_INET:
534 		sa4 = (struct sockaddr_in *)ss;
535 		if (sa4->sin_addr.s_addr != bind->remote.in4.sin_addr.s_addr)
536 			return false;
537 		if (sa4->sin_port != bind->remote.in4.sin_port)
538 			return false;
539 		break;
540 	case AF_INET6:
541 		sa6 = (struct sockaddr_in6 *)ss;
542 		if (!ipv6_addr_equal(&sa6->sin6_addr,
543 				     &bind->remote.in6.sin6_addr))
544 			return false;
545 		if (sa6->sin6_port != bind->remote.in6.sin6_port)
546 			return false;
547 		break;
548 	default:
549 		return false;
550 	}
551 
552 	return true;
553 }
554 
555 /**
556  * ovpn_peer_get_by_transp_addr_p2p - get peer by transport address in a P2P
557  *                                    instance
558  * @ovpn: the openvpn instance to search
559  * @ss: the transport socket address
560  *
561  * Return: the peer if found or NULL otherwise
562  */
563 static struct ovpn_peer *
564 ovpn_peer_get_by_transp_addr_p2p(struct ovpn_priv *ovpn,
565 				 struct sockaddr_storage *ss)
566 {
567 	struct ovpn_peer *tmp, *peer = NULL;
568 
569 	rcu_read_lock();
570 	tmp = rcu_dereference(ovpn->peer);
571 	if (likely(tmp && ovpn_peer_transp_match(tmp, ss) &&
572 		   ovpn_peer_hold(tmp)))
573 		peer = tmp;
574 	rcu_read_unlock();
575 
576 	return peer;
577 }
578 
579 /**
580  * ovpn_peer_get_by_transp_addr - retrieve peer by transport address
581  * @ovpn: the openvpn instance to search
582  * @skb: the skb to retrieve the source transport address from
583  *
584  * Return: a pointer to the peer if found or NULL otherwise
585  */
586 struct ovpn_peer *ovpn_peer_get_by_transp_addr(struct ovpn_priv *ovpn,
587 					       struct sk_buff *skb)
588 {
589 	struct ovpn_peer *tmp, *peer = NULL;
590 	struct sockaddr_storage ss = { 0 };
591 	struct hlist_nulls_head *nhead;
592 	struct hlist_nulls_node *ntmp;
593 	unsigned int slot;
594 	ssize_t sa_len;
595 
596 	sa_len = ovpn_peer_skb_to_sockaddr(skb, &ss);
597 	if (unlikely(sa_len < 0))
598 		return NULL;
599 
600 	if (ovpn->mode == OVPN_MODE_P2P)
601 		return ovpn_peer_get_by_transp_addr_p2p(ovpn, &ss);
602 
603 	rcu_read_lock();
604 begin:
605 	slot = ovpn_get_hash_slot(ovpn->peers->by_transp_addr, &ss, sa_len);
606 	nhead = &ovpn->peers->by_transp_addr[slot];
607 
608 	hlist_nulls_for_each_entry_rcu(tmp, ntmp, nhead,
609 				       hash_entry_transp_addr) {
610 		if (!ovpn_peer_transp_match(tmp, &ss))
611 			continue;
612 
613 		if (!ovpn_peer_hold(tmp))
614 			continue;
615 
616 		peer = tmp;
617 		break;
618 	}
619 
620 	/* item may have moved during lookup - check nulls and restart
621 	 * if that's the case
622 	 */
623 	if (!peer && get_nulls_value(ntmp) != slot)
624 		goto begin;
625 	rcu_read_unlock();
626 
627 	return peer;
628 }
629 
630 /**
631  * ovpn_peer_get_by_id_p2p - get peer by ID in a P2P instance
632  * @ovpn: the openvpn instance to search
633  * @peer_id: the ID of the peer to find
634  *
635  * Return: the peer if found or NULL otherwise
636  */
637 static struct ovpn_peer *ovpn_peer_get_by_id_p2p(struct ovpn_priv *ovpn,
638 						 u32 peer_id)
639 {
640 	struct ovpn_peer *tmp, *peer = NULL;
641 
642 	rcu_read_lock();
643 	tmp = rcu_dereference(ovpn->peer);
644 	if (likely(tmp && tmp->id == peer_id && ovpn_peer_hold(tmp)))
645 		peer = tmp;
646 	rcu_read_unlock();
647 
648 	return peer;
649 }
650 
651 /**
652  * ovpn_peer_get_by_id - retrieve peer by ID
653  * @ovpn: the openvpn instance to search
654  * @peer_id: the unique peer identifier to match
655  *
656  * Return: a pointer to the peer if found or NULL otherwise
657  */
658 struct ovpn_peer *ovpn_peer_get_by_id(struct ovpn_priv *ovpn, u32 peer_id)
659 {
660 	struct ovpn_peer *tmp, *peer = NULL;
661 	struct hlist_head *head;
662 
663 	if (ovpn->mode == OVPN_MODE_P2P)
664 		return ovpn_peer_get_by_id_p2p(ovpn, peer_id);
665 
666 	head = ovpn_get_hash_head(ovpn->peers->by_id, &peer_id,
667 				  sizeof(peer_id));
668 
669 	rcu_read_lock();
670 	hlist_for_each_entry_rcu(tmp, head, hash_entry_id) {
671 		if (tmp->id != peer_id)
672 			continue;
673 
674 		if (!ovpn_peer_hold(tmp))
675 			continue;
676 
677 		peer = tmp;
678 		break;
679 	}
680 	rcu_read_unlock();
681 
682 	return peer;
683 }
684 
685 static void ovpn_peer_remove(struct ovpn_peer *peer,
686 			     enum ovpn_del_peer_reason reason,
687 			     struct llist_head *release_list)
688 {
689 	lockdep_assert_held(&peer->ovpn->lock);
690 
691 	switch (peer->ovpn->mode) {
692 	case OVPN_MODE_MP:
693 		/* prevent double remove */
694 		if (hlist_unhashed(&peer->hash_entry_id))
695 			return;
696 
697 		hlist_del_init_rcu(&peer->hash_entry_id);
698 		hlist_nulls_del_init_rcu(&peer->hash_entry_addr4);
699 		hlist_nulls_del_init_rcu(&peer->hash_entry_addr6);
700 		hlist_nulls_del_init_rcu(&peer->hash_entry_transp_addr);
701 		break;
702 	case OVPN_MODE_P2P:
703 		/* prevent double remove */
704 		if (peer != rcu_access_pointer(peer->ovpn->peer))
705 			return;
706 
707 		RCU_INIT_POINTER(peer->ovpn->peer, NULL);
708 		/* in P2P mode the carrier is switched off when the peer is
709 		 * deleted so that third party protocols can react accordingly
710 		 */
711 		netif_carrier_off(peer->ovpn->dev);
712 		break;
713 	}
714 
715 	peer->delete_reason = reason;
716 	ovpn_nl_peer_del_notify(peer);
717 
718 	/* append to provided list for later socket release and ref drop */
719 	llist_add(&peer->release_entry, release_list);
720 }
721 
722 /**
723  * ovpn_peer_get_by_dst - Lookup peer to send skb to
724  * @ovpn: the private data representing the current VPN session
725  * @skb: the skb to extract the destination address from
726  *
727  * This function takes a tunnel packet and looks up the peer to send it to
728  * after encapsulation. The skb is expected to be the in-tunnel packet, without
729  * any OpenVPN related header.
730  *
731  * Assume that the IP header is accessible in the skb data.
732  *
733  * Return: the peer if found or NULL otherwise.
734  */
735 struct ovpn_peer *ovpn_peer_get_by_dst(struct ovpn_priv *ovpn,
736 				       struct sk_buff *skb)
737 {
738 	struct ovpn_peer *peer = NULL;
739 	struct in6_addr addr6;
740 	__be32 addr4;
741 
742 	/* in P2P mode, no matter the destination, packets are always sent to
743 	 * the single peer listening on the other side
744 	 */
745 	if (ovpn->mode == OVPN_MODE_P2P) {
746 		rcu_read_lock();
747 		peer = rcu_dereference(ovpn->peer);
748 		if (unlikely(peer && !ovpn_peer_hold(peer)))
749 			peer = NULL;
750 		rcu_read_unlock();
751 		return peer;
752 	}
753 
754 	rcu_read_lock();
755 	switch (skb->protocol) {
756 	case htons(ETH_P_IP):
757 		addr4 = ovpn_nexthop_from_skb4(skb);
758 		peer = ovpn_peer_get_by_vpn_addr4(ovpn, addr4);
759 		break;
760 	case htons(ETH_P_IPV6):
761 		addr6 = ovpn_nexthop_from_skb6(skb);
762 		peer = ovpn_peer_get_by_vpn_addr6(ovpn, &addr6);
763 		break;
764 	}
765 
766 	if (unlikely(peer && !ovpn_peer_hold(peer)))
767 		peer = NULL;
768 	rcu_read_unlock();
769 
770 	return peer;
771 }
772 
773 /**
774  * ovpn_nexthop_from_rt4 - look up the IPv4 nexthop for the given destination
775  * @ovpn: the private data representing the current VPN session
776  * @dest: the destination to be looked up
777  *
778  * Looks up in the IPv4 system routing table the IP of the nexthop to be used
779  * to reach the destination passed as argument. If no nexthop can be found, the
780  * destination itself is returned as it probably has to be used as nexthop.
781  *
782  * Return: the IP of the next hop if found or dest itself otherwise
783  */
784 static __be32 ovpn_nexthop_from_rt4(struct ovpn_priv *ovpn, __be32 dest)
785 {
786 	struct rtable *rt;
787 	struct flowi4 fl = {
788 		.daddr = dest
789 	};
790 
791 	rt = ip_route_output_flow(dev_net(ovpn->dev), &fl, NULL);
792 	if (IS_ERR(rt)) {
793 		net_dbg_ratelimited("%s: no route to host %pI4\n",
794 				    netdev_name(ovpn->dev), &dest);
795 		/* if we end up here this packet is probably going to be
796 		 * thrown away later
797 		 */
798 		return dest;
799 	}
800 
801 	if (!rt->rt_uses_gateway)
802 		goto out;
803 
804 	dest = rt->rt_gw4;
805 out:
806 	ip_rt_put(rt);
807 	return dest;
808 }
809 
810 /**
811  * ovpn_nexthop_from_rt6 - look up the IPv6 nexthop for the given destination
812  * @ovpn: the private data representing the current VPN session
813  * @dest: the destination to be looked up
814  *
815  * Looks up in the IPv6 system routing table the IP of the nexthop to be used
816  * to reach the destination passed as argument. If no nexthop can be found, the
817  * destination itself is returned as it probably has to be used as nexthop.
818  *
819  * Return: the IP of the next hop if found or dest itself otherwise
820  */
821 static struct in6_addr ovpn_nexthop_from_rt6(struct ovpn_priv *ovpn,
822 					     struct in6_addr dest)
823 {
824 #if IS_ENABLED(CONFIG_IPV6)
825 	struct dst_entry *entry;
826 	struct rt6_info *rt;
827 	struct flowi6 fl = {
828 		.daddr = dest,
829 	};
830 
831 	entry = ip6_dst_lookup_flow(dev_net(ovpn->dev), NULL, &fl, NULL);
832 	if (IS_ERR(entry)) {
833 		net_dbg_ratelimited("%s: no route to host %pI6c\n",
834 				    netdev_name(ovpn->dev), &dest);
835 		/* if we end up here this packet is probably going to be
836 		 * thrown away later
837 		 */
838 		return dest;
839 	}
840 
841 	rt = dst_rt6_info(entry);
842 
843 	if (!(rt->rt6i_flags & RTF_GATEWAY))
844 		goto out;
845 
846 	dest = rt->rt6i_gateway;
847 out:
848 	dst_release((struct dst_entry *)rt);
849 #endif
850 	return dest;
851 }
852 
853 /**
854  * ovpn_peer_check_by_src - check that skb source is routed via peer
855  * @ovpn: the openvpn instance to search
856  * @skb: the packet to extract source address from
857  * @peer: the peer to check against the source address
858  *
859  * Return: true if the peer is matching or false otherwise
860  */
861 bool ovpn_peer_check_by_src(struct ovpn_priv *ovpn, struct sk_buff *skb,
862 			    struct ovpn_peer *peer)
863 {
864 	bool match = false;
865 	struct in6_addr addr6;
866 	__be32 addr4;
867 
868 	if (ovpn->mode == OVPN_MODE_P2P) {
869 		/* in P2P mode, no matter the destination, packets are always
870 		 * sent to the single peer listening on the other side
871 		 */
872 		return peer == rcu_access_pointer(ovpn->peer);
873 	}
874 
875 	/* This function performs a reverse path check, therefore we now
876 	 * lookup the nexthop we would use if we wanted to route a packet
877 	 * to the source IP. If the nexthop matches the sender we know the
878 	 * latter is valid and we allow the packet to come in
879 	 */
880 
881 	switch (skb->protocol) {
882 	case htons(ETH_P_IP):
883 		addr4 = ovpn_nexthop_from_rt4(ovpn, ip_hdr(skb)->saddr);
884 		rcu_read_lock();
885 		match = (peer == ovpn_peer_get_by_vpn_addr4(ovpn, addr4));
886 		rcu_read_unlock();
887 		break;
888 	case htons(ETH_P_IPV6):
889 		addr6 = ovpn_nexthop_from_rt6(ovpn, ipv6_hdr(skb)->saddr);
890 		rcu_read_lock();
891 		match = (peer == ovpn_peer_get_by_vpn_addr6(ovpn, &addr6));
892 		rcu_read_unlock();
893 		break;
894 	}
895 
896 	return match;
897 }
898 
899 void ovpn_peer_hash_vpn_ip(struct ovpn_peer *peer)
900 {
901 	struct hlist_nulls_head *nhead;
902 
903 	lockdep_assert_held(&peer->ovpn->lock);
904 
905 	/* rehashing makes sense only in multipeer mode */
906 	if (peer->ovpn->mode != OVPN_MODE_MP)
907 		return;
908 
909 	if (peer->vpn_addrs.ipv4.s_addr != htonl(INADDR_ANY)) {
910 		/* remove potential old hashing */
911 		hlist_nulls_del_init_rcu(&peer->hash_entry_addr4);
912 
913 		nhead = ovpn_get_hash_head(peer->ovpn->peers->by_vpn_addr4,
914 					   &peer->vpn_addrs.ipv4,
915 					   sizeof(peer->vpn_addrs.ipv4));
916 		hlist_nulls_add_head_rcu(&peer->hash_entry_addr4, nhead);
917 	}
918 
919 	if (!ipv6_addr_any(&peer->vpn_addrs.ipv6)) {
920 		/* remove potential old hashing */
921 		hlist_nulls_del_init_rcu(&peer->hash_entry_addr6);
922 
923 		nhead = ovpn_get_hash_head(peer->ovpn->peers->by_vpn_addr6,
924 					   &peer->vpn_addrs.ipv6,
925 					   sizeof(peer->vpn_addrs.ipv6));
926 		hlist_nulls_add_head_rcu(&peer->hash_entry_addr6, nhead);
927 	}
928 }
929 
930 /**
931  * ovpn_peer_add_mp - add peer to related tables in a MP instance
932  * @ovpn: the instance to add the peer to
933  * @peer: the peer to add
934  *
935  * Return: 0 on success or a negative error code otherwise
936  */
937 static int ovpn_peer_add_mp(struct ovpn_priv *ovpn, struct ovpn_peer *peer)
938 {
939 	struct sockaddr_storage sa = { 0 };
940 	struct hlist_nulls_head *nhead;
941 	struct sockaddr_in6 *sa6;
942 	struct sockaddr_in *sa4;
943 	struct ovpn_bind *bind;
944 	struct ovpn_peer *tmp;
945 	size_t salen;
946 	int ret = 0;
947 
948 	spin_lock_bh(&ovpn->lock);
949 	/* do not add duplicates */
950 	tmp = ovpn_peer_get_by_id(ovpn, peer->id);
951 	if (tmp) {
952 		ovpn_peer_put(tmp);
953 		ret = -EEXIST;
954 		goto out;
955 	}
956 
957 	bind = rcu_dereference_protected(peer->bind, true);
958 	/* peers connected via TCP have bind == NULL */
959 	if (bind) {
960 		switch (bind->remote.in4.sin_family) {
961 		case AF_INET:
962 			sa4 = (struct sockaddr_in *)&sa;
963 
964 			sa4->sin_family = AF_INET;
965 			sa4->sin_addr.s_addr = bind->remote.in4.sin_addr.s_addr;
966 			sa4->sin_port = bind->remote.in4.sin_port;
967 			salen = sizeof(*sa4);
968 			break;
969 		case AF_INET6:
970 			sa6 = (struct sockaddr_in6 *)&sa;
971 
972 			sa6->sin6_family = AF_INET6;
973 			sa6->sin6_addr = bind->remote.in6.sin6_addr;
974 			sa6->sin6_port = bind->remote.in6.sin6_port;
975 			salen = sizeof(*sa6);
976 			break;
977 		default:
978 			ret = -EPROTONOSUPPORT;
979 			goto out;
980 		}
981 
982 		nhead = ovpn_get_hash_head(ovpn->peers->by_transp_addr, &sa,
983 					   salen);
984 		hlist_nulls_add_head_rcu(&peer->hash_entry_transp_addr, nhead);
985 	}
986 
987 	hlist_add_head_rcu(&peer->hash_entry_id,
988 			   ovpn_get_hash_head(ovpn->peers->by_id, &peer->id,
989 					      sizeof(peer->id)));
990 
991 	ovpn_peer_hash_vpn_ip(peer);
992 out:
993 	spin_unlock_bh(&ovpn->lock);
994 	return ret;
995 }
996 
997 /**
998  * ovpn_peer_add_p2p - add peer to related tables in a P2P instance
999  * @ovpn: the instance to add the peer to
1000  * @peer: the peer to add
1001  *
1002  * Return: 0 on success or a negative error code otherwise
1003  */
1004 static int ovpn_peer_add_p2p(struct ovpn_priv *ovpn, struct ovpn_peer *peer)
1005 {
1006 	LLIST_HEAD(release_list);
1007 	struct ovpn_peer *tmp;
1008 
1009 	spin_lock_bh(&ovpn->lock);
1010 	/* in p2p mode it is possible to have a single peer only, therefore the
1011 	 * old one is released and substituted by the new one
1012 	 */
1013 	tmp = rcu_dereference_protected(ovpn->peer,
1014 					lockdep_is_held(&ovpn->lock));
1015 	if (tmp)
1016 		ovpn_peer_remove(tmp, OVPN_DEL_PEER_REASON_TEARDOWN,
1017 				 &release_list);
1018 
1019 	rcu_assign_pointer(ovpn->peer, peer);
1020 	/* in P2P mode the carrier is switched on when the peer is added */
1021 	netif_carrier_on(ovpn->dev);
1022 	unlock_ovpn(ovpn, &release_list);
1023 
1024 	return 0;
1025 }
1026 
1027 /**
1028  * ovpn_peer_add - add peer to the related tables
1029  * @ovpn: the openvpn instance the peer belongs to
1030  * @peer: the peer object to add
1031  *
1032  * Assume refcounter was increased by caller
1033  *
1034  * Return: 0 on success or a negative error code otherwise
1035  */
1036 int ovpn_peer_add(struct ovpn_priv *ovpn, struct ovpn_peer *peer)
1037 {
1038 	int ret = -ENODEV;
1039 
1040 	/* Prevent adding new peers while destroying the ovpn interface.
1041 	 * Failing to do so would end up holding the device reference
1042 	 * endlessly hostage of the new peer object with no chance of
1043 	 * release..
1044 	 */
1045 	netdev_lock(ovpn->dev);
1046 	if (ovpn->dev->reg_state != NETREG_REGISTERED)
1047 		goto out;
1048 
1049 	switch (ovpn->mode) {
1050 	case OVPN_MODE_MP:
1051 		ret = ovpn_peer_add_mp(ovpn, peer);
1052 		break;
1053 	case OVPN_MODE_P2P:
1054 		ret = ovpn_peer_add_p2p(ovpn, peer);
1055 		break;
1056 	}
1057 out:
1058 	netdev_unlock(ovpn->dev);
1059 
1060 	return ret;
1061 }
1062 
1063 /**
1064  * ovpn_peer_del_mp - delete peer from related tables in a MP instance
1065  * @peer: the peer to delete
1066  * @reason: reason why the peer was deleted (sent to userspace)
1067  * @release_list: list where delete peer should be appended
1068  *
1069  * Return: 0 on success or a negative error code otherwise
1070  */
1071 static int ovpn_peer_del_mp(struct ovpn_peer *peer,
1072 			    enum ovpn_del_peer_reason reason,
1073 			    struct llist_head *release_list)
1074 {
1075 	struct ovpn_peer *tmp;
1076 	int ret = -ENOENT;
1077 
1078 	lockdep_assert_held(&peer->ovpn->lock);
1079 
1080 	tmp = ovpn_peer_get_by_id(peer->ovpn, peer->id);
1081 	if (tmp == peer) {
1082 		ovpn_peer_remove(peer, reason, release_list);
1083 		ret = 0;
1084 	}
1085 
1086 	if (tmp)
1087 		ovpn_peer_put(tmp);
1088 
1089 	return ret;
1090 }
1091 
1092 /**
1093  * ovpn_peer_del_p2p - delete peer from related tables in a P2P instance
1094  * @peer: the peer to delete
1095  * @reason: reason why the peer was deleted (sent to userspace)
1096  * @release_list: list where delete peer should be appended
1097  *
1098  * Return: 0 on success or a negative error code otherwise
1099  */
1100 static int ovpn_peer_del_p2p(struct ovpn_peer *peer,
1101 			     enum ovpn_del_peer_reason reason,
1102 			     struct llist_head *release_list)
1103 {
1104 	struct ovpn_peer *tmp;
1105 
1106 	lockdep_assert_held(&peer->ovpn->lock);
1107 
1108 	tmp = rcu_dereference_protected(peer->ovpn->peer,
1109 					lockdep_is_held(&peer->ovpn->lock));
1110 	if (tmp != peer)
1111 		return -ENOENT;
1112 
1113 	ovpn_peer_remove(peer, reason, release_list);
1114 
1115 	return 0;
1116 }
1117 
1118 /**
1119  * ovpn_peer_del - delete peer from related tables
1120  * @peer: the peer object to delete
1121  * @reason: reason for deleting peer (will be sent to userspace)
1122  *
1123  * Return: 0 on success or a negative error code otherwise
1124  */
1125 int ovpn_peer_del(struct ovpn_peer *peer, enum ovpn_del_peer_reason reason)
1126 {
1127 	LLIST_HEAD(release_list);
1128 	int ret = -EOPNOTSUPP;
1129 
1130 	spin_lock_bh(&peer->ovpn->lock);
1131 	switch (peer->ovpn->mode) {
1132 	case OVPN_MODE_MP:
1133 		ret = ovpn_peer_del_mp(peer, reason, &release_list);
1134 		break;
1135 	case OVPN_MODE_P2P:
1136 		ret = ovpn_peer_del_p2p(peer, reason, &release_list);
1137 		break;
1138 	default:
1139 		break;
1140 	}
1141 	unlock_ovpn(peer->ovpn, &release_list);
1142 
1143 	return ret;
1144 }
1145 
1146 /**
1147  * ovpn_peer_release_p2p - release peer upon P2P device teardown
1148  * @ovpn: the instance being torn down
1149  * @sk: if not NULL, release peer only if it's using this specific socket
1150  * @reason: the reason for releasing the peer
1151  */
1152 static void ovpn_peer_release_p2p(struct ovpn_priv *ovpn, struct sock *sk,
1153 				  enum ovpn_del_peer_reason reason)
1154 {
1155 	struct ovpn_socket *ovpn_sock;
1156 	LLIST_HEAD(release_list);
1157 	struct ovpn_peer *peer;
1158 
1159 	spin_lock_bh(&ovpn->lock);
1160 	peer = rcu_dereference_protected(ovpn->peer,
1161 					 lockdep_is_held(&ovpn->lock));
1162 	if (!peer) {
1163 		spin_unlock_bh(&ovpn->lock);
1164 		return;
1165 	}
1166 
1167 	if (sk) {
1168 		ovpn_sock = rcu_access_pointer(peer->sock);
1169 		if (!ovpn_sock || ovpn_sock->sk != sk) {
1170 			spin_unlock_bh(&ovpn->lock);
1171 			return;
1172 		}
1173 	}
1174 
1175 	ovpn_peer_remove(peer, reason, &release_list);
1176 	unlock_ovpn(ovpn, &release_list);
1177 }
1178 
1179 static void ovpn_peers_release_mp(struct ovpn_priv *ovpn, struct sock *sk,
1180 				  enum ovpn_del_peer_reason reason)
1181 {
1182 	struct ovpn_socket *ovpn_sock;
1183 	LLIST_HEAD(release_list);
1184 	struct ovpn_peer *peer;
1185 	struct hlist_node *tmp;
1186 	int bkt;
1187 
1188 	spin_lock_bh(&ovpn->lock);
1189 	hash_for_each_safe(ovpn->peers->by_id, bkt, tmp, peer, hash_entry_id) {
1190 		bool remove = true;
1191 
1192 		/* if a socket was passed as argument, skip all peers except
1193 		 * those using it
1194 		 */
1195 		if (sk) {
1196 			rcu_read_lock();
1197 			ovpn_sock = rcu_dereference(peer->sock);
1198 			remove = ovpn_sock && ovpn_sock->sk == sk;
1199 			rcu_read_unlock();
1200 		}
1201 
1202 		if (remove)
1203 			ovpn_peer_remove(peer, reason, &release_list);
1204 	}
1205 	unlock_ovpn(ovpn, &release_list);
1206 }
1207 
1208 /**
1209  * ovpn_peers_free - free all peers in the instance
1210  * @ovpn: the instance whose peers should be released
1211  * @sk: if not NULL, only peers using this socket are removed and the socket
1212  *      is released immediately
1213  * @reason: the reason for releasing all peers
1214  */
1215 void ovpn_peers_free(struct ovpn_priv *ovpn, struct sock *sk,
1216 		     enum ovpn_del_peer_reason reason)
1217 {
1218 	switch (ovpn->mode) {
1219 	case OVPN_MODE_P2P:
1220 		ovpn_peer_release_p2p(ovpn, sk, reason);
1221 		break;
1222 	case OVPN_MODE_MP:
1223 		ovpn_peers_release_mp(ovpn, sk, reason);
1224 		break;
1225 	}
1226 }
1227 
1228 static time64_t ovpn_peer_keepalive_work_single(struct ovpn_peer *peer,
1229 						time64_t now,
1230 						struct llist_head *release_list)
1231 {
1232 	time64_t last_recv, last_sent, next_run1, next_run2;
1233 	unsigned long timeout, interval;
1234 	bool expired;
1235 
1236 	spin_lock_bh(&peer->lock);
1237 	/* we expect both timers to be configured at the same time,
1238 	 * therefore bail out if either is not set
1239 	 */
1240 	if (!peer->keepalive_timeout || !peer->keepalive_interval) {
1241 		spin_unlock_bh(&peer->lock);
1242 		return 0;
1243 	}
1244 
1245 	/* check for peer timeout */
1246 	expired = false;
1247 	timeout = peer->keepalive_timeout;
1248 	last_recv = READ_ONCE(peer->last_recv);
1249 	if (now < last_recv + timeout) {
1250 		peer->keepalive_recv_exp = last_recv + timeout;
1251 		next_run1 = peer->keepalive_recv_exp;
1252 	} else if (peer->keepalive_recv_exp > now) {
1253 		next_run1 = peer->keepalive_recv_exp;
1254 	} else {
1255 		expired = true;
1256 	}
1257 
1258 	if (expired) {
1259 		/* peer is dead -> kill it and move on */
1260 		spin_unlock_bh(&peer->lock);
1261 		netdev_dbg(peer->ovpn->dev, "peer %u expired\n",
1262 			   peer->id);
1263 		ovpn_peer_remove(peer, OVPN_DEL_PEER_REASON_EXPIRED,
1264 				 release_list);
1265 		return 0;
1266 	}
1267 
1268 	/* check for peer keepalive */
1269 	expired = false;
1270 	interval = peer->keepalive_interval;
1271 	last_sent = READ_ONCE(peer->last_sent);
1272 	if (now < last_sent + interval) {
1273 		peer->keepalive_xmit_exp = last_sent + interval;
1274 		next_run2 = peer->keepalive_xmit_exp;
1275 	} else if (peer->keepalive_xmit_exp > now) {
1276 		next_run2 = peer->keepalive_xmit_exp;
1277 	} else {
1278 		expired = true;
1279 		next_run2 = now + interval;
1280 	}
1281 	spin_unlock_bh(&peer->lock);
1282 
1283 	if (expired) {
1284 		/* a keepalive packet is required */
1285 		netdev_dbg(peer->ovpn->dev,
1286 			   "sending keepalive to peer %u\n",
1287 			   peer->id);
1288 		if (WARN_ON(!ovpn_peer_hold(peer)))
1289 			return 0;
1290 		if (!schedule_work(&peer->keepalive_work))
1291 			ovpn_peer_put(peer);
1292 	}
1293 
1294 	if (next_run1 < next_run2)
1295 		return next_run1;
1296 
1297 	return next_run2;
1298 }
1299 
1300 static time64_t ovpn_peer_keepalive_work_mp(struct ovpn_priv *ovpn,
1301 					    time64_t now,
1302 					    struct llist_head *release_list)
1303 {
1304 	time64_t tmp_next_run, next_run = 0;
1305 	struct hlist_node *tmp;
1306 	struct ovpn_peer *peer;
1307 	int bkt;
1308 
1309 	lockdep_assert_held(&ovpn->lock);
1310 
1311 	hash_for_each_safe(ovpn->peers->by_id, bkt, tmp, peer, hash_entry_id) {
1312 		tmp_next_run = ovpn_peer_keepalive_work_single(peer, now,
1313 							       release_list);
1314 		if (!tmp_next_run)
1315 			continue;
1316 
1317 		/* the next worker run will be scheduled based on the shortest
1318 		 * required interval across all peers
1319 		 */
1320 		if (!next_run || tmp_next_run < next_run)
1321 			next_run = tmp_next_run;
1322 	}
1323 
1324 	return next_run;
1325 }
1326 
1327 static time64_t ovpn_peer_keepalive_work_p2p(struct ovpn_priv *ovpn,
1328 					     time64_t now,
1329 					     struct llist_head *release_list)
1330 {
1331 	struct ovpn_peer *peer;
1332 	time64_t next_run = 0;
1333 
1334 	lockdep_assert_held(&ovpn->lock);
1335 
1336 	peer = rcu_dereference_protected(ovpn->peer,
1337 					 lockdep_is_held(&ovpn->lock));
1338 	if (peer)
1339 		next_run = ovpn_peer_keepalive_work_single(peer, now,
1340 							   release_list);
1341 
1342 	return next_run;
1343 }
1344 
1345 /**
1346  * ovpn_peer_keepalive_work - run keepalive logic on each known peer
1347  * @work: pointer to the work member of the related ovpn object
1348  *
1349  * Each peer has two timers (if configured):
1350  * 1. peer timeout: when no data is received for a certain interval,
1351  *    the peer is considered dead and it gets killed.
1352  * 2. peer keepalive: when no data is sent to a certain peer for a
1353  *    certain interval, a special 'keepalive' packet is explicitly sent.
1354  *
1355  * This function iterates across the whole peer collection while
1356  * checking the timers described above.
1357  */
1358 void ovpn_peer_keepalive_work(struct work_struct *work)
1359 {
1360 	struct ovpn_priv *ovpn = container_of(work, struct ovpn_priv,
1361 					      keepalive_work.work);
1362 	time64_t next_run = 0, now = ktime_get_boottime_seconds();
1363 	LLIST_HEAD(release_list);
1364 
1365 	spin_lock_bh(&ovpn->lock);
1366 	switch (ovpn->mode) {
1367 	case OVPN_MODE_MP:
1368 		next_run = ovpn_peer_keepalive_work_mp(ovpn, now,
1369 						       &release_list);
1370 		break;
1371 	case OVPN_MODE_P2P:
1372 		next_run = ovpn_peer_keepalive_work_p2p(ovpn, now,
1373 							&release_list);
1374 		break;
1375 	}
1376 
1377 	/* prevent rearming if the interface is being destroyed */
1378 	if (next_run > 0) {
1379 		netdev_dbg(ovpn->dev,
1380 			   "scheduling keepalive work: now=%llu next_run=%llu delta=%llu\n",
1381 			   next_run, now, next_run - now);
1382 		schedule_delayed_work(&ovpn->keepalive_work,
1383 				      (next_run - now) * HZ);
1384 	}
1385 	unlock_ovpn(ovpn, &release_list);
1386 }
1387