Hello Jenkins Builder,

I'd like you to reexamine a change.  Please visit

    https://gerrit.osmocom.org/4413

to look at the new patch set (#4).

Move all rate counter related code together

Change-Id: I795631752af3b9077a846c3123217e1deda52e86
Related: OS#1538
---
M src/bts.cpp
M src/bts.h
M src/gprs_rlcmac_sched.cpp
M src/gprs_rlcmac_ts_alloc.cpp
M src/llc.cpp
M src/pcu_ctr.h
M src/rlc.cpp
M src/sba.cpp
M src/tbf.cpp
M src/tbf_dl.cpp
M src/tbf_ul.cpp
11 files changed, 300 insertions(+), 288 deletions(-)


  git pull ssh://gerrit.osmocom.org:29418/osmo-pcu refs/changes/13/4413/4

diff --git a/src/bts.cpp b/src/bts.cpp
index 0f7462a..16d9dba 100644
--- a/src/bts.cpp
+++ b/src/bts.cpp
@@ -30,6 +30,7 @@
 #include <gprs_debug.h>
 
 extern "C" {
+       #include "pcu_ctr.h"
        #include <osmocom/core/talloc.h>
        #include <osmocom/core/msgb.h>
        #include <osmocom/core/stats.h>
@@ -161,7 +162,7 @@
                LOGP(DRLCMAC, LOGL_NOTICE,
                        "Late RLC block, FN delta: %d FN: %d curFN: %d\n",
                        delay, fn, current_frame_number());
-               rlc_late_block();
+               rlc_late_block(bts_data()->ctrs);
        }
 
        m_cur_blk_fn = fn;
@@ -506,10 +507,10 @@
        uint16_t priority = 0;
        bool failure = false;
 
-       rach_frame();
+       rach_frame(bts_data()->ctrs);
 
        if (is_11bit)
-               rach_frame_11bit();
+               rach_frame_11bit(bts_data()->ctrs);
 
        /* Determine full frame number */
        Fn = rfn_to_fn(Fn);
@@ -590,7 +591,7 @@
                plen = Encoding::write_immediate_assignment_reject(
                        immediate_assignment, ra, Fn,
                        burst_type);
-               immediate_assignment_reject();
+               immediate_assignment_reject(bts_data()->ctrs);
        }
        else {
                LOGP(DRLCMAC, LOGL_DEBUG,
@@ -605,7 +606,7 @@
        }
 
        if (plen >= 0) {
-               immediate_assignment_ul_tbf();
+               immediate_assignment_ul_tbf(bts_data()->ctrs);
                pcu_l1if_tx_agch(immediate_assignment, plen);
        }
 
@@ -699,7 +700,7 @@
                tbf->trx->arfcn, ts, tbf->tsc(), 7, poll,
                tbf->poll_fn, m_bts.alpha, m_bts.gamma, -1);
        if (plen >= 0) {
-               immediate_assignment_dl_tbf();
+               immediate_assignment_dl_tbf(bts_data()->ctrs);
                pcu_l1if_tx_pch(immediate_assignment, plen, imsi);
        }
 
