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_DEVICE_H 7*4882a593Smuzhiyun #define _WG_DEVICE_H 8*4882a593Smuzhiyun 9*4882a593Smuzhiyun #include "noise.h" 10*4882a593Smuzhiyun #include "allowedips.h" 11*4882a593Smuzhiyun #include "peerlookup.h" 12*4882a593Smuzhiyun #include "cookie.h" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #include <linux/types.h> 15*4882a593Smuzhiyun #include <linux/netdevice.h> 16*4882a593Smuzhiyun #include <linux/workqueue.h> 17*4882a593Smuzhiyun #include <linux/mutex.h> 18*4882a593Smuzhiyun #include <linux/net.h> 19*4882a593Smuzhiyun #include <linux/ptr_ring.h> 20*4882a593Smuzhiyun 21*4882a593Smuzhiyun struct wg_device; 22*4882a593Smuzhiyun 23*4882a593Smuzhiyun struct multicore_worker { 24*4882a593Smuzhiyun void *ptr; 25*4882a593Smuzhiyun struct work_struct work; 26*4882a593Smuzhiyun }; 27*4882a593Smuzhiyun 28*4882a593Smuzhiyun struct crypt_queue { 29*4882a593Smuzhiyun struct ptr_ring ring; 30*4882a593Smuzhiyun struct multicore_worker __percpu *worker; 31*4882a593Smuzhiyun int last_cpu; 32*4882a593Smuzhiyun }; 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun struct prev_queue { 35*4882a593Smuzhiyun struct sk_buff *head, *tail, *peeked; 36*4882a593Smuzhiyun struct { struct sk_buff *next, *prev; } empty; // Match first 2 members of struct sk_buff. 37*4882a593Smuzhiyun atomic_t count; 38*4882a593Smuzhiyun }; 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun struct wg_device { 41*4882a593Smuzhiyun struct net_device *dev; 42*4882a593Smuzhiyun struct crypt_queue encrypt_queue, decrypt_queue, handshake_queue; 43*4882a593Smuzhiyun struct sock __rcu *sock4, *sock6; 44*4882a593Smuzhiyun struct net __rcu *creating_net; 45*4882a593Smuzhiyun struct noise_static_identity static_identity; 46*4882a593Smuzhiyun struct workqueue_struct *packet_crypt_wq,*handshake_receive_wq, *handshake_send_wq; 47*4882a593Smuzhiyun struct cookie_checker cookie_checker; 48*4882a593Smuzhiyun struct pubkey_hashtable *peer_hashtable; 49*4882a593Smuzhiyun struct index_hashtable *index_hashtable; 50*4882a593Smuzhiyun struct allowedips peer_allowedips; 51*4882a593Smuzhiyun struct mutex device_update_lock, socket_update_lock; 52*4882a593Smuzhiyun struct list_head device_list, peer_list; 53*4882a593Smuzhiyun atomic_t handshake_queue_len; 54*4882a593Smuzhiyun unsigned int num_peers, device_update_gen; 55*4882a593Smuzhiyun u32 fwmark; 56*4882a593Smuzhiyun u16 incoming_port; 57*4882a593Smuzhiyun }; 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun int wg_device_init(void); 60*4882a593Smuzhiyun void wg_device_uninit(void); 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #endif /* _WG_DEVICE_H */ 63