aboutsummaryrefslogtreecommitdiffstats
path: root/src/rlc.cpp
diff options
context:
space:
mode:
authorJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-03 18:31:19 +0100
committerJacob Erlbeck <jerlbeck@sysmocom.de>2016-02-08 00:45:39 +0100
commitfbd82e4e9f38ed6885e94ccf8d0297bba65b50de (patch)
tree86525081883cdc40473bdb0130cd1ba170e92882 /src/rlc.cpp
parentb55f31373554394092bb923acca723cc7808cd49 (diff)
rlc: Add gprs_rlc_mcs_cps_decode
To access EGPRS data blocks, the optional padding must be taken into account. Whether padding has been used must be dervied from the CPS field in the header of the RLC EGPRS data message. Add this function to decode the CPS value and extract that information. Sponsored-by: On-Waves ehf
Diffstat (limited to 'src/rlc.cpp')
-rw-r--r--src/rlc.cpp29
1 files changed, 29 insertions, 0 deletions
diff --git a/src/rlc.cpp b/src/rlc.cpp
index ca12e919..79d8f48a 100644
--- a/src/rlc.cpp
+++ b/src/rlc.cpp
@@ -356,3 +356,32 @@ unsigned int gprs_rlc_mcs_cps(GprsCodingScheme cs, int punct, int punct2,
return -1;
}
+
+void gprs_rlc_mcs_cps_decode(unsigned int cps,
+ GprsCodingScheme cs, int *punct, int *punct2, int *with_padding)
+{
+ *punct2 = -1;
+ *with_padding = 0;
+
+ switch (GprsCodingScheme::Scheme(cs)) {
+ case GprsCodingScheme::MCS1:
+ cps -= 0b1011; *punct = cps % 2; break;
+ case GprsCodingScheme::MCS2:
+ cps -= 0b1001; *punct = cps % 2; break;
+ case GprsCodingScheme::MCS3:
+ cps -= 0b0011; *punct = cps % 3; *with_padding = cps >= 3; break;
+ case GprsCodingScheme::MCS4:
+ cps -= 0b0000; *punct = cps % 3; break;
+ case GprsCodingScheme::MCS5:
+ cps -= 0b100; *punct = cps % 2; break;
+ case GprsCodingScheme::MCS6:
+ cps -= 0b000; *punct = cps % 2; *with_padding = cps >= 2; break;
+ case GprsCodingScheme::MCS7:
+ cps -= 0b10100; *punct = cps / 3; *punct2 = cps % 3; break;
+ case GprsCodingScheme::MCS8:
+ cps -= 0b01011; *punct = cps / 3; *punct2 = cps % 3; break;
+ case GprsCodingScheme::MCS9:
+ cps -= 0b00000; *punct = cps / 4; *punct2 = cps % 3; break;
+ default: ;
+ }
+}