aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libmsc/gsm_04_08.c14
-rw-r--r--src/libmsc/ran_conn.c42
-rw-r--r--src/libvlr/vlr.c36
3 files changed, 70 insertions, 22 deletions
diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c
index dc0476b55..9370c56cb 100644
--- a/src/libmsc/gsm_04_08.c
+++ b/src/libmsc/gsm_04_08.c
@@ -354,7 +354,8 @@ int mm_rx_loc_upd_req(struct ran_conn *conn, struct msgb *msg)
return -EINVAL;
}
- ran_conn_update_id(conn, COMPLETE_LAYER3_LU, mi_string);
+ conn->complete_layer3_type = COMPLETE_LAYER3_LU;
+ ran_conn_update_id(conn);
DEBUGP(DMM, "LOCATION UPDATING REQUEST: MI(%s)=%s type=%s\n",
gsm48_mi_type_name(mi_type), mi_string,
@@ -688,7 +689,7 @@ accept_reuse:
conn->received_cm_service_request = true;
ran_conn_get(conn, RAN_CONN_USE_CM_SERVICE);
}
- ran_conn_update_id(conn, conn->complete_layer3_type, mi_string);
+ ran_conn_update_id(conn);
return conn->network->vlr->ops.tx_cm_serv_acc(conn);
}
@@ -781,7 +782,8 @@ int gsm48_rx_mm_serv_req(struct ran_conn *conn, struct msgb *msg)
/* or should we accept and note down the service request anyway? */
}
- ran_conn_update_id(conn, COMPLETE_LAYER3_CM_SERVICE_REQ, mi_string);
+ conn->complete_layer3_type = COMPLETE_LAYER3_CM_SERVICE_REQ;
+ ran_conn_update_id(conn);
osmo_signal_dispatch(SS_SUBSCR, S_SUBSCR_IDENTITY, mi_p);
@@ -1183,7 +1185,8 @@ static int gsm48_rx_rr_pag_resp(struct ran_conn *conn, struct msgb *msg)
DEBUGP(DRR, "PAGING RESPONSE: MI(%s)=%s\n", gsm48_mi_type_name(mi_type), mi_string);
- ran_conn_update_id(conn, COMPLETE_LAYER3_PAGING_RESP, mi_string);
+ conn->complete_layer3_type = COMPLETE_LAYER3_PAGING_RESP;
+ ran_conn_update_id(conn);
is_utran = (conn->via_ran == RAN_UTRAN_IU);
vlr_proc_acc_req(conn->fi,
@@ -1745,6 +1748,7 @@ static void msc_vlr_subscr_update(struct vlr_subscr *subscr)
{
LOGVSUBP(LOGL_NOTICE, subscr, "VLR: update for IMSI=%s (MSISDN=%s, used=%d)\n",
subscr->imsi, subscr->msisdn, subscr->use_count);
+ ran_conn_update_id_for_vsub(subscr);
}
static void update_classmark(const struct gsm_classmark *src, struct gsm_classmark *dst)
@@ -1778,6 +1782,8 @@ static void msc_vlr_subscr_assoc(void *msc_conn_ref,
* associated with the conn: merge the new Classmark into vsub->classmark. Don't overwrite valid
* vsub->classmark with unset classmark, though. */
update_classmark(&conn->temporary_classmark, &conn->vsub->classmark);
+
+ ran_conn_update_id(conn);
}
static int msc_vlr_route_gsup_msg(struct vlr_subscr *vsub,
diff --git a/src/libmsc/ran_conn.c b/src/libmsc/ran_conn.c
index 9b63f16a0..eb54bbc7c 100644
--- a/src/libmsc/ran_conn.c
+++ b/src/libmsc/ran_conn.c
@@ -497,10 +497,10 @@ char *ran_conn_get_conn_id(struct ran_conn *conn)
switch (conn->via_ran) {
case RAN_GERAN_A:
- id = talloc_asprintf(conn, "GERAN_A-%08x", conn->a.conn_id);
+ id = talloc_asprintf(conn, "GERAN-A-%u", conn->a.conn_id);
break;
case RAN_UTRAN_IU:
- id = talloc_asprintf(conn, "UTRAN_IU-%08x", iu_get_conn_id(conn->iu.ue_ctx));
+ id = talloc_asprintf(conn, "UTRAN-Iu-%u", iu_get_conn_id(conn->iu.ue_ctx));
break;
default:
LOGP(DMM, LOGL_ERROR, "RAN of conn %p unknown!\n", conn);
@@ -672,12 +672,40 @@ const struct value_string complete_layer3_type_names[] = {
{ 0, NULL }
};
-void ran_conn_update_id(struct ran_conn *conn,
- enum complete_layer3_type from, const char *id)
+void ran_conn_update_id(struct ran_conn *conn)
{
- conn->complete_layer3_type = from;
- osmo_fsm_inst_update_id_f(conn->fi, "%s:%s", complete_layer3_type_name(from), id);
- LOGPFSML(conn->fi, LOGL_DEBUG, "Updated ID\n");
+ struct vlr_subscr *vsub = conn->vsub;
+
+ osmo_fsm_inst_update_id_f(conn->fi, "%s_%s_%s",
+ ran_conn_get_conn_id(conn), vlr_subscr_name(conn->vsub),
+ complete_layer3_type_name(conn->complete_layer3_type));
+
+ if (vsub) {
+ if (vsub->lu_fsm)
+ osmo_fsm_inst_update_id(vsub->lu_fsm, conn->fi->id);
+ if (vsub->auth_fsm)
+ osmo_fsm_inst_update_id(vsub->auth_fsm, conn->fi->id);
+ if (vsub->proc_arq_fsm)
+ osmo_fsm_inst_update_id(vsub->proc_arq_fsm, conn->fi->id);
+ }
+
+ LOGPFSML(conn->fi, LOGL_DEBUG, "Updated ID\n");
+}
+
+void ran_conn_update_id_for_vsub(struct vlr_subscr *for_vsub)
+{
+ struct gsm_network *network;
+ struct ran_conn *conn;
+ if (!for_vsub)
+ return;
+
+ network = for_vsub->vlr->user_ctx;
+ OSMO_ASSERT(network);
+
+ llist_for_each_entry(conn, &network->ran_conns, entry) {
+ if (conn->vsub == for_vsub)
+ ran_conn_update_id(conn);
+ }
}
static void rx_close_complete(struct ran_conn *conn, const char *label, bool *flag)
diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c
index 7de78bf19..d95140ada 100644
--- a/src/libvlr/vlr.c
+++ b/src/libvlr/vlr.c
@@ -81,20 +81,34 @@ uint32_t vlr_timer(struct vlr_instance *vlr, uint32_t timer)
/* return static buffer with printable name of VLR subscriber */
const char *vlr_subscr_name(struct vlr_subscr *vsub)
{
- static char buf[32];
+ static char buf[128];
+ char imsi[23] = "";
+ char msisdn[25] = "";
+ char tmsi[23] = "";
+ char tmsi_new[23] = "";
+ bool present = false;
if (!vsub)
return "unknown";
- if (vsub->msisdn[0])
- snprintf(buf, sizeof(buf), "MSISDN:%s", vsub->msisdn);
- else if (vsub->imsi[0])
- snprintf(buf, sizeof(buf), "IMSI:%s", vsub->imsi);
- else if (vsub->tmsi != GSM_RESERVED_TMSI)
- snprintf(buf, sizeof(buf), "TMSI:0x%08x", vsub->tmsi);
- else if (vsub->tmsi_new != GSM_RESERVED_TMSI)
- snprintf(buf, sizeof(buf), "TMSI(new):0x%08x", vsub->tmsi_new);
- else
+ if (vsub->imsi[0]) {
+ snprintf(imsi, sizeof(imsi), "IMSI-%s", vsub->imsi);
+ present = true;
+ }
+ if (vsub->msisdn[0]) {
+ snprintf(msisdn, sizeof(msisdn), "%sMSISDN-%s", present? "_" : "", vsub->msisdn);
+ present = true;
+ }
+ if (vsub->tmsi != GSM_RESERVED_TMSI) {
+ snprintf(tmsi, sizeof(buf), "%sTMSI-0x%08x", present? "_" : "", vsub->tmsi);
+ present = true;
+ }
+ if (vsub->tmsi_new != GSM_RESERVED_TMSI) {
+ snprintf(buf, sizeof(buf), "%sTMSInew-0x%08x", present? "_" : "", vsub->tmsi_new);
+ present = true;
+ }
+ if (!present)
return "unknown";
- buf[sizeof(buf)-1] = '\0';
+
+ snprintf(buf, sizeof(buf), "%s%s%s%s", imsi, msisdn, tmsi, tmsi_new);
return buf;
}