pespin has submitted this change. ( 
https://gerrit.osmocom.org/c/osmocom-bb/+/32442 )

 (

7 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted 
one.
 )Change subject: layer23: Use subscriber information and events to trigger 
GMMREG Attach
......................................................................

layer23: Use subscriber information and events to trigger GMMREG Attach

Change-Id: I1c7cc120ff4098c0b845e13a6e5e5db8b7e18376
---
M src/host/layer23/include/osmocom/bb/modem/gmm.h
M src/host/layer23/include/osmocom/bb/modem/sm.h
M src/host/layer23/src/modem/app_modem.c
M src/host/layer23/src/modem/gmm.c
M src/host/layer23/src/modem/sm.c
M src/host/layer23/src/modem/vty.c
6 files changed, 161 insertions(+), 65 deletions(-)

Approvals:
  fixeria: Looks good to me, approved
  Jenkins Builder: Verified




diff --git a/src/host/layer23/include/osmocom/bb/modem/gmm.h 
b/src/host/layer23/include/osmocom/bb/modem/gmm.h
index 4ec3e8e..6269c82 100644
--- a/src/host/layer23/include/osmocom/bb/modem/gmm.h
+++ b/src/host/layer23/include/osmocom/bb/modem/gmm.h
@@ -5,3 +5,6 @@
 struct osmocom_ms;

 int modem_gmm_init(struct osmocom_ms *ms);
+
+int modem_gmm_gmmreg_attach_req(const struct osmocom_ms *ms);
+int modem_gmm_gmmreg_detach_req(const struct osmocom_ms *ms);
diff --git a/src/host/layer23/include/osmocom/bb/modem/sm.h 
b/src/host/layer23/include/osmocom/bb/modem/sm.h
index 51000cf..b1a5df5 100644
--- a/src/host/layer23/include/osmocom/bb/modem/sm.h
+++ b/src/host/layer23/include/osmocom/bb/modem/sm.h
@@ -5,3 +5,4 @@
 struct osmocom_ms;

 int modem_sm_init(struct osmocom_ms *ms);
+int modem_sm_smreg_pdp_act_req(const struct osmocom_ms *ms, const struct 
osmobb_apn *apn);
diff --git a/src/host/layer23/src/modem/app_modem.c 
b/src/host/layer23/src/modem/app_modem.c
index 12ac4ae..d80fe91 100644
--- a/src/host/layer23/src/modem/app_modem.c
+++ b/src/host/layer23/src/modem/app_modem.c
@@ -114,10 +114,41 @@
        memset(&app_data, 0x00, sizeof(app_data));
 }

