<p>dexter has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/10760">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: fix SACCH interval remapping in test_is_meas_overdue()<br><br>The function test_is_meas_overdue() checks if a SACCH block was lost in<br>order to be able to conclude the measurement interval even when the<br>SAACH block gets lost.<br><br>Unfortunately, the measurements for the SACCH do not arrive in order with<br>the normal voice measurements. The measurement for the SACCH is shifted<br>by -26 frames but arrives with the correct frame number. The detection<br>logic that checks for dropped out SACCH frames does not take this<br>correctly into account. It calculates the frame number shift, but it<br>still expects the measurements to arrive in order. This needs to be<br>fixed.<br><br>- Add logic to work around the frame number shift<br>- Adapt unit tests<br><br>Change-Id: Idf6db73f67b7273c3d5965616c9e78f66b74a406<br>Related: OS#3502<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, 246 insertions(+), 184 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/60/10760/1</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..a071fdb 100644</span><br><span>--- a/include/osmo-bts/measurement.h</span><br><span>+++ b/include/osmo-bts/measurement.h</span><br><span>@@ -8,7 +8,7 @@</span><br><span> </span><br><span> int lchan_meas_check_compute(struct gsm_lchan *lchan, uint32_t fn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void lchan_meas_process_measurement(struct gsm_lchan *lchan, struct bts_ul_meas *ulm, uint32_t fn);</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_meas_process_measurement(struct gsm_lchan *lchan, struct bts_ul_meas *ulm, uint32_t fn);</span><br><span> </span><br><span> void lchan_meas_reset(struct gsm_lchan *lchan);</span><br><span> </span><br><span>diff --git a/src/common/measurement.c b/src/common/measurement.c</span><br><span>index 59f5d83..bfba11f 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,6 +296,41 @@</span><br><span>     return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* The measurement indications of voice blocks are not received in order with</span><br><span style="color: hsl(120, 100%, 40%);">+ * the measurement indications of the SACCH blocks. In relation to the normal</span><br><span style="color: hsl(120, 100%, 40%);">+ * voice blocks the The SACCH block that concludes the measurement interval is</span><br><span style="color: hsl(120, 100%, 40%);">+ * received 26 frames earlier than its frame number would indicate. In order</span><br><span style="color: hsl(120, 100%, 40%);">+ * to simplify the computation that detects if a SACCH frame was missed or not</span><br><span style="color: hsl(120, 100%, 40%);">+ * we subtract 26 from all SACCH frame numbers. This function MUST only be used</span><br><span style="color: hsl(120, 100%, 40%);">+ * with TCH/H and TCH/F channels. */</span><br><span style="color: hsl(120, 100%, 40%);">+static uint32_t fn_demangle(uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Since a similar problem exists in is_meas_complete(), we can borrow</span><br><span style="color: hsl(120, 100%, 40%);">+         * from there. translate_tch_meas_rep_fn104() returns 0 if the frame</span><br><span style="color: hsl(120, 100%, 40%);">+   * number does not belong to a SACCH frame */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = translate_tch_meas_rep_fn104(fn % 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc > 0 && fn >= 26)</span><br><span style="color: hsl(120, 100%, 40%);">+         return fn - 26;</span><br><span style="color: hsl(120, 100%, 40%);">+       else if (rc > 0)</span><br><span style="color: hsl(120, 100%, 40%);">+           return GSM_MAX_FN - (26 - fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return fn;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Inverse function of fn_demangle to convert the resulting fn back, this</span><br><span style="color: hsl(120, 100%, 40%);">+ * function must only be used with frame numbers that fall onto a SACCH</span><br><span style="color: hsl(120, 100%, 40%);">+ * interval end. It also must be a frame number from a TCH/H or a TCH/F. */</span><br><span style="color: hsl(120, 100%, 40%);">+static uint32_t fn_mangle(uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (fn <= GSM_MAX_FN - 26)</span><br><span style="color: hsl(120, 100%, 40%);">+         return fn + 26;</span><br><span style="color: hsl(120, 100%, 40%);">+       else</span><br><span style="color: hsl(120, 100%, 40%);">+          return fn - (GSM_MAX_FN - 26);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Check if a measurement period is overdue. This situation may occur when the</span><br><span>  * SACCH frame that closes the measurement interval was not received. Then the</span><br><span>  * end of the measurement will not be detected. Using this function we can</span><br><span>@@ -332,6 +341,7 @@</span><br><span> {</span><br><span>     uint32_t fn_mod;</span><br><span>     uint32_t last_fn_mod;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t last_fn;</span><br><span>    uint32_t fn_rounded;</span><br><span>         uint8_t interval_end;</span><br><span>        uint8_t modulus;</span><br><span>@@ -349,7 +359,8 @@</span><br><span>       case GSM_PCHAN_TCH_F:</span><br><span>                modulus = 104;</span><br><span>               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(120, 100%, 40%);">+                fn = fn_demangle(fn);</span><br><span style="color: hsl(120, 100%, 40%);">+         last_fn = fn_demangle(lchan->meas.last_fn);</span><br><span>               break;</span><br><span>       case GSM_PCHAN_TCH_H:</span><br><span>                modulus = 104;</span><br><span>@@ -358,17 +369,20 @@</span><br><span>               else</span><br><span>                         tbl = tchh1_meas_rep_fn104_by_ts;</span><br><span>            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(120, 100%, 40%);">+                fn = fn_demangle(fn);</span><br><span style="color: hsl(120, 100%, 40%);">+         last_fn = fn_demangle(lchan->meas.last_fn);</span><br><span>               break;</span><br><span>       case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span>       case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span>          modulus = 102;</span><br><span>               interval_end = sdcch8_meas_rep_fn102_by_ss[lchan->nr];</span><br><span style="color: hsl(120, 100%, 40%);">+             last_fn = lchan->meas.last_fn;</span><br><span>            break;</span><br><span>       case GSM_PCHAN_CCCH_SDCCH4:</span><br><span>  case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span>             modulus = 102;</span><br><span>               interval_end = sdcch4_meas_rep_fn102_by_ss[lchan->nr];</span><br><span style="color: hsl(120, 100%, 40%);">+             last_fn = lchan->meas.last_fn;</span><br><span>            break;</span><br><span>       default:</span><br><span>             return false;</span><br><span>@@ -376,7 +390,7 @@</span><br><span>  }</span><br><span> </span><br><span>        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(120, 100%, 40%);">+       last_fn_mod = last_fn % modulus;</span><br><span>     fn_rounded = fn - fn_mod;</span><br><span> </span><br><span>        if (fn_mod > last_fn_mod) {</span><br><span>@@ -386,6 +400,8 @@</span><br><span>                  * position on which the interval should have ended. */</span><br><span>              if (interval_end > last_fn_mod && interval_end < fn_mod) {</span><br><span>                     *fn_missed_end = interval_end + fn_rounded;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if(modulus == 104)</span><br><span style="color: hsl(120, 100%, 40%);">+                            *fn_missed_end = fn_mangle(*fn_missed_end);</span><br><span>                  return true;</span><br><span>                 }</span><br><span>    } else {</span><br><span>@@ -395,19 +411,23 @@</span><br><span>              * that starts at the current frame number and ends at the</span><br><span>            * interval end. */</span><br><span>          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(120, 100%, 40%);">+                   if (fn < last_fn)</span><br><span>                                 *fn_missed_end = interval_end + GSM_MAX_FN - modulus;</span><br><span>                        else</span><br><span>                                 *fn_missed_end = interval_end + fn_rounded - modulus;</span><br><span style="color: hsl(120, 100%, 40%);">+                 if(modulus == 104)</span><br><span style="color: hsl(120, 100%, 40%);">+                            *fn_missed_end = fn_mangle(*fn_missed_end);</span><br><span>                  return true;</span><br><span>                 }</span><br><span>            /* We also check the section that starts from the beginning of</span><br><span>                * the interval and ends at the current frame number. */</span><br><span>             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(120, 100%, 40%);">+                   if (fn < last_fn)</span><br><span>                                 *fn_missed_end = interval_end;</span><br><span>                       else</span><br><span>                                 *fn_missed_end = interval_end + fn_rounded;</span><br><span style="color: hsl(120, 100%, 40%);">+                   if(modulus == 104)</span><br><span style="color: hsl(120, 100%, 40%);">+                            *fn_missed_end = fn_mangle(*fn_missed_end);</span><br><span>                  return true;</span><br><span>                 }</span><br><span>    }</span><br><span>@@ -800,10 +820,11 @@</span><br><span>  * l1sap.c every time a measurement indication is received. It collects the</span><br><span>  * measurement samples and automatically detects the end oft the measurement</span><br><span>  * interval. */</span><br><span style="color: hsl(0, 100%, 40%);">-void lchan_meas_process_measurement(struct gsm_lchan *lchan, struct bts_ul_meas *ulm, uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+int lchan_meas_process_measurement(struct gsm_lchan *lchan, struct bts_ul_meas *ulm, uint32_t fn)</span><br><span> {</span><br><span>        uint32_t fn_missed_end;</span><br><span>      bool missed_end;</span><br><span style="color: hsl(120, 100%, 40%);">+      int rc;</span><br><span> </span><br><span>  /* The measurement processing detects the end of a measurement period</span><br><span>         * by checking if the received measurement sample is from a SACCH</span><br><span>@@ -821,12 +842,22 @@</span><br><span>             * of a new interval */</span><br><span>              lchan_meas_check_compute(lchan, fn_missed_end);</span><br><span>              lchan_new_ul_meas(lchan, ulm, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Report to the caller that we missed an inverval end</span><br><span style="color: hsl(120, 100%, 40%);">+                 * (unit-test) */</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = 1;</span><br><span>      } else {</span><br><span>             /* This is the normal case, we first add the measurement sample</span><br><span>               * to the current interva and run the check+computation */</span><br><span>           lchan_new_ul_meas(lchan, ulm, fn);</span><br><span>           lchan_meas_check_compute(lchan, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Report to the caller that the measurement was processed</span><br><span style="color: hsl(120, 100%, 40%);">+             * normally (unit-test) */</span><br><span style="color: hsl(120, 100%, 40%);">+            rc = 0;</span><br><span>      }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return rc;</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..ca08ba8 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -68,8 +68,8 @@</span><br><span> </span><br><span> static void reset_lchan_meas(struct gsm_lchan *lchan)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan_meas_reset(lchan);</span><br><span>     lchan->state = LCHAN_S_ACTIVE;</span><br><span style="color: hsl(0, 100%, 40%);">-       memset(&lchan->meas, 0, sizeof(lchan->meas));</span><br><span> }</span><br><span> </span><br><span> static void test_meas_compute(const struct meas_testcase *mtc)</span><br><span>@@ -136,236 +136,236 @@</span><br><span>         printf("===========================================================\n");</span><br><span>   printf("Testing is_meas_overdue()\n");</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=12(90), TCH/F, TS0 */</span><br><span>    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[0].lchan[0];</span><br><span>         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(120, 100%, 40%);">+    lchan->meas.last_fn = 86;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 91);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 12 + 104);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=12(90), TCH/H, TS0.0 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[0].lchan[0];</span><br><span>         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(120, 100%, 40%);">+    lchan->meas.last_fn = 86;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 91);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 12 + 104);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=12(90), TCH/H, TS1.0 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[1].lchan[0];</span><br><span>         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(120, 100%, 40%);">+    lchan->meas.last_fn = 86;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 91);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 12 + 104);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=25(103), TCH/F, TS1 */</span><br><span>   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[1].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 99;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 0 + 104);</span><br><span>    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 25);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(fn_missed_end == 25 + 104);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=25(103), TCH/H, TS0.1 */</span><br><span>         fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[0].lchan[1];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 99;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 0 + 104);</span><br><span>    OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 25);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(fn_missed_end == 25 + 104);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=25(103), TCH/H, TS1.1 */</span><br><span>         fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[1].lchan[1];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->meas.last_fn = 99;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 0 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 25 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Missing period-end-trigger at fn=38(12), TCH/F, TS2 */</span><br><span style="color: hsl(120, 100%, 40%);">+     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->meas.last_fn = 95;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 17 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 38 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Missing period-end-trigger at fn=38(12), TCH/H, TS2.0 */</span><br><span style="color: hsl(120, 100%, 40%);">+   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->meas.last_fn = 95;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 17 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 38 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Missing period-end-trigger at fn=38(12), TCH/H, TS3.0 */</span><br><span style="color: hsl(120, 100%, 40%);">+   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[3].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span style="color: hsl(120, 100%, 40%);">+     lchan->meas.last_fn = 95;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 17 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 38 + 104);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Missing period-end-trigger at fn=51(25), TCH/F, TS3 */</span><br><span style="color: hsl(120, 100%, 40%);">+     fn_missed_end = LCHAN_FN_DUMMY;</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan = &trx->ts[3].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+  lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span>    lchan->meas.last_fn = 21;</span><br><span>         rc = is_meas_overdue(lchan, &fn_missed_end, 30);</span><br><span>         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>     OSMO_ASSERT(fn_missed_end == 51);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=51(25), TCH/H, TS2 */</span><br><span>    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[2].lchan[1];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 21;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 30);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 51);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=51(25), TCH/H, TS3.1 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[3].lchan[1];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 21;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 30);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 51);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=64(38), TCH/F, TS4 */</span><br><span>    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[4].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 34;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 43);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 64);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=64(38)38, TCH/H, TS4.0 */</span><br><span>        fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[4].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 34;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 43);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 64);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=64(38)38, TCH/H, TS5.0 */</span><br><span>        fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[5].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 34;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 43);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 64);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=77(51), TCH/F, TS5 */</span><br><span>    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[5].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 47;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 52);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 77);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=77(51), TCH/H, TS5.1 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[4].lchan[1];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 47;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 52);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 77);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=77(51), TCH/H, TS6.1 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[5].lchan[1];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 47;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 52);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 77);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=90(64), TCH/F, TS6 */</span><br><span>    fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[6].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 90);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=90(64), TCH/H, TS6.0 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[6].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 90);</span><br><span> </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(120, 100%, 40%);">+ /* Missing period-end-trigger at fn=90(64), TCH/H, TS7.0 */</span><br><span>  fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[7].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 90);</span><br><span> </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(120, 100%, 40%);">+        /* Missing period-end-trigger at fn=103(77), TCH/F, TS7 */</span><br><span>   fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[7].lchan[0];</span><br><span>         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(120, 100%, 40%);">+     lchan->meas.last_fn = 73;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 103);</span><br><span> </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(120, 100%, 40%);">+        /* Missing period-end-trigger at fn=103(77), TCH/H, TS6.1 */</span><br><span>         fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[6].lchan[1];</span><br><span>         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(120, 100%, 40%);">+     lchan->meas.last_fn = 73;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 103);</span><br><span> </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(120, 100%, 40%);">+        /* Missing period-end-trigger at fn=103(77), TCH/H, TS7.1 */</span><br><span>         fn_missed_end = LCHAN_FN_DUMMY;</span><br><span>      lchan = &trx->ts[7].lchan[1];</span><br><span>         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(120, 100%, 40%);">+     lchan->meas.last_fn = 73;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 78);</span><br><span>         OSMO_ASSERT(rc);</span><br><span>     OSMO_ASSERT(fn_missed_end == 103);</span><br><span> </span><br><span>       /* Dropout inside the interval, no period-end-trigger missed */</span><br><span>      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(120, 100%, 40%);">+  lchan = &trx->ts[0].lchan[0];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span>    lchan->meas.last_fn = 56;</span><br><span>         rc = is_meas_overdue(lchan, &fn_missed_end, 69);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* No dropout, but right after period-end-trigger */</span><br><span style="color: hsl(120, 100%, 40%);">+  /* No dropout, but right after period-end-trigger (64=>38) */</span><br><span>     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(120, 100%, 40%);">+  lchan = &trx->ts[4].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 64;</span><br><span>         rc = is_meas_overdue(lchan, &fn_missed_end, 39);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span>@@ -373,92 +373,92 @@</span><br><span>        /* No dropout, two neigbouring frames at random position</span><br><span>      * (should not happen in the real world) */</span><br><span>  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(120, 100%, 40%);">+  lchan = &trx->ts[0].lchan[0];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span>    lchan->meas.last_fn = 43;</span><br><span>         rc = is_meas_overdue(lchan, &fn_missed_end, 44);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* No dropout, Two neigbouring frames (period end, right side) */</span><br><span style="color: hsl(120, 100%, 40%);">+     /* No dropout, Two neigbouring frames (period end, right side, 64=>38) */</span><br><span>         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(120, 100%, 40%);">+  lchan = &trx->ts[4].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 64;</span><br><span>         rc = is_meas_overdue(lchan, &fn_missed_end, 39);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> </span><br><span>    /* 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(120, 100%, 40%);">+     * should not happen in the real world, 64=>38) */</span><br><span>        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(120, 100%, 40%);">+  lchan = &trx->ts[4].lchan[0];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_H;</span><br><span>    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(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 64);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* No dropout, test directly on a the trigger frame */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* No dropout, test directly on a the trigger frame (64=>38) */</span><br><span>   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(120, 100%, 40%);">+  lchan = &trx->ts[4].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 38;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 64);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> </span><br><span>    /* 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(120, 100%, 40%);">+    * (should not happen in the real world, 64=>38) */</span><br><span>       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(120, 100%, 40%);">+  lchan = &trx->ts[4].lchan[0];</span><br><span>         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(120, 100%, 40%);">+  lchan->meas.last_fn = 64;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 39);</span><br><span>         OSMO_ASSERT(!rc);</span><br><span>    OSMO_ASSERT(fn_missed_end == LCHAN_FN_DUMMY);</span><br><span> </span><br><span>    /* 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(120, 100%, 40%);">+      * see the modulus is correct. (64=>38) */</span><br><span>        for (i = 0; i < 100; i++) {</span><br><span>               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(120, 100%, 40%);">+          lchan = &trx->ts[4].lchan[0];</span><br><span>                 lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span>            lchan->meas.last_fn = 34 + 104 * 1;</span><br><span>               rc = is_meas_overdue(lchan, &fn_missed_end, 43 + 104 * 1);</span><br><span>               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(120, 100%, 40%);">+           OSMO_ASSERT(fn_missed_end == 64 + 104 * 1);</span><br><span>  }</span><br><span> </span><br><span>        /* 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(120, 100%, 40%);">+    * hyperframe beginning (12=>38). */</span><br><span>      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(120, 100%, 40%);">+  lchan = &trx->ts[2].lchan[0];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span>    lchan->meas.last_fn = GSM_MAX_FN - 104 + 95;</span><br><span>      rc = is_meas_overdue(lchan, &fn_missed_end, 17);</span><br><span>         OSMO_ASSERT(rc);</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(fn_missed_end == 12);</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_ASSERT(fn_missed_end == 38);</span><br><span> </span><br><span>        /* See whats happening if we miss a period-end-triggerend at the</span><br><span>      * hyperframe ending. */</span><br><span>     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(120, 100%, 40%);">+  lchan = &trx->ts[0].lchan[0];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span>    lchan->meas.last_fn = GSM_MAX_FN - 104 + 86;</span><br><span>      rc = is_meas_overdue(lchan, &fn_missed_end, 8);</span><br><span>  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(120, 100%, 40%);">+  OSMO_ASSERT(fn_missed_end == 12);</span><br><span> </span><br><span>        /* See whats happening if we miss a period-end-triggerend exactly at the</span><br><span>      * hyperframe ending. */</span><br><span>     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(120, 100%, 40%);">+  lchan = &trx->ts[1].lchan[0];</span><br><span>         lchan->ts->pchan = GSM_PCHAN_TCH_F;</span><br><span>    lchan->meas.last_fn = GSM_MAX_FN - 104 + 99;</span><br><span>      rc = is_meas_overdue(lchan, &fn_missed_end, 0);</span><br><span>  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(120, 100%, 40%);">+ OSMO_ASSERT(fn_missed_end == 25);</span><br><span> </span><br><span>        /* Test a wrap around at the hyperframe ending, while no measurements</span><br><span>         * are lost */</span><br><span>@@ -897,6 +897,7 @@</span><br><span>         unsigned int fn = 0;</span><br><span>         unsigned int fn104;</span><br><span>  struct bts_ul_meas ulm;</span><br><span style="color: hsl(120, 100%, 40%);">+       int rc = 0;</span><br><span> </span><br><span>      printf("\n\n");</span><br><span>    printf("===========================================================\n");</span><br><span>@@ -928,12 +929,18 @@</span><br><span> </span><br><span>               if (dropouts == false || i % 4) {</span><br><span>                    if (ulm.is_sub == 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                            printf("(now adding SUB measurement sample %u)\n", fn);</span><br><span style="color: hsl(0, 100%, 40%);">-                       lchan_meas_process_measurement(lchan, &ulm, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                          printf</span><br><span style="color: hsl(120, 100%, 40%);">+                                    ("(now adding SUB measurement sample %u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rc += lchan_meas_process_measurement(lchan, &ulm, fn);</span><br><span>           } else if (ulm.is_sub == 1)</span><br><span style="color: hsl(0, 100%, 40%);">-                     printf("(leaving out SUB measurement sample for frame number %u)\n", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                   printf</span><br><span style="color: hsl(120, 100%, 40%);">+                            ("(leaving out SUB measurement sample for frame number %u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       fn);</span><br><span>            else</span><br><span style="color: hsl(0, 100%, 40%);">-                    printf("(leaving out measurement sample for frame number %u)\n", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                       printf</span><br><span style="color: hsl(120, 100%, 40%);">+                            ("(leaving out measurement sample for frame number %u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           fn);</span><br><span> </span><br><span>                fn += 4;</span><br><span>             if (k == 2) {</span><br><span>@@ -942,13 +949,33 @@</span><br><span>                } else</span><br><span>                       k++;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                if (fn % 104 == 39 && no_sacch == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      printf("(now adding SUB measurement sample for SACCH block at frame number %u)\n", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Note: The SACCH frame that concludes the measurement interval is</span><br><span style="color: hsl(120, 100%, 40%);">+            * expected to be received at pos 13 with the frame number 38. This</span><br><span style="color: hsl(120, 100%, 40%);">+            * is exactly one 26 multiframe later. */</span><br><span style="color: hsl(120, 100%, 40%);">+             if (fn % 104 == 13 && no_sacch == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf</span><br><span style="color: hsl(120, 100%, 40%);">+                            ("(now adding SUB measurement sample for SACCH block at frame number %u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         fn - 1 + 26);</span><br><span>                   ulm.is_sub = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-                 lchan_meas_process_measurement(lchan, &ulm, fn - 1);</span><br><span style="color: hsl(0, 100%, 40%);">-                } else if (fn % 104 == 39 && no_sacch == true)</span><br><span style="color: hsl(0, 100%, 40%);">-                  printf("(leaving out SUB measurement sample for SACCH block at frame number %u)\n", fn);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc +=</span><br><span style="color: hsl(120, 100%, 40%);">+                     lchan_meas_process_measurement(lchan, &ulm,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                      fn - 1 + 26);</span><br><span style="color: hsl(120, 100%, 40%);">+              } else if (fn % 104 == 13 && no_sacch == true)</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf</span><br><span style="color: hsl(120, 100%, 40%);">+                            ("(leaving out SUB measurement sample for SACCH block at frame number %u)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        fn - 1 + 26);</span><br><span>   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (no_sacch == false && rc > 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+         printf</span><br><span style="color: hsl(120, 100%, 40%);">+                    ("lchan_meas_process_measurement() is falsely indicating missed interval ends!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+             OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+   } else if (no_sacch == true && rc == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             printf</span><br><span style="color: hsl(120, 100%, 40%);">+                    ("lchan_meas_process_measurement() is falsely does not detect missed interval ends!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> }</span><br><span> </span><br><span> static bool test_ts45008_83_is_sub_is_sacch(uint32_t fn)</span><br><span>diff --git a/tests/meas/meas_test.ok b/tests/meas/meas_test.ok</span><br><span>index 3d4f430..d7f85e9 100644</span><br><span>--- a/tests/meas/meas_test.ok</span><br><span>+++ b/tests/meas/meas_test.ok</span><br><span>@@ -723,73 +723,76 @@</span><br><span> </span><br><span> ===========================================================</span><br><span> Testing lchan_meas_process_measurement()</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 39)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 38)</span><br><span> (now adding SUB measurement sample 52)</span><br><span> (now adding SUB measurement sample 56)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 143)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 142)</span><br><span> (now adding SUB measurement sample 156)</span><br><span> (now adding SUB measurement sample 160)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 247)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 246)</span><br><span> (now adding SUB measurement sample 260)</span><br><span> (now adding SUB measurement sample 264)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 351)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 350)</span><br><span> (now adding SUB measurement sample 364)</span><br><span> (now adding SUB measurement sample 368)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 454)</span><br><span> </span><br><span> </span><br><span> ===========================================================</span><br><span> Testing lchan_meas_process_measurement()</span><br><span>  * SACCH blocks not generated.</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 39)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 38)</span><br><span> (now adding SUB measurement sample 52)</span><br><span> (now adding SUB measurement sample 56)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 143)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 142)</span><br><span> (now adding SUB measurement sample 156)</span><br><span> (now adding SUB measurement sample 160)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 247)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 246)</span><br><span> (now adding SUB measurement sample 260)</span><br><span> (now adding SUB measurement sample 264)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 351)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 350)</span><br><span> (now adding SUB measurement sample 364)</span><br><span> (now adding SUB measurement sample 368)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 454)</span><br><span> </span><br><span> </span><br><span> ===========================================================</span><br><span> Testing lchan_meas_process_measurement()</span><br><span>  * Simulate dropouts by leaving out every 4th measurement</span><br><span> (leaving out measurement sample for frame number 0)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 38)</span><br><span> (leaving out measurement sample for frame number 17)</span><br><span> (leaving out measurement sample for frame number 34)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 39)</span><br><span> (leaving out SUB measurement sample for frame number 52)</span><br><span> (now adding SUB measurement sample 56)</span><br><span> (leaving out measurement sample for frame number 69)</span><br><span> (leaving out measurement sample for frame number 86)</span><br><span> (leaving out measurement sample for frame number 104)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 142)</span><br><span> (leaving out measurement sample for frame number 121)</span><br><span> (leaving out measurement sample for frame number 138)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 143)</span><br><span> (leaving out SUB measurement sample for frame number 156)</span><br><span> (now adding SUB measurement sample 160)</span><br><span> (leaving out measurement sample for frame number 173)</span><br><span> (leaving out measurement sample for frame number 190)</span><br><span> (leaving out measurement sample for frame number 208)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 246)</span><br><span> (leaving out measurement sample for frame number 225)</span><br><span> (leaving out measurement sample for frame number 242)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 247)</span><br><span> (leaving out SUB measurement sample for frame number 260)</span><br><span> (now adding SUB measurement sample 264)</span><br><span> (leaving out measurement sample for frame number 277)</span><br><span> (leaving out measurement sample for frame number 294)</span><br><span> (leaving out measurement sample for frame number 312)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 350)</span><br><span> (leaving out measurement sample for frame number 329)</span><br><span> (leaving out measurement sample for frame number 346)</span><br><span style="color: hsl(0, 100%, 40%);">-(now adding SUB measurement sample for SACCH block at frame number 351)</span><br><span> (leaving out SUB measurement sample for frame number 364)</span><br><span> (now adding SUB measurement sample 368)</span><br><span> (leaving out measurement sample for frame number 381)</span><br><span> (leaving out measurement sample for frame number 398)</span><br><span> (leaving out measurement sample for frame number 416)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding SUB measurement sample for SACCH block at frame number 454)</span><br><span> </span><br><span> </span><br><span> ===========================================================</span><br><span>@@ -797,38 +800,39 @@</span><br><span>  * SACCH blocks not generated.</span><br><span>  * Simulate dropouts by leaving out every 4th measurement</span><br><span> (leaving out measurement sample for frame number 0)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 38)</span><br><span> (leaving out measurement sample for frame number 17)</span><br><span> (leaving out measurement sample for frame number 34)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 39)</span><br><span> (leaving out SUB measurement sample for frame number 52)</span><br><span> (now adding SUB measurement sample 56)</span><br><span> (leaving out measurement sample for frame number 69)</span><br><span> (leaving out measurement sample for frame number 86)</span><br><span> (leaving out measurement sample for frame number 104)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 142)</span><br><span> (leaving out measurement sample for frame number 121)</span><br><span> (leaving out measurement sample for frame number 138)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 143)</span><br><span> (leaving out SUB measurement sample for frame number 156)</span><br><span> (now adding SUB measurement sample 160)</span><br><span> (leaving out measurement sample for frame number 173)</span><br><span> (leaving out measurement sample for frame number 190)</span><br><span> (leaving out measurement sample for frame number 208)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 246)</span><br><span> (leaving out measurement sample for frame number 225)</span><br><span> (leaving out measurement sample for frame number 242)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 247)</span><br><span> (leaving out SUB measurement sample for frame number 260)</span><br><span> (now adding SUB measurement sample 264)</span><br><span> (leaving out measurement sample for frame number 277)</span><br><span> (leaving out measurement sample for frame number 294)</span><br><span> (leaving out measurement sample for frame number 312)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 350)</span><br><span> (leaving out measurement sample for frame number 329)</span><br><span> (leaving out measurement sample for frame number 346)</span><br><span style="color: hsl(0, 100%, 40%);">-(leaving out SUB measurement sample for SACCH block at frame number 351)</span><br><span> (leaving out SUB measurement sample for frame number 364)</span><br><span> (now adding SUB measurement sample 368)</span><br><span> (leaving out measurement sample for frame number 381)</span><br><span> (leaving out measurement sample for frame number 398)</span><br><span> (leaving out measurement sample for frame number 416)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out SUB measurement sample for SACCH block at frame number 454)</span><br><span> </span><br><span> </span><br><span> ===========================================================</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10760">change 10760</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/10760"/><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: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Idf6db73f67b7273c3d5965616c9e78f66b74a406 </div>
<div style="display:none"> Gerrit-Change-Number: 10760 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>