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