1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 4*4882a593Smuzhiyun */ 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun #ifndef _WG_PEER_H 7*4882a593Smuzhiyun #define _WG_PEER_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "device.h" 10*4882a593Smuzhiyun #include "noise.h" 11*4882a593Smuzhiyun #include "cookie.h" 12*4882a593Smuzhiyun 13*4882a593Smuzhiyun #include <linux/types.h> 14*4882a593Smuzhiyun #include <linux/netfilter.h> 15*4882a593Smuzhiyun #include <linux/spinlock.h> 16*4882a593Smuzhiyun #include <linux/kref.h> 17*4882a593Smuzhiyun #include <net/dst_cache.h> 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun struct wg_device; 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct endpoint { 22*4882a593Smuzhiyun union { 23*4882a593Smuzhiyun struct sockaddr addr; 24*4882a593Smuzhiyun struct sockaddr_in addr4; 25*4882a593Smuzhiyun struct sockaddr_in6 addr6; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun union { 28*4882a593Smuzhiyun struct { 29*4882a593Smuzhiyun struct in_addr src4; 30*4882a593Smuzhiyun /* Essentially the same as addr6->scope_id */ 31*4882a593Smuzhiyun int src_if4; 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun struct in6_addr src6; 34*4882a593Smuzhiyun }; 35*4882a593Smuzhiyun }; 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun struct wg_peer { 38*4882a593Smuzhiyun struct wg_device *device; 39*4882a593Smuzhiyun struct prev_queue tx_queue, rx_queue; 40*4882a593Smuzhiyun struct sk_buff_head staged_packet_queue; 41*4882a593Smuzhiyun int serial_work_cpu; 42*4882a593Smuzhiyun struct noise_keypairs keypairs; 43*4882a593Smuzhiyun struct endpoint endpoint; 44*4882a593Smuzhiyun struct dst_cache endpoint_cache; 45*4882a593Smuzhiyun rwlock_t endpoint_lock; 46*4882a593Smuzhiyun struct noise_handshake handshake; 47*4882a593Smuzhiyun atomic64_t last_sent_handshake; 48*4882a593Smuzhiyun struct work_struct transmit_handshake_work, clear_peer_work, transmit_packet_work; 49*4882a593Smuzhiyun struct cookie latest_cookie; 50*4882a593Smuzhiyun struct hlist_node pubkey_hash; 51*4882a593Smuzhiyun u64 rx_bytes, tx_bytes; 52*4882a593Smuzhiyun struct timer_list timer_retransmit_handshake, timer_send_keepalive; 53*4882a593Smuzhiyun struct timer_list timer_new_handshake, timer_zero_key_material; 54*4882a593Smuzhiyun struct timer_list timer_persistent_keepalive; 55*4882a593Smuzhiyun unsigned int timer_handshake_attempts; 56*4882a593Smuzhiyun u16 persistent_keepalive_interval; 57*4882a593Smuzhiyun bool timer_need_another_keepalive; 58*4882a593Smuzhiyun bool sent_lastminute_handshake; 59*4882a593Smuzhiyun struct timespec64 walltime_last_handshake; 60*4882a593Smuzhiyun struct kref refcount; 61*4882a593Smuzhiyun struct rcu_head rcu; 62*4882a593Smuzhiyun struct list_head peer_list; 63*4882a593Smuzhiyun struct list_head allowedips_list; 64*4882a593Smuzhiyun u64 internal_id; 65*4882a593Smuzhiyun struct napi_struct napi; 66*4882a593Smuzhiyun bool is_dead; 67*4882a593Smuzhiyun }; 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun struct wg_peer *wg_peer_create(struct wg_device *wg, 70*4882a593Smuzhiyun const u8 public_key[NOISE_PUBLIC_KEY_LEN], 71*4882a593Smuzhiyun const u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN]); 72*4882a593Smuzhiyun 73*4882a593Smuzhiyun struct wg_peer *__must_check wg_peer_get_maybe_zero(struct wg_peer *peer); wg_peer_get(struct wg_peer * peer)74*4882a593Smuzhiyunstatic inline struct wg_peer *wg_peer_get(struct wg_peer *peer) 75*4882a593Smuzhiyun { 76*4882a593Smuzhiyun kref_get(&peer->refcount); 77*4882a593Smuzhiyun return peer; 78*4882a593Smuzhiyun } 79*4882a593Smuzhiyun void wg_peer_put(struct wg_peer *peer); 80*4882a593Smuzhiyun void wg_peer_remove(struct wg_peer *peer); 81*4882a593Smuzhiyun void wg_peer_remove_all(struct wg_device *wg); 82*4882a593Smuzhiyun 83*4882a593Smuzhiyun int wg_peer_init(void); 84*4882a593Smuzhiyun void wg_peer_uninit(void); 85*4882a593Smuzhiyun 86*4882a593Smuzhiyun #endif /* _WG_PEER_H */ 87