<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/16825">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">e1d: Implement varions non-LAPD timeslot modes<br><br>So far, the e1d input driver only contained code for LAPD signaling<br>slots, let's extend it with support for all the other slot types, as<br>well as support for run-time re-configuration.<br><br>Change-Id: I53369004145681bf9178543fe407dfc75e4ae63a<br>---<br>M src/input/e1d.c<br>1 file changed, 56 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-abis refs/changes/25/16825/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/input/e1d.c b/src/input/e1d.c</span><br><span>index c32e330..2f129f5 100644</span><br><span>--- a/src/input/e1d.c</span><br><span>+++ b/src/input/e1d.c</span><br><span>@@ -182,6 +182,8 @@</span><br><span>    * resulting in max. 16 interfaces with 16 lines each */</span><br><span>     uint8_t e1d_intf = (line->port_nr >> 4) & 0xF;</span><br><span>  uint8_t e1d_line = line->port_nr & 0xF;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_e1dp_ts_info *ts_info;</span><br><span style="color: hsl(120, 100%, 40%);">+    int num_ts_info;</span><br><span> </span><br><span>         if (line->driver != &e1d_driver)</span><br><span>              return -EINVAL;</span><br><span>@@ -198,6 +200,12 @@</span><br><span>       LOGPIL(line, DLINP, LOGL_NOTICE, "Line update %d %d=E1D(%d:%d) %d\n", line->num, line->port_nr,</span><br><span>              e1d_intf, e1d_line, line->num_ts);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     ret = osmo_e1dp_client_ts_query(g_e1d, &ts_info, &num_ts_info, e1d_intf, e1d_line, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (ret < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPIL(line, DLINP, LOGL_ERROR, "Cannot query E1D for timeslot information: %d\n", ret);</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%);">+</span><br><span>  for (ts=1; ts<line->num_ts; ts++)</span><br><span>      {</span><br><span>            unsigned int idx = ts-1;</span><br><span>@@ -212,6 +220,12 @@</span><br><span>              bfd->priv_nr = ts;</span><br><span>                bfd->cb = e1d_fd_cb;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+           if (e1i_ts->type != E1INP_TS_TYPE_NONE && ts >= num_ts_info) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "Timeslot configured, but not existant "</span><br><span style="color: hsl(120, 100%, 40%);">+                         "on E1D side; skipping\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>          switch (e1i_ts->type) {</span><br><span>           case E1INP_TS_TYPE_NONE:</span><br><span>                     /* close/release LAPD instance, if any */</span><br><span>@@ -225,6 +239,10 @@</span><br><span>                     }</span><br><span>                         continue;</span><br><span>               case E1INP_TS_TYPE_SIGN:</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (bfd->fd > 0 && ts_info[ts].cfg.mode != E1DP_TSMODE_HDLCFCS) {</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>                    if (bfd->fd <= 0) {</span><br><span>                            bfd->fd = osmo_e1dp_client_ts_open(g_e1d, e1d_intf, e1d_line, ts,</span><br><span>                                                                    E1DP_TSMODE_HDLCFCS);</span><br><span>@@ -241,10 +259,47 @@</span><br><span>                                     e1i_ts, &lapd_profile_abis);</span><br><span>                     break;</span><br><span>               case E1INP_TS_TYPE_HDLC:</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%);">+                     /* close, if old timeslot mode doesn't match new config */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (bfd->fd > 0 && ts_info[ts].cfg.mode != E1DP_TSMODE_HDLCFCS) {</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%);">+                     if (bfd->fd <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             bfd->fd = osmo_e1dp_client_ts_open(g_e1d, e1d_intf, e1d_line, ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             E1DP_TSMODE_HDLCFCS);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (bfd->fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "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;</span><br><span>                  break;</span><br><span>               case E1INP_TS_TYPE_TRAU:</span><br><span style="color: hsl(0, 100%, 40%);">-                        break;</span><br><span>               case E1INP_TS_TYPE_RAW:</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%);">+                     /* close, if old timeslot mode doesn't match new config */</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (bfd->fd > 0 && ts_info[ts].cfg.mode != E1DP_TSMODE_RAW) {</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%);">+                     if (bfd->fd <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                             bfd->fd = osmo_e1dp_client_ts_open(g_e1d, e1d_intf, e1d_line, ts,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                             E1DP_TSMODE_RAW);</span><br><span style="color: hsl(120, 100%, 40%);">+                  }</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (bfd->fd < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                              LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "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;</span><br><span>                  break;</span><br><span>               };</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-abis/+/16825">change 16825</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/+/16825"/><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: I53369004145681bf9178543fe407dfc75e4ae63a </div>
<div style="display:none"> Gerrit-Change-Number: 16825 </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>