aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorNeels Hofmeyr <neels@hofmeyr.de>2021-07-05 17:38:28 +0200
committerlaforge <laforge@osmocom.org>2021-07-09 11:51:40 +0000
commit9d4865ecaea5dc17e3058777620d52e8efa4c8a5 (patch)
tree116172ceed098ba7c2f8f652862606640bc2a70e /src
parent7225fe49026bcc8e312ef6e5a2f40f4e385529cf (diff)
hodec2: [2/2] implement automatic choice between FULL and SUBSET measurements
Add TDMA_MEAS_SET_AUTO to indicate automatic choice between FULL and SUBSET measurements depending on DTX. So far use only in hodec2. TDMA_MEAS_SET_AUTO looks at each individual measurement report's DTX flag and for each report chooses FULL if DTX is not used, or SUB if DTX is used. The default setting for 'handover2 tdma-measurement' is still 'subset'. To use the automatic choice, users need configure handover2 tdma-measurement auto Change-Id: I67dce55ccf892c8679272ee5dfedc25620f0f725
Diffstat (limited to 'src')
-rw-r--r--src/osmo-bsc/handover_decision_2.c6
-rw-r--r--src/osmo-bsc/meas_rep.c19
2 files changed, 18 insertions, 7 deletions
diff --git a/src/osmo-bsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c
index 67208fe90..3fa1084e4 100644
--- a/src/osmo-bsc/handover_decision_2.c
+++ b/src/osmo-bsc/handover_decision_2.c
@@ -244,16 +244,14 @@ static struct gsm_meas_rep_cell *cell_in_rep(struct gsm_meas_rep *mr, uint16_t a
static int current_rxlev(struct gsm_lchan *lchan)
{
struct gsm_bts *bts = lchan->ts->trx->bts;
- return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXLEV, TDMA_MEAS_DIR_DL,
- ho_get_hodec2_full_tdma(bts->ho) ? TDMA_MEAS_SET_FULL : TDMA_MEAS_SET_SUB,
+ return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXLEV, TDMA_MEAS_DIR_DL, ho_get_hodec2_tdma_meas_set(bts->ho),
ho_get_hodec2_rxlev_avg_win(bts->ho));
}
static int current_rxqual(struct gsm_lchan *lchan)
{
struct gsm_bts *bts = lchan->ts->trx->bts;
- return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXQUAL, TDMA_MEAS_DIR_DL,
- ho_get_hodec2_full_tdma(bts->ho) ? TDMA_MEAS_SET_FULL : TDMA_MEAS_SET_SUB,
+ return get_meas_rep_avg(lchan, TDMA_MEAS_FIELD_RXQUAL, TDMA_MEAS_DIR_DL, ho_get_hodec2_tdma_meas_set(bts->ho),
ho_get_hodec2_rxqual_avg_win(bts->ho));
}
diff --git a/src/osmo-bsc/meas_rep.c b/src/osmo-bsc/meas_rep.c
index 97c30ac1a..776c610df 100644
--- a/src/osmo-bsc/meas_rep.c
+++ b/src/osmo-bsc/meas_rep.c
@@ -81,8 +81,14 @@ unsigned int calc_initial_idx(unsigned int array_size,
}
static inline enum meas_rep_field choose_meas_rep_field(enum tdma_meas_field field, enum tdma_meas_dir dir,
- enum tdma_meas_set set)
+ enum tdma_meas_set set, const struct gsm_meas_rep *meas_rep)
{
+ if (set == TDMA_MEAS_SET_AUTO) {
+ bool dtx_in_use;
+ dtx_in_use = (meas_rep->flags & ((dir == TDMA_MEAS_DIR_UL) ? MEAS_REP_F_UL_DTX : MEAS_REP_F_DL_DTX));
+ set = (dtx_in_use ? TDMA_MEAS_SET_SUB : TDMA_MEAS_SET_FULL);
+ }
+
osmo_static_assert(TDMA_MEAS_FIELD_RXLEV >= 0 && TDMA_MEAS_FIELD_RXLEV <= 1
&& TDMA_MEAS_FIELD_RXQUAL >= 0 && TDMA_MEAS_FIELD_RXQUAL <= 1
&& TDMA_MEAS_DIR_UL >= 0 && TDMA_MEAS_DIR_UL <= 1
@@ -139,7 +145,7 @@ int get_meas_rep_avg(const struct gsm_lchan *lchan,
enum meas_rep_field use_field;
int val;
- use_field = choose_meas_rep_field(field, dir, set);
+ use_field = choose_meas_rep_field(field, dir, set, &lchan->meas_rep[j]);
val = get_field(&lchan->meas_rep[j], use_field);
if (val >= 0) {
@@ -170,7 +176,7 @@ int meas_rep_n_out_of_m_be(const struct gsm_lchan *lchan,
enum meas_rep_field use_field;
int val;
- use_field = choose_meas_rep_field(field, dir, set);
+ use_field = choose_meas_rep_field(field, dir, set, &lchan->meas_rep[j]);
val = get_field(&lchan->meas_rep[j], use_field);
if (val >= be) /* implies that val < 0 will not count */
@@ -182,3 +188,10 @@ int meas_rep_n_out_of_m_be(const struct gsm_lchan *lchan,
return 0;
}
+
+const struct value_string tdma_meas_set_names[] = {
+ { TDMA_MEAS_SET_FULL, "full" },
+ { TDMA_MEAS_SET_SUB, "subset" },
+ { TDMA_MEAS_SET_AUTO, "auto" },
+ {}
+};