<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/19481">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">i460_mux: add callback to notify empty tx queue<br><br>There is no way for the API user to know if the TX queue of the<br>multiplexer runs empty. However, this is criticil since an empty TX<br>queue will cause dropout of a TRAU frame, which can have quite severe<br>effects to the receiving end. Lets add a callback that allows the APU<br>user to insert appropiate idle frames or silent frames into the queue<br>before it runs empty.<br><br>Change-Id: I88a87724235fe50d55ce6215bb385c044072226e<br>Related: OS#2547<br>---<br>M include/osmocom/gsm/i460_mux.h<br>M src/gsm/i460_mux.c<br>2 files changed, 22 insertions(+), 2 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gsm/i460_mux.h b/include/osmocom/gsm/i460_mux.h</span><br><span>index 2e33b37..dd752db 100644</span><br><span>--- a/include/osmocom/gsm/i460_mux.h</span><br><span>+++ b/include/osmocom/gsm/i460_mux.h</span><br><span>@@ -52,9 +52,13 @@</span><br><span>     void *user_data;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+typedef void (*in_cb_queue_empty_t)(void *user_data);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct osmo_i460_subchan_mux {</span><br><span>        /*! list of to-be-transmitted message buffers */</span><br><span>     struct llist_head tx_queue;</span><br><span style="color: hsl(120, 100%, 40%);">+   in_cb_queue_empty_t in_cb_queue_empty;</span><br><span style="color: hsl(120, 100%, 40%);">+        void *user_data;</span><br><span> };</span><br><span> </span><br><span> struct osmo_i460_subchan {</span><br><span>@@ -87,6 +91,14 @@</span><br><span>                /* opaque user data pointer to pass to out_cb */</span><br><span>             void *user_data;</span><br><span>     } demux;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* call-back function whenever the muxer requires more input data from the sub-channels,</span><br><span style="color: hsl(120, 100%, 40%);">+               * but has nothing enqueued yet. A typical function would then call osmo_i460_mux_enqueue() */</span><br><span style="color: hsl(120, 100%, 40%);">+                in_cb_queue_empty_t in_cb_queue_empty;</span><br><span style="color: hsl(120, 100%, 40%);">+                /* opaque user data pointer to pass to in_cb */</span><br><span style="color: hsl(120, 100%, 40%);">+               void *user_data;</span><br><span style="color: hsl(120, 100%, 40%);">+      } mux;</span><br><span> };</span><br><span> </span><br><span> void osmo_i460_demux_in(struct osmo_i460_timeslot *ts, const uint8_t *data, size_t data_len);</span><br><span>diff --git a/src/gsm/i460_mux.c b/src/gsm/i460_mux.c</span><br><span>index 50cb56e..dfd50e5 100644</span><br><span>--- a/src/gsm/i460_mux.c</span><br><span>+++ b/src/gsm/i460_mux.c</span><br><span>@@ -175,9 +175,15 @@</span><br><span>        ubit_t bit;</span><br><span> </span><br><span>      /* if we don't have anything to transmit, return '1' bits */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (llist_empty(&mux->tx_queue))</span><br><span style="color: hsl(0, 100%, 40%);">-         return 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+  if (llist_empty(&mux->tx_queue)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             /* User code now has a last chance to put something into the queue. */</span><br><span style="color: hsl(120, 100%, 40%);">+                if (mux->in_cb_queue_empty)</span><br><span style="color: hsl(120, 100%, 40%);">+                        mux->in_cb_queue_empty(mux->user_data);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+             /* If the queue is still empty, return idle bits */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (llist_empty(&mux->tx_queue))</span><br><span style="color: hsl(120, 100%, 40%);">+                       return 0x01;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span>    msg = llist_entry(mux->tx_queue.next, struct msgb, list);</span><br><span>         bit = msgb_pull_u8(msg);</span><br><span> </span><br><span>@@ -360,6 +366,8 @@</span><br><span>   schan->demux.out_cb_bits = chd->demux.out_cb_bits;</span><br><span>     schan->demux.out_cb_bytes = chd->demux.out_cb_bytes;</span><br><span>   schan->demux.user_data = chd->demux.user_data;</span><br><span style="color: hsl(120, 100%, 40%);">+  schan->mux.in_cb_queue_empty = chd->mux.in_cb_queue_empty;</span><br><span style="color: hsl(120, 100%, 40%);">+      schan->mux.user_data = chd->mux.user_data;</span><br><span>     rc = alloc_bitbuf(ctx, schan, chd->demux.num_bits);</span><br><span>       if (rc < 0) {</span><br><span>             subchan_reset(schan, false);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/19481">change 19481</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/libosmocore/+/19481"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I88a87724235fe50d55ce6215bb385c044072226e </div>
<div style="display:none"> Gerrit-Change-Number: 19481 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>