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