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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">VTY interface support<br><br>Let's add a VTY interface on TCP port 4269.  The purpose is - for now -<br>not for configuration storage, but for state introspection.<br><br>Change-Id: I47b6e4efaad52e68e2b50a7993076f3706f86628<br>---<br>M configure.ac<br>M src/Makefile.am<br>M src/ctl.c<br>M src/e1d.h<br>M src/osmo-e1d.c<br>A src/vty.c<br>6 files changed, 238 insertions(+), 9 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index c0508eb..5be845b 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -33,6 +33,7 @@</span><br><span> PKG_CHECK_MODULES(TALLOC, [talloc >= 2.0.1])</span><br><span> </span><br><span> PKG_CHECK_MODULES(LIBOSMOCORE, libosmocore >= 1.0.1.120)</span><br><span style="color: hsl(120, 100%, 40%);">+PKG_CHECK_MODULES(LIBOSMOVTY, libosmovty)</span><br><span> PKG_CHECK_MODULES(LIBOSMOUSB, libosmousb)</span><br><span> PKG_CHECK_MODULES(LIBUSB, libusb-1.0 >= 1.0.21)</span><br><span> </span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index bc05998..aa796f2 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -4,7 +4,8 @@</span><br><span> LIBVERSION=0:0:0</span><br><span> </span><br><span> AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include -I$(top_builddir)</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS=-Wall -Wno-unused-result $(LIBOSMOCORE_CFLAGS) $(LIBOSMOUSB_LIBS) $(LIBUSB_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS=-Wall -Wno-unused-result $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(120, 100%, 40%);">+          $(LIBOSMOVTY_LIBS) $(LIBOSMOUSB_LIBS) $(LIBUSB_CFLAGS)</span><br><span> </span><br><span> lib_LTLIBRARIES = libosmo-e1d.la</span><br><span> </span><br><span>@@ -34,6 +35,8 @@</span><br><span>     log.c \</span><br><span>      osmo-e1d.c \</span><br><span>         usb.c \</span><br><span style="color: hsl(120, 100%, 40%);">+       vty.c \</span><br><span>      $(NULL)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-osmo_e1d_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOUSB_LIBS) $(LIBUSB_LIBS) libosmo-e1d.la</span><br><span style="color: hsl(120, 100%, 40%);">+osmo_e1d_LDADD = $(LIBOSMOCORE_LIBS) $(LIBOSMOVTY_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+            $(LIBOSMOUSB_LIBS) $(LIBUSB_LIBS) libosmo-e1d.la</span><br><span>diff --git a/src/ctl.c b/src/ctl.c</span><br><span>index 835811f..a70556d 100644</span><br><span>--- a/src/ctl.c</span><br><span>+++ b/src/ctl.c</span><br><span>@@ -38,8 +38,8 @@</span><br><span> #include "e1d.h"</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct e1_intf *</span><br><span style="color: hsl(0, 100%, 40%);">-_e1d_find_intf(struct e1_daemon *e1d, uint8_t id)</span><br><span style="color: hsl(120, 100%, 40%);">+struct e1_intf *</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_find_intf(struct e1_daemon *e1d, uint8_t id)</span><br><span> {</span><br><span>        struct e1_intf *intf;</span><br><span> </span><br><span>@@ -137,7 +137,7 @@</span><br><span> </span><br><span>  /* Process query and find interface */</span><br><span>       if (hdr->intf != E1DP_INVALID) {</span><br><span style="color: hsl(0, 100%, 40%);">-             intf = _e1d_find_intf(e1d, hdr->intf);</span><br><span style="color: hsl(120, 100%, 40%);">+             intf = e1d_find_intf(e1d, hdr->intf);</span><br><span>             n = intf ? 1 : 0;</span><br><span>    } else {</span><br><span>             n = llist_count(&e1d->interfaces);</span><br><span>@@ -174,7 +174,7 @@</span><br><span>      int n;</span><br><span>       </span><br><span>     /* Process query and find line */</span><br><span style="color: hsl(0, 100%, 40%);">-       intf = _e1d_find_intf(e1d, hdr->intf);</span><br><span style="color: hsl(120, 100%, 40%);">+     intf = e1d_find_intf(e1d, hdr->intf);</span><br><span>     if (!intf)</span><br><span>           return 0;</span><br><span> </span><br><span>@@ -216,7 +216,7 @@</span><br><span>  int n;</span><br><span> </span><br><span>   /* Process query and find timeslot */</span><br><span style="color: hsl(0, 100%, 40%);">-   intf = _e1d_find_intf(e1d, hdr->intf);</span><br><span style="color: hsl(120, 100%, 40%);">+     intf = e1d_find_intf(e1d, hdr->intf);</span><br><span>     if (!intf)</span><br><span>           return 0;</span><br><span> </span><br><span>@@ -262,7 +262,7 @@</span><br><span>  int ret;</span><br><span> </span><br><span>         /* Process query and find timeslot */</span><br><span style="color: hsl(0, 100%, 40%);">-   intf = _e1d_find_intf(e1d, hdr->intf);</span><br><span style="color: hsl(120, 100%, 40%);">+     intf = e1d_find_intf(e1d, hdr->intf);</span><br><span>     if (!intf)</span><br><span>           return 0;</span><br><span> </span><br><span>diff --git a/src/e1d.h b/src/e1d.h</span><br><span>index 5b7ba83..303757f 100644</span><br><span>--- a/src/e1d.h</span><br><span>+++ b/src/e1d.h</span><br><span>@@ -84,6 +84,9 @@</span><br><span> struct e1_intf *</span><br><span> e1_intf_new(struct e1_daemon *e1d, void *drv_data);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct e1_intf *</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_find_intf(struct e1_daemon *e1d, uint8_t id);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct e1_line *</span><br><span> e1_line_new(struct e1_intf *intf, void *drv_data);</span><br><span> </span><br><span>@@ -92,3 +95,6 @@</span><br><span> </span><br><span> int</span><br><span> e1_line_demux_in(struct e1_line *line, const uint8_t *buf, int size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_vty_init(struct e1_daemon *e1d);</span><br><span>diff --git a/src/osmo-e1d.c b/src/osmo-e1d.c</span><br><span>index 92d98d3..808bd68 100644</span><br><span>--- a/src/osmo-e1d.c</span><br><span>+++ b/src/osmo-e1d.c</span><br><span>@@ -28,23 +28,30 @@</span><br><span> #include <stdio.h></span><br><span> #include <string.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define _GNU_SOURCE</span><br><span style="color: hsl(120, 100%, 40%);">+#include <getopt.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #include <talloc.h></span><br><span> </span><br><span> #include <osmocom/core/application.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/select.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span> </span><br><span> #include <osmocom/e1d/proto_srv.h></span><br><span> </span><br><span> #include "e1d.h"</span><br><span> #include "log.h"</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifndef OSMO_VTY_PORT_E1D</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_VTY_PORT_E1D     4269</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> </span><br><span> extern struct osmo_e1dp_server_handler e1d_ctl_handlers[];</span><br><span> extern int e1_usb_probe(struct e1_daemon *e1d);</span><br><span> </span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+static const char *g_config_file = "osmo-e1d.cfg";</span><br><span> static void *g_e1d_ctx = NULL;</span><br><span> static int g_shutdown = 0;</span><br><span> </span><br><span>@@ -71,6 +78,61 @@</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static struct vty_app_info vty_info = {</span><br><span style="color: hsl(120, 100%, 40%);">+   .name = "osmo-e1d",</span><br><span style="color: hsl(120, 100%, 40%);">+ .version = PACKAGE_VERSION,</span><br><span style="color: hsl(120, 100%, 40%);">+   .copyright =</span><br><span style="color: hsl(120, 100%, 40%);">+  "(C) 2019 by Sylvain Munaut <tnt@246tNt.com>\r\n",</span><br><span style="color: hsl(120, 100%, 40%);">+    "License GPLv2+: GNU GPL version 2 or later <http://gnu.org/licenses/gpl-2.0.html>\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "This is free software: you are free to change and redistribute it.\r\n"</span><br><span style="color: hsl(120, 100%, 40%);">+    "There is NO WARRANTY, to the extent permitted by law.\r\n",</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 print_help(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("  Some useful help...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("  -h --help                        This text.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  printf("  -d --debug option                --debug=DE1D:DXFR enable debugging.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("  -c --config-file filename        The config file to use.\n");</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 handle_options(int argc, char **argv)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int option_index = 0, c;</span><br><span style="color: hsl(120, 100%, 40%);">+              static const struct option long_options[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+                 {"help", 0, 0, 'h'},</span><br><span style="color: hsl(120, 100%, 40%);">+                        {"debug", 1, 0, 'd'},</span><br><span style="color: hsl(120, 100%, 40%);">+                       {"config-file", 1, 0, 'c'},</span><br><span style="color: hsl(120, 100%, 40%);">+                 {0, 0, 0, 0}</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%);">+          c = getopt_long(argc, argv, "hd:c:", long_options, &option_index);</span><br><span style="color: hsl(120, 100%, 40%);">+              if (c == -1)</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%);">+              switch (c) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case 'h':</span><br><span style="color: hsl(120, 100%, 40%);">+                     print_help();</span><br><span style="color: hsl(120, 100%, 40%);">+                 exit(0);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'd':</span><br><span style="color: hsl(120, 100%, 40%);">+                     log_parse_category_mask(osmo_stderr_target, optarg);</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case 'c':</span><br><span style="color: hsl(120, 100%, 40%);">+                     g_config_file = optarg;</span><br><span style="color: hsl(120, 100%, 40%);">+                       break;</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      fprintf(stderr, "Error in command line options. Exiting.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       exit(-1);</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%);">+   if (argc > optind) {</span><br><span style="color: hsl(120, 100%, 40%);">+               fprintf(stderr, "Unsupported positional arguments on command line\n");</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(2);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> int main(int argc, char *argv[])</span><br><span> {</span><br><span>@@ -82,6 +144,7 @@</span><br><span>       /* talloc init */</span><br><span>    g_e1d_ctx = talloc_named_const(NULL, 0, "osmo-e1d");</span><br><span>       msgb_talloc_ctx_init(g_e1d_ctx, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_info.tall_ctx = g_e1d_ctx;</span><br><span> </span><br><span>   /* logging init */</span><br><span>   osmo_init_logging2(g_e1d_ctx, &log_info);</span><br><span>@@ -108,6 +171,23 @@</span><br><span>         OSMO_ASSERT(e1d);</span><br><span> </span><br><span>        INIT_LLIST_HEAD(&e1d->interfaces);</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_init(&vty_info);</span><br><span style="color: hsl(120, 100%, 40%);">+      e1d_vty_init(e1d);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  handle_options(argc, argv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rv = vty_read_config_file(g_config_file, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rv < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DE1D, LOGL_FATAL, "Failed to parse the config file '%s'\n", g_config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+            exit(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%);">+   rv = telnet_init_dynif(g_e1d_ctx, e1d, vty_get_bind_addr(), OSMO_VTY_PORT_E1D);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rv != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DE1D, LOGL_FATAL, "Failed to bind VTY interface to %s:%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                   vty_get_bind_addr(), OSMO_VTY_PORT_E1D);</span><br><span style="color: hsl(120, 100%, 40%);">+              exit(1);</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span> </span><br><span>        /* probe devices */</span><br><span>  rv = e1_usb_probe(e1d);</span><br><span>diff --git a/src/vty.c b/src/vty.c</span><br><span>new file mode 100644</span><br><span>index 0000000..88b6257</span><br><span>--- /dev/null</span><br><span>+++ b/src/vty.c</span><br><span>@@ -0,0 +1,139 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* osmo-e1d VTY interface */</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2020 by Harald Welte <laforge@osmocom.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#define _GNU_SOURCE      /* struct ucred */</span><br><span style="color: hsl(120, 100%, 40%);">+#include <sys/socket.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdlib.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/linuxlist.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/command.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/buffer.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/misc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/tdef_vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/e1d/proto.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include "e1d.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct e1_daemon *vty_e1d;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+static void vty_dump_ts(struct vty *vty, const struct e1_ts *ts)</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%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void vty_dump_intf(struct vty *vty, const struct e1_intf *intf)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "Interface #%u, Driver: FIXME%s", intf->id, 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%);">+DEFUN(show_intf, show_intf_cmd, "show interface [<0-255>]",</span><br><span style="color: hsl(120, 100%, 40%);">+ SHOW_STR "Display information about an E1 Interface/Card\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct e1_intf *intf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (argc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int id = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+               intf = e1d_find_intf(vty_e1d, id);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!intf) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%% Unknown interface %u%s\n", id, 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%);">+             vty_dump_intf(vty, intf);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(intf, &vty_e1d->interfaces, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                 vty_dump_intf(vty, intf);</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 style="color: hsl(120, 100%, 40%);">+static int get_remote_pid(int fd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct ucred uc;</span><br><span style="color: hsl(120, 100%, 40%);">+      socklen_t len = sizeof(uc);</span><br><span style="color: hsl(120, 100%, 40%);">+   int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = getsockopt(fd, SOL_SOCKET, SO_PEERCRED, &uc, &len);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    return uc.pid;</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 const struct value_string e1_ts_mode_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  { E1_TS_MODE_OFF,       "OFF" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { E1_TS_MODE_RAW,       "RAW" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { E1_TS_MODE_HDLCFCS,   "HDLC-FCS" },</span><br><span style="color: hsl(120, 100%, 40%);">+       { 0, NULL }</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_line(struct vty *vty, const struct e1_line *line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  int tn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     vty_out(vty, "Interface #%u, Line #%u:%s", line->intf->id, line->id, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (tn = 0; tn < ARRAY_SIZE(line->ts); tn++) {</span><br><span style="color: hsl(120, 100%, 40%);">+         const struct e1_ts *ts = &line->ts[tn];</span><br><span style="color: hsl(120, 100%, 40%);">+                vty_out(vty, " TS%02u: Mode %s, FD %d, Peer PID %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      ts->id, get_value_string(e1_ts_mode_names, ts->mode),</span><br><span style="color: hsl(120, 100%, 40%);">+                   ts->fd, get_remote_pid(ts->fd), 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%);">+DEFUN(show_line, show_line_cmd, "show line [<0-255>]",</span><br><span style="color: hsl(120, 100%, 40%);">+        SHOW_STR "Display information about an E1 Line\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct e1_line *line;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1_intf *intf;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (argc) {</span><br><span style="color: hsl(120, 100%, 40%);">+           int id = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+               intf = e1d_find_intf(vty_e1d, id);</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!intf) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  vty_out(vty, "%% Unknown interface %u%s\n", id, 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%);">+             llist_for_each_entry(line, &intf->lines, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                 vty_dump_line(vty, line);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry(intf, &vty_e1d->interfaces, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       llist_for_each_entry(line, &intf->lines, list)</span><br><span style="color: hsl(120, 100%, 40%);">+                         vty_dump_line(vty, line);</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 style="color: hsl(120, 100%, 40%);">+void e1d_vty_init(struct e1_daemon *e1d)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_e1d = e1d;</span><br><span style="color: hsl(120, 100%, 40%);">+        install_element_ve(&show_intf_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element_ve(&show_line_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-e1d/+/19036">change 19036</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-e1d/+/19036"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-e1d </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I47b6e4efaad52e68e2b50a7993076f3706f86628 </div>
<div style="display:none"> Gerrit-Change-Number: 19036 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Assignee: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>