From 454f5e2543735be6c8c6779b3d3863aa07d5ae1b Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Sat, 9 Mar 2019 21:38:34 +0100 Subject: [PATCH] bankd: Don't use hard-coded slotmaps but receive them from remsim-server Change-Id: I642476c2935fbaa96ce5986e3e6708eed0d2ffe2 --- src/bankd_main.c | 69 +++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 57 insertions(+), 12 deletions(-) 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 @@ static void bankd_init(struct bankd *bankd) * 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 struct bankd_worker *bankd_create_worker(struct bankd *bankd, unsigned in 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 @@ static int bankd_srvc_handle_rx(struct rspro_server_conn *srvc, const RsproPDU_t 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;