<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-e1d/+/19036">View Change</a></p><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, 225 insertions(+), 4 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-e1d refs/changes/36/19036/1</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..f6e9311 100644</span><br><span>--- a/src/ctl.c</span><br><span>+++ b/src/ctl.c</span><br><span>@@ -38,7 +38,7 @@</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(120, 100%, 40%);">+struct e1_intf *</span><br><span> _e1d_find_intf(struct e1_daemon *e1d, uint8_t id)</span><br><span> {</span><br><span>      struct e1_intf *intf;</span><br><span>diff --git a/src/e1d.h b/src/e1d.h</span><br><span>index fe3f733..ed5414b 100644</span><br><span>--- a/src/e1d.h</span><br><span>+++ b/src/e1d.h</span><br><span>@@ -82,6 +82,9 @@</span><br><span> };</span><br><span> </span><br><span> 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 style="color: hsl(120, 100%, 40%);">+struct e1_intf *</span><br><span> _e1_intf_new(struct e1_daemon *e1d, void *drv_data);</span><br><span> </span><br><span> struct e1_line *</span><br><span>@@ -92,3 +95,5 @@</span><br><span> </span><br><span> int</span><br><span> _e1_tx_hdlcfs(struct e1_ts *ts, uint8_t *buf, int len);</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>diff --git a/src/osmo-e1d.c b/src/osmo-e1d.c</span><br><span>index 92d98d3..35c1401 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 *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 AGPLv3+: GNU AGPL version 3 or later <http://gnu.org/licenses/agpl-3.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%);">+                     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(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", config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+              return rv;</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..2c7fa81</span><br><span>--- /dev/null</span><br><span>+++ b/src/vty.c</span><br><span>@@ -0,0 +1,132 @@</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 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(osmo_e1dp_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: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>