<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10942">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trxcon/scheduler: introduce TDMA frame math helpers<br><br>The 'normal' math operations, such as addition and substraction,<br>are not applicable for TDMA frame numbers because they may result<br>in out-of-range values.<br><br>Having TDMA frame math helpers in a single place would allow<br>one to avoid possible out-of-range result mistakes.<br><br>Change-Id: Ibb66ba846cc3d6c2eaa88414569e5f3751128047<br>---<br>M src/host/trxcon/sched_clck.c<br>M src/host/trxcon/sched_trx.c<br>M src/host/trxcon/scheduler.h<br>3 files changed, 16 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/42/10942/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/trxcon/sched_clck.c b/src/host/trxcon/sched_clck.c</span><br><span>index 56b89a2..8a9527c 100644</span><br><span>--- a/src/host/trxcon/sched_clck.c</span><br><span>+++ b/src/host/trxcon/sched_clck.c</span><br><span>@@ -84,8 +84,7 @@</span><br><span>             timespecadd(tv_clock, &frame_duration, tv_clock);</span><br><span>                elapsed_us -= FRAME_DURATION_uS;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-            sched->fn_counter_proc = (sched->fn_counter_proc + 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                     % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+             sched->fn_counter_proc = TDMA_FN_INC(sched->fn_counter_proc);</span><br><span> </span><br><span>              /* Call frame callback */</span><br><span>            if (sched->clock_cb)</span><br><span>@@ -143,8 +142,7 @@</span><br><span>        /* Calculate elapsed time / frames since last processed fn */</span><br><span>        timespecsub(&tv_now, tv_clock, &elapsed);</span><br><span>    elapsed_us = (elapsed.tv_sec * 1000000) + (elapsed.tv_nsec / 1000);</span><br><span style="color: hsl(0, 100%, 40%);">-     elapsed_fn = (fn + GSM_HYPERFRAME - sched->fn_counter_proc)</span><br><span style="color: hsl(0, 100%, 40%);">-          % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+     elapsed_fn = TDMA_FN_SUB(fn, sched->fn_counter_proc);</span><br><span> </span><br><span>         if (elapsed_fn >= 135774)</span><br><span>                 elapsed_fn -= GSM_HYPERFRAME;</span><br><span>@@ -182,8 +180,7 @@</span><br><span> </span><br><span>      /* Transmit what we still need to transmit */</span><br><span>        while (fn != sched->fn_counter_proc) {</span><br><span style="color: hsl(0, 100%, 40%);">-               sched->fn_counter_proc = (sched->fn_counter_proc + 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                     % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+             sched->fn_counter_proc = TDMA_FN_INC(sched->fn_counter_proc);</span><br><span> </span><br><span>              /* Call frame callback */</span><br><span>            if (sched->clock_cb)</span><br><span>diff --git a/src/host/trxcon/sched_trx.c b/src/host/trxcon/sched_trx.c</span><br><span>index 8bd3c72..e20da39 100644</span><br><span>--- a/src/host/trxcon/sched_trx.c</span><br><span>+++ b/src/host/trxcon/sched_trx.c</span><br><span>@@ -65,8 +65,8 @@</span><br><span>                  * Advance frame number, giving the transceiver more</span><br><span>                  * time until a burst must be transmitted...</span><br><span>                  */</span><br><span style="color: hsl(0, 100%, 40%);">-             fn = (sched->fn_counter_proc + sched->fn_counter_advance)</span><br><span style="color: hsl(0, 100%, 40%);">-                 % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+             fn = TDMA_FN_SUM(sched->fn_counter_proc,</span><br><span style="color: hsl(120, 100%, 40%);">+                   sched->fn_counter_advance);</span><br><span> </span><br><span>           /* Get frame from multiframe */</span><br><span>              offset = fn % ts->mf_layout->period;</span><br><span>@@ -608,15 +608,14 @@</span><br><span>   }</span><br><span> </span><br><span>        /* Calculate how many frames have been elapsed */</span><br><span style="color: hsl(0, 100%, 40%);">-       elapsed  = (burst_fn + GSM_HYPERFRAME - ts->mf_last_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-     elapsed %= GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+    elapsed = TDMA_FN_SUB(burst_fn, ts->mf_last_fn);</span><br><span> </span><br><span>      /**</span><br><span>   * If not too many frames have been elapsed,</span><br><span>          * start counting from last fn + 1</span><br><span>    */</span><br><span>  if (elapsed < 10)</span><br><span style="color: hsl(0, 100%, 40%);">-            fn = (ts->mf_last_fn + 1) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+                fn = TDMA_FN_INC(ts->mf_last_fn);</span><br><span>         else</span><br><span>                 fn = burst_fn;</span><br><span> </span><br><span>@@ -658,7 +657,7 @@</span><br><span>             if (fn == burst_fn)</span><br><span>                  break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              fn = (fn + 1) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+               fn = TDMA_FN_INC(fn);</span><br><span>        }</span><br><span> </span><br><span>        /* Set last processed frame number */</span><br><span>diff --git a/src/host/trxcon/scheduler.h b/src/host/trxcon/scheduler.h</span><br><span>index 6c3a2f2..6b70b41 100644</span><br><span>--- a/src/host/trxcon/scheduler.h</span><br><span>+++ b/src/host/trxcon/scheduler.h</span><br><span>@@ -8,6 +8,14 @@</span><br><span> #define GSM_SUPERFRAME             (26 * 51)</span><br><span> #define GSM_HYPERFRAME             (2048 * GSM_SUPERFRAME)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* TDMA frame number arithmetics */</span><br><span style="color: hsl(120, 100%, 40%);">+#define TDMA_FN_INC(fn) \</span><br><span style="color: hsl(120, 100%, 40%);">+   ((fn + 1) % GSM_HYPERFRAME)</span><br><span style="color: hsl(120, 100%, 40%);">+#define TDMA_FN_SUM(a, b) \</span><br><span style="color: hsl(120, 100%, 40%);">+      ((a + b) % GSM_HYPERFRAME)</span><br><span style="color: hsl(120, 100%, 40%);">+#define TDMA_FN_SUB(a, b) \</span><br><span style="color: hsl(120, 100%, 40%);">+       ((a + GSM_HYPERFRAME - b) % GSM_HYPERFRAME)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum tdma_sched_clck_state {</span><br><span>        SCH_CLCK_STATE_WAIT,</span><br><span>         SCH_CLCK_STATE_OK,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10942">change 10942</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/10942"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ibb66ba846cc3d6c2eaa88414569e5f3751128047 </div>
<div style="display:none"> Gerrit-Change-Number: 10942 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>