@@ -1026,7 +1027,7 @@
 
 static inline void sched_ul_ass_or_rej(BTS *bts, gprs_rlcmac_bts *bts_data, 
struct gprs_rlcmac_dl_tbf *tbf)
 {
-       bts->channel_request_description();
+       channel_request_description(bts->bts_data()->ctrs);
 
        /* This call will register the new TBF with the MS on success */
        gprs_rlcmac_ul_tbf *ul_tbf = tbf_alloc_ul(bts_data, tbf->trx->trx_no, 
tbf->ms_class(),
@@ -1356,7 +1357,7 @@
        else
                bts()->send_gsmtap(PCU_GSMTAP_C_UL_CTRL, true, trx_no(), ts_no, 
GSMTAP_CHANNEL_PACCH, fn, data, data_len);
 
-       bts()->rlc_rcvd_control();
+       rlc_rcvd_control(bts_data()->ctrs);
        switch (ul_control_block->u.MESSAGE_TYPE) {
        case MT_PACKET_CONTROL_ACK:
                
rcv_control_ack(&ul_control_block->u.Packet_Control_Acknowledgement, fn);
@@ -1377,7 +1378,7 @@
                /* ignoring it. change the SI to not force sending these? */
                break;
        default:
-               bts()->decode_error();
+               decode_error(bts_data()->ctrs);
                LOGP(DRLCMAC, LOGL_NOTICE,
                        "RX: [PCU <- BTS] unknown control block(%d) received\n",
                        ul_control_block->u.MESSAGE_TYPE);
@@ -1393,13 +1394,13 @@
 {
        GprsCodingScheme cs = GprsCodingScheme::getBySizeUL(len);
        if (!cs) {
-               bts()->decode_error();
+               decode_error(bts_data()->ctrs);
                LOGP(DRLCMACUL, LOGL_ERROR, "Dropping data block with invalid"
                        "length: %d)\n", len);
                return -EINVAL;
        }
 
-       bts()->rlc_ul_bytes(len);
+       rlc_ul_bytes(bts_data()->ctrs, len);
 
        LOGP(DRLCMACUL, LOGL_DEBUG, "Got RLC block, coding scheme: %s, "
                "length: %d (%d))\n", cs.name(), len, cs.usedSizeUL());
@@ -1410,7 +1411,7 @@
        if (cs.isEgprs())
                return rcv_data_block(data, len, fn, meas, cs);
 
-       bts()->decode_error();
+       decode_error(bts_data()->ctrs);
        LOGP(DRLCMACUL, LOGL_ERROR, "Unsupported coding scheme %s\n",
                cs.name());
        return -EINVAL;
@@ -1447,7 +1448,7 @@
                LOGP(DRLCMACUL, LOGL_ERROR,
                        "Got %s RLC block but header parsing has failed\n",
                        cs.name());
-               bts()->decode_error();
+               decode_error(bts_data()->ctrs);
                return rc;
        }
 
diff --git a/src/bts.h b/src/bts.h
index 19d948a..d20f633 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -390,95 +390,6 @@
                              uint8_t ts_no, uint8_t channel, uint32_t fn,
                              const uint8_t *data, unsigned int len);
 
-       /*
-        * Statistics
-        */
-       void tbf_dl_created();
-       void tbf_dl_freed();
-       void tbf_dl_aborted();
-       void tbf_ul_created();
-       void tbf_ul_freed();
-       void tbf_ul_aborted();
-       void tbf_reused();
-       void tbf_alloc_algo_a();
-       void tbf_alloc_algo_b();
-       void tbf_failed_egprs_only();
-       void rlc_sent();
-       void rlc_resent();
-       void rlc_restarted();
-       void rlc_stalled();
-       void rlc_nacked();
-       void rlc_final_block_resent();
-       void rlc_ass_timedout();
-       void rlc_ass_failed();
-       void rlc_ack_timedout();
-       void rlc_ack_failed();
-       void rlc_rel_timedout();
-       void rlc_late_block();
-       void rlc_sent_dummy();
-       void rlc_sent_control();
-       void rlc_dl_bytes(int bytes);
-       void rlc_dl_payload_bytes(int bytes);
-       void rlc_ul_bytes(int bytes);
-       void rlc_ul_payload_bytes(int bytes);
-       void decode_error();
-       void sba_allocated();
-       void sba_freed();
-       void sba_timedout();
-       void llc_timedout_frame();
-       void llc_dropped_frame();
-       void llc_frame_sched();
-       void llc_dl_bytes(int bytes);
-       void llc_ul_bytes(int bytes);
-       void rach_frame();
-       void rach_frame_11bit();
-       void spb_uplink_first_segment();
-       void spb_uplink_second_segment();
-       void spb_downlink_first_segment();
-       void spb_downlink_second_segment();
-       void immediate_assignment_ul_tbf();
-       void immediate_assignment_reject();
-       void immediate_assignment_dl_tbf();
-       void channel_request_description();
-       void pkt_ul_assignment();
-       void pkt_access_reject();
-       void pkt_dl_assignemnt();
-       void rlc_rcvd_control();
-       void pua_poll_timedout();
-       void pua_poll_failed();
-       void pda_poll_timedout();
-       void pda_poll_failed();
-       void pkt_ul_ack_nack_poll_timedout();
-       void pkt_ul_ack_nack_poll_failed();
-       void pkt_dl_ack_nack_poll_timedout();
-       void pkt_dl_ack_nack_poll_failed();
-       void gprs_dl_cs1();
-       void gprs_dl_cs2();
-       void gprs_dl_cs3();
-       void gprs_dl_cs4();
-       void egprs_dl_mcs1();
-       void egprs_dl_mcs2();
-       void egprs_dl_mcs3();
-       void egprs_dl_mcs4();
-       void egprs_dl_mcs5();
-       void egprs_dl_mcs6();
-       void egprs_dl_mcs7();
-       void egprs_dl_mcs8();
-       void egprs_dl_mcs9();
-       void gprs_ul_cs1();
-       void gprs_ul_cs2();
-       void gprs_ul_cs3();
-       void gprs_ul_cs4();
-       void egprs_ul_mcs1();
-       void egprs_ul_mcs2();
-       void egprs_ul_mcs3();
-       void egprs_ul_mcs4();
-       void egprs_ul_mcs5();
-       void egprs_ul_mcs6();
-       void egprs_ul_mcs7();
-       void egprs_ul_mcs8();
-       void egprs_ul_mcs9();
-
        void ms_present(int32_t n);
        int32_t ms_present_get();
 
@@ -575,106 +486,6 @@
 {
        return m_statg;
 }
-
-#define CREATE_COUNT_ADD_INLINE(func_name, ctr_name) \
-       inline void BTS::func_name(int inc) {\
-               OSMO_ASSERT(m_bts.ctrs); \
-               rate_ctr_add(&m_bts.ctrs->ctr[ctr_name], inc); \
-       }
-
-#define CREATE_COUNT_INLINE(func_name, ctr_name) \
-       inline void BTS::func_name() {\
-               OSMO_ASSERT(m_bts.ctrs); \
-               rate_ctr_inc(&m_bts.ctrs->ctr[ctr_name]); \
-       }
-
-CREATE_COUNT_INLINE(tbf_dl_created, CTR_TBF_DL_ALLOCATED)
-CREATE_COUNT_INLINE(tbf_dl_freed, CTR_TBF_DL_FREED)
-CREATE_COUNT_INLINE(tbf_dl_aborted, CTR_TBF_DL_ABORTED)
-CREATE_COUNT_INLINE(tbf_ul_created, CTR_TBF_UL_ALLOCATED)
-CREATE_COUNT_INLINE(tbf_ul_freed, CTR_TBF_UL_FREED)
-CREATE_COUNT_INLINE(tbf_ul_aborted, CTR_TBF_UL_ABORTED)
-CREATE_COUNT_INLINE(tbf_reused, CTR_TBF_REUSED)
-CREATE_COUNT_INLINE(tbf_alloc_algo_a, CTR_TBF_ALLOC_ALGO_A)
-CREATE_COUNT_INLINE(tbf_alloc_algo_b, CTR_TBF_ALLOC_ALGO_B)
-CREATE_COUNT_INLINE(tbf_failed_egprs_only, CTR_TBF_FAILED_EGPRS_ONLY)
-CREATE_COUNT_INLINE(rlc_sent, CTR_RLC_SENT)
-CREATE_COUNT_INLINE(rlc_resent, CTR_RLC_RESENT)
-CREATE_COUNT_INLINE(rlc_restarted, CTR_RLC_RESTARTED)
-CREATE_COUNT_INLINE(rlc_stalled, CTR_RLC_STALLED)
-CREATE_COUNT_INLINE(rlc_nacked, CTR_RLC_NACKED)
-CREATE_COUNT_INLINE(rlc_final_block_resent, CTR_RLC_FINAL_BLOCK_RESENT);
-CREATE_COUNT_INLINE(rlc_ass_timedout, CTR_RLC_ASS_TIMEDOUT);
-CREATE_COUNT_INLINE(rlc_ass_failed, CTR_RLC_ASS_FAILED);
-CREATE_COUNT_INLINE(rlc_ack_timedout, CTR_RLC_ACK_TIMEDOUT);
-CREATE_COUNT_INLINE(rlc_ack_failed, CTR_RLC_ACK_FAILED);
-CREATE_COUNT_INLINE(rlc_rel_timedout, CTR_RLC_REL_TIMEDOUT);
-CREATE_COUNT_INLINE(rlc_late_block, CTR_RLC_LATE_BLOCK);
-CREATE_COUNT_INLINE(rlc_sent_dummy, CTR_RLC_SENT_DUMMY);
-CREATE_COUNT_INLINE(rlc_sent_control, CTR_RLC_SENT_CONTROL);
-CREATE_COUNT_ADD_INLINE(rlc_dl_bytes, CTR_RLC_DL_BYTES);
-CREATE_COUNT_ADD_INLINE(rlc_dl_payload_bytes, CTR_RLC_DL_PAYLOAD_BYTES);
-CREATE_COUNT_ADD_INLINE(rlc_ul_bytes, CTR_RLC_UL_BYTES);
-CREATE_COUNT_ADD_INLINE(rlc_ul_payload_bytes, CTR_RLC_UL_PAYLOAD_BYTES);
-CREATE_COUNT_INLINE(decode_error, CTR_DECODE_ERRORS)
-CREATE_COUNT_INLINE(sba_allocated, CTR_SBA_ALLOCATED)
-CREATE_COUNT_INLINE(sba_freed, CTR_SBA_FREED)
-CREATE_COUNT_INLINE(sba_timedout, CTR_SBA_TIMEDOUT)
-CREATE_COUNT_INLINE(llc_timedout_frame, CTR_LLC_FRAME_TIMEDOUT);
-CREATE_COUNT_INLINE(llc_dropped_frame, CTR_LLC_FRAME_DROPPED);
-CREATE_COUNT_INLINE(llc_frame_sched, CTR_LLC_FRAME_SCHED);
-CREATE_COUNT_ADD_INLINE(llc_dl_bytes, CTR_LLC_DL_BYTES);
-CREATE_COUNT_ADD_INLINE(llc_ul_bytes, CTR_LLC_UL_BYTES);
-CREATE_COUNT_INLINE(rach_frame, CTR_RACH_REQUESTS);
-CREATE_COUNT_INLINE(rach_frame_11bit, CTR_11BIT_RACH_REQUESTS);
-CREATE_COUNT_INLINE(spb_uplink_first_segment, CTR_SPB_UL_FIRST_SEGMENT);
-CREATE_COUNT_INLINE(spb_uplink_second_segment, CTR_SPB_UL_SECOND_SEGMENT);
-CREATE_COUNT_INLINE(spb_downlink_first_segment, CTR_SPB_DL_FIRST_SEGMENT);
-CREATE_COUNT_INLINE(spb_downlink_second_segment, CTR_SPB_DL_SECOND_SEGMENT);
-CREATE_COUNT_INLINE(immediate_assignment_ul_tbf, CTR_IMMEDIATE_ASSIGN_UL_TBF);
-CREATE_COUNT_INLINE(immediate_assignment_reject, CTR_IMMEDIATE_ASSIGN_REJ);
-CREATE_COUNT_INLINE(immediate_assignment_dl_tbf, CTR_IMMEDIATE_ASSIGN_DL_TBF);
-CREATE_COUNT_INLINE(channel_request_description, 
CTR_CHANNEL_REQUEST_DESCRIPTION);
-CREATE_COUNT_INLINE(pkt_ul_assignment, CTR_PKT_UL_ASSIGNMENT);
-CREATE_COUNT_INLINE(pkt_access_reject, CTR_PKT_ACCESS_REJ);
-CREATE_COUNT_INLINE(pkt_dl_assignemnt, CTR_PKT_DL_ASSIGNMENT);
-CREATE_COUNT_INLINE(rlc_rcvd_control, CTR_RLC_RECV_CONTROL);
-CREATE_COUNT_INLINE(pua_poll_timedout, CTR_PUA_POLL_TIMEDOUT);
-CREATE_COUNT_INLINE(pua_poll_failed, CTR_PUA_POLL_FAILED);
-CREATE_COUNT_INLINE(pda_poll_timedout, CTR_PDA_POLL_TIMEDOUT);
-CREATE_COUNT_INLINE(pda_poll_failed, CTR_PDA_POLL_FAILED);
-CREATE_COUNT_INLINE(pkt_ul_ack_nack_poll_timedout, CTR_PUAN_POLL_TIMEDOUT);
-CREATE_COUNT_INLINE(pkt_ul_ack_nack_poll_failed, CTR_PUAN_POLL_FAILED);
-CREATE_COUNT_INLINE(pkt_dl_ack_nack_poll_timedout, CTR_PDAN_POLL_TIMEDOUT);
-CREATE_COUNT_INLINE(pkt_dl_ack_nack_poll_failed, CTR_PDAN_POLL_FAILED);
-CREATE_COUNT_INLINE(gprs_dl_cs1, CTR_GPRS_DL_CS1);
-CREATE_COUNT_INLINE(gprs_dl_cs2, CTR_GPRS_DL_CS2);
-CREATE_COUNT_INLINE(gprs_dl_cs3, CTR_GPRS_DL_CS3);
-CREATE_COUNT_INLINE(gprs_dl_cs4, CTR_GPRS_DL_CS4);
-CREATE_COUNT_INLINE(egprs_dl_mcs1, CTR_EGPRS_DL_MCS1);
-CREATE_COUNT_INLINE(egprs_dl_mcs2, CTR_EGPRS_DL_MCS2);
-CREATE_COUNT_INLINE(egprs_dl_mcs3, CTR_EGPRS_DL_MCS3);
-CREATE_COUNT_INLINE(egprs_dl_mcs4, CTR_EGPRS_DL_MCS4);
-CREATE_COUNT_INLINE(egprs_dl_mcs5, CTR_EGPRS_DL_MCS5);
-CREATE_COUNT_INLINE(egprs_dl_mcs6, CTR_EGPRS_DL_MCS6);
-CREATE_COUNT_INLINE(egprs_dl_mcs7, CTR_EGPRS_DL_MCS7);
-CREATE_COUNT_INLINE(egprs_dl_mcs8, CTR_EGPRS_DL_MCS8);
-CREATE_COUNT_INLINE(egprs_dl_mcs9, CTR_EGPRS_DL_MCS9);
-CREATE_COUNT_INLINE(gprs_ul_cs1, CTR_GPRS_UL_CS1);
-CREATE_COUNT_INLINE(gprs_ul_cs2, CTR_GPRS_UL_CS2);
-CREATE_COUNT_INLINE(gprs_ul_cs3, CTR_GPRS_UL_CS3);
-CREATE_COUNT_INLINE(gprs_ul_cs4, CTR_GPRS_UL_CS4);
-CREATE_COUNT_INLINE(egprs_ul_mcs1, CTR_EGPRS_UL_MCS1);
-CREATE_COUNT_INLINE(egprs_ul_mcs2, CTR_EGPRS_UL_MCS2);
-CREATE_COUNT_INLINE(egprs_ul_mcs3, CTR_EGPRS_UL_MCS3);
-CREATE_COUNT_INLINE(egprs_ul_mcs4, CTR_EGPRS_UL_MCS4);
-CREATE_COUNT_INLINE(egprs_ul_mcs5, CTR_EGPRS_UL_MCS5);
-CREATE_COUNT_INLINE(egprs_ul_mcs6, CTR_EGPRS_UL_MCS6);
-CREATE_COUNT_INLINE(egprs_ul_mcs7, CTR_EGPRS_UL_MCS7);
-CREATE_COUNT_INLINE(egprs_ul_mcs8, CTR_EGPRS_UL_MCS8);
-CREATE_COUNT_INLINE(egprs_ul_mcs9, CTR_EGPRS_UL_MCS9);
-
-#undef CREATE_COUNT_INLINE
 
 #define CREATE_STAT_INLINE(func_name, func_name_get, stat_name) \
        inline void BTS::func_name(int32_t val) {\
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index 2350808..838d6b2 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -25,6 +25,10 @@
 
 #include "pcu_utils.h"
 
+extern "C" {
+#include "pcu_ctr.h"
+}
+
 static uint32_t sched_poll(BTS *bts,
                    uint8_t trx, uint8_t ts, uint32_t fn, uint8_t block_nr,
                    struct gprs_rlcmac_tbf **poll_tbf,
@@ -316,18 +320,18 @@
 
        switch(cat) {
        case PCU_GSMTAP_C_DL_CTRL:
-               bts->bts->rlc_sent_control();
+               rlc_sent_control(bts->bts->bts_data()->ctrs);
                bts->bts->send_gsmtap(PCU_GSMTAP_C_DL_CTRL, false, trx, ts, 
GSMTAP_CHANNEL_PACCH, fn, msg->data,
                                      msg->len);
                break;
        case PCU_GSMTAP_C_DL_DATA_GPRS:
-               bts->bts->rlc_sent();
+               rlc_sent(bts->bts->bts_data()->ctrs);
                /* FIXME: distinguish between GPRS and EGPRS */
                bts->bts->send_gsmtap(PCU_GSMTAP_C_DL_DATA_GPRS, false, trx, 
ts, GSMTAP_CHANNEL_PDTCH, fn, msg->data,
                                      msg->len);
                break;
        case PCU_GSMTAP_C_DL_DUMMY:
-               bts->bts->rlc_sent_dummy();
+               rlc_sent_dummy(bts->bts->bts_data()->ctrs);
                bts->bts->send_gsmtap(PCU_GSMTAP_C_DL_DUMMY, false, trx, ts, 
GSMTAP_CHANNEL_PACCH, fn, msg->data,
                                      msg->len);
                break;
@@ -403,7 +407,7 @@
        if (!msg)
                return -ENOMEM;
        /* msg is now available */
-       bts->bts->rlc_dl_bytes(msg->data_len);
+       rlc_dl_bytes(bts->bts->bts_data()->ctrs, msg->data_len);
 
        /* set USF */
        OSMO_ASSERT(msgb_length(msg) > 0);
diff --git a/src/gprs_rlcmac_ts_alloc.cpp b/src/gprs_rlcmac_ts_alloc.cpp
index 2b08cf6..e657f3a 100644
--- a/src/gprs_rlcmac_ts_alloc.cpp
+++ b/src/gprs_rlcmac_ts_alloc.cpp
@@ -29,6 +29,10 @@
 #include <errno.h>
 #include <values.h>
 
+extern "C" {
+#include "pcu_ctr.h"
+}
+
 /* Consider a PDCH as idle if has at most this number of TBFs assigned to it */
 #define PDCH_IDLE_TBF_THRESH   1
 
@@ -485,7 +489,7 @@
        ms_->set_reserved_slots(trx, 1 << ts, 1 << ts);
 
        tbf_->upgrade_to_multislot = 0;
-       bts->bts->tbf_alloc_algo_a();
+       tbf_alloc_algo_a(bts->bts->bts_data()->ctrs);
        return 0;
 }
 
@@ -1021,7 +1025,7 @@
                }
        }
 
-       bts->bts->tbf_alloc_algo_b();
+       tbf_alloc_algo_b(bts->bts->bts_data()->ctrs);
 
        return 0;
 }
diff --git a/src/llc.cpp b/src/llc.cpp
index 79afc37..182fdfc 100644
--- a/src/llc.cpp
+++ b/src/llc.cpp
@@ -25,6 +25,7 @@
 #include <stdio.h>
 
 extern "C" {
+#include "pcu_ctr.h"
 #include <osmocom/core/msgb.h>
 }
 
@@ -126,7 +127,7 @@
 
        while ((msg = msgb_dequeue(&m_queue))) {
                if (bts)
-                       bts->llc_dropped_frame();
+                       llc_dropped_frame(bts->bts_data()->ctrs);
                msgb_free(msg);
        }
 
diff --git a/src/pcu_ctr.h b/src/pcu_ctr.h
index 8cfada4..0baa543 100644
--- a/src/pcu_ctr.h
+++ b/src/pcu_ctr.h
@@ -29,6 +29,94 @@
 #include <stddef.h>
 #include <stdbool.h>
 
+enum {
+       CTR_TBF_DL_ALLOCATED,
+       CTR_TBF_DL_FREED,
+       CTR_TBF_DL_ABORTED,
+       CTR_TBF_UL_ALLOCATED,
+       CTR_TBF_UL_FREED,
+       CTR_TBF_UL_ABORTED,
+       CTR_TBF_REUSED,
+       CTR_TBF_ALLOC_ALGO_A,
+       CTR_TBF_ALLOC_ALGO_B,
+       CTR_TBF_FAILED_EGPRS_ONLY,
+       CTR_RLC_SENT,
+       CTR_RLC_RESENT,
+       CTR_RLC_RESTARTED,
+       CTR_RLC_STALLED,
+       CTR_RLC_NACKED,
+       CTR_RLC_FINAL_BLOCK_RESENT,
+       CTR_RLC_ASS_TIMEDOUT,
+       CTR_RLC_ASS_FAILED,
+       CTR_RLC_ACK_TIMEDOUT,
+       CTR_RLC_ACK_FAILED,
+       CTR_RLC_REL_TIMEDOUT,
+       CTR_RLC_LATE_BLOCK,
+       CTR_RLC_SENT_DUMMY,
+       CTR_RLC_SENT_CONTROL,
+       CTR_RLC_DL_BYTES,
+       CTR_RLC_DL_PAYLOAD_BYTES,
+       CTR_RLC_UL_BYTES,
+       CTR_RLC_UL_PAYLOAD_BYTES,
+       CTR_DECODE_ERRORS,
+       CTR_SBA_ALLOCATED,
+       CTR_SBA_FREED,
+       CTR_SBA_TIMEDOUT,
+       CTR_LLC_FRAME_TIMEDOUT,
+       CTR_LLC_FRAME_DROPPED,
+       CTR_LLC_FRAME_SCHED,
+       CTR_LLC_DL_BYTES,
+       CTR_LLC_UL_BYTES,
+       CTR_RACH_REQUESTS,
+       CTR_11BIT_RACH_REQUESTS,
+       CTR_SPB_UL_FIRST_SEGMENT,
+       CTR_SPB_UL_SECOND_SEGMENT,
+       CTR_SPB_DL_FIRST_SEGMENT,
+       CTR_SPB_DL_SECOND_SEGMENT,
+       CTR_IMMEDIATE_ASSIGN_UL_TBF,
+       CTR_IMMEDIATE_ASSIGN_REJ,
+       CTR_IMMEDIATE_ASSIGN_DL_TBF,
+       CTR_CHANNEL_REQUEST_DESCRIPTION,
+       CTR_PKT_UL_ASSIGNMENT,
+       CTR_PKT_ACCESS_REJ,
+       CTR_PKT_DL_ASSIGNMENT,
+       CTR_RLC_RECV_CONTROL,
+       CTR_PUA_POLL_TIMEDOUT,
+       CTR_PUA_POLL_FAILED,
+       CTR_PDA_POLL_TIMEDOUT,
+       CTR_PDA_POLL_FAILED,
+       CTR_PUAN_POLL_TIMEDOUT,
+       CTR_PUAN_POLL_FAILED,
+       CTR_PDAN_POLL_TIMEDOUT,
+       CTR_PDAN_POLL_FAILED,
+       CTR_GPRS_DL_CS1,
+       CTR_GPRS_DL_CS2,
+       CTR_GPRS_DL_CS3,
+       CTR_GPRS_DL_CS4,
+       CTR_EGPRS_DL_MCS1,
+       CTR_EGPRS_DL_MCS2,
+       CTR_EGPRS_DL_MCS3,
+       CTR_EGPRS_DL_MCS4,
+       CTR_EGPRS_DL_MCS5,
+       CTR_EGPRS_DL_MCS6,
+       CTR_EGPRS_DL_MCS7,
+       CTR_EGPRS_DL_MCS8,
+       CTR_EGPRS_DL_MCS9,
+       CTR_GPRS_UL_CS1,
+       CTR_GPRS_UL_CS2,
+       CTR_GPRS_UL_CS3,
+       CTR_GPRS_UL_CS4,
+       CTR_EGPRS_UL_MCS1,
+       CTR_EGPRS_UL_MCS2,
+       CTR_EGPRS_UL_MCS3,
+       CTR_EGPRS_UL_MCS4,
+       CTR_EGPRS_UL_MCS5,
+       CTR_EGPRS_UL_MCS6,
+       CTR_EGPRS_UL_MCS7,
+       CTR_EGPRS_UL_MCS8,
+       CTR_EGPRS_UL_MCS9,
+};
+
 static const struct rate_ctr_desc bts_ctr_description[] = {
        { "tbf.dl.alloc",               "TBF DL Allocated     "},
        { "tbf.dl.freed",               "TBF DL Freed         "},
@@ -118,3 +206,101 @@
 };
 
 struct rate_ctr_group *pcu_ctr_init();
+
+#define CREATE_COUNT_ADD_INLINE(func_name, ctr_name)                 \
+       inline void func_name(struct rate_ctr_group *ctrs, int inc) { \
+               OSMO_ASSERT(ctrs); \
+               rate_ctr_add(&ctrs->ctr[ctr_name], inc); \
+       }
+
+#define CREATE_COUNT_INLINE(func_name, ctr_name) \
+       static inline void func_name(struct rate_ctr_group *ctrs) {\
+               OSMO_ASSERT(ctrs); \
+               rate_ctr_inc(&ctrs->ctr[ctr_name]); \
+       }
+
+CREATE_COUNT_INLINE(tbf_dl_created, CTR_TBF_DL_ALLOCATED)
+CREATE_COUNT_INLINE(tbf_dl_freed, CTR_TBF_DL_FREED)
+CREATE_COUNT_INLINE(tbf_dl_aborted, CTR_TBF_DL_ABORTED)
+CREATE_COUNT_INLINE(tbf_ul_created, CTR_TBF_UL_ALLOCATED)
+CREATE_COUNT_INLINE(tbf_ul_freed, CTR_TBF_UL_FREED)
+CREATE_COUNT_INLINE(tbf_ul_aborted, CTR_TBF_UL_ABORTED)
+CREATE_COUNT_INLINE(tbf_reused, CTR_TBF_REUSED)
+CREATE_COUNT_INLINE(tbf_alloc_algo_a, CTR_TBF_ALLOC_ALGO_A)
+CREATE_COUNT_INLINE(tbf_alloc_algo_b, CTR_TBF_ALLOC_ALGO_B)
+CREATE_COUNT_INLINE(tbf_failed_egprs_only, CTR_TBF_FAILED_EGPRS_ONLY)
+CREATE_COUNT_INLINE(rlc_sent, CTR_RLC_SENT)
+CREATE_COUNT_INLINE(rlc_resent, CTR_RLC_RESENT)
+CREATE_COUNT_INLINE(rlc_restarted, CTR_RLC_RESTARTED)
+CREATE_COUNT_INLINE(rlc_stalled, CTR_RLC_STALLED)
+CREATE_COUNT_INLINE(rlc_nacked, CTR_RLC_NACKED)
+CREATE_COUNT_INLINE(rlc_final_block_resent, CTR_RLC_FINAL_BLOCK_RESENT);
+CREATE_COUNT_INLINE(rlc_ass_timedout, CTR_RLC_ASS_TIMEDOUT);
+CREATE_COUNT_INLINE(rlc_ass_failed, CTR_RLC_ASS_FAILED);
+CREATE_COUNT_INLINE(rlc_ack_timedout, CTR_RLC_ACK_TIMEDOUT);
+CREATE_COUNT_INLINE(rlc_ack_failed, CTR_RLC_ACK_FAILED);
+CREATE_COUNT_INLINE(rlc_rel_timedout, CTR_RLC_REL_TIMEDOUT);
+CREATE_COUNT_INLINE(rlc_late_block, CTR_RLC_LATE_BLOCK);
+CREATE_COUNT_INLINE(rlc_sent_dummy, CTR_RLC_SENT_DUMMY);
+CREATE_COUNT_INLINE(rlc_sent_control, CTR_RLC_SENT_CONTROL);
+CREATE_COUNT_ADD_INLINE(rlc_dl_bytes, CTR_RLC_DL_BYTES);
+CREATE_COUNT_ADD_INLINE(rlc_dl_payload_bytes, CTR_RLC_DL_PAYLOAD_BYTES);
+CREATE_COUNT_ADD_INLINE(rlc_ul_bytes, CTR_RLC_UL_BYTES);
+CREATE_COUNT_ADD_INLINE(rlc_ul_payload_bytes, CTR_RLC_UL_PAYLOAD_BYTES);
+CREATE_COUNT_INLINE(decode_error, CTR_DECODE_ERRORS)
+CREATE_COUNT_INLINE(sba_allocated, CTR_SBA_ALLOCATED)
+CREATE_COUNT_INLINE(sba_freed, CTR_SBA_FREED)
+CREATE_COUNT_INLINE(sba_timedout, CTR_SBA_TIMEDOUT)
+CREATE_COUNT_INLINE(llc_timedout_frame, CTR_LLC_FRAME_TIMEDOUT);
+CREATE_COUNT_INLINE(llc_dropped_frame, CTR_LLC_FRAME_DROPPED);
+CREATE_COUNT_INLINE(llc_frame_sched, CTR_LLC_FRAME_SCHED);
+CREATE_COUNT_ADD_INLINE(llc_dl_bytes, CTR_LLC_DL_BYTES);
+CREATE_COUNT_ADD_INLINE(llc_ul_bytes, CTR_LLC_UL_BYTES);
+CREATE_COUNT_INLINE(rach_frame, CTR_RACH_REQUESTS);
+CREATE_COUNT_INLINE(rach_frame_11bit, CTR_11BIT_RACH_REQUESTS);
+CREATE_COUNT_INLINE(spb_uplink_first_segment, CTR_SPB_UL_FIRST_SEGMENT);
+CREATE_COUNT_INLINE(spb_uplink_second_segment, CTR_SPB_UL_SECOND_SEGMENT);
+CREATE_COUNT_INLINE(spb_downlink_first_segment, CTR_SPB_DL_FIRST_SEGMENT);
+CREATE_COUNT_INLINE(spb_downlink_second_segment, CTR_SPB_DL_SECOND_SEGMENT);
+CREATE_COUNT_INLINE(immediate_assignment_ul_tbf, CTR_IMMEDIATE_ASSIGN_UL_TBF);
+CREATE_COUNT_INLINE(immediate_assignment_reject, CTR_IMMEDIATE_ASSIGN_REJ);
+CREATE_COUNT_INLINE(immediate_assignment_dl_tbf, CTR_IMMEDIATE_ASSIGN_DL_TBF);
+CREATE_COUNT_INLINE(channel_request_description, 
CTR_CHANNEL_REQUEST_DESCRIPTION);
+CREATE_COUNT_INLINE(pkt_ul_assignment, CTR_PKT_UL_ASSIGNMENT);
+CREATE_COUNT_INLINE(pkt_access_reject, CTR_PKT_ACCESS_REJ);
+CREATE_COUNT_INLINE(pkt_dl_assignemnt, CTR_PKT_DL_ASSIGNMENT);
+CREATE_COUNT_INLINE(rlc_rcvd_control, CTR_RLC_RECV_CONTROL);
+CREATE_COUNT_INLINE(pua_poll_timedout, CTR_PUA_POLL_TIMEDOUT);
+CREATE_COUNT_INLINE(pua_poll_failed, CTR_PUA_POLL_FAILED);
+CREATE_COUNT_INLINE(pda_poll_timedout, CTR_PDA_POLL_TIMEDOUT);
+CREATE_COUNT_INLINE(pda_poll_failed, CTR_PDA_POLL_FAILED);
+CREATE_COUNT_INLINE(pkt_ul_ack_nack_poll_timedout, CTR_PUAN_POLL_TIMEDOUT);
+CREATE_COUNT_INLINE(pkt_ul_ack_nack_poll_failed, CTR_PUAN_POLL_FAILED);
+CREATE_COUNT_INLINE(pkt_dl_ack_nack_poll_timedout, CTR_PDAN_POLL_TIMEDOUT);
+CREATE_COUNT_INLINE(pkt_dl_ack_nack_poll_failed, CTR_PDAN_POLL_FAILED);
+CREATE_COUNT_INLINE(gprs_dl_cs1, CTR_GPRS_DL_CS1);
+CREATE_COUNT_INLINE(gprs_dl_cs2, CTR_GPRS_DL_CS2);
+CREATE_COUNT_INLINE(gprs_dl_cs3, CTR_GPRS_DL_CS3);
+CREATE_COUNT_INLINE(gprs_dl_cs4, CTR_GPRS_DL_CS4);
+CREATE_COUNT_INLINE(egprs_dl_mcs1, CTR_EGPRS_DL_MCS1);
+CREATE_COUNT_INLINE(egprs_dl_mcs2, CTR_EGPRS_DL_MCS2);
+CREATE_COUNT_INLINE(egprs_dl_mcs3, CTR_EGPRS_DL_MCS3);
+CREATE_COUNT_INLINE(egprs_dl_mcs4, CTR_EGPRS_DL_MCS4);
+CREATE_COUNT_INLINE(egprs_dl_mcs5, CTR_EGPRS_DL_MCS5);
+CREATE_COUNT_INLINE(egprs_dl_mcs6, CTR_EGPRS_DL_MCS6);
+CREATE_COUNT_INLINE(egprs_dl_mcs7, CTR_EGPRS_DL_MCS7);
+CREATE_COUNT_INLINE(egprs_dl_mcs8, CTR_EGPRS_DL_MCS8);
+CREATE_COUNT_INLINE(egprs_dl_mcs9, CTR_EGPRS_DL_MCS9);
+CREATE_COUNT_INLINE(gprs_ul_cs1, CTR_GPRS_UL_CS1);
+CREATE_COUNT_INLINE(gprs_ul_cs2, CTR_GPRS_UL_CS2);
+CREATE_COUNT_INLINE(gprs_ul_cs3, CTR_GPRS_UL_CS3);
+CREATE_COUNT_INLINE(gprs_ul_cs4, CTR_GPRS_UL_CS4);
+CREATE_COUNT_INLINE(egprs_ul_mcs1, CTR_EGPRS_UL_MCS1);
+CREATE_COUNT_INLINE(egprs_ul_mcs2, CTR_EGPRS_UL_MCS2);
+CREATE_COUNT_INLINE(egprs_ul_mcs3, CTR_EGPRS_UL_MCS3);
+CREATE_COUNT_INLINE(egprs_ul_mcs4, CTR_EGPRS_UL_MCS4);
+CREATE_COUNT_INLINE(egprs_ul_mcs5, CTR_EGPRS_UL_MCS5);
+CREATE_COUNT_INLINE(egprs_ul_mcs6, CTR_EGPRS_UL_MCS6);
+CREATE_COUNT_INLINE(egprs_ul_mcs7, CTR_EGPRS_UL_MCS7);
+CREATE_COUNT_INLINE(egprs_ul_mcs8, CTR_EGPRS_UL_MCS8);
+CREATE_COUNT_INLINE(egprs_ul_mcs9, CTR_EGPRS_UL_MCS9);
diff --git a/src/rlc.cpp b/src/rlc.cpp
index acd4169..560bbbf 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -23,6 +23,7 @@
 #include <errno.h>
 
 extern "C" {
+#include "pcu_ctr.h"
 #include <osmocom/core/utils.h>
 }
 
@@ -154,7 +155,7 @@
                } else {
                        LOGP(DRLCMACDL, LOGL_DEBUG, "- got NACK for BSN=%d\n", 
bsn);
                        m_v_b.mark_nacked(bsn);
-                       bts->rlc_nacked();
+                       rlc_nacked(bts->bts_data()->ctrs);
                        *lost += 1;
                }
        }
