pespin has uploaded this change for review. ( 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, 82 insertions(+), 35 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/27/32427/1
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..d80515d 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);
@@ -966,10 +953,10 @@ struct sim_hdr *sh = (struct sim_hdr *) msg->data; uint8_t *payload = msg->data + sizeof(*sh); 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; + struct msgb *nmsg;
/* error handling */ if (sh->job_type == SIM_JOB_ERROR) { @@ -1005,13 +992,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 +1006,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 +1013,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 +1224,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 +1251,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; }