aboutsummaryrefslogtreecommitdiffstats
path: root/src/gprs_ms.cpp
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2015-06-04 12:12:32 +0200
committerJacob Erlbeck <jerlbeck@sysmocom.de>2015-06-08 09:40:09 +0200
commit1751c62c980f8d6ed965e08fcb9ad1af485d8854 (patch)
tree80b46ca4327c0902778eb3fd62e4c751af866f98 /src/gprs_ms.cpp
parentf47f68a9d8e4421398e2369e4b18de8c52a9d396 (diff)
tbf: Add adaptive DL CS adjustment
To cope with transmission failures due to bad radio conditions, a different coding scheme with more redundance can be used. This commit adds an implemenation that is based on the Ack/Nack ratio per PACKET DOWNLINK ACK/NACK message received from the MS. Basically the CS level is decreased, if the block error rate goes above cs_adj_upper_limit (default 33%), and it is increased, if the rate drops below cs_adj_lower_limit (default 10%). Only blocks that have been encoded with the current CS are taken into account. Note that this approach doesn't measure the MS->BTS conditions and that the measurement values reported by the MS are not taken into account. Ticket: #1739 Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/gprs_ms.cpp')
-rw-r--r--src/gprs_ms.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/gprs_ms.cpp b/src/gprs_ms.cpp
index dc8783c4..f5924fd8 100644
--- a/src/gprs_ms.cpp
+++ b/src/gprs_ms.cpp
@@ -351,3 +351,39 @@ void GprsMs::set_ms_class(uint8_t ms_class_)
m_ms_class = ms_class_;
}
+void GprsMs::update_error_rate(gprs_rlcmac_tbf *tbf, int error_rate)
+{
+ struct gprs_rlcmac_bts *bts_data;
+
+ OSMO_ASSERT(m_bts != NULL);
+ bts_data = m_bts->bts_data();
+
+ if (error_rate < 0)
+ return;
+
+ /* TODO: Support different CS values for UL and DL */
+
+ if (error_rate > bts_data->cs_adj_upper_limit) {
+ if (m_current_cs_dl > 1) {
+ m_current_cs_dl -= 1;
+ m_current_cs_ul = m_current_cs_dl;
+ LOGP(DRLCMACDL, LOGL_INFO,
+ "MS (IMSI %s): High error rate %d%%, "
+ "reducing CS level to %d\n",
+ imsi(), error_rate, m_current_cs_dl);
+ }
+ } else if (error_rate < bts_data->cs_adj_lower_limit) {
+ if (m_current_cs_dl < 4) {
+ m_current_cs_dl += 1;
+ m_current_cs_ul = m_current_cs_dl;
+ LOGP(DRLCMACDL, LOGL_INFO,
+ "MS (IMSI %s): Low error rate %d%%, "
+ "increasing CS level to %d\n",
+ imsi(), error_rate, m_current_cs_dl);
+ }
+ } else {
+ LOGP(DRLCMACDL, LOGL_DEBUG,
+ "MS (IMSI %s): Medium error rate %d%%, ignored\n",
+ imsi(), error_rate);
+ }
+}