aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPhilipp Maier <pmaier@sysmocom.de>2017-06-26 12:07:43 +0200
committerHarald Welte <laforge@gnumonks.org>2017-07-10 15:30:59 +0000
commit65db0f5c418841ead1e9b11c0194798edeebaa1a (patch)
treef89e253258874886d9c4d11a12ab9974ad96f4b2 /src
parent9a280eba486cbe11fa4dd763830ff425a7a4702a (diff)
measurement: fix measurment report
The end of the measurement reporting period is not aligned with the SACCH block where the results are reported. The tables that are used to detect the end of the measurement period are therefore wrong. The frame number of the SACCH block must be used and not the TDMA frame number (modulo 104) of the measurement reporing interval. The tables are oriented to the frame number of the first SACCH block, at the beginning of an interval. However, when a SACCH block is received it will always contain the result of the recently passed measurement reporting period. To match the tables, introduce another lookup table to remap each SACCH block that ends to the matching beginning block number. Change-Id: I1eef894e6f15b4449fc8926bebb118624efc7924
Diffstat (limited to 'src')
-rw-r--r--src/common/measurement.c89
1 files changed, 65 insertions, 24 deletions
diff --git a/src/common/measurement.c b/src/common/measurement.c
index dba35435..3b32bf2d 100644
--- a/src/common/measurement.c
+++ b/src/common/measurement.c
@@ -23,18 +23,27 @@
* 6 6 and 7 78 to 77 90, 12, 38, 64
* 7 6 and 7 91 to 90 103, 25, 51, 77 */
-/* measurement period ends at fn % 104 == ? */
static const uint8_t tchf_meas_rep_fn104[] = {
- [0] = 103,
- [1] = 12,
- [2] = 25,
- [3] = 38,
- [4] = 51,
- [5] = 64,
- [6] = 77,
- [7] = 90,
+ [0] = 90,
+ [1] = 103,
+ [2] = 12,
+ [3] = 25,
+ [4] = 38,
+ [5] = 51,
+ [6] = 64,
+ [7] = 77,
};
static const uint8_t tchh0_meas_rep_fn104[] = {
+ [0] = 90,
+ [1] = 90,
+ [2] = 12,
+ [3] = 12,
+ [4] = 38,
+ [5] = 38,
+ [6] = 64,
+ [7] = 64,
+};
+static const uint8_t tchh1_meas_rep_fn104[] = {
[0] = 103,
[1] = 103,
[2] = 25,
@@ -44,16 +53,6 @@ static const uint8_t tchh0_meas_rep_fn104[] = {
[6] = 77,
[7] = 77,
};
-static const uint8_t tchh1_meas_rep_fn104[] = {
- [0] = 12,
- [1] = 12,
- [2] = 38,
- [3] = 38,
- [4] = 64,
- [5] = 64,
- [6] = 90,
- [7] = 90,
-};
/* Measurment reporting period for SDCCH8 and SDCCH4 chan
* As per in 3GPP TS 45.008, section 8.4.2.
@@ -86,6 +85,46 @@ static const uint8_t sdcch4_meas_rep_fn102[] = {
[3] = 36 + 18
};
+/* Note: The reporting of the measurement results is done via the SACCH channel.
+ * The measurement interval is not alligned with the interval in which the
+ * SACCH is tranmitted. When we receive the measurement indication with the
+ * SACCH block, the coresponding measurement interval will already have ended
+ * and we will get the results late, but on spot with the beginning of the
+ * next measurement interval.
+ *
+ * For example: We get a measurement indication on FN%104=38 in TS=2. Then we
+ * will have to look at 3GPP TS 45.008, secton 8.4.1 (or 3GPP TS 05.02 Clause 7
+ * Table 1 of 9) what value we need to feed into the lookup tables in order to
+ * detect the measurement period ending. In this example the "real" ending
+ * was on FN%104=12. This is the value we have to look for in
+ * tchf_meas_rep_fn104 to know that a measurement period has just ended. */
+
+/* See also 3GPP TS 05.02 Clause 7 Table 1 of 9:
+ * Mapping of logical channels onto physical channels (see subclauses 6.3, 6.4, 6.5) */
+static uint8_t translate_tch_meas_rep_fn104(uint8_t fn_mod)
+{
+ switch (fn_mod) {
+ case 25:
+ return 103;
+ case 38:
+ return 12;
+ case 51:
+ return 25;
+ case 64:
+ return 38;
+ case 77:
+ return 51;
+ case 90:
+ return 64;
+ case 103:
+ return 77;
+ case 12:
+ return 90;
+ }
+
+ /* Invalid / not of interest */
+ return 0;
+}
/* determine if a measurement period ends at the given frame number */
static int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn)
@@ -102,12 +141,12 @@ static int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn)
switch (pchan) {
case GSM_PCHAN_TCH_F:
- fn_mod = fn % 104;
+ fn_mod = translate_tch_meas_rep_fn104(fn % 104);
if (tchf_meas_rep_fn104[lchan->ts->nr] == fn_mod)
rc = 1;
break;
case GSM_PCHAN_TCH_H:
- fn_mod = fn % 104;
+ fn_mod = translate_tch_meas_rep_fn104(fn % 104);
if (lchan->nr == 0)
tbl = tchh0_meas_rep_fn104;
else
@@ -132,9 +171,11 @@ static int is_meas_complete(struct gsm_lchan *lchan, uint32_t fn)
break;
}
- DEBUGP(DMEAS,
- "%s meas period end fn:%u, fn_mod:%i, status:%d, pchan:%s\n",
- gsm_lchan_name(lchan), fn, fn_mod, rc, gsm_pchan_name(pchan));
+ if (rc == 1) {
+ DEBUGP(DMEAS,
+ "%s meas period end fn:%u, fn_mod:%i, status:%d, pchan:%s\n",
+ gsm_lchan_name(lchan), fn, fn_mod, rc, gsm_pchan_name(pchan));
+ }
return rc;
}