|  | /* SPDX-License-Identifier: GPL-2.0 */ | 
|  | /* | 
|  | * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. | 
|  | */ | 
|  |  | 
|  | #ifndef _WG_PEER_H | 
|  | #define _WG_PEER_H | 
|  |  | 
|  | #include "device.h" | 
|  | #include "noise.h" | 
|  | #include "cookie.h" | 
|  |  | 
|  | #include <linux/types.h> | 
|  | #include <linux/netfilter.h> | 
|  | #include <linux/spinlock.h> | 
|  | #include <linux/kref.h> | 
|  | #include <net/dst_cache.h> | 
|  |  | 
|  | struct wg_device; | 
|  |  | 
|  | struct endpoint { | 
|  | union { | 
|  | struct sockaddr_inet addr;     /* Large enough for both address families */ | 
|  | struct sockaddr_in addr4; | 
|  | struct sockaddr_in6 addr6; | 
|  | }; | 
|  | union { | 
|  | struct { | 
|  | struct in_addr src4; | 
|  | /* Essentially the same as addr6->scope_id */ | 
|  | int src_if4; | 
|  | }; | 
|  | struct in6_addr src6; | 
|  | }; | 
|  | }; | 
|  |  | 
|  | struct wg_peer { | 
|  | struct wg_device *device; | 
|  | struct prev_queue tx_queue, rx_queue; | 
|  | struct sk_buff_head staged_packet_queue; | 
|  | int serial_work_cpu; | 
|  | bool is_dead; | 
|  | struct noise_keypairs keypairs; | 
|  | struct endpoint endpoint; | 
|  | struct dst_cache endpoint_cache; | 
|  | rwlock_t endpoint_lock; | 
|  | struct noise_handshake handshake; | 
|  | atomic64_t last_sent_handshake; | 
|  | struct work_struct transmit_handshake_work, clear_peer_work, transmit_packet_work; | 
|  | struct cookie latest_cookie; | 
|  | struct hlist_node pubkey_hash; | 
|  | u64 rx_bytes, tx_bytes; | 
|  | struct timer_list timer_retransmit_handshake, timer_send_keepalive; | 
|  | struct timer_list timer_new_handshake, timer_zero_key_material; | 
|  | struct timer_list timer_persistent_keepalive; | 
|  | unsigned int timer_handshake_attempts; | 
|  | u16 persistent_keepalive_interval; | 
|  | bool timer_need_another_keepalive; | 
|  | bool sent_lastminute_handshake; | 
|  | struct timespec64 walltime_last_handshake; | 
|  | struct kref refcount; | 
|  | struct rcu_head rcu; | 
|  | struct list_head peer_list; | 
|  | struct list_head allowedips_list; | 
|  | struct napi_struct napi; | 
|  | u64 internal_id; | 
|  | }; | 
|  |  | 
|  | struct wg_peer *wg_peer_create(struct wg_device *wg, | 
|  | const u8 public_key[NOISE_PUBLIC_KEY_LEN], | 
|  | const u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN]); | 
|  |  | 
|  | struct wg_peer *__must_check wg_peer_get_maybe_zero(struct wg_peer *peer); | 
|  | static inline struct wg_peer *wg_peer_get(struct wg_peer *peer) | 
|  | { | 
|  | kref_get(&peer->refcount); | 
|  | return peer; | 
|  | } | 
|  | void wg_peer_put(struct wg_peer *peer); | 
|  | void wg_peer_remove(struct wg_peer *peer); | 
|  | void wg_peer_remove_all(struct wg_device *wg); | 
|  |  | 
|  | int wg_peer_init(void); | 
|  | void wg_peer_uninit(void); | 
|  |  | 
|  | #endif /* _WG_PEER_H */ |