layer23: Use subscriber information and events to trigger GMMREG Attach
Change-Id: I1c7cc120ff4098c0b845e13a6e5e5db8b7e18376
This commit is contained in:
parent
c58b5f0dbc
commit
6be26a97bf
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 @@ 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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue