<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-abis/+/18248">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">WIP: unixsocket: Add support for TRAU frames<br><br>Change-Id: I4baa02f061cc05c8364dc7169cd9b70f07b0615a<br>---<br>M include/osmocom/abis/unixsocket_proto.h<br>M src/input/unixsocket.c<br>2 files changed, 52 insertions(+), 18 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/48/18248/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/abis/unixsocket_proto.h b/include/osmocom/abis/unixsocket_proto.h</span><br><span>index 25718ff..08e511e 100644</span><br><span>--- a/include/osmocom/abis/unixsocket_proto.h</span><br><span>+++ b/include/osmocom/abis/unixsocket_proto.h</span><br><span>@@ -11,6 +11,7 @@</span><br><span> *</span><br><span> * data: | 0x1 | 0x0 | lapd ..|</span><br><span> * control: | 0x1 | 0x1 | control payload |</span><br><span style="color: hsl(120, 100%, 40%);">+ * traffic: | 0x1 | 0x2 | timeslot | rae E1 bitstream data |</span><br><span> *</span><br><span> * Atm there is only one control packet:</span><br><span> * - set_altc (superchannel or timeslot)</span><br><span>@@ -26,6 +27,7 @@</span><br><span> enum {</span><br><span> UNIXSOCKET_PROTO_DATA = 0x0,</span><br><span> UNIXSOCKET_PROTO_CONTROL = 0x1,</span><br><span style="color: hsl(120, 100%, 40%);">+ UNIXSOCKET_PROTO_TRAFFIC = 0x2,</span><br><span> };</span><br><span> </span><br><span> #endif /* UNIXSOCKET_PROTO_H */</span><br><span>diff --git a/src/input/unixsocket.c b/src/input/unixsocket.c</span><br><span>index cfb4979..c99b801 100644</span><br><span>--- a/src/input/unixsocket.c</span><br><span>+++ b/src/input/unixsocket.c</span><br><span>@@ -80,6 +80,7 @@</span><br><span> {</span><br><span> struct e1inp_line *line = bfd->data;</span><br><span> struct msgb *msg = msgb_alloc(UNIXSOCKET_ALLOC_SIZE, "UNIXSOCKET TS");</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ts_nr;</span><br><span> uint8_t version;</span><br><span> uint8_t controldata;</span><br><span> int ret;</span><br><span>@@ -117,11 +118,19 @@</span><br><span> </span><br><span> switch (controldata) {</span><br><span> case UNIXSOCKET_PROTO_DATA:</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: don't blindly assume TS0 is the signaling slot */</span><br><span> return e1inp_rx_ts_lapd(&line->ts[0], msg);</span><br><span> case UNIXSOCKET_PROTO_CONTROL:</span><br><span> LOGPIL(line, DLMI, LOGL_ERROR, "received (invalid) control message.");</span><br><span> ret = -1;</span><br><span> break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case UNIXSOCKET_PROTO_TRAFFIC:</span><br><span style="color: hsl(120, 100%, 40%);">+ ts_nr = msgb_pull_u8(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ts_nr >= line->num_ts) {</span><br><span style="color: hsl(120, 100%, 40%);">+ ret = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else</span><br><span style="color: hsl(120, 100%, 40%);">+ return e1inp_rx_ts(&line->ts[ts_nr], msg, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span> default:</span><br><span> LOGPIL(line, DLMI, LOGL_ERROR, "received invalid message.");</span><br><span> ret = -1;</span><br><span>@@ -143,29 +152,52 @@</span><br><span> static int unixsocket_write_cb(struct osmo_fd *bfd)</span><br><span> {</span><br><span> struct e1inp_line *line = bfd->data;</span><br><span style="color: hsl(0, 100%, 40%);">- struct e1inp_ts *e1i_ts = &line->ts[0];</span><br><span style="color: hsl(0, 100%, 40%);">- struct msgb *msg;</span><br><span style="color: hsl(0, 100%, 40%);">- struct e1inp_sign_link *sign_link;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span> </span><br><span> bfd->when &= ~BSC_FD_WRITE;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* get the next msg for this timeslot */</span><br><span style="color: hsl(0, 100%, 40%);">- msg = e1inp_tx_ts(e1i_ts, &sign_link);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!msg) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* no message after tx delay timer */</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPITS(e1i_ts, DLINP, LOGL_INFO, "no message available (line=%p)\n", line);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < line->num_ts; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct e1inp_ts *e1i_ts = &line->ts[i];</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%);">+ int rc;</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%);">+ LOGPITS(e1i_ts, DLINP, LOGL_INFO, "no message available (line=%p)\n", line);</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%);">+ LOGPITS(e1i_ts, DLINP, LOGL_DEBUG, "sending: %s (line=%p)\n", msgb_hexdump(msg), line);</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%);">+ lapd_transmit(e1i_ts->lapd, sign_link->tei, sign_link->sapi, msg);</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_ts1_write, e1i_ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);</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%);">+ msgb_push_u8(msg, i); /* timeslot number */</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_push_u8(msg, UNIXSOCKET_PROTO_TRAFFIC);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_push_u8(msg, UNIXSOCKET_PROTO_VERSION);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = write(bfd->fd, msg->data, msg->len);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < msg->len) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "write returne d%d instead of %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ rc, msg->len);</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_free(msg);</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%);">+ msgb_free(msg);</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%);">+ LOGPITS(e1i_ts, DLINP, LOGL_ERROR, "unsupported timeslot type %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ e1inp_tstype_name(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> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* set tx delay timer for next event */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_setup(&e1i_ts->sign.tx_timer, timeout_ts1_write, e1i_ts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&e1i_ts->sign.tx_timer, 0, e1i_ts->sign.delay);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGPITS(e1i_ts, DLINP, LOGL_DEBUG, "sending: %s (line=%p)\n", msgb_hexdump(msg), line);</span><br><span style="color: hsl(0, 100%, 40%);">- lapd_transmit(e1i_ts->lapd, sign_link->tei,</span><br><span style="color: hsl(0, 100%, 40%);">- sign_link->sapi, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> return 0;</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/+/18248">change 18248</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/+/18248"/><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: I4baa02f061cc05c8364dc7169cd9b70f07b0615a </div>
<div style="display:none"> Gerrit-Change-Number: 18248 </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>