<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>