From 5395073fff9870e82358721126062d501ea4ad31 Mon Sep 17 00:00:00 2001 From: sivasankari Date: Thu, 8 Dec 2016 17:15:17 +0530 Subject: Add statistics in the ms and tbf level. Adds DL throughput in show ms imsi . Adds the number of coding schemes counter and rlc nacked counter at TBf level. Change-Id: Ia95b0404989b00db0e7ba416bc40d09ef41fde1c --- src/gprs_rlcmac_meas.cpp | 2 ++ src/pcu_vty_functions.cpp | 13 ++++++++- src/tbf.cpp | 74 ++++++++++++++++++++++++++++++++++++++++++++--- src/tbf.h | 29 +++++++++++++++++++ src/tbf_dl.cpp | 15 ++++++++++ 5 files changed, 128 insertions(+), 5 deletions(-) diff --git a/src/gprs_rlcmac_meas.cpp b/src/gprs_rlcmac_meas.cpp index 5a2e38e9..d6bbc196 100644 --- a/src/gprs_rlcmac_meas.cpp +++ b/src/gprs_rlcmac_meas.cpp @@ -179,6 +179,8 @@ int gprs_rlcmac_dl_bw(struct gprs_rlcmac_dl_tbf *tbf, uint16_t octets) if (elapsed < 128) return 0; + tbf->m_bw.dl_throughput = (tbf->m_bw.dl_bw_octets/elapsed); + LOGP(DRLCMACMEAS, LOGL_INFO, "DL Bandwitdh of IMSI=%s / TLLI=0x%08x: " "%d KBits/s\n", tbf->imsi(), tbf->tlli(), tbf->m_bw.dl_bw_octets / elapsed); diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp index ca7f7ad7..4b4b36df 100644 --- a/src/pcu_vty_functions.cpp +++ b/src/pcu_vty_functions.cpp @@ -76,6 +76,13 @@ static void tbf_print_vty_info(struct vty *vty, gprs_rlcmac_tbf *tbf) vty_out(vty, " V(A)=%d V(S)=%d nBSN=%d%s", win->v_a(), win->v_s(), win->resend_needed(), win->window_stalled() ? " STALLED" : ""); + vty_out(vty, "%s", VTY_NEWLINE); + vty_out_rate_ctr_group(vty, " ", tbf->m_ctrs); + if(GprsCodingScheme::GPRS == tbf->ms()->mode()) { + vty_out_rate_ctr_group(vty, " ", dl_tbf->m_dl_gprs_ctrs); + } else { + vty_out_rate_ctr_group(vty, " ", dl_tbf->m_dl_egprs_ctrs); + } } vty_out(vty, "%s%s", VTY_NEWLINE, VTY_NEWLINE); } @@ -176,11 +183,15 @@ static int show_ms(struct vty *vty, GprsMs *ms) ms->ul_tbf()->tfi(), ms->ul_tbf()->state_name(), VTY_NEWLINE); - if (ms->dl_tbf()) + if (ms->dl_tbf()) { vty_out(vty, " Downlink TBF: TFI=%d, state=%s%s", ms->dl_tbf()->tfi(), ms->dl_tbf()->state_name(), VTY_NEWLINE); + vty_out(vty, " Current DL Throughput: %d Kbps %s", + ms->dl_tbf()->m_bw.dl_throughput, + VTY_NEWLINE); + } llist_for_each(i_tbf, &ms->old_tbfs()) vty_out(vty, " Old %-19s TFI=%d, state=%s%s", diff --git a/src/tbf.cpp b/src/tbf.cpp index 25209e4f..60fba68e 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -33,6 +33,7 @@ extern "C" { #include #include +#include } #include @@ -42,6 +43,53 @@ extern void *tall_pcu_ctx; static void tbf_timer_cb(void *_tbf); +static const struct rate_ctr_desc tbf_ctr_description[] = { + { "rlc.nacked", "RLC Nacked " }, +}; + +static const struct rate_ctr_desc tbf_dl_gprs_ctr_description[] = { + { "gprs.downlink.cs1", "CS1 " }, + { "gprs.downlink.cs2", "CS2 " }, + { "gprs.downlink.cs3", "CS3 " }, + { "gprs.downlink.cs4", "CS4 " }, +}; + +static const struct rate_ctr_desc tbf_dl_egprs_ctr_description[] = { + { "egprs.downlink.mcs1", "MCS1 " }, + { "egprs.downlink.mcs2", "MCS2 " }, + { "egprs.downlink.mcs3", "MCS3 " }, + { "egprs.downlink.mcs4", "MCS4 " }, + { "egprs.downlink.mcs5", "MCS5 " }, + { "egprs.downlink.mcs6", "MCS6 " }, + { "egprs.downlink.mcs7", "MCS7 " }, + { "egprs.downlink.mcs8", "MCS8 " }, + { "egprs.downlink.mcs9", "MCS9 " }, +}; + +static const struct rate_ctr_group_desc tbf_ctrg_desc = { + "pcu.tbf", + "TBF Statistics", + OSMO_STATS_CLASS_SUBSCRIBER, + ARRAY_SIZE(tbf_ctr_description), + tbf_ctr_description, +}; + +static const struct rate_ctr_group_desc tbf_dl_gprs_ctrg_desc = { + "tbf.gprs", + "Data Blocks", + OSMO_STATS_CLASS_SUBSCRIBER, + ARRAY_SIZE(tbf_dl_gprs_ctr_description), + tbf_dl_gprs_ctr_description, +}; + +static const struct rate_ctr_group_desc tbf_dl_egprs_ctrg_desc = { + "tbf.egprs", + "Data Blocks", + OSMO_STATS_CLASS_SUBSCRIBER, + ARRAY_SIZE(tbf_dl_egprs_ctr_description), + tbf_dl_egprs_ctr_description, +}; + gprs_rlcmac_tbf::Meas::Meas() : rssi_sum(0), rssi_num(0) @@ -78,7 +126,8 @@ gprs_rlcmac_tbf::gprs_rlcmac_tbf(BTS *bts_, gprs_rlcmac_tbf_direction dir) : m_ms_class(0), m_list(this), m_ms_list(this), - m_egprs_enabled(false) + m_egprs_enabled(false), + m_ctrs(NULL) { /* The classes of these members do not have proper constructors yet. * Just set them to 0 like talloc_zero did */ @@ -325,6 +374,12 @@ void tbf_free(struct gprs_rlcmac_tbf *tbf) if (tbf->state_is(GPRS_RLCMAC_FLOW)) tbf->bts->tbf_ul_aborted(); } else { + gprs_rlcmac_dl_tbf *dl_tbf = as_dl_tbf(tbf); + if (tbf->is_egprs_enabled()) { + rate_ctr_group_free(dl_tbf->m_dl_egprs_ctrs); + } else { + rate_ctr_group_free(dl_tbf->m_dl_gprs_ctrs); + } tbf->bts->tbf_dl_freed(); if (tbf->state_is(GPRS_RLCMAC_FLOW)) tbf->bts->tbf_dl_aborted(); @@ -360,6 +415,8 @@ void tbf_free(struct gprs_rlcmac_tbf *tbf) if (tbf->ms()) tbf->set_ms(NULL); + rate_ctr_group_free(tbf->m_ctrs); + LOGP(DRLCMAC, LOGL_DEBUG, "********** TBF ends here **********\n"); talloc_free(tbf); } @@ -646,6 +703,8 @@ static int setup_tbf(struct gprs_rlcmac_tbf *tbf, "Allocated %s: trx = %d, ul_slots = %02x, dl_slots = %02x\n", tbf->name(), tbf->trx->trx_no, tbf->ul_slots(), tbf->dl_slots()); + tbf->m_ctrs = rate_ctr_group_alloc(tbf, &tbf_ctrg_desc, 0); + return 0; } @@ -732,7 +791,8 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, gprs_rlcmac_dl_tbf::BandWidth::BandWidth() : dl_bw_octets(0), dl_loss_lost(0), - dl_loss_received(0) + dl_loss_received(0), + dl_throughput(0) { timerclear(&dl_bw_tv); timerclear(&dl_loss_tv); @@ -744,7 +804,9 @@ gprs_rlcmac_dl_tbf::gprs_rlcmac_dl_tbf(BTS *bts_) : m_wait_confirm(0), m_dl_ack_requested(false), m_last_dl_poll_fn(0), - m_last_dl_drained_fn(0) + m_last_dl_drained_fn(0), + m_dl_gprs_ctrs(NULL), + m_dl_egprs_ctrs(NULL) { memset(&m_llc_timer, 0, sizeof(m_llc_timer)); } @@ -802,8 +864,12 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, return NULL; } - if (tbf->is_egprs_enabled()) + if (tbf->is_egprs_enabled()) { tbf->egprs_calc_window_size(); + tbf->m_dl_egprs_ctrs = rate_ctr_group_alloc(tbf, &tbf_dl_egprs_ctrg_desc, 0); + } else { + tbf->m_dl_gprs_ctrs = rate_ctr_group_alloc(tbf, &tbf_dl_gprs_ctrg_desc, 0); + } llist_add(&tbf->list(), &bts->bts->dl_tbfs()); tbf->bts->tbf_dl_created(); diff --git a/src/tbf.h b/src/tbf.h index 1e98a24b..5017d3e8 100644 --- a/src/tbf.h +++ b/src/tbf.h @@ -79,6 +79,29 @@ enum gprs_rlcmac_tbf_direction { GPRS_RLCMAC_UL_TBF }; +enum tbf_counters { + TBF_CTR_RLC_NACKED, +}; + +enum tbf_gprs_counters { + TBF_CTR_GPRS_DL_CS1, + TBF_CTR_GPRS_DL_CS2, + TBF_CTR_GPRS_DL_CS3, + TBF_CTR_GPRS_DL_CS4, +}; + +enum tbf_egprs_counters { + TBF_CTR_EGPRS_DL_MCS1, + TBF_CTR_EGPRS_DL_MCS2, + TBF_CTR_EGPRS_DL_MCS3, + TBF_CTR_EGPRS_DL_MCS4, + TBF_CTR_EGPRS_DL_MCS5, + TBF_CTR_EGPRS_DL_MCS6, + TBF_CTR_EGPRS_DL_MCS7, + TBF_CTR_EGPRS_DL_MCS8, + TBF_CTR_EGPRS_DL_MCS9, +}; + #define GPRS_RLCMAC_FLAG_CCCH 0 /* assignment on CCCH */ #define GPRS_RLCMAC_FLAG_PACCH 1 /* assignment on PACCH */ #define GPRS_RLCMAC_FLAG_UL_DATA 2 /* uplink data received */ @@ -225,6 +248,8 @@ struct gprs_rlcmac_tbf { uint8_t m_tfi; time_t m_created_ts; + struct rate_ctr_group *m_ctrs; + protected: gprs_rlcmac_bts *bts_data() const; @@ -399,6 +424,7 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { struct BandWidth { struct timeval dl_bw_tv; /* timestamp for dl bw calculation */ uint32_t dl_bw_octets; /* number of octets since bw_tv */ + uint32_t dl_throughput; /* throughput to be displayed in stats */ struct timeval dl_loss_tv; /* timestamp for loss calculation */ uint16_t dl_loss_lost; /* sum of lost packets */ @@ -407,6 +433,9 @@ struct gprs_rlcmac_dl_tbf : public gprs_rlcmac_tbf { BandWidth(); } m_bw; + struct rate_ctr_group *m_dl_gprs_ctrs; + struct rate_ctr_group *m_dl_egprs_ctrs; + protected: struct ana_result { unsigned received_packets; diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp index c6f3945a..2af2ff0e 100644 --- a/src/tbf_dl.cpp +++ b/src/tbf_dl.cpp @@ -949,6 +949,7 @@ int gprs_rlcmac_dl_tbf::update_window(unsigned first_bsn, ms()->update_error_rate(this, error_rate); m_window.update(bts, rbb, first_bsn, &lost, &received); + rate_ctr_add(&m_ctrs->ctr[TBF_CTR_RLC_NACKED], lost); /* report lost and received packets */ gprs_rlcmac_received_lost(this, received, lost); @@ -1007,6 +1008,7 @@ int gprs_rlcmac_dl_tbf::update_window(const uint8_t ssn, const uint8_t *rbb) m_window.update(bts, show_rbb, ssn, &lost, &received); + rate_ctr_add(&m_ctrs->ctr[TBF_CTR_RLC_NACKED], lost); /* report lost and received packets */ gprs_rlcmac_received_lost(this, received, lost); @@ -1342,45 +1344,58 @@ void gprs_rlcmac_dl_tbf::update_coding_scheme_counter_dl(const GprsCodingScheme switch (coding_scheme) { case GprsCodingScheme::CS1 : bts->gprs_dl_cs1(); + rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS1]); break; case GprsCodingScheme::CS2 : bts->gprs_dl_cs2(); + rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS2]); break; case GprsCodingScheme::CS3 : bts->gprs_dl_cs3(); + rate_ctr_inc(&m_dl_gprs_ctrs->ctr[TBF_CTR_GPRS_DL_CS3]); break; case GprsCodingScheme::CS4 : bts->gprs_dl_cs4(); + 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(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS1]); break; case GprsCodingScheme::MCS2 : bts->egprs_dl_mcs2(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS2]); break; case GprsCodingScheme::MCS3 : bts->egprs_dl_mcs3(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS3]); break; case GprsCodingScheme::MCS4 : bts->egprs_dl_mcs4(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS4]); break; case GprsCodingScheme::MCS5 : bts->egprs_dl_mcs5(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS5]); break; case GprsCodingScheme::MCS6 : bts->egprs_dl_mcs6(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS6]); break; case GprsCodingScheme::MCS7 : bts->egprs_dl_mcs7(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS7]); break; case GprsCodingScheme::MCS8 : bts->egprs_dl_mcs8(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS8]); break; case GprsCodingScheme::MCS9 : bts->egprs_dl_mcs9(); + rate_ctr_inc(&m_dl_egprs_ctrs->ctr[TBF_CTR_EGPRS_DL_MCS9]); break; } } -- cgit v1.2.3