156639Speter/* SPDX-License-Identifier: GPL-2.0 */ 250276Speter/* 350276Speter * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 450276Speter */ 550276Speter 650276Speter#ifndef _WG_PEER_H 750276Speter#define _WG_PEER_H 850276Speter 950276Speter#include "device.h" 1050276Speter#include "noise.h" 1150276Speter#include "cookie.h" 1250276Speter 1350276Speter#include <linux/types.h> 1450276Speter#include <linux/netfilter.h> 1550276Speter#include <linux/spinlock.h> 1650276Speter#include <linux/kref.h> 1750276Speter#include <net/dst_cache.h> 1850276Speter 1950276Speterstruct wg_device; 2050276Speter 2150276Speterstruct endpoint { 2250276Speter union { 2350276Speter struct sockaddr addr; 2450276Speter struct sockaddr_in addr4; 2550276Speter struct sockaddr_in6 addr6; 2650276Speter }; 2750276Speter union { 2850276Speter struct { 2950276Speter struct in_addr src4; 3050276Speter /* Essentially the same as addr6->scope_id */ 3150276Speter int src_if4; 3250276Speter }; 3350276Speter struct in6_addr src6; 3450276Speter }; 3550276Speter}; 3650276Speter 3750276Speterstruct wg_peer { 3850276Speter struct wg_device *device; 3950276Speter struct prev_queue tx_queue, rx_queue; 4050276Speter struct sk_buff_head staged_packet_queue; 4150276Speter int serial_work_cpu; 4250276Speter bool is_dead; 4350276Speter struct noise_keypairs keypairs; 4450276Speter struct endpoint endpoint; 4550276Speter struct dst_cache endpoint_cache; 4650276Speter rwlock_t endpoint_lock; 4750276Speter struct noise_handshake handshake; 4850276Speter atomic64_t last_sent_handshake; 4950276Speter struct work_struct transmit_handshake_work, clear_peer_work, transmit_packet_work; 5050276Speter struct cookie latest_cookie; 5150276Speter struct hlist_node pubkey_hash; 5250276Speter u64 rx_bytes, tx_bytes; 5350276Speter struct timer_list timer_retransmit_handshake, timer_send_keepalive; 5450276Speter struct timer_list timer_new_handshake, timer_zero_key_material; 5550276Speter struct timer_list timer_persistent_keepalive; 5650276Speter unsigned int timer_handshake_attempts; 5750276Speter u16 persistent_keepalive_interval; 5850276Speter bool timer_need_another_keepalive; 5950276Speter bool sent_lastminute_handshake; 6050276Speter struct timespec64 walltime_last_handshake; 6150276Speter struct kref refcount; 6250276Speter struct rcu_head rcu; 6350276Speter struct list_head peer_list; 6450276Speter struct list_head allowedips_list; 6550276Speter struct napi_struct napi; 6650276Speter u64 internal_id; 6750276Speter}; 6850276Speter 6950276Speterstruct wg_peer *wg_peer_create(struct wg_device *wg, 7050276Speter const u8 public_key[NOISE_PUBLIC_KEY_LEN], 7156639Speter const u8 preshared_key[NOISE_SYMMETRIC_KEY_LEN]); 7256639Speter 7356639Speterstruct wg_peer *__must_check wg_peer_get_maybe_zero(struct wg_peer *peer); 7456639Speterstatic inline struct wg_peer *wg_peer_get(struct wg_peer *peer) 7550276Speter{ 7656639Speter kref_get(&peer->refcount); 7756639Speter return peer; 7856639Speter} 7956639Spetervoid wg_peer_put(struct wg_peer *peer); 8056639Spetervoid wg_peer_remove(struct wg_peer *peer); 8156639Spetervoid wg_peer_remove_all(struct wg_device *wg); 8256639Speter 8356639Speterint wg_peer_init(void); 8456639Spetervoid wg_peer_uninit(void); 8556639Speter 8656639Speter#endif /* _WG_PEER_H */ 8756639Speter