diff options
Diffstat (limited to 'src/host')
-rw-r--r-- | src/host/layer23/include/osmocom/bb/mobile/gsm48_mm.h | 4 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/app_mobile.c | 5 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/gsm322.c | 41 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/gsm48_mm.c | 41 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/gsm48_rr.c | 6 | ||||
-rw-r--r-- | src/host/layer23/src/mobile/subscriber.c | 31 |
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); } |