<p>laforge would like tnt to <strong>review</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/14867">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[hack] e1d support<br><br>Change-Id: Ia0431c124e3b5b4108aee7b109d8c4bb0d8b45d4<br>Signed-off-by: Sylvain Munaut <tnt@246tNt.com><br>---<br>M configure.ac<br>M include/osmocom/abis/e1_input.h<br>M src/Makefile.am<br>M src/e1_input.c<br>M src/e1_input_vty.c<br>A src/input/e1d.c<br>6 files changed, 312 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/67/14867/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 ba33ed9..bed357d 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -66,6 +66,27 @@</span><br><span> </span><br><span> AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built))</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE([e1d],</span><br><span style="color: hsl(120, 100%, 40%);">+   [AS_HELP_STRING(</span><br><span style="color: hsl(120, 100%, 40%);">+              [--enable-e1d],</span><br><span style="color: hsl(120, 100%, 40%);">+               [Enable osmo-e1d driver support]</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%);">+             ENABLE_E1D=$enableval</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%);">+             ENABLE_E1D="no"</span><br><span style="color: hsl(120, 100%, 40%);">+     ])</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$ENABLE_E1D" = "xyes"], [</span><br><span style="color: hsl(120, 100%, 40%);">+       PKG_CHECK_MODULES(LIBOSMOE1D, libosmo-e1d)</span><br><span style="color: hsl(120, 100%, 40%);">+])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(ENABLE_E1D, test "x$ENABLE_E1D" = "xyes")</span><br><span style="color: hsl(120, 100%, 40%);">+AC_SUBST(ENABLE_E1D)</span><br><span style="color: hsl(120, 100%, 40%);">+if test x"$ENABLE_E1D" = x"yes"</span><br><span style="color: hsl(120, 100%, 40%);">+then</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_DEFINE([HAVE_E1D], [1], [Enable osmo-e1d driver support])</span><br><span style="color: hsl(120, 100%, 40%);">+fi</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> AC_ARG_ENABLE(sanitize,</span><br><span>         [AS_HELP_STRING(</span><br><span>             [--enable-sanitize],</span><br><span>diff --git a/include/osmocom/abis/e1_input.h b/include/osmocom/abis/e1_input.h</span><br><span>index e6d5154..741d679 100644</span><br><span>--- a/include/osmocom/abis/e1_input.h</span><br><span>+++ b/include/osmocom/abis/e1_input.h</span><br><span>@@ -123,6 +123,10 @@</span><br><span>                         struct osmo_fd fd;</span><br><span>           } dahdi;</span><br><span>             struct {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* osmo-e1d driver has one fd for each ts */</span><br><span style="color: hsl(120, 100%, 40%);">+                  struct osmo_fd fd;</span><br><span style="color: hsl(120, 100%, 40%);">+            } e1d;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct {</span><br><span>                     struct osmo_fd fd;</span><br><span>           } rs232;</span><br><span>     } driver;</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index 2d2424d..e8f07a1 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -5,9 +5,9 @@</span><br><span> TRAU_LIBVERSION=3:2:1</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 $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(COVERAGE_CFLAGS)</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CFLAGS= -Wall $(LIBOSMOCORE_CFLAGS) $(LIBOSMOGSM_CFLAGS) $(LIBOSMOVTY_CFLAGS) $(LIBOSMOE1D_CFLAGS) $(COVERAGE_CFLAGS)</span><br><span> AM_LDFLAGS = $(COVERAGE_LDFLAGS)</span><br><span style="color: hsl(0, 100%, 40%);">-COMMONLIBS = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+COMMONLIBS = $(LIBOSMOCORE_LIBS) $(LIBOSMOGSM_LIBS) $(LIBOSMOVTY_LIBS) $(LIBOSMOE1D_LIBS)</span><br><span> </span><br><span> lib_LTLIBRARIES = libosmoabis.la libosmotrau.la</span><br><span> </span><br><span>@@ -20,6 +20,7 @@</span><br><span>                         subchan_demux.c \</span><br><span>                    trau_frame.c \</span><br><span>                       input/dahdi.c \</span><br><span style="color: hsl(120, 100%, 40%);">+                       input/e1d.c \</span><br><span>                        input/ipa.c \</span><br><span>                        input/ipa_keepalive.c \</span><br><span>                      input/ipaccess.c \</span><br><span>diff --git a/src/e1_input.c b/src/e1_input.c</span><br><span>index 4717830..ca24e11 100644</span><br><span>--- a/src/e1_input.c</span><br><span>+++ b/src/e1_input.c</span><br><span>@@ -877,6 +877,9 @@</span><br><span> #ifdef HAVE_DAHDI_USER_H</span><br><span>   e1inp_dahdi_init();</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef ENABLE_E1D</span><br><span style="color: hsl(120, 100%, 40%);">+      e1inp_e1d_init();</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>    e1inp_ipaccess_init();</span><br><span>       e1inp_rs232_init();</span><br><span>  e1inp_unixsocket_init();</span><br><span>diff --git a/src/e1_input_vty.c b/src/e1_input_vty.c</span><br><span>index d81c859..a1943e6 100644</span><br><span>--- a/src/e1_input_vty.c</span><br><span>+++ b/src/e1_input_vty.c</span><br><span>@@ -41,7 +41,7 @@</span><br><span> </span><br><span> /* CONFIG */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define E1_DRIVER_NAMES                "(misdn|misdn_lapd|dahdi|ipa|unixsocket)"</span><br><span style="color: hsl(120, 100%, 40%);">+#define E1_DRIVER_NAMES            "(misdn|misdn_lapd|dahdi|e1d|ipa|unixsocket)"</span><br><span> #define E1_DRIVER_HELP               "mISDN supported E1 Card (kernel LAPD)\n" \</span><br><span>                                "mISDN supported E1 Card (userspace LAPD)\n" \</span><br><span>                             "DAHDI supported E1/T1/J1 Card\n" \</span><br><span>diff --git a/src/input/e1d.c b/src/input/e1d.c</span><br><span>new file mode 100644</span><br><span>index 0000000..ceeb0c2</span><br><span>--- /dev/null</span><br><span>+++ b/src/input/e1d.c</span><br><span>@@ -0,0 +1,280 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* OpenBSC Abis input driver for osmo-e1d */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2019 by Sylvain Munaut <tnt@246tNt.com></span><br><span style="color: hsl(120, 100%, 40%);">+ *</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%);">+ * SPDX-License-Identifier: GPL-2.0+</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 General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 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 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 General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</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%);">+#include "config.h"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_E1D</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <string.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/bits.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/vty.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/subchan_demux.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/e1_input.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/abis/lapd.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 <osmocom/e1d/proto_clnt.h></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 TS_SIGN_ALLOC_SIZE  300</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_e1dp_client *g_e1d;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* pre-declaration */</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct e1inp_driver e1d_driver;</span><br><span style="color: hsl(120, 100%, 40%);">+static int e1d_want_write(struct e1inp_ts *e1i_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%);">+static int</span><br><span style="color: hsl(120, 100%, 40%);">+handle_ts_sign_read(struct osmo_fd *bfd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct e1inp_line *line = bfd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int ts_nr = bfd->priv_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];</span><br><span style="color: hsl(120, 100%, 40%);">+       struct msgb *msg = msgb_alloc(TS_SIGN_ALLOC_SIZE, "E1D Signaling TS");</span><br><span style="color: hsl(120, 100%, 40%);">+      int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!msg)</span><br><span style="color: hsl(120, 100%, 40%);">+             return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     ret = read(bfd->fd, msg->data, TS_SIGN_ALLOC_SIZE - 16);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ret < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             perror("read ");</span><br><span style="color: hsl(120, 100%, 40%);">+            return ret;</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%);">+   msgb_put(msg, ret);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ret <= 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            perror("read ");</span><br><span style="color: hsl(120, 100%, 40%);">+            return ret;</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 e1inp_rx_ts_lapd(e1i_ts, msg);</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</span><br><span style="color: hsl(120, 100%, 40%);">+timeout_ts_sign_write(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct e1inp_ts *e1i_ts = (struct e1inp_ts *)data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* trigger write of ts1, due to tx delay timer */</span><br><span style="color: hsl(120, 100%, 40%);">+     e1d_want_write(e1i_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%);">+static int</span><br><span style="color: hsl(120, 100%, 40%);">+handle_ts_sign_write(struct osmo_fd *bfd)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct e1inp_line *line = bfd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int ts_nr = bfd->priv_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];</span><br><span style="color: hsl(120, 100%, 40%);">+  struct e1inp_sign_link *sign_link;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   bfd->when &= ~BSC_FD_WRITE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* get the next msg for this timeslot */</span><br><span style="color: hsl(120, 100%, 40%);">+      msg = e1inp_tx_ts(e1i_ts, &sign_link);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+           /* no message after tx delay timer */</span><br><span style="color: hsl(120, 100%, 40%);">+         return 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%);">+   DEBUGP(DLMI, "TX: %s\n", osmo_hexdump(msg->data, msg->len));</span><br><span style="color: hsl(120, 100%, 40%);">+  lapd_transmit(e1i_ts->lapd, sign_link->tei,</span><br><span style="color: hsl(120, 100%, 40%);">+             sign_link->sapi, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* set tx delay timer for next event */</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_timer_setup(&e1i_ts->sign.tx_timer, timeout_ts_sign_write, e1i_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, 50000);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return 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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_write_msg(struct msgb *msg, void *cbdata)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_fd *bfd = cbdata;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_line *line = bfd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int ts_nr = bfd->priv_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_ts *e1i_ts = &line->ts[ts_nr-1];</span><br><span style="color: hsl(120, 100%, 40%);">+  int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ret = write(bfd->fd, msg->data, msg->len);</span><br><span style="color: hsl(120, 100%, 40%);">+   msgb_free(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (ret < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGP(DLMI, LOGL_NOTICE, "%s write failed %d\n", __func__, ret);</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</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_fd_cb(struct osmo_fd *bfd, unsigned int what)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct e1inp_line *line = bfd->data;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int ts_nr = bfd->priv_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int idx = ts_nr-1;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct e1inp_ts *e1i_ts = &line->ts[idx];</span><br><span style="color: hsl(120, 100%, 40%);">+       int ret = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (e1i_ts->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case E1INP_TS_TYPE_SIGN:</span><br><span style="color: hsl(120, 100%, 40%);">+              //if (what & BSC_FD_EXCEPT)</span><br><span style="color: hsl(120, 100%, 40%);">+               //FIXME: what to do ?!?!</span><br><span style="color: hsl(120, 100%, 40%);">+              if (what & BSC_FD_READ)</span><br><span style="color: hsl(120, 100%, 40%);">+                   ret = handle_ts_sign_read(bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+               if (what & BSC_FD_WRITE)</span><br><span style="color: hsl(120, 100%, 40%);">+                  ret = handle_ts_sign_write(bfd);</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%);">+              LOGP(DLINP, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                      "unknown/unsupported E1 TS type %u\n", e1i_ts->type);</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%);">+   return ret;</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 int</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_want_write(struct e1inp_ts *e1i_ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* We never include the DAHDI B-Channel FD into the writeset */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (e1i_ts->type == E1INP_TS_TYPE_TRAU) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DLINP, LOGL_DEBUG, "Trying to write TRAU ts\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               return 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%);">+   e1i_ts->driver.e1d.fd.when |= BSC_FD_WRITE;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return 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%);">+static int</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_line_update(struct e1inp_line *line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int ts;</span><br><span style="color: hsl(120, 100%, 40%);">+       int ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (line->driver != &e1d_driver)</span><br><span style="color: hsl(120, 100%, 40%);">+               return -EINVAL;</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%);">+   LOGP(DLINP, LOGL_ERROR, "Line update %d %d %d\n", line->num, line->port_nr, line->num_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       for (ts=1; ts<line->num_ts; ts++)</span><br><span style="color: hsl(120, 100%, 40%);">+       {</span><br><span style="color: hsl(120, 100%, 40%);">+             unsigned int idx = ts-1;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct e1inp_ts *e1i_ts = &line->ts[idx];</span><br><span style="color: hsl(120, 100%, 40%);">+              struct osmo_fd *bfd = &e1i_ts->driver.e1d.fd;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* unregister FD if it was already registered */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (bfd->list.next && bfd->list.next != LLIST_POISON1)</span><br><span style="color: hsl(120, 100%, 40%);">+                  osmo_fd_unregister(bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            bfd->data = line;</span><br><span style="color: hsl(120, 100%, 40%);">+          bfd->priv_nr = ts;</span><br><span style="color: hsl(120, 100%, 40%);">+         bfd->cb = e1d_fd_cb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             switch (e1i_ts->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+            case E1INP_TS_TYPE_NONE:</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* close/release LAPD instance, if any */</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (e1i_ts->lapd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                                lapd_instance_free(e1i_ts->lapd);</span><br><span style="color: hsl(120, 100%, 40%);">+                          e1i_ts->lapd = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (bfd->fd) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             close(bfd->fd);</span><br><span style="color: hsl(120, 100%, 40%);">+                            bfd->fd = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                       }</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+          case E1INP_TS_TYPE_SIGN:</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (bfd->fd <= 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                               bfd->fd = osmo_e1dp_client_ts_open(g_e1d, 0, 0, ts, E1DP_TSMODE_HDLCFCS);</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (bfd->fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              LOGP(DLINP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       "Could not open timeslot %d\n", ts);</span><br><span style="color: hsl(120, 100%, 40%);">+                                return -EIO;</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+                     bfd->when = BSC_FD_READ | BSC_FD_EXCEPT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (!e1i_ts->lapd)</span><br><span style="color: hsl(120, 100%, 40%);">+                         e1i_ts->lapd = lapd_instance_alloc(1,</span><br><span style="color: hsl(120, 100%, 40%);">+                                      e1d_write_msg, bfd, e1inp_dlsap_up,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   e1i_ts, &lapd_profile_abis);</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1INP_TS_TYPE_HDLC:</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1INP_TS_TYPE_TRAU:</span><br><span style="color: hsl(120, 100%, 40%);">+                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1INP_TS_TYPE_RAW:</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%);">+          ret = osmo_fd_register(bfd);</span><br><span style="color: hsl(120, 100%, 40%);">+          if (ret < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DLINP, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                               "could not register FD: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                              strerror(ret));</span><br><span style="color: hsl(120, 100%, 40%);">+                       return ret;</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 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%);">+static void</span><br><span style="color: hsl(120, 100%, 40%);">+e1d_vty_show(struct vty *vty, struct e1inp_line *line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        /* FIXME */</span><br><span style="color: hsl(120, 100%, 40%);">+   vty_out(vty, "Not supported yet%s", 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%);">+struct e1inp_driver e1d_driver = {</span><br><span style="color: hsl(120, 100%, 40%);">+        .name        = "e1d",</span><br><span style="color: hsl(120, 100%, 40%);">+       .want_write  = e1d_want_write,</span><br><span style="color: hsl(120, 100%, 40%);">+        .line_update = e1d_line_update,</span><br><span style="color: hsl(120, 100%, 40%);">+       .vty_show    = e1d_vty_show,</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%);">+int</span><br><span style="color: hsl(120, 100%, 40%);">+e1inp_e1d_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Connect to daemon */</span><br><span style="color: hsl(120, 100%, 40%);">+       g_e1d = osmo_e1dp_client_create(NULL, "/tmp/osmo-e1d.ctl");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!g_e1d) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DLINP, LOGL_ERROR, "Unable to connect to osmo-e1d daemon\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EPIPE;</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%);">+   /* register the driver with the core */</span><br><span style="color: hsl(120, 100%, 40%);">+       return e1inp_driver_register(&e1d_driver);</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 /* HAVE_E1D */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/14867">change 14867</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/libosmo-abis/+/14867"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-abis </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ia0431c124e3b5b4108aee7b109d8c4bb0d8b45d4 </div>
<div style="display:none"> Gerrit-Change-Number: 14867 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: tnt <tnt@246tNt.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>