Add statistics in the ms and tbf level.
Adds DL throughput in show ms imsi <imsi_value>. Adds the number of coding schemes counter and rlc nacked counter at TBf level. Change-Id: Ia95b0404989b00db0e7ba416bc40d09ef41fde1c
This commit is contained in:
parent
cc4214a429
commit
5395073fff
|
@ -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);
|
||||
|
|
|
@ -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",
|
||||
|
|
74
src/tbf.cpp
74
src/tbf.cpp
|
@ -33,6 +33,7 @@
|
|||
extern "C" {
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/core/stats.h>
|
||||
}
|
||||
|
||||
#include <errno.h>
|
||||
|
@ -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();
|
||||
|
|
29
src/tbf.h
29
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;
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue