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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Use new stat item/ctr getter APIs<br><br>Generated with  following and similar spatch snippets:<br>"""<br>@@<br>expression E1, E2;<br>@@<br>- &E2->ctr[E1]<br>+ rate_ctr_group_get_ctr(E2, E1)<br>"""<br><br>Change-Id: I0b43f922a595d694ac0aeda80107ef9bf4e755e7<br>---<br>M src/osmo-bsc/a_reset.c<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/assignment_fsm.c<br>M src/osmo-bsc/bsc_subscr_conn_fsm.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_ipaccess_nanobts.c<br>M src/osmo-bsc/chan_alloc.c<br>M src/osmo-bsc/gsm_08_08.c<br>M src/osmo-bsc/handover_fsm.c<br>M src/osmo-bsc/lb.c<br>M src/osmo-bsc/lchan_fsm.c<br>M src/osmo-bsc/lcs_loc_req.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M src/osmo-bsc/osmo_bsc_filter.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M src/osmo-bsc/osmo_bsc_sigtran.c<br>M src/osmo-bsc/paging.c<br>M src/osmo-bsc/timeslot_fsm.c<br>19 files changed, 179 insertions(+), 181 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/osmo-bsc/a_reset.c b/src/osmo-bsc/a_reset.c</span><br><span>index 2371499..0befd72 100644</span><br><span>--- a/src/osmo-bsc/a_reset.c</span><br><span>+++ b/src/osmo-bsc/a_reset.c</span><br><span>@@ -42,7 +42,7 @@</span><br><span> {</span><br><span>  struct bsc_msc_data *msc = data;</span><br><span>     LOGP(DMSC, LOGL_NOTICE, "(msc%d) BSSMAP assocation is up\n", msc->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stat_item_inc(msc->msc_statg->items[MSC_STAT_MSC_LINKS_ACTIVE], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stat_item_inc(osmo_stat_item_group_get_item(msc->msc_statg, MSC_STAT_MSC_LINKS_ACTIVE), 1);</span><br><span>  osmo_signal_dispatch(SS_MSC, S_MSC_CONNECTED, msc);</span><br><span> }</span><br><span> </span><br><span>@@ -50,7 +50,7 @@</span><br><span> {</span><br><span>        struct bsc_msc_data *msc = data;</span><br><span>     LOGP(DMSC, LOGL_NOTICE, "(msc%d) BSSMAP assocation is down\n", msc->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_stat_item_dec(msc->msc_statg->items[MSC_STAT_MSC_LINKS_ACTIVE], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_stat_item_dec(osmo_stat_item_group_get_item(msc->msc_statg, MSC_STAT_MSC_LINKS_ACTIVE), 1);</span><br><span>  osmo_signal_dispatch(SS_MSC, S_MSC_LOST, msc);</span><br><span>       osmo_bsc_sigtran_reset(msc);</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index 1fb4c04..00bb5dc 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -72,10 +72,10 @@</span><br><span>     if (lchan->type == GSM_LCHAN_TCH_H) {</span><br><span>             switch (gsm48_chan_mode_to_non_vamos(lchan->current_ch_mode_rate.chan_mode)) {</span><br><span>            case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_AMR_H]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CODEC_AMR_H));</span><br><span>                         break;</span><br><span>               case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-                     rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_V1_HR]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CODEC_V1_HR));</span><br><span>                         break;</span><br><span>               default:</span><br><span>                     break;</span><br><span>@@ -83,13 +83,13 @@</span><br><span>         } else if (lchan->type == GSM_LCHAN_TCH_F) {</span><br><span>              switch (gsm48_chan_mode_to_non_vamos(lchan->current_ch_mode_rate.chan_mode)) {</span><br><span>            case GSM48_CMODE_SPEECH_AMR:</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_AMR_F]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CODEC_AMR_F));</span><br><span>                         break;</span><br><span>               case GSM48_CMODE_SPEECH_V1:</span><br><span style="color: hsl(0, 100%, 40%);">-                     rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_V1_FR]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CODEC_V1_FR));</span><br><span>                         break;</span><br><span>               case GSM48_CMODE_SPEECH_EFR:</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CODEC_EFR]);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CODEC_EFR));</span><br><span>                   break;</span><br><span>               default:</span><br><span>                     break;</span><br><span>@@ -609,14 +609,14 @@</span><br><span> </span><br><span>   msg->dst = rsl_chan_link(lchan);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_TOTAL]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_ACT_TOTAL));</span><br><span>      switch (lchan->type) {</span><br><span>    case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_SDCCH]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_ACT_SDCCH));</span><br><span>              break;</span><br><span>       case GSM_LCHAN_TCH_H:</span><br><span>        case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_TCH]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_ACT_TCH));</span><br><span>                break;</span><br><span>       default:</span><br><span>             break;</span><br><span>@@ -956,7 +956,7 @@</span><br><span>         struct gsm_lchan *lchan = msg->lchan;</span><br><span>     const uint8_t *cause_p;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_inc(&msg->lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_CHAN_ACT_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(msg->lchan->ts->trx->bts->bts_ctrs, BTS_CTR_CHAN_ACT_NACK));</span><br><span> </span><br><span>  if (dh->ie_chan != RSL_IE_CHAN_NR) {</span><br><span>              LOG_LCHAN(msg->lchan, LOGL_ERROR, "Invalid IE: expected CHAN_NR IE (0x%x), got 0x%x\n",</span><br><span>@@ -989,14 +989,14 @@</span><br><span> </span><br><span>     LOG_LCHAN(lchan, LOGL_ERROR, "CONNECTION FAIL%s\n", rsl_cause_name(&tp));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_CHAN_RF_FAIL]);</span><br><span style="color: hsl(120, 100%, 40%);">+    rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_CHAN_RF_FAIL));</span><br><span>        switch (lchan->type) {</span><br><span>    case GSM_LCHAN_SDCCH:</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_CHAN_RF_FAIL_SDCCH]);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_CHAN_RF_FAIL_SDCCH));</span><br><span>          break;</span><br><span>       case GSM_LCHAN_TCH_H:</span><br><span>        case GSM_LCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_CHAN_RF_FAIL_TCH]);</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_CHAN_RF_FAIL_TCH));</span><br><span>            break;</span><br><span>       default:</span><br><span>             break;</span><br><span>@@ -1278,7 +1278,7 @@</span><br><span>               break;</span><br><span>       case RSL_MT_MODE_MODIFY_NACK:</span><br><span>                LOG_LCHAN(msg->lchan, LOGL_DEBUG, "CHANNEL MODE MODIFY NACK\n");</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_MODE_MODIFY_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_MODE_MODIFY_NACK));</span><br><span>              osmo_fsm_inst_dispatch(msg->lchan->fi, LCHAN_EV_RSL_CHAN_MODE_MODIFY_NACK, NULL);</span><br><span>              break;</span><br><span>       case RSL_MT_IPAC_PDCH_ACT_ACK:</span><br><span>@@ -1303,12 +1303,12 @@</span><br><span>     case RSL_MT_MR_CODEC_MOD_PER:</span><br><span>                LOG_LCHAN(msg->lchan, LOGL_NOTICE, "Unimplemented Abis RSL DChan msg 0x%02x\n",</span><br><span>                           rslh->c.msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>           break;</span><br><span>       default:</span><br><span>             LOG_LCHAN(msg->lchan, LOGL_NOTICE, "Unknown Abis RSL DChan msg 0x%02x\n",</span><br><span>                         rslh->c.msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>@@ -1357,7 +1357,7 @@</span><br><span>        default:</span><br><span>             LOGP(DRSL, LOGL_NOTICE, "%s Unknown Abis RSL TRX message "</span><br><span>                         "type 0x%02x\n", gsm_trx_name(sign_link->trx), rslh->msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span>    return rc;</span><br><span>@@ -1537,7 +1537,7 @@</span><br><span>   if (rqd->ta > bts->rach_max_delay) {</span><br><span>                LOG_BTS(bts, DRSL, LOGL_INFO, "Ignoring CHAN RQD: Access Delay(%d) greater than %u\n",</span><br><span>                     rqd->ta, bts->rach_max_delay);</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_MAX_DELAY_EXCEEDED]);</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_MAX_DELAY_EXCEEDED));</span><br><span>            talloc_free(rqd);</span><br><span>            return -EINVAL;</span><br><span>      }</span><br><span>@@ -1547,28 +1547,28 @@</span><br><span>  LOG_BTS(bts, DRSL, LOGL_INFO, "CHAN RQD: reason: %s (ra=0x%02x, neci=0x%02x, chreq_reason=0x%02x)\n",</span><br><span>              get_value_string(gsm_chreq_descs, rqd->reason), rqd->ref.ra, bts->network->neci, rqd->reason);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_TOTAL]);</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_TOTAL));</span><br><span>         switch (rqd->reason) {</span><br><span>    case GSM_CHREQ_REASON_EMERG:</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_EMERG]);</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_EMERG));</span><br><span>               break;</span><br><span>       case GSM_CHREQ_REASON_CALL:</span><br><span style="color: hsl(0, 100%, 40%);">-             rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_CALL]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_CALL));</span><br><span>                break;</span><br><span>       case GSM_CHREQ_REASON_LOCATION_UPD:</span><br><span style="color: hsl(0, 100%, 40%);">-             rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_LOCATION_UPD]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_LOCATION_UPD));</span><br><span>                break;</span><br><span>       case GSM_CHREQ_REASON_PAG:</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_PAG]);</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_PAG));</span><br><span>                 break;</span><br><span>       case GSM_CHREQ_REASON_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-             rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_PDCH]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_PDCH));</span><br><span>                break;</span><br><span>       case GSM_CHREQ_REASON_OTHER:</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_OTHER]);</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_OTHER));</span><br><span>               break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_ATTEMPTED_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_ATTEMPTED_UNKNOWN));</span><br><span>             break;</span><br><span>       }</span><br><span> </span><br><span>@@ -1759,7 +1759,7 @@</span><br><span>        if (!lchan) {</span><br><span>                LOG_BTS(bts, DRSL, LOGL_NOTICE, "CHAN RQD: no resources for %s 0x%x\n",</span><br><span>                    gsm_lchant_name(lctype), rqd->ref.ra);</span><br><span style="color: hsl(0, 100%, 40%);">-               rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_NO_CHANNEL]);</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_NO_CHANNEL));</span><br><span>            rsl_tx_imm_ass_rej(bts, &rqd->ref);</span><br><span>           llist_del(&rqd->entry);</span><br><span>               talloc_free(rqd);</span><br><span>@@ -1821,7 +1821,7 @@</span><br><span>    rc = rsl_imm_assign_cmd(bts, sizeof(*ia)+ia->mob_alloc_len, (uint8_t *) ia);</span><br><span> </span><br><span>  if (!rc)</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_CHREQ_SUCCESSFUL]);</span><br><span style="color: hsl(120, 100%, 40%);">+                rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_SUCCESSFUL));</span><br><span> </span><br><span>        return rc;</span><br><span> }</span><br><span>@@ -1864,8 +1864,8 @@</span><br><span>                              busy_percent = 100;</span><br><span>                  }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_stat_item_set(sd.bts->bts_statg->items[BTS_STAT_RACH_BUSY], busy_percent);</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_stat_item_set(sd.bts->bts_statg->items[BTS_STAT_RACH_ACCESS], access_percent);</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_stat_item_set(osmo_stat_item_group_get_item(sd.bts->bts_statg, BTS_STAT_RACH_BUSY), busy_percent);</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_stat_item_set(osmo_stat_item_group_get_item(sd.bts->bts_statg, BTS_STAT_RACH_ACCESS), access_percent);</span><br><span>                       /* dispatch signal */</span><br><span>                        osmo_signal_dispatch(SS_CCCH, S_CCCH_RACH_LOAD, &sd);</span><br><span>            }</span><br><span>@@ -1952,7 +1952,7 @@</span><br><span>    case RSL_MT_DELETE_IND:</span><br><span>              /* CCCH overloaded, IMM_ASSIGN was dropped */</span><br><span>                LOGPLCHAN(msg->lchan, DRSL, LOGL_NOTICE, "DELETE INDICATION (Downlink CCCH overload)\n");</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_RSL_DELETE_IND]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_RSL_DELETE_IND));</span><br><span>              break;</span><br><span>       case RSL_MT_CBCH_LOAD_IND:</span><br><span>           /* current load on the CBCH */</span><br><span>@@ -1964,7 +1964,7 @@</span><br><span>       default:</span><br><span>             LOGP(DRSL, LOGL_NOTICE, "Unknown Abis RSL TRX message type "</span><br><span>                       "0x%02x\n", rslh->c.msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-             rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>                 return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>@@ -1988,7 +1988,7 @@</span><br><span> </span><br><span>    rll_indication(msg->lchan, rllh->link_id, BSC_RLLR_IND_ERR_IND);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      rate_ctr_inc(&msg->lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_CHAN_RLL_ERR]);</span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(rate_ctr_group_get_ctr(msg->lchan->ts->trx->bts->bts_ctrs, BTS_CTR_CHAN_RLL_ERR));</span><br><span> </span><br><span>   osmo_fsm_inst_dispatch(msg->lchan->fi, LCHAN_EV_RLL_ERR_IND, &rlm_cause);</span><br><span> </span><br><span>@@ -2089,7 +2089,7 @@</span><br><span>      default:</span><br><span>             LOG_LCHAN(msg->lchan, LOGL_NOTICE, "SAPI=%u Unknown Abis RLL message type 0x%02x\n",</span><br><span>                      sapi, rllh->c.msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>   }</span><br><span>    return rc;</span><br><span> }</span><br><span>@@ -2348,7 +2348,7 @@</span><br><span>      struct e1inp_sign_link *sign_link = msg->dst;</span><br><span>     struct gsm_lchan *lchan = msg->lchan;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_IPA_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+      rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_IPA_NACK));</span><br><span> </span><br><span>      if (!lchan->fi_rtp) {</span><br><span>             LOG_LCHAN(msg->lchan, LOGL_ERROR, "Rx RSL IPACC: CRCX NACK message for unconfigured lchan\n");</span><br><span>@@ -2386,7 +2386,7 @@</span><br><span>  struct e1inp_sign_link *sign_link = msg->dst;</span><br><span>     struct gsm_lchan *lchan = msg->lchan;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_IPA_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+      rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_IPA_NACK));</span><br><span> </span><br><span>      if (!lchan->fi_rtp) {</span><br><span>             LOG_LCHAN(msg->lchan, LOGL_ERROR, "Rx RSL IPACC: MDCX NACK message for unconfigured lchan\n");</span><br><span>@@ -2455,7 +2455,7 @@</span><br><span>  default:</span><br><span>             LOG_LCHAN(msg->lchan, LOGL_NOTICE, "Unknown ip.access msg_type 0x%02x\n",</span><br><span>                         rllh->c.msg_type);</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>           break;</span><br><span>       }</span><br><span> </span><br><span>@@ -2584,7 +2584,7 @@</span><br><span>        default:</span><br><span>             LOGP(DRSL, LOGL_NOTICE, "unknown RSL message discriminator "</span><br><span>                       "0x%02x\n", rslh->msg_discr);</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&sign_link->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(sign_link->trx->bts->bts_ctrs, BTS_CTR_RSL_UNKNOWN));</span><br><span>           rc = -EINVAL;</span><br><span>        }</span><br><span>    msgb_free(msg);</span><br><span>diff --git a/src/osmo-bsc/assignment_fsm.c b/src/osmo-bsc/assignment_fsm.c</span><br><span>index 0f38eec..6a9eb81 100644</span><br><span>--- a/src/osmo-bsc/assignment_fsm.c</span><br><span>+++ b/src/osmo-bsc/assignment_fsm.c</span><br><span>@@ -81,17 +81,17 @@</span><br><span>               LOG_ASSIGNMENT(conn, LOGL_DEBUG, "incrementing rate counter: %s %s\n", \</span><br><span>                          bsc_ctr_description[BSC_##counter].name, \</span><br><span>                           bsc_ctr_description[BSC_##counter].description); \</span><br><span style="color: hsl(0, 100%, 40%);">-               rate_ctr_inc(&conn->network->bsc_ctrs->ctr[BSC_##counter]); \</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(conn->network->bsc_ctrs, BSC_##counter)); \</span><br><span>                if (bts) { \</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_##counter]); \</span><br><span style="color: hsl(120, 100%, 40%);">+                 rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_##counter)); \</span><br><span>                     switch (gsm48_chan_mode_to_non_vamos(conn->assignment.req.ch_mode_rate_list[0].chan_mode)) { \</span><br><span>                    case GSM48_CMODE_SIGN: \</span><br><span style="color: hsl(0, 100%, 40%);">-                                rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_##counter##_SIGN]); \</span><br><span style="color: hsl(120, 100%, 40%);">+                          rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_##counter##_SIGN)); \</span><br><span>                              break; \</span><br><span>                     case GSM48_CMODE_SPEECH_V1: \</span><br><span>                        case GSM48_CMODE_SPEECH_EFR: \</span><br><span>                       case GSM48_CMODE_SPEECH_AMR: \</span><br><span style="color: hsl(0, 100%, 40%);">-                          rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_##counter##_SPEECH]); \</span><br><span style="color: hsl(120, 100%, 40%);">+                                rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_##counter##_SPEECH)); \</span><br><span>                            break; \</span><br><span>                     default: \</span><br><span>                           break; \</span><br><span>@@ -140,7 +140,7 @@</span><br><span>               if (!resp) {</span><br><span>                         LOG_ASSIGNMENT(conn, LOGL_ERROR, "Unable to compose BSSMAP Assignment Failure message\n");</span><br><span>                 } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE]);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE));</span><br><span>                       gscon_sigtran_send(conn, resp);</span><br><span>              }</span><br><span>    }</span><br><span>@@ -230,7 +230,7 @@</span><br><span>          conn->assignment.req.use_osmux)</span><br><span>               _gsm0808_ass_compl_extend_osmux(resp, osmux_cid);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_COMPLETE]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_COMPLETE));</span><br><span>      rc = gscon_sigtran_send(conn, resp);</span><br><span>         if (rc) {</span><br><span>            assignment_fail(GSM0808_CAUSE_EQUIPMENT_FAILURE,</span><br><span>diff --git a/src/osmo-bsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>index aa9d536..8b89e1a 100644</span><br><span>--- a/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>+++ b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>@@ -161,7 +161,7 @@</span><br><span>          return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_CLEAR_RQST));</span><br><span>      rc = osmo_bsc_sigtran_send(conn, resp);</span><br><span>      if (rc < 0)</span><br><span>               LOGPFSML(conn->fi, LOGL_ERROR, "Unable to deliver BSSMAP Clear Request message\n");</span><br><span>@@ -176,7 +176,7 @@</span><br><span>       OSMO_ASSERT(conn);</span><br><span> </span><br><span>       resp = gsm0808_create_dtap(msg, OBSC_LINKID_CB(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_DTAP]);</span><br><span style="color: hsl(120, 100%, 40%);">+        rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_DTAP));</span><br><span>    gscon_sigtran_send(conn, resp);</span><br><span> }</span><br><span> </span><br><span>@@ -843,7 +843,7 @@</span><br><span>               /* Close MGCP connections */</span><br><span>                 osmo_mgcpc_ep_clear(conn->user_plane.mgw_endpoint);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLEAR_COMPLETE]);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_CLEAR_COMPLETE));</span><br><span>          gscon_sigtran_send(conn, gsm0808_create_clear_complete());</span><br><span>           break;</span><br><span>       case GSCON_EV_A_DISC_IND:</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 6f4e2ec..5b1f503 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -536,16 +536,16 @@</span><br><span>       bts_dump_vty_cbch(vty, &bts->cbch_extended);</span><br><span> </span><br><span>      vty_out(vty, "  Channel Requests        : %"PRIu64" total, %"PRIu64" no channel%s",</span><br><span style="color: hsl(0, 100%, 40%);">-               bts->bts_ctrs->ctr[BTS_CTR_CHREQ_TOTAL].current,</span><br><span style="color: hsl(0, 100%, 40%);">-          bts->bts_ctrs->ctr[BTS_CTR_CHREQ_NO_CHANNEL].current,</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_TOTAL)->current,</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHREQ_NO_CHANNEL)->current,</span><br><span>              VTY_NEWLINE);</span><br><span>        vty_out(vty, "  Channel Failures        : %"PRIu64" rf_failures, %"PRIu64" rll failures%s",</span><br><span style="color: hsl(0, 100%, 40%);">-               bts->bts_ctrs->ctr[BTS_CTR_CHAN_RF_FAIL].current,</span><br><span style="color: hsl(0, 100%, 40%);">-         bts->bts_ctrs->ctr[BTS_CTR_CHAN_RLL_ERR].current,</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_RF_FAIL)->current,</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_CHAN_RLL_ERR)->current,</span><br><span>          VTY_NEWLINE);</span><br><span>        vty_out(vty, "  BTS failures            : %"PRIu64" OML, %"PRIu64" RSL%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                bts->bts_ctrs->ctr[BTS_CTR_BTS_OML_FAIL].current,</span><br><span style="color: hsl(0, 100%, 40%);">-         bts->bts_ctrs->ctr[BTS_CTR_BTS_RSL_FAIL].current,</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_BTS_OML_FAIL)->current,</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_BTS_RSL_FAIL)->current,</span><br><span>          VTY_NEWLINE);</span><br><span> </span><br><span>    vty_out_stat_item_group(vty, "  ", bts->bts_statg);</span><br><span>@@ -2318,7 +2318,7 @@</span><br><span>             /* allocate a new one */</span><br><span>             bts = bsc_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,</span><br><span>                                        HARDCODED_BSIC);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_inc(gsmnet->bsc_statg->items[BSC_STAT_NUM_BTS_TOTAL], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_stat_item_inc(osmo_stat_item_group_get_item(gsmnet->bsc_statg, BSC_STAT_NUM_BTS_TOTAL), 1);</span><br><span>  } else</span><br><span>               bts = gsm_bts_num(gsmnet, bts_nr);</span><br><span> </span><br><span>@@ -6390,7 +6390,7 @@</span><br><span>               }</span><br><span>    } else {</span><br><span>             if (lchan->fi->state == LCHAN_ST_BORKEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_VTY]);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(rate_ctr_group_get_ctr(lchan->ts->trx->bts->bts_ctrs, BTS_CTR_LCHAN_BORKEN_EV_VTY));</span><br><span>                        osmo_fsm_inst_state_chg(lchan->fi, LCHAN_ST_UNUSED, 0, 0);</span><br><span>                } else {</span><br><span>                     vty_out(vty,</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 857ddd2..bdaece7 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -558,7 +558,7 @@</span><br><span> </span><br><span> void bts_store_uptime(struct gsm_bts *bts)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_UPTIME_SECONDS], bts_uptime(bts));</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_UPTIME_SECONDS), bts_uptime(bts));</span><br><span> }</span><br><span> </span><br><span> unsigned long long bts_uptime(const struct gsm_bts *bts)</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 1e3e9c1..b97ae1c 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>@@ -531,7 +531,7 @@</span><br><span>  LOG_TRX(trx, DLINP, LOGL_NOTICE, "Dropping RSL link: %s\n", reason);</span><br><span>       e1inp_sign_link_destroy(trx->rsl_link_primary);</span><br><span>   trx->rsl_link_primary = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        osmo_stat_item_dec(trx->bts->bts_statg->items[BTS_STAT_RSL_CONNECTED], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_stat_item_dec(osmo_stat_item_group_get_item(trx->bts->bts_statg, BTS_STAT_RSL_CONNECTED), 1);</span><br><span> </span><br><span>         if (trx->bts->c0 == trx)</span><br><span>               paging_flush_bts(trx->bts, NULL);</span><br><span>@@ -555,7 +555,7 @@</span><br><span>   e1inp_sign_link_destroy(bts->oml_link);</span><br><span>   bts->oml_link = NULL;</span><br><span>     bts->uptime = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_OML_CONNECTED], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_OML_CONNECTED), 1);</span><br><span> </span><br><span>         /* we have issues reconnecting RSL, drop everything. */</span><br><span>      llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span>@@ -631,7 +631,7 @@</span><br><span>       /* Write to log and increase counter */</span><br><span>      LOGP(DLINP, LOGL_ERROR, "Unable to find BTS configuration for %u/%u/%u, disconnecting\n", site_id, bts_id,</span><br><span>                 trx_id);</span><br><span style="color: hsl(0, 100%, 40%);">-        rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_UNKNOWN_UNIT_ID]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_UNKNOWN_UNIT_ID));</span><br><span> </span><br><span>  /* Get remote IP */</span><br><span>  if (osmo_sock_get_remote_ip(ts->driver.ipaccess.fd.fd, ip, sizeof(ip)))</span><br><span>@@ -712,7 +712,7 @@</span><br><span>                                     sign_link->tei, sign_link->sapi);</span><br><span>                      sign_link->trx->bts->ip_access.flags |= OML_UP;</span><br><span>             }</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_stat_item_inc(bts->bts_statg->items[BTS_STAT_OML_CONNECTED], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_stat_item_inc(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_OML_CONNECTED), 1);</span><br><span>             break;</span><br><span>       case E1INP_SIGN_RSL: {</span><br><span>               struct e1inp_ts *ts;</span><br><span>@@ -740,7 +740,7 @@</span><br><span>                   sign_link->trx->bts->ip_access.flags |=</span><br><span>                                     (RSL_UP << sign_link->trx->nr);</span><br><span>          }</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_stat_item_inc(bts->bts_statg->items[BTS_STAT_RSL_CONNECTED], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_stat_item_inc(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_RSL_CONNECTED), 1);</span><br><span>             break;</span><br><span>       }</span><br><span>    default:</span><br><span>diff --git a/src/osmo-bsc/chan_alloc.c b/src/osmo-bsc/chan_alloc.c</span><br><span>index 402ca46..5915a93 100644</span><br><span>--- a/src/osmo-bsc/chan_alloc.c</span><br><span>+++ b/src/osmo-bsc/chan_alloc.c</span><br><span>@@ -121,36 +121,36 @@</span><br><span>    case GSM_PCHAN_UNKNOWN:</span><br><span>              break;</span><br><span>       case GSM_PCHAN_CCCH_SDCCH4:</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_CCCH_SDCCH4_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_CCCH_SDCCH4_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL), lc->total);</span><br><span>                 break;</span><br><span>       case GSM_PCHAN_TCH_F:</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_F_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_F_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_F_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_F_TOTAL), lc->total);</span><br><span>               break;</span><br><span>       case GSM_PCHAN_TCH_H:</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_H_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_H_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_H_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_H_TOTAL), lc->total);</span><br><span>               break;</span><br><span>       case GSM_PCHAN_SDCCH8_SACCH8C:</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_SDCCH8_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_SDCCH8_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_SDCCH8_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_SDCCH8_TOTAL), lc->total);</span><br><span>              break;</span><br><span>       case GSM_PCHAN_TCH_F_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_F_PDCH_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_F_PDCH_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_F_PDCH_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_F_PDCH_TOTAL), lc->total);</span><br><span>          break;</span><br><span>       case GSM_PCHAN_CCCH_SDCCH4_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL), lc->total);</span><br><span>            break;</span><br><span>       case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_SDCCH8_CBCH_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_SDCCH8_CBCH_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL), lc->total);</span><br><span>                 break;</span><br><span>       case GSM_PCHAN_TCH_F_TCH_H_PDCH:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED], lc->used);</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL], lc->total);</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED), lc->used);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL), lc->total);</span><br><span>            break;</span><br><span>       default:</span><br><span>             LOG_BTS(bts, DRLL, LOGL_NOTICE, "Unknown channel type %d\n", pchan);</span><br><span>@@ -232,7 +232,7 @@</span><br><span>                 (load & 0xffffff00) >> 8, (load & 0xff) / 10);</span><br><span>         bts->chan_load_avg = ((load & 0xffffff00) >> 8);</span><br><span>        OSMO_ASSERT(bts->chan_load_avg <= 100);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_CHAN_LOAD_AVERAGE], bts->chan_load_avg);</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_CHAN_LOAD_AVERAGE), bts->chan_load_avg);</span><br><span> </span><br><span>         /* Calculate new T3122 wait indicator. */</span><br><span>    wait_ind = ((used / total) * max_wait_ind);</span><br><span>@@ -244,5 +244,5 @@</span><br><span> </span><br><span>        LOG_BTS(bts, DRLL, LOGL_DEBUG, "T3122 wait indicator set to %"PRIu64" seconds\n", wait_ind);</span><br><span>     bts->T3122 = (uint8_t)wait_ind;</span><br><span style="color: hsl(0, 100%, 40%);">-      osmo_stat_item_set(bts->bts_statg->items[BTS_STAT_T3122], wait_ind);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_stat_item_set(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_T3122), wait_ind);</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 e943ec1..80ed874 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>@@ -77,7 +77,7 @@</span><br><span>        LOGP(DMSC, LOGL_NOTICE, "Tx MSC SAPI N REJECT (dlci=0x%02x, cause='%s')\n",</span><br><span>             dlci, gsm0808_cause_name(cause));</span><br><span>       resp = gsm0808_create_sapi_reject_cause(dlci, cause);</span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_SAPI_N_REJECT]);</span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_SAPI_N_REJECT));</span><br><span>   rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);</span><br><span>    if (rc != 0)</span><br><span>                 msgb_free(resp);</span><br><span>@@ -94,7 +94,7 @@</span><br><span> </span><br><span>     LOGP(DMSC, LOGL_DEBUG, "CIPHER MODE COMPLETE from MS, forwarding to MSC\n");</span><br><span>       resp = gsm0808_create_cipher_complete(msg, chosen_encr);</span><br><span style="color: hsl(0, 100%, 40%);">-        rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CIPHER_COMPLETE]);</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_CIPHER_COMPLETE));</span><br><span>         rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);</span><br><span>    if (rc != 0)</span><br><span>                 msgb_free(resp);</span><br><span>@@ -233,7 +233,7 @@</span><br><span>                       if (nri_matches_msc) {</span><br><span>                               LOG_NRI(LOGL_DEBUG, "matches msc %d, but this MSC is currently not connected\n",</span><br><span>                                   msc->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                            rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_MSCPOOL_SUBSCR_ATTACH_LOST]);</span><br><span style="color: hsl(120, 100%, 40%);">+                              rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_MSCPOOL_SUBSCR_ATTACH_LOST));</span><br><span>                  }</span><br><span>                    continue;</span><br><span>            }</span><br><span>@@ -245,10 +245,10 @@</span><br><span>                                    msc->nr);</span><br><span>                         } else {</span><br><span>                             LOG_NRI(LOGL_DEBUG, "matches msc %d\n", msc->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                          rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_MSCPOOL_SUBSCR_KNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+                            rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_MSCPOOL_SUBSCR_KNOWN));</span><br><span>                                if (is_emerg) {</span><br><span style="color: hsl(0, 100%, 40%);">-                                 rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_MSCPOOL_EMERG_FORWARDED]);</span><br><span style="color: hsl(0, 100%, 40%);">-                                   rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_MSCPOOL_EMERG_FORWARDED]);</span><br><span style="color: hsl(120, 100%, 40%);">+                                  rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_MSCPOOL_EMERG_FORWARDED));</span><br><span style="color: hsl(120, 100%, 40%);">+                                      rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_MSCPOOL_EMERG_FORWARDED));</span><br><span>                              }</span><br><span>                            return msc;</span><br><span>                  }</span><br><span>@@ -283,9 +283,9 @@</span><br><span>       * them are usable -- wrap to the start. */</span><br><span>  msc_target = msc_round_robin_next ? : msc_round_robin_first;</span><br><span>         if (!msc_target) {</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_MSCPOOL_SUBSCR_NO_MSC]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_MSCPOOL_SUBSCR_NO_MSC));</span><br><span>                if (is_emerg)</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_MSCPOOL_EMERG_LOST]);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_MSCPOOL_EMERG_LOST));</span><br><span>           return NULL;</span><br><span>         }</span><br><span> </span><br><span>@@ -293,13 +293,13 @@</span><br><span>             osmo_mobile_identity_to_str_c(OTC_SELECT, mi), msc_target->nr);</span><br><span> </span><br><span>  if (is_null_nri)</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&msc_target->msc_ctrs->ctr[MSC_CTR_MSCPOOL_SUBSCR_REATTACH]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(msc_target->msc_ctrs, MSC_CTR_MSCPOOL_SUBSCR_REATTACH));</span><br><span>      else</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&msc_target->msc_ctrs->ctr[MSC_CTR_MSCPOOL_SUBSCR_NEW]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(msc_target->msc_ctrs, MSC_CTR_MSCPOOL_SUBSCR_NEW));</span><br><span> </span><br><span>       if (is_emerg) {</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&msc_target->msc_ctrs->ctr[MSC_CTR_MSCPOOL_EMERG_FORWARDED]);</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_MSCPOOL_EMERG_FORWARDED]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(msc_target->msc_ctrs, MSC_CTR_MSCPOOL_EMERG_FORWARDED));</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_MSCPOOL_EMERG_FORWARDED));</span><br><span>      }</span><br><span> </span><br><span>        /* An MSC was picked by round-robin, so update the next round-robin nr to pick */</span><br><span>@@ -457,12 +457,12 @@</span><br><span>                                 "%s Unsolicited Paging Response, possibly an MT-CSFB call.\n",</span><br><span>                                     osmo_mobile_identity_to_str_c(OTC_SELECT, &mi));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_NO_ACTIVE_PAGING]);</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_PAGING_NO_ACTIVE_PAGING]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_NO_ACTIVE_PAGING));</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_PAGING_NO_ACTIVE_PAGING));</span><br><span>              } else if (is_msc_usable(paged_from_msc, is_emerg)) {</span><br><span>                        LOG_COMPL_L3(pdisc, mtype, LOGL_DEBUG, "%s matches earlier Paging from msc %d\n",</span><br><span>                               osmo_mobile_identity_to_str_c(OTC_SELECT, &mi), paged_from_msc->nr);</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&paged_from_msc->msc_ctrs->ctr[MSC_CTR_MSCPOOL_SUBSCR_PAGED]);</span><br><span style="color: hsl(120, 100%, 40%);">+                 rate_ctr_inc(rate_ctr_group_get_ctr(paged_from_msc->msc_ctrs, MSC_CTR_MSCPOOL_SUBSCR_PAGED));</span><br><span>             } else {</span><br><span>                     LOG_COMPL_L3(pdisc, mtype, LOGL_DEBUG,</span><br><span>                                    "%s matches earlier Paging from msc %d, but this MSC is not connected\n",</span><br><span>@@ -617,7 +617,7 @@</span><br><span>       if (!msc_connected(conn))</span><br><span>            return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CLASSMARK_UPDATE]);</span><br><span style="color: hsl(120, 100%, 40%);">+    rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_CLASSMARK_UPDATE));</span><br><span>        resp = gsm0808_create_classmark_update(cm2, cm2_len, cm3, cm3_len);</span><br><span>  rc = osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);</span><br><span>    if (rc != 0)</span><br><span>diff --git a/src/osmo-bsc/handover_fsm.c b/src/osmo-bsc/handover_fsm.c</span><br><span>index ec70be3..8141a5d 100644</span><br><span>--- a/src/osmo-bsc/handover_fsm.c</span><br><span>+++ b/src/osmo-bsc/handover_fsm.c</span><br><span>@@ -88,7 +88,7 @@</span><br><span>            LOG_HO(conn, LOGL_DEBUG, "(BSC) incrementing rate counter: %s %s\n", \</span><br><span>                    bsc_ctr_description[counter].name, \</span><br><span>                 bsc_ctr_description[counter].description); \</span><br><span style="color: hsl(0, 100%, 40%);">-             rate_ctr_inc(&conn->network->bsc_ctrs->ctr[counter]); \</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(conn->network->bsc_ctrs, counter)); \</span><br><span>      } while(0)</span><br><span> </span><br><span> /* Assume presence of local var 'conn' as struct gsm_subscriber_connection.</span><br><span>@@ -102,9 +102,9 @@</span><br><span>                 bts_ctr_description[counter].name, \</span><br><span>                 bts_ctr_description[counter].description); \</span><br><span>          if (bts) \</span><br><span style="color: hsl(0, 100%, 40%);">-                      rate_ctr_inc(&bts->bts_ctrs->ctr[counter]); \</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, counter)); \</span><br><span>           else \</span><br><span style="color: hsl(0, 100%, 40%);">-                  rate_ctr_inc(&conn->network->bts_unknown_ctrs->ctr[counter]); \</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(conn->network->bts_unknown_ctrs, counter)); \</span><br><span>      } while(0)</span><br><span> </span><br><span> #define ho_count(bts, counter) do { \</span><br><span>@@ -881,7 +881,7 @@</span><br><span>                return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_PERFORMED]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_HANDOVER_PERFORMED));</span><br><span>      rc = gscon_sigtran_send(conn, msg);</span><br><span>  if (rc < 0) {</span><br><span>             LOG_HO(conn, LOGL_ERROR, "message sending failed, can't send HANDOVER PERFORMED!\n");</span><br><span>diff --git a/src/osmo-bsc/lb.c b/src/osmo-bsc/lb.c</span><br><span>index e23de93..7c35fa2 100644</span><br><span>--- a/src/osmo-bsc/lb.c</span><br><span>+++ b/src/osmo-bsc/lb.c</span><br><span>@@ -68,7 +68,7 @@</span><br><span>     LOGP(DRESET, LOGL_INFO, "Sending RESET to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr));</span><br><span>  msg = osmo_bssap_le_enc(&reset);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_UDT_RESET]);</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_UDT_RESET));</span><br><span>         return osmo_sccp_tx_unitdata_msg(bsc_gsmnet->smlc->sccp_user, &bsc_gsmnet->smlc->bsc_addr,</span><br><span>                                    &bsc_gsmnet->smlc->smlc_addr, msg);</span><br><span> }</span><br><span>@@ -90,7 +90,7 @@</span><br><span>      LOGP(DRESET, LOGL_NOTICE, "Sending RESET ACK to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr));</span><br><span>    msg = osmo_bssap_le_enc(&reset_ack);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_UDT_RESET_ACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_UDT_RESET_ACK));</span><br><span>     return osmo_sccp_tx_unitdata_msg(bsc_gsmnet->smlc->sccp_user, &bsc_gsmnet->smlc->bsc_addr,</span><br><span>                                    &bsc_gsmnet->smlc->smlc_addr, msg);</span><br><span> }</span><br><span>@@ -101,7 +101,7 @@</span><br><span>    struct osmo_ss7_instance *ss7;</span><br><span>       struct bssap_le_pdu bssap_le;</span><br><span>        struct osmo_bssap_le_err *err;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct rate_ctr *ctr = bsc_gsmnet->smlc->ctrs->ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct rate_ctr_group *ctrg = bsc_gsmnet->smlc->ctrs;</span><br><span> </span><br><span>      ss7 = osmo_sccp_get_ss7(osmo_sccp_get_sccp(scu));</span><br><span>    OSMO_ASSERT(ss7);</span><br><span>@@ -109,13 +109,13 @@</span><br><span>    if (osmo_sccp_addr_cmp(smlc_addr, &bsc_gsmnet->smlc->smlc_addr, OSMO_SCCP_ADDR_T_MASK)) {</span><br><span>          LOGP(DLCS, LOGL_ERROR, "Rx BSSMAP-LE UnitData from unknown remote address: %s\n",</span><br><span>               osmo_sccp_addr_name(ss7, smlc_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UNKNOWN_PEER]);</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UNKNOWN_PEER));</span><br><span>              return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>        if (osmo_bssap_le_dec(&bssap_le, &err, msg, msg)) {</span><br><span>          LOGP(DLCS, LOGL_ERROR, "Rx BSSAP-LE UnitData with error: %s\n", err->logmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG));</span><br><span>               return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>@@ -126,17 +126,17 @@</span><br><span> </span><br><span>    switch (bssap_le.bssmap_le.msg_type) {</span><br><span>       case BSSMAP_LE_MSGT_RESET:</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_RESET]);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_RESET));</span><br><span>                 LOGP(DLCS, LOGL_NOTICE, "RESET from SMLC: %s\n", osmo_sccp_addr_name(ss7, smlc_addr));</span><br><span>             return osmo_fsm_inst_dispatch(bsc_gsmnet->smlc->bssmap_reset->fi, BSSMAP_RESET_EV_RX_RESET, NULL);</span><br><span> </span><br><span>      case BSSMAP_LE_MSGT_RESET_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK));</span><br><span>             LOGP(DLCS, LOGL_NOTICE, "RESET-ACK from SMLC: %s\n", osmo_sccp_addr_name(ss7, smlc_addr));</span><br><span>                 return osmo_fsm_inst_dispatch(bsc_gsmnet->smlc->bssmap_reset->fi, BSSMAP_RESET_EV_RX_RESET_ACK, NULL);</span><br><span> </span><br><span>  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG));</span><br><span>               LOGP(DLCS, LOGL_ERROR, "Rx unimplemented UDT message type %s\n",</span><br><span>                osmo_bssap_le_pdu_to_str_c(OTC_SELECT, &bssap_le));</span><br><span>                 return -EINVAL;</span><br><span>@@ -255,9 +255,9 @@</span><br><span>        rc = osmo_sccp_tx_conn_req_msg(bsc_gsmnet->smlc->sccp_user, conn_id, &bsc_gsmnet->smlc->bsc_addr,</span><br><span>                                   &bsc_gsmnet->smlc->smlc_addr, msg);</span><br><span>         if (rc >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_SUCCESS]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_SUCCESS));</span><br><span>   else</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_ERR_SEND]);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_ERR_SEND));</span><br><span>  if (rc >= 0)</span><br><span>              conn->lcs.lb.state = SUBSCR_SCCP_ST_WAIT_CONN_CONF;</span><br><span> </span><br><span>@@ -304,9 +304,9 @@</span><br><span>     LOGPFSMSL(conn->fi, DLCS, LOGL_DEBUG, "Tx %s\n", osmo_bssap_le_pdu_to_str_c(OTC_SELECT, bssap_le));</span><br><span>     rc = osmo_sccp_tx_data_msg(bsc_gsmnet->smlc->sccp_user, conn->lcs.lb.conn_id, msg);</span><br><span>         if (rc >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_SUCCESS]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_SUCCESS));</span><br><span>   else</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_ERR_SEND]);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_ERR_SEND));</span><br><span> </span><br><span> count_tx:</span><br><span>         if (rc < 0)</span><br><span>@@ -314,24 +314,24 @@</span><br><span> </span><br><span>   switch (bssap_le->bssmap_le.msg_type) {</span><br><span>   case BSSMAP_LE_MSGT_PERFORM_LOC_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_REQUEST]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_REQUEST));</span><br><span>              break;</span><br><span>       case BSSMAP_LE_MSGT_PERFORM_LOC_ABORT:</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_ABORT]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_PERFORM_LOCATION_ABORT));</span><br><span>                break;</span><br><span>       case BSSMAP_LE_MSGT_CONN_ORIENTED_INFO:</span><br><span>              switch (bssap_le->bssmap_le.conn_oriented_info.apdu.msg_type) {</span><br><span>           case BSSLAP_MSGT_TA_RESPONSE:</span><br><span style="color: hsl(0, 100%, 40%);">-                   rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_TA_RESPONSE]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_TA_RESPONSE));</span><br><span>                    break;</span><br><span>               case BSSLAP_MSGT_REJECT:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_REJECT]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_REJECT));</span><br><span>                         break;</span><br><span>               case BSSLAP_MSGT_RESET:</span><br><span style="color: hsl(0, 100%, 40%);">-                 rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_RESET]);</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_RESET));</span><br><span>                  break;</span><br><span>               case BSSLAP_MSGT_ABORT:</span><br><span style="color: hsl(0, 100%, 40%);">-                 rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_ABORT]);</span><br><span style="color: hsl(120, 100%, 40%);">+                      rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_TX_DT1_BSSLAP_ABORT));</span><br><span>                  break;</span><br><span>               default:</span><br><span>                     break;</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index a29ddae..48cfbdf 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -1323,9 +1323,9 @@</span><br><span>  default:</span><br><span>             ctr = BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN;</span><br><span>     }</span><br><span style="color: hsl(0, 100%, 40%);">-       rate_ctr_inc(&bts->bts_ctrs->ctr[ctr]);</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, ctr));</span><br><span>         if (prev_state != LCHAN_ST_BORKEN)</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_stat_item_inc(bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_inc(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_LCHAN_BORKEN), 1);</span><br><span> </span><br><span>  /* The actual action besides all the beancounting above */</span><br><span>   lchan_reset(lchan);</span><br><span>@@ -1339,8 +1339,8 @@</span><br><span> </span><br><span>      case LCHAN_EV_RSL_CHAN_ACTIV_ACK:</span><br><span>            /* A late Chan Activ ACK? Release. */</span><br><span style="color: hsl(0, 100%, 40%);">-           rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK]);</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK));</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_LCHAN_BORKEN), 1);</span><br><span>              lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span>            lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>@@ -1349,15 +1349,15 @@</span><br><span> </span><br><span>     case LCHAN_EV_RSL_CHAN_ACTIV_NACK:</span><br><span>           /* A late Chan Activ NACK? Ok then, unused. */</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK]);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK));</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_LCHAN_BORKEN), 1);</span><br><span>              lchan_fsm_state_chg(LCHAN_ST_UNUSED);</span><br><span>                return;</span><br><span> </span><br><span>  case LCHAN_EV_RSL_RF_CHAN_REL_ACK:</span><br><span>           /* A late Release ACK? */</span><br><span style="color: hsl(0, 100%, 40%);">-               rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK]);</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK));</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_LCHAN_BORKEN), 1);</span><br><span>              lchan->release.in_error = true;</span><br><span>           lchan->release.rsl_error_cause = RSL_ERR_INTERWORKING;</span><br><span>            lchan->release.rr_cause = bsc_gsm48_rr_cause_from_rsl_cause(lchan->release.rsl_error_cause);</span><br><span>@@ -1603,8 +1603,8 @@</span><br><span>   {</span><br><span>            struct gsm_lchan *lchan = lchan_fi_lchan(fi);</span><br><span>                if (fi->state == LCHAN_ST_BORKEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_TS_ERROR]);</span><br><span style="color: hsl(0, 100%, 40%);">-                 osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rate_ctr_inc(rate_ctr_group_get_ctr(lchan->ts->trx->bts->bts_ctrs, BTS_CTR_LCHAN_BORKEN_EV_TS_ERROR));</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_stat_item_dec(osmo_stat_item_group_get_item(lchan->ts->trx->bts->bts_statg, BTS_STAT_LCHAN_BORKEN), 1);</span><br><span>             }</span><br><span>            lchan_fail_to(LCHAN_ST_UNUSED, "LCHAN_EV_TS_ERROR");</span><br><span>               return;</span><br><span>@@ -1713,8 +1713,8 @@</span><br><span> {</span><br><span>         struct gsm_lchan *lchan = lchan_fi_lchan(fi);</span><br><span>        if (lchan->fi->state == LCHAN_ST_BORKEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&lchan->ts->trx->bts->bts_ctrs->ctr[BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN]);</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_stat_item_dec(lchan->ts->trx->bts->bts_statg->items[BTS_STAT_LCHAN_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+           rate_ctr_inc(rate_ctr_group_get_ctr(lchan->ts->trx->bts->bts_ctrs, BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN));</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_stat_item_dec(osmo_stat_item_group_get_item(lchan->ts->trx->bts->bts_statg, BTS_STAT_LCHAN_BORKEN), 1);</span><br><span>     }</span><br><span>    lchan_reset(lchan);</span><br><span>  if (lchan->last_error) {</span><br><span>diff --git a/src/osmo-bsc/lcs_loc_req.c b/src/osmo-bsc/lcs_loc_req.c</span><br><span>index ee85c91..1a68316 100644</span><br><span>--- a/src/osmo-bsc/lcs_loc_req.c</span><br><span>+++ b/src/osmo-bsc/lcs_loc_req.c</span><br><span>@@ -190,7 +190,7 @@</span><br><span> {</span><br><span>  switch (bssmap_le->conn_oriented_info.apdu.msg_type) {</span><br><span>    case BSSLAP_MSGT_TA_REQUEST:</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_RX_DT1_BSSLAP_TA_REQUEST]);</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->smlc->ctrs, SMLC_CTR_BSSMAP_LE_RX_DT1_BSSLAP_TA_REQUEST));</span><br><span>             LOG_LCS_LOC_REQ(lcs_loc_req, LOGL_DEBUG, "rx BSSLAP TA Request\n");</span><br><span>                /* The TA Request message contains only the message type. */</span><br><span>                 return lcs_ta_req_start(lcs_loc_req);</span><br><span>@@ -206,7 +206,7 @@</span><br><span>  struct lcs_loc_req *lcs_loc_req = conn->lcs.loc_req;</span><br><span>      struct bssap_le_pdu bssap_le;</span><br><span>        struct osmo_bssap_le_err *err;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct rate_ctr *ctr = bsc_gsmnet->smlc->ctrs->ctr;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct rate_ctr_group *ctrg = bsc_gsmnet->smlc->ctrs;</span><br><span> </span><br><span>      if (!lcs_loc_req) {</span><br><span>          LOGPFSMSL(conn->fi, DLCS, LOGL_ERROR,</span><br><span>@@ -216,13 +216,13 @@</span><br><span> </span><br><span>         if (osmo_bssap_le_dec(&bssap_le, &err, msg, msg)) {</span><br><span>          LOG_LCS_LOC_REQ(lcs_loc_req, LOGL_ERROR, "Rx BSSAP-LE message with error: %s\n", err->logmsg);</span><br><span style="color: hsl(0, 100%, 40%);">-             rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_DT1_ERR_INVALID_MSG]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_DT1_ERR_INVALID_MSG));</span><br><span>               return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span>        if (bssap_le.discr != BSSAP_LE_MSG_DISCR_BSSMAP_LE) {</span><br><span>                LOG_LCS_LOC_REQ(lcs_loc_req, LOGL_ERROR, "Rx BSSAP-LE: discr %d not implemented\n", bssap_le.discr);</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_DT1_ERR_INVALID_MSG]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_DT1_ERR_INVALID_MSG));</span><br><span>               return -ENOTSUP;</span><br><span>     }</span><br><span> </span><br><span>@@ -231,9 +231,9 @@</span><br><span>  switch (bssap_le.bssmap_le.msg_type) {</span><br><span>       case BSSMAP_LE_MSGT_PERFORM_LOC_RESP:</span><br><span>                if (bssap_le.bssmap_le.perform_loc_resp.location_estimate_present)</span><br><span style="color: hsl(0, 100%, 40%);">-                      rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_DT1_PERFORM_LOCATION_RESPONSE_SUCCESS]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_DT1_PERFORM_LOCATION_RESPONSE_SUCCESS));</span><br><span>             else</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(ctrg, SMLC_CTR_BSSMAP_LE_RX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE));</span><br><span>             return osmo_fsm_inst_dispatch(lcs_loc_req->fi, LCS_LOC_REQ_EV_RX_LB_PERFORM_LOCATION_RESPONSE,</span><br><span>                                          &bssap_le.bssmap_le);</span><br><span> </span><br><span>@@ -457,9 +457,7 @@</span><br><span>                    LOG_LCS_LOC_REQ(lcs_loc_req, LOGL_ERROR,</span><br><span>                                     "Failed to send Perform Location Response (A-interface)\n");</span><br><span>               else</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&lcs_loc_req->conn->sccp.msc->msc_ctrs->ctr[</span><br><span style="color: hsl(0, 100%, 40%);">-                               plr.location_estimate_present ? MSC_CTR_BSSMAP_TX_DT1_PERFORM_LOCATION_RESPONSE_SUCCESS</span><br><span style="color: hsl(0, 100%, 40%);">-                         : MSC_CTR_BSSMAP_TX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(lcs_loc_req->conn->sccp.msc->msc_ctrs, plr.location_estimate_present ? MSC_CTR_BSSMAP_TX_DT1_PERFORM_LOCATION_RESPONSE_SUCCESS : MSC_CTR_BSSMAP_TX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE));</span><br><span>     }</span><br><span>    osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REGULAR, NULL);</span><br><span> }</span><br><span>@@ -498,7 +496,7 @@</span><br><span>                      LOG_LCS_LOC_REQ(lcs_loc_req, LOGL_ERROR,</span><br><span>                                     "Failed to send BSSMAP Perform Location Response (A-interface)\n");</span><br><span>                else</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&lcs_loc_req->conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE]);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rate_ctr_inc(rate_ctr_group_get_ctr(lcs_loc_req->conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_PERFORM_LOCATION_RESPONSE_FAILURE));</span><br><span>       }</span><br><span>    osmo_fsm_inst_term(fi, OSMO_FSM_TERM_REGULAR, NULL);</span><br><span> }</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 239c2ca..d6048bf 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>@@ -343,7 +343,7 @@</span><br><span> </span><br><span> int bsc_paging_start(struct bsc_paging_params *params)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_inc(&bsc_gsmnet->bsc_ctrs->ctr[BSC_CTR_PAGING_ATTEMPTED]);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(rate_ctr_group_get_ctr(bsc_gsmnet->bsc_ctrs, BSC_CTR_PAGING_ATTEMPTED));</span><br><span> </span><br><span>         if (!params->bsub) {</span><br><span>              params->bsub = bsc_subscr_find_or_create_by_imsi(bsc_gsmnet->bsc_subscribers, params->imsi.imsi,</span><br><span>@@ -569,7 +569,7 @@</span><br><span>              return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_CIPHER_REJECT]);</span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_CIPHER_REJECT));</span><br><span>   osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);</span><br><span>         return -1;</span><br><span> }</span><br><span>@@ -650,7 +650,7 @@</span><br><span>        LOGPFSM(conn->fi, "Tx LCLS CONNECT CTRL ACK (%s)\n",</span><br><span>            gsm0808_lcls_status_name(lcls_get_status(conn)));</span><br><span>    resp = gsm0808_create_lcls_conn_ctrl_ack(lcls_get_status(conn));</span><br><span style="color: hsl(0, 100%, 40%);">-        rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_LCLS_CONNECT_CTRL_ACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_LCLS_CONNECT_CTRL_ACK));</span><br><span>   osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);</span><br><span> </span><br><span>     return 0;</span><br><span>@@ -973,7 +973,7 @@</span><br><span>      resp = gsm0808_create_assignment_failure(cause, NULL);</span><br><span>       OSMO_ASSERT(resp);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE]);</span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_ASSIGMENT_FAILURE));</span><br><span>       osmo_fsm_inst_dispatch(conn->fi, GSCON_EV_TX_SCCP, resp);</span><br><span>         return -1;</span><br><span> }</span><br><span>@@ -1396,7 +1396,7 @@</span><br><span>              return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_REQUIRED]);</span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_HANDOVER_REQUIRED));</span><br><span>       rc = gscon_sigtran_send(conn, msg);</span><br><span>  if (rc) {</span><br><span>            LOG_HO(conn, LOGL_ERROR, "Cannot send BSSMAP Handover Required message\n");</span><br><span>@@ -1443,7 +1443,7 @@</span><br><span>                params.aoip_transport_layer = &ss;</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_RQST_ACKNOWLEDGE]);</span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_HANDOVER_RQST_ACKNOWLEDGE));</span><br><span>       LOG_HO(conn, LOGL_DEBUG, "Sending BSSMAP Handover Request Acknowledge\n");</span><br><span>         msg = gsm0808_create_handover_request_ack2(&params);</span><br><span>     msgb_free(rr_ho_command);</span><br><span>@@ -1459,7 +1459,7 @@</span><br><span>    if (!msg)</span><br><span>            return -ENOMEM;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_DETECT]);</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_HANDOVER_DETECT));</span><br><span>         return osmo_bsc_sigtran_send(conn, msg);</span><br><span> }</span><br><span> </span><br><span>@@ -1499,7 +1499,7 @@</span><br><span>            return HO_RESULT_ERROR;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_COMPLETE]);</span><br><span style="color: hsl(120, 100%, 40%);">+   rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_HANDOVER_COMPLETE));</span><br><span>       rc = osmo_bsc_sigtran_send(conn, msg);</span><br><span>       if (rc) {</span><br><span>            LOG_HO(conn, LOGL_ERROR, "Cannot send BSSMAP Handover Complete message\n");</span><br><span>@@ -1521,7 +1521,7 @@</span><br><span>                return;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_inc(&conn->sccp.msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DT1_HANDOVER_FAILURE]);</span><br><span style="color: hsl(120, 100%, 40%);">+    rate_ctr_inc(rate_ctr_group_get_ctr(conn->sccp.msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DT1_HANDOVER_FAILURE));</span><br><span>        rc = osmo_bsc_sigtran_send(conn, msg);</span><br><span>       if (rc)</span><br><span>              LOG_HO(conn, LOGL_ERROR, "Cannot send BSSMAP Handover Failure message (rc=%d %s)\n",</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_filter.c b/src/osmo-bsc/osmo_bsc_filter.c</span><br><span>index 19cdeee..2b58ccf 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_filter.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_filter.c</span><br><span>@@ -123,16 +123,16 @@</span><br><span>          struct rate_ctr_group *bts_ctrs = conn->lchan->ts->trx->bts->bts_ctrs;</span><br><span>                switch (mtype) {</span><br><span>             case GSM48_MT_MM_LOC_UPD_ACCEPT:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_LOCATION_UPDATE_ACCEPT]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_LOCATION_UPDATE_ACCEPT));</span><br><span>                      break;</span><br><span>               case GSM48_MT_MM_LOC_UPD_REJECT:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_LOCATION_UPDATE_REJECT]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_LOCATION_UPDATE_REJECT));</span><br><span>                      break;</span><br><span>               case GSM48_MT_MM_IMSI_DETACH_IND:</span><br><span style="color: hsl(0, 100%, 40%);">-                       rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_LOCATION_UPDATE_DETACH]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_LOCATION_UPDATE_DETACH));</span><br><span>                      break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_LOCATION_UPDATE_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+                 rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_LOCATION_UPDATE_UNKNOWN));</span><br><span>                     break;</span><br><span>               }</span><br><span>    }</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 3069cc0..14475ff 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>@@ -405,10 +405,10 @@</span><br><span>               LOG_TRX(trx, DLMI, LOGL_ERROR, "Lost E1 %s link\n", e1inp_signtype_name(isd->link_type));</span><br><span> </span><br><span>           if (isd->link_type == E1INP_SIGN_OML) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_OML_FAIL]);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(rate_ctr_group_get_ctr(trx->bts->bts_ctrs, BTS_CTR_BTS_OML_FAIL));</span><br><span>                        all_ts_dispatch_event(trx, TS_EV_OML_DOWN);</span><br><span>          } else if (isd->link_type == E1INP_SIGN_RSL) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_RSL_FAIL]);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(rate_ctr_group_get_ctr(trx->bts->bts_ctrs, BTS_CTR_BTS_RSL_FAIL));</span><br><span>                        acc_ramp_abort(&trx->bts->acc_ramp);</span><br><span>                       all_ts_dispatch_event(trx, TS_EV_RSL_DOWN);</span><br><span>                  if (trx->nr == 0)</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_sigtran.c b/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>index 2cb7694..d3c636d 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_sigtran.c</span><br><span>@@ -94,7 +94,7 @@</span><br><span>    if (msc_is_aoip(msc) && msc->use_osmux != OSMUX_USAGE_OFF)</span><br><span>                _gsm0808_extend_announce_osmux(msg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_UDT_RESET]);</span><br><span style="color: hsl(120, 100%, 40%);">+     rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_UDT_RESET));</span><br><span>         osmo_sccp_tx_unitdata_msg(msc->a.sccp_user, &msc->a.bsc_addr,</span><br><span>                                &msc->a.msc_addr, msg);</span><br><span> }</span><br><span>@@ -114,7 +114,7 @@</span><br><span>  if (msc_is_aoip(msc) && msc->use_osmux != OSMUX_USAGE_OFF)</span><br><span>                _gsm0808_extend_announce_osmux(msg);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_UDT_RESET_ACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_UDT_RESET_ACK));</span><br><span>     osmo_sccp_tx_unitdata_msg(msc->a.sccp_user, &msc->a.bsc_addr,</span><br><span>                                &msc->a.msc_addr, msg);</span><br><span> }</span><br><span>@@ -374,26 +374,26 @@</span><br><span>        if (msg->len >= 3) {</span><br><span>           switch (msg->data[0]) {</span><br><span>           case BSSAP_MSG_BSS_MANAGEMENT:</span><br><span style="color: hsl(0, 100%, 40%);">-                  rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_BSS_MANAGEMENT]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_BSS_MANAGEMENT));</span><br><span>                    LOGP(DMSC, LOGL_INFO, "Tx MSC: BSSMAP: %s\n",</span><br><span>                           gsm0808_bssmap_name(msg->data[2]));</span><br><span>                  break;</span><br><span>               case BSSAP_MSG_DTAP:</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_DTAP]);</span><br><span style="color: hsl(120, 100%, 40%);">+                  rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_DTAP));</span><br><span>                      LOGP(DMSC, LOGL_INFO, "Tx MSC: DTAP\n");</span><br><span>                   break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_UNKNOWN]);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_UNKNOWN));</span><br><span>                   LOGP(DMSC, LOGL_ERROR, "Tx MSC: unknown message type: 0x%x\n",</span><br><span>                          msg->data[0]);</span><br><span>               }</span><br><span>    } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_SHORT]);</span><br><span style="color: hsl(120, 100%, 40%);">+         rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_SHORT));</span><br><span>             LOGP(DMSC, LOGL_ERROR, "Tx MSC: message too short: %u\n", msg->len);</span><br><span>    }</span><br><span> </span><br><span>        if (a_reset_conn_ready(msc) == false) {</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_ERR_CONN_NOT_READY]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_ERR_CONN_NOT_READY));</span><br><span>                LOGP(DMSC, LOGL_ERROR, "MSC is not connected. Dropping.\n");</span><br><span>               msgb_free(msg);</span><br><span>              return -EINVAL;</span><br><span>@@ -408,9 +408,9 @@</span><br><span> </span><br><span>    rc = osmo_sccp_tx_data_msg(msc->a.sccp_user, conn_id, msg);</span><br><span>       if (rc >= 0)</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_SUCCESS]);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_SUCCESS));</span><br><span>   else</span><br><span style="color: hsl(0, 100%, 40%);">-            rate_ctr_inc(&msc->msc_ctrs->ctr[MSC_CTR_BSSMAP_TX_ERR_SEND]);</span><br><span style="color: hsl(120, 100%, 40%);">+              rate_ctr_inc(rate_ctr_group_get_ctr(msc->msc_ctrs, MSC_CTR_BSSMAP_TX_ERR_SEND));</span><br><span> </span><br><span>      return rc;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/paging.c b/src/osmo-bsc/paging.c</span><br><span>index 15aca00..d2dd5ea 100644</span><br><span>--- a/src/osmo-bsc/paging.c</span><br><span>+++ b/src/osmo-bsc/paging.c</span><br><span>@@ -281,7 +281,7 @@</span><br><span>            req, bsc_subscr_name(req->bsub));</span><br><span> </span><br><span>        /* must be destroyed before calling cbfn, to prevent double free */</span><br><span style="color: hsl(0, 100%, 40%);">-     rate_ctr_inc(&req->bts->bts_ctrs->ctr[BTS_CTR_PAGING_EXPIRED]);</span><br><span style="color: hsl(120, 100%, 40%);">+  rate_ctr_inc(rate_ctr_group_get_ctr(req->bts->bts_ctrs, BTS_CTR_PAGING_EXPIRED));</span><br><span> </span><br><span>  /* destroy it now. Do not access req afterwards */</span><br><span>   paging_remove_request(&req->bts->paging, req);</span><br><span>@@ -331,11 +331,11 @@</span><br><span>     struct gsm_paging_request *req;</span><br><span>      unsigned int t3113_timeout_s;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ATTEMPTED]);</span><br><span style="color: hsl(120, 100%, 40%);">+        rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_ATTEMPTED));</span><br><span> </span><br><span>        if (paging_pending_request(bts_entry, params->bsub)) {</span><br><span>            LOG_PAGING_BTS(params, bts, DPAG, LOGL_INFO, "Paging request already pending for this subscriber\n");</span><br><span style="color: hsl(0, 100%, 40%);">-         rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_ALREADY]);</span><br><span style="color: hsl(120, 100%, 40%);">+          rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_ALREADY));</span><br><span>              return -EEXIST;</span><br><span>      }</span><br><span> </span><br><span>@@ -432,8 +432,8 @@</span><br><span>  count = paging_request_stop_bts(&paged_from_msc, &reasons, bts, bsub);</span><br><span>       if (paged_from_msc) {</span><br><span>                count++;</span><br><span style="color: hsl(0, 100%, 40%);">-                rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_RESPONDED]);</span><br><span style="color: hsl(0, 100%, 40%);">-          rate_ctr_inc(&bts->network->bsc_ctrs->ctr[BSC_CTR_PAGING_RESPONDED]);</span><br><span style="color: hsl(120, 100%, 40%);">+            rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_RESPONDED));</span><br><span style="color: hsl(120, 100%, 40%);">+             rate_ctr_inc(rate_ctr_group_get_ctr(bts->network->bsc_ctrs, BSC_CTR_PAGING_RESPONDED));</span><br><span>        }</span><br><span> </span><br><span>        llist_for_each_entry(bts_i, &bsc_gsmnet->bts_list, list) {</span><br><span>@@ -522,7 +522,7 @@</span><br><span>              num_cancelled++;</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   rate_ctr_add(&bts->bts_ctrs->ctr[BTS_CTR_PAGING_MSC_FLUSH], num_cancelled);</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_add(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_PAGING_MSC_FLUSH), num_cancelled);</span><br><span> }</span><br><span> </span><br><span> /*! Flush all paging requests issued by \a msc on any BTS in \a net */</span><br><span>diff --git a/src/osmo-bsc/timeslot_fsm.c b/src/osmo-bsc/timeslot_fsm.c</span><br><span>index 001319e..0470972 100644</span><br><span>--- a/src/osmo-bsc/timeslot_fsm.c</span><br><span>+++ b/src/osmo-bsc/timeslot_fsm.c</span><br><span>@@ -383,9 +383,9 @@</span><br><span> </span><br><span>       case TS_EV_PDCH_ACT_NACK:</span><br><span>            if (ts->pchan_on_init == GSM_PCHAN_TCH_F_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                       rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_RSL_IPA_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                    rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_RSL_IPA_NACK));</span><br><span>                else</span><br><span style="color: hsl(0, 100%, 40%);">-                    rate_ctr_inc(&bts_ctrs->ctr[BTS_CTR_CHAN_ACT_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rate_ctr_inc(rate_ctr_group_get_ctr(bts_ctrs, BTS_CTR_CHAN_ACT_NACK));</span><br><span>               ts->pdch_act_allowed = false;</span><br><span>             ts_fsm_error(fi, TS_ST_UNUSED, "Received PDCH activation NACK");</span><br><span>           return;</span><br><span>@@ -520,7 +520,7 @@</span><br><span> </span><br><span>    case TS_EV_PDCH_DEACT_NACK:</span><br><span>          if (ts->pchan_on_init == GSM_PCHAN_TCH_F_PDCH)</span><br><span style="color: hsl(0, 100%, 40%);">-                       rate_ctr_inc(&ts->trx->bts->bts_ctrs->ctr[BTS_CTR_RSL_IPA_NACK]);</span><br><span style="color: hsl(120, 100%, 40%);">+                     rate_ctr_inc(rate_ctr_group_get_ctr(ts->trx->bts->bts_ctrs, BTS_CTR_RSL_IPA_NACK));</span><br><span>                 /* For Osmocom style dyn TS, there actually is no NACK, since there is no RF Channel</span><br><span>                  * Release NACK message in RSL. */</span><br><span>           ts_fsm_error(fi, TS_ST_BORKEN, "Received PDCH deactivation NACK");</span><br><span>@@ -695,8 +695,8 @@</span><br><span>   default:</span><br><span>             ctr = BTS_CTR_TS_BORKEN_FROM_UNKNOWN;</span><br><span>        }</span><br><span style="color: hsl(0, 100%, 40%);">-       rate_ctr_inc(&bts->bts_ctrs->ctr[ctr]);</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_stat_item_inc(bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+       rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, ctr));</span><br><span style="color: hsl(120, 100%, 40%);">+  osmo_stat_item_inc(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_TS_BORKEN), 1);</span><br><span> }</span><br><span> </span><br><span> static void ts_fsm_borken(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>@@ -720,8 +720,8 @@</span><br><span>                       struct gsm_bts *bts = ts->trx->bts;</span><br><span>                    /* Late PDCH activation ACK/NACK is not a crime.</span><br><span>                      * Just process them as normal. */</span><br><span style="color: hsl(0, 100%, 40%);">-                      rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK]);</span><br><span style="color: hsl(0, 100%, 40%);">-                    osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK));</span><br><span style="color: hsl(120, 100%, 40%);">+                       osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_TS_BORKEN), 1);</span><br><span>                         ts_fsm_wait_pdch_act(fi, event, data);</span><br><span>                       return;</span><br><span>              }</span><br><span>@@ -733,8 +733,8 @@</span><br><span>                      struct gsm_bts *bts = ts->trx->bts;</span><br><span>                    /* Late PDCH deactivation ACK/NACK is also not a crime.</span><br><span>                       * Just process them as normal. */</span><br><span style="color: hsl(0, 100%, 40%);">-                      rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+                       rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK));</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_TS_BORKEN), 1);</span><br><span>                         ts_fsm_wait_pdch_deact(fi, event, data);</span><br><span>                     return;</span><br><span>              }</span><br><span>@@ -796,8 +796,8 @@</span><br><span>      struct gsm_bts_trx_ts *ts = ts_fi_ts(fi);</span><br><span>    struct gsm_bts *bts = ts->trx->bts;</span><br><span>    if (ts->fi->state == TS_ST_BORKEN) {</span><br><span style="color: hsl(0, 100%, 40%);">-              rate_ctr_inc(&bts->bts_ctrs->ctr[BTS_CTR_TS_BORKEN_EV_TEARDOWN]);</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_stat_item_dec(bts->bts_statg->items[BTS_STAT_TS_BORKEN], 1);</span><br><span style="color: hsl(120, 100%, 40%);">+               rate_ctr_inc(rate_ctr_group_get_ctr(bts->bts_ctrs, BTS_CTR_TS_BORKEN_EV_TEARDOWN));</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_stat_item_dec(osmo_stat_item_group_get_item(bts->bts_statg, BTS_STAT_TS_BORKEN), 1);</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24551">change 24551</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/+/24551"/><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: I0b43f922a595d694ac0aeda80107ef9bf4e755e7 </div>
<div style="display:none"> Gerrit-Change-Number: 24551 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>