diff options
Diffstat (limited to 'src/libvlr')
-rw-r--r-- | src/libvlr/vlr.c | 45 | ||||
-rw-r--r-- | src/libvlr/vlr_access_req_fsm.c | 12 |
2 files changed, 19 insertions, 38 deletions
diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c index 019e6577e..3a44d3090 100644 --- a/src/libvlr/vlr.c +++ b/src/libvlr/vlr.c @@ -1117,64 +1117,49 @@ int vlr_gsup_rx(struct gsup_client_mux *gcm, void *data, const struct osmo_gsup_ } /* MSC->VLR: Subscriber has provided IDENTITY RESPONSE */ -int vlr_subscr_rx_id_resp(struct vlr_subscr *vsub, - const uint8_t *mi, size_t mi_len) +int vlr_subscr_rx_id_resp(struct vlr_subscr *vsub, const struct osmo_mobile_identity *mi) { - char mi_string[GSM48_MI_SIZE]; - uint8_t mi_type = mi[0] & GSM_MI_TYPE_MASK; - - gsm48_mi_to_string(mi_string, sizeof(mi_string), mi, mi_len); - /* update the vlr_subscr with the given identity */ - switch (mi_type) { + switch (mi->type) { case GSM_MI_TYPE_IMSI: - if (strlen(mi_string) >= sizeof(vsub->imsi)) { - LOGVSUBP(LOGL_ERROR, vsub, "IMSI in ID RESP too long (>%zu bytes): %s\n", - sizeof(vsub->imsi) - 1, mi_string); - return -ENOSPC; /* ignore message; do not avance LU FSM */ - } else if (vsub->imsi[0] - && !vlr_subscr_matches_imsi(vsub, mi_string)) { + if (vsub->imsi[0] + && !vlr_subscr_matches_imsi(vsub, mi->imsi)) { LOGVSUBP(LOGL_ERROR, vsub, "IMSI in ID RESP differs:" - " %s\n", mi_string); + " %s\n", mi->imsi); /* XXX Should we return an error, e.g. -EINVAL ? */ } else - vlr_subscr_set_imsi(vsub, mi_string); + vlr_subscr_set_imsi(vsub, mi->imsi); break; case GSM_MI_TYPE_IMEI: - vlr_subscr_set_imei(vsub, mi_string); + vlr_subscr_set_imei(vsub, mi->imei); break; case GSM_MI_TYPE_IMEISV: - vlr_subscr_set_imeisv(vsub, mi_string); + vlr_subscr_set_imeisv(vsub, mi->imeisv); break; default: return -EINVAL; } if (vsub->auth_fsm) { - switch (mi_type) { + switch (mi->type) { case GSM_MI_TYPE_IMSI: - osmo_fsm_inst_dispatch(vsub->auth_fsm, - VLR_AUTH_E_MS_ID_IMSI, mi_string); + return osmo_fsm_inst_dispatch(vsub->auth_fsm, + VLR_AUTH_E_MS_ID_IMSI, (void*)mi->imsi); break; } } if (vsub->lu_fsm) { - uint32_t event = 0; - switch (mi_type) { + switch (mi->type) { case GSM_MI_TYPE_IMSI: - event = VLR_ULA_E_ID_IMSI; - break; + return osmo_fsm_inst_dispatch(vsub->lu_fsm, VLR_ULA_E_ID_IMSI, (void*)mi->imsi); case GSM_MI_TYPE_IMEI: - event = VLR_ULA_E_ID_IMEI; - break; + return osmo_fsm_inst_dispatch(vsub->lu_fsm, VLR_ULA_E_ID_IMEI, (void*)mi->imei); case GSM_MI_TYPE_IMEISV: - event = VLR_ULA_E_ID_IMEISV; - break; + return osmo_fsm_inst_dispatch(vsub->lu_fsm, VLR_ULA_E_ID_IMEISV, (void*)mi->imeisv); default: return -EINVAL; } - osmo_fsm_inst_dispatch(vsub->lu_fsm, event, mi_string); } return 0; diff --git a/src/libvlr/vlr_access_req_fsm.c b/src/libvlr/vlr_access_req_fsm.c index 73f895505..73f343570 100644 --- a/src/libvlr/vlr_access_req_fsm.c +++ b/src/libvlr/vlr_access_req_fsm.c @@ -632,7 +632,7 @@ vlr_proc_acc_req(struct osmo_fsm_inst *parent, void *parent_event_data, struct vlr_instance *vlr, void *msc_conn_ref, enum vlr_parq_type type, enum osmo_cm_service_type cm_service_type, - const uint8_t *mi_lv, + const struct osmo_mobile_identity *mi, const struct osmo_location_area_id *lai, bool authentication_required, bool ciphering_required, @@ -641,8 +641,6 @@ vlr_proc_acc_req(struct osmo_fsm_inst *parent, { struct osmo_fsm_inst *fi; struct proc_arq_priv *par; - char mi_string[GSM48_MI_SIZE]; - uint8_t mi_type; fi = osmo_fsm_inst_alloc_child(&proc_arq_vlr_fsm, parent, parent_event_failure); @@ -678,16 +676,14 @@ vlr_proc_acc_req(struct osmo_fsm_inst *parent, LOGPFSML(fi, LOGL_ERROR, "Authentication off on UTRAN network. Good luck.\n"); - gsm48_mi_to_string(mi_string, sizeof(mi_string), mi_lv+1, mi_lv[0]); - mi_type = mi_lv[1] & GSM_MI_TYPE_MASK; - switch (mi_type) { + switch (mi->type) { case GSM_MI_TYPE_IMSI: - osmo_strlcpy(par->imsi, mi_string, sizeof(par->imsi)); + OSMO_STRLCPY_ARRAY(par->imsi, mi->imsi); par->by_tmsi = false; break; case GSM_MI_TYPE_TMSI: par->by_tmsi = true; - par->tmsi = osmo_load32be(mi_lv+2); + par->tmsi = mi->tmsi; break; case GSM_MI_TYPE_IMEI: /* TODO: IMEI (emergency call) */ |