pespin has uploaded this change for review. (
https://gerrit.osmocom.org/c/osmocom-bb/+/32442 )
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/src/modem/app_modem.c
M src/host/layer23/src/modem/gmm.c
M src/host/layer23/src/modem/vty.c
4 files changed, 111 insertions(+), 24 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/42/32442/1
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/src/modem/app_modem.c
b/src/host/layer23/src/modem/app_modem.c
index c24a6e6..a493a4f 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,28 @@
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.
+ */
+ }
+
ms->started = true;
return l1ctl_tx_fbsb_req(ms, ms->test_arfcn,
L1CTL_FBSB_F_FB01SB, 100, 0,
@@ -154,6 +207,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 +252,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/vty.c b/src/host/layer23/src/modem/vty.c
index a23ae73..c689806 100644
--- a/src/host/layer23/src/modem/vty.c
+++ b/src/host/layer23/src/modem/vty.c
@@ -36,6 +36,7 @@
#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/vty.h>
@@ -163,25 +164,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 +185,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;
}
--
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: 1
Gerrit-Owner: pespin <pespin(a)sysmocom.de>
Gerrit-MessageType: newchange