edge: Support all coding schemes for BSSGP flow control

Currently the MCS schemes are not supported when the leak rate is
being computed. This leads to a lower value for the leak rate, thus
limiting the throughput to GPRS-like ranges.

Use the payload size reported by GprsCodingScheme instead.

Sponsored-by: On-Waves ehf
This commit is contained in:
Jacob Erlbeck 2016-02-04 17:54:42 +01:00
parent 1b313b7a15
commit c3d8bb1c27
1 changed files with 50 additions and 31 deletions

View File

@ -600,19 +600,12 @@ static unsigned count_pdch(const struct gprs_rlcmac_bts *bts)
return num_pdch; return num_pdch;
} }
static uint32_t gprs_bssgp_max_leak_rate(unsigned cs, int num_pdch) static uint32_t gprs_bssgp_max_leak_rate(GprsCodingScheme cs, int num_pdch)
{ {
static const uint32_t max_lr_per_ts[4] = { int bytes_per_rlc_block = cs.maxDataBlockBytes() * cs.numDataBlocks();
20 * (1000 / 20), /* CS-1: 20 byte payload per 20ms */
30 * (1000 / 20), /* CS-2: 30 byte payload per 20ms */
36 * (1000 / 20), /* CS-3: 36 byte payload per 20ms */
50 * (1000 / 20), /* CS-4: 50 byte payload per 20ms */
};
if (cs > ARRAY_SIZE(max_lr_per_ts)) /* n byte payload per 20ms */
cs = 1; return bytes_per_rlc_block * (1000 / 20) * num_pdch;
return max_lr_per_ts[cs-1] * num_pdch;
} }
static uint32_t compute_bucket_size(struct gprs_rlcmac_bts *bts, static uint32_t compute_bucket_size(struct gprs_rlcmac_bts *bts,
@ -685,6 +678,45 @@ static int get_and_reset_measured_leak_rate(int *usage_by_1000, unsigned num_pdc
return rate; return rate;
} }
static GprsCodingScheme max_coding_scheme_dl(struct gprs_rlcmac_bts *bts)
{
int num;
if (bts->egprs_enabled) {
if (!bts->cs_adj_enabled) {
if (bts->initial_mcs_dl)
num = bts->initial_mcs_dl;
else
num = 1;
} else if (bts->max_mcs_dl) {
num = bts->max_mcs_dl;
} else {
num = 9;
}
return GprsCodingScheme::getEgprsByNum(num);
}
if (!bts->cs_adj_enabled) {
if (bts->initial_cs_dl)
num = bts->initial_cs_dl;
else if (bts->cs4)
num = 4;
else if (bts->cs3)
num = 3;
else if (bts->cs2)
num = 2;
else
num = 1;
} else if (bts->max_cs_dl) {
num = bts->max_cs_dl;
} else {
num = 4;
}
return GprsCodingScheme::getGprsByNum(num);
}
int gprs_bssgp_tx_fc_bvc(void) int gprs_bssgp_tx_fc_bvc(void)
{ {
struct gprs_rlcmac_bts *bts; struct gprs_rlcmac_bts *bts;
@ -694,7 +726,7 @@ int gprs_bssgp_tx_fc_bvc(void)
uint32_t ms_leak_rate; /* oct/s */ uint32_t ms_leak_rate; /* oct/s */
uint32_t avg_delay_ms; uint32_t avg_delay_ms;
int num_pdch = -1; int num_pdch = -1;
int max_cs_dl; GprsCodingScheme max_cs_dl;
if (!the_pcu.bctx) { if (!the_pcu.bctx) {
LOGP(DBSSGP, LOGL_ERROR, "No bctx\n"); LOGP(DBSSGP, LOGL_ERROR, "No bctx\n");
@ -702,21 +734,7 @@ int gprs_bssgp_tx_fc_bvc(void)
} }
bts = bts_main_data(); bts = bts_main_data();
if (bts->cs_adj_enabled) { max_cs_dl = max_coding_scheme_dl(bts);
max_cs_dl = bts->max_cs_dl;
if (!max_cs_dl) {
if (bts->cs4)
max_cs_dl = 4;
else if (bts->cs3)
max_cs_dl = 3;
else if (bts->cs2)
max_cs_dl = 2;
else
max_cs_dl = 1;
}
} else {
max_cs_dl = bts->initial_cs_dl;
}
bucket_size = bts->fc_bvc_bucket_size; bucket_size = bts->fc_bvc_bucket_size;
leak_rate = bts->fc_bvc_leak_rate; leak_rate = bts->fc_bvc_leak_rate;
@ -750,8 +768,8 @@ int gprs_bssgp_tx_fc_bvc(void)
leak_rate = gprs_bssgp_max_leak_rate(max_cs_dl, num_pdch); leak_rate = gprs_bssgp_max_leak_rate(max_cs_dl, num_pdch);
LOGP(DBSSGP, LOGL_DEBUG, LOGP(DBSSGP, LOGL_DEBUG,
"Computed BVC leak rate = %d, num_pdch = %d, cs = %d\n", "Computed BVC leak rate = %d, num_pdch = %d, cs = %s\n",
leak_rate, num_pdch, max_cs_dl); leak_rate, num_pdch, max_cs_dl.name());
}; };
if (ms_leak_rate == 0) { if (ms_leak_rate == 0) {
@ -773,8 +791,9 @@ int gprs_bssgp_tx_fc_bvc(void)
* should be derived from the max number of PDCH TS per TRX. * should be derived from the max number of PDCH TS per TRX.
*/ */
LOGP(DBSSGP, LOGL_DEBUG, LOGP(DBSSGP, LOGL_DEBUG,
"Computed MS default leak rate = %d, ms_num_pdch = %d, cs = %d\n", "Computed MS default leak rate = %d, ms_num_pdch = %d, "
ms_leak_rate, ms_num_pdch, max_cs_dl); "cs = %s\n",
ms_leak_rate, ms_num_pdch, max_cs_dl.name());
}; };
/* TODO: Force leak_rate to 0 on buffer bloat */ /* TODO: Force leak_rate to 0 on buffer bloat */