diff --git a/src/rspro_util.c b/src/rspro_util.c index 35619ad..f42caba 100644 --- a/src/rspro_util.c +++ b/src/rspro_util.c @@ -340,6 +340,18 @@ RsproPDU_t *rspro_gen_SetAtrReq(uint16_t client_id, uint16_t slot_nr, const uint return pdu; } +RsproPDU_t *rspro_gen_SetAtrRes(e_ResultCode res) +{ + RsproPDU_t *pdu = CALLOC(1, sizeof(*pdu)); + if (!pdu) + return NULL; + pdu->version = 2; + pdu->msg.present = RsproPDUchoice_PR_setAtrRes; + pdu->msg.choice.setAtrRes.result = res; + + return pdu; +} + RsproPDU_t *rspro_gen_TpduModem2Card(const ClientSlot_t *client, const BankSlot_t *bank, const uint8_t *tpdu, unsigned int tpdu_len) { diff --git a/src/rspro_util.h b/src/rspro_util.h index 6164e58..444d34a 100644 --- a/src/rspro_util.h +++ b/src/rspro_util.h @@ -37,6 +37,7 @@ RsproPDU_t *rspro_gen_ConfigClientBankReq(const BankSlot_t *bank, uint32_t ip, u RsproPDU_t *rspro_gen_ConfigClientBankRes(e_ResultCode res); RsproPDU_t *rspro_gen_SetAtrReq(uint16_t client_id, uint16_t slot_nr, const uint8_t *atr, unsigned int atr_len); +RsproPDU_t *rspro_gen_SetAtrRes(e_ResultCode res); RsproPDU_t *rspro_gen_TpduModem2Card(const ClientSlot_t *client, const BankSlot_t *bank, const uint8_t *tpdu, unsigned int tpdu_len); RsproPDU_t *rspro_gen_TpduCard2Modem(const BankSlot_t *bank, const ClientSlot_t *client, diff --git a/src/simtrace2-remsim_client.c b/src/simtrace2-remsim_client.c index ae7c015..095c6d6 100644 --- a/src/simtrace2-remsim_client.c +++ b/src/simtrace2-remsim_client.c @@ -555,6 +555,28 @@ static int bankd_handle_tpduCardToModem(struct bankd_client *bc, RsproPDU_t *pdu return 0; } +static int bankd_handle_setAtrReq(struct bankd_client *bc, RsproPDU_t *pdu) +{ + RsproPDU_t *resp; + int rc; + + OSMO_ASSERT(pdu); + OSMO_ASSERT(RsproPDUchoice_PR_setAtrReq == pdu->msg.present); + + /* FIXME: is this permitted at any time by the SIMtrace2 cardemfirmware? */ + rc = cardem_request_set_atr(ci, pdu->msg.choice.setAtrReq.atr.buf, + pdu->msg.choice.setAtrReq.atr.size); + if (rc == 0) + resp = rspro_gen_SetAtrRes(ResultCode_ok); + else + resp = rspro_gen_SetAtrRes(ResultCode_cardTransmissionError); + if (!resp) + return -ENOMEM; + bankd_conn_send_rspro(g_client, resp); + + return 0; +} + static int bankd_handle_msg(struct bankd_client *bc, struct msgb *msg) { RsproPDU_t *pdu = rspro_dec_msg(msg); @@ -572,6 +594,9 @@ static int bankd_handle_msg(struct bankd_client *bc, struct msgb *msg) case RsproPDUchoice_PR_tpduCardToModem: // APDU response from card received bankd_handle_tpduCardToModem(bc, pdu); break; + case RsproPDUchoice_PR_setAtrReq: + bankd_handle_setAtrReq(bc, pdu); + break; default: LOGPFSML(bc->bankd_fi, LOGL_ERROR, "Unknown/Unsuppoerted RSPRO PDU %s: %s\n", rspro_msgt_name(pdu), msgb_hexdump(msg));