<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/14069">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc/msc_vty.c: refactor 'show subscr / conn / trans' commands<br><br>Change-Id: I5e58b56204c3f3d019e8d4c3c96cefdbb4af4d47<br>---<br>M src/libmsc/msc_vty.c<br>1 file changed, 291 insertions(+), 170 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-msc refs/changes/69/14069/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index 5c58221..f513f11 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -639,58 +639,6 @@</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*</span><br><span style="color: hsl(0, 100%, 40%);">-_Subscriber_______________________________________ _LAC_ _RAN___________________ _MSC-A_state_________ _MSC-A_use_</span><br><span style="color: hsl(0, 100%, 40%);">-IMSI-123456789012345:MSISDN-12345:TMSI-0x12345678 1 GERAN-A-4294967295:A5-3 WAIT_CLASSMARK_UPDATE 2=cm_service,trans_cc</span><br><span style="color: hsl(0, 100%, 40%);">-IMSI-123456789012356:MSISDN-234567:TMSI-0x123ABC78 65535 UTRAN-Iu-4294967295 COMMUNICATING 2=cm_service,trans_sms</span><br><span style="color: hsl(0, 100%, 40%);">-IMSI-123456789012367:MSISDN-98712345890:TMSI-0xF.. - EUTRAN-SGs RELEASING 0=none</span><br><span style="color: hsl(0, 100%, 40%);">-IMSI-123456789012378:HONR-12345432101 2 MSC-901-700-423:9876 REMOTE_MSC_A 1=inter_msc</span><br><span style="color: hsl(0, 100%, 40%);">-*/</span><br><span style="color: hsl(0, 100%, 40%);">-static void vty_dump_one_conn(struct vty *vty, const struct msub *msub, int *idx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msc_a *msc_a = msub_msc_a(msub);</span><br><span style="color: hsl(0, 100%, 40%);">- struct vlr_subscr *vsub = msub_vsub(msub);</span><br><span style="color: hsl(0, 100%, 40%);">- char buf[128];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(*idx))</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty,</span><br><span style="color: hsl(0, 100%, 40%);">- "_Subscriber_______________________________________ _LAC_ _RAN___________________"</span><br><span style="color: hsl(0, 100%, 40%);">- " _MSC-A_state_________ _MSC-A_use_%s",</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- (*idx)++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "%50s %5u %23s %20s %d=%s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vlr_subscr_short_name(msub_vsub(msub), 50),</span><br><span style="color: hsl(0, 100%, 40%);">- vsub ? vsub->cgi.lai.lac : 0,</span><br><span style="color: hsl(0, 100%, 40%);">- msub_ran_conn_name(msub),</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_name(msc_a->c.fi),</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_use_count_total(&msc_a->use_count),</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_use_count_name_buf(buf, sizeof(buf), &msc_a->use_count),</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(show_msc_conn, show_msc_conn_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "show connection", SHOW_STR "Subscriber Connections\n")</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct msub *msub;</span><br><span style="color: hsl(0, 100%, 40%);">- int idx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(msub, &msub_list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_one_conn(vty, msub, &idx);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void vty_trans_hdr(struct vty *vty)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (llist_empty(&gsmnet->trans_list))</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty,</span><br><span style="color: hsl(0, 100%, 40%);">- "_Subscriber_______________________________________ _RAN___________________"</span><br><span style="color: hsl(0, 100%, 40%);">- " _P__ TI CallRef_ _state_%s",</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static const char *get_trans_proto_str(const struct gsm_trans *trans)</span><br><span> {</span><br><span> static char buf[256];</span><br><span>@@ -703,146 +651,311 @@</span><br><span> trans->cc.T308_second);</span><br><span> break;</span><br><span> case TRANS_SMS:</span><br><span style="color: hsl(0, 100%, 40%);">- snprintf(buf, sizeof(buf), "%s %s",</span><br><span style="color: hsl(120, 100%, 40%);">+ snprintf(buf, sizeof(buf), "CP:%s RP:%s",</span><br><span> gsm411_cp_state_name(trans->sms.smc_inst.cp_state),</span><br><span> gsm411_rp_state_name(trans->sms.smr_inst.rp_state));</span><br><span> break;</span><br><span> default:</span><br><span style="color: hsl(0, 100%, 40%);">- buf[0] = '\0';</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span> }</span><br><span> </span><br><span> return buf;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void vty_dump_one_trans(struct vty *vty, const struct gsm_trans *trans)</span><br><span style="color: hsl(120, 100%, 40%);">+/* Prefix a given format string with a given amount of spaces */</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSC_VTY_DUMP(vty, offset, fmt, args...) \</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%*s" fmt, offset, "", ##args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define MSC_VTY_DUMP_FLAG(vty, offset, name, flag) \</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset + 2, "%s: %*s%s%s", \</span><br><span style="color: hsl(120, 100%, 40%);">+ name, 30 - (int)strlen(name), "", \</span><br><span style="color: hsl(120, 100%, 40%);">+ flag ? "true" : "false", \</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum msc_vty_dump_flags {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_F_SUBSCR = (1 << 0),</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_F_CONNECTION = (1 << 1),</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_F_TRANSACTION = (1 << 2),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void vty_dump_one_trans(struct vty *vty, const struct gsm_trans *trans,</span><br><span style="color: hsl(120, 100%, 40%);">+ int offset, uint8_t dump_flags)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, "%50s %23s %4s %02u %08x %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vlr_subscr_short_name(msc_a_vsub(trans->msc_a), 50),</span><br><span style="color: hsl(0, 100%, 40%);">- msub_ran_conn_name(trans->msc_a->c.msub),</span><br><span style="color: hsl(0, 100%, 40%);">- trans_type_name(trans->type),</span><br><span style="color: hsl(0, 100%, 40%);">- trans->transaction_id,</span><br><span style="color: hsl(0, 100%, 40%);">- trans->callref,</span><br><span style="color: hsl(0, 100%, 40%);">- get_trans_proto_str(trans),</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *proto_str;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dump_flags & MSC_VTY_DUMP_F_SUBSCR) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Subscriber: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vlr_subscr_name(msc_a_vsub(trans->msc_a)),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dump_flags & MSC_VTY_DUMP_F_CONNECTION) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: trans->msc_a may be NULL (e.g. in case of MT SMS) */</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "RAN connection: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ msub_ran_conn_name(trans->msc_a->c.msub),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Unique (global) identifier: 0x%08x%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ trans->callref, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "GSM 04.07 identifier (%s): %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ (trans->transaction_id & 0x08) ? "MO" : "MT",</span><br><span style="color: hsl(120, 100%, 40%);">+ trans->transaction_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Type: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ trans_type_name(trans->type),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((proto_str = get_trans_proto_str(trans))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Protocol specific: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ proto_str, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void vty_dump_one_conn(struct vty *vty, const struct msub *msub,</span><br><span style="color: hsl(120, 100%, 40%);">+ int offset, uint8_t dump_flags)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct vlr_subscr *vsub = msub_vsub(msub);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msc_a *msc_a = msub_msc_a(msub);</span><br><span style="color: hsl(120, 100%, 40%);">+ char buf[128];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dump_flags & MSC_VTY_DUMP_F_SUBSCR) {</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_flags = dump_flags &~ MSC_VTY_DUMP_F_SUBSCR;</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Subscriber: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vlr_subscr_name(vsub),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "RAN connection: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ msub_ran_conn_name(msub),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "RAN connection state: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_state_name(msc_a->c.fi),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsub) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "LAC / cell ID: %u / %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->cgi.lai.lac, vsub->cgi.cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Use count total: %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_use_count_total(&msc_a->use_count),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Use count: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_use_count_name_buf(buf, sizeof(buf), &msc_a->use_count),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Transactions of this connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dump_flags & MSC_VTY_DUMP_F_TRANSACTION) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_trans *trans;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Both subscriber and connection info is already printed */</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_flags = dump_flags &~ MSC_VTY_DUMP_F_CONNECTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_flags = dump_flags &~ MSC_VTY_DUMP_F_SUBSCR;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trans, &gsmnet->trans_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trans->msc_a != msc_a)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Transaction #%02u: %s",</span><br><span style="color: hsl(120, 100%, 40%);">+ i++, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_trans(vty, trans, offset + 2, dump_flags);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void vty_dump_one_subscr(struct vty *vty, struct vlr_subscr *vsub,</span><br><span style="color: hsl(120, 100%, 40%);">+ int offset, uint8_t dump_flags)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ char buf[128];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (strlen(vsub->name)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Name: '%s'%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->name, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (strlen(vsub->msisdn)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "MSISDN: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->msisdn, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "LAC / cell ID: %u / %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->cgi.lai.lac, vsub->cgi.cell_identity,</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "RAN type: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_rat_type_name(vsub->cs.attached_via_ran),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "IMSI: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->imsi, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsub->tmsi != GSM_RESERVED_TMSI) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "TMSI: %08X%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->tmsi, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsub->tmsi_new != GSM_RESERVED_TMSI) {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "New TMSI: %08X%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->tmsi_new, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsub->imei[0] != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "IMEI: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->imei, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsub->imeisv[0] != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "IMEISV: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->imeisv, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Flags: %s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "IMSI detached",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->imsi_detached_flag);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "Conf. by radio contact",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->conf_by_radio_contact_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "Subscr. data conf. by HLR",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->sub_dataconf_by_hlr_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "Location conf. in HLR",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->loc_conf_in_hlr_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "Subscriber dormant",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->dormant_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "Received cancel location",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->cancel_loc_rx);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "MS not reachable",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->ms_not_reachable_flag);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP_FLAG(vty, offset, "LA allowed",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->la_allowed);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (vsub->last_tuple) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct vlr_auth_tuple *t = vsub->last_tuple;</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "A3A8 last tuple (used %d times): %s",</span><br><span style="color: hsl(120, 100%, 40%);">+ t->use_count, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset + 2, "seq # : %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ t->key_seq, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset + 2, "RAND : %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset + 2, "SRES : %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset + 2, "Kc : %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Paging: %s paging for %d requests%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->cs.is_paging ? "is" : "not",</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_count(&vsub->cs.requests),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* SGs related */</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "SGs-state: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_state_name(vsub->sgs_fsm),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "SGs-MME: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ strlen(vsub->sgs.mme_name) ?</span><br><span style="color: hsl(120, 100%, 40%);">+ vsub->sgs.mme_name : "(none)",</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Use count total: %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_use_count_total(&vsub->use_count),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Use count: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_use_count_name_buf(buf, sizeof(buf), &vsub->use_count),</span><br><span style="color: hsl(120, 100%, 40%);">+ VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Connection(s) and/or transactions of this subscriber */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dump_flags & MSC_VTY_DUMP_F_CONNECTION) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msub *msub = msub_for_vsub(vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!msub)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Subscriber info is already printed */</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_flags = dump_flags &~ MSC_VTY_DUMP_F_SUBSCR;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Connection: %s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_conn(vty, msub, offset + 2, dump_flags);</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (dump_flags & MSC_VTY_DUMP_F_TRANSACTION) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_trans *trans;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Subscriber info is already printed */</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_flags = dump_flags &~ MSC_VTY_DUMP_F_SUBSCR;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Do not print connection info, but mention it */</span><br><span style="color: hsl(120, 100%, 40%);">+ dump_flags |= MSC_VTY_DUMP_F_CONNECTION;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trans, &gsmnet->trans_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trans->vsub != vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ MSC_VTY_DUMP(vty, offset, "Transaction #%02u: %s",</span><br><span style="color: hsl(120, 100%, 40%);">+ i++, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_trans(vty, trans, offset + 2, dump_flags);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> DEFUN(show_msc_transaction, show_msc_transaction_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "show transaction", SHOW_STR "Transactions\n")</span><br><span style="color: hsl(120, 100%, 40%);">+ "show transaction",</span><br><span style="color: hsl(120, 100%, 40%);">+ SHOW_STR "Transactions\n")</span><br><span> {</span><br><span> struct gsm_trans *trans;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t flags = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- vty_trans_hdr(vty);</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(trans, &gsmnet->trans_list, entry)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_one_trans(vty, trans);</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_CONNECTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_SUBSCR;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trans, &gsmnet->trans_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " Transaction #%02u: %s", i++, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_trans(vty, trans, 4, flags);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> </span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void subscr_dump_full_vty(struct vty *vty, struct vlr_subscr *vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(show_msc_conn, show_msc_conn_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "show connection [trans]",</span><br><span style="color: hsl(120, 100%, 40%);">+ SHOW_STR "Subscriber Connections\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Show child transactions of each connection\n")</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_trans *trans;</span><br><span style="color: hsl(0, 100%, 40%);">- char buf[128];</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t flags = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msub *msub;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (strlen(vsub->name))</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Name: '%s'%s", vsub->name, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (strlen(vsub->msisdn))</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Extension: %s%s", vsub->msisdn,</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " LAC: %d/0x%x%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->cgi.lai.lac, vsub->cgi.lai.lac, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " RAN: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_rat_type_name(vsub->cs.attached_via_ran), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " IMSI: %s%s", vsub->imsi, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsub->tmsi != GSM_RESERVED_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " TMSI: %08X%s", vsub->tmsi,</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsub->tmsi_new != GSM_RESERVED_TMSI)</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " new TMSI: %08X%s", vsub->tmsi_new,</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsub->imei[0] != '\0')</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " IMEI: %s%s", vsub->imei, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsub->imeisv[0] != '\0')</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " IMEISV: %s%s", vsub->imeisv, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (argc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_SUBSCR;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Flags: %s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " IMSI detached: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->imsi_detached_flag ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Conf. by radio contact: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->conf_by_radio_contact_ind ? "true" : "false",</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Subscr. data conf. by HLR: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->sub_dataconf_by_hlr_ind ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Location conf. in HLR: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->loc_conf_in_hlr_ind ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Subscriber dormant: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->dormant_ind ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Received cancel locataion: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->cancel_loc_rx ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " MS not reachable: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->ms_not_reachable_flag ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " LA allowed: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->la_allowed ? "true" : "false", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsub->last_tuple) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct vlr_auth_tuple *t = vsub->last_tuple;</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " A3A8 last tuple (used %d times):%s",</span><br><span style="color: hsl(0, 100%, 40%);">- t->use_count, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " seq # : %d%s",</span><br><span style="color: hsl(0, 100%, 40%);">- t->key_seq, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " RAND : %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump(t->vec.rand, sizeof(t->vec.rand)),</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " SRES : %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump(t->vec.sres, sizeof(t->vec.sres)),</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Kc : %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump(t->vec.kc, sizeof(t->vec.kc)),</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(msub, &msub_list, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " Connection #%02u: %s", i++, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_conn(vty, msub, 4, flags);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Paging: %s paging for %d requests%s",</span><br><span style="color: hsl(0, 100%, 40%);">- vsub->cs.is_paging ? "is" : "not",</span><br><span style="color: hsl(0, 100%, 40%);">- llist_count(&vsub->cs.requests),</span><br><span style="color: hsl(0, 100%, 40%);">- VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* SGs related */</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " SGs-state: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_state_name(vsub->sgs_fsm), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- if (strlen(vsub->sgs.mme_name))</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " SGs-MME: %s%s", vsub->sgs.mme_name, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " SGs-MME: (none)%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Use: %s%s", osmo_use_count_name_buf(buf, sizeof(buf), &vsub->use_count), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Connection */</span><br><span style="color: hsl(0, 100%, 40%);">- if (vsub->msc_conn_ref) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct msub *msub = msub_for_vsub(vsub);</span><br><span style="color: hsl(0, 100%, 40%);">- int idx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- if (msub) {</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_one_conn(vty, msub, &idx);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Transactions */</span><br><span style="color: hsl(0, 100%, 40%);">- vty_trans_hdr(vty);</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(trans, &gsmnet->trans_list, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (trans->vsub != vsub)</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">- vty_dump_one_trans(vty, trans);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define SUBSCR_FLAGS "[(conn|trans|conn+trans)]"</span><br><span style="color: hsl(120, 100%, 40%);">+#define SUBSCR_FLAGS_HELP \</span><br><span style="color: hsl(120, 100%, 40%);">+ "Show child connections\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+ "Show child transactions\n" \</span><br><span style="color: hsl(120, 100%, 40%);">+ "Show child connections and transactions\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Subscriber */</span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(show_subscr_cache,</span><br><span style="color: hsl(0, 100%, 40%);">- show_subscr_cache_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "show subscriber cache",</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(show_subscr_cache, show_subscr_cache_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "show subscriber cache " SUBSCR_FLAGS,</span><br><span> SHOW_STR "Show information about subscribers\n"</span><br><span style="color: hsl(0, 100%, 40%);">- "Display contents of subscriber cache\n")</span><br><span style="color: hsl(120, 100%, 40%);">+ "Display contents of subscriber cache\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ SUBSCR_FLAGS_HELP)</span><br><span> {</span><br><span> struct vlr_subscr *vsub;</span><br><span style="color: hsl(0, 100%, 40%);">- int count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t flags = 0x00;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (argc && strcmp(argv[0], "conn") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_CONNECTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (argc && strcmp(argv[0], "trans") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (argc && strcmp(argv[0], "conn+trans") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_CONNECTION | MSC_VTY_DUMP_F_TRANSACTION;</span><br><span> </span><br><span> llist_for_each_entry(vsub, &gsmnet->vlr->subscribers, list) {</span><br><span> if (++count > 100) {</span><br><span>@@ -850,8 +963,8 @@</span><br><span> " stopping here.%s", count-1, VTY_NEWLINE);</span><br><span> break;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- vty_out(vty, " Subscriber:%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">- subscr_dump_full_vty(vty, vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " Subscriber #%02u: %s", i++, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_subscr(vty, vsub, 4, flags);</span><br><span> }</span><br><span> </span><br><span> return CMD_SUCCESS;</span><br><span>@@ -960,14 +1073,14 @@</span><br><span> "Legacy alias for 'imsi'\n" \</span><br><span> "Identifier for the subscriber\n"</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-DEFUN(show_subscr,</span><br><span style="color: hsl(0, 100%, 40%);">- show_subscr_cmd,</span><br><span style="color: hsl(0, 100%, 40%);">- "show subscriber " SUBSCR_TYPES " ID",</span><br><span style="color: hsl(0, 100%, 40%);">- SHOW_STR SUBSCR_HELP)</span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(show_subscr, show_subscr_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "show subscriber " SUBSCR_TYPES " ID " SUBSCR_FLAGS,</span><br><span style="color: hsl(120, 100%, 40%);">+ SHOW_STR SUBSCR_HELP SUBSCR_FLAGS_HELP)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct vlr_subscr *vsub = get_vsub_by_argv(gsmnet, argv[0],</span><br><span style="color: hsl(0, 100%, 40%);">- argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct vlr_subscr *vsub;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t flags = 0x00;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ vsub = get_vsub_by_argv(gsmnet, argv[0], argv[1]);</span><br><span> if (!vsub) {</span><br><span> vty_out(vty, "%% No subscriber found for %s %s%s",</span><br><span> argv[0], argv[1], VTY_NEWLINE);</span><br><span>@@ -979,7 +1092,15 @@</span><br><span> * this, and since this is not multi-threaded, this vlr_subscr_put() cannot possibly reach a count of 0. */</span><br><span> vlr_subscr_put(vsub, VSUB_USE_VTY);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- subscr_dump_full_vty(vty, vsub);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (argc > 2 && strcmp(argv[2], "conn") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_CONNECTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (argc > 2 && strcmp(argv[2], "trans") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (argc > 2 && strcmp(argv[2], "conn+trans") == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ flags |= MSC_VTY_DUMP_F_CONNECTION | MSC_VTY_DUMP_F_TRANSACTION;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " Subscriber: %s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_dump_one_subscr(vty, vsub, 4, flags);</span><br><span> </span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/14069">change 14069</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/14069"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I5e58b56204c3f3d019e8d4c3c96cefdbb4af4d47 </div>
<div style="display:none"> Gerrit-Change-Number: 14069 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>