diff options
author | Vadim Yanitskiy <vyanitskiy@sysmocom.de> | 2021-10-07 18:32:23 +0600 |
---|---|---|
committer | fixeria <vyanitskiy@sysmocom.de> | 2021-10-08 10:48:51 +0000 |
commit | e73516ed00fb3ba34de3dc363c885125585e3381 (patch) | |
tree | bee237218de8693a0c76fe85b6f11b2fe38b7af3 | |
parent | 7726d2332713023a1e7b58bd5837e20160b029df (diff) |
rsl_tx_rf_res(): separate interference AVG / band calculation
It's cleaner from the architectural point of view to have the
interference measurements processed in a separate function.
Change-Id: I3981608e01a50585359cad673c38c8a305027d30
Related: SYS#5313
-rw-r--r-- | include/osmo-bts/lchan.h | 4 | ||||
-rw-r--r-- | src/common/l1sap.c | 29 | ||||
-rw-r--r-- | src/common/lchan.c | 8 | ||||
-rw-r--r-- | src/common/rsl.c | 20 |
4 files changed, 43 insertions, 18 deletions
diff --git a/include/osmo-bts/lchan.h b/include/osmo-bts/lchan.h index fdb3144c..8fcf36aa 100644 --- a/include/osmo-bts/lchan.h +++ b/include/osmo-bts/lchan.h @@ -226,8 +226,10 @@ struct gsm_lchan { uint16_t toa256_std_dev; } ext; /* Interference levels reported by PHY (in dBm) */ + int16_t interf_meas_avg_dbm; /* Average value */ int16_t interf_meas_dbm[31]; /* Intave max is 31 */ uint8_t interf_meas_num; + uint8_t interf_band; } meas; struct { struct amr_multirate_conf amr_mr; @@ -341,7 +343,7 @@ uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan, enum gsm_phys_chan_config as_pchan); void gsm_lchan_interf_meas_push(struct gsm_lchan *lchan, int dbm); -int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan); +void gsm_lchan_interf_meas_calc_avg(struct gsm_lchan *lchan); int lchan2ecu_codec(const struct gsm_lchan *lchan); diff --git a/src/common/l1sap.c b/src/common/l1sap.c index a48287c5..5c58aff7 100644 --- a/src/common/l1sap.c +++ b/src/common/l1sap.c @@ -591,6 +591,29 @@ static unsigned int calc_exprd_rach_frames(struct gsm_bts *bts, uint32_t fn) return rach_frames_expired; } +static void l1sap_interf_meas_calc_avg(struct gsm_bts_trx *trx) +{ + unsigned int tn, ln; + + for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++) { + struct gsm_bts_trx_ts *ts = &trx->ts[tn]; + + for (ln = 0; ln < ARRAY_SIZE(ts->lchan); ln++) { + struct gsm_lchan *lchan = &ts->lchan[ln]; + + lchan->meas.interf_meas_avg_dbm = 0; + lchan->meas.interf_band = 0; + + /* There must be at least one sample */ + if (lchan->meas.interf_meas_num == 0) + continue; + + /* Average all collected samples */ + gsm_lchan_interf_meas_calc_avg(lchan); + } + } +} + static void l1sap_interf_meas_report(struct gsm_bts *bts) { const uint32_t period = bts->interference.intave * 104; @@ -601,8 +624,12 @@ static void l1sap_interf_meas_report(struct gsm_bts *bts) if (bts->gsm_time.fn % period != 0) return; - llist_for_each_entry(trx, &bts->trx_list, list) + llist_for_each_entry(trx, &bts->trx_list, list) { + /* Calculate the average of all received samples */ + l1sap_interf_meas_calc_avg(trx); + /* Report to the BSC over the A-bis/RSL */ rsl_tx_rf_res(trx); + } } /* time information received from bts model */ diff --git a/src/common/lchan.c b/src/common/lchan.c index 10a375e7..f7ee33bb 100644 --- a/src/common/lchan.c +++ b/src/common/lchan.c @@ -348,15 +348,14 @@ void gsm_lchan_interf_meas_push(struct gsm_lchan *lchan, int dbm) } /* Called by the higher layers every Intave * 104 TDMA frames */ -int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan) +void gsm_lchan_interf_meas_calc_avg(struct gsm_lchan *lchan) { const uint8_t meas_num = lchan->meas.interf_meas_num; const struct gsm_bts *bts = lchan->ts->trx->bts; int b, meas_avg, meas_sum = 0; /* There must be at least one sample */ - if (meas_num == 0) - return -EAGAIN; + OSMO_ASSERT(meas_num > 0); /* Calculate the sum of all collected samples (in -x dBm) */ while (lchan->meas.interf_meas_num) { @@ -377,7 +376,8 @@ int gsm_lchan_interf_meas_calc_band(struct gsm_lchan *lchan) "Interference AVG: %ddBm (band %d, samples %u)\n", meas_avg, b, meas_num); - return b; + lchan->meas.interf_meas_avg_dbm = meas_avg; + lchan->meas.interf_band = b; } /* determine the ECU codec constant for the codec used by given lchan */ diff --git a/src/common/rsl.c b/src/common/rsl.c index 229a2afc..e4531aa1 100644 --- a/src/common/rsl.c +++ b/src/common/rsl.c @@ -440,29 +440,25 @@ int rsl_tx_rf_res(struct gsm_bts_trx *trx) uint8_t *len = msgb_tl_put(nmsg, RSL_IE_RESOURCE_INFO); for (tn = 0; tn < ARRAY_SIZE(trx->ts); tn++) { - struct gsm_bts_trx_ts *ts = &trx->ts[tn]; + const struct gsm_bts_trx_ts *ts = &trx->ts[tn]; for (ln = 0; ln < ARRAY_SIZE(ts->lchan); ln++) { - struct gsm_lchan *lchan = &ts->lchan[ln]; + const struct gsm_lchan *lchan = &ts->lchan[ln]; + + /* No average interference value => no band */ + if (lchan->meas.interf_meas_avg_dbm == 0) + continue; /* We're not interested in active lchans */ - if (lchan->state == LCHAN_S_ACTIVE) { - /* Avoid potential buffer overflow */ - lchan->meas.interf_meas_num = 0; + if (lchan->state == LCHAN_S_ACTIVE) continue; - } /* Only for GSM_LCHAN_{SDCCH,TCH_F,TCH_H} */ if (!lchan_is_dcch(lchan)) continue; - /* Average all collected samples */ - int band = gsm_lchan_interf_meas_calc_band(lchan); - if (band < 0) - continue; - msgb_v_put(nmsg, gsm_lchan2chan_nr_rsl(lchan)); - msgb_v_put(nmsg, (band & 0x07) << 5); + msgb_v_put(nmsg, (lchan->meas.interf_band & 0x07) << 5); } } |