<p>dexter <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/10492">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Harald Welte: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">measurement: make sure measurement interval end is detected<br><br>the measurement interval end is detected by using the measurement<br>indication that is related to the SACCH block as a trigger to start the<br>computation. If the measurement indication for the SACCH gets lost<br>because the block could not be received then the processing is not<br>executed. This may cause wrong results or when it happens condecutively<br>an overflow of the measurement sample buffer.<br><br>- Store the frame number of the last received measurement indication<br>- Use the stored frame number to check if an interval was crossed when<br>  the next measurement indication is received. If we detect that we<br>  missed the interval, catch up by running the computation and<br>  start the next interval.<br><br>Change-Id: I3a86cd8185cc6b94258373fe929f0c2f1cf27cfa<br>Related: OS#2975<br>---<br>M include/osmo-bts/gsm_data_shared.h<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>5 files changed, 1,071 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/gsm_data_shared.h b/include/osmo-bts/gsm_data_shared.h</span><br><span>index baa0145..794eaea 100644</span><br><span>--- a/include/osmo-bts/gsm_data_shared.h</span><br><span>+++ b/include/osmo-bts/gsm_data_shared.h</span><br><span>@@ -260,6 +260,8 @@</span><br><span>                 uint8_t l1_info[2];</span><br><span>          struct gsm_meas_rep_unidir ul_res;</span><br><span>           int16_t ms_toa256;</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Frame number of the last measurement indication receceived */</span><br><span style="color: hsl(120, 100%, 40%);">+              uint32_t last_fn;</span><br><span>            /* Osmocom extended measurement results, see LC_UL_M_F_EXTD_VALID */</span><br><span>                 struct {</span><br><span>                     /* minimum value of toa256 during measurement period */</span><br><span>diff --git a/include/osmo-bts/measurement.h b/include/osmo-bts/measurement.h</span><br><span>index d98e9f0..57eeef5 100644</span><br><span>--- a/include/osmo-bts/measurement.h</span><br><span>+++ b/include/osmo-bts/measurement.h</span><br><span>@@ -12,4 +12,6 @@</span><br><span> </span><br><span> void lchan_meas_reset(struct gsm_lchan *lchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool is_meas_overdue(struct gsm_lchan *lchan, uint32_t *fn_missed_end, uint32_t fn);</span><br><span style="color: hsl(120, 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 bd2c0b7..41844b1 100644</span><br><span>--- a/src/common/measurement.c</span><br><span>+++ b/src/common/measurement.c</span><br><span>@@ -9,6 +9,7 @@</span><br><span> #include <osmo-bts/logging.h></span><br><span> #include <osmo-bts/measurement.h></span><br><span> #include <osmo-bts/scheduler.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/rsl.h></span><br><span> </span><br><span> /* Tables as per TS 45.008 Section 8.3 */</span><br><span> static const uint8_t ts45008_83_tch_f[] = { 52, 53, 54, 55, 56, 57, 58, 59 };</span><br><span>@@ -217,6 +218,32 @@</span><br><span>    return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Same as above, but the inverse function */</span><br><span style="color: hsl(120, 100%, 40%);">+static uint8_t translate_tch_meas_rep_fn104_inv(uint8_t fn_mod)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (fn_mod) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case 103:</span><br><span style="color: hsl(120, 100%, 40%);">+             return 25;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 12:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 38;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 25:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 51;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 38:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 64;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 51:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 77;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 64:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 90;</span><br><span style="color: hsl(120, 100%, 40%);">+    case 77:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 103;</span><br><span style="color: hsl(120, 100%, 40%);">+   case 90:</span><br><span style="color: hsl(120, 100%, 40%);">+              return 12;</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%);">+   /* Invalid / not of interest */</span><br><span style="color: hsl(120, 100%, 40%);">+       return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* determine if a measurement period ends at the given frame number */</span><br><span> static int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn)</span><br><span> {</span><br><span>@@ -271,7 +298,101 @@</span><br><span>   return rc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* receive a L1 uplink measurement from L1 */</span><br><span style="color: hsl(120, 100%, 40%);">+/* Check if a measurement period is overdue. This situation may occur when the</span><br><span style="color: hsl(120, 100%, 40%);">+ * SACCH frame that closes the measurement interval was not received. Then the</span><br><span style="color: hsl(120, 100%, 40%);">+ * end of the measurement will not be detected. Using this function we can</span><br><span style="color: hsl(120, 100%, 40%);">+ * detect if we missed a measurement period end and we also find the frame</span><br><span style="color: hsl(120, 100%, 40%);">+ * number of the lost SACCH frame. (this function is only used internally,</span><br><span style="color: hsl(120, 100%, 40%);">+ * it is public to call it from unit-tests) */</span><br><span style="color: hsl(120, 100%, 40%);">+bool is_meas_overdue(struct gsm_lchan *lchan, uint32_t *fn_missed_end, uint32_t fn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  uint32_t fn_mod;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t last_fn_mod;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t interval_end;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t modulus;</span><br><span style="color: hsl(120, 100%, 40%);">+      const uint8_t *tbl;</span><br><span style="color: hsl(120, 100%, 40%);">+   enum gsm_phys_chan_config pchan = ts_pchan(lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* On the very first measurement we will not be able to do this check</span><br><span style="color: hsl(120, 100%, 40%);">+  * as we do not have a reference yet. So we have to assume that we</span><br><span style="color: hsl(120, 100%, 40%);">+     * did not miss the interval end yet. */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (lchan->meas.last_fn == LCHAN_FN_DUMMY)</span><br><span style="color: hsl(120, 100%, 40%);">+         return false;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Determine the interval ending and the modulus to calculate with */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (pchan) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(120, 100%, 40%);">+         modulus = 104;</span><br><span style="color: hsl(120, 100%, 40%);">+                interval_end = tchf_meas_rep_fn104[lchan->ts->nr];</span><br><span style="color: hsl(120, 100%, 40%);">+              interval_end = translate_tch_meas_rep_fn104_inv(interval_end);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(120, 100%, 40%);">+         modulus = 104;</span><br><span style="color: hsl(120, 100%, 40%);">+                last_fn_mod = lchan->meas.last_fn % 104;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (lchan->nr == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                        tbl = tchh0_meas_rep_fn104;</span><br><span style="color: hsl(120, 100%, 40%);">+           else</span><br><span style="color: hsl(120, 100%, 40%);">+                  tbl = tchh1_meas_rep_fn104;</span><br><span style="color: hsl(120, 100%, 40%);">+           interval_end = tbl[lchan->ts->nr];</span><br><span style="color: hsl(120, 100%, 40%);">+              interval_end = translate_tch_meas_rep_fn104_inv(interval_end);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+           modulus = 102;</span><br><span style="color: hsl(120, 100%, 40%);">+                last_fn_mod = lchan->meas.last_fn % 102;</span><br><span style="color: hsl(120, 100%, 40%);">+           interval_end = sdcch8_meas_rep_fn102[lchan->ts->nr];</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(120, 100%, 40%);">+   case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(120, 100%, 40%);">+              modulus = 102;</span><br><span style="color: hsl(120, 100%, 40%);">+                interval_end = sdcch8_meas_rep_fn102[lchan->ts->nr];</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              return false;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</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%);">+   fn_mod = fn % modulus;</span><br><span style="color: hsl(120, 100%, 40%);">+        last_fn_mod = lchan->meas.last_fn % modulus;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (fn_mod > last_fn_mod) {</span><br><span style="color: hsl(120, 100%, 40%);">+                /* When the current frame number is larger then the last frame</span><br><span style="color: hsl(120, 100%, 40%);">+                 * number we check if the interval ending falls in between</span><br><span style="color: hsl(120, 100%, 40%);">+             * the two. If it does we calculate the absolute frame number</span><br><span style="color: hsl(120, 100%, 40%);">+          * position on which the interval should have ended. */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (interval_end > last_fn_mod && interval_end < fn_mod) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      *fn_missed_end = interval_end + fn - fn_mod;</span><br><span style="color: hsl(120, 100%, 40%);">+                  return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* When the current frame number is smaller then the last frame</span><br><span style="color: hsl(120, 100%, 40%);">+                * number, than the modulus interval has wrapped. We then just</span><br><span style="color: hsl(120, 100%, 40%);">+                 * check the presence of the interval ending in the section</span><br><span style="color: hsl(120, 100%, 40%);">+            * that starts at the current frame number and ends at the</span><br><span style="color: hsl(120, 100%, 40%);">+             * interval end. */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (interval_end > last_fn_mod) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (fn < lchan->meas.last_fn)</span><br><span style="color: hsl(120, 100%, 40%);">+                           *fn_missed_end = interval_end + GSM_MAX_FN - modulus;</span><br><span style="color: hsl(120, 100%, 40%);">+                 else</span><br><span style="color: hsl(120, 100%, 40%);">+                          *fn_missed_end = interval_end + fn - modulus;</span><br><span style="color: hsl(120, 100%, 40%);">+                 return true;</span><br><span style="color: hsl(120, 100%, 40%);">+          }</span><br><span style="color: hsl(120, 100%, 40%);">+             /* We also check the section that starts from the beginning of</span><br><span style="color: hsl(120, 100%, 40%);">+                 * the interval and ends at the current frame number. */</span><br><span style="color: hsl(120, 100%, 40%);">+              if (interval_end < fn_mod) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (fn < lchan->meas.last_fn)</span><br><span style="color: hsl(120, 100%, 40%);">+                           *fn_missed_end = interval_end;</span><br><span style="color: hsl(120, 100%, 40%);">+                        else</span><br><span style="color: hsl(120, 100%, 40%);">+                          *fn_missed_end = interval_end + fn - fn_mod;</span><br><span style="color: hsl(120, 100%, 40%);">+                  return true;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return false;</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%);">+/* receive a L1 uplink measurement from L1 (this function is only used</span><br><span style="color: hsl(120, 100%, 40%);">+ * internally, it is public to call it from unit-tests)  */</span><br><span> int lchan_new_ul_meas(struct gsm_lchan *lchan, struct bts_ul_meas *ulm, uint32_t fn)</span><br><span> {</span><br><span>         if (lchan->state != LCHAN_S_ACTIVE) {</span><br><span>@@ -299,6 +420,8 @@</span><br><span>       memcpy(&lchan->meas.uplink[lchan->meas.num_ul_meas++], ulm,</span><br><span>                sizeof(*ulm));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    lchan->meas.last_fn = fn;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -484,11 +607,31 @@</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%);">-        lchan_new_ul_meas(lchan, ulm, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+    uint32_t fn_missed_end;</span><br><span style="color: hsl(120, 100%, 40%);">+       bool missed_end;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    /* Check measurement period end and prepare the UL</span><br><span style="color: hsl(0, 100%, 40%);">-       * measurment report at Meas period End */</span><br><span style="color: hsl(0, 100%, 40%);">-      lchan_meas_check_compute(lchan, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* The measurement processing detects the end of a measurement period</span><br><span style="color: hsl(120, 100%, 40%);">+  * by checking if the received measurement sample is from a SACCH</span><br><span style="color: hsl(120, 100%, 40%);">+      * block. If so, then the measurement computation is performed and the</span><br><span style="color: hsl(120, 100%, 40%);">+         * next cycle starts. However, when the SACCH block is not received</span><br><span style="color: hsl(120, 100%, 40%);">+    * then the associated measurement indication is also skipped. Because</span><br><span style="color: hsl(120, 100%, 40%);">+         * of this we must check now if the measurement interval ended between</span><br><span style="color: hsl(120, 100%, 40%);">+         * the last and the current call of this function */</span><br><span style="color: hsl(120, 100%, 40%);">+  missed_end = is_meas_overdue(lchan, &fn_missed_end, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        if (missed_end) {</span><br><span style="color: hsl(120, 100%, 40%);">+             DEBUGPFN(DMEAS, fn, "%s measurement interval ending missed, catching up...\n", gsm_lchan_name(lchan));</span><br><span style="color: hsl(120, 100%, 40%);">+              /* We missed the end of the interval. Do the computation now</span><br><span style="color: hsl(120, 100%, 40%);">+           * and add the uplink measurement we got as the first sample</span><br><span style="color: hsl(120, 100%, 40%);">+           * of a new interval */</span><br><span style="color: hsl(120, 100%, 40%);">+               lchan_meas_check_compute(lchan, fn_missed_end);</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%);">+    } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* This is the normal case, we first add the measurement sample</span><br><span style="color: hsl(120, 100%, 40%);">+                * to the current interva and run the check+computation */</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 style="color: hsl(120, 100%, 40%);">+  }</span><br><span> }</span><br><span> </span><br><span> /* Reset all measurement related struct members to their initial values. This</span><br><span>@@ -497,4 +640,5 @@</span><br><span> void lchan_meas_reset(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>     memset(&lchan->meas, 0, sizeof(lchan->meas));</span><br><span style="color: hsl(120, 100%, 40%);">+       lchan->meas.last_fn = LCHAN_FN_DUMMY;</span><br><span> }</span><br><span>diff --git a/tests/meas/meas_test.c b/tests/meas/meas_test.c</span><br><span>index 2ba44d3..d40d7cd 100644</span><br><span>--- a/tests/meas/meas_test.c</span><br><span>+++ b/tests/meas/meas_test.c</span><br><span>@@ -9,6 +9,7 @@</span><br><span> #include <osmo-bts/logging.h></span><br><span> #include <osmo-bts/bts.h></span><br><span> #include <osmo-bts/measurement.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/rsl.h></span><br><span> </span><br><span> static struct gsm_bts *bts;</span><br><span> struct gsm_bts_trx *trx;</span><br><span>@@ -117,6 +118,434 @@</span><br><span> </span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* This tests the function is_meas_overdue() and since is_meas_overdue()</span><br><span style="color: hsl(120, 100%, 40%);">+ * internally makes use of is_meas_complete(), this also gives</span><br><span style="color: hsl(120, 100%, 40%);">+ * is_meas_complete() a detailed check. */</span><br><span style="color: hsl(120, 100%, 40%);">+static void test_is_meas_overdue(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+      bool rc;</span><br><span style="color: hsl(120, 100%, 40%);">+      uint32_t fn_missed_end;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("===========================================================\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Testing is_meas_overdue() and is_meas_complete()\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Missing period-end-trigger at fn=12, TCH/F, TS0 */</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[0].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 == 12 + 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=12, TCH/H, TS0 */</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[0].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 == 12 + 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=12, TCH/H, TS1 */</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[1].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 == 12 + 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=25, TCH/F, TS1 */</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[1].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 = 21;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 30);</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);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=25, TCH/H, TS0 */</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[0].lchan[1];</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 = 21;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 30);</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);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=25, TCH/H, TS1 */</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[1].lchan[1];</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 = 21;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 30);</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);</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, 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 = 34;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 43);</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);</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, TCH/H, 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_H;</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 style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 38);</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, TCH/H, 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_H;</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 style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 38);</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, 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 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 style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(rc);</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(fn_missed_end == 51);</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, TCH/H, 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[1];</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 = 47;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 52);</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 == 51);</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, TCH/H, 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[1];</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 = 47;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 52);</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 == 51);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=64, TCH/F, TS4 */</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[4].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 = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</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 == 64);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=64, TCH/H, TS4 */</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[4].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 = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</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 == 64);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=64, TCH/H, TS4 */</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[5].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 = 60;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</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 == 64);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=77, TCH/F, TS5 */</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[5].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 = 73;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 78);</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 == 77);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=77, TCH/H, TS4 */</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[4].lchan[1];</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 = 73;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 78);</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 == 77);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=77, TCH/H, TS5 */</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[5].lchan[1];</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 = 73;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 78);</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 == 77);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=90, TCH/F, TS6 */</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[6].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 = 86;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 91);</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 == 90);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=90, TCH/H, TS6 */</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[6].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 = 86;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 91);</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 == 90);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=90, TCH/H, TS7 */</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[7].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 = 86;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 91);</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 == 90);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Missing period-end-trigger at fn=103, TCH/F, TS7 */</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[7].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 = 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 == 103);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Missing period-end-trigger at fn=103, TCH/H, TS6 */</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[6].lchan[1];</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 = 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 == 103);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Missing period-end-trigger at fn=103, TCH/H, TS7 */</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[7].lchan[1];</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 = 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 == 103);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Dropout inside the interval, no period-end-trigger missed */</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 = 56;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 69);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No dropout, but right after period-end-trigger */</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 = 38;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 39);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No dropout, two neigbouring frames at random position</span><br><span style="color: hsl(120, 100%, 40%);">+       * (should not happen in the real world) */</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 = 43;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 44);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No dropout, Two neigbouring frames (period end, right side) */</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 = 38;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 39);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No dropout, Two neigbouring frames (period end, left side,</span><br><span style="color: hsl(120, 100%, 40%);">+  * should not happen in the real world) */</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 = 37;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 38);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No dropout, test directly on a the trigger frame */</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 = 34;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 38);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* No dropout, previous frame is trigger frame</span><br><span style="color: hsl(120, 100%, 40%);">+         * (should not happen in the real world) */</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 = 38;</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = is_meas_overdue(lchan, &fn_missed_end, 38);</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 == LCHAN_FN_DUMMY);</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+i*104, TCH/F, TS2 to</span><br><span style="color: hsl(120, 100%, 40%);">+    * see the modulus is correct. */</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < 100; i++) {</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 = 34 + 104 * 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                rc = is_meas_overdue(lchan, &fn_missed_end, 43 + 104 * 1);</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 * 1);</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%);">+   /* See whats happening if we miss a period-end-triggerend at the</span><br><span style="color: hsl(120, 100%, 40%);">+       * hyperframe beginning. */</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[0].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 = GSM_MAX_FN-104+95;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = is_meas_overdue(lchan, &fn_missed_end, 17);</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 == 12);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* See whats happening if we miss a period-end-triggerend at the</span><br><span style="color: hsl(120, 100%, 40%);">+       * hyperframe ending. */</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[6].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 = GSM_MAX_FN-104+86;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = is_meas_overdue(lchan, &fn_missed_end, 8);</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 == GSM_MAX_FN-104+90);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* See whats happening if we miss a period-end-triggerend exactly at the</span><br><span style="color: hsl(120, 100%, 40%);">+       * hyperframe ending. */</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[7].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 = GSM_MAX_FN-104+99;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = is_meas_overdue(lchan, &fn_missed_end, 0);</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 == GSM_MAX_FN-1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Test a wrap around at the hyperframe ending, while no measurements</span><br><span style="color: hsl(120, 100%, 40%);">+  * are lost */</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[0].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 = GSM_MAX_FN-104+99;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = is_meas_overdue(lchan, &fn_missed_end, 0);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Test a wrap around at the hyperframe ending, measurements are lost,</span><br><span style="color: hsl(120, 100%, 40%);">+         * but not the one that triggers the period end */</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[0].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 = GSM_MAX_FN-104+95;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = is_meas_overdue(lchan, &fn_missed_end, 4);</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 == LCHAN_FN_DUMMY);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* Test a wrap around right before the hyperframe ending, while no</span><br><span style="color: hsl(120, 100%, 40%);">+     * measurements are lost. */</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[7].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 = GSM_MAX_FN-104+99;</span><br><span style="color: hsl(120, 100%, 40%);">+   rc = is_meas_overdue(lchan, &fn_missed_end, GSM_MAX_FN-1);</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 == LCHAN_FN_DUMMY);</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%);">+/* This tests the robustness of lchan_meas_process_measurement(). This is the</span><br><span style="color: hsl(120, 100%, 40%);">+ * function that is called from l1_sap.c each time a measurement indication is</span><br><span style="color: hsl(120, 100%, 40%);">+ * received. The process must still go on when measurement indications (blocks)</span><br><span style="color: hsl(120, 100%, 40%);">+ * are lost or otherwise spaced out. Even the complete absence of the</span><br><span style="color: hsl(120, 100%, 40%);">+ * measurement indications from the SACCH which are used to detect the interval</span><br><span style="color: hsl(120, 100%, 40%);">+ * end must not keep the interval from beeing processed. */</span><br><span style="color: hsl(120, 100%, 40%);">+void test_lchan_meas_process_measurement(bool no_sacch, bool dropouts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_lchan *lchan = &trx->ts[2].lchan[0];</span><br><span style="color: hsl(120, 100%, 40%);">+        unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       unsigned int k = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+   unsigned int fn = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct bts_ul_meas ulm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("\n\n");</span><br><span style="color: hsl(120, 100%, 40%);">+     printf("===========================================================\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("Testing lchan_meas_process_measurement()\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       if (no_sacch)</span><br><span style="color: hsl(120, 100%, 40%);">+         printf(" * SACCH blocks not generated.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (dropouts)</span><br><span style="color: hsl(120, 100%, 40%);">+         printf</span><br><span style="color: hsl(120, 100%, 40%);">+                    (" * Simulate dropouts by leaving out every 4th measurement\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      ulm.ber10k = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       ulm.ta_offs_256bits = 256;</span><br><span style="color: hsl(120, 100%, 40%);">+    ulm.c_i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+  ulm.is_sub = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+       ulm.inv_rssi = 90;</span><br><span style="color: hsl(120, 100%, 40%);">+</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%);">+     reset_lchan_meas(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* feed uplink measurements into the code */</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < 100; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+              if (dropouts == false || i % 4)</span><br><span style="color: hsl(120, 100%, 40%);">+                       lchan_meas_process_measurement(lchan, &ulm, fn);</span><br><span style="color: hsl(120, 100%, 40%);">+          else</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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           fn += 4;</span><br><span style="color: hsl(120, 100%, 40%);">+              if (k == 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 fn++;</span><br><span style="color: hsl(120, 100%, 40%);">+                 k = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                } else</span><br><span style="color: hsl(120, 100%, 40%);">+                        k++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+                if (fn % 104 == 39 && no_sacch == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    printf</span><br><span style="color: hsl(120, 100%, 40%);">+                            ("(now adding measurement sample for SACCH block)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                  lchan_meas_process_measurement(lchan, &ulm, fn - 1);</span><br><span style="color: hsl(120, 100%, 40%);">+              } else</span><br><span style="color: hsl(120, 100%, 40%);">+                        printf</span><br><span style="color: hsl(120, 100%, 40%);">+                            ("(leaving out measurement sample for SACCH block)\n");</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%);">+</span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span>       void *tall_bts_ctx;</span><br><span>@@ -172,6 +601,17 @@</span><br><span>   test_meas_compute(&mtc4);</span><br><span>        test_meas_compute(&mtc5);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+     printf("\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       printf("***************************************************\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("*** MEASUREMENT INTERVAL ENDING DETECTION TESTS ***\n");</span><br><span style="color: hsl(120, 100%, 40%);">+    printf("***************************************************\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  test_is_meas_overdue();</span><br><span style="color: hsl(120, 100%, 40%);">+       test_lchan_meas_process_measurement(false, false);</span><br><span style="color: hsl(120, 100%, 40%);">+    test_lchan_meas_process_measurement(true, false);</span><br><span style="color: hsl(120, 100%, 40%);">+     test_lchan_meas_process_measurement(false, true);</span><br><span style="color: hsl(120, 100%, 40%);">+     test_lchan_meas_process_measurement(true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   printf("Success\n");</span><br><span> </span><br><span>   return 0;</span><br><span>diff --git a/tests/meas/meas_test.ok b/tests/meas/meas_test.ok</span><br><span>index 026899d..77b652e 100644</span><br><span>--- a/tests/meas/meas_test.ok</span><br><span>+++ b/tests/meas/meas_test.ok</span><br><span>@@ -573,4 +573,482 @@</span><br><span> meas.ext.toa256_std_dev  |      0 |      0</span><br><span> meas.ul_res.full.rx_lev  |     20 |     20</span><br><span> meas.ul_res.full.rx_qual |      0 |      0</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%);">+*** MEASUREMENT INTERVAL ENDING DETECTION TESTS ***</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Testing is_meas_overdue() and is_meas_complete()</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%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Testing lchan_meas_process_measurement()</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</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%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Testing lchan_meas_process_measurement()</span><br><span style="color: hsl(120, 100%, 40%);">+ * SACCH blocks not generated.</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</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%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Testing lchan_meas_process_measurement()</span><br><span style="color: hsl(120, 100%, 40%);">+ * Simulate dropouts by leaving out every 4th measurement</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 0)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 17)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 34)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 52)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 69)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 86)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 104)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 121)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 138)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 156)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 173)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 190)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 208)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 225)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 242)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 260)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 277)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 294)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 312)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 329)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 346)</span><br><span style="color: hsl(120, 100%, 40%);">+(now adding measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 364)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 381)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 398)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 416)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</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%);">+===========================================================</span><br><span style="color: hsl(120, 100%, 40%);">+Testing lchan_meas_process_measurement()</span><br><span style="color: hsl(120, 100%, 40%);">+ * SACCH blocks not generated.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Simulate dropouts by leaving out every 4th measurement</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 0)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 17)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 34)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 52)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 69)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 86)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 104)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 121)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 138)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 156)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 173)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 190)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 208)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 225)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 242)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 260)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 277)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 294)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 312)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 329)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 346)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 364)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 381)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 398)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for frame number 416)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span style="color: hsl(120, 100%, 40%);">+(leaving out measurement sample for SACCH block)</span><br><span> Success</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/10492">change 10492</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/10492"/><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: I3a86cd8185cc6b94258373fe929f0c2f1cf27cfa </div>
<div style="display:none"> Gerrit-Change-Number: 10492 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </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: dexter <pmaier@sysmocom.de> </div>