<p>Stefan Sperling has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10022">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">add a VTY command which shows a specific mgcp endpoint<br><br>Add a new VTY command "show mgcp trunk <0-64> endpoint NAME"<br>which shows detailed information about a specific endpoint.<br><br>Change-Id: I5330e697ec34bf215de91d44209048a8dc226d51<br>Related: OS#2660<br>---<br>M src/libosmo-mgcp/mgcp_vty.c<br>1 file changed, 76 insertions(+), 19 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-mgw refs/changes/22/10022/1</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 ad462b7..22dd8ae 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,11 +185,32 @@</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%);">+                          enum mgcp_trunk_type trunk_type, int show_stats)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct mgcp_conn *conn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "Endpoint %s0x%.2x:%s",</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%);">+        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> {</span><br><span>  int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct mgcp_conn *conn;</span><br><span> </span><br><span>  vty_out(vty, "%s trunk nr %d with %d endpoints:%s",</span><br><span>                cfg->trunk_type == MGCP_TRUNK_VIRTUAL ? "Virtual" : "E1",</span><br><span>@@ -201,22 +223,9 @@</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_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>@@ -241,6 +250,53 @@</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </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 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%);">+      "Display information about an MGCP Media Gateway endpoint\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Display information about a specific trunk only\n" "Trunk number\n"</span><br><span style="color: hsl(120, 100%, 40%);">+      "Display information about an endpoint\n" "The name of the endpoint in hex\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[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ const char *epidxstr;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned long epidx;</span><br><span style="color: hsl(120, 100%, 40%);">+  char *ep;</span><br><span style="color: hsl(120, 100%, 40%);">+     int i;</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%);">+</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%);">+   epidxstr = argv[1];</span><br><span style="color: hsl(120, 100%, 40%);">+   if (strncmp(epidxstr, MGCP_ENDPOINT_PREFIX_VIRTUAL_TRUNK, virt_prefix_len) == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+              epidxstr += 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(epidxstr, &ep, 16);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (argv[1][0] == '\0' || *ep != '\0') {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "endpoint name '%s' is not a hex number%s", argv[1], 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%);">+     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 0x%.2lx not configured%s", epidx, 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%);">+   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_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%);">+   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>@@ -1217,6 +1273,7 @@</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>     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: newchange </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: 1 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <ssperling@sysmocom.de> </div>