diff options
author | Neels Hofmeyr <neels@hofmeyr.de> | 2021-07-05 17:38:28 +0200 |
---|---|---|
committer | laforge <laforge@osmocom.org> | 2021-07-09 11:51:40 +0000 |
commit | 9d4865ecaea5dc17e3058777620d52e8efa4c8a5 (patch) | |
tree | 116172ceed098ba7c2f8f652862606640bc2a70e /src | |
parent | 7225fe49026bcc8e312ef6e5a2f40f4e385529cf (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.c | 6 | ||||
-rw-r--r-- | src/osmo-bsc/meas_rep.c | 19 |
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" }, + {} +}; |