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