bankd: Don't use hard-coded slotmaps but receive them from remsim-server

Change-Id: I642476c2935fbaa96ce5986e3e6708eed0d2ffe2
diff --git a/src/bankd_main.c b/src/bankd_main.c
index 349236d..6f43553 100644
--- a/src/bankd_main.c
+++ b/src/bankd_main.c
@@ -91,17 +91,6 @@
 	 * started yet */
 	INIT_LLIST_HEAD(&bankd->pcsc_slot_names);
 	OSMO_ASSERT(bankd_pcsc_read_slotnames(bankd, "bankd_pcsc_slots.csv") == 0);
-
-	/* HACK HACK HACK */
-	{
-		struct bank_slot bs = { .bank_id = 1, };
-		struct client_slot cs = { .client_id = 23, };
-		int i;
-		for (i = 0; i < 5; i++) {
-			bs.slot_nr = cs.slot_nr = i;
-			slotmap_add(bankd->slotmaps, &bs, &cs);
-		}
-	}
 }
 
 /* create + start a new bankd_worker thread */
@@ -134,10 +123,29 @@
 
 static bool terminate = false;
 
+static void rspro2bank_slot(struct bank_slot *out, const BankSlot_t *in)
+{
+	out->bank_id = in->bankId;
+	out->slot_nr = in->slotNr;
+}
+
+static void rspro2client_slot(struct client_slot *out, const ClientSlot_t *in)
+{
+	out->client_id = in->clientId;
+	out->slot_nr = in->slotNr;
+}
+
 /* handle incoming messages from server */
 static int bankd_srvc_handle_rx(struct rspro_server_conn *srvc, const RsproPDU_t *pdu)
 {
-	struct RsproPDU_t *resp;
+	const CreateMappingReq_t *creq = NULL;
+	const RemoveMappingReq_t *rreq = NULL;
+	struct slot_mapping *map;
+	struct bank_slot bs;
+	struct client_slot cs;
+	RsproPDU_t *resp;
+
+	LOGPFSM(srvc->fi, "Rx RSPRO %s\n", rspro_msgt_name(pdu));
 
 	switch (pdu->msg.present) {
 	case RsproPDUchoice_PR_connectBankRes:
@@ -145,6 +153,43 @@
 		rspro_comp_id_retrieve(&srvc->peer_comp_id, &pdu->msg.choice.connectBankRes.identity);
 		osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_CLIENT_CONN_RES, (void *) pdu);
 		break;
+	case RsproPDUchoice_PR_createMappingReq:
+		creq = &pdu->msg.choice.createMappingReq;
+		if (creq->bank.bankId != g_bankd->cfg.bank_id)
+			resp = rspro_gen_CreateMappingRes(ResultCode_illegalBankId);
+		else if (creq->bank.slotNr >= g_bankd->cfg.num_slots)
+			resp = rspro_gen_CreateMappingRes(ResultCode_illegalSlotId);
+		else {
+			rspro2bank_slot(&bs, &creq->bank);
+			rspro2client_slot(&cs, &creq->client);
+			/* Add a new mapping */
+			map = slotmap_add(g_bankd->slotmaps, &bs, &cs);
+			if (!map)
+				resp = rspro_gen_CreateMappingRes(ResultCode_illegalSlotId);
+			else
+				resp = rspro_gen_CreateMappingRes(ResultCode_ok);
+		}
+		server_conn_send_rspro(srvc, resp);
+		break;
+	case RsproPDUchoice_PR_removeMappingReq:
+		rreq = &pdu->msg.choice.removeMappingReq;
+		if (rreq->bank.bankId != g_bankd->cfg.bank_id)
+			resp = rspro_gen_RemoveMappingRes(ResultCode_illegalBankId);
+		else if (rreq->bank.slotNr >= g_bankd->cfg.num_slots)
+			resp = rspro_gen_RemoveMappingRes(ResultCode_illegalSlotId);
+		else {
+			rspro2bank_slot(&bs, &rreq->bank);
+			/* Remove a mapping */
+			map = slotmap_by_bank(g_bankd->slotmaps, &bs);
+			if (!map)
+				resp = rspro_gen_RemoveMappingRes(ResultCode_unknownSlotmap);
+			else {
+				/* FIXME: kill/reset the respective worker, if any! */
+				slotmap_del(g_bankd->slotmaps, map);
+				resp = rspro_gen_RemoveMappingRes(ResultCode_ok);
+			}
+		}
+		break;
 	default:
 		fprintf(stderr, "Unknown/Unsupported RSPRO PDU type: %u\n", pdu->msg.present);
 		return -1;