<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10814">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Vadim Yanitskiy: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: remove missed interval end detection<br><br>The function is_meas_overdue() was introduced to allow<br>lchan_meas_process_measurement() to detect when the end of a measurement<br>interval has been missed. Interval ends may be missed when the SACCH<br>block of the related measurement interval gets lost. This is due to the<br>fact that the SACCH block is used as a trigger to start the measurement<br>result computation.<br><br>The idea behind is_meas_overdue() was to check the frame number of the<br>current measurement against the frame number of the previous measurement<br>in order to see if there was a measurement for SACCH in between or not.<br>Unfortunately SACCH and TCH Voice data is not necessarly processed in<br>order by each phy. Depending on the phy there may be a jitter between<br>the timing of SACCH and TCH Voice. Depending on the phy this jitter may<br>be enough to mess up the timing so that we see a SACCH block earlier<br>than expected. So we can not use the current frame number of TCH Voice<br>measurements to check for missed SACCH blocks.<br><br>Change-Id: Idfdbf64c1f965f35c12559b3995e2b746c74ee9e<br>Related: OS#3502<br>Related: OS#2975<br>---<br>M include/osmo-bts/measurement.h<br>M src/common/measurement.c<br>M tests/meas/meas_test.c<br>M tests/meas/meas_test.ok<br>4 files changed, 2 insertions(+), 733 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/measurement.h b/include/osmo-bts/measurement.h</span><br><span>index b4fc35b..a2367c8 100644</span><br><span>--- a/include/osmo-bts/measurement.h</span><br><span>+++ b/include/osmo-bts/measurement.h</span><br><span>@@ -16,6 +16,4 @@</span><br><span> </span><br><span> int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool is_meas_overdue(struct gsm_lchan *lchan, uint32_t *fn_missed_end, uint32_t fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #endif</span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index 8f0470a..8d1babd 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -240,32 +240,6 @@</span><br><span>      return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Same as above, but the inverse function */</span><br><span style="color: hsl(0, 100%, 40%);">-static uint8_t translate_tch_meas_rep_fn104_inv(uint8_t fn_mod)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- switch (fn_mod) {</span><br><span style="color: hsl(0, 100%, 40%);">-       case 103:</span><br><span style="color: hsl(0, 100%, 40%);">-               return 25;</span><br><span style="color: hsl(0, 100%, 40%);">-      case 12:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 38;</span><br><span style="color: hsl(0, 100%, 40%);">-      case 25:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 51;</span><br><span style="color: hsl(0, 100%, 40%);">-      case 38:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 64;</span><br><span style="color: hsl(0, 100%, 40%);">-      case 51:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 77;</span><br><span style="color: hsl(0, 100%, 40%);">-      case 64:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 90;</span><br><span style="color: hsl(0, 100%, 40%);">-      case 77:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 103;</span><br><span style="color: hsl(0, 100%, 40%);">-     case 90:</span><br><span style="color: hsl(0, 100%, 40%);">-                return 12;</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%);">-       /* Invalid / not of interest */</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* determine if a measurement period ends at the given frame number</span><br><span>  * (this function is only used internally, it is public to call it from</span><br><span>  * unit-tests) */</span><br><span>@@ -322,99 +296,6 @@</span><br><span>     return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Check if a measurement period is overdue. This situation may occur when the</span><br><span style="color: hsl(0, 100%, 40%);">- * SACCH frame that closes the measurement interval was not received. Then the</span><br><span style="color: hsl(0, 100%, 40%);">- * end of the measurement will not be detected. Using this function we can</span><br><span style="color: hsl(0, 100%, 40%);">- * detect if we missed a measurement period end and we also find the frame</span><br><span style="color: hsl(0, 100%, 40%);">- * number of the lost SACCH frame. (this function is only used internally,</span><br><span style="color: hsl(0, 100%, 40%);">- * it is public to call it from unit-tests) */</span><br><span style="color: hsl(0, 100%, 40%);">-bool is_meas_overdue(struct gsm_lchan *lchan, uint32_t *fn_missed_end, uint32_t fn)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint32_t fn_mod;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t last_fn_mod;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint32_t fn_rounded;</span><br><span style="color: hsl(0, 100%, 40%);">-    uint8_t interval_end;</span><br><span style="color: hsl(0, 100%, 40%);">-   uint8_t modulus;</span><br><span style="color: hsl(0, 100%, 40%);">-        const uint8_t *tbl;</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gsm_phys_chan_config pchan = ts_pchan(lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* On the very first measurement we will not be able to do this check</span><br><span style="color: hsl(0, 100%, 40%);">-    * as we do not have a reference yet. So we have to assume that we</span><br><span style="color: hsl(0, 100%, 40%);">-       * did not miss the interval end yet. */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (lchan->meas.last_fn == LCHAN_FN_DUMMY)</span><br><span style="color: hsl(0, 100%, 40%);">-           return false;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Determine the interval ending and the modulus to calculate with */</span><br><span style="color: hsl(0, 100%, 40%);">-   switch (pchan) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           modulus = 104;</span><br><span style="color: hsl(0, 100%, 40%);">-          interval_end = tchf_meas_rep_fn104_by_ts[lchan->ts->nr];</span><br><span style="color: hsl(0, 100%, 40%);">-          interval_end = translate_tch_meas_rep_fn104_inv(interval_end);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           modulus = 104;</span><br><span style="color: hsl(0, 100%, 40%);">-          if (lchan->nr == 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  tbl = tchh0_meas_rep_fn104_by_ts;</span><br><span style="color: hsl(0, 100%, 40%);">-               else</span><br><span style="color: hsl(0, 100%, 40%);">-                    tbl = tchh1_meas_rep_fn104_by_ts;</span><br><span style="color: hsl(0, 100%, 40%);">-               interval_end = tbl[lchan->ts->nr];</span><br><span style="color: hsl(0, 100%, 40%);">-                interval_end = translate_tch_meas_rep_fn104_inv(interval_end);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-             modulus = 102;</span><br><span style="color: hsl(0, 100%, 40%);">-          interval_end = sdcch8_meas_rep_fn102_by_ss[lchan->nr];</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(0, 100%, 40%);">-     case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                modulus = 102;</span><br><span style="color: hsl(0, 100%, 40%);">-          interval_end = sdcch4_meas_rep_fn102_by_ss[lchan->nr];</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%);">-                return false;</span><br><span style="color: hsl(0, 100%, 40%);">-           break;</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%);">-       fn_mod = fn % modulus;</span><br><span style="color: hsl(0, 100%, 40%);">-  last_fn_mod = lchan->meas.last_fn % modulus;</span><br><span style="color: hsl(0, 100%, 40%);">- fn_rounded = fn - fn_mod;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       if (fn_mod > last_fn_mod) {</span><br><span style="color: hsl(0, 100%, 40%);">-          /* When the current frame number is larger then the last frame</span><br><span style="color: hsl(0, 100%, 40%);">-           * number we check if the interval ending falls in between</span><br><span style="color: hsl(0, 100%, 40%);">-               * the two. If it does we calculate the absolute frame number</span><br><span style="color: hsl(0, 100%, 40%);">-            * position on which the interval should have ended. */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (interval_end > last_fn_mod && interval_end < fn_mod) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        *fn_missed_end = interval_end + fn_rounded;</span><br><span style="color: hsl(0, 100%, 40%);">-                     return true;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-       } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* When the current frame number is smaller then the last frame</span><br><span style="color: hsl(0, 100%, 40%);">-          * number, than the modulus interval has wrapped. We then just</span><br><span style="color: hsl(0, 100%, 40%);">-           * check the presence of the interval ending in the section</span><br><span style="color: hsl(0, 100%, 40%);">-              * that starts at the current frame number and ends at the</span><br><span style="color: hsl(0, 100%, 40%);">-               * interval end. */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (interval_end > last_fn_mod) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    if (fn < lchan->meas.last_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-                             *fn_missed_end = interval_end + GSM_MAX_FN - modulus;</span><br><span style="color: hsl(0, 100%, 40%);">-                   else</span><br><span style="color: hsl(0, 100%, 40%);">-                            *fn_missed_end = interval_end + fn_rounded - modulus;</span><br><span style="color: hsl(0, 100%, 40%);">-                   return true;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(0, 100%, 40%);">-               /* We also check the section that starts from the beginning of</span><br><span style="color: hsl(0, 100%, 40%);">-           * the interval and ends at the current frame number. */</span><br><span style="color: hsl(0, 100%, 40%);">-                if (interval_end < fn_mod) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (fn < lchan->meas.last_fn)</span><br><span style="color: hsl(0, 100%, 40%);">-                             *fn_missed_end = interval_end;</span><br><span style="color: hsl(0, 100%, 40%);">-                  else</span><br><span style="color: hsl(0, 100%, 40%);">-                            *fn_missed_end = interval_end + fn_rounded;</span><br><span style="color: hsl(0, 100%, 40%);">-                     return true;</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 false;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* determine the measurement interval modulus by a given lchan */</span><br><span> static uint8_t modulus_by_lchan(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>@@ -827,31 +708,8 @@</span><br><span>  * interval. */</span><br><span> void lchan_meas_process_measurement(struct gsm_lchan *lchan, struct bts_ul_meas *ulm, uint32_t fn)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       uint32_t fn_missed_end;</span><br><span style="color: hsl(0, 100%, 40%);">- bool missed_end;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* The measurement processing detects the end of a measurement period</span><br><span style="color: hsl(0, 100%, 40%);">-    * by checking if the received measurement sample is from a SACCH</span><br><span style="color: hsl(0, 100%, 40%);">-        * block. If so, then the measurement computation is performed and the</span><br><span style="color: hsl(0, 100%, 40%);">-   * next cycle starts. However, when the SACCH block is not received</span><br><span style="color: hsl(0, 100%, 40%);">-      * then the associated measurement indication is also skipped. Because</span><br><span style="color: hsl(0, 100%, 40%);">-   * of this we must check now if the measurement interval ended between</span><br><span style="color: hsl(0, 100%, 40%);">-   * the last and the current call of this function */</span><br><span style="color: hsl(0, 100%, 40%);">-    missed_end = is_meas_overdue(lchan, &fn_missed_end, fn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    if (missed_end) {</span><br><span style="color: hsl(0, 100%, 40%);">-               DEBUGPFN(DMEAS, fn, "%s measurement interval ending missed, catching up...\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(0, 100%, 40%);">-                /* We missed the end of the interval. Do the computation now</span><br><span style="color: hsl(0, 100%, 40%);">-             * and add the uplink measurement we got as the first sample</span><br><span style="color: hsl(0, 100%, 40%);">-             * of a new interval */</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan_meas_check_compute(lchan, fn_missed_end);</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan_new_ul_meas(lchan, ulm, fn);</span><br><span style="color: hsl(0, 100%, 40%);">-      } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* This is the normal case, we first add the measurement sample</span><br><span style="color: hsl(0, 100%, 40%);">-          * to the current interva and run the check+computation */</span><br><span style="color: hsl(0, 100%, 40%);">-              lchan_new_ul_meas(lchan, ulm, fn);</span><br><span style="color: hsl(0, 100%, 40%);">-              lchan_meas_check_compute(lchan, fn);</span><br><span style="color: hsl(0, 100%, 40%);">-    }</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan_new_ul_meas(lchan, ulm, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+    lchan_meas_check_compute(lchan, fn);</span><br><span> }</span><br><span> </span><br><span> /* Reset all measurement related struct members to their initial values. This</span><br><span>diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c</span><br><span>index a33a808..8f50479 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -125,588 +125,6 @@</span><br><span> </span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void test_is_meas_overdue(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_lchan *lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-        bool rc;</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t fn_missed_end;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- printf("\n\n");</span><br><span style="color: hsl(0, 100%, 40%);">-       printf("===========================================================\n");</span><br><span style="color: hsl(0, 100%, 40%);">-      printf("Testing is_meas_overdue()\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Missing period-end-trigger at fn=12, TCH/F, TS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 95;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 17 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 12 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Missing period-end-trigger at fn=12, TCH/H, TS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 95;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 17 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 12 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Missing period-end-trigger at fn=12, TCH/H, TS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[1].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 95;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 17 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 12 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Missing period-end-trigger at fn=25, TCH/F, TS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[1].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 21;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 30);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 25);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=25, TCH/H, TS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 21;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 30);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 25);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=25, TCH/H, TS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[1].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 21;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 30);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 25);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=38, TCH/F, TS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 34;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 43);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 38);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=38, TCH/H, TS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 34;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 43);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 38);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=38, TCH/H, TS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[3].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 34;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 43);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 38);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=51, TCH/F, TS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[3].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 47;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 52);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 51);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=51, TCH/H, TS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 47;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 52);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 51);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=51, TCH/H, TS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[3].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 47;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 52);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 51);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=64, TCH/F, TS4 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[4].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 60;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 64);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=64, TCH/H, TS4 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[4].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 60;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 64);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=64, TCH/H, TS4 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[5].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 60;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 64);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=77, TCH/F, TS5 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[5].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 73;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 77);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=77, TCH/H, TS4 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[4].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 73;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 77);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=77, TCH/H, TS5 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[5].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 73;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 77);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=90, TCH/F, TS6 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[6].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 86;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 91);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 90);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=90, TCH/H, TS6 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[6].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 86;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 91);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 90);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=90, TCH/H, TS7 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[7].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 86;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 91);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 90);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=103, TCH/F, TS7 */</span><br><span style="color: hsl(0, 100%, 40%);">-  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[7].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 99;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 0 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 103);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Missing period-end-trigger at fn=103, TCH/H, TS6 */</span><br><span style="color: hsl(0, 100%, 40%);">-  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[6].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 99;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 0 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 103);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Missing period-end-trigger at fn=103, TCH/H, TS7 */</span><br><span style="color: hsl(0, 100%, 40%);">-  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[7].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 99;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 0 + 104);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 103);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Dropout inside the interval, no period-end-trigger missed */</span><br><span style="color: hsl(0, 100%, 40%);">- fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 56;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, but right after period-end-trigger */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 38;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 39);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, two neigbouring frames at random position</span><br><span style="color: hsl(0, 100%, 40%);">-         * (should not happen in the real world) */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 43;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 44);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, Two neigbouring frames (period end, right side) */</span><br><span style="color: hsl(0, 100%, 40%);">-       fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 38;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 39);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, Two neigbouring frames (period end, left side,</span><br><span style="color: hsl(0, 100%, 40%);">-    * should not happen in the real world) */</span><br><span style="color: hsl(0, 100%, 40%);">-      fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 37;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 38);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, test directly on a the trigger frame */</span><br><span style="color: hsl(0, 100%, 40%);">-  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 34;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 38);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, previous frame is trigger frame</span><br><span style="color: hsl(0, 100%, 40%);">-   * (should not happen in the real world) */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = 38;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 38);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Missing period-end-trigger at fn=38+i*104, TCH/F, TS2 to</span><br><span style="color: hsl(0, 100%, 40%);">-      * see the modulus is correct. */</span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < 100; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-          fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">-         lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-            lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-               lchan->meas.last_fn = 34 + 104 * 1;</span><br><span style="color: hsl(0, 100%, 40%);">-          rc = is_meas_overdue(lchan, &fn_missed_end, 43 + 104 * 1);</span><br><span style="color: hsl(0, 100%, 40%);">-          OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-                OSMO_ASSERT(fn_missed_end == 38 + 104 * 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%);">-       /* See whats happening if we miss a period-end-triggerend at the</span><br><span style="color: hsl(0, 100%, 40%);">-         * hyperframe beginning. */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = GSM_MAX_FN - 104 + 95;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 17);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 12);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* See whats happening if we miss a period-end-triggerend at the</span><br><span style="color: hsl(0, 100%, 40%);">-         * hyperframe ending. */</span><br><span style="color: hsl(0, 100%, 40%);">-        fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[6].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = GSM_MAX_FN - 104 + 86;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 8);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == GSM_MAX_FN - 104 + 90);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    /* See whats happening if we miss a period-end-triggerend exactly at the</span><br><span style="color: hsl(0, 100%, 40%);">-         * hyperframe ending. */</span><br><span style="color: hsl(0, 100%, 40%);">-        fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[7].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = GSM_MAX_FN - 104 + 99;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == GSM_MAX_FN - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Test a wrap around at the hyperframe ending, while no measurements</span><br><span style="color: hsl(0, 100%, 40%);">-    * are lost */</span><br><span style="color: hsl(0, 100%, 40%);">-  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = GSM_MAX_FN - 104 + 99;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Test a wrap around at the hyperframe ending, measurements are lost,</span><br><span style="color: hsl(0, 100%, 40%);">-   * but not the one that triggers the period end */</span><br><span style="color: hsl(0, 100%, 40%);">-      fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = GSM_MAX_FN - 104 + 95;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 4);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Test a wrap around right before the hyperframe ending, while no</span><br><span style="color: hsl(0, 100%, 40%);">-       * measurements are lost. */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[7].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(0, 100%, 40%);">-       lchan->meas.last_fn = GSM_MAX_FN - 104 + 99;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, GSM_MAX_FN - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Missing period-end-trigger at fn=66, SDCCH/8, TS0, SS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 47;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 15 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 66);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=70, SDCCH/8, TS0, SS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 51;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 19 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 70);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=74, SDCCH/8, TS0, SS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 55;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 23 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 74);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=78, SDCCH/8, TS0, SS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[3];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 59;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 27 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 78);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=98, SDCCH/8, TS0, SS4 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[4];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 82;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 31 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 98);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=102, SDCCH/8, TS0, SS5 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[5];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 86;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 35 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 102);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Missing period-end-trigger at fn=106, SDCCH/8, TS0, SS6 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[6];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 90;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 39 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 4 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* Missing period-end-trigger at fn=200, SDCCH/8, TS0, SS7 */</span><br><span style="color: hsl(0, 100%, 40%);">-   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[7];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 94;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 43 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 8 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* No dropout, SDCCH/8, TS0, SS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 47;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 66);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 51;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 70);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 55;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 74);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[3];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 59;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS4 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[4];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 82;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 98);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS5 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[5];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 86;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 102);</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS6 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[6];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 90;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 4 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/8, TS0, SS7 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[7];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_SDCCH8_SACCH8C;</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan->meas.last_fn = 94;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 8 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* Missing period-end-trigger at fn=88, SDCCH/4, TS0, SS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = 57;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 37 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 88);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=92, SDCCH/4, TS0, SS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = 61;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 41 + 102);</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 92);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Missing period-end-trigger at fn=6, SDCCH/4, TS0, SS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = GSM_MAX_FN - 102 + 98;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 47);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 6);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Missing period-end-trigger at fn=10, SDCCH/4, TS0, SS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[3];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     rc = is_meas_overdue(lchan, &fn_missed_end, 51);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 10);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* No dropout, SDCCH/4, TS0, SS0 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[0];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = 57;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 88);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/4, TS0, SS1 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[1];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = 61;</span><br><span style="color: hsl(0, 100%, 40%);">-    rc = is_meas_overdue(lchan, &fn_missed_end, 92);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/4, TS0, SS2 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[2];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = GSM_MAX_FN - 102 + 98;</span><br><span style="color: hsl(0, 100%, 40%);">- rc = is_meas_overdue(lchan, &fn_missed_end, 6);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* No dropout, SDCCH/4, TS0, SS3 */</span><br><span style="color: hsl(0, 100%, 40%);">-     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan = &trx->ts[0].lchan[3];</span><br><span style="color: hsl(0, 100%, 40%);">-    lchan->ts->pchan = GSM_PCHAN_CCCH_SDCCH4;</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas.last_fn = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     rc = is_meas_overdue(lchan, &fn_missed_end, 10);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(!rc);</span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void test_is_meas_complete_single(struct gsm_lchan *lchan,</span><br><span>                                   uint32_t fn_end, uint8_t intv_len)</span><br><span> {</span><br><span>@@ -1152,7 +570,6 @@</span><br><span>      printf("*** MEASUREMENT INTERVAL ENDING DETECTION TESTS ***\n");</span><br><span>   printf("***************************************************\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  test_is_meas_overdue();</span><br><span>      test_is_meas_complete();</span><br><span>     test_lchan_meas_process_measurement(false, false);</span><br><span>   test_lchan_meas_process_measurement(true, false);</span><br><span>diff --git a/tests/meas/meas_test.ok b/tests/meas/meas_test.ok</span><br><span>index 3d4f430..e62bb42 100644</span><br><span>--- a/tests/meas/meas_test.ok</span><br><span>+++ b/tests/meas/meas_test.ok</span><br><span>@@ -714,10 +714,6 @@</span><br><span> </span><br><span> </span><br><span> ===========================================================</span><br><span style="color: hsl(0, 100%, 40%);">-Testing is_meas_overdue()</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> Testing is_meas_complete()</span><br><span> </span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10814">change 10814</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/10814"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Idfdbf64c1f965f35c12559b3995e2b746c74ee9e </div>
<div style="display:none"> Gerrit-Change-Number: 10814 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Vadim Yanitskiy <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>