+/* SIM becomes ATTACHED/DETACHED, or answers a request */
+static int modem_l23_subscr_signal_cb(unsigned int subsys, unsigned int signal,
+                    void *handler_data, void *signal_data)
+{
+       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;
+               modem_gmm_gmmreg_attach_req(ms);
+               break;
+       case S_L23_SUBSCR_SIM_DETACHED:
+               ms = signal_data;
+               modem_gmm_gmmreg_detach_req(ms);
+               break;
+       case S_L23_SUBSCR_SIM_AUTH_RESP:
+               sim_auth_resp = signal_data;
+               ms = sim_auth_resp->ms;
+               /* TODO: pass sim_auth_resp->sres to GMM layer */
+               break;
+       default:
+               OSMO_ASSERT(0);
+       }
+
+       return 0;
+}
+
 static int global_signal_cb(unsigned int subsys, unsigned int signal,
                            void *handler_data, void *signal_data)
 {
        struct osmocom_ms *ms;
+       struct gsm_settings *set;

        if (subsys != SS_L1CTL)
                return 0;
@@ -128,6 +159,29 @@
                layer3_app_reset();
                app_data.ms = ms;

+               /* insert test card, if enabled */
+               set = &ms->settings;
+               switch (set->sim_type) {
+               case GSM_SIM_TYPE_L1PHY:
+                       /* trigger sim card reader process */
+                       gsm_subscr_simcard(ms);
+                       break;
+               case GSM_SIM_TYPE_TEST:
+                       gsm_subscr_testcard(ms, set->test_rplmn_mcc,
+                               set->test_rplmn_mnc, set->test_lac,
+                               set->test_tmsi, set->test_imsi_attached);
+                       break;
+               case GSM_SIM_TYPE_SAP:
+                       gsm_subscr_sapcard(ms);
+                       break;
+               default:
+                       /* No SIM, trigger PLMN selection process.
+                        * FIXME: not implemented. Code in mobile needs to be
+                        * moved to common/ and reuse it here.
+                        */
+                       break;
+               }
+
                ms->started = true;
                return l1ctl_tx_fbsb_req(ms, ms->test_arfcn,
                                         L1CTL_FBSB_F_FB01SB, 100, 0,
@@ -154,6 +208,7 @@
 /* global exit */
 static int _modem_exit(void)
 {
+       osmo_signal_unregister_handler(SS_L23_SUBSCR, 
&modem_l23_subscr_signal_cb, NULL);
        osmo_signal_unregister_handler(SS_GLOBAL, &global_signal_cb, NULL);
        return 0;
 }
@@ -198,6 +253,7 @@
        }

        osmo_signal_register_handler(SS_L1CTL, &global_signal_cb, NULL);
+       osmo_signal_register_handler(SS_L23_SUBSCR, 
&modem_l23_subscr_signal_cb, NULL);
        lapdm_channel_set_l3(&app_data.ms->lapdm_channel, &modem_grr_rslms_cb, 
app_data.ms);
        return 0;
 }
diff --git a/src/host/layer23/src/modem/gmm.c b/src/host/layer23/src/modem/gmm.c
index 9472e32..650bd2f 100644
--- a/src/host/layer23/src/modem/gmm.c
+++ b/src/host/layer23/src/modem/gmm.c
@@ -124,3 +124,38 @@
        osmo_gprs_gmm_enable_gprs(true);
        return rc;
 }
+
+int modem_gmm_gmmreg_attach_req(const struct osmocom_ms *ms)
+{
+       struct osmo_gprs_gmm_prim *gmm_prim;
+       const struct gsm_subscriber *subscr = &ms->subscr;
+       int rc;
+
+       gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_attach_req();
+       gmm_prim->gmmreg.attach_req.attach_type = 
OSMO_GPRS_GMM_ATTACH_TYPE_GPRS;
+       gmm_prim->gmmreg.attach_req.ptmsi = subscr->tmsi;
+       gmm_prim->gmmreg.attach_req.attach_with_imsi = (subscr->tmsi == 
GSM_RESERVED_TMSI);
+       memcpy(gmm_prim->gmmreg.attach_req.imsi, subscr->imsi, 
ARRAY_SIZE(subscr->imsi));
+       memcpy(gmm_prim->gmmreg.attach_req.imei, ms->settings.imei, 
ARRAY_SIZE(ms->settings.imei));
+       memcpy(gmm_prim->gmmreg.attach_req.imeisv, ms->settings.imeisv, 
ARRAY_SIZE(ms->settings.imeisv));
+       rc = osmo_gprs_gmm_prim_upper_down(gmm_prim);
+       if (rc < 0)
+               LOGP(DMM, LOGL_ERROR, "Failed submitting GMMREG-ATTACH.req\n");
+       return rc;
+}
+
+int modem_gmm_gmmreg_detach_req(const struct osmocom_ms *ms)
+{
+       struct osmo_gprs_gmm_prim *gmm_prim;
+       const struct gsm_subscriber *subscr = &ms->subscr;
+       int rc;
+
+       gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_detach_req();
+       gmm_prim->gmmreg.detach_req.ptmsi = subscr->tmsi;
+       gmm_prim->gmmreg.detach_req.detach_type = 
OSMO_GPRS_GMM_DETACH_MS_TYPE_GPRS;
+       gmm_prim->gmmreg.detach_req.poweroff_type = 
OSMO_GPRS_GMM_DETACH_POWEROFF_TYPE_NORMAL;
+       rc = osmo_gprs_gmm_prim_upper_down(gmm_prim);
+       if (rc < 0)
+               LOGP(DMM, LOGL_ERROR, "Failed submitting GMMREG-DETACH.req\n");
+       return rc;
+}
diff --git a/src/host/layer23/src/modem/sm.c b/src/host/layer23/src/modem/sm.c
index 01d5a42..575321f 100644
--- a/src/host/layer23/src/modem/sm.c
+++ b/src/host/layer23/src/modem/sm.c
@@ -216,3 +216,48 @@

        return rc;
 }
