aboutsummaryrefslogtreecommitdiffstats
path: root/src/tbf_dl.cpp
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2020-10-23 22:37:52 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2020-10-24 22:14:42 +0200
commitb38596903961a8a83615a882a0c65cc24475bae5 (patch)
treef1257b73a23a8b122c994c672e5eb5abd2174967 /src/tbf_dl.cpp
parent442198cd410b19ac29ce384023aeeb74d3aab797 (diff)
Move dl_tbf allocation code to correct file
Diffstat (limited to 'src/tbf_dl.cpp')
-rw-r--r--src/tbf_dl.cpp112
1 files changed, 112 insertions, 0 deletions
diff --git a/src/tbf_dl.cpp b/src/tbf_dl.cpp
index 0d692ccd..b41c161c 100644
--- a/src/tbf_dl.cpp
+++ b/src/tbf_dl.cpp
@@ -43,6 +43,7 @@ extern "C" {
#include <osmocom/core/linuxlist.h>
#include <osmocom/core/logging.h>
#include <osmocom/core/rate_ctr.h>
+ #include <osmocom/core/stats.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/gsm_utils.h>
@@ -56,6 +57,43 @@ extern "C" {
/* After sending these frames, we poll for ack/nack. */
#define POLL_ACK_AFTER_FRAMES 20
+extern void *tall_pcu_ctx;
+
+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_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,
+};
+
static inline void tbf_update_ms_class(struct gprs_rlcmac_tbf *tbf,
const uint8_t ms_class)
{
@@ -85,6 +123,80 @@ gprs_rlcmac_dl_tbf::BandWidth::BandWidth() :
timespecclear(&dl_loss_tv);
}
+static int dl_tbf_dtor(struct gprs_rlcmac_dl_tbf *tbf)
+{
+ tbf->~gprs_rlcmac_dl_tbf();
+ return 0;
+}
+
+struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, GprsMs *ms, int8_t use_trx, bool single_slot)
+{
+ struct gprs_rlcmac_dl_tbf *tbf;
+ int rc;
+
+ OSMO_ASSERT(ms != NULL);
+
+ if (ms->egprs_ms_class() == 0 && bts->egprs_enabled) {
+ if (ms->ms_class() > 0) {
+ LOGP(DTBF, LOGL_NOTICE, "Not accepting non-EGPRS phone in EGPRS-only mode\n");
+ bts->bts->do_rate_ctr_inc(CTR_TBF_FAILED_EGPRS_ONLY);
+ return NULL;
+ }
+ ms->set_egprs_ms_class(1);
+ }
+
+ LOGP(DTBF, LOGL_DEBUG, "********** DL-TBF starts here **********\n");
+ LOGP(DTBF, LOGL_INFO, "Allocating DL TBF: MS_CLASS=%d/%d\n",
+ ms->ms_class(), ms->egprs_ms_class());
+
+ tbf = talloc(tall_pcu_ctx, struct gprs_rlcmac_dl_tbf);
+
+ if (!tbf)
+ return NULL;
+
+ talloc_set_destructor(tbf, dl_tbf_dtor);
+ new (tbf) gprs_rlcmac_dl_tbf(bts->bts, ms);
+
+ rc = tbf->setup(use_trx, single_slot);
+ /* if no resource */
+ if (rc < 0) {
+ talloc_free(tbf);
+ return NULL;
+ }
+
+ if (tbf->is_egprs_enabled()) {
+ tbf->set_window_size();
+ tbf->m_dl_egprs_ctrs = rate_ctr_group_alloc(tbf,
+ &tbf_dl_egprs_ctrg_desc,
+ tbf->m_ctrs->idx);
+ if (!tbf->m_dl_egprs_ctrs) {
+ LOGPTBF(tbf, LOGL_ERROR, "Couldn't allocate EGPRS DL counters\n");
+ talloc_free(tbf);
+ return NULL;
+ }
+ } else {
+ tbf->m_dl_gprs_ctrs = rate_ctr_group_alloc(tbf,
+ &tbf_dl_gprs_ctrg_desc,
+ tbf->m_ctrs->idx);
+ if (!tbf->m_dl_gprs_ctrs) {
+ LOGPTBF(tbf, LOGL_ERROR, "Couldn't allocate GPRS DL counters\n");
+ talloc_free(tbf);
+ return NULL;
+ }
+ }
+
+ llist_add(&tbf->list(), &bts->bts->dl_tbfs());
+ tbf->bts->do_rate_ctr_inc(CTR_TBF_DL_ALLOCATED);
+
+ tbf->m_last_dl_poll_fn = -1;
+ tbf->m_last_dl_drained_fn = -1;
+
+ osmo_clock_gettime(CLOCK_MONOTONIC, &tbf->m_bw.dl_bw_tv);
+ osmo_clock_gettime(CLOCK_MONOTONIC, &tbf->m_bw.dl_loss_tv);
+
+ return tbf;
+}
+
gprs_rlcmac_dl_tbf::gprs_rlcmac_dl_tbf(BTS *bts_, GprsMs *ms) :
gprs_rlcmac_tbf(bts_, ms, GPRS_RLCMAC_DL_TBF),
m_tx_counter(0),