aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-06-23 10:53:09 +0200
committerHarald Welte <laforge@gnumonks.org>2018-01-21 19:06:58 +0000
commit83594847a8fa8dee4011000747906f10a09bf652 (patch)
tree9f7484a41ba2d7c258be5c196bdf28c9156aad98 /src
parent935e5d76dd5cc0b023d21ce656436128d5bb635f (diff)
Fix: meas_rep.c will only use valid DL measurement reports
When averaging measurements, only the valid reports are used. If there is no valid report in the averaging window at all, an error is returned. Change-Id: I33056225ead788340755e98113d72e1cbf3ebce6
Diffstat (limited to 'src')
-rw-r--r--src/libbsc/meas_rep.c23
1 files changed, 19 insertions, 4 deletions
diff --git a/src/libbsc/meas_rep.c b/src/libbsc/meas_rep.c
index fbd15156d..73d9a1f21 100644
--- a/src/libbsc/meas_rep.c
+++ b/src/libbsc/meas_rep.c
@@ -29,12 +29,20 @@ static int get_field(const struct gsm_meas_rep *rep,
{
switch (field) {
case MEAS_REP_DL_RXLEV_FULL:
+ if (!(rep->flags & MEAS_REP_F_DL_VALID))
+ return -EINVAL;
return rep->dl.full.rx_lev;
case MEAS_REP_DL_RXLEV_SUB:
+ if (!(rep->flags & MEAS_REP_F_DL_VALID))
+ return -EINVAL;
return rep->dl.sub.rx_lev;
case MEAS_REP_DL_RXQUAL_FULL:
+ if (!(rep->flags & MEAS_REP_F_DL_VALID))
+ return -EINVAL;
return rep->dl.full.rx_qual;
case MEAS_REP_DL_RXQUAL_SUB:
+ if (!(rep->flags & MEAS_REP_F_DL_VALID))
+ return -EINVAL;
return rep->dl.sub.rx_qual;
case MEAS_REP_UL_RXLEV_FULL:
return rep->ul.full.rx_lev;
@@ -73,7 +81,7 @@ int get_meas_rep_avg(const struct gsm_lchan *lchan,
enum meas_rep_field field, unsigned int num)
{
unsigned int i, idx;
- int avg = 0;
+ int avg = 0, valid_num = 0;
if (num < 1)
return -EINVAL;
@@ -86,11 +94,18 @@ int get_meas_rep_avg(const struct gsm_lchan *lchan,
for (i = 0; i < num; i++) {
int j = (idx+i) % ARRAY_SIZE(lchan->meas_rep);
+ int val = get_field(&lchan->meas_rep[j], field);
- avg += get_field(&lchan->meas_rep[j], field);
+ if (val >= 0) {
+ avg += val;
+ valid_num++;
+ }
}
- return avg / num;
+ if (valid_num == 0)
+ return -EINVAL;
+
+ return avg / valid_num;
}
/* Check if N out of M last values for FIELD are >= bd */
@@ -108,7 +123,7 @@ int meas_rep_n_out_of_m_be(const struct gsm_lchan *lchan,
int j = (idx + i) % ARRAY_SIZE(lchan->meas_rep);
int val = get_field(&lchan->meas_rep[j], field);
- if (val >= be)
+ if (val >= be) /* implies that val < 0 will not count */
count++;
if (count >= n)