xref: /linux/drivers/net/wireguard/peerlookup.h (revision 8dd06ef34b6e2f41b29fbf5fc1663780f2524285)
1*e7096c13SJason A. Donenfeld /* SPDX-License-Identifier: GPL-2.0 */
2*e7096c13SJason A. Donenfeld /*
3*e7096c13SJason A. Donenfeld  * Copyright (C) 2015-2019 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
4*e7096c13SJason A. Donenfeld  */
5*e7096c13SJason A. Donenfeld 
6*e7096c13SJason A. Donenfeld #ifndef _WG_PEERLOOKUP_H
7*e7096c13SJason A. Donenfeld #define _WG_PEERLOOKUP_H
8*e7096c13SJason A. Donenfeld 
9*e7096c13SJason A. Donenfeld #include "messages.h"
10*e7096c13SJason A. Donenfeld 
11*e7096c13SJason A. Donenfeld #include <linux/hashtable.h>
12*e7096c13SJason A. Donenfeld #include <linux/mutex.h>
13*e7096c13SJason A. Donenfeld #include <linux/siphash.h>
14*e7096c13SJason A. Donenfeld 
15*e7096c13SJason A. Donenfeld struct wg_peer;
16*e7096c13SJason A. Donenfeld 
17*e7096c13SJason A. Donenfeld struct pubkey_hashtable {
18*e7096c13SJason A. Donenfeld 	/* TODO: move to rhashtable */
19*e7096c13SJason A. Donenfeld 	DECLARE_HASHTABLE(hashtable, 11);
20*e7096c13SJason A. Donenfeld 	siphash_key_t key;
21*e7096c13SJason A. Donenfeld 	struct mutex lock;
22*e7096c13SJason A. Donenfeld };
23*e7096c13SJason A. Donenfeld 
24*e7096c13SJason A. Donenfeld struct pubkey_hashtable *wg_pubkey_hashtable_alloc(void);
25*e7096c13SJason A. Donenfeld void wg_pubkey_hashtable_add(struct pubkey_hashtable *table,
26*e7096c13SJason A. Donenfeld 			     struct wg_peer *peer);
27*e7096c13SJason A. Donenfeld void wg_pubkey_hashtable_remove(struct pubkey_hashtable *table,
28*e7096c13SJason A. Donenfeld 				struct wg_peer *peer);
29*e7096c13SJason A. Donenfeld struct wg_peer *
30*e7096c13SJason A. Donenfeld wg_pubkey_hashtable_lookup(struct pubkey_hashtable *table,
31*e7096c13SJason A. Donenfeld 			   const u8 pubkey[NOISE_PUBLIC_KEY_LEN]);
32*e7096c13SJason A. Donenfeld 
33*e7096c13SJason A. Donenfeld struct index_hashtable {
34*e7096c13SJason A. Donenfeld 	/* TODO: move to rhashtable */
35*e7096c13SJason A. Donenfeld 	DECLARE_HASHTABLE(hashtable, 13);
36*e7096c13SJason A. Donenfeld 	spinlock_t lock;
37*e7096c13SJason A. Donenfeld };
38*e7096c13SJason A. Donenfeld 
39*e7096c13SJason A. Donenfeld enum index_hashtable_type {
40*e7096c13SJason A. Donenfeld 	INDEX_HASHTABLE_HANDSHAKE = 1U << 0,
41*e7096c13SJason A. Donenfeld 	INDEX_HASHTABLE_KEYPAIR = 1U << 1
42*e7096c13SJason A. Donenfeld };
43*e7096c13SJason A. Donenfeld 
44*e7096c13SJason A. Donenfeld struct index_hashtable_entry {
45*e7096c13SJason A. Donenfeld 	struct wg_peer *peer;
46*e7096c13SJason A. Donenfeld 	struct hlist_node index_hash;
47*e7096c13SJason A. Donenfeld 	enum index_hashtable_type type;
48*e7096c13SJason A. Donenfeld 	__le32 index;
49*e7096c13SJason A. Donenfeld };
50*e7096c13SJason A. Donenfeld 
51*e7096c13SJason A. Donenfeld struct index_hashtable *wg_index_hashtable_alloc(void);
52*e7096c13SJason A. Donenfeld __le32 wg_index_hashtable_insert(struct index_hashtable *table,
53*e7096c13SJason A. Donenfeld 				 struct index_hashtable_entry *entry);
54*e7096c13SJason A. Donenfeld bool wg_index_hashtable_replace(struct index_hashtable *table,
55*e7096c13SJason A. Donenfeld 				struct index_hashtable_entry *old,
56*e7096c13SJason A. Donenfeld 				struct index_hashtable_entry *new);
57*e7096c13SJason A. Donenfeld void wg_index_hashtable_remove(struct index_hashtable *table,
58*e7096c13SJason A. Donenfeld 			       struct index_hashtable_entry *entry);
59*e7096c13SJason A. Donenfeld struct index_hashtable_entry *
60*e7096c13SJason A. Donenfeld wg_index_hashtable_lookup(struct index_hashtable *table,
61*e7096c13SJason A. Donenfeld 			  const enum index_hashtable_type type_mask,
62*e7096c13SJason A. Donenfeld 			  const __le32 index, struct wg_peer **peer);
63*e7096c13SJason A. Donenfeld 
64*e7096c13SJason A. Donenfeld #endif /* _WG_PEERLOOKUP_H */
65