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

--
To view, visit https://gerrit.osmocom.org/c/osmocom-bb/+/32427
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I473887e0fd9338d76a69a9774145a04575f14b64
Gerrit-Change-Number: 32427
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <[email protected]>
Gerrit-MessageType: newchange

Reply via email to