aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVadim Yanitskiy <vyanitskiy@sysmocom.de>2021-10-07 18:32:23 +0600
committerfixeria <vyanitskiy@sysmocom.de>2021-10-08 10:48:51 +0000
commite73516ed00fb3ba34de3dc363c885125585e3381 (patch)
treebee237218de8693a0c76fe85b6f11b2fe38b7af3
parent7726d2332713023a1e7b58bd5837e20160b029df (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.h4
-rw-r--r--src/common/l1sap.c29
-rw-r--r--src/common/lchan.c8
-rw-r--r--src/common/rsl.c20
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);
}
}