<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-msc/+/14069">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  osmith: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libmsc/msc_vty.c: refactor 'show subscr / conn / trans' commands<br><br>The current way of printing subscriber, connection, and transaction<br>info is ugly (sorry) and has several problems:<br><br>  - the terminal width should be large enough to fit quite long lines,<br>    otherwise the output is unreadable and looks misaligned;<br><br>  - some fields (such as subscriber name) can be larger than it's<br>    expected, so either they're getting truncated, or again, the<br>    output is misaligned and unreadable;<br><br>  - adding new info fields would require one to think about the<br>    alignment and would make the output even more cumbersome.<br><br>Here is an example output of 'show connection' command:<br><br>  _Subscriber_______________________________________ _LAC_ _RAN___________________ _MSC-A_state_________ _MSC-A_use_<br>  IMSI-123456789012345:MSISDN-12345:TMSI-0x12345678      1 GERAN-A-4294967295:A5-3 WAIT_CLASSMARK_UPDATE 2=cm_service,trans_cc<br>  IMSI-123456789012356:MSISDN-234567:TMSI-0x123ABC78 65535     UTRAN-Iu-4294967295         COMMUNICATING 2=cm_service,trans_sms<br>  IMSI-262073993158656:MSISDN-123456:TMSI-0x493026BA     1               GERAN-A-1 MSC_A_ST_COMMUNICATING 1=1 (silent_call)<br><br>Another 'show subscriber' command mixes the information about<br>subscriber, its connections and transactions without any alignment,<br>what also decreases the readability.<br><br>This change introduces a hierarchical approach, based on the old<br>'field per line' formatting. First of all, the VTY commands were<br>extended with optional flags:<br><br>  show connection [trans]<br>  show subscriber cache [(conn|trans|conn+trans)]<br>  show subscriber TYPE ID [(conn|trans|conn+trans)]<br><br>so it can be decided, whether to print child connections and/or<br>transaction, or not. For example:<br><br>  show connection trans<br><br>would print all connections and their child transactions with<br>hierarchical alignment:<br><br>  Connection #00:<br>    Subscriber: IMSI-262073993158656:MSISDN-123456:TMSI-0x76760B75<br>    RAN connection: GERAN-A-1<br>    RAN connection state: MSC_A_ST_COMMUNICATING<br>    LAC / cell ID: 1 / 0<br>    Use count total: 1<br>    Use count: 1 (silent_call)<br>    Transaction #00:<br>      Unique (global) identifier: 0x00000000<br>      GSM 04.07 identifier (MT): 0<br>      Type: silent-call<br><br>another example is:<br><br>  show subscriber cache conn+trans<br><br>which would print all known subscribers,<br>their active connections and transactions:<br><br>  Subscriber #00:<br>    MSISDN: 123456<br>    LAC / cell ID: 1 / 0<br>    RAN type: GERAN-A<br>    IMSI: 262073993158656<br>    TMSI: 76760B75<br>    ...<br>    Connection:<br>      RAN connection: GERAN-A-1<br>      RAN connection state: MSC_A_ST_COMMUNICATING<br>      ...<br>      Transaction #00:<br>        Unique (global) identifier: 0x00000000<br>   GSM 04.07 identifier (MT): 0<br>  Type: silent-call<br>      Transaction #01:<br>        Unique (global) identifier: 0x00000001<br>     GSM 04.07 identifier (MO): 0<br>  Type: SMS<br>      Transaction #02:<br>        Unique (global) identifier: 0x00000002<br>     GSM 04.07 identifier (MT): 0<br>  Type: SMS<br><br>Please note that we don't print redundant info in child nodes<br>(i.e. connection and transaction info), such as subscriber name<br>in connection info, nor connection name in transaction info - it<br>is clear from the hierarchical formatting.<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;"><span>diff --git a/src/libmsc/msc_vty.c b/src/libmsc/msc_vty.c</span><br><span>index 0c07bc2..5b0cfc4 100644</span><br><span>--- a/src/libmsc/msc_vty.c</span><br><span>+++ b/src/libmsc/msc_vty.c</span><br><span>@@ -661,58 +661,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>@@ -725,146 +673,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%);">+             MSC_VTY_DUMP(vty, offset, "RAN connection: %s%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                        trans->msc_a ? msub_ran_conn_name(trans->msc_a->c.msub)</span><br><span style="color: hsl(120, 100%, 40%);">+                                   : "(not established)",</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>@@ -872,8 +985,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>@@ -982,14 +1095,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>@@ -1001,7 +1114,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/c/osmo-msc/+/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/c/osmo-msc/+/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-Change-Id: I5e58b56204c3f3d019e8d4c3c96cefdbb4af4d47 </div>
<div style="display:none"> Gerrit-Change-Number: 14069 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Pau Espin Pedrol <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>