<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>