From 6be26a97bfda465ced599c705e47d2f748e3bce9 Mon Sep 17 00:00:00 2001 From: Pau Espin Pedrol Date: Tue, 25 Apr 2023 13:34:14 +0200 Subject: layer23: Use subscriber information and events to trigger GMMREG Attach Change-Id: I1c7cc120ff4098c0b845e13a6e5e5db8b7e18376 --- src/host/layer23/src/modem/app_modem.c | 56 +++++++++++++++++++++++++ src/host/layer23/src/modem/gmm.c | 35 ++++++++++++++++ src/host/layer23/src/modem/sm.c | 45 ++++++++++++++++++++ src/host/layer23/src/modem/vty.c | 77 ++++++---------------------------- 4 files changed, 148 insertions(+), 65 deletions(-) (limited to 'src/host/layer23/src') diff --git a/src/host/layer23/src/modem/app_modem.c b/src/host/layer23/src/modem/app_modem.c index 12ac4aeb..d80fe915 100644 --- a/src/host/layer23/src/modem/app_modem.c +++ b/src/host/layer23/src/modem/app_modem.c @@ -114,10 +114,41 @@ void layer3_app_reset(void) 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 @@ static int global_signal_cb(unsigned int subsys, unsigned int signal, 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 @@ static int _modem_start(void) /* 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 @@ int l23_app_init(void) } 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 9472e32e..650bd2f7 100644 --- a/src/host/layer23/src/modem/gmm.c +++ b/src/host/layer23/src/modem/gmm.c @@ -124,3 +124,38 @@ int modem_gmm_init(struct osmocom_ms *ms) 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 01d5a42d..575321f3 100644 --- a/src/host/layer23/src/modem/sm.c +++ b/src/host/layer23/src/modem/sm.c @@ -216,3 +216,48 @@ int modem_sm_init(struct osmocom_ms *ms) 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 a23ae731..33891d46 100644 --- a/src/host/layer23/src/modem/vty.c +++ b/src/host/layer23/src/modem/vty.c @@ -36,7 +36,9 @@ #include #include #include +#include #include +#include #include static struct cmd_node apn_node = { @@ -163,25 +165,14 @@ DEFUN_HIDDEN(test_gmm_reg_attach, 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 @@ DEFUN_HIDDEN(test_gmm_reg_detach, 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 @@ DEFUN_HIDDEN(test_sm_act_pdp_ctx, "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 @@ DEFUN_HIDDEN(test_sm_act_pdp_ctx, 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; } -- cgit v1.2.3