generalize slotmap to make use of it outside of bankd

Change-Id: I0ca7feaa38dfd0468814ef5a1eff997ce854cedf
diff --git a/src/slotmap.h b/src/slotmap.h
new file mode 100644
index 0000000..92eb6f4
--- /dev/null
+++ b/src/slotmap.h
@@ -0,0 +1,62 @@
+#pragma once
+#include <stdint.h>
+#include <stdbool.h>
+#include <pthread.h>
+#include <osmocom/core/linuxlist.h>
+
+struct bank_slot {
+	uint16_t bank_id;
+	uint16_t slot_nr;
+};
+
+static inline bool bank_slot_equals(const struct bank_slot *a, const struct bank_slot *b)
+{
+	if (a->bank_id == b->bank_id && a->slot_nr == b->slot_nr)
+		return true;
+	else
+		return false;
+}
+
+struct client_slot {
+	uint16_t client_id;
+	uint16_t slot_nr;
+};
+
+static inline bool client_slot_equals(const struct client_slot *a, const struct client_slot *b)
+{
+	if (a->client_id == b->client_id && a->slot_nr == b->slot_nr)
+		return true;
+	else
+		return false;
+}
+
+/* slot mappings are created / removed by the server */
+struct slot_mapping {
+	/* global lits of bankd slot mappings */
+	struct llist_head list;
+	/* slot on bank side */
+	struct bank_slot bank;
+	/* slot on client side */
+	struct client_slot client;
+};
+
+/* collection of slot mappings */
+struct slotmaps {
+	struct llist_head mappings;
+	pthread_rwlock_t rwlock;
+};
+
+/* thread-safe lookup of map by client:slot */
+struct slot_mapping *slotmap_by_client(struct slotmaps *maps, const struct client_slot *client);
+
+/* thread-safe lookup of map by bank:slot */
+struct slot_mapping *slotmap_by_bank(struct slotmaps *maps, const struct bank_slot *bank);
+
+/* thread-safe creating of a new bank<->client map */
+int slotmap_add(struct slotmaps *maps, const struct bank_slot *bank, const struct client_slot *client);
+
+/* thread-safe removal of a bank<->client map */
+void slotmap_del(struct slotmaps *maps, struct slot_mapping *map);
+
+/* initialize the entire map collection */
+struct slotmaps *slotmap_init(void *ctx);