aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAndreas Eversberg <jolly@eversberg.eu>2013-06-01 16:46:39 +0200
committerNeels Hofmeyr <neels@hofmeyr.de>2018-01-12 03:28:14 +0100
commit2482975a203f4c3355d16a26deca99cd020199af (patch)
tree15e1276a9856f188726f7498ba8a4d984955d80b /src
parent2e1ae77540a32ca7aba7837680209fa90426ea0c (diff)
HO: Count the actual meas.rep. get_meas_rep_avg fails if not reached
get_meas_rep_avg will return -EINVAL, if the required number of measurements are not reached. There will be no handover possible until the given number of measurements are available. Change-Id: Ibc4410b4e162cdb6c070128d2c63946bb79d6d65
Diffstat (limited to 'src')
-rw-r--r--src/libbsc/abis_rsl.c1
-rw-r--r--src/libbsc/chan_alloc.c4
-rw-r--r--src/libbsc/meas_rep.c6
3 files changed, 10 insertions, 1 deletions
diff --git a/src/libbsc/abis_rsl.c b/src/libbsc/abis_rsl.c
index cb2828753..aa72d2ea5 100644
--- a/src/libbsc/abis_rsl.c
+++ b/src/libbsc/abis_rsl.c
@@ -1465,6 +1465,7 @@ static int rsl_rx_meas_res(struct msgb *msg)
memset(mr, 0, sizeof(*mr));
mr->lchan = msg->lchan;
+ mr->lchan->meas_rep_cnt++;
rsl_tlv_parse(&tp, dh->data, msgb_l2len(msg)-sizeof(*dh));
diff --git a/src/libbsc/chan_alloc.c b/src/libbsc/chan_alloc.c
index 07248fb23..1566becf3 100644
--- a/src/libbsc/chan_alloc.c
+++ b/src/libbsc/chan_alloc.c
@@ -347,6 +347,10 @@ struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type,
gsm_ts_and_pchan_name(lchan->ts),
lchan->nr, gsm_lchant_name(lchan->type));
+ /* reset measurement report counter and index */
+ lchan->meas_rep_cnt = 0;
+ lchan->meas_rep_idx = 0;
+
/* clear sapis */
memset(lchan->sapis, 0, ARRAY_SIZE(lchan->sapis));
diff --git a/src/libbsc/meas_rep.c b/src/libbsc/meas_rep.c
index cb8379e0b..b62d242ad 100644
--- a/src/libbsc/meas_rep.c
+++ b/src/libbsc/meas_rep.c
@@ -19,6 +19,7 @@
*
*/
+#include <errno.h>
#include <osmocom/bsc/gsm_data.h>
#include <osmocom/bsc/meas_rep.h>
@@ -75,7 +76,10 @@ int get_meas_rep_avg(const struct gsm_lchan *lchan,
int avg = 0;
if (num < 1)
- return 0;
+ return -EINVAL;
+
+ if (num > lchan->meas_rep_cnt)
+ return -EINVAL;
idx = calc_initial_idx(ARRAY_SIZE(lchan->meas_rep),
lchan->meas_rep_idx, num);