diff options
author | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2016-01-19 15:53:30 +0100 |
---|---|---|
committer | Jacob Erlbeck <jerlbeck@sysmocom.de> | 2016-02-08 00:45:36 +0100 |
commit | 36df7740dd7f81fe36d35e808cc53f518f4e360e (patch) | |
tree | c204fcc8e691a99ce2a42eb7b7491bea6248c01c /src/tbf.cpp | |
parent | 08c72fb4a91c267410535be26d2bb399914ff6d4 (diff) |
edge: Make window size configurable
Currently the window size is fixed to 64 even for EGPRS.
Support dynamic window sizes depending on the number of PDCH. The
WS can be set to b + f * N_PDCH. If the result is not valid according
to TS 44.060, Table 9.1.9.2.1, the value will be corrected to use the
next lower valid value (or 64).
The following VTY commands are added (config-pcu node):
window-size <0-1024> set base (b) value and leave f unchanged
window-size <0-1024> <0-256> set base (b) and factor (f)
Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/tbf.cpp')
-rw-r--r-- | src/tbf.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/src/tbf.cpp b/src/tbf.cpp index 9f19c9b7..c852d665 100644 --- a/src/tbf.cpp +++ b/src/tbf.cpp @@ -28,6 +28,7 @@ #include <gprs_bssgp_pcu.h> #include <gprs_ms.h> #include <decoding.h> +#include <pcu_utils.h> extern "C" { #include <osmocom/core/msgb.h> @@ -634,6 +635,7 @@ struct gprs_rlcmac_ul_tbf *tbf_alloc_ul_tbf(struct gprs_rlcmac_bts *bts, if (egprs_ms_class > 0 && bts->egprs_enabled) { tbf->enable_egprs(); tbf->m_window.set_sns(RLC_EGPRS_SNS); + /* TODO: Allow bigger UL windows when CRBB encoding is supported */ tbf->m_window.set_ws(RLC_EGPRS_MIN_WS); setup_egprs_mode(bts, ms); LOGP(DRLCMAC, LOGL_INFO, "Enabled EGPRS for %s, mode %s\n", @@ -714,7 +716,6 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, if (egprs_ms_class > 0 && bts->egprs_enabled) { tbf->enable_egprs(); tbf->m_window.set_sns(RLC_EGPRS_SNS); - tbf->m_window.set_ws(RLC_EGPRS_MIN_WS); setup_egprs_mode(bts, ms); LOGP(DRLCMAC, LOGL_INFO, "Enabled EGPRS for %s, mode %s\n", tbf->name(), GprsCodingScheme::modeName(ms->mode())); @@ -727,6 +728,21 @@ struct gprs_rlcmac_dl_tbf *tbf_alloc_dl_tbf(struct gprs_rlcmac_bts *bts, return NULL; } + if (tbf->is_egprs_enabled()) { + unsigned int num_pdch = pcu_bitcount(tbf->dl_slots()); + unsigned int ws = bts->ws_base + num_pdch * bts->ws_pdch; + ws = (ws / 32) * 32; + ws = OSMO_MAX(64, ws); + if (num_pdch == 1) + ws = OSMO_MIN(192, ws); + else + ws = OSMO_MIN(128 * num_pdch, ws); + + LOGP(DRLCMAC, LOGL_INFO, "%s: Setting EGPRS window size to %d\n", + tbf->name(), ws); + tbf->m_window.set_ws(ws); + } + llist_add(&tbf->list(), &bts->bts->dl_tbfs()); tbf->bts->tbf_dl_created(); |