<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21986">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">hodec2: cosmetic: clarify ho_candidate.{current,target}<br><br>So far it is often confusing which cell a specific member refers to.<br>Clarify lchan, bts, ... to current.lchan, target.bts, ...<br><br>Also move the rxlev_{current,target} to {current,target}.rxlev.<br><br>Eliminate numerous local variables to make it easier to read which side<br>is being used (e.g. "c->target.bts" instead of just "bts").<br><br>No functional change.<br><br>Change-Id: I06898eb745a5be548df0b76fa760ce790cfab3ed<br>---<br>M src/osmo-bsc/handover_decision_2.c<br>1 file changed, 107 insertions(+), 97 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/86/21986/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 1ab92f5..77b6e6b 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>@@ -79,10 +79,10 @@</span><br><span>          ## args)</span><br><span> </span><br><span> #define LOGPHOCAND(candidate, level, fmt, args...) do {\</span><br><span style="color: hsl(0, 100%, 40%);">-   if ((candidate)->bts) \</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPHOLCHANTOBTS((candidate)->lchan, (candidate)->bts, level, fmt, ## args); \</span><br><span style="color: hsl(0, 100%, 40%);">-    else if ((candidate)->cil) \</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGPHOLCHANTOREMOTE((candidate)->lchan, (candidate)->cil, level, fmt, ## args); \</span><br><span style="color: hsl(120, 100%, 40%);">+       if ((candidate)->target.bts) \</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOLCHANTOBTS((candidate)->current.lchan, (candidate)->target.bts, level, fmt, ## args); \</span><br><span style="color: hsl(120, 100%, 40%);">+   else if ((candidate)->target.cil) \</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPHOLCHANTOREMOTE((candidate)->current.lchan, (candidate)->target.cil, level, fmt, ## args); \</span><br><span>       } while(0)</span><br><span> </span><br><span> </span><br><span>@@ -99,14 +99,19 @@</span><br><span> #define REQUIREMENT_C_MASK  (REQUIREMENT_C_TCHF | REQUIREMENT_C_TCHH)</span><br><span> </span><br><span> struct ho_candidate {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_lchan *lchan;        /* candidate for whom */</span><br><span style="color: hsl(0, 100%, 40%);">-        struct neighbor_ident_key nik;  /* neighbor ARFCN+BSIC */</span><br><span style="color: hsl(0, 100%, 40%);">-       struct gsm_bts *bts;            /* target BTS in local BSS */</span><br><span style="color: hsl(0, 100%, 40%);">-   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 rxlev_current;</span><br><span style="color: hsl(0, 100%, 40%);">-      int rxlev_target;</span><br><span style="color: hsl(0, 100%, 40%);">-       int rxlev_afs_bias;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_lchan *lchan;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+          int rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+    } current;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct neighbor_ident_key nik;  /* neighbor ARFCN+BSIC */</span><br><span style="color: hsl(120, 100%, 40%);">+             const struct gsm0808_cell_id_list2 *cil; /* target cells in remote BSS */</span><br><span style="color: hsl(120, 100%, 40%);">+             struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+          int rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+            int rxlev_afs_bias;</span><br><span style="color: hsl(120, 100%, 40%);">+   } target;</span><br><span> };</span><br><span> </span><br><span> enum ho_reason {</span><br><span>@@ -705,24 +710,21 @@</span><br><span> /* Trigger handover or assignment depending on the target BTS */</span><br><span> static int trigger_local_ho_or_as(struct ho_candidate *c, uint8_t requirements)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_lchan *lchan = c->lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts *new_bts = c->bts;</span><br><span>         struct handover_out_req req;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_bts *current_bts = lchan->ts->trx->bts;</span><br><span>  int afs_bias = 0;</span><br><span>    bool full_rate = false;</span><br><span> </span><br><span>  /* afs_bias becomes > 0, if AFS is used and is improved */</span><br><span style="color: hsl(0, 100%, 40%);">-   if (lchan->tch_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span style="color: hsl(0, 100%, 40%);">-               afs_bias = ho_get_hodec2_afs_bias_rxlev(new_bts->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (c->current.lchan->tch_mode == GSM48_CMODE_SPEECH_AMR)</span><br><span style="color: hsl(120, 100%, 40%);">+               afs_bias = ho_get_hodec2_afs_bias_rxlev(c->target.bts->ho);</span><br><span> </span><br><span>        /* select TCH rate, prefer TCH/F if AFS is improved */</span><br><span style="color: hsl(0, 100%, 40%);">-  switch (lchan->type) {</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (c->current.lchan->type) {</span><br><span>      case GSM_LCHAN_TCH_F:</span><br><span>                /* keep on full rate, if TCH/F is a candidate */</span><br><span>             if ((requirements & REQUIREMENT_TCHF_MASK)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       if (current_bts == new_bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                           LOGPHOLCHAN(lchan, LOGL_INFO, "Not performing assignment: Already on target type\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (c->current.bts == c->target.bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+                          LOGPHOLCHAN(c->current.lchan, LOGL_INFO, "Not performing assignment: Already on target type\n");</span><br><span>                                return 0;</span><br><span>                    }</span><br><span>                    full_rate = true;</span><br><span>@@ -730,7 +732,7 @@</span><br><span>              }</span><br><span>            /* change to half rate */</span><br><span>            if (!(requirements & REQUIREMENT_TCHH_MASK)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      LOGPHOLCHANTOBTS(lchan, new_bts, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_ERROR,</span><br><span>                                   "neither TCH/F nor TCH/H requested, aborting ho/as\n");</span><br><span>                   return -EINVAL;</span><br><span>              }</span><br><span>@@ -749,35 +751,35 @@</span><br><span>            }</span><br><span>            /* keep on half rate */</span><br><span>              if (!(requirements & REQUIREMENT_TCHH_MASK)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      LOGPHOLCHANTOBTS(lchan, new_bts, LOGL_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_ERROR,</span><br><span>                                   "neither TCH/F nor TCH/H requested, aborting ho/as\n");</span><br><span>                   return -EINVAL;</span><br><span>              }</span><br><span style="color: hsl(0, 100%, 40%);">-               if (current_bts == new_bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGPHOLCHAN(lchan, LOGL_INFO, "Not performing assignment: Already on target type\n");</span><br><span style="color: hsl(120, 100%, 40%);">+               if (c->current.bts == c->target.bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  LOGPHOLCHAN(c->current.lchan, LOGL_INFO, "Not performing assignment: Already on target type\n");</span><br><span>                        return 0;</span><br><span>            }</span><br><span>            break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPHOLCHANTOBTS(lchan, new_bts, LOGL_ERROR, "lchan is neither TCH/F nor TCH/H, aborting ho/as\n");</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_ERROR, "c->current.lchan is neither TCH/F nor TCH/H, aborting ho/as\n");</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>        /* trigger handover or assignment */</span><br><span style="color: hsl(0, 100%, 40%);">-    if  (current_bts == new_bts)</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPHOLCHAN(lchan, LOGL_NOTICE, "Triggering assignment to %s, due to %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ if  (c->current.bts == c->target.bts)</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPHOLCHAN(c->current.lchan, LOGL_NOTICE, "Triggering assignment to %s, due to %s\n",</span><br><span>                      full_rate ? "TCH/F" : "TCH/H",</span><br><span>                           ho_reason_name(global_ho_reason));</span><br><span>       else</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPHOLCHANTOBTS(lchan, new_bts, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPHOLCHANTOBTS(c->current.lchan, c->target.bts, LOGL_INFO,</span><br><span>                            "Triggering handover to %s, due to %s\n",</span><br><span>                                  full_rate ? "TCH/F" : "TCH/H",</span><br><span>                           ho_reason_name(global_ho_reason));</span><br><span> </span><br><span>      req = (struct handover_out_req){</span><br><span>             .from_hodec_id = HODEC2,</span><br><span style="color: hsl(0, 100%, 40%);">-                .old_lchan = lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-             .target_nik = *bts_ident_key(new_bts),</span><br><span style="color: hsl(120, 100%, 40%);">+                .old_lchan = c->current.lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+             .target_nik = *bts_ident_key(c->target.bts),</span><br><span>              .new_lchan_type = full_rate? GSM_LCHAN_TCH_F : GSM_LCHAN_TCH_H,</span><br><span>      };</span><br><span>   handover_request(&req);</span><br><span>@@ -788,14 +790,14 @@</span><br><span> {</span><br><span>     struct handover_out_req req;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        LOGPHOLCHANTOREMOTE(c->lchan, c->cil, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPHOLCHANTOREMOTE(c->current.lchan, c->target.cil, LOGL_INFO,</span><br><span>                            "Triggering inter-BSC handover, due to %s\n",</span><br><span>                      ho_reason_name(global_ho_reason));</span><br><span> </span><br><span>   req = (struct handover_out_req){</span><br><span>             .from_hodec_id = HODEC2,</span><br><span style="color: hsl(0, 100%, 40%);">-                .old_lchan = c->lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-               .target_nik = c->nik,</span><br><span style="color: hsl(120, 100%, 40%);">+              .old_lchan = c->current.lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+             .target_nik = c->target.nik,</span><br><span>      };</span><br><span>   handover_request(&req);</span><br><span>  return 0;</span><br><span>@@ -803,7 +805,7 @@</span><br><span> </span><br><span> static int trigger_ho(struct ho_candidate *c, uint8_t requirements)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- if (c->bts)</span><br><span style="color: hsl(120, 100%, 40%);">+        if (c->target.bts)</span><br><span>                return trigger_local_ho_or_as(c, requirements);</span><br><span>      else</span><br><span>                 return trigger_remote_bss_ho(c, requirements);</span><br><span>@@ -827,34 +829,32 @@</span><br><span> static inline void debug_candidate(struct ho_candidate *candidate,</span><br><span>                                    int tchf_count, int tchh_count)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_lchan *lchan = candidate->lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> #define HO_CANDIDATE_FMT(tchx, TCHX) "TCH/" #TCHX "={free %d (want %d), " REQUIREMENTS_FMT "}"</span><br><span> #define HO_CANDIDATE_ARGS(tchx, TCHX) \</span><br><span style="color: hsl(0, 100%, 40%);">-            tch##tchx##_count, ho_get_hodec2_tch##tchx##_min_slots(candidate->bts->ho), \</span><br><span style="color: hsl(120, 100%, 40%);">+           tch##tchx##_count, ho_get_hodec2_tch##tchx##_min_slots(candidate->target.bts->ho), \</span><br><span>           REQUIREMENTS_ARGS(candidate->requirements, TCHX)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (!candidate->bts && !candidate->cil)</span><br><span style="color: hsl(0, 100%, 40%);">-           LOGPHOLCHAN(lchan, LOGL_DEBUG, "Empty candidate\n");</span><br><span style="color: hsl(0, 100%, 40%);">-  if (candidate->bts && candidate->cil)</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHAN(lchan, LOGL_ERROR, "Invalid candidate: both local- and remote-BSS target\n");</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!candidate->target.bts && !candidate->target.cil)</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPHOLCHAN(candidate->current.lchan, LOGL_DEBUG, "Empty candidate\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  if (candidate->target.bts && candidate->target.cil)</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOLCHAN(candidate->current.lchan, LOGL_ERROR, "Invalid candidate: both local- and remote-BSS target\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (candidate->cil)</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPHOLCHANTOREMOTE(lchan, candidate->cil, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+     if (candidate->target.cil)</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGPHOLCHANTOREMOTE(candidate->current.lchan, candidate->target.cil, LOGL_DEBUG,</span><br><span>                                   "RX level %d dBm -> %d dBm\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                             rxlev2dbm(candidate->rxlev_current), rxlev2dbm(candidate->rxlev_target));</span><br><span style="color: hsl(120, 100%, 40%);">+                               rxlev2dbm(candidate->current.rxlev), rxlev2dbm(candidate->target.rxlev));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- if (candidate->bts == lchan->ts->trx->bts)</span><br><span style="color: hsl(0, 100%, 40%);">-          LOGPHOLCHANTOBTS(lchan, candidate->bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+        if (candidate->target.bts == candidate->current.bts)</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPHOLCHANTOBTS(candidate->current.lchan, candidate->target.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->rxlev_current),</span><br><span style="color: hsl(120, 100%, 40%);">+               rxlev2dbm(candidate->current.rxlev),</span><br><span>                      HO_CANDIDATE_ARGS(f, F), HO_CANDIDATE_ARGS(h, H));</span><br><span style="color: hsl(0, 100%, 40%);">- else if (candidate->bts)</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHANTOBTS(lchan, candidate->bts, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+        else if (candidate->target.bts)</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPHOLCHANTOBTS(candidate->current.lchan, candidate->target.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(candidate->rxlev_current), rxlev2dbm(candidate->rxlev_target),</span><br><span style="color: hsl(120, 100%, 40%);">+                rxlev2dbm(candidate->current.rxlev), rxlev2dbm(candidate->target.rxlev),</span><br><span>               HO_CANDIDATE_ARGS(f, F), HO_CANDIDATE_ARGS(h, H));</span><br><span> }</span><br><span> </span><br><span>@@ -870,12 +870,17 @@</span><br><span>     tchh_count = bts_count_free_ts(bts, GSM_PCHAN_TCH_H);</span><br><span> </span><br><span>    c = (struct ho_candidate){</span><br><span style="color: hsl(0, 100%, 40%);">-              .lchan = lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-         .bts = bts,</span><br><span style="color: hsl(0, 100%, 40%);">-             .requirements = check_requirements(lchan, bts, tchf_count, tchh_count),</span><br><span style="color: hsl(0, 100%, 40%);">-         .rxlev_current = rxlev_current,</span><br><span style="color: hsl(0, 100%, 40%);">-         .rxlev_target = rxlev_current, /* same cell, same rxlev */</span><br><span style="color: hsl(120, 100%, 40%);">+            .current = {</span><br><span style="color: hsl(120, 100%, 40%);">+                  .lchan = lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .bts = bts,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .rxlev = rxlev_current,</span><br><span style="color: hsl(120, 100%, 40%);">+               },</span><br><span style="color: hsl(120, 100%, 40%);">+            .target = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   .bts = bts,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .rxlev = rxlev_current, /* same cell, same rxlev */</span><br><span style="color: hsl(120, 100%, 40%);">+           },</span><br><span>   };</span><br><span style="color: hsl(120, 100%, 40%);">+    c.requirements = check_requirements(c.current.lchan, c.target.bts, tchf_count, tchh_count),</span><br><span> </span><br><span>      debug_candidate(&c, tchf_count, tchh_count);</span><br><span> </span><br><span>@@ -941,12 +946,17 @@</span><br><span>         neigh_cfg = (neighbor_bts ? : bts)->ho;</span><br><span> </span><br><span>       c = (struct ho_candidate){</span><br><span style="color: hsl(0, 100%, 40%);">-              .lchan = lchan,</span><br><span style="color: hsl(0, 100%, 40%);">-         .nik = ni,</span><br><span style="color: hsl(0, 100%, 40%);">-              .bts = neighbor_bts,</span><br><span style="color: hsl(0, 100%, 40%);">-            .cil = neighbor_cil,</span><br><span style="color: hsl(0, 100%, 40%);">-            .rxlev_current = rxlev_current,</span><br><span style="color: hsl(0, 100%, 40%);">-         .rxlev_target = neigh_meas_avg(nmp, ho_get_hodec2_rxlev_neigh_avg_win(bts->ho)),</span><br><span style="color: hsl(120, 100%, 40%);">+           .current = {</span><br><span style="color: hsl(120, 100%, 40%);">+                  .lchan = lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+                       .bts = bts,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .rxlev = rxlev_current,</span><br><span style="color: hsl(120, 100%, 40%);">+               },</span><br><span style="color: hsl(120, 100%, 40%);">+            .target = {</span><br><span style="color: hsl(120, 100%, 40%);">+                   .nik = ni,</span><br><span style="color: hsl(120, 100%, 40%);">+                    .bts = neighbor_bts,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .cil = neighbor_cil,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .rxlev = neigh_meas_avg(nmp, ho_get_hodec2_rxlev_neigh_avg_win(bts->ho)),</span><br><span style="color: hsl(120, 100%, 40%);">+          },</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>@@ -954,11 +964,11 @@</span><br><span>   * and thus skip the hysteresis check. */</span><br><span>    if (!include_weaker_rxlev) {</span><br><span>                 int pwr_hyst = ho_get_hodec2_pwr_hysteresis(bts->ho);</span><br><span style="color: hsl(0, 100%, 40%);">-                if ((c.rxlev_target - c.rxlev_current) <= pwr_hyst) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if ((c.target.rxlev - c.current.rxlev) <= 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(c.rxlev_target), rxlev2dbm(c.rxlev_current), pwr_hyst);</span><br><span style="color: hsl(120, 100%, 40%);">+                             rxlev2dbm(c.target.rxlev), rxlev2dbm(c.current.rxlev), pwr_hyst);</span><br><span>                         return;</span><br><span>              }</span><br><span>    }</span><br><span>@@ -966,11 +976,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(c.rxlev_target) < min_rxlev) {</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rxlev2dbm(c.target.rxlev) < 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(c.rxlev_target), min_rxlev);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rxlev2dbm(c.target.rxlev), min_rxlev);</span><br><span>            return;</span><br><span>      }</span><br><span> </span><br><span>@@ -1122,14 +1132,14 @@</span><br><span>                      continue;</span><br><span> </span><br><span>                /* Only consider Local-BSS cells */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!clist[i].bts)</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!clist[i].target.bts)</span><br><span>                    continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           better = clist[i].rxlev_target - clist[i].rxlev_current;</span><br><span style="color: hsl(120, 100%, 40%);">+              better = clist[i].target.rxlev - clist[i].current.rxlev;</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 style="color: hsl(0, 100%, 40%);">-                    afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].bts->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+                 afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].target.bts->ho);</span><br><span>                 better += afs_bias;</span><br><span>          if (better > best_better_db) {</span><br><span>                    best_cand = &clist[i];</span><br><span>@@ -1141,7 +1151,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->rxlev_target),</span><br><span style="color: hsl(120, 100%, 40%);">+                        rxlev2dbm(best_cand->target.rxlev),</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>@@ -1155,14 +1165,14 @@</span><br><span>                  continue;</span><br><span> </span><br><span>                /* Only consider Local-BSS cells */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!clist[i].bts)</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!clist[i].target.bts)</span><br><span>                    continue;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           better = clist[i].rxlev_target - clist[i].rxlev_current;</span><br><span style="color: hsl(120, 100%, 40%);">+              better = clist[i].target.rxlev - clist[i].current.rxlev;</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 style="color: hsl(0, 100%, 40%);">-                    afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].bts->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+                 afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].target.bts->ho);</span><br><span>                 better += afs_bias;</span><br><span>          if (better > best_better_db) {</span><br><span>                    best_cand = &clist[i];</span><br><span>@@ -1174,7 +1184,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->rxlev_target),</span><br><span style="color: hsl(120, 100%, 40%);">+                        rxlev2dbm(best_cand->target.rxlev),</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>@@ -1195,13 +1205,13 @@</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].rxlev_target - clist[i].rxlev_current;</span><br><span style="color: hsl(120, 100%, 40%);">+              better = clist[i].target.rxlev - clist[i].current.rxlev;</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>                if (ahs && (clist[i].requirements & REQUIREMENT_A_TCHF)</span><br><span style="color: hsl(0, 100%, 40%);">-                 && clist[i].bts)</span><br><span style="color: hsl(0, 100%, 40%);">-                    afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].bts->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+             && clist[i].target.bts)</span><br><span style="color: hsl(120, 100%, 40%);">+                   afs_bias = ho_get_hodec2_afs_bias_rxlev(clist[i].target.bts->ho);</span><br><span>                 better += afs_bias;</span><br><span>          if (better > best_better_db) {</span><br><span>                    best_cand = &clist[i];</span><br><span>@@ -1213,7 +1223,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->rxlev_target),</span><br><span style="color: hsl(120, 100%, 40%);">+                        rxlev2dbm(best_cand->target.rxlev),</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>@@ -1386,8 +1396,8 @@</span><br><span> </span><br><span> static bool is_upgrade_to_tchf(const struct ho_candidate *c, uint8_t for_requirement)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     return c->lchan</span><br><span style="color: hsl(0, 100%, 40%);">-              && (c->lchan->type == GSM_LCHAN_TCH_H)</span><br><span style="color: hsl(120, 100%, 40%);">+  return c->current.lchan</span><br><span style="color: hsl(120, 100%, 40%);">+            && (c->current.lchan->type == GSM_LCHAN_TCH_H)</span><br><span>                 && ((c->requirements & for_requirement) & (REQUIREMENT_B_TCHF | REQUIREMENT_C_TCHF));</span><br><span> }</span><br><span> </span><br><span>@@ -1407,8 +1417,8 @@</span><br><span>    if (!b)</span><br><span>              return a;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   a_rxlev_change = a->rxlev_target - a->rxlev_current;</span><br><span style="color: hsl(0, 100%, 40%);">-      b_rxlev_change = b->rxlev_target - b->rxlev_current;</span><br><span style="color: hsl(120, 100%, 40%);">+    a_rxlev_change = a->target.rxlev - a->current.rxlev;</span><br><span style="color: hsl(120, 100%, 40%);">+    b_rxlev_change = b->target.rxlev - b->current.rxlev;</span><br><span> </span><br><span>       /* Typically, a congestion related handover reduces RXLEV. If there is a candidate that actually improves RXLEV,</span><br><span>      * prefer that, because it pre-empts a likely handover due to measurement results later.  Also favor unchanged</span><br><span>@@ -1420,8 +1430,8 @@</span><br><span> </span><br><span>   if (a_rxlev_change < 0 && b_rxlev_change < 0) {</span><br><span>                /* For handover that reduces RXLEV, favor the highest resulting RXLEV, AFS bias applied. */</span><br><span style="color: hsl(0, 100%, 40%);">-             int a_rxlev = a->rxlev_target + a->rxlev_afs_bias;</span><br><span style="color: hsl(0, 100%, 40%);">-                int b_rxlev = b->rxlev_target + b->rxlev_afs_bias;</span><br><span style="color: hsl(120, 100%, 40%);">+              int a_rxlev = a->target.rxlev + a->target.rxlev_afs_bias;</span><br><span style="color: hsl(120, 100%, 40%);">+               int b_rxlev = b->target.rxlev + b->target.rxlev_afs_bias;</span><br><span> </span><br><span>          if (a_rxlev > b_rxlev)</span><br><span>                    return a;</span><br><span>@@ -1433,16 +1443,16 @@</span><br><span> </span><br><span>      /* Prefer picking a dynamic timeslot: free PDCH and allow more timeslot type flexibility for further</span><br><span>          * congestion resolution. */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (lchan_is_on_dynamic_ts(b->lchan)) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (lchan_is_on_dynamic_ts(b->current.lchan)) {</span><br><span>           unsigned int ac, bc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                if (!lchan_is_on_dynamic_ts(a->lchan))</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!lchan_is_on_dynamic_ts(a->current.lchan))</span><br><span>                    return b;</span><br><span> </span><br><span>                /* Both are dynamic timeslots. Prefer one that completely (or to a higher degree) frees its</span><br><span>           * timeslot. */</span><br><span style="color: hsl(0, 100%, 40%);">-         ac = ts_usage_count(a->lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">-                bc = ts_usage_count(b->lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+              ac = ts_usage_count(a->current.lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+              bc = ts_usage_count(b->current.lchan->ts);</span><br><span>             if (bc < ac)</span><br><span>                      return b;</span><br><span>            if (ac < bc)</span><br><span>@@ -1456,9 +1466,9 @@</span><br><span>      /* When upgrading TCH/H to TCH/F, favor moving a TCH/H with lower current rxlev, because presumably that</span><br><span>      * one benefits more from a higher bandwidth. */</span><br><span>     if (is_upgrade_to_tchf(a, for_requirement) && is_upgrade_to_tchf(b, for_requirement)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         if (b->rxlev_current < a->rxlev_current)</span><br><span style="color: hsl(120, 100%, 40%);">+             if (b->current.rxlev < a->current.rxlev)</span><br><span>                    return b;</span><br><span style="color: hsl(0, 100%, 40%);">-               if (a->rxlev_current < b->rxlev_current)</span><br><span style="color: hsl(120, 100%, 40%);">+             if (a->current.rxlev < b->current.rxlev)</span><br><span>                    return a;</span><br><span>    }</span><br><span> </span><br><span>@@ -1476,11 +1486,11 @@</span><br><span> </span><br><span>          /* For multiple passes of congestion resolution, already handovered candidates are marked by lchan =</span><br><span>                  * NULL. (though at the time of writing, multiple passes of congestion resolution are DISABLED.) */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (!c->lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!c->current.lchan)</span><br><span>                    continue;</span><br><span> </span><br><span>                /* Omit remote BSS */</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!c->bts)</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!c->target.bts)</span><br><span>                       continue;</span><br><span> </span><br><span>                if (!(c->requirements & for_requirement))</span><br><span>@@ -1488,9 +1498,9 @@</span><br><span> </span><br><span>                 /* improve AHS */</span><br><span>            if (is_upgrade_to_tchf(c, for_requirement))</span><br><span style="color: hsl(0, 100%, 40%);">-                     c->rxlev_afs_bias = ho_get_hodec2_afs_bias_rxlev(c->bts->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+                        c->target.rxlev_afs_bias = ho_get_hodec2_afs_bias_rxlev(c->target.bts->ho);</span><br><span>                 else</span><br><span style="color: hsl(0, 100%, 40%);">-                    c->rxlev_afs_bias = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+                     c->target.rxlev_afs_bias = 0;</span><br><span> </span><br><span>                 result = pick_better_lchan_to_move(result, c, for_requirement);</span><br><span>      }</span><br><span>@@ -1643,7 +1653,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].rxlev_target));</span><br><span style="color: hsl(120, 100%, 40%);">+                            rxlev2dbm(clist[i].target.rxlev));</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span>@@ -1662,8 +1672,8 @@</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->rxlev_target),</span><br><span style="color: hsl(0, 100%, 40%);">-                          best_cand->rxlev_afs_bias ? " (applied AHS->AFS bias)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+                       rxlev2dbm(best_cand->target.rxlev),</span><br><span style="color: hsl(120, 100%, 40%);">+                        best_cand->target.rxlev_afs_bias ? " (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>                 /* if there is still congestion, mark lchan as deleted</span><br><span>@@ -1696,8 +1706,8 @@</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->rxlev_target),</span><br><span style="color: hsl(0, 100%, 40%);">-                          best_cand->rxlev_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+                       rxlev2dbm(best_cand->target.rxlev),</span><br><span style="color: hsl(120, 100%, 40%);">+                        best_cand->target.rxlev_afs_bias ? " (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>                 /* if there is still congestion, mark lchan as deleted</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21986">change 21986</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/+/21986"/><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: I06898eb745a5be548df0b76fa760ce790cfab3ed </div>
<div style="display:none"> Gerrit-Change-Number: 21986 </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>