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