@@ -178,7 +179,7 @@
                } else {
                        LOGP(DRLCMACDL, LOGL_DEBUG, "- got NACK for BSN=%d\n", 
bsn);
                        m_v_b.mark_nacked(bsn);
-                       bts->rlc_nacked();
+                       rlc_nacked(bts->bts_data()->ctrs);
                        *lost += 1;
                }
        }
diff --git a/src/sba.cpp b/src/sba.cpp
index 56a7543..450cdc6 100644
--- a/src/sba.cpp
+++ b/src/sba.cpp
@@ -26,6 +26,7 @@
 #include <pcu_utils.h>
 
 extern "C" {
+#include "pcu_ctr.h"
 #include <osmocom/core/talloc.h>
 #include <osmocom/gsm/protocol/gsm_04_08.h>
 }
@@ -84,7 +85,7 @@
        sba->ta = ta;
 
        llist_add(&sba->list, &m_sbas);
-       m_bts.sba_allocated();
+       sba_allocated(m_bts.bts_data()->ctrs);
 
        *_trx = trx;
        *_ts = ts;
@@ -130,14 +131,14 @@
        LOGP(DRLCMAC, LOGL_NOTICE,
             "Poll timeout for SBA (TRX=%u, TS=%u, FN=%u, TA=%u)\n", 
sba->trx_no,
             sba->ts_no, sba->fn, sba->ta);
