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