<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21977">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hodec2: clarify current and target rxlev per candidate<br><br>Store the rxlev of the current lchan and the target BTS in the<br>ho_candidate, to clarify the code.<br><br>No functional change, cosmetically prepare for<br>I2704899c85c35dfd4eba43468452483f40016ca2.<br><br>Change-Id: Ie6c165e17bb3c99eebc967a6bb02529db8bdfc98<br>---<br>M src/osmo-bsc/handover_decision_2.c<br>1 file changed, 51 insertions(+), 48 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/77/21977/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 7854f09..ae9435f 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>@@ -104,7 +104,8 @@</span><br><span> struct gsm_bts *bts; /* target BTS in local BSS */</span><br><span> const struct gsm0808_cell_id_list2 *cil; /* target cells in remote BSS */</span><br><span> uint8_t requirements; /* what is fulfilled */</span><br><span style="color: hsl(0, 100%, 40%);">- int avg; /* average RX level */</span><br><span style="color: hsl(120, 100%, 40%);">+ int rxlev_current;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rxlev_target;</span><br><span> };</span><br><span> </span><br><span> enum ho_reason {</span><br><span>@@ -236,6 +237,15 @@</span><br><span> return NULL;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int current_rxlev(struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ return get_meas_rep_avg(lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+ ho_get_hodec2_full_tdma(bts->ho) ?</span><br><span style="color: hsl(120, 100%, 40%);">+ MEAS_REP_DL_RXLEV_FULL : MEAS_REP_DL_RXLEV_SUB,</span><br><span style="color: hsl(120, 100%, 40%);">+ ho_get_hodec2_rxlev_avg_win(bts->ho));</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* obtain averaged rxlev for given neighbor */</span><br><span> static int neigh_meas_avg(struct neigh_meas_proc *nmp, int window)</span><br><span> {</span><br><span>@@ -814,7 +824,7 @@</span><br><span> </span><br><span> /* verbosely log about a handover candidate */</span><br><span> static inline void debug_candidate(struct ho_candidate *candidate,</span><br><span style="color: hsl(0, 100%, 40%);">- int8_t rxlev, int tchf_count, int tchh_count)</span><br><span style="color: hsl(120, 100%, 40%);">+ int tchf_count, int tchh_count)</span><br><span> {</span><br><span> struct gsm_lchan *lchan = candidate->lchan;</span><br><span> </span><br><span>@@ -831,25 +841,25 @@</span><br><span> if (candidate->cil)</span><br><span> LOGPHOLCHANTOREMOTE(lchan, candidate->cil, LOGL_DEBUG,</span><br><span> "RX level %d dBm -> %d dBm\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(rxlev), rxlev2dbm(candidate->avg));</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(candidate->rxlev_current), rxlev2dbm(candidate->rxlev_target));</span><br><span> </span><br><span> if (candidate->bts == lchan->ts->trx->bts)</span><br><span> LOGPHOLCHANTOBTS(lchan, candidate->bts, LOGL_DEBUG,</span><br><span> "RX level %d dBm; "</span><br><span> HO_CANDIDATE_FMT(f, F) "; " HO_CANDIDATE_FMT(h, H) "\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(candidate->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(candidate->rxlev_current),</span><br><span> HO_CANDIDATE_ARGS(f, F), HO_CANDIDATE_ARGS(h, H));</span><br><span> else if (candidate->bts)</span><br><span> LOGPHOLCHANTOBTS(lchan, candidate->bts, LOGL_DEBUG,</span><br><span> "RX level %d dBm -> %d dBm; "</span><br><span> HO_CANDIDATE_FMT(f, F) "; " HO_CANDIDATE_FMT(h, H) "\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(rxlev), rxlev2dbm(candidate->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(candidate->rxlev_current), rxlev2dbm(candidate->rxlev_target),</span><br><span> HO_CANDIDATE_ARGS(f, F), HO_CANDIDATE_ARGS(h, H));</span><br><span> }</span><br><span> </span><br><span> /* add candidate for re-assignment within the current cell */</span><br><span> static void collect_assignment_candidate(struct gsm_lchan *lchan, struct ho_candidate *clist,</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int *candidates, int av_rxlev)</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int *candidates, int rxlev_current)</span><br><span> {</span><br><span> struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span> int tchf_count, tchh_count;</span><br><span>@@ -862,10 +872,11 @@</span><br><span> .lchan = lchan,</span><br><span> .bts = bts,</span><br><span> .requirements = check_requirements(lchan, bts, tchf_count, tchh_count),</span><br><span style="color: hsl(0, 100%, 40%);">- .avg = av_rxlev,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rxlev_current = rxlev_current,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rxlev_target = rxlev_current, /* same cell, same rxlev */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- debug_candidate(&c, 0, tchf_count, tchh_count);</span><br><span style="color: hsl(120, 100%, 40%);">+ debug_candidate(&c, tchf_count, tchh_count);</span><br><span> </span><br><span> if (!c.requirements)</span><br><span> return;</span><br><span>@@ -877,7 +888,7 @@</span><br><span> /* add candidates for handover to all neighbor cells */</span><br><span> static void collect_handover_candidate(struct gsm_lchan *lchan, struct neigh_meas_proc *nmp,</span><br><span> struct ho_candidate *clist, unsigned int *candidates,</span><br><span style="color: hsl(0, 100%, 40%);">- bool include_weaker_rxlev, int av_rxlev,</span><br><span style="color: hsl(120, 100%, 40%);">+ bool include_weaker_rxlev, int rxlev_current,</span><br><span> int *neighbors_count)</span><br><span> {</span><br><span> struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span>@@ -890,7 +901,6 @@</span><br><span> .arfcn = nmp->arfcn,</span><br><span> .bsic = nmp->bsic,</span><br><span> };</span><br><span style="color: hsl(0, 100%, 40%);">- int avg;</span><br><span> struct ho_candidate c;</span><br><span> int min_rxlev;</span><br><span> struct handover_cfg *neigh_cfg;</span><br><span>@@ -929,27 +939,25 @@</span><br><span> * instead assume the local BTS' config to apply. */</span><br><span> neigh_cfg = (neighbor_bts ? : bts)->ho;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* calculate average rxlev for this cell over the window */</span><br><span style="color: hsl(0, 100%, 40%);">- avg = neigh_meas_avg(nmp, ho_get_hodec2_rxlev_neigh_avg_win(bts->ho));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> c = (struct ho_candidate){</span><br><span> .lchan = lchan,</span><br><span style="color: hsl(0, 100%, 40%);">- .avg = avg,</span><br><span> .nik = ni,</span><br><span> .bts = neighbor_bts,</span><br><span> .cil = neighbor_cil,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rxlev_current = rxlev_current,</span><br><span style="color: hsl(120, 100%, 40%);">+ .rxlev_target = neigh_meas_avg(nmp, ho_get_hodec2_rxlev_neigh_avg_win(bts->ho)),</span><br><span> };</span><br><span> </span><br><span> /* Heed rxlev hysteresis only if the RXLEV/RXQUAL/TA levels of the MS aren't critically bad and</span><br><span> * we're just looking for an improvement. If levels are critical, we desperately need a handover</span><br><span> * and thus skip the hysteresis check. */</span><br><span> if (!include_weaker_rxlev) {</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int pwr_hyst = ho_get_hodec2_pwr_hysteresis(bts->ho);</span><br><span style="color: hsl(0, 100%, 40%);">- if (avg <= (av_rxlev + pwr_hyst)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ int pwr_hyst = ho_get_hodec2_pwr_hysteresis(bts->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((c.rxlev_target - c.rxlev_current) <= pwr_hyst) {</span><br><span> LOGPHOCAND(&c, LOGL_DEBUG,</span><br><span> "Not a candidate, because RX level (%d dBm) is lower"</span><br><span> " or equal than current RX level (%d dBm) + hysteresis (%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(avg), rxlev2dbm(av_rxlev), pwr_hyst);</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(c.rxlev_target), rxlev2dbm(c.rxlev_current), pwr_hyst);</span><br><span> return;</span><br><span> }</span><br><span> }</span><br><span>@@ -957,11 +965,11 @@</span><br><span> /* if the minimum level is not reached.</span><br><span> * In case of a remote-BSS, use the current BTS' configuration. */</span><br><span> min_rxlev = ho_get_hodec2_min_rxlev(neigh_cfg);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rxlev2dbm(avg) < min_rxlev) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rxlev2dbm(c.rxlev_target) < min_rxlev) {</span><br><span> LOGPHOCAND(&c, LOGL_DEBUG,</span><br><span> "Not a candidate, because RX level (%d dBm) is lower"</span><br><span> " than the minimum required RX level (%d dBm)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(avg), min_rxlev);</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(c.rxlev_target), min_rxlev);</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span>@@ -973,7 +981,7 @@</span><br><span> } else</span><br><span> c.requirements = check_requirements_remote_bss(lchan, neighbor_cil);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- debug_candidate(&c, av_rxlev, tchf_count, tchh_count);</span><br><span style="color: hsl(120, 100%, 40%);">+ debug_candidate(&c, tchf_count, tchh_count);</span><br><span> </span><br><span> if (!c.requirements)</span><br><span> return;</span><br><span>@@ -984,30 +992,25 @@</span><br><span> </span><br><span> static void collect_candidates_for_lchan(struct gsm_lchan *lchan,</span><br><span> struct ho_candidate *clist, unsigned int *candidates,</span><br><span style="color: hsl(0, 100%, 40%);">- int *_av_rxlev, bool include_weaker_rxlev)</span><br><span style="color: hsl(120, 100%, 40%);">+ int *_rxlev_current, bool include_weaker_rxlev)</span><br><span> {</span><br><span> struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">- int av_rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rxlev_current;</span><br><span> bool assignment;</span><br><span> bool handover;</span><br><span> int neighbors_count = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int rxlev_avg_win = ho_get_hodec2_rxlev_avg_win(bts->ho);</span><br><span> </span><br><span> OSMO_ASSERT(candidates);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* calculate average rxlev for this cell over the window */</span><br><span style="color: hsl(0, 100%, 40%);">- av_rxlev = get_meas_rep_avg(lchan,</span><br><span style="color: hsl(0, 100%, 40%);">- ho_get_hodec2_full_tdma(bts->ho) ?</span><br><span style="color: hsl(0, 100%, 40%);">- MEAS_REP_DL_RXLEV_FULL : MEAS_REP_DL_RXLEV_SUB,</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev_avg_win);</span><br><span style="color: hsl(0, 100%, 40%);">- if (_av_rxlev)</span><br><span style="color: hsl(0, 100%, 40%);">- *_av_rxlev = av_rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev_current = current_rxlev(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (_rxlev_current)</span><br><span style="color: hsl(120, 100%, 40%);">+ *_rxlev_current = rxlev_current;</span><br><span> </span><br><span> /* in case there is no measurement report (yet) */</span><br><span style="color: hsl(0, 100%, 40%);">- if (av_rxlev < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rxlev_current < 0) {</span><br><span> LOGPHOLCHAN(lchan, LOGL_DEBUG, "Not collecting candidates, not enough measurements"</span><br><span> " (got %d, want %u)\n",</span><br><span style="color: hsl(0, 100%, 40%);">- lchan->meas_rep_count, rxlev_avg_win);</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan->meas_rep_count, ho_get_hodec2_rxlev_avg_win(bts->ho));</span><br><span> return;</span><br><span> }</span><br><span> </span><br><span>@@ -1015,14 +1018,14 @@</span><br><span> handover = ho_get_ho_active(bts->ho);</span><br><span> </span><br><span> if (assignment)</span><br><span style="color: hsl(0, 100%, 40%);">- collect_assignment_candidate(lchan, clist, candidates, av_rxlev);</span><br><span style="color: hsl(120, 100%, 40%);">+ collect_assignment_candidate(lchan, clist, candidates, rxlev_current);</span><br><span> </span><br><span> if (handover) {</span><br><span> int i;</span><br><span> for (i = 0; i < ARRAY_SIZE(lchan->neigh_meas); i++) {</span><br><span> collect_handover_candidate(lchan, &lchan->neigh_meas[i],</span><br><span> clist, candidates,</span><br><span style="color: hsl(0, 100%, 40%);">- include_weaker_rxlev, av_rxlev, &neighbors_count);</span><br><span style="color: hsl(120, 100%, 40%);">+ include_weaker_rxlev, rxlev_current, &neighbors_count);</span><br><span> }</span><br><span> }</span><br><span> }</span><br><span>@@ -1083,7 +1086,7 @@</span><br><span> struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span> int ahs = (lchan->tch_mode == GSM48_CMODE_SPEECH_AMR</span><br><span> && lchan->type == GSM_LCHAN_TCH_H);</span><br><span style="color: hsl(0, 100%, 40%);">- int av_rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rxlev_current;</span><br><span> struct ho_candidate clist[1 + ARRAY_SIZE(lchan->neigh_meas)];</span><br><span> unsigned int candidates = 0;</span><br><span> int i;</span><br><span>@@ -1099,7 +1102,7 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- collect_candidates_for_lchan(lchan, clist, &candidates, &av_rxlev, include_weaker_rxlev);</span><br><span style="color: hsl(120, 100%, 40%);">+ collect_candidates_for_lchan(lchan, clist, &candidates, &rxlev_current, include_weaker_rxlev);</span><br><span> </span><br><span> /* If assignment is disabled and no neighbor cell report exists, or no neighbor cell qualifies,</span><br><span> * we may not even have any candidates. */</span><br><span>@@ -1121,7 +1124,7 @@</span><br><span> if (!clist[i].bts)</span><br><span> continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- better = clist[i].avg - av_rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+ better = clist[i].rxlev_target - clist[i].rxlev_current;</span><br><span> /* Apply AFS bias? */</span><br><span> afs_bias = 0;</span><br><span> if (ahs && (clist[i].requirements & REQUIREMENT_B_TCHF))</span><br><span>@@ -1137,7 +1140,7 @@</span><br><span> /* perform handover, if there is a candidate */</span><br><span> if (best_cand) {</span><br><span> LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate, RX level %d%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> best_applied_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span> return trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_B_MASK);</span><br><span> }</span><br><span>@@ -1154,7 +1157,7 @@</span><br><span> if (!clist[i].bts)</span><br><span> continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- better = clist[i].avg - av_rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+ better = clist[i].rxlev_target - clist[i].rxlev_current;</span><br><span> /* Apply AFS bias? */</span><br><span> afs_bias = 0;</span><br><span> if (ahs && (clist[i].requirements & REQUIREMENT_C_TCHF))</span><br><span>@@ -1170,7 +1173,7 @@</span><br><span> /* perform handover, if there is a candidate */</span><br><span> if (best_cand) {</span><br><span> LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate, RX level %d%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> best_applied_afs_bias? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span> return trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_C_MASK);</span><br><span> }</span><br><span>@@ -1191,7 +1194,7 @@</span><br><span> if (!(clist[i].requirements & REQUIREMENT_A_MASK))</span><br><span> continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- better = clist[i].avg - av_rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+ better = clist[i].rxlev_target - clist[i].rxlev_current;</span><br><span> /* Apply AFS bias?</span><br><span> * (never to remote-BSS neighbors, since we will not change the lchan type for those.) */</span><br><span> afs_bias = 0;</span><br><span>@@ -1209,7 +1212,7 @@</span><br><span> /* perform handover, if there is a candidate */</span><br><span> if (best_cand) {</span><br><span> LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate: RX level %d%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> best_applied_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span> return trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_A_MASK);</span><br><span> }</span><br><span>@@ -1475,7 +1478,7 @@</span><br><span> && (intra_cell && upgrade_to_tch_f))</span><br><span> continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- avg_rxlev = c->avg;</span><br><span style="color: hsl(120, 100%, 40%);">+ avg_rxlev = c->rxlev_target;</span><br><span> </span><br><span> /* improve AHS */</span><br><span> if (upgrade_to_tch_f)</span><br><span>@@ -1639,7 +1642,7 @@</span><br><span> LOGPHOCAND(&clist[i], LOGL_DEBUG, "#%d: req={TCH/F:" REQUIREMENTS_FMT ", TCH/H:" REQUIREMENTS_FMT "} avg-rxlev=%d dBm\n",</span><br><span> i, REQUIREMENTS_ARGS(clist[i].requirements, F),</span><br><span> REQUIREMENTS_ARGS(clist[i].requirements, H),</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(clist[i].avg));</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(clist[i].rxlev_target));</span><br><span> }</span><br><span> }</span><br><span> </span><br><span>@@ -1662,7 +1665,7 @@</span><br><span> if (best_cand) {</span><br><span> any_ho = 1;</span><br><span> LOGPHOCAND(best_cand, LOGL_DEBUG, "Best candidate: RX level %d%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> is_improved ? " (applied AHS->AFS bias)" : "");</span><br><span> trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_B_MASK);</span><br><span> #if 0</span><br><span>@@ -1703,7 +1706,7 @@</span><br><span> if (best_cand) {</span><br><span> any_ho = 1;</span><br><span> LOGPHOCAND(best_cand, LOGL_INFO, "Worst candidate: RX level %d from TCH/H -> TCH/F%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> is_improved ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span> trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_B_MASK);</span><br><span> #if 0</span><br><span>@@ -1738,7 +1741,7 @@</span><br><span> if (best_cand) {</span><br><span> any_ho = 1;</span><br><span> LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate: RX level %d%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> is_improved ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span> trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_C_MASK);</span><br><span> #if 0</span><br><span>@@ -1781,7 +1784,7 @@</span><br><span> if (best_cand) {</span><br><span> any_ho = 1;</span><br><span> LOGPHOCAND(best_cand, LOGL_INFO, "Worst candidate: RX level %d from TCH/H -> TCH/F%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">- rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+ rxlev2dbm(best_cand->rxlev_target),</span><br><span> is_improved ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span> trigger_ho(best_cand, best_cand->requirements & REQUIREMENT_C_MASK);</span><br><span> #if 0</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21977">change 21977</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/+/21977"/><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: Ie6c165e17bb3c99eebc967a6bb02529db8bdfc98 </div>
<div style="display:none"> Gerrit-Change-Number: 21977 </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>