-       m_bts.sba_timedout();
+       sba_timedout(m_bts.bts_data()->ctrs);
        free_sba(sba);
        return 0;
 }
 
 void SBAController::free_sba(gprs_rlcmac_sba *sba)
 {
-       m_bts.sba_freed();
+       sba_freed(m_bts.bts_data()->ctrs);
        llist_del(&sba->list);
        talloc_free(sba);
 }
diff --git a/src/tbf.cpp b/src/tbf.cpp
index 8e54157..1dd190f 100644
--- a/src/tbf.cpp
+++ b/src/tbf.cpp
@@ -31,6 +31,7 @@
 #include <pcu_utils.h>
 
 extern "C" {
+#include "pcu_ctr.h"
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/talloc.h>
 #include <osmocom/core/stats.h>
@@ -421,9 +422,9 @@
        /* update counters */
        if (tbf->direction == GPRS_RLCMAC_UL_TBF) {
                gprs_rlcmac_ul_tbf *ul_tbf = as_ul_tbf(tbf);
-               tbf->bts->tbf_ul_freed();
+               tbf_ul_freed(tbf->bts->bts_data()->ctrs);
                if (tbf->state_is(GPRS_RLCMAC_FLOW))
-                       tbf->bts->tbf_ul_aborted();
+                       tbf_ul_aborted(tbf->bts->bts_data()->ctrs);
                rate_ctr_group_free(ul_tbf->m_ul_egprs_ctrs);
                rate_ctr_group_free(ul_tbf->m_ul_gprs_ctrs);
        } else {
@@ -433,9 +434,9 @@
                } else {
                        rate_ctr_group_free(dl_tbf->m_dl_gprs_ctrs);
                }
-               tbf->bts->tbf_dl_freed();
+               tbf_dl_freed(tbf->bts->bts_data()->ctrs);
                if (tbf->state_is(GPRS_RLCMAC_FLOW))
-                       tbf->bts->tbf_dl_aborted();
+                       tbf_dl_aborted(tbf->bts->bts_data()->ctrs);
        }
 
        /* Give final measurement report */