+
+int modem_sm_smreg_pdp_act_req(const struct osmocom_ms *ms, const struct 
osmobb_apn *apn)
+{
+       struct osmo_gprs_sm_prim *sm_prim;
+       const struct gsm_subscriber *subscr = &ms->subscr;
+       enum osmo_gprs_sm_pdp_addr_ietf_type pdp_addr_ietf_type;
+       uint8_t nsapi = 6;
+       enum osmo_gprs_sm_llc_sapi llc_sapi = OSMO_GPRS_SM_LLC_SAPI_SAPI3;
+       struct osmo_sockaddr pdp_addr_any = {0};
+       uint8_t qos[OSMO_GPRS_SM_QOS_MAXLEN] = {0};
+       uint8_t pco[OSMO_GPRS_SM_QOS_MAXLEN] = {0};
+       int rc;
+
+       if (apn->cfg.apn_type_mask & APN_TYPE_IPv4v6) {
+               pdp_addr_ietf_type = OSMO_GPRS_SM_PDP_ADDR_IETF_IPV4V6;
+       } else if (apn->cfg.apn_type_mask & APN_TYPE_IPv4) {
+               pdp_addr_ietf_type = OSMO_GPRS_SM_PDP_ADDR_IETF_IPV4;
+       } else if (apn->cfg.apn_type_mask & APN_TYPE_IPv6) {
+               pdp_addr_ietf_type = OSMO_GPRS_SM_PDP_ADDR_IETF_IPV6;
+       } else {
+               LOGP(DSM, LOGL_ERROR, "APN '%s' has no PDP address type set\n", 
apn->cfg.name);
+               return -EINVAL;
+       }
+
+       sm_prim = osmo_gprs_sm_prim_alloc_smreg_pdp_act_req();
+       sm_prim->smreg.pdp_act_req.nsapi = nsapi;
+       sm_prim->smreg.pdp_act_req.llc_sapi = llc_sapi;
+       sm_prim->smreg.pdp_act_req.pdp_addr_ietf_type = pdp_addr_ietf_type;
+       sm_prim->smreg.pdp_act_req.pdp_addr_v4 = pdp_addr_any;
+       sm_prim->smreg.pdp_act_req.pdp_addr_v6 = pdp_addr_any;
+       memcpy(sm_prim->smreg.pdp_act_req.qos, qos, sizeof(qos));
+       sm_prim->smreg.pdp_act_req.qos_len = 1;
+       memcpy(sm_prim->smreg.pdp_act_req.pco, pco, sizeof(pco));
+       sm_prim->smreg.pdp_act_req.pco_len = 1;
+       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.apn, apn->cfg.name);
+       sm_prim->smreg.pdp_act_req.gmm.ptmsi = subscr->tmsi;
+       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.gmm.imsi, subscr->imsi);
+       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.gmm.imei, 
ms->settings.imei);
+       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.gmm.imeisv, 
ms->settings.imeisv);
+
+       rc = osmo_gprs_sm_prim_upper_down(sm_prim);
+       if (rc < 0)
+               LOGP(DSM, LOGL_ERROR, "Failed submitting 
SMREG-PDP_ACT_REQ.req\n");
+       return rc;
+}
diff --git a/src/host/layer23/src/modem/vty.c b/src/host/layer23/src/modem/vty.c
index a23ae73..33891d4 100644
--- a/src/host/layer23/src/modem/vty.c
+++ b/src/host/layer23/src/modem/vty.c
@@ -36,7 +36,9 @@
 #include <osmocom/bb/common/vty.h>
 #include <osmocom/bb/common/apn.h>
 #include <osmocom/bb/common/ms.h>
