summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h4
-rw-r--r--src/host/layer23/src/mobile/app_mobile.c5
-rw-r--r--src/host/layer23/src/mobile/gsm322.c41
-rw-r--r--src/host/layer23/src/mobile/gsm48_mm.c41
-rw-r--r--src/host/layer23/src/mobile/gsm48_rr.c6
-rw-r--r--src/host/layer23/src/mobile/subscriber.c31
6 files changed, 41 insertions, 87 deletions
diff --git a/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h b/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h
index 447dc95f..c141d5c0 100644
--- a/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h
+++ b/src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h
@@ -210,8 +210,8 @@ struct gsm48_mm_conn {
int gsm48_mm_init(struct osmocom_ms *ms);
int gsm48_mm_exit(struct osmocom_ms *ms);
struct msgb *gsm48_mmr_msgb_alloc(int msg_type);
-struct msgb *gsm48_mmevent_msgb_alloc(int msg_type);
-int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg);
+int gsm48_mmevent_input(struct osmocom_ms *ms, int msg_type,
+ const uint8_t *data, unsigned int len);
int gsm48_mmr_downmsg(struct osmocom_ms *ms, struct msgb *msg);
int gsm48_rr_dequeue(struct osmocom_ms *ms);
int gsm48_mmxx_dequeue(struct osmocom_ms *ms);
diff --git a/src/host/layer23/src/mobile/app_mobile.c b/src/host/layer23/src/mobile/app_mobile.c
index b3c32847..4e6a803f 100644
--- a/src/host/layer23/src/mobile/app_mobile.c
+++ b/src/host/layer23/src/mobile/app_mobile.c
@@ -124,10 +124,7 @@ int mobile_exit(struct osmocom_ms *ms, int force)
struct msgb *nmsg;
ms->shutdown = 1; /* going down */
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_IMSI_DETACH);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(mm->ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_IMSI_DETACH, NULL, 0);
return -EBUSY;
}
diff --git a/src/host/layer23/src/mobile/gsm322.c b/src/host/layer23/src/mobile/gsm322.c
index 3243afc3..60b24cb3 100644
--- a/src/host/layer23/src/mobile/gsm322.c
+++ b/src/host/layer23/src/mobile/gsm322.c
@@ -1174,17 +1174,12 @@ static int gsm322_a_hplmn_search_start(struct osmocom_ms *ms, struct msgb *msg)
/* manual mode selected */
static int gsm322_a_sel_manual(struct osmocom_ms *ms, struct msgb *msg)
{
- struct msgb *nmsg;
-
/* restart state machine */
gsm322_a_switch_off(ms, msg);
ms->settings.plmn_mode = PLMN_MODE_MANUAL;
gsm322_m_switch_on(ms, msg);
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_USER_PLMN_SEL);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_USER_PLMN_SEL, NULL, 0);
return 0;
}
@@ -1461,17 +1456,12 @@ static int gsm322_m_choose_plmn(struct osmocom_ms *ms, struct msgb *msg)
/* auto mode selected */
static int gsm322_m_sel_auto(struct osmocom_ms *ms, struct msgb *msg)
{
- struct msgb *nmsg;
-
/* restart state machine */
gsm322_m_switch_off(ms, msg);
ms->settings.plmn_mode = PLMN_MODE_AUTO;
gsm322_a_switch_on(ms, msg);
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_USER_PLMN_SEL);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_USER_PLMN_SEL, NULL, 0);
return 0;
}
@@ -2684,14 +2674,8 @@ static int gsm322_c_any_cell_sel(struct osmocom_ms *ms, struct msgb *msg)
/* after re-selection, indicate no cell found */
if (cs->state == GSM322_C6_ANY_CELL_SEL
|| cs->state == GSM322_C8_ANY_CELL_RESEL) {
- struct msgb *nmsg;
-
/* tell that we have no cell found */
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_NO_CELL_FOUND);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
-
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_NO_CELL_FOUND, NULL, 0);
} else {
new_c_state(cs, GSM322_C6_ANY_CELL_SEL);
}
@@ -2737,7 +2721,6 @@ static int gsm322_c_any_cell_resel(struct osmocom_ms *ms, struct msgb *msg)
static int gsm322_c_camp_normally(struct osmocom_ms *ms, struct msgb *msg)
{
struct gsm322_cellsel *cs = &ms->cellsel;
- struct msgb *nmsg;
LOGP(DSUM, LOGL_INFO, "Camping normally on cell (arfcn=%d mcc=%s "
"mnc=%s %s, %s)\n", cs->sel_arfcn, gsm_print_mcc(cs->sel_mcc),
@@ -2745,10 +2728,7 @@ static int gsm322_c_camp_normally(struct osmocom_ms *ms, struct msgb *msg)
gsm_get_mnc(cs->sel_mcc, cs->sel_mnc));
/* tell that we have selected a (new) cell */
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_CELL_SELECTED);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_CELL_SELECTED, NULL, 0);
new_c_state(cs, GSM322_C3_CAMPED_NORMALLY);
@@ -2759,7 +2739,6 @@ static int gsm322_c_camp_normally(struct osmocom_ms *ms, struct msgb *msg)
static int gsm322_c_camp_any_cell(struct osmocom_ms *ms, struct msgb *msg)
{
struct gsm322_cellsel *cs = &ms->cellsel;
- struct msgb *nmsg;
LOGP(DSUM, LOGL_INFO, "Camping on any cell (arfcn=%d mcc=%s "
"mnc=%s %s, %s)\n", cs->sel_arfcn, gsm_print_mcc(cs->sel_mcc),
@@ -2768,10 +2747,7 @@ static int gsm322_c_camp_any_cell(struct osmocom_ms *ms, struct msgb *msg)
/* tell that we have selected a (new) cell */
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_CELL_SELECTED);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_CELL_SELECTED, NULL, 0);
new_c_state(cs, GSM322_C7_CAMPED_ANY_CELL);
@@ -2878,8 +2854,6 @@ static int gsm322_c_choose_cell(struct osmocom_ms *ms, struct msgb *msg)
/* After location updating, we choose the last cell */
if (gm->same_cell) {
- struct msgb *nmsg;
-
if (!cs->selected) {
printf("No cell selected when ret.idle, please fix!\n");
exit(0L);
@@ -2896,10 +2870,7 @@ static int gsm322_c_choose_cell(struct osmocom_ms *ms, struct msgb *msg)
new_c_state(cs, GSM322_C3_CAMPED_NORMALLY);
/* tell that we have selected the cell, so RR returns IDLE */
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_CELL_SELECTED);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_CELL_SELECTED, NULL, 0);
return 0;
}
diff --git a/src/host/layer23/src/mobile/gsm48_mm.c b/src/host/layer23/src/mobile/gsm48_mm.c
index 4652f34e..6400373d 100644
--- a/src/host/layer23/src/mobile/gsm48_mm.c
+++ b/src/host/layer23/src/mobile/gsm48_mm.c
@@ -658,7 +658,7 @@ struct msgb *gsm48_mmxx_msgb_alloc(int msg_type, uint32_t ref,
}
/* allocate MM event message */
-struct msgb *gsm48_mmevent_msgb_alloc(int msg_type)
+static struct msgb *gsm48_mmevent_msgb_alloc(int msg_type)
{
struct msgb *msg;
struct gsm48_mm_event *mme;
@@ -710,7 +710,7 @@ int gsm48_mmr_downmsg(struct osmocom_ms *ms, struct msgb *msg)
}
/* queue MM event message */
-int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg)
+static int gsm48_mmevent_msg(struct osmocom_ms *ms, struct msgb *msg)
{
struct gsm48_mmlayer *mm = &ms->mmlayer;
@@ -905,14 +905,10 @@ static void new_mm_state(struct gsm48_mmlayer *mm, int state, int substate)
/* resend detach event, if flag is set */
if (state == GSM48_MM_ST_MM_IDLE && mm->delay_detach) {
- struct msgb *nmsg;
-
mm->delay_detach = 0;
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_IMSI_DETACH);
- if (!nmsg)
- return;
- gsm48_mmevent_msg(mm->ms, nmsg);
+ gsm48_mmevent_input(mm->ms, GSM48_MM_EVENT_IMSI_DETACH,
+ NULL, 0);
}
/* 4.4.2 start T3212 in MM IDLE mode if not started or has expired */
@@ -2431,7 +2427,8 @@ static int gsm48_mm_rel_loc_upd_rej(struct osmocom_ms *ms, struct msgb *msg)
}
memset(&ngm, 0, sizeof(ngm));
ngm.reject = mm->lupd_rej_cause;
- gsm322_event_input(ms, GSM322_EVT_PLMN, msg_type, &ngm, sizeof(ngm));
+ gsm322_event_input(ms, GSM322_EVT_PLMN, msg_type,
+ (uint8_t *)&ngm, sizeof(ngm));
/* forbidden list */
switch (mm->lupd_rej_cause) {
@@ -4088,13 +4085,7 @@ static int gsm48_mmr_reg_req(struct osmocom_ms *ms)
/* trigger detach of sim card */
static int gsm48_mmr_nreg_req(struct osmocom_ms *ms)
{
- struct gsm48_mmlayer *mm = &ms->mmlayer;
- struct msgb *nmsg;
-
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_IMSI_DETACH);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(mm->ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_IMSI_DETACH, NULL, 0);
return 0;
}
@@ -4121,4 +4112,22 @@ static int gsm48_rcv_mmr(struct osmocom_ms *ms, struct msgb *msg)
return rc;
}
+int gsm48_mmevent_input(struct osmocom_ms *ms, int msg_type,
+ const uint8_t *data, unsigned int len)
+{
+ struct msgb *nmsg = gsm48_mmevent_msgb_alloc(msg_type);
+ int rc;
+
+ if (!nmsg)
+ return -ENOMEM;
+ if (data && len) {
+ uint8_t *cur = msgb_push(nmsg, len);
+ if (!cur) {
+ msgb_free(nmsg);
+ return -EIO;
+ }
+ memcpy(cur, data, len);
+ }
+ return gsm48_mmevent_msg(ms, nmsg);
+}
diff --git a/src/host/layer23/src/mobile/gsm48_rr.c b/src/host/layer23/src/mobile/gsm48_rr.c
index 177b2722..afb53cba 100644
--- a/src/host/layer23/src/mobile/gsm48_rr.c
+++ b/src/host/layer23/src/mobile/gsm48_rr.c
@@ -1560,7 +1560,6 @@ fail:
static int gsm48_new_sysinfo(struct osmocom_ms *ms, uint8_t type)
{
struct gsm48_sysinfo *s = ms->cellsel.si;
- struct msgb *nmsg;
struct gsm322_msg em;
/* update list of measurements, if BA(SACCH) is complete and new */
@@ -1600,10 +1599,7 @@ static int gsm48_new_sysinfo(struct osmocom_ms *ms, uint8_t type)
(uint8_t *)&em, sizeof(em));
/* send timer info to location update process */
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_SYSINFO);
- if (!nmsg)
- return -ENOMEM;
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_SYSINFO, NULL, 0);
return 0;
}
diff --git a/src/host/layer23/src/mobile/subscriber.c b/src/host/layer23/src/mobile/subscriber.c
index 3ba78f3f..24d7f948 100644
--- a/src/host/layer23/src/mobile/subscriber.c
+++ b/src/host/layer23/src/mobile/subscriber.c
@@ -855,25 +855,16 @@ int gsm_subscr_generate_kc(struct osmocom_ms *ms, uint8_t key_seq,
if ((subscr->sim_type != GSM_SIM_TYPE_READER
&& subscr->sim_type != GSM_SIM_TYPE_TEST)
|| !subscr->sim_valid || no_sim) {
- struct gsm48_mm_event *nmme;
+ uint8_t dummy_sres[4] = { 0x12, 0x34, 0x56, 0x78 };
LOGP(DMM, LOGL_INFO, "Sending dummy authentication response\n");
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE);
- if (!nmsg)
- return -ENOMEM;
- nmme = (struct gsm48_mm_event *) nmsg->data;
- nmme->sres[0] = 0x12;
- nmme->sres[1] = 0x34;
- nmme->sres[2] = 0x56;
- nmme->sres[3] = 0x78;
- gsm48_mmevent_msg(ms, nmsg);
-
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_AUTH_RESPONSE,
+ dummy_sres, sizeof(dummy_sres));
return 0;
}
/* test SIM */
if (subscr->sim_type == GSM_SIM_TYPE_TEST) {
- struct gsm48_mm_event *nmme;
uint8_t sres[4];
struct gsm_settings *set = &ms->settings;
@@ -885,12 +876,8 @@ int gsm_subscr_generate_kc(struct osmocom_ms *ms, uint8_t key_seq,
subscr->key_seq = key_seq;
LOGP(DMM, LOGL_INFO, "Sending authentication response\n");
- nmsg = gsm48_mmevent_msgb_alloc(GSM48_MM_EVENT_AUTH_RESPONSE);
- if (!nmsg)
- return -ENOMEM;
- nmme = (struct gsm48_mm_event *) nmsg->data;
- memcpy(nmme->sres, sres, 4);
- gsm48_mmevent_msg(ms, nmsg);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_AUTH_RESPONSE,
+ sres, sizeof(sres));
return 0;
}
@@ -924,7 +911,6 @@ static void subscr_sim_key_cb(struct osmocom_ms *ms, struct msgb *msg)
uint16_t payload_len = msg->len - sizeof(*sh);
struct msgb *nmsg;
struct sim_hdr *nsh;
- struct gsm48_mm_event *nmme;
uint8_t *data;
/* error handling */
@@ -961,12 +947,7 @@ static void subscr_sim_key_cb(struct osmocom_ms *ms, struct msgb *msg)
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);
+ gsm48_mmevent_input(ms, GSM48_MM_EVENT_AUTH_RESPONSE, payload, 4);
msgb_free(msg);
}