<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10022">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add VTY commands which show specific mgcp endpoints<br><br>Add VTY commands "show mgcp endpoint NAME" and<br>"show mgcp trunk <0-64> endpoint NAME" which<br>show information about specific endpoints.<br><br>Change-Id: I5330e697ec34bf215de91d44209048a8dc226d51<br>Related: OS#2660<br>---<br>M src/libosmo-mgcp/mgcp_vty.c<br>1 file changed, 106 insertions(+), 21 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/libosmo-mgcp/mgcp_vty.c b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>index 00af3bd..75cc52f 100644</span><br><span>--- a/src/libosmo-mgcp/mgcp_vty.c</span><br><span>+++ b/src/libosmo-mgcp/mgcp_vty.c</span><br><span>@@ -31,6 +31,7 @@</span><br><span> </span><br><span> #include <string.h></span><br><span> #include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span> </span><br><span> #define RTCP_OMIT_STR "Drop RTCP packets in both directions\n"</span><br><span> #define RTP_PATCH_STR "Modify RTP packet header in both directions\n"</span><br><span>@@ -184,13 +185,40 @@</span><br><span>              end->force_output_ptime, VTY_NEWLINE);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg,</span><br><span style="color: hsl(0, 100%, 40%);">-                       int verbose)</span><br><span style="color: hsl(120, 100%, 40%);">+static void dump_endpoint(struct vty *vty, struct mgcp_endpoint *endp, int epidx,</span><br><span style="color: hsl(120, 100%, 40%);">+                          int trunk_nr, enum mgcp_trunk_type trunk_type, int show_stats)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   int i;</span><br><span>       struct mgcp_conn *conn;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     vty_out(vty, "%s trunk nr %d with %d endpoints:%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%s trunk %d endpoint %s%.2x:%s",</span><br><span style="color: hsl(120, 100%, 40%);">+              trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1", trunk_nr,</span><br><span style="color: hsl(120, 100%, 40%);">+            trunk_type == MGCP_TRUNK_VIRTUAL ? MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK : "",</span><br><span style="color: hsl(120, 100%, 40%);">+         epidx, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (llist_empty(&endp->conns)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               vty_out(vty, "   No active connections%s", VTY_NEWLINE);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   llist_for_each_entry(conn, &endp->conns, entry) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "   CONN: %s%s", mgcp_conn_dump(conn), VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+         if (show_stats) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     /* FIXME: Also add verbosity for other</span><br><span style="color: hsl(120, 100%, 40%);">+                         * connection types (E1) as soon as</span><br><span style="color: hsl(120, 100%, 40%);">+                    * the implementation is available */</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (conn->type == MGCP_CONN_TYPE_RTP) {</span><br><span style="color: hsl(120, 100%, 40%);">+                            dump_rtp_end(vty, &conn->u.rtp);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void dump_trunk(struct vty *vty, struct mgcp_trunk_config *cfg, int show_stats)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      vty_out(vty, "%s trunk %d with %d endpoints:%s",</span><br><span>           cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",</span><br><span>             cfg->trunk_nr, cfg->number_endpoints - 1, VTY_NEWLINE);</span><br><span> </span><br><span>@@ -201,29 +229,18 @@</span><br><span> </span><br><span>        for (i = 1; i < cfg->number_endpoints; ++i) {</span><br><span>          struct mgcp_endpoint *endp = &cfg->endpoints[i];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         vty_out(vty, "Endpoint 0x%.2x:%s", i, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           llist_for_each_entry(conn, &endp->conns, entry) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        vty_out(vty, "   CONN: %s%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                         mgcp_conn_dump(conn), VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                     if (verbose) {</span><br><span style="color: hsl(0, 100%, 40%);">-                          /* FIXME: Also add verbosity for other</span><br><span style="color: hsl(0, 100%, 40%);">-                           * connection types (E1) as soon as</span><br><span style="color: hsl(0, 100%, 40%);">-                              * the implementation is available */</span><br><span style="color: hsl(0, 100%, 40%);">-                           if (conn->type == MGCP_CONN_TYPE_RTP) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                      dump_rtp_end(vty, &conn->u.rtp);</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(120, 100%, 40%);">+             dump_endpoint(vty, endp, i, cfg->trunk_nr, cfg->trunk_type, show_stats);</span><br><span style="color: hsl(120, 100%, 40%);">+                if (i < cfg->number_endpoints - 1)</span><br><span style="color: hsl(120, 100%, 40%);">+                      vty_out(vty, "%s", VTY_NEWLINE);</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define SHOW_MGCP_STR "Display information about the MGCP Media Gateway\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(show_mcgp, show_mgcp_cmd,</span><br><span>       "show mgcp [stats]",</span><br><span>       SHOW_STR</span><br><span style="color: hsl(0, 100%, 40%);">-      "Display information about the MGCP Media Gateway\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_MGCP_STR</span><br><span>       "Include Statistics\n")</span><br><span> {</span><br><span>     struct mgcp_trunk_config *trunk;</span><br><span>@@ -241,6 +258,72 @@</span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void</span><br><span style="color: hsl(120, 100%, 40%);">+dump_mgcp_endpoint(struct vty *vty, struct mgcp_trunk_config *trunk, const char *epname)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        const size_t virt_prefix_len = sizeof(MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK) - 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned long epidx;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *endp;</span><br><span style="color: hsl(120, 100%, 40%);">+   int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (strncmp(epname, MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK, virt_prefix_len) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                epname += virt_prefix_len;</span><br><span style="color: hsl(120, 100%, 40%);">+    errno = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    epidx = strtoul(epname, &endp, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (epname[0] == '\0' || *endp != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "endpoint name '%s' is not a hex number%s", epname, VTY_NEWLINE);</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%);">+     if ((errno == ERANGE && epidx == ULONG_MAX) /* parsed value out of range */</span><br><span style="color: hsl(120, 100%, 40%);">+       || epidx >= trunk->number_endpoints) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "endpoint %.2lx not configured on trunk %d%s", epidx, trunk->trunk_nr, VTY_NEWLINE);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < trunk->number_endpoints; ++i) {</span><br><span style="color: hsl(120, 100%, 40%);">+         struct mgcp_endpoint *endp = &trunk->endpoints[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             if (i == epidx) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     dump_endpoint(vty, endp, i, trunk->trunk_nr, trunk->trunk_type, true);</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</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%);">+DEFUN(show_mcgp_endpoint, show_mgcp_endpoint_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "show mgcp endpoint NAME",</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_STR</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_MGCP_STR</span><br><span style="color: hsl(120, 100%, 40%);">+      "Display information about an endpoint\n" "The name of the endpoint\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct mgcp_trunk_config *trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    dump_mgcp_endpoint(vty, &g_cfg->trunk, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       llist_for_each_entry(trunk, &g_cfg->trunks, entry)</span><br><span style="color: hsl(120, 100%, 40%);">+             dump_mgcp_endpoint(vty, trunk, argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    return CMD_SUCCESS;</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%);">+DEFUN(show_mcgp_trunk_endpoint, show_mgcp_trunk_endpoint_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+      "show mgcp trunk <0-64> endpoint NAME",</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_STR</span><br><span style="color: hsl(120, 100%, 40%);">+      SHOW_MGCP_STR</span><br><span style="color: hsl(120, 100%, 40%);">+      "Display information about a trunk\n" "Trunk number\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Display information about an endpoint\n" "The name of the endpoint\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct mgcp_trunk_config *trunk;</span><br><span style="color: hsl(120, 100%, 40%);">+      int trunkidx = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       trunk = find_trunk(g_cfg, trunkidx);</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!trunk) {</span><br><span style="color: hsl(120, 100%, 40%);">+         vty_out(vty, "trunk %d not found%s", trunkidx, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+                return CMD_WARNING;</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%);">+   dump_mgcp_endpoint(vty, trunk, argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+      return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> DEFUN(cfg_mgcp, cfg_mgcp_cmd, "mgcp", "Configure the MGCP")</span><br><span> {</span><br><span>     vty->node = MGCP_NODE;</span><br><span>@@ -1219,6 +1302,8 @@</span><br><span> int mgcp_vty_init(void)</span><br><span> {</span><br><span>    install_element_ve(&show_mgcp_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element_ve(&show_mgcp_endpoint_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+      install_element_ve(&show_mgcp_trunk_endpoint_cmd);</span><br><span>       install_element(ENABLE_NODE, &loop_conn_cmd);</span><br><span>    install_element(ENABLE_NODE, &tap_rtp_cmd);</span><br><span>      install_element(ENABLE_NODE, &free_endp_cmd);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10022">change 10022</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/10022"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-mgw </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I5330e697ec34bf215de91d44209048a8dc226d51 </div>
<div style="display:none"> Gerrit-Change-Number: 10022 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <ssperling@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <ssperling@sysmocom.de> </div>