@@ -653,14 +654,14 @@
                        LOGP(DRLCMAC, LOGL_NOTICE, "- Timeout for polling 
PACKET CONTROL ACK for PACKET UPLINK ACK\n");
                        rlcmac_diag();
                }
-               bts->rlc_ack_timedout();
-               bts->pkt_ul_ack_nack_poll_timedout();
+               rlc_ack_timedout(bts->bts_data()->ctrs);
+               pkt_ul_ack_nack_poll_timedout(bts->bts_data()->ctrs);
                if (state_is(GPRS_RLCMAC_FINISHED)) {
                        ul_tbf->m_n3103++;
                        if (ul_tbf->m_n3103 == ul_tbf->bts->bts_data()->n3103) {
                                LOGP(DRLCMAC, LOGL_NOTICE,
                                     "- N3103 exceeded\n");
-                               bts->pkt_ul_ack_nack_poll_failed();
+                               
pkt_ul_ack_nack_poll_failed(bts->bts_data()->ctrs);
                                ul_tbf->set_state(GPRS_RLCMAC_RELEASING);
                                tbf_timer_start(ul_tbf, 3169, 
ul_tbf->bts->bts_data()->t3169, 0);
                                return;
@@ -679,14 +680,14 @@
                }
                ul_ass_state = GPRS_RLCMAC_UL_ASS_NONE;
                n3105++;
-               bts->rlc_ass_timedout();
-               bts->pua_poll_timedout();
+               rlc_ass_timedout(bts->bts_data()->ctrs);
+               pua_poll_timedout(bts->bts_data()->ctrs);
                if (n3105 == bts_data()->n3105) {
                        LOGP(DRLCMAC, LOGL_NOTICE, "- N3105 exceeded\n");
                        set_state(GPRS_RLCMAC_RELEASING);
                        tbf_timer_start(this, 3195, bts_data()->t3195, 0);
-                       bts->rlc_ass_failed();
-                       bts->pua_poll_failed();
+                       rlc_ass_failed(bts->bts_data()->ctrs);
+                       pua_poll_failed(bts->bts_data()->ctrs);
                        return;
                }
                /* reschedule UL assignment */
@@ -701,14 +702,14 @@
                }
                dl_ass_state = GPRS_RLCMAC_DL_ASS_NONE;
                n3105++;
