<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/11317">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">handover_decision_2.c: tweak ho candidate logging<br><br>Use a common LOGPHOCAND() to transparently log both local and remote<br>candidates.<br><br>Change-Id: I694e3832c55b4e972e05422e5e4508a74a222a71<br>---<br>M src/osmo-bsc/handover_decision_2.c<br>1 file changed, 65 insertions(+), 49 deletions(-)<br><br></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 70be050..fc94d61 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>@@ -64,6 +64,26 @@</span><br><span>           bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \</span><br><span>           ## args)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGPHOLCHANTOREMOTE(lchan, remote_cil, level, fmt, args...) \</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DHODEC, level, "(lchan %u.%u%u%u %s %s)->(remote-BSS %s) (subscr %s) " fmt, \</span><br><span style="color: hsl(120, 100%, 40%);">+            lchan->ts->trx->bts->nr, \</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan->ts->trx->nr, \</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan->ts->nr, \</span><br><span style="color: hsl(120, 100%, 40%);">+        lchan->nr, \</span><br><span style="color: hsl(120, 100%, 40%);">+       gsm_lchant_name(lchan->type), \</span><br><span style="color: hsl(120, 100%, 40%);">+            gsm48_chan_mode_name(lchan->tch_mode), \</span><br><span style="color: hsl(120, 100%, 40%);">+           gsm0808_cell_id_list_name(remote_cil), \</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc_subscr_name(lchan->conn? lchan->conn->bsub : NULL), \</span><br><span style="color: hsl(120, 100%, 40%);">+            ## args)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define LOGPHOCAND(candidate, level, fmt, args...) do {\</span><br><span style="color: hsl(120, 100%, 40%);">+     if ((candidate)->bts) \</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPHOLCHANTOBTS((candidate)->lchan, (candidate)->bts, level, fmt, ## args); \</span><br><span style="color: hsl(120, 100%, 40%);">+  else if ((candidate)->cil) \</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPHOLCHANTOREMOTE((candidate)->lchan, (candidate)->cil, level, fmt, ## args); \</span><br><span style="color: hsl(120, 100%, 40%);">+       } while(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #define REQUIREMENT_A_TCHF    0x01</span><br><span> #define REQUIREMENT_B_TCHF      0x02</span><br><span> #define REQUIREMENT_C_TCHF      0x04</span><br><span>@@ -634,7 +654,6 @@</span><br><span>           /* change to full rate if AFS is improved and a candidate */</span><br><span>                 if (afs_bias > 0 && (requirements & REQUIREMENT_TCHF_MASK)) {</span><br><span>                         full_rate = true;</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGPHOLCHAN(lchan, LOGL_DEBUG, "[Improve AHS->AFS]\n");</span><br><span>                         break;</span><br><span>               }</span><br><span>            /* change to full rate if the only candidate */</span><br><span>@@ -749,7 +768,7 @@</span><br><span>                .bsic = nmp->bsic,</span><br><span>        };</span><br><span>   int avg;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct ho_candidate *c;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct ho_candidate c;</span><br><span>       int min_rxlev;</span><br><span> </span><br><span>   /* skip empty slots */</span><br><span>@@ -791,16 +810,22 @@</span><br><span>       /* calculate average rxlev for this cell over the window */</span><br><span>  avg = neigh_meas_avg(nmp, ho_get_hodec2_rxlev_neigh_avg_win(bts->ho));</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ c = (struct ho_candidate){</span><br><span style="color: hsl(120, 100%, 40%);">+            .lchan = lchan,</span><br><span style="color: hsl(120, 100%, 40%);">+               .avg = avg,</span><br><span style="color: hsl(120, 100%, 40%);">+           .bts = neighbor_bts,</span><br><span style="color: hsl(120, 100%, 40%);">+  };</span><br><span style="color: hsl(120, 100%, 40%);">+</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>                 unsigned int pwr_hyst = ho_get_hodec2_pwr_hysteresis(bts->ho);</span><br><span>            if (avg <= (av_rxlev + pwr_hyst)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  LOGPHOLCHAN(lchan, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                              "BTS %d is not a candidate, because RX level (%d) is lower"</span><br><span style="color: hsl(0, 100%, 40%);">-                                   " or equal than current RX level (%d) + hysteresis (%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                   neighbor_bts->nr, rxlev2dbm(avg), rxlev2dbm(av_rxlev), pwr_hyst);</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGPHOCAND(&c, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   "Not a candidate, because RX level (%d) is lower"</span><br><span style="color: hsl(120, 100%, 40%);">+                                   " or equal than current RX level (%d) + hysteresis (%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                 rxlev2dbm(avg), rxlev2dbm(av_rxlev), pwr_hyst);</span><br><span>                   return;</span><br><span>              }</span><br><span>    }</span><br><span>@@ -808,22 +833,20 @@</span><br><span>    /* if the minimum level is not reached */</span><br><span>    min_rxlev = ho_get_hodec2_min_rxlev(neighbor_bts->ho);</span><br><span>    if (rxlev2dbm(avg) < min_rxlev) {</span><br><span style="color: hsl(0, 100%, 40%);">-            LOGPHOLCHAN(lchan, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                      "BTS %d is not a candidate, because RX level (%d) is lower"</span><br><span style="color: hsl(0, 100%, 40%);">-                           " than its minimum required RX level (%d)\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                         neighbor_bts->nr, rxlev2dbm(avg), min_rxlev);</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPHOCAND(&c, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+                           "Not a candidate, because RX level (%d) is lower"</span><br><span style="color: hsl(120, 100%, 40%);">+                           " than the minimum required RX level (%d)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                       rxlev2dbm(avg), min_rxlev);</span><br><span>               return;</span><br><span>      }</span><br><span> </span><br><span>        tchf_count = bts_count_free_ts(neighbor_bts, GSM_PCHAN_TCH_F);</span><br><span>       tchh_count = bts_count_free_ts(neighbor_bts, GSM_PCHAN_TCH_H);</span><br><span style="color: hsl(0, 100%, 40%);">-  c = &clist[*candidates];</span><br><span style="color: hsl(0, 100%, 40%);">-    c->lchan = lchan;</span><br><span style="color: hsl(0, 100%, 40%);">-    c->bts = neighbor_bts;</span><br><span style="color: hsl(0, 100%, 40%);">-       c->requirements = check_requirements(lchan, neighbor_bts, tchf_count,</span><br><span style="color: hsl(0, 100%, 40%);">-                                             tchh_count);</span><br><span style="color: hsl(0, 100%, 40%);">-       c->avg = avg;</span><br><span style="color: hsl(0, 100%, 40%);">-        debug_candidate(lchan, c, neighbor_bts, av_rxlev, tchf_count, tchh_count);</span><br><span style="color: hsl(120, 100%, 40%);">+    c.requirements = check_requirements(lchan, neighbor_bts, tchf_count, tchh_count);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   debug_candidate(lchan, &c, neighbor_bts, av_rxlev, tchf_count, tchh_count);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     clist[*candidates] = c;</span><br><span>      (*candidates)++;</span><br><span> }</span><br><span> </span><br><span>@@ -973,9 +996,9 @@</span><br><span> </span><br><span>  /* perform handover, if there is a candidate */</span><br><span>      if (best_cand) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPHOLCHANTOBTS(lchan, best_cand->bts, 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(0, 100%, 40%);">-                           best_applied_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate, RX level %d%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                         best_applied_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span>          return trigger_handover_or_assignment(lchan, best_cand->bts,</span><br><span>                                                    best_cand->requirements & REQUIREMENT_B_MASK);</span><br><span>  }</span><br><span>@@ -1002,9 +1025,9 @@</span><br><span> </span><br><span>        /* perform handover, if there is a candidate */</span><br><span>      if (best_cand) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPHOLCHANTOBTS(lchan, best_cand->bts, 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(0, 100%, 40%);">-                           best_applied_afs_bias? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate, RX level %d%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                         best_applied_afs_bias? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span>           return trigger_handover_or_assignment(lchan, best_cand->bts,</span><br><span>                                                    best_cand->requirements & REQUIREMENT_C_MASK);</span><br><span>  }</span><br><span>@@ -1037,10 +1060,9 @@</span><br><span> </span><br><span>       /* perform handover, if there is a candidate */</span><br><span>      if (best_cand) {</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPHOLCHANTOBTS(lchan, best_cand->bts, LOGL_INFO, "Best candidate, RX level %d"</span><br><span style="color: hsl(0, 100%, 40%);">-                   " with greater congestion found%s\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                 rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(0, 100%, 40%);">-                   best_applied_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate: RX level %d%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                         best_applied_afs_bias ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span>          return trigger_handover_or_assignment(lchan, best_cand->bts,</span><br><span>                                                    best_cand->requirements & REQUIREMENT_A_MASK);</span><br><span>  }</span><br><span>@@ -1337,9 +1359,8 @@</span><br><span>    if (log_check_level(DHODEC, LOGL_DEBUG)) {</span><br><span>           LOGPHOBTS(bts, LOGL_DEBUG, "Considering %u candidates to solve congestion:\n", candidates);</span><br><span>                for (i = 0; i < candidates; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   LOGPHOLCHANTOBTS(clist[i].lchan, clist[i].bts, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                                       "#%d: req=0x%x avg-rxlev=%d\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                                       i, clist[i].requirements, clist[i].avg);</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGPHOCAND(&clist[i], LOGL_DEBUG, "#%d: req=0x%x avg-rxlev=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                  i, clist[i].requirements, clist[i].avg);</span><br><span>          }</span><br><span>    }</span><br><span> </span><br><span>@@ -1381,7 +1402,8 @@</span><br><span>                        is_improved = 1;</span><br><span>             } else</span><br><span>                       is_improved = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGP(DHODEC, LOGL_DEBUG, "candidate %d: avg=%d best_avg_db=%d\n", i, avg, best_avg_db);</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGPHOCAND(&clist[i], LOGL_DEBUG, "candidate %d: avg=%d best_avg_db=%d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                         i, avg, best_avg_db);</span><br><span>             if (avg > best_avg_db) {</span><br><span>                  best_cand = &clist[i];</span><br><span>                   best_avg_db = avg;</span><br><span>@@ -1391,10 +1413,9 @@</span><br><span>  /* perform handover, if there is a candidate */</span><br><span>      if (best_cand) {</span><br><span>             any_ho = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGPHOLCHAN(best_cand->lchan, LOGL_DEBUG,</span><br><span style="color: hsl(0, 100%, 40%);">-                        "Best candidate BTS %u (RX level %d%s) without congestion found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                           best_cand->bts->nr, rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(0, 100%, 40%);">-                         is_improved ? ", RX quality improved by AHS->AFS" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPHOCAND(best_cand, LOGL_DEBUG, "Best candidate: RX level %d%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                         is_improved ? " (applied AHS->AFS bias)" : "");</span><br><span>            trigger_handover_or_assignment(best_cand->lchan, best_cand->bts,</span><br><span>                       best_cand->requirements & REQUIREMENT_B_MASK);</span><br><span> #if 0</span><br><span>@@ -1461,10 +1482,9 @@</span><br><span>      /* perform handover, if there is a candidate */</span><br><span>      if (worst_cand) {</span><br><span>            any_ho = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DHODEC, LOGL_INFO, "Worst candidate for assignment "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "(RX level %d%s) from TCH/H -> TCH/F without congestion "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "found\n", rxlev2dbm(worst_cand->avg),</span><br><span style="color: hsl(0, 100%, 40%);">-                     is_improved ? ", RX quality improved by AHS->AFS" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPHOCAND(worst_cand, LOGL_INFO, "Worst candidate: RX level %d from TCH/H -> TCH/F%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           rxlev2dbm(worst_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                        is_improved ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span>            trigger_handover_or_assignment(worst_cand->lchan,</span><br><span>                         worst_cand->bts,</span><br><span>                  worst_cand->requirements & REQUIREMENT_B_MASK);</span><br><span>@@ -1533,12 +1553,9 @@</span><br><span>      /* perform handover, if there is a candidate */</span><br><span>      if (best_cand) {</span><br><span>             any_ho = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DHODEC, LOGL_INFO, "Best candidate BTS %d (RX level %d) "</span><br><span style="color: hsl(0, 100%, 40%);">-                        "with less or equal congestion found\n",</span><br><span style="color: hsl(0, 100%, 40%);">-                      best_cand->bts->nr, rxlev2dbm(best_cand->avg));</span><br><span style="color: hsl(0, 100%, 40%);">-                if (is_improved)</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DHODEC, LOGL_INFO, "(is improved due to "</span><br><span style="color: hsl(0, 100%, 40%);">-                                "AHS -> AFS)\n");</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGPHOCAND(best_cand, LOGL_INFO, "Best candidate: RX level %d%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    rxlev2dbm(best_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                         is_improved ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span>            trigger_handover_or_assignment(best_cand->lchan, best_cand->bts,</span><br><span>                       best_cand->requirements & REQUIREMENT_C_MASK);</span><br><span> #if 0</span><br><span>@@ -1610,10 +1627,9 @@</span><br><span>      /* perform handover, if there is a candidate */</span><br><span>      if (worst_cand) {</span><br><span>            any_ho = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-             LOGP(DHODEC, LOGL_INFO, "Worst candidate for assignment "</span><br><span style="color: hsl(0, 100%, 40%);">-                     "(RX level %d%s) from TCH/H -> TCH/F with less or equal "</span><br><span style="color: hsl(0, 100%, 40%);">-                  "congestion found\n", rxlev2dbm(worst_cand->avg),</span><br><span style="color: hsl(0, 100%, 40%);">-                  is_improved ? ", RX quality improved by AHS->AFS" : "");</span><br><span style="color: hsl(120, 100%, 40%);">+               LOGPHOCAND(worst_cand, LOGL_INFO, "Worst candidate: RX level %d from TCH/H -> TCH/F%s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                           rxlev2dbm(worst_cand->avg),</span><br><span style="color: hsl(120, 100%, 40%);">+                        is_improved ? " (applied AHS -> AFS rxlev bias)" : "");</span><br><span>            trigger_handover_or_assignment(worst_cand->lchan,</span><br><span>                         worst_cand->bts,</span><br><span>                  worst_cand->requirements & REQUIREMENT_C_MASK);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/11317">change 11317</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/11317"/><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-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I694e3832c55b4e972e05422e5e4508a74a222a71 </div>
<div style="display:none"> Gerrit-Change-Number: 11317 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>