aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMax <msuraev@sysmocom.de>2019-03-06 19:03:01 +0100
committerMax <msuraev@sysmocom.de>2019-03-06 20:52:15 +0000
commit8119ecd2db76e5ef8a88ca9b85c8712386991bf7 (patch)
treeefbb4976e3c11cf9f1673f91c8039a31cf361f42
parentd3a0d91a389931a9348074388722293027d2ac7c (diff)
Tighten lqual table limits check
Previously MAX_GPRS_CS was used for both EDGE and GPRS which means that we waste extra memory in GPRS case. It also leads to misleading name. Let's fix this by introducing separate definitions for GPRS and EDGE cases and use them as appropriate in limit checks. Change-Id: I3ae1ee64ec8e80247b8fe669cc79505b4dadf58f
-rw-r--r--src/bts.h6
-rw-r--r--src/gprs_ms.cpp8
-rw-r--r--src/pcu_main.cpp8
3 files changed, 13 insertions, 9 deletions
diff --git a/src/bts.h b/src/bts.h
index 578cece..b83ab4b 100644
--- a/src/bts.h
+++ b/src/bts.h
@@ -45,7 +45,9 @@ extern "C" {
#define LLC_CODEL_DISABLE 0
#define LLC_CODEL_USE_DEFAULT (-1)
-#define MAX_GPRS_CS 9
+
+#define MAX_EDGE_MCS 9
+#define MAX_GPRS_CS 4
/* see bts->gsmtap_categ_mask */
enum pcu_gsmtap_category {
@@ -143,7 +145,7 @@ struct gprs_rlcmac_bts {
uint8_t cs_adj_upper_limit;
uint8_t cs_adj_lower_limit;
struct {int16_t low; int16_t high; } cs_lqual_ranges[MAX_GPRS_CS];
- struct {int16_t low; int16_t high; } mcs_lqual_ranges[MAX_GPRS_CS];
+ struct {int16_t low; int16_t high; } mcs_lqual_ranges[MAX_EDGE_MCS];
uint16_t cs_downgrade_threshold; /* downgrade if less packets left (DL) */
uint16_t ws_base;
uint16_t ws_pdch; /* increase WS by this value per PDCH */
diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp
index 740ef6b..87a35d1 100644
--- a/src/gprs_ms.cpp
+++ b/src/gprs_ms.cpp
@@ -620,7 +620,7 @@ void GprsMs::update_cs_ul(const pcu_l1_meas *meas)
int low;
int high;
GprsCodingScheme new_cs_ul = m_current_cs_ul;
- unsigned current_cs_num = m_current_cs_ul.to_num();
+ uint8_t current_cs_num = m_current_cs_ul.to_num();
bts_data = m_bts->bts_data();
@@ -642,11 +642,13 @@ void GprsMs::update_cs_ul(const pcu_l1_meas *meas)
old_link_qual = meas->link_qual;
if (m_current_cs_ul.isGprs()) {
+ if (current_cs_num > MAX_GPRS_CS)
+ current_cs_num = MAX_GPRS_CS;
low = bts_data->cs_lqual_ranges[current_cs_num-1].low;
high = bts_data->cs_lqual_ranges[current_cs_num-1].high;
} else if (m_current_cs_ul.isEgprs()) {
- if (current_cs_num > MAX_GPRS_CS)
- current_cs_num = MAX_GPRS_CS;
+ if (current_cs_num > MAX_EDGE_MCS)
+ current_cs_num = MAX_EDGE_MCS;
low = bts_data->mcs_lqual_ranges[current_cs_num-1].low;
high = bts_data->mcs_lqual_ranges[current_cs_num-1].high;
} else {
diff --git a/src/pcu_main.cpp b/src/pcu_main.cpp
index fe85160..a0f31d1 100644
--- a/src/pcu_main.cpp
+++ b/src/pcu_main.cpp
@@ -214,10 +214,10 @@ int main(int argc, char *argv[])
bts->cs_adj_enabled = 1;
bts->cs_adj_upper_limit = 33; /* Decrease CS if the error rate is above */
bts->cs_adj_lower_limit = 10; /* Increase CS if the error rate is below */
- bts->max_cs_ul = 4;
- bts->max_cs_dl = 4;
- bts->max_mcs_ul = MAX_GPRS_CS;
- bts->max_mcs_dl = MAX_GPRS_CS;
+ bts->max_cs_ul = MAX_GPRS_CS;
+ bts->max_cs_dl = MAX_GPRS_CS;
+ bts->max_mcs_ul = MAX_EDGE_MCS;
+ bts->max_mcs_dl = MAX_EDGE_MCS;
/* CS-1 to CS-4 */
bts->cs_lqual_ranges[0].low = -256;
bts->cs_lqual_ranges[0].high = 6;