<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/18874">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  neels: Looks good to me, but someone else must approve
  pespin: Looks good to me, but someone else must approve
  Hoernchen: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use libosmocore's TDMA frame number API (constatns & arithmetic)<br><br>Depends: (libosmocore) Ic291fd3644f34964374227a191c7045d79d77e0d<br>Change-Id: I61c97a62bd5dbbb4a984921ebdfc10ad6ed00f2a<br>---<br>M include/osmo-bts/gsm_data.h<br>M src/common/l1sap.c<br>M src/common/scheduler.c<br>M src/osmo-bts-trx/scheduler_trx.c<br>M src/osmo-bts-trx/trx_if.c<br>M src/osmo-bts-virtual/scheduler_virtbts.c<br>6 files changed, 31 insertions(+), 52 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index 416864f..255c871 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -12,6 +12,7 @@</span><br><span> #include <osmocom/codec/ecu.h></span><br><span> #include <osmocom/gsm/lapdm.h></span><br><span> #include <osmocom/gsm/gsm23003.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm0502.h></span><br><span> #include <osmocom/gsm/gsm_utils.h></span><br><span> #include <osmocom/gsm/tlv.h></span><br><span> #include <osmocom/gsm/rxlev_stat.h></span><br><span>@@ -35,9 +36,6 @@</span><br><span> #define GSM_HR_BYTES     14      /* TS 101318 Chapter 5.2: 112 bits, no sig */</span><br><span> #define GSM_EFR_BYTES  31      /* TS 101318 Chapter 5.3: 244 bits + 4bit sig */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_SUPERFRAME      (26*51)                 /* 1326 TDMA frames */</span><br><span style="color: hsl(0, 100%, 40%);">-#define GSM_HYPERFRAME    (2048*GSM_SUPERFRAME)   /* GSM_HYPERFRAME frames */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DEFAULT 41</span><br><span> #define GSM_BTS_AGCH_QUEUE_THRESH_LEVEL_DISABLE 999999</span><br><span> #define GSM_BTS_AGCH_QUEUE_LOW_LEVEL_DEFAULT 41</span><br><span>diff --git a/src/common/l1sap.c b/src/common/l1sap.c</span><br><span>index dad1b49..17a6c5d 100644</span><br><span>--- a/src/common/l1sap.c</span><br><span>+++ b/src/common/l1sap.c</span><br><span>@@ -621,7 +621,7 @@</span><br><span>    /* increment number of RACH slots that have passed by since the</span><br><span>       * last time indication */</span><br><span>   for (i = 0; i < frames_expired; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               uint32_t fn = (info_time_ind->fn + GSM_HYPERFRAME - i) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+           uint32_t fn = GSM_TDMA_FN_SUB(info_time_ind->fn, i);</span><br><span>              bts->load.rach.total += calc_exprd_rach_frames(bts, fn);</span><br><span>  }</span><br><span> </span><br><span>@@ -891,7 +891,7 @@</span><br><span> </span><br><span> static void l1sap_update_fnstats(struct gsm_bts *bts, uint32_t rts_fn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  int32_t delta = (rts_fn + GSM_HYPERFRAME - bts->gsm_time.fn) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+     int32_t delta = GSM_TDMA_FN_SUB(rts_fn, bts->gsm_time.fn);</span><br><span> </span><br><span>    if (delta < bts->fn_stats.min)</span><br><span>                 bts->fn_stats.min = delta;</span><br><span>diff --git a/src/common/scheduler.c b/src/common/scheduler.c</span><br><span>index 01edc69..62efed4 100644</span><br><span>--- a/src/common/scheduler.c</span><br><span>+++ b/src/common/scheduler.c</span><br><span>@@ -684,7 +684,7 @@</span><br><span>                     LOGL1S(DL1P, LOGL_ERROR, l1t, tn, chan, fn, "Prim has wrong type.\n");</span><br><span>                     goto free_msg;</span><br><span>               }</span><br><span style="color: hsl(0, 100%, 40%);">-               prim_fn = ((l1sap_fn + GSM_HYPERFRAME - fn) % GSM_HYPERFRAME);</span><br><span style="color: hsl(120, 100%, 40%);">+                prim_fn = GSM_TDMA_FN_SUB(l1sap_fn, fn);</span><br><span>             if (prim_fn > 100) { /* l1sap_fn < fn */</span><br><span>                       LOGL1S(DL1P, LOGL_NOTICE, l1t, tn, chan, fn,</span><br><span>                              "Prim %u is out of range (%u vs exp %u), or channel %s with "</span><br><span>@@ -1248,12 +1248,6 @@</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define TDMA_FN_SUM(a, b) \</span><br><span style="color: hsl(0, 100%, 40%);">-   ((a + GSM_HYPERFRAME + b) % GSM_HYPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#define TDMA_FN_SUB(a, b) \</span><br><span style="color: hsl(0, 100%, 40%);">-  ((a + GSM_HYPERFRAME - b) % GSM_HYPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int trx_sched_calc_frame_loss(struct l1sched_trx *l1t,</span><br><span>         struct l1sched_chan_state *l1cs, uint8_t tn, uint32_t fn)</span><br><span> {</span><br><span>@@ -1291,7 +1285,7 @@</span><br><span>       }</span><br><span> </span><br><span>        /* How many frames elapsed since the last one? */</span><br><span style="color: hsl(0, 100%, 40%);">-       elapsed_fs = TDMA_FN_SUB(fn, l1cs->last_tdma_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+  elapsed_fs = GSM_TDMA_FN_SUB(fn, l1cs->last_tdma_fn);</span><br><span>     if (elapsed_fs > l1ts->mf_period) { /* Too many! */</span><br><span>            LOGL1S(DL1P, LOGL_ERROR, l1t, tn, frame_head->ul_chan, fn,</span><br><span>                        "Too many (>%u) contiguous TDMA frames=%u elapsed "</span><br><span>@@ -1310,7 +1304,7 @@</span><br><span>      * Start counting from the last_fn + 1.</span><br><span>       */</span><br><span>  for (i = 1; i < elapsed_fs; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-           fn_i = TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span style="color: hsl(120, 100%, 40%);">+         fn_i = GSM_TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span>            offset = fn_i % l1ts->mf_period;</span><br><span>          frame = l1ts->mf_frames + offset;</span><br><span> </span><br><span>@@ -1343,7 +1337,7 @@</span><br><span>             };</span><br><span> </span><br><span>               for (i = 1; i < elapsed_fs; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   fn_i = TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span style="color: hsl(120, 100%, 40%);">+                 fn_i = GSM_TDMA_FN_SUM(l1cs->last_tdma_fn, i);</span><br><span>                    offset = fn_i % l1ts->mf_period;</span><br><span>                  frame = l1ts->mf_frames + offset;</span><br><span>                         func = trx_chan_desc[frame->ul_chan].ul_fn;</span><br><span>diff --git a/src/osmo-bts-trx/scheduler_trx.c b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>index d4a38b6..3936124 100644</span><br><span>--- a/src/osmo-bts-trx/scheduler_trx.c</span><br><span>+++ b/src/osmo-bts-trx/scheduler_trx.c</span><br><span>@@ -74,7 +74,7 @@</span><br><span> </span><br><span>          /* advance frame number, so the transceiver has more</span><br><span>                  * time until it must be transmitted. */</span><br><span style="color: hsl(0, 100%, 40%);">-                fn = (fn + plink->u.osmotrx.clock_advance) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+               fn = GSM_TDMA_FN_SUM(fn, plink->u.osmotrx.clock_advance);</span><br><span> </span><br><span>             /* we don't schedule, if power is off */</span><br><span>                 if (!trx_if_powered(l1h))</span><br><span>@@ -83,8 +83,7 @@</span><br><span>                /* process every TS of TRX */</span><br><span>                for (tn = 0; tn < ARRAY_SIZE(l1t->ts); tn++) {</span><br><span>                         /* ready-to-send */</span><br><span style="color: hsl(0, 100%, 40%);">-                     _sched_rts(l1t, tn,</span><br><span style="color: hsl(0, 100%, 40%);">-                             (fn + plink->u.osmotrx.rts_advance) % GSM_HYPERFRAME);</span><br><span style="color: hsl(120, 100%, 40%);">+                     _sched_rts(l1t, tn, GSM_TDMA_FN_SUM(fn, plink->u.osmotrx.rts_advance));</span><br><span> </span><br><span>                       /* All other parameters to be set by _sched_dl_burst() */</span><br><span>                    br = (struct trx_dl_burst_req) {</span><br><span>@@ -105,10 +104,6 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! duration of a GSM frame in nano-seconds. (120ms/26) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_nS   4615384</span><br><span style="color: hsl(0, 100%, 40%);">-/*! duration of a GSM frame in micro-seconds (120s/26) */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_uS       (FRAME_DURATION_nS/1000)</span><br><span> /*! maximum number of 'missed' frame periods we can tolerate of OS doesn't schedule us*/</span><br><span> #define MAX_FN_SKEW         50</span><br><span> /*! maximum number of frame periods we can tolerate without TRX Clock Indication*/</span><br><span>@@ -126,9 +121,9 @@</span><br><span> /*! compute the number of frame number intervals elapsed between \a last and \a now */</span><br><span> static inline int compute_elapsed_fn(const uint32_t last, const uint32_t now)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  int elapsed_fn = (now + GSM_HYPERFRAME - last) % GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+      int elapsed_fn = GSM_TDMA_FN_SUB(now, last);</span><br><span>         if (elapsed_fn >= 135774)</span><br><span style="color: hsl(0, 100%, 40%);">-            elapsed_fn -= GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+         elapsed_fn -= GSM_TDMA_HYPERFRAME;</span><br><span>   return elapsed_fn;</span><br><span> }</span><br><span> </span><br><span>@@ -139,9 +134,6 @@</span><br><span>    ts->tv_nsec = ts->tv_nsec % 1000000000;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Increment a GSM frame number modulo GSM_HYPERFRAME */</span><br><span style="color: hsl(0, 100%, 40%);">-#define INCREMENT_FN(fn) (fn) = (((fn) + 1) % GSM_HYPERFRAME)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> extern int quit;</span><br><span> </span><br><span> /*! this is the timerfd-callback firing for every FN to be processed */</span><br><span>@@ -178,7 +170,7 @@</span><br><span>        /* compute actual elapsed time and resulting OS scheduling error */</span><br><span>  clock_gettime(CLOCK_MONOTONIC, &tv_now);</span><br><span>         elapsed_us = compute_elapsed_us(&tcs->last_fn_timer.tv, &tv_now);</span><br><span style="color: hsl(0, 100%, 40%);">-    error_us = elapsed_us - FRAME_DURATION_uS;</span><br><span style="color: hsl(120, 100%, 40%);">+    error_us = elapsed_us - GSM_TDMA_FN_DURATION_uS;</span><br><span> #ifdef DEBUG_CLOCK</span><br><span>       printf("%s(): %09ld, elapsed_us=%05" PRId64 ", error_us=%-d: fn=%d\n", __func__,</span><br><span>                 tv_now.tv_nsec, elapsed_us, error_us, tcs->last_fn_timer.fn+1);</span><br><span>@@ -186,17 +178,15 @@</span><br><span>   tcs->last_fn_timer.tv = tv_now;</span><br><span> </span><br><span>       /* if someone played with clock, or if the process stalled */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (elapsed_us > FRAME_DURATION_uS * MAX_FN_SKEW || elapsed_us < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (elapsed_us > GSM_TDMA_FN_DURATION_uS * MAX_FN_SKEW || elapsed_us < 0) {</span><br><span>            LOGP(DL1C, LOGL_ERROR, "PC clock skew: elapsed_us=%" PRId64 ", error_us=%" PRId64 "\n",</span><br><span>                        elapsed_us, error_us);</span><br><span>               goto no_clock;</span><br><span>       }</span><br><span> </span><br><span>        /* call trx_sched_fn() for all expired FN */</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < expire_count; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         INCREMENT_FN(tcs->last_fn_timer.fn);</span><br><span style="color: hsl(0, 100%, 40%);">-         trx_sched_fn(bts, tcs->last_fn_timer.fn);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < expire_count; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+         trx_sched_fn(bts, GSM_TDMA_FN_INC(tcs->last_fn_timer.fn));</span><br><span> </span><br><span>    return 0;</span><br><span> </span><br><span>@@ -281,7 +271,7 @@</span><br><span>  int elapsed_fn;</span><br><span>      int64_t elapsed_us, elapsed_us_since_clk, elapsed_fn_since_clk, error_us_since_clk;</span><br><span>  unsigned int fn_caught_up = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-  const struct timespec interval = { .tv_sec = 0, .tv_nsec = FRAME_DURATION_nS };</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct timespec interval = { .tv_sec = 0, .tv_nsec = GSM_TDMA_FN_DURATION_nS };</span><br><span> </span><br><span>    if (quit)</span><br><span>            return 0;</span><br><span>@@ -307,7 +297,7 @@</span><br><span>      elapsed_us_since_clk = compute_elapsed_us(&tcs->last_clk_ind.tv, &tv_now);</span><br><span>        elapsed_fn_since_clk = compute_elapsed_fn(tcs->last_clk_ind.fn, fn);</span><br><span>      /* error (delta) between local clock since last CLK and CLK based on FN clock at TRX */</span><br><span style="color: hsl(0, 100%, 40%);">- error_us_since_clk = elapsed_us_since_clk - (FRAME_DURATION_uS * elapsed_fn_since_clk);</span><br><span style="color: hsl(120, 100%, 40%);">+       error_us_since_clk = elapsed_us_since_clk - (GSM_TDMA_FN_DURATION_uS * elapsed_fn_since_clk);</span><br><span>        LOGP(DL1C, LOGL_INFO, "TRX Clock Ind: elapsed_us=%7"PRId64", "</span><br><span>           "elapsed_fn=%3"PRId64", error_us=%+5"PRId64"\n",</span><br><span>               elapsed_us_since_clk, elapsed_fn_since_clk, error_us_since_clk);</span><br><span>@@ -328,14 +318,14 @@</span><br><span>     }</span><br><span> </span><br><span>        LOGP(DL1C, LOGL_INFO, "GSM clock jitter: %" PRId64 "us (elapsed_fn=%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-          elapsed_fn * FRAME_DURATION_uS - elapsed_us, elapsed_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+             elapsed_fn * GSM_TDMA_FN_DURATION_uS - elapsed_us, elapsed_fn);</span><br><span> </span><br><span>  /* too many frames have been processed already */</span><br><span>    if (elapsed_fn < 0) {</span><br><span>             struct timespec first = interval;</span><br><span>            /* set clock to the time or last FN should have been</span><br><span>                  * transmitted. */</span><br><span style="color: hsl(0, 100%, 40%);">-              first.tv_nsec += (0 - elapsed_fn) * FRAME_DURATION_nS;</span><br><span style="color: hsl(120, 100%, 40%);">+                first.tv_nsec += (0 - elapsed_fn) * GSM_TDMA_FN_DURATION_nS;</span><br><span>                 normalize_timespec(&first);</span><br><span>              LOGP(DL1C, LOGL_NOTICE, "We were %d FN faster than TRX, compensating\n", -elapsed_fn);</span><br><span>             /* set time to the time our next FN has to be transmitted */</span><br><span>@@ -345,8 +335,7 @@</span><br><span> </span><br><span>       /* transmit what we still need to transmit */</span><br><span>        while (fn != tcs->last_fn_timer.fn) {</span><br><span style="color: hsl(0, 100%, 40%);">-                INCREMENT_FN(tcs->last_fn_timer.fn);</span><br><span style="color: hsl(0, 100%, 40%);">-         trx_sched_fn(bts, tcs->last_fn_timer.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+          trx_sched_fn(bts, GSM_TDMA_FN_INC(tcs->last_fn_timer.fn));</span><br><span>                fn_caught_up++;</span><br><span>      }</span><br><span> </span><br><span>diff --git a/src/osmo-bts-trx/trx_if.c b/src/osmo-bts-trx/trx_if.c</span><br><span>index 6fe0ecd..58f7455 100644</span><br><span>--- a/src/osmo-bts-trx/trx_if.c</span><br><span>+++ b/src/osmo-bts-trx/trx_if.c</span><br><span>@@ -121,8 +121,8 @@</span><br><span> </span><br><span>     LOGPPHI(pinst, DTRX, LOGL_INFO, "Clock indication: fn=%u\n", fn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (fn >= GSM_HYPERFRAME) {</span><br><span style="color: hsl(0, 100%, 40%);">-          fn %= GSM_HYPERFRAME;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (fn >= GSM_TDMA_HYPERFRAME) {</span><br><span style="color: hsl(120, 100%, 40%);">+           fn %= GSM_TDMA_HYPERFRAME;</span><br><span>           LOGPPHI(pinst, DTRX, LOGL_ERROR, "Indicated clock's FN is not "</span><br><span>                        "wrapping correctly, correcting to fn=%u\n", fn);</span><br><span>  }</span><br><span>@@ -737,7 +737,7 @@</span><br><span>      bi->rssi = -(int8_t)buf[5];</span><br><span>       bi->toa256 = (int16_t) osmo_load16be(buf + 6);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (bi->fn >= GSM_HYPERFRAME) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bi->fn >= GSM_TDMA_HYPERFRAME) {</span><br><span>           LOGPPHI(l1h->phy_inst, DTRX, LOGL_ERROR,</span><br><span>                  "Illegal TDMA fn=%u\n", bi->fn);</span><br><span>                return -EINVAL;</span><br><span>diff --git a/src/osmo-bts-virtual/scheduler_virtbts.c b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>index d3fdf1a..1c2b057 100644</span><br><span>--- a/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>+++ b/src/osmo-bts-virtual/scheduler_virtbts.c</span><br><span>@@ -532,7 +532,6 @@</span><br><span>  ***********************************************************************/</span><br><span> </span><br><span> #define RTS_ADVANCE              5       /* about 20ms */</span><br><span style="color: hsl(0, 100%, 40%);">-#define FRAME_DURATION_uS       4615</span><br><span> </span><br><span> static int vbts_sched_fn(struct gsm_bts *bts, uint32_t fn)</span><br><span> {</span><br><span>@@ -558,7 +557,7 @@</span><br><span>                     *    --> Handle and process non-transparent RSL-Messages (activate channel, )</span><br><span>                     *    --> Forward transparent RSL-DATA-Messages to the ms by appending them to</span><br><span>                     *        the l1-dl-queue */</span><br><span style="color: hsl(0, 100%, 40%);">-                    _sched_rts(l1t, br.tn, (fn + RTS_ADVANCE) % GSM_HYPERFRAME);</span><br><span style="color: hsl(120, 100%, 40%);">+                  _sched_rts(l1t, br.tn, GSM_TDMA_FN_SUM(fn, RTS_ADVANCE));</span><br><span>                    /* schedule transmit backend functions */</span><br><span>                    /* Process data in the l1-dlqueue and forward it</span><br><span>                      * to MS */</span><br><span>@@ -587,28 +586,27 @@</span><br><span>                  + (tv_now.tv_usec - tv_clock->tv_usec);</span><br><span> </span><br><span>       /* not so good somehow a lot of time passed between two timer callbacks */</span><br><span style="color: hsl(0, 100%, 40%);">-      if (elapsed_us > 2 *FRAME_DURATION_uS)</span><br><span style="color: hsl(120, 100%, 40%);">+     if (elapsed_us > 2 *GSM_TDMA_FN_DURATION_uS)</span><br><span>              LOGP(DL1P, LOGL_NOTICE, "vbts_fn_timer_cb after %d us\n", elapsed_us);</span><br><span> </span><br><span>         /* schedule the current frame/s (fn = frame number)</span><br><span>   * this loop will be called at least once, but can also be executed</span><br><span>   * multiple times if more than one frame duration (4615us) passed till the last callback */</span><br><span style="color: hsl(0, 100%, 40%);">-     while (elapsed_us > FRAME_DURATION_uS / 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+       while (elapsed_us > GSM_TDMA_FN_DURATION_uS / 2) {</span><br><span>                const struct timeval tv_frame = {</span><br><span>                    .tv_sec = 0,</span><br><span style="color: hsl(0, 100%, 40%);">-                    .tv_usec = FRAME_DURATION_uS,</span><br><span style="color: hsl(120, 100%, 40%);">+                 .tv_usec = GSM_TDMA_FN_DURATION_uS,</span><br><span>          };</span><br><span>           timeradd(tv_clock, &tv_frame, tv_clock);</span><br><span>                 /* increment the frame number in the BTS model instance */</span><br><span style="color: hsl(0, 100%, 40%);">-              bts_virt->last_fn = (bts_virt->last_fn + 1) % GSM_HYPERFRAME;</span><br><span style="color: hsl(0, 100%, 40%);">-             vbts_sched_fn(bts, bts_virt->last_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-               elapsed_us -= FRAME_DURATION_uS;</span><br><span style="color: hsl(120, 100%, 40%);">+              vbts_sched_fn(bts, GSM_TDMA_FN_INC(bts_virt->last_fn));</span><br><span style="color: hsl(120, 100%, 40%);">+            elapsed_us -= GSM_TDMA_FN_DURATION_uS;</span><br><span>       }</span><br><span> </span><br><span>        /* re-schedule the timer */</span><br><span>  /* timer is set to frame duration - elapsed time to guarantee that this cb method will be</span><br><span>     * periodically executed every 4.615ms */</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_timer_schedule(&bts_virt->fn_timer, 0, FRAME_DURATION_uS - elapsed_us);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_timer_schedule(&bts_virt->fn_timer, 0, GSM_TDMA_FN_DURATION_uS - elapsed_us);</span><br><span> }</span><br><span> </span><br><span> int vbts_sched_start(struct gsm_bts *bts)</span><br><span>@@ -622,7 +620,7 @@</span><br><span> </span><br><span>    gettimeofday(&bts_virt->tv_clock, NULL);</span><br><span>      /* trigger the first timer after 4615us (a frame duration) */</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_timer_schedule(&bts_virt->fn_timer, 0, FRAME_DURATION_uS);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_timer_schedule(&bts_virt->fn_timer, 0, GSM_TDMA_FN_DURATION_uS);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/18874">change 18874</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-bts/+/18874"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I61c97a62bd5dbbb4a984921ebdfc10ad6ed00f2a </div>
<div style="display:none"> Gerrit-Change-Number: 18874 </div>
<div style="display:none"> Gerrit-PatchSet: 6 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@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-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>