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