<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24607">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hodec2: implement upgrade TCH/H -> TCH/F (without AFS bias)<br><br>Pass flag into find_alternative_lchan() indicating that a TCH/H channel<br>has low ratings (rxqual or rxlev, doesn't matter).<br><br>Heed this flag in the last round, the requirement A check, and allow<br>candidates that have equal rxlev, if they result in an upgrade from<br>TCH/H to TCH/F. This allows intra-cell upgrades to TCH/F.<br><br>An important point is that this patch allows upgrade to TCH/F *without*<br>the AFS bias setting. See also I315f24123ae016887ab91666870ce252e096f90f.<br><br>Related: SYS#5198 SYS#5365<br>Change-Id: Id40d1cf8b58410c7d4eb87407fe8b8106e352438<br>---<br>M src/osmo-bsc/handover_decision_2.c<br>M tests/handover/test_amr_tch_h_to_f_rxlev.ho_vty<br>M tests/handover/test_amr_tch_h_to_f_rxlev_congested.ho_vty<br>M tests/handover/test_amr_tch_h_to_f_rxqual.ho_vty<br>M tests/handover/test_amr_tch_h_to_f_rxqual_congested.ho_vty<br>5 files changed, 34 insertions(+), 54 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/07/24607/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c</span><br><span>index a866293..9d4f1e9 100644</span><br><span>--- a/src/osmo-bsc/handover_decision_2.c</span><br><span>+++ b/src/osmo-bsc/handover_decision_2.c</span><br><span>@@ -1251,7 +1251,7 @@</span><br><span>  * If minimum RXLEV, minimum RXQUAL or maximum TA are exceeded, the caller should pass</span><br><span>  * include_weaker_rxlev=true so that handover is performed despite congestion.</span><br><span>  */</span><br><span style="color: hsl(0, 100%, 40%);">-static int find_alternative_lchan(struct gsm_lchan *lchan, bool include_weaker_rxlev)</span><br><span style="color: hsl(120, 100%, 40%);">+static int find_alternative_lchan(struct gsm_lchan *lchan, bool include_weaker_rxlev, bool request_upgrade_to_tch_f)</span><br><span> {</span><br><span>        struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span>  int ahs = (gsm48_chan_mode_to_non_vamos(lchan->current_ch_mode_rate.chan_mode) == GSM48_CMODE_SPEECH_AMR</span><br><span>@@ -1372,7 +1372,11 @@</span><br><span>                     && clist[i].target.bts)</span><br><span>                  afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].target.bts->ho);</span><br><span>                 better += afs_bias;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (better > best_better_db) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (better > best_better_db</span><br><span style="color: hsl(120, 100%, 40%);">+                    || (better >= best_better_db /* Upgrade from TCH/H to TCH/F: allow for equal rxlev */</span><br><span style="color: hsl(120, 100%, 40%);">+                  && request_upgrade_to_tch_f</span><br><span style="color: hsl(120, 100%, 40%);">+                   && is_upgrade_to_tchf(&clist[i], REQUIREMENT_A_MASK))) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>                       best_cand = &clist[i];</span><br><span>                   best_better_db = better;</span><br><span>                     best_applied_afs_bias = afs_bias? true : false;</span><br><span>@@ -1494,7 +1498,7 @@</span><br><span>                      global_ho_reason = HO_REASON_BAD_QUALITY;</span><br><span>                    LOGPHOLCHAN(lchan, LOGL_INFO, "Trying handover/assignment due to bad quality\n");</span><br><span>          }</span><br><span style="color: hsl(0, 100%, 40%);">-               find_alternative_lchan(lchan, true);</span><br><span style="color: hsl(120, 100%, 40%);">+          find_alternative_lchan(lchan, true, true);</span><br><span>           return;</span><br><span>      }</span><br><span> </span><br><span>@@ -1503,7 +1507,7 @@</span><br><span>                global_ho_reason = HO_REASON_LOW_RXLEVEL;</span><br><span>            LOGPHOLCHAN(lchan, LOGL_NOTICE, "RX level is TOO LOW: %d < %d\n",</span><br><span>                           rxlev2dbm(av_rxlev), ho_get_hodec2_min_rxlev(bts->ho));</span><br><span style="color: hsl(0, 100%, 40%);">-          find_alternative_lchan(lchan, true);</span><br><span style="color: hsl(120, 100%, 40%);">+          find_alternative_lchan(lchan, true, true);</span><br><span>           return;</span><br><span>      }</span><br><span> </span><br><span>@@ -1521,7 +1525,7 @@</span><br><span>                gsm_bts_cell_id(&bts_id, bts);</span><br><span>           penalty_timers_add(lchan->conn, &lchan->conn->hodec2.penalty_timers, &bts_id,</span><br><span>                                  ho_get_hodec2_penalty_max_dist(bts->ho));</span><br><span style="color: hsl(0, 100%, 40%);">-         find_alternative_lchan(lchan, true);</span><br><span style="color: hsl(120, 100%, 40%);">+          find_alternative_lchan(lchan, true, false);</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span>@@ -1532,7 +1536,7 @@</span><br><span>        /* try handover to a better cell */</span><br><span>  if (av_rxlev >= 0 && (mr->nr % pwr_interval) == 0) {</span><br><span>           global_ho_reason = HO_REASON_BETTER_CELL;</span><br><span style="color: hsl(0, 100%, 40%);">-               find_alternative_lchan(lchan, false);</span><br><span style="color: hsl(120, 100%, 40%);">+         find_alternative_lchan(lchan, false, false);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/handover/test_amr_tch_h_to_f_rxlev.ho_vty b/tests/handover/test_amr_tch_h_to_f_rxlev.ho_vty</span><br><span>index 34fb5e6..a22ad6d 100644</span><br><span>--- a/tests/handover/test_amr_tch_h_to_f_rxlev.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_h_to_f_rxlev.ho_vty</span><br><span>@@ -12,7 +12,5 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 23 rxqual 1 ta 0</span><br><span> # average rxlev is now -110 + 23 = -87 < -80: reassign to TCH/F due to bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states * TCH/F - - - - - *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - *</span><br><span>diff --git a/tests/handover/test_amr_tch_h_to_f_rxlev_congested.ho_vty b/tests/handover/test_amr_tch_h_to_f_rxlev_congested.ho_vty</span><br><span>index a463387..776b093 100644</span><br><span>--- a/tests/handover/test_amr_tch_h_to_f_rxlev_congested.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_h_to_f_rxlev_congested.ho_vty</span><br><span>@@ -14,10 +14,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 23 rxqual 1 ta 0</span><br><span> # average rxlev is now -110 + 23 = -87 < -80: reassign to TCH/F due to bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F -     -     TCH/-H TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F -     -     TCH/-H TCH/HH *    *</span><br><span> </span><br><span> </span><br><span> # This situation actually balances congestion</span><br><span>@@ -27,10 +25,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 23 rxqual 1 ta 0</span><br><span> # average rxlev is now -110 + 23 = -87 < -80: reassign to TCH/F due to bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     TCH/-H TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     TCH/-H TCH/HH *    *</span><br><span> </span><br><span> # This situation moves congestion from TCH/H to TCH/F (TCH/H was 100% congested, then makes TCH/F 100% congested)</span><br><span> # The congestion requirements would normally forbid this, but since this is an "RxQual emergency", we should reassign.</span><br><span>@@ -40,10 +36,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 23 rxqual 1 ta 0</span><br><span> # average rxlev is now -110 + 23 = -87 < -80: reassign to TCH/F due to bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F TCH/-H TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F TCH/-H TCH/HH *    *</span><br><span> </span><br><span> # This situation worsens congestion (TCH/H was 50% congested, then makes TCH/F 100% congested)</span><br><span> # The congestion requirements would normally forbid this, but since this is an "RxQual emergency", we should reassign.</span><br><span>@@ -53,10 +47,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 23 rxqual 1 ta 0</span><br><span> # average rxlev is now -110 + 23 = -87 < -80: reassign to TCH/F due to bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F -      TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F -      TCH/HH *    *</span><br><span> </span><br><span> </span><br><span> # This situation creates congestion (TCH/H was not congested, then makes TCH/F 50% congested)</span><br><span>@@ -67,7 +59,5 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 23 rxqual 1 ta 0</span><br><span> # average rxlev is now -110 + 23 = -87 < -80: reassign to TCH/F due to bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     -      -      *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxlev</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     -      -      *    *</span><br><span>diff --git a/tests/handover/test_amr_tch_h_to_f_rxqual.ho_vty b/tests/handover/test_amr_tch_h_to_f_rxqual.ho_vty</span><br><span>index 414a5fd..10db404 100644</span><br><span>--- a/tests/handover/test_amr_tch_h_to_f_rxqual.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_h_to_f_rxqual.ho_vty</span><br><span>@@ -12,7 +12,5 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 30 rxqual 6 ta 0</span><br><span> # average rxqual now at 6 which is worse than 5, reassign to TCH/F due to bad rxqual.</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states * TCH/F - - - - - *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxqual</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states * TCH/F - - - - - *</span><br><span>diff --git a/tests/handover/test_amr_tch_h_to_f_rxqual_congested.ho_vty b/tests/handover/test_amr_tch_h_to_f_rxqual_congested.ho_vty</span><br><span>index 30c2c67..79ff0a7 100644</span><br><span>--- a/tests/handover/test_amr_tch_h_to_f_rxqual_congested.ho_vty</span><br><span>+++ b/tests/handover/test_amr_tch_h_to_f_rxqual_congested.ho_vty</span><br><span>@@ -17,10 +17,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 50 rxqual 6 ta 0</span><br><span> # average rxqual now at 6 which is worse than 5, reassign to TCH/F due to bad rxqual.</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F -     -     TCH/-H TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxqual</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 1 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F -     -     TCH/-H TCH/HH *    *</span><br><span> </span><br><span> </span><br><span> # This situation actually balances congestion</span><br><span>@@ -30,10 +28,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 50 rxqual 6 ta 0</span><br><span> # average rxqual now at 6 which is worse than 5, reassign to TCH/F due to bad rxqual.</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     TCH/-H TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxqual</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     TCH/-H TCH/HH *    *</span><br><span> </span><br><span> </span><br><span> # This situation moves congestion from TCH/H to TCH/F (TCH/H was 100% congested, then makes TCH/F 100% congested)</span><br><span>@@ -44,10 +40,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 50 rxqual 6 ta 0</span><br><span> # average rxqual now at 6 which is worse than 5, reassign to TCH/F due to bad rxqual.</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F TCH/-H TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxqual</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F TCH/-H TCH/HH *    *</span><br><span> </span><br><span> </span><br><span> # This situation worsens congestion (TCH/H was 50% congested, then makes TCH/F 100% congested)</span><br><span>@@ -58,10 +52,8 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 50 rxqual 6 ta 0</span><br><span> # average rxqual now at 6 which is worse than 5, reassign to TCH/F due to bad rxqual.</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F -      TCH/HH *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxqual</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 3 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F TCH/F -      TCH/HH *    *</span><br><span> </span><br><span> </span><br><span> # This situation creates congestion (TCH/H was not congested, then makes TCH/F 50% congested)</span><br><span>@@ -72,7 +64,5 @@</span><br><span> expect-no-chan</span><br><span> meas-rep lchan 0 0 4 0 rxlev 50 rxqual 6 ta 0</span><br><span> # average rxqual now at 6 which is worse than 5, reassign to TCH/F due to bad rxqual.</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(0, 100%, 40%);">-#expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     -      -      *    *</span><br><span style="color: hsl(0, 100%, 40%);">-# FAIL: osmo-bsc does not move to TCH/F from bad rxqual</span><br><span style="color: hsl(0, 100%, 40%);">-expect-no-chan</span><br><span style="color: hsl(120, 100%, 40%);">+expect-as from lchan 0 0 4 0 to lchan 0 0 2 0</span><br><span style="color: hsl(120, 100%, 40%);">+expect-ts-use trx 0 0 states     *    TCH/F TCH/F -     -      -      *    *</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24607">change 24607</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/c/osmo-bsc/+/24607"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Id40d1cf8b58410c7d4eb87407fe8b8106e352438 </div>
<div style="display:none"> Gerrit-Change-Number: 24607 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>