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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bts: move rate counter / stat item definitions from *.h to *.c<br><br>A header file should only contain declarations, not entire definitions.<br>The fact that we have 'static const struct ...' definitions in a header<br>file means that very C file including this header file will get its own<br>private copy of the entire definition.<br><br>The header file should only include declarations, while the actual<br>non-static definitions should go to a *.c file.  Let's fix this.<br><br>Also, take a chance to improve readability and apply more consistent<br>formatting (similar to 'struct hf_register_info[]' in Wireshark).<br><br>Change-Id: Ib5949879902acbe1edda577477d9d51a2cc425d1<br>Closes: OS#4816<br>---<br>M include/osmocom/bsc/bts.h<br>M src/osmo-bsc/bts.c<br>2 files changed, 392 insertions(+), 168 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 284a932..fd2ac32 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -106,119 +106,8 @@</span><br><span>  BTS_CTR_INTER_BSC_HO_IN_ERROR,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_CHREQ_TOTAL] =                 {"chreq:total", "Received channel requests"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_CTR_CHREQ_SUCCESSFUL] =            {"chreq:successful", "Successful channel requests (immediate assign sent)"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_CHREQ_NO_CHANNEL] =            {"chreq:no_channel", "Sent to MS no channel available"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_CHAN_RF_FAIL] =                {"chan:rf_fail", "Received a RF failure indication from BTS"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_CHAN_RLL_ERR] =                {"chan:rll_err", "Received a RLL failure with T200 cause from BTS"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_BTS_OML_FAIL] =                {"oml_fail", "Received a TEI down on a OML link"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_BTS_RSL_FAIL] =                {"rsl_fail", "Received a TEI down on a OML link"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_CODEC_AMR_F] =                 {"codec:amr_f", "Count the usage of AMR/F codec by channel mode requested"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_CODEC_AMR_H] =                 {"codec:amr_h", "Count the usage of AMR/H codec by channel mode requested"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_CODEC_EFR] =                   {"codec:efr", "Count the usage of EFR codec by channel mode requested"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_CODEC_V1_FR] =                 {"codec:fr", "Count the usage of FR codec by channel mode requested"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_CODEC_V1_HR] =                 {"codec:hr", "Count the usage of HR codec by channel mode requested"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_PAGING_ATTEMPTED] =            {"paging:attempted", "Paging attempts for a subscriber"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_PAGING_ALREADY] =              {"paging:already", "Paging attempts ignored as subscriber was already being paged"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_PAGING_RESPONDED] =            {"paging:responded", "Paging attempts with successful paging response"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_PAGING_EXPIRED] =              {"paging:expired", "Paging Request expired because of timeout T3113"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_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%);">- [BTS_CTR_PAGING_MSC_FLUSH] =            {"paging:msc_flush", "Paging flushed due to MSC Reset BSSMAP message"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_CHAN_ACT_TOTAL] =              {"chan_act:total", "Total number of Channel Activations"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_CHAN_ACT_NACK] =               {"chan_act:nack", "Number of Channel Activations that the BTS NACKed"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_RSL_UNKNOWN] =                 {"rsl:unknown", "Number of unknown/unsupported RSL messages received from BTS"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_RSL_IPA_NACK] =                {"rsl:ipa_nack", "Number of IPA (RTP/dyn-PDCH) related NACKs received from BTS"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_RSL_DELETE_IND] =              {"rsl:delete_ind", "Number of RSL DELETE INDICATION (DL CCCH overload)"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_MODE_MODIFY_NACK] =            {"chan:mode_modify_nack", "Number of Channel Mode Modify NACKs received from BTS"},</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* lchan/TS BORKEN state counters */</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_LCHAN_BORKEN_FROM_UNUSED] =              {"lchan_borken:from_state:unused", "Transitions from lchan UNUSED state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK] =      {"lchan_borken:from_state:wait_activ_ack", "Transitions from lchan WAIT_ACTIV_ACK state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK] = {"lchan_borken:from_state:wait_rf_release_ack", "Transitions from lchan WAIT_RF_RELEASE_ACK state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_LCHAN_BORKEN_FROM_BORKEN] =              {"lchan_borken:from_state:borken", "Transitions from lchan BORKEN state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RR_CHAN_MODE_MODIFY_ACK] = {"lchan_borken:from_state:wait_rr_chan_mode_modify_ack", "Transitions from lchan WAIT_RR_CHAN_MODE_MODIFY_ACK state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RSL_CHAN_MODE_MODIFY_ACK] = {"lchan_borken:from_state:wait_rsl_chan_mode_modify_ack", "Transitions from lchan RSL_CHAN_MODE_MODIFY_ACK state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN] =             {"lchan_borken:from_state:unknown", "Transitions from an unknown lchan state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK] =        {"lchan_borken:event:chan_activ_ack", "CHAN_ACTIV_ACK received in the lchan BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK] =       {"lchan_borken:event:chan_activ_nack", "CHAN_ACTIV_NACK received in the lchan BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK] =       {"lchan_borken:event:rf_chan_rel_ack", "RF_CHAN_REL_ACK received in the lchan BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_LCHAN_BORKEN_EV_VTY] =                   {"lchan_borken:event:vty", "VTY commands received in the lchan BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN] =              {"lchan_borken:event:teardown", "lchan in a BORKEN state is shutting down (BTS disconnected?)"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED] =   {"ts_borken:from_state:not_initialized", "Transitions from TS NOT_INITIALIZED state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_CTR_TS_BORKEN_FROM_UNUSED] =            {"ts_borken:from_state:unused", "Transitions from TS UNUSED state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT] =     {"ts_borken:from_state:wait_pdch_act", "Transitions from TS WAIT_PDCH_ACT state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_TS_BORKEN_FROM_PDCH] =              {"ts_borken:from_state:pdch", "Transitions from TS PDCH state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT] =   {"ts_borken:from_state:wait_pdch_deact", "Transitions from TS WAIT_PDCH_DEACT state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_CTR_TS_BORKEN_FROM_IN_USE] =            {"ts_borken:from_state:in_use", "Transitions from TS IN_USE state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_TS_BORKEN_FROM_BORKEN] =            {"ts_borken:from_state:borken", "Transitions from TS BORKEN state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_CTR_TS_BORKEN_FROM_UNKNOWN] =           {"ts_borken:from_state:unknown", "Transitions from an unknown TS state to BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK] =   {"ts_borken:event:pdch_act_ack_nack", "PDCH_ACT_ACK/NACK received in the TS BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK] = {"ts_borken:event:pdch_deact_ack_nack", "PDCH_DEACT_ACK/NACK received in the TS BORKEN state"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_TS_BORKEN_EV_TEARDOWN] =            {"ts_borken:event:teardown", "TS in a BORKEN state is shutting down (BTS disconnected?)"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_ASSIGNMENT_ATTEMPTED] =             {"assignment:attempted", "Assignment attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_CTR_ASSIGNMENT_COMPLETED] =             {"assignment:completed", "Assignment completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_ASSIGNMENT_STOPPED] =               {"assignment:stopped", "Connection ended during Assignment"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_ASSIGNMENT_NO_CHANNEL] =            {"assignment:no_channel", "Failure to allocate lchan for Assignment"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_CTR_ASSIGNMENT_TIMEOUT] =               {"assignment:timeout", "Assignment timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_ASSIGNMENT_FAILED] =                {"assignment:failed", "Received Assignment Failure message"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_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%);">-    [BTS_CTR_HANDOVER_ATTEMPTED] =          {"handover:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_CTR_HANDOVER_COMPLETED] =          {"handover:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_HANDOVER_STOPPED] =            {"handover:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_CTR_HANDOVER_NO_CHANNEL] =         {"handover:no_channel", "Failure to allocate lchan for HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_HANDOVER_TIMEOUT] =            {"handover:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_CTR_HANDOVER_FAILED] =             {"handover:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_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%);">-        [BTS_CTR_INTRA_CELL_HO_ATTEMPTED] =     {"intra_cell_ho:attempted", "Intra-Cell handover attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_CTR_INTRA_CELL_HO_COMPLETED] =     {"intra_cell_ho:completed", "Intra-Cell handover completed"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_CTR_INTRA_CELL_HO_STOPPED] =       {"intra_cell_ho:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_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%);">-   [BTS_CTR_INTRA_CELL_HO_TIMEOUT] =       {"intra_cell_ho:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_CTR_INTRA_CELL_HO_FAILED] =        {"intra_cell_ho:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_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%);">-   [BTS_CTR_INTRA_BSC_HO_ATTEMPTED] =      {"intra_bsc_ho:attempted", "Intra-BSC handover attempts"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_INTRA_BSC_HO_COMPLETED] =      {"intra_bsc_ho:completed", "Intra-BSC handover completed"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_CTR_INTRA_BSC_HO_STOPPED] =        {"intra_bsc_ho:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_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%);">-    [BTS_CTR_INTRA_BSC_HO_TIMEOUT] =        {"intra_bsc_ho:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_CTR_INTRA_BSC_HO_FAILED] =         {"intra_bsc_ho:failed", "Received Handover Fail messages"},</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_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%);">-    [BTS_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%);">-       [BTS_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%);">- [BTS_CTR_INTER_BSC_HO_OUT_STOPPED] =    {"interbsc_ho_out:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_INTER_BSC_HO_OUT_TIMEOUT] =    {"interbsc_ho_out:timeout", "Handover timed out"},</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_CTR_INTER_BSC_HO_OUT_FAILED] =     {"interbsc_ho_out:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_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%);">-   [BTS_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%);">-     [BTS_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%);">-       [BTS_CTR_INTER_BSC_HO_IN_STOPPED] =     {"interbsc_ho_in:stopped", "Connection ended during HO"},</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_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%);">- [BTS_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%);">-   [BTS_CTR_INTER_BSC_HO_IN_FAILED] =      {"interbsc_ho_in:failed", "Received Handover Fail message"},</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct rate_ctr_group_desc bts_ctrg_desc = {</span><br><span style="color: hsl(0, 100%, 40%);">-      "bts",</span><br><span style="color: hsl(0, 100%, 40%);">-        "base transceiver station",</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(0, 100%, 40%);">-        ARRAY_SIZE(bts_ctr_description),</span><br><span style="color: hsl(0, 100%, 40%);">-        bts_ctr_description,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct rate_ctr_desc bts_ctr_description[];</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct rate_ctr_group_desc bts_ctrg_desc;</span><br><span> </span><br><span> enum {</span><br><span>       BTS_STAT_CHAN_LOAD_AVERAGE,</span><br><span>@@ -247,61 +136,8 @@</span><br><span>   BTS_STAT_TS_BORKEN,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const struct osmo_stat_item_desc bts_stat_desc[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_STAT_CHAN_LOAD_AVERAGE] =                  { "chanloadavg", "Channel load average", "%", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_STAT_CHAN_CCCH_SDCCH4_USED] =              { "chan_ccch_sdcch4:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      "Number of CCCH+SDCCH4 channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL] =             { "chan_ccch_sdcch4:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     "Number of CCCH+SDCCH4 channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_STAT_CHAN_TCH_F_USED] =                    { "chan_tch_f:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    "Number of TCH/F channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_STAT_CHAN_TCH_F_TOTAL] =                   { "chan_tch_f:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   "Number of TCH/F channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_STAT_CHAN_TCH_H_USED] =                    { "chan_tch_h:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                    "Number of TCH/H channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-     [BTS_STAT_CHAN_TCH_H_TOTAL] =                   { "chan_tch_h:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   "Number of TCH/H channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_STAT_CHAN_SDCCH8_USED] =                   { "chan_sdcch8:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                   "Number of SDCCH8 channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_STAT_CHAN_SDCCH8_TOTAL] =                  { "chan_sdcch8:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                          "Number of SDCCH8 channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_STAT_CHAN_TCH_F_PDCH_USED] =               { "chan_tch_f_pdch:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       "Number of TCH/F_PDCH channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-        [BTS_STAT_CHAN_TCH_F_PDCH_TOTAL] =              { "chan_tch_f_pdch:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      "Number of TCH/F_PDCH channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED] =         { "chan_ccch_sdcch4_cbch:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                         "Number of CCCH+SDCCH4+CBCH channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL] =        { "chan_ccch_sdcch4_cbch:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        "Number of CCCH+SDCCH4+CBCH channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_STAT_CHAN_SDCCH8_CBCH_USED] =              { "chan_sdcch8_cbch:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                      "Number of SDCCH8+CBCH channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL] =             { "chan_sdcch8_cbch:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                     "Number of SDCCH8+CBCH channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED] =         { "chan_tch_f_tch_h_pdch:used",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                         "Number of TCH/F_TCH/H_PDCH channels used", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL] =        { "chan_tch_f_tch_h_pdch:total",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        "Number of TCH/F_TCH/H_PDCH channels total", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">- [BTS_STAT_T3122] =                              { "T3122", "T3122 IMMEDIATE ASSIGNMENT REJECT wait indicator",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        "s", 16, GSM_T3122_DEFAULT },</span><br><span style="color: hsl(0, 100%, 40%);">-       [BTS_STAT_RACH_BUSY] =                          { "rach_busy",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                          "RACH slots with signal above threshold", "%", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-   [BTS_STAT_RACH_ACCESS] =                        { "rach_access",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                        "RACH slots with access bursts in them", "%", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-    [BTS_STAT_OML_CONNECTED] =                      { "oml_connected", "Number of OML links connected", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_STAT_RSL_CONNECTED] =                      { "rsl_connected", "Number of RSL links connected", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-  [BTS_STAT_LCHAN_BORKEN] =                       { "lchan_borken",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                       "Number of lchans in the BORKEN state", "", 16, 0 },</span><br><span style="color: hsl(0, 100%, 40%);">-      [BTS_STAT_TS_BORKEN] =                          { "ts_borken",</span><br><span style="color: hsl(0, 100%, 40%);">-                                                          "Number of timeslots in the BORKEN state", "", 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 bts_statg_desc = {</span><br><span style="color: hsl(0, 100%, 40%);">- .group_name_prefix = "bts",</span><br><span style="color: hsl(0, 100%, 40%);">-   .group_description = "base transceiver station",</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(bts_stat_desc),</span><br><span style="color: hsl(0, 100%, 40%);">- .item_desc = bts_stat_desc,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct osmo_stat_item_desc bts_stat_desc[];</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct osmo_stat_item_group_desc bts_statg_desc;</span><br><span> </span><br><span> enum gsm_bts_type {</span><br><span>    GSM_BTS_TYPE_UNKNOWN,</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 3dd827e..aa7ba1d 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -739,3 +739,391 @@</span><br><span> </span><br><span>       return 0;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_CHREQ_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "chreq:total",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Received channel requests" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_CHREQ_SUCCESSFUL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "chreq:successful",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Successful channel requests (immediate assign sent)" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_CHREQ_NO_CHANNEL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "chreq:no_channel",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Sent to MS no channel available" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_CHAN_RF_FAIL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "chan:rf_fail",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Received a RF failure indication from BTS" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_CHAN_RLL_ERR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "chan:rll_err",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Received a RLL failure with T200 cause from BTS" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_BTS_OML_FAIL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "oml_fail",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Received a TEI down on a OML link" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_BTS_RSL_FAIL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "rsl_fail",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Received a TEI down on a OML link" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_CODEC_AMR_F] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "codec:amr_f",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Count the usage of AMR/F codec by channel mode requested" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_CODEC_AMR_H] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "codec:amr_h",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Count the usage of AMR/H codec by channel mode requested" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_CODEC_EFR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "codec:efr",</span><br><span style="color: hsl(120, 100%, 40%);">+                "Count the usage of EFR codec by channel mode requested" },</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_CODEC_V1_FR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "codec:fr",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Count the usage of FR codec by channel mode requested" },</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_CODEC_V1_HR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "codec:hr",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Count the usage of HR codec by channel mode requested" },</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_PAGING_ATTEMPTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "paging:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Paging attempts for a subscriber" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_PAGING_ALREADY] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "paging:already",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Paging attempts ignored as subscriber was already being paged" },</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_PAGING_RESPONDED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "paging:responded",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Paging attempts with successful paging response" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_PAGING_EXPIRED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "paging:expired",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Paging Request expired because of timeout T3113" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_PAGING_NO_ACTIVE_PAGING] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "paging:no_active_paging",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Paging response without an active paging request (arrived after paging expiration?)" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_PAGING_MSC_FLUSH] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "paging:msc_flush",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Paging flushed due to MSC Reset BSSMAP message" },</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_CHAN_ACT_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "chan_act:total",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Total number of Channel Activations" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_CHAN_ACT_NACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "chan_act:nack",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of Channel Activations that the BTS NACKed" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_RSL_UNKNOWN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "rsl:unknown",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Number of unknown/unsupported RSL messages received from BTS" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_RSL_IPA_NACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "rsl:ipa_nack",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Number of IPA (RTP/dyn-PDCH) related NACKs received from BTS" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_RSL_DELETE_IND] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "rsl:delete_ind",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Number of RSL DELETE INDICATION (DL CCCH overload)" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_MODE_MODIFY_NACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "chan:mode_modify_nack",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of Channel Mode Modify NACKs received from BTS" },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* lchan/TS BORKEN state counters */</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_LCHAN_BORKEN_FROM_UNUSED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "lchan_borken:from_state:unused",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Transitions from lchan UNUSED state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "lchan_borken:from_state:wait_activ_ack",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Transitions from lchan WAIT_ACTIV_ACK state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "lchan_borken:from_state:wait_rf_release_ack",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Transitions from lchan WAIT_RF_RELEASE_ACK state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_LCHAN_BORKEN_FROM_BORKEN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "lchan_borken:from_state:borken",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Transitions from lchan BORKEN state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RR_CHAN_MODE_MODIFY_ACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "lchan_borken:from_state:wait_rr_chan_mode_modify_ack",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Transitions from lchan WAIT_RR_CHAN_MODE_MODIFY_ACK state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RSL_CHAN_MODE_MODIFY_ACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "lchan_borken:from_state:wait_rsl_chan_mode_modify_ack",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Transitions from lchan RSL_CHAN_MODE_MODIFY_ACK state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "lchan_borken:from_state:unknown",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Transitions from an unknown lchan state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "lchan_borken:event:chan_activ_ack",</span><br><span style="color: hsl(120, 100%, 40%);">+                "CHAN_ACTIV_ACK received in the lchan BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "lchan_borken:event:chan_activ_nack",</span><br><span style="color: hsl(120, 100%, 40%);">+               "CHAN_ACTIV_NACK received in the lchan BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "lchan_borken:event:rf_chan_rel_ack",</span><br><span style="color: hsl(120, 100%, 40%);">+               "RF_CHAN_REL_ACK received in the lchan BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_LCHAN_BORKEN_EV_VTY] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "lchan_borken:event:vty",</span><br><span style="color: hsl(120, 100%, 40%);">+           "VTY commands received in the lchan BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "lchan_borken:event:teardown",</span><br><span style="color: hsl(120, 100%, 40%);">+              "lchan in a BORKEN state is shutting down (BTS disconnected?)" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "ts_borken:from_state:not_initialized",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Transitions from TS NOT_INITIALIZED state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_TS_BORKEN_FROM_UNUSED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "ts_borken:from_state:unused",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Transitions from TS UNUSED state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "ts_borken:from_state:wait_pdch_act",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Transitions from TS WAIT_PDCH_ACT state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_TS_BORKEN_FROM_PDCH] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "ts_borken:from_state:pdch",</span><br><span style="color: hsl(120, 100%, 40%);">+                "Transitions from TS PDCH state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "ts_borken:from_state:wait_pdch_deact",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Transitions from TS WAIT_PDCH_DEACT state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_TS_BORKEN_FROM_IN_USE] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "ts_borken:from_state:in_use",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Transitions from TS IN_USE state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_TS_BORKEN_FROM_BORKEN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "ts_borken:from_state:borken",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Transitions from TS BORKEN state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_TS_BORKEN_FROM_UNKNOWN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "ts_borken:from_state:unknown",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Transitions from an unknown TS state to BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "ts_borken:event:pdch_act_ack_nack",</span><br><span style="color: hsl(120, 100%, 40%);">+                "PDCH_ACT_ACK/NACK received in the TS BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "ts_borken:event:pdch_deact_ack_nack",</span><br><span style="color: hsl(120, 100%, 40%);">+              "PDCH_DEACT_ACK/NACK received in the TS BORKEN state" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_TS_BORKEN_EV_TEARDOWN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "ts_borken:event:teardown",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "TS in a BORKEN state is shutting down (BTS disconnected?)" },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_CTR_ASSIGNMENT_ATTEMPTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "assignment:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Assignment attempts" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_ASSIGNMENT_COMPLETED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "assignment:completed",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Assignment completed" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_ASSIGNMENT_STOPPED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "assignment:stopped",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Connection ended during Assignment" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_ASSIGNMENT_NO_CHANNEL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "assignment:no_channel",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Failure to allocate lchan for Assignment" },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_CTR_ASSIGNMENT_TIMEOUT] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "assignment:timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Assignment timed out" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_ASSIGNMENT_FAILED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "assignment:failed",</span><br><span style="color: hsl(120, 100%, 40%);">+                "Received Assignment Failure message" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_ASSIGNMENT_ERROR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "assignment:error",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "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_HANDOVER_ATTEMPTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "handover:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Intra-BSC handover attempts" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_HANDOVER_COMPLETED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "handover:completed",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Intra-BSC handover completed" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_HANDOVER_STOPPED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "handover:stopped",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Connection ended during HO" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_HANDOVER_NO_CHANNEL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "handover: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_HANDOVER_TIMEOUT] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "handover:timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Handover timed out" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_HANDOVER_FAILED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "handover:failed",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Received Handover Fail messages" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_HANDOVER_ERROR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "handover:error",</span><br><span style="color: hsl(120, 100%, 40%);">+           "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_INTRA_CELL_HO_ATTEMPTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "intra_cell_ho:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Intra-Cell handover attempts" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_INTRA_CELL_HO_COMPLETED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "intra_cell_ho:completed",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Intra-Cell handover completed" },</span><br><span style="color: hsl(120, 100%, 40%);">+        [BTS_CTR_INTRA_CELL_HO_STOPPED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "intra_cell_ho:stopped",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Connection ended during HO" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_INTRA_CELL_HO_NO_CHANNEL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "intra_cell_ho: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_INTRA_CELL_HO_TIMEOUT] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "intra_cell_ho:timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Handover timed out" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_INTRA_CELL_HO_FAILED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "intra_cell_ho:failed",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Received Handover Fail messages" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_INTRA_CELL_HO_ERROR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "intra_cell_ho:error",</span><br><span style="color: hsl(120, 100%, 40%);">+              "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_INTRA_BSC_HO_ATTEMPTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "intra_bsc_ho:attempted",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Intra-BSC handover attempts" },</span><br><span style="color: hsl(120, 100%, 40%);">+  [BTS_CTR_INTRA_BSC_HO_COMPLETED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "intra_bsc_ho:completed",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Intra-BSC handover completed" },</span><br><span style="color: hsl(120, 100%, 40%);">+ [BTS_CTR_INTRA_BSC_HO_STOPPED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "intra_bsc_ho:stopped",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Connection ended during HO" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_INTRA_BSC_HO_NO_CHANNEL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "intra_bsc_ho: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_INTRA_BSC_HO_TIMEOUT] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "intra_bsc_ho:timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Handover timed out" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_INTRA_BSC_HO_FAILED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "intra_bsc_ho:failed",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Received Handover Fail messages" },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_CTR_INTRA_BSC_HO_ERROR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "intra_bsc_ho:error",</span><br><span style="color: hsl(120, 100%, 40%);">+               "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] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "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] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "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] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "interbsc_ho_out:stopped",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Connection ended during HO" },</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%);">+                { "interbsc_ho_out:timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Handover timed out" },</span><br><span style="color: hsl(120, 100%, 40%);">+   [BTS_CTR_INTER_BSC_HO_OUT_FAILED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "interbsc_ho_out:failed",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Received Handover Fail message" },</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%);">+          { "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%);">+       [BTS_CTR_INTER_BSC_HO_IN_ATTEMPTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "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] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "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] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "interbsc_ho_in:stopped",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Connection ended during HO" },</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%);">+              { "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] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "interbsc_ho_in:timeout",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Handover from remote BSS timed out" },</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%);">+          { "interbsc_ho_in:failed",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Received Handover Fail message" },</span><br><span style="color: hsl(120, 100%, 40%);">+       [BTS_CTR_INTER_BSC_HO_IN_ERROR] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+const struct rate_ctr_group_desc bts_ctrg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+   "bts",</span><br><span style="color: hsl(120, 100%, 40%);">+      "base transceiver station",</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_STATS_CLASS_GLOBAL,</span><br><span style="color: hsl(120, 100%, 40%);">+      ARRAY_SIZE(bts_ctr_description),</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_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%);">+const struct osmo_stat_item_desc bts_stat_desc[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_LOAD_AVERAGE] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "chanloadavg",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Channel load average",</span><br><span style="color: hsl(120, 100%, 40%);">+             "%", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_STAT_CHAN_CCCH_SDCCH4_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "chan_ccch_sdcch4:used",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of CCCH+SDCCH4 channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+              "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "chan_ccch_sdcch4:total",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Number of CCCH+SDCCH4 channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+             "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_F_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "chan_tch_f:used",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Number of TCH/F channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+            "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_F_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "chan_tch_f:total",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Number of TCH/F channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+           "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_H_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+                { "chan_tch_h:used",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "Number of TCH/H channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+            "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_H_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "chan_tch_h:total",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Number of TCH/H channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+           "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_SDCCH8_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+               { "chan_sdcch8:used",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Number of SDCCH8 channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+           "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_SDCCH8_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "chan_sdcch8:total",</span><br><span style="color: hsl(120, 100%, 40%);">+                "Number of SDCCH8 channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_F_PDCH_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "chan_tch_f_pdch:used",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Number of TCH/F_PDCH channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+               "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_F_PDCH_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "chan_tch_f_pdch:total",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of TCH/F_PDCH channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+              "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "chan_ccch_sdcch4_cbch:used",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Number of CCCH+SDCCH4+CBCH channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "chan_ccch_sdcch4_cbch:total",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Number of CCCH+SDCCH4+CBCH channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+                "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_SDCCH8_CBCH_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "chan_sdcch8_cbch:used",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of SDCCH8+CBCH channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+              "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+         { "chan_sdcch8_cbch:total",</span><br><span style="color: hsl(120, 100%, 40%);">+           "Number of SDCCH8+CBCH channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+             "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+             { "chan_tch_f_tch_h_pdch:used",</span><br><span style="color: hsl(120, 100%, 40%);">+               "Number of TCH/F_TCH/H_PDCH channels used",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "chan_tch_f_tch_h_pdch:total",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Number of TCH/F_TCH/H_PDCH channels total",</span><br><span style="color: hsl(120, 100%, 40%);">+                "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_T3122] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "T3122",</span><br><span style="color: hsl(120, 100%, 40%);">+            "T3122 IMMEDIATE ASSIGNMENT REJECT wait indicator",</span><br><span style="color: hsl(120, 100%, 40%);">+                 "s", 16, GSM_T3122_DEFAULT },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_STAT_RACH_BUSY] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "rach_busy",</span><br><span style="color: hsl(120, 100%, 40%);">+                "RACH slots with signal above threshold",</span><br><span style="color: hsl(120, 100%, 40%);">+           "%", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_STAT_RACH_ACCESS] = \</span><br><span style="color: hsl(120, 100%, 40%);">+            { "rach_access",</span><br><span style="color: hsl(120, 100%, 40%);">+              "RACH slots with access bursts in them",</span><br><span style="color: hsl(120, 100%, 40%);">+            "%", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     [BTS_STAT_OML_CONNECTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "oml_connected",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of OML links connected",</span><br><span style="color: hsl(120, 100%, 40%);">+            "", 16, 0   },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_STAT_RSL_CONNECTED] = \</span><br><span style="color: hsl(120, 100%, 40%);">+          { "rsl_connected",</span><br><span style="color: hsl(120, 100%, 40%);">+            "Number of RSL links connected",</span><br><span style="color: hsl(120, 100%, 40%);">+            "", 16, 0   },</span><br><span style="color: hsl(120, 100%, 40%);">+    [BTS_STAT_LCHAN_BORKEN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+           { "lchan_borken",</span><br><span style="color: hsl(120, 100%, 40%);">+             "Number of lchans in the BORKEN state",</span><br><span style="color: hsl(120, 100%, 40%);">+             "", 16, 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+      [BTS_STAT_TS_BORKEN] = \</span><br><span style="color: hsl(120, 100%, 40%);">+              { "ts_borken",</span><br><span style="color: hsl(120, 100%, 40%);">+                "Number of timeslots in the BORKEN state",</span><br><span style="color: hsl(120, 100%, 40%);">+                  "", 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 bts_statg_desc = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .group_name_prefix = "bts",</span><br><span style="color: hsl(120, 100%, 40%);">+ .group_description = "base transceiver station",</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(bts_stat_desc),</span><br><span style="color: hsl(120, 100%, 40%);">+       .item_desc = bts_stat_desc,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20731">change 20731</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/+/20731"/><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: Ib5949879902acbe1edda577477d9d51a2cc425d1 </div>
<div style="display:none"> Gerrit-Change-Number: 20731 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>