aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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)