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