<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-e1d/+/19046">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">factor-out core E1 mux/demux functions to intf_line.c<br><br>This way we can de-couple the E1 mux/demux from the specific USB<br>interface code that the current hardware uses.<br><br>Change-Id: I9ab11617e70697b84c85f7793f118fb8c915997b<br>---<br>M src/e1d.h<br>M src/intf_line.c<br>M src/usb.c<br>3 files changed, 99 insertions(+), 70 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/46/19046/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/e1d.h b/src/e1d.h</span><br><span>index 0cc1993..39df28e 100644</span><br><span>--- a/src/e1d.h</span><br><span>+++ b/src/e1d.h</span><br><span>@@ -109,6 +109,12 @@</span><br><span> int</span><br><span> _e1_tx_hdlcfs(struct e1_ts *ts, uint8_t *buf, int len);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int</span><br><span style="color: hsl(120, 100%, 40%);">+_e1_mux_out(struct e1_line *line, uint8_t *buf, int fts);</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%);">+_e1_demux_in(struct e1_line *line, const uint8_t *buf, int size);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void e1d_vty_init(struct e1_daemon *e1d);</span><br><span> </span><br><span> void</span><br><span>diff --git a/src/intf_line.c b/src/intf_line.c</span><br><span>index 0dfa3fc..33edf05 100644</span><br><span>--- a/src/intf_line.c</span><br><span>+++ b/src/intf_line.c</span><br><span>@@ -201,3 +201,92 @@</span><br><span> </span><br><span>    return len;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! generate (multiplex) output data for the specified e1_line</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] line E1 line for which to genrate output data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] buf caller-allocated output buffer for multiplexed data</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] fts number of E1 frames (32 bytes each) to generate</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return number of bytes written to buf */</span><br><span style="color: hsl(120, 100%, 40%);">+int</span><br><span style="color: hsl(120, 100%, 40%);">+_e1_mux_out(struct e1_line *line, uint8_t *buf, int fts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int tsz;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Prepare */</span><br><span style="color: hsl(120, 100%, 40%);">+ tsz = 32 * fts;</span><br><span style="color: hsl(120, 100%, 40%);">+       memset(buf, 0xff, tsz);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Scan timeslots */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (int tsn=1; tsn<32; tsn++)</span><br><span style="color: hsl(120, 100%, 40%);">+     {</span><br><span style="color: hsl(120, 100%, 40%);">+             struct e1_ts *ts = &line->ts[tsn];</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t buf_ts[fts];</span><br><span style="color: hsl(120, 100%, 40%);">+          int l;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ts->mode == E1_TS_MODE_OFF)</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%);">+           switch (ts->mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1_TS_MODE_RAW:</span><br><span style="color: hsl(120, 100%, 40%);">+                  l = read(ts->fd, buf_ts, fts);</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1_TS_MODE_HDLCFCS:</span><br><span style="color: hsl(120, 100%, 40%);">+                      l = _e1_tx_hdlcfs(ts, buf_ts, fts);</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%);">+                      continue;</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 (l <= 0)</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%);">+           for (int i=0; i<l; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                    buf[tsn+(i*32)] = buf_ts[i];</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 tsz;</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%);">+/*! de-multiplex E1 line data to the individual timeslots.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] line E1 line on which we operate.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] buf buffer containing multiplexed frame-aligned E1 data.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] size size of 'buf' in octets; assumed to be multiple of E1 frame size (32).</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negative on error */</span><br><span style="color: hsl(120, 100%, 40%);">+int</span><br><span style="color: hsl(120, 100%, 40%);">+_e1_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%);">+        int ftr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (size <= 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DXFR, LOGL_ERROR, "IN ERROR: %d\n", size);</span><br><span style="color: hsl(120, 100%, 40%);">+             return -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%);">+   ftr = size / 32;</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(size % 32 == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (int tsn=1; tsn<32; tsn++)</span><br><span style="color: hsl(120, 100%, 40%);">+     {</span><br><span style="color: hsl(120, 100%, 40%);">+             struct e1_ts *ts = &line->ts[tsn];</span><br><span style="color: hsl(120, 100%, 40%);">+             uint8_t buf_ts[ftr];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (ts->mode == E1_TS_MODE_OFF)</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%);">+           for (int i=0; i<ftr; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+                  buf_ts[i] = buf[tsn+(i*32)];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                switch (ts->mode) {</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1_TS_MODE_RAW:</span><br><span style="color: hsl(120, 100%, 40%);">+                  write(ts->fd, buf_ts, ftr);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case E1_TS_MODE_HDLCFCS:</span><br><span style="color: hsl(120, 100%, 40%);">+                      _e1_rx_hdlcfs(ts, buf_ts, ftr);</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%);">+                      continue;</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>diff --git a/src/usb.c b/src/usb.c</span><br><span>index 8938a78..59bcac8 100644</span><br><span>--- a/src/usb.c</span><br><span>+++ b/src/usb.c</span><br><span>@@ -107,40 +107,7 @@</span><br><span> static int</span><br><span> e1_usb_xfer_in(struct e1_usb_flow *flow, uint8_t *buf, int size)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct e1_line *line = flow->line;</span><br><span style="color: hsl(0, 100%, 40%);">-   int ftr;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        if (size <= 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DXFR, LOGL_ERROR, "IN ERROR: %d\n", size);</span><br><span style="color: hsl(0, 100%, 40%);">-               return -1;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       ftr = (size - 4) / 32;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  for (int tsn=1; tsn<32; tsn++)</span><br><span style="color: hsl(0, 100%, 40%);">-       {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct e1_ts *ts = &line->ts[tsn];</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t buf_ts[32];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-             if (ts->mode == E1_TS_MODE_OFF)</span><br><span style="color: hsl(0, 100%, 40%);">-                      continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               for (int i=0; i<ftr; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                    buf_ts[i] = buf[4+tsn+(i*32)];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          switch (ts->mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-          case E1_TS_MODE_RAW:</span><br><span style="color: hsl(0, 100%, 40%);">-                    write(ts->fd, buf_ts, ftr);</span><br><span style="color: hsl(0, 100%, 40%);">-                  break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case E1_TS_MODE_HDLCFCS:</span><br><span style="color: hsl(0, 100%, 40%);">-                        _e1_rx_hdlcfs(ts, buf_ts, ftr);</span><br><span style="color: hsl(0, 100%, 40%);">-                 break;</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     return _e1_demux_in(flow->line, buf, size - 4);</span><br><span> }</span><br><span> </span><br><span> static int</span><br><span>@@ -148,7 +115,7 @@</span><br><span> {</span><br><span>         struct e1_line *line = flow->line;</span><br><span>        struct e1_usb_line_data *ld = (struct e1_usb_line_data *) line->drv_data;</span><br><span style="color: hsl(0, 100%, 40%);">-    int fts, tsz;</span><br><span style="color: hsl(120, 100%, 40%);">+ int fts;</span><br><span> </span><br><span>         if (size <= 0) {</span><br><span>          LOGP(DXFR, LOGL_ERROR, "OUT ERROR: %d\n", size);</span><br><span>@@ -166,42 +133,9 @@</span><br><span>    if (ld->r_acc & 0x80000000)</span><br><span>           ld->r_acc = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   /* Prepare */</span><br><span style="color: hsl(0, 100%, 40%);">-   tsz = 4 + 32 * fts;</span><br><span style="color: hsl(0, 100%, 40%);">-     memset(buf, 0xff, tsz);</span><br><span style="color: hsl(120, 100%, 40%);">+       memset(buf, 0xff, 4);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* Header */</span><br><span style="color: hsl(0, 100%, 40%);">-            /* FIXME */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* Scan timeslots */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (int tsn=1; tsn<32; tsn++)</span><br><span style="color: hsl(0, 100%, 40%);">-       {</span><br><span style="color: hsl(0, 100%, 40%);">-               struct e1_ts *ts = &line->ts[tsn];</span><br><span style="color: hsl(0, 100%, 40%);">-               uint8_t buf_ts[32];</span><br><span style="color: hsl(0, 100%, 40%);">-             int l;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-          if (ts->mode == E1_TS_MODE_OFF)</span><br><span style="color: hsl(0, 100%, 40%);">-                      continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               switch (ts->mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-          case E1_TS_MODE_RAW:</span><br><span style="color: hsl(0, 100%, 40%);">-                    l = read(ts->fd, buf_ts, fts);</span><br><span style="color: hsl(0, 100%, 40%);">-                       break;</span><br><span style="color: hsl(0, 100%, 40%);">-          case E1_TS_MODE_HDLCFCS:</span><br><span style="color: hsl(0, 100%, 40%);">-                        l = _e1_tx_hdlcfs(ts, buf_ts, fts);</span><br><span style="color: hsl(0, 100%, 40%);">-                     break;</span><br><span style="color: hsl(0, 100%, 40%);">-          default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        continue;</span><br><span style="color: hsl(0, 100%, 40%);">-               }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               if (l <= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  continue;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               for (int i=0; i<l; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-                      buf[4+tsn+(i*32)] = buf_ts[i];</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return tsz;</span><br><span style="color: hsl(120, 100%, 40%);">+   return _e1_mux_out(line, buf+4, fts);</span><br><span> }</span><br><span> </span><br><span> static int</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-e1d/+/19046">change 19046</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/+/19046"/><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: I9ab11617e70697b84c85f7793f118fb8c915997b </div>
<div style="display:none"> Gerrit-Change-Number: 19046 </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>