pespin submitted this change.

View Change


Approvals: osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, approved
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(-)

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;
}

To view, visit change 32427. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I473887e0fd9338d76a69a9774145a04575f14b64
Gerrit-Change-Number: 32427
Gerrit-PatchSet: 3
Gerrit-Owner: pespin <pespin@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: osmith <osmith@sysmocom.de>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>
Gerrit-MessageType: merged