aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gprs_ms.c25
-rw-r--r--src/gprs_ms.h17
-rw-r--r--src/gprs_rlcmac_sched.cpp3
-rw-r--r--src/pcu_vty_functions.cpp3
4 files changed, 33 insertions, 15 deletions
diff --git a/src/gprs_ms.c b/src/gprs_ms.c
index 94f69cde..d57e9b62 100644
--- a/src/gprs_ms.c
+++ b/src/gprs_ms.c
@@ -35,11 +35,25 @@
#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <osmocom/gsm/gsm48.h>
#include <osmocom/core/logging.h>
+#include <osmocom/core/stats.h>
#include "coding_scheme.h"
#define GPRS_CODEL_SLOW_INTERVAL_MS 4000
extern void *tall_pcu_ctx;
+static unsigned int next_ms_ctr_group_id;
+
+static const struct rate_ctr_desc ms_ctr_description[] = {
+ [MS_CTR_DL_CTRL_MSG_SCHED] = { "ms:dl_ctrl_msg_sched", "Amount of DL CTRL messages scheduled" },
+};
+
+const struct rate_ctr_group_desc ms_ctrg_desc = {
+ .group_name_prefix = "pcu:ms",
+ .group_description = "MS Statistics",
+ .class_id = OSMO_STATS_CLASS_SUBSCRIBER,
+ .num_ctr = ARRAY_SIZE(ms_ctr_description),
+ .ctr_desc = ms_ctr_description,
+};
static int64_t now_msec()
{
@@ -118,7 +132,15 @@ struct GprsMs *ms_alloc(struct BTS *bts, uint32_t tlli)
}
ms->last_cs_not_low = now_msec();
ms->app_info_pending = false;
+
+ ms->ctrs = rate_ctr_group_alloc(ms, &ms_ctrg_desc, next_ms_ctr_group_id++);
+ if (!ms->ctrs)
+ goto free_ret;
+
return ms;
+free_ret:
+ talloc_free(ms);
+ return NULL;
}
static int ms_talloc_destructor(struct GprsMs *ms)
@@ -148,6 +170,9 @@ static int ms_talloc_destructor(struct GprsMs *ms)
}
llc_queue_clear(&ms->llc_queue, ms->bts);
+
+ if (ms->ctrs)
+ rate_ctr_group_free(ms->ctrs);
return 0;
}
diff --git a/src/gprs_ms.h b/src/gprs_ms.h
index ade3f3ba..6391f726 100644
--- a/src/gprs_ms.h
+++ b/src/gprs_ms.h
@@ -34,6 +34,7 @@ extern "C" {
#include <osmocom/core/timer.h>
#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/rate_ctr.h>
#include <osmocom/gsm/protocol/gsm_23_003.h>
#include <osmocom/gsm/gsm48.h>
@@ -44,6 +45,10 @@ extern "C" {
#include <stddef.h>
#include <inttypes.h>
+enum ms_counter_id {
+ MS_CTR_DL_CTRL_MSG_SCHED,
+};
+
struct BTS;
struct gprs_rlcmac_trx;
struct GprsMs;
@@ -94,7 +99,7 @@ struct GprsMs {
struct gprs_codel *codel_state;
enum mcs_kind mode;
- unsigned dl_ctrl_msg;
+ struct rate_ctr_group *ctrs;
};
struct GprsMs *ms_alloc(struct BTS *bts, uint32_t tlli);
@@ -215,16 +220,6 @@ static inline unsigned ms_nack_rate_dl(const struct GprsMs *ms)
return ms->nack_rate_dl;
}
-static inline unsigned ms_dl_ctrl_msg(const struct GprsMs *ms)
-{
- return ms->dl_ctrl_msg;
-}
-
-static inline void ms_update_dl_ctrl_msg(struct GprsMs *ms)
-{
- ms->dl_ctrl_msg++;
-}
-
static inline uint8_t ms_reserved_dl_slots(const struct GprsMs *ms)
{
return ms->reserved_dl_slots;
diff --git a/src/gprs_rlcmac_sched.cpp b/src/gprs_rlcmac_sched.cpp
index d7958c4c..924a4dea 100644
--- a/src/gprs_rlcmac_sched.cpp
+++ b/src/gprs_rlcmac_sched.cpp
@@ -233,8 +233,7 @@ static struct msgb *sched_select_ctrl_msg(
LOGP(DRLCMACSCHED, LOGL_DEBUG, "Scheduling control "
"message at RTS for %s (TRX=%d, TS=%d)\n",
tbf_name(tbf), trx, ts);
- /* Updates the dl ctrl msg counter for ms */
- ms_update_dl_ctrl_msg(tbf->ms());
+ rate_ctr_inc(&tbf->ms()->ctrs->ctr[MS_CTR_DL_CTRL_MSG_SCHED]);
return msg;
}
diff --git a/src/pcu_vty_functions.cpp b/src/pcu_vty_functions.cpp
index 6100b136..92be77be 100644
--- a/src/pcu_vty_functions.cpp
+++ b/src/pcu_vty_functions.cpp
@@ -175,8 +175,6 @@ static int show_ms(struct vty *vty, GprsMs *ms)
vty_out(vty, " MS I level (slot %d): %d dB%s",
i, ms->l1_meas.ts[i].ms_i_level, VTY_NEWLINE);
}
- vty_out(vty, " RLC/MAC DL Control Msg: %d%s", ms_dl_ctrl_msg(ms),
- VTY_NEWLINE);
if (ms_ul_tbf(ms))
vty_out(vty, " Uplink TBF: TFI=%d, state=%s%s",
ms_ul_tbf(ms)->tfi(),
@@ -201,6 +199,7 @@ static int show_ms(struct vty *vty, GprsMs *ms)
tbf->state_name(),
VTY_NEWLINE);
}
+ vty_out_rate_ctr_group(vty, " ", ms->ctrs);
return CMD_SUCCESS;
}