-               bts->rlc_ass_timedout();
-               bts->pda_poll_timedout();
+               rlc_ass_timedout(bts->bts_data()->ctrs);
+               pda_poll_timedout(bts->bts_data()->ctrs);
                if (n3105 == bts->bts_data()->n3105) {
                        LOGP(DRLCMAC, LOGL_NOTICE, "- N3105 exceeded\n");
                        set_state(GPRS_RLCMAC_RELEASING);
                        tbf_timer_start(this, 3195, bts_data()->t3195, 0);
-                       bts->rlc_ass_failed();
-                       bts->pda_poll_failed();
+                       rlc_ass_failed(bts->bts_data()->ctrs);
+                       pda_poll_failed(bts->bts_data()->ctrs);
                        return;
                }
                /* reschedule DL assignment */
@@ -724,17 +725,17 @@
                }
                dl_tbf->n3105++;
                if (dl_tbf->state_is(GPRS_RLCMAC_RELEASING))
-                       bts->rlc_rel_timedout();
+                       rlc_rel_timedout(bts->bts_data()->ctrs);
                else {
-                       bts->rlc_ack_timedout();
-                       bts->pkt_dl_ack_nack_poll_timedout();
+                       rlc_ack_timedout(bts->bts_data()->ctrs);
+                       pkt_dl_ack_nack_poll_timedout(bts->bts_data()->ctrs);
                }
                if (dl_tbf->n3105 == dl_tbf->bts->bts_data()->n3105) {
                        LOGP(DRLCMAC, LOGL_NOTICE, "- N3105 exceeded\n");
                        dl_tbf->set_state(GPRS_RLCMAC_RELEASING);
                        tbf_timer_start(dl_tbf, 3195, 
dl_tbf->bts_data()->t3195, 0);
-                       bts->pkt_dl_ack_nack_poll_failed();
-                       bts->rlc_ack_failed();
+                       pkt_dl_ack_nack_poll_failed(bts->bts_data()->ctrs);
+                       rlc_ack_failed(bts->bts_data()->ctrs);
                        return;
                }
                /* resend IMM.ASS on CCCH on timeout */
@@ -840,7 +841,7 @@
        if (egprs_ms_class == 0 && bts->egprs_enabled) {
                LOGP(DRLCMAC, LOGL_NOTICE,
                        "Not accepting non-EGPRS phone in EGPRS-only mode\n");
-               bts->bts->tbf_failed_egprs_only();
+               tbf_failed_egprs_only(bts->bts->bts_data()->ctrs);
                return NULL;
        }
 
@@ -887,7 +888,7 @@
        }
 
        llist_add(&tbf->list(), &bts->bts->ul_tbfs());
-       tbf->bts->tbf_ul_created();
+       tbf_ul_created(tbf->bts->bts_data()->ctrs);
 
        return tbf;
 }
@@ -932,7 +933,7 @@
                if (ms_class > 0) {
                        LOGP(DRLCMAC, LOGL_NOTICE,
                                "Not accepting non-EGPRS phone in EGPRS-only 
mode\n");
-                       bts->bts->tbf_failed_egprs_only();
+                       tbf_failed_egprs_only(bts->bts->bts_data()->ctrs);
                        return NULL;
                }
                egprs_ms_class = 1;
@@ -986,7 +987,7 @@
        }
 
        llist_add(&tbf->list(), &bts->bts->dl_tbfs());
-       tbf->bts->tbf_dl_created();
+       tbf_dl_created(tbf->bts->bts_data()->ctrs);
 
        tbf->m_last_dl_poll_fn = -1;
        tbf->m_last_dl_drained_fn = -1;
@@ -1180,7 +1181,7 @@
        encode_gsm_rlcmac_downlink(ass_vec, mac_control_block);
        LOGPC(DCSN1, LOGL_NOTICE, "\n");
        LOGP(DRLCMAC, LOGL_DEBUG, "------------------------- TX : Packet 
Downlink Assignment -------------------------\n");
-       bts->pkt_dl_assignemnt();
+       pkt_dl_assignemnt(bts->bts_data()->ctrs);
        bitvec_pack(ass_vec, msgb_put(msg, 23));
        bitvec_free(ass_vec);
        talloc_free(mac_control_block);
@@ -1213,7 +1214,7 @@
        Encoding::write_packet_access_reject(
                packet_access_rej, tlli());
 
-       bts->pkt_access_reject();
+       pkt_access_reject(bts->bts_data()->ctrs);
 
        bitvec_pack(packet_access_rej, msgb_put(msg, 23));
 
@@ -1279,7 +1280,7 @@
        decode_gsm_rlcmac_downlink(ass_vec, mac_control_block);
        LOGPC(DCSN1, LOGL_NOTICE, "\n");
        LOGP(DRLCMAC, LOGL_DEBUG, "------------------------- TX : Packet Uplink 
Assignment -------------------------\n");
-       bts->pkt_ul_assignment();
+       pkt_ul_assignment(bts->bts_data()->ctrs);
        bitvec_free(ass_vec);
        talloc_free(mac_control_block);
 
@@ -1312,7 +1313,7 @@
 {
        struct gprs_rlcmac_dl_tbf *new_tbf = NULL;
 
-       bts->tbf_reused();
+       tbf_reused(bts->bts_data()->ctrs);
 
        new_tbf = tbf_alloc_dl_tbf(bts->bts_data(), ms(),
                this->trx->trx_no, ms_class(),
@@ -1468,7 +1469,7 @@
        ms->set_tlli(tlli);
 
        llist_add(&ul_tbf->list(), &bts->bts->ul_tbfs());
-       ul_tbf->bts->tbf_ul_created();
+       tbf_ul_created(ul_tbf->bts->bts_data()->ctrs);
        ul_tbf->set_state(GPRS_RLCMAC_ASSIGN);
        ul_tbf->state_flags |= (1 << GPRS_RLCMAC_FLAG_PACCH);
 
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 3d27883..deeb89e 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -32,6 +32,7 @@
 #include "pcu_utils.h"
 
 extern "C" {
+#include "pcu_ctr.h"
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/talloc.h>
 #include <osmocom/gprs/gprs_bssgp_bss.h>
@@ -295,12 +296,12 @@
                                break;
                }
 
-               bts->llc_timedout_frame();
+               llc_timedout_frame(bts->bts_data()->ctrs);
 drop_frame:
                frames++;
                octets += msg->len;
                msgb_free(msg);
-               bts->llc_dropped_frame();
+               llc_dropped_frame(bts->bts_data()->ctrs);
                continue;
        }
 
@@ -407,19 +408,19 @@
                LOGP(DRLCMACDL, LOGL_DEBUG, "- Resending BSN %d\n", bsn);
                /* re-send block with negative aknowlegement */
                m_window.m_v_b.mark_unacked(bsn);
-               bts->rlc_resent();
+               rlc_resent(bts->bts_data()->ctrs);
        } else if (state_is(GPRS_RLCMAC_FINISHED)) {
                LOGP(DRLCMACDL, LOGL_DEBUG, "- Restarting at BSN %d, "
                        "because all blocks have been transmitted.\n",
                        m_window.v_a());
-               bts->rlc_restarted();
+               rlc_restarted(bts->bts_data()->ctrs);
                if (restart_bsn_cycle())
                        return take_next_bsn(fn, previous_bsn, may_combine);
        } else if (dl_window_stalled()) {
                LOGP(DRLCMACDL, LOGL_NOTICE, "- Restarting at BSN %d, "
                        "because the window is stalled.\n",
                        m_window.v_a());
-               bts->rlc_stalled();
+               rlc_stalled(bts->bts_data()->ctrs);
                if (restart_bsn_cycle())
                        return take_next_bsn(fn, previous_bsn, may_combine);
        } else if (have_data()) {
@@ -435,7 +436,7 @@
                LOGP(DRLCMACDL, LOGL_DEBUG, "- Restarting at BSN %d, "
                        "because all blocks have been transmitted (FLOW).\n",
                        m_window.v_a());
-               bts->rlc_restarted();
+               rlc_restarted(bts->bts_data()->ctrs);
                if (restart_bsn_cycle())
                        return take_next_bsn(fn, previous_bsn, may_combine);
        } else {
@@ -452,8 +453,8 @@
                LOGP(DRLCMACDL, LOGL_DEBUG,
                        "- Nothing else to send, Re-transmit final block!\n");
                bsn = m_window.v_s_mod(-1);
-               bts->rlc_final_block_resent();
-               bts->rlc_resent();
+               rlc_final_block_resent(bts->bts_data()->ctrs);
+               rlc_resent(bts->bts_data()->ctrs);
        }
 
        *may_combine = m_rlc.block(bsn)->cs_current_trans.numDataBlocks() > 1;
@@ -535,7 +536,7 @@
                tbf_name(this), msg->len);
 
        m_llc.put_frame(msg->data, msg->len);
-       bts->llc_frame_sched();
+       llc_frame_sched(bts->bts_data()->ctrs);
        msgb_free(msg);
        m_last_dl_drained_fn = -1;
 }
@@ -611,7 +612,7 @@
                        &m_llc, &write_offset, &num_chunks, data, is_final, 
&payload_written);
 
                if (payload_written > 0)
-                       bts->rlc_dl_payload_bytes(payload_written);
+                       rlc_dl_payload_bytes(bts->bts_data()->ctrs, 
payload_written);
 
                if (ar == Encoding::AR_NEED_MORE_BLOCKS)
                        break;
@@ -619,7 +620,7 @@
                LOGP(DRLCMACDL, LOGL_INFO, "Complete DL frame for %s"
                        "len=%d\n", tbf_name(this), m_llc.frame_length());
                gprs_rlcmac_dl_bw(this, m_llc.frame_length());
-               bts->llc_dl_bytes(m_llc.frame_length());
+               llc_dl_bytes(bts->bts_data()->ctrs, m_llc.frame_length());
                m_llc.reset();
 
                if (is_final) {
@@ -1359,19 +1360,19 @@
                if (block_status_dl == EGPRS_RESEG_FIRST_SEG_SENT) {
 
                        /* statistics */
-                       bts->spb_downlink_second_segment();
+                       spb_downlink_second_segment(bts->bts_data()->ctrs);
                        return EGPRS_RLCMAC_DL_SEC_SEG;
                } else if ((cs_init.headerTypeData() ==
                                GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_1) ||
                        (cs_init.headerTypeData() ==
                                GprsCodingScheme::HEADER_EGPRS_DATA_TYPE_2)) {
-                       bts->spb_downlink_first_segment();
+                       spb_downlink_first_segment(bts->bts_data()->ctrs);
                        return EGPRS_RLCMAC_DL_FIRST_SEG;
                } else if ((GprsCodingScheme::Scheme(cs_init) ==
                                        GprsCodingScheme::MCS4) &&
                                (GprsCodingScheme::Scheme(cs_current_trans) ==
                                        GprsCodingScheme::MCS1)) {
-                       bts->spb_downlink_first_segment();
+                       spb_downlink_first_segment(bts->bts_data()->ctrs);
                        return EGPRS_RLCMAC_DL_FIRST_SEG;
                }
        }