+#include <osmocom/bb/modem/gmm.h>
 #include <osmocom/bb/modem/grr.h>
+#include <osmocom/bb/modem/sm.h>
 #include <osmocom/bb/modem/vty.h>

 static struct cmd_node apn_node = {
@@ -163,25 +165,14 @@
             TEST_CMD_DESC MS_NAME_DESC GMM_CMDG_DESC
             "Enqueue a GMM GMMREG-ATTACH.req for transmission\n")
 {
-       struct osmo_gprs_gmm_prim *gmm_prim;
-       const uint32_t tlli = 0xe1c5d364;
-       const char *imsi = "1234567890";
-       const char *imei = "42342342342342";
-       const char *imeisv = "4234234234234275";
        struct osmocom_ms *ms;

-       if ((ms = l23_vty_get_ms(argv[0], vty)) == NULL)
+       if ((ms = l23_vty_get_ms(argv[0], vty)) == NULL) {
+               vty_out(vty, "Failed to find ms '%s'%s", argv[0], VTY_NEWLINE);
                return CMD_WARNING;
+       }

-       gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_attach_req();
-       gmm_prim->gmmreg.attach_req.attach_type = 
OSMO_GPRS_GMM_ATTACH_TYPE_GPRS;
-       gmm_prim->gmmreg.attach_req.ptmsi = tlli;
-       OSMO_STRLCPY_ARRAY(gmm_prim->gmmreg.attach_req.imsi, imsi);
-       OSMO_STRLCPY_ARRAY(gmm_prim->gmmreg.attach_req.imei, imei);
-       OSMO_STRLCPY_ARRAY(gmm_prim->gmmreg.attach_req.imeisv, imeisv);
-
-
-       if (osmo_gprs_gmm_prim_upper_down(gmm_prim) != 0) {
+       if (modem_gmm_gmmreg_attach_req(ms) < 0) {
                vty_out(vty, "Failed to enqueue a GMM PDU%s", VTY_NEWLINE);
                return CMD_WARNING;
        }
@@ -195,19 +186,14 @@
             TEST_CMD_DESC MS_NAME_DESC GMM_CMDG_DESC
             "Enqueue a GMM GMMREG-DETACH.req for transmission\n")
 {
-       struct osmo_gprs_gmm_prim *gmm_prim;
-       const uint32_t tlli = 0xe1c5d364;
        struct osmocom_ms *ms;

-       if ((ms = l23_vty_get_ms(argv[0], vty)) == NULL)
+       if ((ms = l23_vty_get_ms(argv[0], vty)) == NULL) {
+               vty_out(vty, "Failed to find ms '%s'%s", argv[0], VTY_NEWLINE);
                return CMD_WARNING;
+       }

-       gmm_prim = osmo_gprs_gmm_prim_alloc_gmmreg_detach_req();
-       gmm_prim->gmmreg.detach_req.ptmsi = tlli;
-       gmm_prim->gmmreg.detach_req.detach_type = 
OSMO_GPRS_GMM_DETACH_MS_TYPE_GPRS;
-       gmm_prim->gmmreg.detach_req.poweroff_type = 
OSMO_GPRS_GMM_DETACH_POWEROFF_TYPE_NORMAL;
-
-       if (osmo_gprs_gmm_prim_upper_down(gmm_prim) != 0) {
+       if (modem_gmm_gmmreg_detach_req(ms) < 0) {
                vty_out(vty, "Failed to enqueue a GMM PDU%s", VTY_NEWLINE);
                return CMD_WARNING;
        }
@@ -222,21 +208,9 @@
             "Enqueue a SM SMREG-ACTIVATE.req for transmission\n"
             "APN to activate\n")
 {
-       struct osmo_gprs_sm_prim *sm_prim;
        struct osmocom_ms *ms;
        struct osmobb_apn *apn;

-       uint8_t nsapi = 6;
-       enum osmo_gprs_sm_llc_sapi llc_sapi = OSMO_GPRS_SM_LLC_SAPI_SAPI3;
-       struct osmo_sockaddr pdp_addr_any = {0};
-       uint8_t qos[OSMO_GPRS_SM_QOS_MAXLEN] = {0};
-       uint8_t pco[OSMO_GPRS_SM_QOS_MAXLEN] = {0};
-       uint32_t ptmsi = 0x00000000;
-       char *imsi = "1234567890";
-       char *imei = "42342342342342";
-       char *imeisv = "4234234234234275";
-       enum osmo_gprs_sm_pdp_addr_ietf_type pdp_addr_ietf_type;
-
        if ((ms = l23_vty_get_ms(argv[0], vty)) == NULL) {
                vty_out(vty, "Unable to find MS '%s'%s", argv[0], VTY_NEWLINE);
                return CMD_WARNING;
@@ -248,35 +222,8 @@
                return CMD_WARNING;
        }

-       if (apn->cfg.apn_type_mask & APN_TYPE_IPv4v6) {
-               pdp_addr_ietf_type = OSMO_GPRS_SM_PDP_ADDR_IETF_IPV4V6;
-       } else if (apn->cfg.apn_type_mask & APN_TYPE_IPv4) {
-               pdp_addr_ietf_type = OSMO_GPRS_SM_PDP_ADDR_IETF_IPV4;
-       } else if (apn->cfg.apn_type_mask & APN_TYPE_IPv6) {
-               pdp_addr_ietf_type = OSMO_GPRS_SM_PDP_ADDR_IETF_IPV6;
-       } else {
-               vty_out(vty, "APN '%s' has no PDP address type set%s", argv[1], 
VTY_NEWLINE);
-               return CMD_WARNING;
-       }
-
-       sm_prim = osmo_gprs_sm_prim_alloc_smreg_pdp_act_req();
-       sm_prim->smreg.pdp_act_req.nsapi = nsapi;
-       sm_prim->smreg.pdp_act_req.llc_sapi = llc_sapi;
-       sm_prim->smreg.pdp_act_req.pdp_addr_ietf_type = pdp_addr_ietf_type;
-       sm_prim->smreg.pdp_act_req.pdp_addr_v4 = pdp_addr_any;
-       sm_prim->smreg.pdp_act_req.pdp_addr_v6 = pdp_addr_any;
-       memcpy(sm_prim->smreg.pdp_act_req.qos, qos, sizeof(qos));
-       sm_prim->smreg.pdp_act_req.qos_len = 1;
-       memcpy(sm_prim->smreg.pdp_act_req.pco, pco, sizeof(pco));
-       sm_prim->smreg.pdp_act_req.pco_len = 1;
-       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.apn, apn->cfg.name);
-       sm_prim->smreg.pdp_act_req.gmm.ptmsi = ptmsi;
-       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.gmm.imsi, imsi);
-       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.gmm.imei, imei);
-       OSMO_STRLCPY_ARRAY(sm_prim->smreg.pdp_act_req.gmm.imeisv, imeisv);
-
-       if (osmo_gprs_sm_prim_upper_down(sm_prim) != 0) {
-               vty_out(vty, "Failed to enqueue a SM PDU%s", VTY_NEWLINE);
+       if (modem_sm_smreg_pdp_act_req(ms, apn) < 0) {
+               vty_out(vty, "Failed submitting SM PDP Act Req%s", VTY_NEWLINE);
                return CMD_WARNING;
        }


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

Gerrit-Project: osmocom-bb
Gerrit-Branch: master
Gerrit-Change-Id: I1c7cc120ff4098c0b845e13a6e5e5db8b7e18376
Gerrit-Change-Number: 32442
Gerrit-PatchSet: 8
Gerrit-Owner: pespin <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <[email protected]>
Gerrit-Reviewer: osmith <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to