forked from cellular-infrastructure/osmo-pcu
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:
parent
be881c028f
commit
7f28c97fcc
|
@ -533,19 +533,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,
|
||||||
|
@ -618,6 +611,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;
|
||||||
|
@ -627,7 +659,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");
|
||||||
|
@ -635,21 +667,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;
|
||||||
|
@ -683,8 +701,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) {
|
||||||
|
@ -706,8 +724,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 */
|
||||||
|
|
Loading…
Reference in New Issue