diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/libmsc/gsm_04_08.c | 14 | ||||
-rw-r--r-- | src/libmsc/ran_conn.c | 42 | ||||
-rw-r--r-- | src/libvlr/vlr.c | 36 |
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; } |