@@ -1407,58 +1408,58 @@
        if (cs.isGprs()) {
                switch (coding_scheme) {
                case GprsCodingScheme::CS1 :
-                       bts->gprs_dl_cs1();
+                       gprs_dl_cs1(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS1]);
                        break;
                case GprsCodingScheme::CS2 :
-                       bts->gprs_dl_cs2();
+                       gprs_dl_cs2(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS2]);
                        break;
                case GprsCodingScheme::CS3 :
-                       bts->gprs_dl_cs3();
+                       gprs_dl_cs3(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS3]);
                        break;
                case GprsCodingScheme::CS4 :
-                       bts->gprs_dl_cs4();
+                       gprs_dl_cs4(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS4]);
                        break;
                }
        } else {
                switch (coding_scheme) {
                case GprsCodingScheme::MCS1 :
-                       bts->egprs_dl_mcs1();
+                       egprs_dl_mcs1(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS1]);
                        break;
                case GprsCodingScheme::MCS2 :
-                       bts->egprs_dl_mcs2();
+                       egprs_dl_mcs2(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS2]);
                        break;
                case GprsCodingScheme::MCS3 :
-                       bts->egprs_dl_mcs3();
+                       egprs_dl_mcs3(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS3]);
                        break;
                case GprsCodingScheme::MCS4 :
-                       bts->egprs_dl_mcs4();
+                       egprs_dl_mcs4(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS4]);
                        break;
                case GprsCodingScheme::MCS5 :
-                       bts->egprs_dl_mcs5();
+                       egprs_dl_mcs5(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS5]);
                        break;
                case GprsCodingScheme::MCS6 :
-                       bts->egprs_dl_mcs6();
+                       egprs_dl_mcs6(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS6]);
                        break;
                case GprsCodingScheme::MCS7 :
-                       bts->egprs_dl_mcs7();
+                       egprs_dl_mcs7(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS7]);
                        break;
                case GprsCodingScheme::MCS8 :
-                       bts->egprs_dl_mcs8();
+                       egprs_dl_mcs8(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS8]);
                        break;
                case GprsCodingScheme::MCS9 :
-                       bts->egprs_dl_mcs9();
+                       egprs_dl_mcs9(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS9]);
                        break;
                }
diff --git a/src/tbf_ul.cpp b/src/tbf_ul.cpp
index 81d3b24..1f8f0f6 100644
--- a/src/tbf_ul.cpp
+++ b/src/tbf_ul.cpp
@@ -32,6 +32,7 @@
 #include "pcu_utils.h"
 
 extern "C" {
+#include "pcu_ctr.h"
 #include <osmocom/core/msgb.h>
 #include <osmocom/core/talloc.h>
 }
@@ -70,7 +71,7 @@
                frame = frames + i;
 
                if (frame->length) {
-                       bts->rlc_ul_payload_bytes(frame->length);
+                       rlc_ul_payload_bytes(bts->bts_data()->ctrs, 
frame->length);
 
                        LOGP(DRLCMACUL, LOGL_DEBUG, "-- Frame %d "
                                "starts at offset %d, "
@@ -87,7 +88,7 @@
                        LOGP(DRLCMACUL, LOGL_INFO, "%s complete UL frame 
len=%d\n",
                                tbf_name(this) , m_llc.frame_length());
                        snd_ul_ud();
-                       bts->llc_ul_bytes(m_llc.frame_length());
+                       llc_ul_bytes(bts->bts_data()->ctrs, 
m_llc.frame_length());
                        m_llc.reset();
                }
        }
@@ -277,7 +278,7 @@
                                rdbi, rlc->cs, rlc_data, NULL, 0, &new_tlli);
 
                        if (num_chunks < 0) {
-                               bts->decode_error();
+                               decode_error(bts->bts_data()->ctrs);
                                LOGP(DRLCMACUL, LOGL_NOTICE,
                                        "Failed to decode TLLI of %s UL DATA "
                                        "TFI=%d.\n", rlc->cs.name(), rlc->tfi);
@@ -419,7 +420,7 @@
        union split_block_status *spb_status = &block->spb_status;
        uint8_t *rlc_data = &block->block[0];
 
-        bts->spb_uplink_second_segment();
+        spb_uplink_second_segment(bts->bts_data()->ctrs);
 
        if (spb_status->block_status_ul &
                                EGPRS_RESEG_FIRST_SEG_RXD) {
@@ -457,7 +458,7 @@
        uint8_t *rlc_data = &block->block[0];
        union split_block_status *spb_status = &block->spb_status;
 
-       bts->spb_uplink_first_segment();
+       spb_uplink_first_segment(bts->bts_data()->ctrs);
 
        if (spb_status->block_status_ul & EGPRS_RESEG_SECOND_SEG_RXD) {
                LOGP(DRLCMACUL, LOGL_DEBUG,
@@ -552,58 +553,58 @@
        if (cs.isGprs()) {
                switch (coding_scheme) {
                case GprsCodingScheme::CS1 :
-                       bts->gprs_ul_cs1();
+                       gprs_ul_cs1(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_ul_gprs_ctrs->ctr[TBF_CTR_GPRS_UL_CS1]);
                        break;
                case GprsCodingScheme::CS2 :
-                       bts->gprs_ul_cs2();
+                       gprs_ul_cs2(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_ul_gprs_ctrs->ctr[TBF_CTR_GPRS_UL_CS2]);
                        break;
                case GprsCodingScheme::CS3 :
-                       bts->gprs_ul_cs3();
+                       gprs_ul_cs3(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_ul_gprs_ctrs->ctr[TBF_CTR_GPRS_UL_CS3]);
                        break;
                case GprsCodingScheme::CS4 :
-                       bts->gprs_ul_cs4();
+                       gprs_ul_cs4(bts->bts_data()->ctrs);
                        rate_ctr_inc(&m_ul_gprs_ctrs->ctr[TBF_CTR_GPRS_UL_CS4]);
                        break;
                }
        } else {
                switch (coding_scheme) {
                case GprsCodingScheme::MCS1 :
-                       bts->egprs_ul_mcs1();
+                       egprs_ul_mcs1(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS1]);
                        break;
                case GprsCodingScheme::MCS2 :
-                       bts->egprs_ul_mcs2();
+                       egprs_ul_mcs2(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS2]);
                        break;
                case GprsCodingScheme::MCS3 :
-                       bts->egprs_ul_mcs3();
+                       egprs_ul_mcs3(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS3]);
                        break;
                case GprsCodingScheme::MCS4 :
-                       bts->egprs_ul_mcs4();
+                       egprs_ul_mcs4(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS4]);
                        break;
                case GprsCodingScheme::MCS5 :
-                       bts->egprs_ul_mcs5();
+                       egprs_ul_mcs5(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS5]);
                        break;
                case GprsCodingScheme::MCS6 :
-                       bts->egprs_ul_mcs6();
+                       egprs_ul_mcs6(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS6]);
                        break;
                case GprsCodingScheme::MCS7 :
-                       bts->egprs_ul_mcs7();
+                       egprs_ul_mcs7(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS7]);
                        break;
                case GprsCodingScheme::MCS8 :
-                       bts->egprs_ul_mcs8();
+                       egprs_ul_mcs8(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS8]);
                        break;
                case GprsCodingScheme::MCS9 :
-                       bts->egprs_ul_mcs9();
+                       egprs_ul_mcs9(bts->bts_data()->ctrs);
                        
rate_ctr_inc(&m_ul_egprs_ctrs->ctr[TBF_CTR_EGPRS_UL_MCS9]);
                        break;
                }

-- 
To view, visit https://gerrit.osmocom.org/4413
To unsubscribe, visit https://gerrit.osmocom.org/settings

Gerrit-MessageType: newpatchset
Gerrit-Change-Id: I795631752af3b9077a846c3123217e1deda52e86
Gerrit-PatchSet: 4
Gerrit-Project: osmo-pcu
Gerrit-Branch: master
Gerrit-Owner: Max <msur...@sysmocom.de>
Gerrit-Reviewer: Jenkins Builder

Reply via email to