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

Change-Id: I642476c2935fbaa96ce5986e3e6708eed0d2ffe2
This commit is contained in:
Harald Welte 2019-03-09 21:38:34 +01:00
parent a0f395043e
commit 454f5e2543
1 changed files with 57 additions and 12 deletions

View File

@ -91,17 +91,6 @@ static void bankd_init(struct bankd *bankd)
* started yet */ * started yet */
INIT_LLIST_HEAD(&bankd->pcsc_slot_names); INIT_LLIST_HEAD(&bankd->pcsc_slot_names);
OSMO_ASSERT(bankd_pcsc_read_slotnames(bankd, "bankd_pcsc_slots.csv") == 0); 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 */ /* 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 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 */ /* handle incoming messages from server */
static int bankd_srvc_handle_rx(struct rspro_server_conn *srvc, const RsproPDU_t *pdu) 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) { switch (pdu->msg.present) {
case RsproPDUchoice_PR_connectBankRes: 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); 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); osmo_fsm_inst_dispatch(srvc->fi, SRVC_E_CLIENT_CONN_RES, (void *) pdu);
break; 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: default:
fprintf(stderr, "Unknown/Unsupported RSPRO PDU type: %u\n", pdu->msg.present); fprintf(stderr, "Unknown/Unsupported RSPRO PDU type: %u\n", pdu->msg.present);
return -1; return -1;