<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19736">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  laforge: Looks good to me, approved
  pespin: Looks good to me, but someone else must approve
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Count handover per BTS as well as per BSC<br><br>Our current handover counters only count success/failures per BSC. It<br>would be nice to also count which BTS is part of a (successful/failed)<br>handover.<br><br>This patch duplicates the BSC counters for the BTS and changes the<br>ho_count and related macros to also count per BTS. If a BTS is NULL<br>(when conn->lchan is NULL) counting for the BTS is ignored.<br><br>Change-Id: I025ef14e2cfd2eea8880212c9406372ce0bf9296<br>Related: SYS#4877<br>---<br>M include/osmocom/bsc/bts.h<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/handover_fsm.c<br>3 files changed, 132 insertions(+), 24 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index 16053a3..46a173d 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -68,6 +68,25 @@</span><br><span>       BTS_CTR_ASSIGNMENT_TIMEOUT,</span><br><span>  BTS_CTR_ASSIGNMENT_FAILED,</span><br><span>   BTS_CTR_ASSIGNMENT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_HANDOVER_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS_CTR_HANDOVER_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS_CTR_HANDOVER_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_HANDOVER_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+  BTS_CTR_HANDOVER_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_HANDOVER_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS_CTR_HANDOVER_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_INTER_BSC_HO_OUT_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS_CTR_INTER_BSC_HO_OUT_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS_CTR_INTER_BSC_HO_OUT_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_INTER_BSC_HO_OUT_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+     BTS_CTR_INTER_BSC_HO_OUT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_INTER_BSC_HO_IN_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+    BTS_CTR_INTER_BSC_HO_IN_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+    BTS_CTR_INTER_BSC_HO_IN_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS_CTR_INTER_BSC_HO_IN_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS_CTR_INTER_BSC_HO_IN_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BTS_CTR_INTER_BSC_HO_IN_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+      BTS_CTR_INTER_BSC_HO_IN_ERROR,</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span>@@ -127,6 +146,34 @@</span><br><span>       [BTS_CTR_ASSIGNMENT_FAILED] =                {"assignment:failed", "Received Assignment Failure message"},</span><br><span>       [BTS_CTR_ASSIGNMENT_ERROR] =                 {"assignment:error", "Assignment failed for other reason"},</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_HANDOVER_ATTEMPTED] =          {"handover:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_HANDOVER_COMPLETED] =          {"handover:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_HANDOVER_STOPPED] =            {"handover:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_HANDOVER_NO_CHANNEL] =         {"handover:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_HANDOVER_TIMEOUT] =            {"handover:timeout", "Handover timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_HANDOVER_FAILED] =             {"handover:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_HANDOVER_ERROR] =              {"handover:error", "Re-assignment failed for other reason"},</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_INTER_BSC_HO_OUT_ATTEMPTED] =  {"interbsc_ho_out:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                "Attempts to handover to remote BSS"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_INTER_BSC_HO_OUT_COMPLETED] =  {"interbsc_ho_out:completed",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                "Handover to remote BSS completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_INTER_BSC_HO_OUT_STOPPED] =    {"interbsc_ho_out:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_INTER_BSC_HO_OUT_TIMEOUT] =    {"interbsc_ho_out:timeout", "Handover timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_INTER_BSC_HO_OUT_ERROR] =      {"interbsc_ho_out:error",</span><br><span style="color: hsl(120, 100%, 40%);">+                                            "Handover to remote BSS failed for other reason"},</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_INTER_BSC_HO_IN_ATTEMPTED] =   {"interbsc_ho_in:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 "Attempts to handover from remote BSS"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_INTER_BSC_HO_IN_COMPLETED] =   {"interbsc_ho_in:completed",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 "Handover from remote BSS completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_INTER_BSC_HO_IN_STOPPED] =     {"interbsc_ho_in:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_INTER_BSC_HO_IN_NO_CHANNEL] =  {"interbsc_ho_in:no_channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                                                "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_INTER_BSC_HO_IN_TIMEOUT] =     {"interbsc_ho_in:timeout", "Handover from remote BSS timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_INTER_BSC_HO_IN_FAILED] =      {"interbsc_ho_in:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_INTER_BSC_HO_IN_ERROR] =       {"interbsc_ho_in:error",</span><br><span style="color: hsl(120, 100%, 40%);">+                                             "Handover from remote BSS failed for other reason"},</span><br><span> };</span><br><span> </span><br><span> static const struct rate_ctr_group_desc bts_ctrg_desc = {</span><br><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index bd0b534..04718da 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -382,7 +382,11 @@</span><br><span>           return;</span><br><span> </span><br><span>  case GSCON_EV_HANDOVER_START:</span><br><span style="color: hsl(120, 100%, 40%);">+         bts = conn_get_bts(conn);</span><br><span>            rate_ctr_inc(&conn->network->bsc_ctrs->ctr[BSC_CTR_HANDOVER_ATTEMPTED]);</span><br><span style="color: hsl(120, 100%, 40%);">+         if (bts)</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_HANDOVER_ATTEMPTED]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>           /* Rely on handover_fsm timeout */</span><br><span>           if (osmo_fsm_inst_state_chg(fi, ST_HANDOVER, 0, 0))</span><br><span>                  LOGPFSML(fi, LOGL_ERROR, "Cannot transition to HANDOVER state, discarding\n");</span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 8ed5945..c3cbd61 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -80,13 +80,29 @@</span><br><span> </span><br><span> /* Assume presence of local var 'conn' as struct gsm_subscriber_connection.</span><br><span>  * This is a macro to preserve the source file and line number in logging. */</span><br><span style="color: hsl(0, 100%, 40%);">-#define ho_count(counter) do { \</span><br><span style="color: hsl(0, 100%, 40%);">-             LOG_HO(conn, LOGL_DEBUG, "incrementing rate counter: %s %s\n", \</span><br><span style="color: hsl(120, 100%, 40%);">+#define ho_count_bsc(counter) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+              LOG_HO(conn, LOGL_DEBUG, "(BSC) incrementing rate counter: %s %s\n", \</span><br><span>                    bsc_ctr_description[counter].name, \</span><br><span>                 bsc_ctr_description[counter].description); \</span><br><span>          rate_ctr_inc(&conn->network->bsc_ctrs->ctr[counter]); \</span><br><span>         } while(0)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Assume presence of local var 'conn' as struct gsm_subscriber_connection.</span><br><span style="color: hsl(120, 100%, 40%);">+ * Handles bts == NULL gracefully</span><br><span style="color: hsl(120, 100%, 40%);">+ * This is a macro to preserve the source file and line number in logging. */</span><br><span style="color: hsl(120, 100%, 40%);">+#define ho_count_bts(bts, counter) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+              LOG_HO(conn, LOGL_DEBUG, "(BTS) incrementing rate counter: %s %s\n", \</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_ctr_description[counter].name, \</span><br><span style="color: hsl(120, 100%, 40%);">+                  bts_ctr_description[counter].description); \</span><br><span style="color: hsl(120, 100%, 40%);">+           if (bts) \</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(&bts->bts_ctrs->ctr[counter]); \</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%);">+#define ho_count(bts, counter) do { \</span><br><span style="color: hsl(120, 100%, 40%);">+        ho_count_bsc(BSC_##counter); \</span><br><span style="color: hsl(120, 100%, 40%);">+        ho_count_bts(bts, BTS_##counter); \</span><br><span style="color: hsl(120, 100%, 40%);">+} while(0)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static uint8_t g_next_ho_ref = 1;</span><br><span> </span><br><span> const char *handover_status(struct gsm_subscriber_connection *conn)</span><br><span>@@ -341,6 +357,7 @@</span><br><span>         struct handover *ho = &conn->ho;</span><br><span>      struct osmo_fsm_inst *fi = conn->ho.fi;</span><br><span>   struct lchan_activate_info info;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts *bts = conn_get_bts(conn);</span><br><span> </span><br><span>      OSMO_ASSERT(ho->new_bts);</span><br><span>         OSMO_ASSERT(ho->new_lchan_type != GSM_LCHAN_NONE);</span><br><span>@@ -357,7 +374,7 @@</span><br><span>  else</span><br><span>                 ho_fsm_update_id(fi, "intraBSC");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- ho_count(BSC_CTR_HANDOVER_ATTEMPTED);</span><br><span style="color: hsl(120, 100%, 40%);">+ ho_count(bts, CTR_HANDOVER_ATTEMPTED);</span><br><span> </span><br><span>   if (!ho->new_lchan) {</span><br><span>             ho_fail(HO_RESULT_FAIL_NO_CHANNEL,</span><br><span>@@ -570,8 +587,6 @@</span><br><span>             return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   ho_count(BSC_CTR_INTER_BSC_HO_IN_ATTEMPTED);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         /* Figure out which cell to handover to. */</span><br><span>  for (match_idx = 0; ; match_idx++) {</span><br><span>                 struct gsm_bts *bts;</span><br><span>@@ -612,6 +627,8 @@</span><br><span>           break;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ ho_count(ho->new_bts, CTR_INTER_BSC_HO_IN_ATTEMPTED);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   if (!ho->new_bts) {</span><br><span>               ho_fail(HO_RESULT_ERROR, "No local cell matches the target %s",</span><br><span>                    req->cell_id_target_name);</span><br><span>@@ -660,31 +677,31 @@</span><br><span>        lchan_activate(ho->new_lchan, &info);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define FUNC_RESULT_COUNTER(name) \</span><br><span style="color: hsl(0, 100%, 40%);">-static int result_counter_##name(enum handover_result result) \</span><br><span style="color: hsl(120, 100%, 40%);">+#define FUNC_RESULT_COUNTER(obj, name) \</span><br><span style="color: hsl(120, 100%, 40%);">+static int result_counter_##obj##_##name(enum handover_result result) \</span><br><span> { \</span><br><span>    switch (result) { \</span><br><span>  case HO_RESULT_OK: \</span><br><span style="color: hsl(0, 100%, 40%);">-            return BSC_CTR_##name##_COMPLETED; \</span><br><span style="color: hsl(120, 100%, 40%);">+          return obj##_CTR_##name##_COMPLETED; \</span><br><span>       case HO_RESULT_FAIL_NO_CHANNEL: \</span><br><span style="color: hsl(0, 100%, 40%);">-               return BSC_CTR_##name##_NO_CHANNEL; \</span><br><span style="color: hsl(120, 100%, 40%);">+         return obj##_CTR_##name##_NO_CHANNEL; \</span><br><span>      case HO_RESULT_FAIL_RR_HO_FAIL: \</span><br><span style="color: hsl(0, 100%, 40%);">-               return BSC_CTR_##name##_FAILED; \</span><br><span style="color: hsl(120, 100%, 40%);">+             return obj##_CTR_##name##_FAILED; \</span><br><span>  case HO_RESULT_FAIL_TIMEOUT: \</span><br><span style="color: hsl(0, 100%, 40%);">-          return BSC_CTR_##name##_TIMEOUT; \</span><br><span style="color: hsl(120, 100%, 40%);">+            return obj##_CTR_##name##_TIMEOUT; \</span><br><span>         case HO_RESULT_CONN_RELEASE: \</span><br><span style="color: hsl(0, 100%, 40%);">-          return BSC_CTR_##name##_STOPPED; \</span><br><span style="color: hsl(120, 100%, 40%);">+            return obj##_CTR_##name##_STOPPED; \</span><br><span>         default: \</span><br><span>   case HO_RESULT_ERROR: \</span><br><span style="color: hsl(0, 100%, 40%);">-         return BSC_CTR_##name##_ERROR; \</span><br><span style="color: hsl(120, 100%, 40%);">+              return obj##_CTR_##name##_ERROR; \</span><br><span>   } \</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-FUNC_RESULT_COUNTER(ASSIGNMENT)</span><br><span style="color: hsl(0, 100%, 40%);">-FUNC_RESULT_COUNTER(HANDOVER)</span><br><span style="color: hsl(0, 100%, 40%);">-FUNC_RESULT_COUNTER(INTER_BSC_HO_IN)</span><br><span style="color: hsl(120, 100%, 40%);">+FUNC_RESULT_COUNTER(BSC, ASSIGNMENT)</span><br><span style="color: hsl(120, 100%, 40%);">+FUNC_RESULT_COUNTER(BSC, HANDOVER)</span><br><span style="color: hsl(120, 100%, 40%);">+FUNC_RESULT_COUNTER(BSC, INTER_BSC_HO_IN)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int result_counter_INTER_BSC_HO_OUT(enum handover_result result) {</span><br><span style="color: hsl(120, 100%, 40%);">+static int result_counter_BSC_INTER_BSC_HO_OUT(enum handover_result result) {</span><br><span>        switch (result) {</span><br><span>    case HO_RESULT_OK:</span><br><span>           return BSC_CTR_INTER_BSC_HO_OUT_COMPLETED;</span><br><span>@@ -698,22 +715,59 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int result_counter(enum handover_scope scope, enum handover_result result)</span><br><span style="color: hsl(120, 100%, 40%);">+static int result_counter_bsc(enum handover_scope scope, enum handover_result result)</span><br><span> {</span><br><span>      switch (scope) {</span><br><span>     case HO_INTRA_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-             return result_counter_ASSIGNMENT(result);</span><br><span style="color: hsl(120, 100%, 40%);">+             return result_counter_BSC_ASSIGNMENT(result);</span><br><span>        default:</span><br><span>             LOGP(DHO, LOGL_ERROR, "invalid enum handover_scope value: %s\n",</span><br><span>                handover_scope_name(scope));</span><br><span>            /* use "normal" HO_INTRA_BSC counter... */</span><br><span>         case HO_NO_HANDOVER:</span><br><span>         case HO_INTRA_BSC:</span><br><span style="color: hsl(0, 100%, 40%);">-              return result_counter_HANDOVER(result);</span><br><span style="color: hsl(120, 100%, 40%);">+               return result_counter_BSC_HANDOVER(result);</span><br><span>  case HO_INTER_BSC_OUT:</span><br><span style="color: hsl(0, 100%, 40%);">-          return result_counter_INTER_BSC_HO_OUT(result);</span><br><span style="color: hsl(120, 100%, 40%);">+               return result_counter_BSC_INTER_BSC_HO_OUT(result);</span><br><span>  case HO_INTER_BSC_IN:</span><br><span style="color: hsl(0, 100%, 40%);">-           return result_counter_INTER_BSC_HO_IN(result);</span><br><span style="color: hsl(120, 100%, 40%);">+                return result_counter_BSC_INTER_BSC_HO_IN(result);</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+FUNC_RESULT_COUNTER(BTS, ASSIGNMENT)</span><br><span style="color: hsl(120, 100%, 40%);">+FUNC_RESULT_COUNTER(BTS, HANDOVER)</span><br><span style="color: hsl(120, 100%, 40%);">+FUNC_RESULT_COUNTER(BTS, INTER_BSC_HO_IN)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int result_counter_BTS_INTER_BSC_HO_OUT(enum handover_result result) {</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (result) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case HO_RESULT_OK:</span><br><span style="color: hsl(120, 100%, 40%);">+            return BTS_CTR_INTER_BSC_HO_OUT_COMPLETED;</span><br><span style="color: hsl(120, 100%, 40%);">+    case HO_RESULT_FAIL_TIMEOUT:</span><br><span style="color: hsl(120, 100%, 40%);">+          return BTS_CTR_INTER_BSC_HO_OUT_TIMEOUT;</span><br><span style="color: hsl(120, 100%, 40%);">+      case HO_RESULT_CONN_RELEASE:</span><br><span style="color: hsl(120, 100%, 40%);">+          return BTS_CTR_INTER_BSC_HO_OUT_STOPPED;</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+      case HO_RESULT_ERROR:</span><br><span style="color: hsl(120, 100%, 40%);">+         return BTS_CTR_INTER_BSC_HO_OUT_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int result_counter_bts(enum handover_scope scope, enum handover_result result)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (scope) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case HO_INTRA_CELL:</span><br><span style="color: hsl(120, 100%, 40%);">+           return result_counter_BTS_ASSIGNMENT(result);</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGP(DHO, LOGL_ERROR, "invalid enum handover_scope value: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 handover_scope_name(scope));</span><br><span style="color: hsl(120, 100%, 40%);">+             /* use "normal" HO_INTRA_BSC counter... */</span><br><span style="color: hsl(120, 100%, 40%);">+  case HO_NO_HANDOVER:</span><br><span style="color: hsl(120, 100%, 40%);">+  case HO_INTRA_BSC:</span><br><span style="color: hsl(120, 100%, 40%);">+            return result_counter_BTS_HANDOVER(result);</span><br><span style="color: hsl(120, 100%, 40%);">+   case HO_INTER_BSC_OUT:</span><br><span style="color: hsl(120, 100%, 40%);">+                return result_counter_BTS_INTER_BSC_HO_OUT(result);</span><br><span style="color: hsl(120, 100%, 40%);">+   case HO_INTER_BSC_IN:</span><br><span style="color: hsl(120, 100%, 40%);">+         return result_counter_BTS_INTER_BSC_HO_IN(result);</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span>@@ -787,6 +841,7 @@</span><br><span> {</span><br><span>        struct handover_decision_callbacks *hdc;</span><br><span>     struct handover *ho = &conn->ho;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts = conn_get_bts(conn);</span><br><span> </span><br><span>        /* Sanity -- an error result ensures beyond doubt that we don't use the new lchan below</span><br><span>   * when the handover isn't actually allowed to change this conn. */</span><br><span>@@ -858,7 +913,8 @@</span><br><span>        if (hdc && hdc->on_handover_end)</span><br><span>          hdc->on_handover_end(conn, result);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      ho_count(result_counter(ho->scope, result));</span><br><span style="color: hsl(120, 100%, 40%);">+       ho_count_bsc(result_counter_bsc(ho->scope, result));</span><br><span style="color: hsl(120, 100%, 40%);">+       ho_count_bts(bts, result_counter_bts(ho->scope, result));</span><br><span> </span><br><span>     LOG_HO(conn, LOGL_INFO, "Result: %s\n", handover_result_name(result));</span><br><span> </span><br><span>@@ -1143,10 +1199,11 @@</span><br><span>       int rc;</span><br><span>      struct handover *ho = &conn->ho;</span><br><span>      struct osmo_fsm_inst *fi = conn->ho.fi;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = conn_get_bts(conn);</span><br><span> </span><br><span>        ho->scope = HO_INTER_BSC_OUT;</span><br><span>     ho_fsm_update_id(fi, "interBSCout");</span><br><span style="color: hsl(0, 100%, 40%);">-  ho_count(BSC_CTR_INTER_BSC_HO_OUT_ATTEMPTED);</span><br><span style="color: hsl(120, 100%, 40%);">+ ho_count(bts, CTR_INTER_BSC_HO_OUT_ATTEMPTED);</span><br><span> </span><br><span>   rc = bsc_tx_bssmap_ho_required(conn->lchan, target_cells);</span><br><span>        if (rc) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19736">change 19736</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/+/19736"/><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: I025ef14e2cfd2eea8880212c9406372ce0bf9296 </div>
<div style="display:none"> Gerrit-Change-Number: 19736 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </div>
<div style="display:none"> Gerrit-Owner: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>