aboutsummaryrefslogtreecommitdiffstats
path: root/src/libvlr
diff options
context:
space:
mode:
Diffstat (limited to 'src/libvlr')
-rw-r--r--src/libvlr/vlr.c45
-rw-r--r--src/libvlr/vlr_access_req_fsm.c12
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) */