<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25273">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">move BSC level stats and rate counters to new bsc_stats.[hc]<br><br>Instead of having static const structs in header files (which end up<br>duplicated in each and every compile unit!), have one .c file with the<br>rate_ctr and stat_item descriptions.<br><br>Related: SYS#5542<br>Change-Id: I8fd6380b5ae8ed2d3347e7cfbf674c30b6841ed9<br>---<br>M include/osmocom/bsc/Makefile.am<br>A include/osmocom/bsc/bsc_stats.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/Makefile.am<br>M src/osmo-bsc/assignment_fsm.c<br>M src/osmo-bsc/bsc_init.c<br>A src/osmo-bsc/bsc_stats.c<br>M src/osmo-bsc/bts_ipaccess_nanobts.c<br>M src/osmo-bsc/bts_vty.c<br>M src/osmo-bsc/gsm_08_08.c<br>M src/osmo-bsc/handover_fsm.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M src/osmo-bsc/paging.c<br>14 files changed, 231 insertions(+), 169 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/73/25273/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index dde08a1..3accc74 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -7,6 +7,7 @@</span><br><span>      acc.h \</span><br><span>      assignment_fsm.h \</span><br><span>   bsc_rll.h \</span><br><span style="color: hsl(120, 100%, 40%);">+   bsc_stats.h \</span><br><span>        bsc_subscriber.h \</span><br><span>   bsc_subscr_conn_fsm.h \</span><br><span>      bss.h \</span><br><span>diff --git a/include/osmocom/bsc/bsc_stats.h b/include/osmocom/bsc/bsc_stats.h</span><br><span>new file mode 100644</span><br><span>index 0000000..8fcd5a0</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/bsc/bsc_stats.h</span><br><span>@@ -0,0 +1,98 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* osmo-bsc statistics */</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/rate_ctr.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_stat_item_group_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* OsmoBSC rate_ctr indexes */</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_ASSIGNMENT_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_CTR_ASSIGNMENT_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_CTR_ASSIGNMENT_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_ASSIGNMENT_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_ASSIGNMENT_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_ASSIGNMENT_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+    BSC_CTR_ASSIGNMENT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_HANDOVER_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_HANDOVER_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_HANDOVER_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_HANDOVER_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+  BSC_CTR_HANDOVER_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_HANDOVER_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_HANDOVER_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CTR_INTRA_CELL_HO_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_INTRA_CELL_HO_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_INTRA_CELL_HO_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_INTRA_CELL_HO_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_INTRA_CELL_HO_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_INTRA_CELL_HO_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_CTR_INTRA_CELL_HO_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+  BSC_CTR_INTRA_BSC_HO_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CTR_INTRA_BSC_HO_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CTR_INTRA_BSC_HO_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_CTR_INTRA_BSC_HO_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_INTRA_BSC_HO_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_CTR_INTRA_BSC_HO_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+  BSC_CTR_INTRA_BSC_HO_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_INTER_BSC_HO_OUT_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_INTER_BSC_HO_OUT_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_INTER_BSC_HO_OUT_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_INTER_BSC_HO_OUT_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_INTER_BSC_HO_OUT_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_INTER_BSC_HO_OUT_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CTR_INTER_BSC_HO_IN_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+    BSC_CTR_INTER_BSC_HO_IN_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+    BSC_CTR_INTER_BSC_HO_IN_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_INTER_BSC_HO_IN_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+   BSC_CTR_INTER_BSC_HO_IN_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+       BSC_CTR_INTER_BSC_HO_IN_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_INTER_BSC_HO_IN_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_SRVCC_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_SRVCC_COMPLETED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_SRVCC_STOPPED,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_SRVCC_NO_CHANNEL,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_SRVCC_TIMEOUT,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_SRVCC_FAILED,</span><br><span style="color: hsl(120, 100%, 40%);">+ BSC_CTR_SRVCC_ERROR,</span><br><span style="color: hsl(120, 100%, 40%);">+  BSC_CTR_PAGING_ATTEMPTED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_PAGING_DETACHED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_PAGING_RESPONDED,</span><br><span style="color: hsl(120, 100%, 40%);">+     BSC_CTR_PAGING_NO_ACTIVE_PAGING,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_UNKNOWN_UNIT_ID,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_MSCPOOL_SUBSCR_NO_MSC,</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_CTR_MSCPOOL_EMERG_FORWARDED,</span><br><span style="color: hsl(120, 100%, 40%);">+      BSC_CTR_MSCPOOL_EMERG_LOST,</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%);">+extern const struct rate_ctr_desc bsc_ctr_description[];</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct rate_ctr_group_desc bsc_ctrg_desc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* OsmoBSC stat_item indexes */</span><br><span style="color: hsl(120, 100%, 40%);">+enum {</span><br><span style="color: hsl(120, 100%, 40%);">+        BSC_STAT_NUM_BTS_TOTAL,</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%);">+/* BTS counter index if a BTS could not be found</span><br><span style="color: hsl(120, 100%, 40%);">+ * Currently we are limited to bts 0 - 255 in the VTY, but that might change in</span><br><span style="color: hsl(120, 100%, 40%);">+ * the future so use 2**16 */</span><br><span style="color: hsl(120, 100%, 40%);">+#define BTS_STAT_IDX_UNKNOWN (UINT16_MAX + 1)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct osmo_stat_item_group_desc bsc_statg_desc;</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index d6c06de..db0f249 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1110,163 +1110,6 @@</span><br><span> void conn_update_ms_power_class(struct gsm_subscriber_connection *conn, uint8_t power_class);</span><br><span> void lchan_update_ms_power_ctrl_level(struct gsm_lchan *lchan, int ms_power_dbm);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_ASSIGNMENT_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_CTR_ASSIGNMENT_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_CTR_ASSIGNMENT_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_ASSIGNMENT_NO_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_ASSIGNMENT_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_ASSIGNMENT_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-      BSC_CTR_ASSIGNMENT_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_HANDOVER_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_HANDOVER_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_HANDOVER_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_HANDOVER_NO_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-    BSC_CTR_HANDOVER_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_HANDOVER_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_HANDOVER_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- BSC_CTR_INTRA_CELL_HO_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_INTRA_CELL_HO_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_INTRA_CELL_HO_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_INTRA_CELL_HO_NO_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_INTRA_CELL_HO_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_INTRA_CELL_HO_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_CTR_INTRA_CELL_HO_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-    BSC_CTR_INTRA_BSC_HO_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">- BSC_CTR_INTRA_BSC_HO_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">- BSC_CTR_INTRA_BSC_HO_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_CTR_INTRA_BSC_HO_NO_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_INTRA_BSC_HO_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_CTR_INTRA_BSC_HO_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-    BSC_CTR_INTRA_BSC_HO_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_INTER_BSC_HO_OUT_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_INTER_BSC_HO_OUT_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_INTER_BSC_HO_OUT_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_INTER_BSC_HO_OUT_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_INTER_BSC_HO_OUT_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_INTER_BSC_HO_OUT_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">- BSC_CTR_INTER_BSC_HO_IN_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-      BSC_CTR_INTER_BSC_HO_IN_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">-      BSC_CTR_INTER_BSC_HO_IN_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_INTER_BSC_HO_IN_NO_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-     BSC_CTR_INTER_BSC_HO_IN_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">- BSC_CTR_INTER_BSC_HO_IN_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_INTER_BSC_HO_IN_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_SRVCC_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_SRVCC_COMPLETED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_SRVCC_STOPPED,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_SRVCC_NO_CHANNEL,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_SRVCC_TIMEOUT,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_SRVCC_FAILED,</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_CTR_SRVCC_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-    BSC_CTR_PAGING_ATTEMPTED,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_PAGING_DETACHED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_PAGING_RESPONDED,</span><br><span style="color: hsl(0, 100%, 40%);">-       BSC_CTR_PAGING_NO_ACTIVE_PAGING,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_UNKNOWN_UNIT_ID,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_MSCPOOL_SUBSCR_NO_MSC,</span><br><span style="color: hsl(0, 100%, 40%);">-  BSC_CTR_MSCPOOL_EMERG_FORWARDED,</span><br><span style="color: hsl(0, 100%, 40%);">-        BSC_CTR_MSCPOOL_EMERG_LOST,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_desc bsc_ctr_description[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        [BSC_CTR_ASSIGNMENT_ATTEMPTED] =        {"assignment:attempted", "Assignment attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_ASSIGNMENT_COMPLETED] =        {"assignment:completed", "Assignment completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_ASSIGNMENT_STOPPED] =          {"assignment:stopped", "Connection ended during Assignment"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_ASSIGNMENT_NO_CHANNEL] =       {"assignment:no_channel", "Failure to allocate lchan for Assignment"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BSC_CTR_ASSIGNMENT_TIMEOUT] =          {"assignment:timeout", "Assignment timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BSC_CTR_ASSIGNMENT_FAILED] =           {"assignment:failed", "Received Assignment Failure message"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_ASSIGNMENT_ERROR] =            {"assignment:error", "Assignment failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_HANDOVER_ATTEMPTED] =          {"handover:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BSC_CTR_HANDOVER_COMPLETED] =          {"handover:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BSC_CTR_HANDOVER_STOPPED] =            {"handover:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_HANDOVER_NO_CHANNEL] =         {"handover:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BSC_CTR_HANDOVER_TIMEOUT] =            {"handover:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_HANDOVER_FAILED] =             {"handover:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BSC_CTR_HANDOVER_ERROR] =              {"handover:error", "Re-assignment failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        [BSC_CTR_INTRA_CELL_HO_ATTEMPTED] =     {"intra_cell_ho:attempted", "Intra-Cell handover attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BSC_CTR_INTRA_CELL_HO_COMPLETED] =     {"intra_cell_ho:completed", "Intra-Cell handover completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_INTRA_CELL_HO_STOPPED] =       {"intra_cell_ho:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_INTRA_CELL_HO_NO_CHANNEL] =    {"intra_cell_ho:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_INTRA_CELL_HO_TIMEOUT] =       {"intra_cell_ho:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_INTRA_CELL_HO_FAILED] =        {"intra_cell_ho:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BSC_CTR_INTRA_CELL_HO_ERROR] =         {"intra_cell_ho:error", "Re-assignment failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_INTRA_BSC_HO_ATTEMPTED] =      {"intra_bsc_ho:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BSC_CTR_INTRA_BSC_HO_COMPLETED] =      {"intra_bsc_ho:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_INTRA_BSC_HO_STOPPED] =        {"intra_bsc_ho:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BSC_CTR_INTRA_BSC_HO_NO_CHANNEL] =     {"intra_bsc_ho:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_INTRA_BSC_HO_TIMEOUT] =        {"intra_bsc_ho:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BSC_CTR_INTRA_BSC_HO_FAILED] =         {"intra_bsc_ho:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_INTRA_BSC_HO_ERROR] =          {"intra_bsc_ho:error", "Re-assignment failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_INTER_BSC_HO_OUT_ATTEMPTED] =  {"interbsc_ho_out:attempted",</span><br><span style="color: hsl(0, 100%, 40%);">-                                          "Attempts to handover to remote BSS"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_INTER_BSC_HO_OUT_COMPLETED] =  {"interbsc_ho_out:completed",</span><br><span style="color: hsl(0, 100%, 40%);">-                                          "Handover to remote BSS completed"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_INTER_BSC_HO_OUT_STOPPED] =    {"interbsc_ho_out:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BSC_CTR_INTER_BSC_HO_OUT_TIMEOUT] =    {"interbsc_ho_out:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BSC_CTR_INTER_BSC_HO_OUT_FAILED] =     {"interbsc_ho_out:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_INTER_BSC_HO_OUT_ERROR] =      {"interbsc_ho_out:error",</span><br><span style="color: hsl(0, 100%, 40%);">-                                              "Handover to remote BSS failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_INTER_BSC_HO_IN_ATTEMPTED] =   {"interbsc_ho_in:attempted",</span><br><span style="color: hsl(0, 100%, 40%);">-                                           "Attempts to handover from remote BSS"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BSC_CTR_INTER_BSC_HO_IN_COMPLETED] =   {"interbsc_ho_in:completed",</span><br><span style="color: hsl(0, 100%, 40%);">-                                           "Handover from remote BSS completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_INTER_BSC_HO_IN_STOPPED] =     {"interbsc_ho_in:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_INTER_BSC_HO_IN_NO_CHANNEL] =  {"interbsc_ho_in:no_channel",</span><br><span style="color: hsl(0, 100%, 40%);">-                                          "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_INTER_BSC_HO_IN_TIMEOUT] =     {"interbsc_ho_in:timeout", "Handover from remote BSS timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_INTER_BSC_HO_IN_FAILED] =      {"interbsc_ho_in:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BSC_CTR_INTER_BSC_HO_IN_ERROR] =       {"interbsc_ho_in:error",</span><br><span style="color: hsl(0, 100%, 40%);">-                                               "Handover from remote BSS failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_SRVCC_ATTEMPTED] =             {"srvcc:attempted", "Intra-BSC SRVCC attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_SRVCC_COMPLETED] =             {"srvcc:completed", "Intra-BSC SRVCC completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_SRVCC_STOPPED] =               {"srvcc:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BSC_CTR_SRVCC_NO_CHANNEL] =            {"srvcc:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_SRVCC_TIMEOUT] =               {"srvcc:timeout", "SRVCC timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_SRVCC_FAILED] =                {"srvcc:failed", "Received SRVCC Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_SRVCC_ERROR] =                 {"srvcc:error", "Re-assignment failed for other reason"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_PAGING_ATTEMPTED] =            {"paging:attempted", "Paging attempts for a subscriber"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_PAGING_DETACHED] =             {"paging:detached", "Paging request send failures because no responsible BTS was found"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_PAGING_RESPONDED] =            {"paging:responded", "Paging attempts with successful response"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_PAGING_NO_ACTIVE_PAGING] =     {"paging:no_active_paging", "Paging response without an active paging request (arrived after paging expiration?)"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_CTR_UNKNOWN_UNIT_ID] =             {"abis:unknown_unit_id", "Connection attempts from unknown IPA CCM Unit ID"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_MSCPOOL_SUBSCR_NO_MSC] =       {"mscpool:subscr:no_msc",</span><br><span style="color: hsl(0, 100%, 40%);">-                                              "Complete Layer 3 requests lost because no connected MSC is found available"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BSC_CTR_MSCPOOL_EMERG_FORWARDED] =     {"mscpool:emerg:forwarded",</span><br><span style="color: hsl(0, 100%, 40%);">-                                            "Emergency call requests forwarded to an MSC (see also per-MSC counters"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BSC_CTR_MSCPOOL_EMERG_LOST] =          {"mscpool:emerg:lost",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                 "Emergency call requests lost because no MSC was found available"},</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_group_desc bsc_ctrg_desc = {</span><br><span style="color: hsl(0, 100%, 40%);">-       "bsc",</span><br><span style="color: hsl(0, 100%, 40%);">-        "base station controller",</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(0, 100%, 40%);">-        ARRAY_SIZE(bsc_ctr_description),</span><br><span style="color: hsl(0, 100%, 40%);">-        bsc_ctr_description,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Constants for the BSC stats */</span><br><span style="color: hsl(0, 100%, 40%);">-enum {</span><br><span style="color: hsl(0, 100%, 40%);">-   BSC_STAT_NUM_BTS_TOTAL,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* BTS counter index if a BTS could not be found</span><br><span style="color: hsl(0, 100%, 40%);">- * Currently we are limited to bts 0 - 255 in the VTY, but that might change in</span><br><span style="color: hsl(0, 100%, 40%);">- * the future so use 2**16 */</span><br><span style="color: hsl(0, 100%, 40%);">-#define BTS_STAT_IDX_UNKNOWN (UINT16_MAX + 1)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> struct gsm_tz {</span><br><span>        int override; /* if 0, use system's time zone instead. */</span><br><span>        int hr; /* hour */</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index c149f47..8991697 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -39,6 +39,7 @@</span><br><span>  bsc_rf_ctrl.c \</span><br><span>      bsc_rll.c \</span><br><span>  bsc_sccp.c \</span><br><span style="color: hsl(120, 100%, 40%);">+  bsc_stats.c \</span><br><span>        bsc_subscr_conn_fsm.c \</span><br><span>      bsc_subscriber.c \</span><br><span>   bsc_vty.c \</span><br><span>diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c</span><br><span>index 2c52d22..3c1f13b 100644</span><br><span>--- a/src/osmo-bsc/assignment_fsm.c</span><br><span>+++ b/src/osmo-bsc/assignment_fsm.c</span><br><span>@@ -36,6 +36,7 @@</span><br><span> #include <osmocom/bsc/lchan_select.h></span><br><span> #include <osmocom/bsc/abis_rsl.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #include <osmocom/bsc/assignment_fsm.h></span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c</span><br><span>index 42acbbc..a85e76f 100644</span><br><span>--- a/src/osmo-bsc/bsc_init.c</span><br><span>+++ b/src/osmo-bsc/bsc_init.c</span><br><span>@@ -38,6 +38,7 @@</span><br><span> #include <osmocom/bsc/neighbor_ident.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/bsc/lb.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #include <osmocom/bsc/smscb.h></span><br><span> #include <osmocom/gsm/protocol/gsm_48_049.h></span><br><span>@@ -46,18 +47,6 @@</span><br><span> #include <limits.h></span><br><span> #include <stdbool.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const struct osmo_stat_item_desc bsc_stat_desc[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- [BSC_STAT_NUM_BTS_TOTAL] = { "num_bts:total", "Number of configured BTS for this BSC", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct osmo_stat_item_group_desc bsc_statg_desc = {</span><br><span style="color: hsl(0, 100%, 40%);">-     .group_name_prefix = "bsc",</span><br><span style="color: hsl(0, 100%, 40%);">-   .group_description = "base station controller",</span><br><span style="color: hsl(0, 100%, 40%);">-       .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(0, 100%, 40%);">-    .num_items = ARRAY_SIZE(bsc_stat_desc),</span><br><span style="color: hsl(0, 100%, 40%);">- .item_desc = bsc_stat_desc,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> int bsc_shutdown_net(struct gsm_network *net)</span><br><span> {</span><br><span>  struct gsm_bts *bts;</span><br><span>diff --git a/src/osmo-bsc/bsc_stats.c b/src/osmo-bsc/bsc_stats.c</span><br><span>new file mode 100644</span><br><span>index 0000000..8fc4c38</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/bsc_stats.c</span><br><span>@@ -0,0 +1,122 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* osmo-bsc statistics */</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2021 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.</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%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stats.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/stat_item.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct rate_ctr_desc bsc_ctr_description[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+    [BSC_CTR_ASSIGNMENT_ATTEMPTED] =        {"assignment:attempted", "Assignment attempts"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BSC_CTR_ASSIGNMENT_COMPLETED] =        {"assignment:completed", "Assignment completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_ASSIGNMENT_STOPPED] =          {"assignment:stopped", "Connection ended during Assignment"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_ASSIGNMENT_NO_CHANNEL] =       {"assignment:no_channel", "Failure to allocate lchan for Assignment"},</span><br><span style="color: hsl(120, 100%, 40%);">+    [BSC_CTR_ASSIGNMENT_TIMEOUT] =          {"assignment:timeout", "Assignment timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_CTR_ASSIGNMENT_FAILED] =           {"assignment:failed", "Received Assignment Failure message"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_ASSIGNMENT_ERROR] =            {"assignment:error", "Assignment failed for other reason"},</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_HANDOVER_ATTEMPTED] =          {"handover:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(120, 100%, 40%);">+    [BSC_CTR_HANDOVER_COMPLETED] =          {"handover:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_CTR_HANDOVER_STOPPED] =            {"handover:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BSC_CTR_HANDOVER_NO_CHANNEL] =         {"handover:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BSC_CTR_HANDOVER_TIMEOUT] =            {"handover:timeout", "Handover timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BSC_CTR_HANDOVER_FAILED] =             {"handover:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_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%);">+    [BSC_CTR_INTRA_CELL_HO_ATTEMPTED] =     {"intra_cell_ho:attempted", "Intra-Cell handover attempts"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BSC_CTR_INTRA_CELL_HO_COMPLETED] =     {"intra_cell_ho:completed", "Intra-Cell handover completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_INTRA_CELL_HO_STOPPED] =       {"intra_cell_ho:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BSC_CTR_INTRA_CELL_HO_NO_CHANNEL] =    {"intra_cell_ho:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_INTRA_CELL_HO_TIMEOUT] =       {"intra_cell_ho:timeout", "Handover timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BSC_CTR_INTRA_CELL_HO_FAILED] =        {"intra_cell_ho:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BSC_CTR_INTRA_CELL_HO_ERROR] = {"intra_cell_ho: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%);">+       [BSC_CTR_INTRA_BSC_HO_ATTEMPTED] =      {"intra_bsc_ho:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BSC_CTR_INTRA_BSC_HO_COMPLETED] =      {"intra_bsc_ho:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BSC_CTR_INTRA_BSC_HO_STOPPED] =        {"intra_bsc_ho:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_CTR_INTRA_BSC_HO_NO_CHANNEL] =     {"intra_bsc_ho:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BSC_CTR_INTRA_BSC_HO_TIMEOUT] =        {"intra_bsc_ho:timeout", "Handover timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_CTR_INTRA_BSC_HO_FAILED] =         {"intra_bsc_ho:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(120, 100%, 40%);">+       [BSC_CTR_INTRA_BSC_HO_ERROR] =          {"intra_bsc_ho: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%);">+        [BSC_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%);">+     [BSC_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%);">+       [BSC_CTR_INTER_BSC_HO_OUT_STOPPED] =    {"interbsc_ho_out:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BSC_CTR_INTER_BSC_HO_OUT_TIMEOUT] =    {"interbsc_ho_out:timeout", "Handover timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+        [BSC_CTR_INTER_BSC_HO_OUT_FAILED] =     {"interbsc_ho_out:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_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%);">+       [BSC_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%);">+   [BSC_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%);">+     [BSC_CTR_INTER_BSC_HO_IN_STOPPED] =     {"interbsc_ho_in:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_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%);">+       [BSC_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%);">+ [BSC_CTR_INTER_BSC_HO_IN_FAILED] =      {"interbsc_ho_in:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(120, 100%, 40%);">+      [BSC_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 style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_SRVCC_ATTEMPTED] =             {"srvcc:attempted", "Intra-BSC SRVCC attempts"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BSC_CTR_SRVCC_COMPLETED] =             {"srvcc:completed", "Intra-BSC SRVCC completed"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_SRVCC_STOPPED] =               {"srvcc:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+  [BSC_CTR_SRVCC_NO_CHANNEL] =            {"srvcc:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_SRVCC_TIMEOUT] =               {"srvcc:timeout", "SRVCC timed out"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_SRVCC_FAILED] =                {"srvcc:failed", "Received SRVCC Fail messages"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_SRVCC_ERROR] =                 {"srvcc: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%);">+       [BSC_CTR_PAGING_ATTEMPTED] =            {"paging:attempted", "Paging attempts for a subscriber"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_PAGING_DETACHED] =             {"paging:detached", "Paging request send failures because no responsible BTS was found"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_PAGING_RESPONDED] =            {"paging:responded", "Paging attempts with successful response"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_PAGING_NO_ACTIVE_PAGING] =     {"paging:no_active_paging", "Paging response without an active paging request (arrived after paging expiration?)"},</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_UNKNOWN_UNIT_ID] =             {"abis:unknown_unit_id", "Connection attempts from unknown IPA CCM Unit ID"},</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   [BSC_CTR_MSCPOOL_SUBSCR_NO_MSC] =       {"mscpool:subscr:no_msc",</span><br><span style="color: hsl(120, 100%, 40%);">+                                            "Complete Layer 3 requests lost because no connected MSC is found available"},</span><br><span style="color: hsl(120, 100%, 40%);">+     [BSC_CTR_MSCPOOL_EMERG_FORWARDED] =     {"mscpool:emerg:forwarded",</span><br><span style="color: hsl(120, 100%, 40%);">+                                          "Emergency call requests forwarded to an MSC (see also per-MSC counters"},</span><br><span style="color: hsl(120, 100%, 40%);">+ [BSC_CTR_MSCPOOL_EMERG_LOST] =          {"mscpool:emerg:lost",</span><br><span style="color: hsl(120, 100%, 40%);">+                                               "Emergency call requests lost because no MSC was found available"},</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%);">+const struct rate_ctr_group_desc bsc_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+      "bsc",</span><br><span style="color: hsl(120, 100%, 40%);">+      "base station controller",</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      ARRAY_SIZE(bsc_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+      bsc_ctr_description,</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 const struct osmo_stat_item_desc bsc_stat_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+       [BSC_STAT_NUM_BTS_TOTAL] = { "num_bts:total", "Number of configured BTS for this BSC", "", 16, 0 },</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%);">+const struct osmo_stat_item_group_desc bsc_statg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+    .group_name_prefix = "bsc",</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_description = "base station controller",</span><br><span style="color: hsl(120, 100%, 40%);">+     .class_id = OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_items = ARRAY_SIZE(bsc_stat_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+       .item_desc = bsc_stat_desc,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>index 27f6aee..8d2908f 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>@@ -51,6 +51,7 @@</span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/bsc/bts_sm.h></span><br><span> #include <osmocom/bsc/nm_common_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> static int bts_model_nanobts_start(struct gsm_network *net);</span><br><span> static void bts_model_nanobts_e1line_bind_ops(struct e1inp_line *line);</span><br><span>diff --git a/src/osmo-bsc/bts_vty.c b/src/osmo-bsc/bts_vty.c</span><br><span>index 577feec..2b7b42b 100644</span><br><span>--- a/src/osmo-bsc/bts_vty.c</span><br><span>+++ b/src/osmo-bsc/bts_vty.c</span><br><span>@@ -49,6 +49,7 @@</span><br><span> #include <osmocom/bsc/neighbor_ident.h></span><br><span> #include <osmocom/bsc/smscb.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #include <inttypes.h></span><br><span> </span><br><span>diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c</span><br><span>index 1f6b38e..91c90fe 100644</span><br><span>--- a/src/osmo-bsc/gsm_08_08.c</span><br><span>+++ b/src/osmo-bsc/gsm_08_08.c</span><br><span>@@ -26,6 +26,7 @@</span><br><span> #include <osmocom/bsc/gsm_08_08.h></span><br><span> #include <osmocom/bsc/codec_pref.h></span><br><span> #include <osmocom/bsc/lchan_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #include <osmocom/bsc/gsm_04_08_rr.h></span><br><span> #include <osmocom/bsc/a_reset.h></span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index 797a336..255478f 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -45,6 +45,7 @@</span><br><span> #include <osmocom/bsc/gsm_08_08.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span> #include <osmocom/bsc/lcs_loc_req.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #define LOG_FMT_BTS "bts %u lac-ci %u-%u arfcn-bsic %d-%d"</span><br><span> #define LOG_ARGS_BTS(bts) \</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index 6f0caa7..d786ec6 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -34,6 +34,7 @@</span><br><span> #include <osmocom/bsc/abis_rsl.h></span><br><span> #include <osmocom/bsc/handover_fsm.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #include <osmocom/gsm/protocol/gsm_08_08.h></span><br><span> #include <osmocom/gsm/gsm0808.h></span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index b97c7a1..b3bd365 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -67,6 +67,7 @@</span><br><span> #include <osmocom/bsc/codec_pref.h></span><br><span> #include <osmocom/bsc/system_information.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> #include <osmocom/mgcp_client/mgcp_client.h></span><br><span> </span><br><span>diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c</span><br><span>index d2dd5ea..04512be 100644</span><br><span>--- a/src/osmo-bsc/paging.c</span><br><span>+++ b/src/osmo-bsc/paging.c</span><br><span>@@ -54,6 +54,7 @@</span><br><span> #include <osmocom/bsc/gsm_04_08_rr.h></span><br><span> #include <osmocom/bsc/bsc_subscr_conn_fsm.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_stats.h></span><br><span> </span><br><span> void *tall_paging_ctx = NULL;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/25273">change 25273</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/+/25273"/><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: I8fd6380b5ae8ed2d3347e7cfbf674c30b6841ed9 </div>
<div style="display:none"> Gerrit-Change-Number: 25273 </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>