pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmocom-bb/+/32427 )
Change subject: layer23: Decouple SIM events from MMR events ......................................................................
layer23: Decouple SIM events from MMR events
let the specific app handle the events generated from the subscriber/SIM. All the MMR specific code can for now stay in mobile/ while SIM support can be in common/ without violating layers (common/ calling functions in mobile/).
Change-Id: I473887e0fd9338d76a69a9774145a04575f14b64 --- M src/host/layer23/include/osmocom/bb/common/osmocom_data.h M src/host/layer23/src/common/subscriber.c M src/host/layer23/src/mobile/app_mobile.c 3 files changed, 91 insertions(+), 53 deletions(-)
Approvals: osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, approved
diff --git a/src/host/layer23/include/osmocom/bb/common/osmocom_data.h b/src/host/layer23/include/osmocom/bb/common/osmocom_data.h index 600c412..3e5c13a 100644 --- a/src/host/layer23/include/osmocom/bb/common/osmocom_data.h +++ b/src/host/layer23/include/osmocom/bb/common/osmocom_data.h @@ -11,6 +11,7 @@ SS_L1CTL, SS_GLOBAL, SS_L23_VTY, + SS_L23_SUBSCR, };
enum osmobb_l1ctl_sig { @@ -34,6 +35,12 @@ S_L23_VTY_MS_STOP, };
+enum osmobb_l23_subscriber { + S_L23_SUBSCR_SIM_ATTACHED, + S_L23_SUBSCR_SIM_DETACHED, + S_L23_SUBSCR_SIM_AUTH_RESP, +}; + struct osmobb_l23_vty_sig_data { struct vty *vty; union { @@ -49,6 +56,11 @@ }; };
+struct osmobb_l23_subscr_sim_auth_resp_sig_data { + struct osmocom_ms *ms; + uint8_t sres[4]; +}; + struct osmobb_fbsb_res { struct osmocom_ms *ms; int8_t snr; diff --git a/src/host/layer23/src/common/subscriber.c b/src/host/layer23/src/common/subscriber.c index e3f5a8c..41d59f9 100644 --- a/src/host/layer23/src/common/subscriber.c +++ b/src/host/layer23/src/common/subscriber.c @@ -139,7 +139,6 @@ { struct gsm_settings *set = &ms->settings; struct gsm_subscriber *subscr = &ms->subscr; - struct msgb *nmsg;
if (subscr->sim_valid) { LOGP(DMM, LOGL_ERROR, "Cannot insert card, until current card " @@ -192,11 +191,7 @@ LOGP(DMM, LOGL_INFO, "-> Test card attached\n");
/* insert card */ - nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_REG_REQ); - if (!nmsg) - return -ENOMEM; - gsm48_mmr_downmsg(ms, nmsg); - + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_ATTACHED, ms); return 0; }
@@ -556,11 +551,7 @@ LOGP(DMM, LOGL_INFO, "-> SIM card not registered\n");
/* insert card */ - nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_REG_REQ); - if (!nmsg) - return -ENOMEM; - gsm48_mmr_downmsg(ms, nmsg); - + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_ATTACHED, ms); return 0; }
@@ -593,7 +584,6 @@ uint16_t payload_len = msg->len - sizeof(*sh); int rc; struct subscr_sim_file *sf = &subscr_sim_files[subscr->sim_file_index]; - struct msgb *nmsg;
/* error handling */ if (sh->job_type == SIM_JOB_ERROR) { @@ -642,10 +632,7 @@
/* detach simcard */ subscr->sim_valid = 0; - nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_NREG_REQ); - if (!nmsg) - return; - gsm48_mmr_downmsg(ms, nmsg); + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_DETACHED, ms); } msgb_free(msg);
@@ -888,29 +875,23 @@ struct gsm_subscriber *subscr = &ms->subscr; struct msgb *nmsg; struct sim_hdr *nsh; + struct osmobb_l23_subscr_sim_auth_resp_sig_data sd;
/* not a SIM */ if ((subscr->sim_type != GSM_SIM_TYPE_TEST && !GSM_SIM_IS_READER(subscr->sim_type)) || !subscr->sim_valid || no_sim) { - struct gsm48_mm_event *nmme; - LOGP(DMM, LOGL_INFO, "Sending dummy authentication response\n"); - nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE); - if (!nmsg) - return -ENOMEM; - nmme = (struct gsm48_mm_event *) nmsg->data; - nmme->sres[0] = 0x12; - nmme->sres[1] = 0x34; - nmme->sres[2] = 0x56; - nmme->sres[3] = 0x78; - gsm48_mmevent_msg(ms, nmsg); - + sd.ms = ms; + sd.sres[0] = 0x12; + sd.sres[1] = 0x34; + sd.sres[2] = 0x56; + sd.sres[3] = 0x78; + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_AUTH_RESP, &sd); return 0; }
/* test SIM */ if (subscr->sim_type == GSM_SIM_TYPE_TEST) { - struct gsm48_mm_event *nmme; struct gsm_settings *set = &ms->settings; static struct osmo_sub_auth_data auth = { .type = OSMO_AUTH_TYPE_GSM @@ -929,12 +910,9 @@ memcpy(subscr->key, vec->kc, 8);
LOGP(DMM, LOGL_INFO, "Sending authentication response\n"); - nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE); - if (!nmsg) - return -ENOMEM; - nmme = (struct gsm48_mm_event *) nmsg->data; - memcpy(nmme->sres, vec->sres, 4); - gsm48_mmevent_msg(ms, nmsg); + sd.ms = ms; + memcpy(sd.sres, vec->sres, 4); + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_AUTH_RESP, &sd);
return 0; } @@ -968,8 +946,8 @@ uint16_t payload_len = msg->len - sizeof(*sh); struct msgb *nmsg; struct sim_hdr *nsh; - struct gsm48_mm_event *nmme; uint8_t *data; + struct osmobb_l23_subscr_sim_auth_resp_sig_data sd;
/* error handling */ if (sh->job_type == SIM_JOB_ERROR) { @@ -1005,13 +983,9 @@ sim_job(ms, nmsg);
/* return signed response */ - nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE); - if (!nmsg) - return; - nmme = (struct gsm48_mm_event *) nmsg->data; - memcpy(nmme->sres, payload, 4); - gsm48_mmevent_msg(ms, nmsg); - + sd.ms = ms; + memcpy(sd.sres, payload, 4); + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_AUTH_RESP, &sd); msgb_free(msg); }
@@ -1023,7 +997,6 @@ int gsm_subscr_remove(struct osmocom_ms *ms) { struct gsm_subscriber *subscr = &ms->subscr; - struct msgb *nmsg;
if (!subscr->sim_valid) { LOGP(DMM, LOGL_ERROR, "Cannot remove card, no card present\n"); @@ -1031,10 +1004,7 @@ }
/* remove card */ - nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_NREG_REQ); - if (!nmsg) - return -ENOMEM; - gsm48_mmr_downmsg(ms, nmsg); + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_DETACHED, ms);
return 0; } @@ -1245,7 +1215,6 @@ int gsm_subscr_sapcard(struct osmocom_ms *ms) { struct gsm_subscriber *subscr = &ms->subscr; - struct msgb *nmsg; int rc;
if (subscr->sim_valid) { @@ -1273,10 +1242,7 @@
/* Detach SIM */ subscr->sim_valid = 0; - nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_NREG_REQ); - if (!nmsg) - return -ENOMEM; - gsm48_mmr_downmsg(ms, nmsg); + osmo_signal_dispatch(SS_L23_SUBSCR, S_L23_SUBSCR_SIM_DETACHED, ms);
return rc; } diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c index 8befc80..1fdb275 100644 --- a/src/host/layer23/src/mobile/app_mobile.c +++ b/src/host/layer23/src/mobile/app_mobile.c @@ -91,6 +91,49 @@ return work; }
+/* SIM becomes ATTACHED/DETACHED, or answers a request */ +int mobile_l23_subscr_signal_cb(unsigned int subsys, unsigned int signal, + void *handler_data, void *signal_data) +{ + struct msgb *nmsg; + struct gsm48_mm_event *nmme; + struct osmocom_ms *ms; + struct osmobb_l23_subscr_sim_auth_resp_sig_data *sim_auth_resp; + + OSMO_ASSERT(subsys == SS_L23_SUBSCR); + + switch (signal) { + case S_L23_SUBSCR_SIM_ATTACHED: + ms = signal_data; + nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_REG_REQ); + if (!nmsg) + return -ENOMEM; + gsm48_mmr_downmsg(ms, nmsg); + break; + case S_L23_SUBSCR_SIM_DETACHED: + ms = signal_data; + nmsg = gsm48_mmr_msgb_alloc(GSM48_MMR_NREG_REQ); + if (!nmsg) + return 0; + gsm48_mmr_downmsg(ms, nmsg); + break; + case S_L23_SUBSCR_SIM_AUTH_RESP: + sim_auth_resp = signal_data; + ms = sim_auth_resp->ms; + nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE); + if (!nmsg) + return 0; + nmme = (struct gsm48_mm_event *) nmsg->data; + memcpy(nmme->sres, sim_auth_resp->sres, 4); + gsm48_mmevent_msg(ms, nmsg); + break; + default: + OSMO_ASSERT(0); + } + + return 0; +} + /* run ms instance, if layer1 is available */ int mobile_signal_cb(unsigned int subsys, unsigned int signal, void *handler_data, void *signal_data) @@ -431,6 +474,7 @@ /* global exit */ int _mobile_app_exit(void) { + osmo_signal_unregister_handler(SS_L23_SUBSCR, &mobile_l23_subscr_signal_cb, NULL); osmo_signal_unregister_handler(SS_L1CTL, &gsm322_l1_signal, NULL); osmo_signal_unregister_handler(SS_L1CTL, &mobile_signal_cb, NULL); osmo_signal_unregister_handler(SS_GLOBAL, &global_signal_cb, NULL); @@ -481,6 +525,7 @@ osmo_signal_register_handler(SS_GLOBAL, &global_signal_cb, NULL); osmo_signal_register_handler(SS_L1CTL, &mobile_signal_cb, NULL); osmo_signal_register_handler(SS_L1CTL, &gsm322_l1_signal, NULL); + osmo_signal_register_handler(SS_L23_SUBSCR, &mobile_l23_subscr_signal_cb, NULL);
return 0; }