aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2021-10-04 17:25:11 +0200
committerpespin <pespin@sysmocom.de>2021-10-07 10:47:00 +0000
commit3c32cce0870b883663b7d3e8b0f2c313f736ac84 (patch)
tree91c2975c2b4d5e56e1ea0baec3fdb4fe726d2acb
parent77e014f0612960c1b2cf04401a726362cae962c4 (diff)
MS Power Control Loop: Use P_CON_INTERVAL=2 by default
Have a more stable loop with less temporary oscillations at the expense of increased reaction time. 4 SACCH blocks (P_CON_INTERVAL=2) is the minimum interval to get stable measurements for the last requested MS Power level. With P_CON_INTERVAL=1, are also made during a period with stable power being use to transmit, but the MS Power level used (and announced in MR) is not the last one requested by the BTS, but the one requested in the previous loop iteration. This can make the MS and BTS bounce 2 values forth and back, and create some temporary oscillation. See osmo-bsc User manual section "Power Control" for more information. Related: SYS#5371 Change-Id: I91c505447f68714239a4f033d4f06e91893df201
-rw-r--r--include/osmo-bts/gsm_data.h1
-rw-r--r--src/common/bts.c4
-rw-r--r--src/common/gsm_data.c8
-rw-r--r--src/common/rsl.c6
4 files changed, 15 insertions, 4 deletions
diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h
index b73df5f6..8ae36ca1 100644
--- a/include/osmo-bts/gsm_data.h
+++ b/include/osmo-bts/gsm_data.h
@@ -223,6 +223,7 @@ struct gsm_power_ctrl_params {
/* Default MS/BS Power Control parameters */
extern const struct gsm_power_ctrl_params power_ctrl_params_def;
+void power_ctrl_params_def_reset(struct gsm_power_ctrl_params *params, bool is_bs_pwr);
/* Measurement pre-processing state */
struct gsm_power_ctrl_meas_proc_state {
diff --git a/src/common/bts.c b/src/common/bts.c
index 191c331c..b226df20 100644
--- a/src/common/bts.c
+++ b/src/common/bts.c
@@ -340,8 +340,8 @@ int bts_init(struct gsm_bts *bts)
bts->rtp_priority = -1;
/* Default (fall-back) MS/BS Power control parameters */
- bts->bs_dpc_params = power_ctrl_params_def;
- bts->ms_dpc_params = power_ctrl_params_def;
+ power_ctrl_params_def_reset(&bts->bs_dpc_params, true);
+ power_ctrl_params_def_reset(&bts->ms_dpc_params, false);
/* configurable via OML */
bts->load.ccch.load_ind_period = 112;
diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c
index 15253280..89a740dd 100644
--- a/src/common/gsm_data.c
+++ b/src/common/gsm_data.c
@@ -680,3 +680,11 @@ const struct gsm_power_ctrl_params power_ctrl_params_def = {
.h_reqt = 6, /* TODO: investigate a reasonable default value */
},
};
+
+void power_ctrl_params_def_reset(struct gsm_power_ctrl_params *params, bool is_bs_pwr)
+{
+ *params = power_ctrl_params_def;
+ if (!is_bs_pwr)
+ /* Trigger loop every fourth SACCH block (1.92s). TS 45.008 sec 4.7.1: */
+ params->ctrl_interval = 2;
+}
diff --git a/src/common/rsl.c b/src/common/rsl.c
index c73b093d..89c3b962 100644
--- a/src/common/rsl.c
+++ b/src/common/rsl.c
@@ -1111,7 +1111,8 @@ static int rsl_rx_meas_preproc_dft(struct gsm_bts_trx *trx, struct msgb *msg)
/* TLV (O) BS Power Parameters IE */
if ((ie = TLVP_GET(&tp, RSL_IE_BS_POWER_PARAM)) != NULL) {
/* Allocate a new chunk and initialize with default values */
- params = talloc_memdup(trx, &power_ctrl_params_def, sizeof(*params));
+ params = talloc(trx, struct gsm_power_ctrl_params);
+ power_ctrl_params_def_reset(params, true);
if (ie->len && parse_power_ctrl_params(params, ie->val, ie->len) == 0) {
/* Initially it points to the global defaults */
@@ -1128,7 +1129,8 @@ static int rsl_rx_meas_preproc_dft(struct gsm_bts_trx *trx, struct msgb *msg)
/* TLV (O) MS Power Parameters IE */
if ((ie = TLVP_GET(&tp, RSL_IE_MS_POWER_PARAM)) != NULL) {
/* Allocate a new chunk and initialize with default values */
- params = talloc_memdup(trx, &power_ctrl_params_def, sizeof(*params));
+ params = talloc(trx, struct gsm_power_ctrl_params);
+ power_ctrl_params_def_reset(params, false);
if (ie->len && parse_power_ctrl_params(params, ie->val, ie->len) == 0) {
/* Initially it points to the global defaults */