<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>