162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved. 462306a36Sopenharmony_ci */ 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#ifndef _WG_DEVICE_H 762306a36Sopenharmony_ci#define _WG_DEVICE_H 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#include "noise.h" 1062306a36Sopenharmony_ci#include "allowedips.h" 1162306a36Sopenharmony_ci#include "peerlookup.h" 1262306a36Sopenharmony_ci#include "cookie.h" 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#include <linux/types.h> 1562306a36Sopenharmony_ci#include <linux/netdevice.h> 1662306a36Sopenharmony_ci#include <linux/workqueue.h> 1762306a36Sopenharmony_ci#include <linux/mutex.h> 1862306a36Sopenharmony_ci#include <linux/net.h> 1962306a36Sopenharmony_ci#include <linux/ptr_ring.h> 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_cistruct wg_device; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistruct multicore_worker { 2462306a36Sopenharmony_ci void *ptr; 2562306a36Sopenharmony_ci struct work_struct work; 2662306a36Sopenharmony_ci}; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cistruct crypt_queue { 2962306a36Sopenharmony_ci struct ptr_ring ring; 3062306a36Sopenharmony_ci struct multicore_worker __percpu *worker; 3162306a36Sopenharmony_ci int last_cpu; 3262306a36Sopenharmony_ci}; 3362306a36Sopenharmony_ci 3462306a36Sopenharmony_cistruct prev_queue { 3562306a36Sopenharmony_ci struct sk_buff *head, *tail, *peeked; 3662306a36Sopenharmony_ci struct { struct sk_buff *next, *prev; } empty; // Match first 2 members of struct sk_buff. 3762306a36Sopenharmony_ci atomic_t count; 3862306a36Sopenharmony_ci}; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistruct wg_device { 4162306a36Sopenharmony_ci struct net_device *dev; 4262306a36Sopenharmony_ci struct crypt_queue encrypt_queue, decrypt_queue, handshake_queue; 4362306a36Sopenharmony_ci struct sock __rcu *sock4, *sock6; 4462306a36Sopenharmony_ci struct net __rcu *creating_net; 4562306a36Sopenharmony_ci struct noise_static_identity static_identity; 4662306a36Sopenharmony_ci struct workqueue_struct *packet_crypt_wq,*handshake_receive_wq, *handshake_send_wq; 4762306a36Sopenharmony_ci struct cookie_checker cookie_checker; 4862306a36Sopenharmony_ci struct pubkey_hashtable *peer_hashtable; 4962306a36Sopenharmony_ci struct index_hashtable *index_hashtable; 5062306a36Sopenharmony_ci struct allowedips peer_allowedips; 5162306a36Sopenharmony_ci struct mutex device_update_lock, socket_update_lock; 5262306a36Sopenharmony_ci struct list_head device_list, peer_list; 5362306a36Sopenharmony_ci atomic_t handshake_queue_len; 5462306a36Sopenharmony_ci unsigned int num_peers, device_update_gen; 5562306a36Sopenharmony_ci u32 fwmark; 5662306a36Sopenharmony_ci u16 incoming_port; 5762306a36Sopenharmony_ci}; 5862306a36Sopenharmony_ci 5962306a36Sopenharmony_ciint wg_device_init(void); 6062306a36Sopenharmony_civoid wg_device_uninit(void); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci#endif /* _WG_DEVICE_H */ 63