power_control: make P_CON_INTERVAL parameter configurable

Change-Id: I6e0fae81cc60f708e49d5eb8dfc0bbcad926b18f
Related: SYS#4918
This commit is contained in:
Vadim Yanitskiy 2021-02-07 06:00:46 +01:00
parent e1d2691e69
commit ea8d6939e6
5 changed files with 73 additions and 4 deletions

View File

@ -88,6 +88,7 @@ OsmoBSC(config-ms-power-ctrl)# list with-flags
...
. l. mode (static|dyn-bts) [reset]
. l. bs-power (static|dyn-max) <0-30>
. lv ctrl-interval <0-31>
. lv step-size inc <2-6> red <2-4>
. lv rxlev-thresh lower <0-63> upper <0-63>
. lv rxqual-thresh lower <0-7> upper <0-7>
@ -135,6 +136,27 @@ that allows to configure the maximum BS power reduction value in `dyn-bts` mode,
and a fixed power reduction value in `static` mode. In the later case, no
attenuation (0 dB) is applied by default (full power).
==== Power control interval
Having requested a transmit power level, the MS/BS power control loop may optionally
by suspended for a certain number of SACCH multiframes defined by VTY parameter
`ctrl-interval`. Given that SACCH is relatively slow and transmission of a data block
takes 480 ms, suspension allows an observation of the effect of one power control
decision before initiating the next one.
----
OsmoBSC(config-bs-power-ctrl)# ctrl-interval ?
<0-31> P_CON_INTERVAL, in units of 2 SACCH periods (0.96 seconds)
----
By default, the suspension interval is set to 0 for both MS/BS power control loops,
therefore the power control decision is taken every 480 ms (one SACCH block period).
Setting `ctrl-interval` to 1 increases the interval to 960 ms, so basically every
second Uplink SACCH block is skipped; value 2 corresponds to the interval of
1920 ms, so 3/4 received SACCH blocks are skipped.
3GPP TS 45.008 briefly mentiones this parameter in table A.1 (P_Con_INTERVAL).
==== Power change step size
In order to slow down the reactivity of the power control loop and thus make it more
@ -302,7 +324,6 @@ network
<4> Osmocom specific EWMA is applied to RxQual values with smoothing factor = 50% (beta=0.5).
<5> RxQual: Hreqave and Hreqt values: 2 out of 3 SACCH blocks produce an averaged measurement.
// TODO: Document P_Con_INTERVAL (not implemented yet)
// TODO: Document other power control parameters:
// OsmoBSC(config-net-bts)# ms max power <0-40>
// OsmoBSC(config-net-bts-trx)# max_power_red <0-100>

View File

@ -1346,6 +1346,9 @@ struct gsm_power_ctrl_params {
uint8_t inc_step_size_db; /* increasing direction */
uint8_t red_step_size_db; /* reducing direction */
/* Minimum interval between power level changes */
uint8_t ctrl_interval; /* 1 step is 2 SACCH periods */
/* Measurement averaging parameters for RxLev & RxQual */
struct gsm_power_ctrl_meas_params rxqual_meas;
struct gsm_power_ctrl_meas_params rxlev_meas;

View File

@ -957,6 +957,8 @@ static void config_write_power_ctrl(struct vty *vty, unsigned int indent,
if (cp->dir == GSM_PWR_CTRL_DIR_DL)
cfg_out(" bs-power dyn-max %u%s", cp->bs_power_max_db, VTY_NEWLINE);
if (cp->ctrl_interval > 0)
cfg_out(" ctrl-interval %u%s", cp->ctrl_interval, VTY_NEWLINE);
cfg_out(" step-size inc %u red %u%s",
cp->inc_step_size_db, cp->red_step_size_db,
VTY_NEWLINE);
@ -4938,6 +4940,21 @@ DEFUN_USRATTR(cfg_power_ctrl_bs_power,
return CMD_SUCCESS;
}
DEFUN_USRATTR(cfg_power_ctrl_ctrl_interval,
cfg_power_ctrl_ctrl_interval_cmd,
X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |
X(BSC_VTY_ATTR_NEW_LCHAN),
"ctrl-interval <0-31>",
"Set power control interval (for dynamic mode)\n"
"P_CON_INTERVAL, in units of 2 SACCH periods (0.96 seconds)\n")
{
struct gsm_power_ctrl_params *params = vty->index;
params->ctrl_interval = atoi(argv[0]);
return CMD_SUCCESS;
}
DEFUN_USRATTR(cfg_power_ctrl_step_size,
cfg_power_ctrl_step_size_cmd,
X(BSC_VTY_ATTR_VENDOR_SPECIFIC) |
@ -7742,6 +7759,7 @@ int bsc_vty_init(struct gsm_network *network)
install_node(&power_ctrl_node, dummy_config_write);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_mode_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_bs_power_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_ctrl_interval_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_step_size_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxqual_thresh_cmd);

View File

@ -896,8 +896,8 @@ static void enc_power_params(struct msgb *msg, const struct gsm_power_ctrl_param
thresh_comp->p4 = cp->rxqual_meas.upper_cmp_p & 0x1f;
thresh_comp->n4 = cp->rxqual_meas.upper_cmp_n & 0x1f;
/* FIXME: TIMER_PWR_CON_INTERVAL (P_Con_INTERVAL) */
thresh_comp->pc_interval = 0; /* 0 .. 30 seconds */
/* Minimum interval between power level changes (P_CON_INTERVAL) */
thresh_comp->pc_interval = cp->ctrl_interval;
/* Change step limitations: POWER_{INC,RED}_STEP_SIZE */
thresh_comp->inc_step_size = cp->inc_step_size_db & 0x0f;

View File

@ -29,6 +29,7 @@ OsmoBSC(config-bs-power-ctrl)# list with-flags
...
. l. mode (static|dyn-bts) [reset]
. l. bs-power (static|dyn-max) <0-30>
. lv ctrl-interval <0-31>
. lv step-size inc <2-6> red <2-4>
. lv rxlev-thresh lower <0-63> upper <0-63>
. lv rxqual-thresh lower <0-7> upper <0-7>
@ -83,12 +84,23 @@ OsmoBSC(config-bs-power-ctrl)# show running-config
mode dyn-bts
... !bs-power
OsmoBSC(config-bs-power-ctrl)# ctrl-interval 31
OsmoBSC(config-bs-power-ctrl)# show running-config
...
bs-power-control
...
ctrl-interval 31
... !ctrl-interval
ms-power-control
... !ctrl-interval
OsmoBSC(config-bs-power-ctrl)# exit
OsmoBSC(config-net-bts)# ms-power-control
OsmoBSC(config-ms-power-ctrl)# list with-flags
...
. l. mode (static|dyn-bts) [reset]
. l. bs-power (static|dyn-max) <0-30>
. lv ctrl-interval <0-31>
. lv step-size inc <2-6> red <2-4>
. lv rxlev-thresh lower <0-63> upper <0-63>
. lv rxqual-thresh lower <0-7> upper <0-7>
@ -119,6 +131,20 @@ OsmoBSC(config-ms-power-ctrl)# bs-power static 30
OsmoBSC(config-ms-power-ctrl)# bs-power dyn-max 30
% This command is only valid for 'bs-power-control' node
OsmoBSC(config-ms-power-ctrl)# ctrl-interval 2
OsmoBSC(config-ms-power-ctrl)# show running-config
...
bs-power-control
mode dyn-bts
...
ctrl-interval 31
... !ctrl-interval
ms-power-control
mode dyn-bts
...
ctrl-interval 2
... !ctrl-interval
OsmoBSC(config-ms-power-ctrl)# step-size inc 5 red 4
% Power change step size must be an even number
OsmoBSC(config-ms-power-ctrl)# step-size inc 2 red 3
@ -131,11 +157,12 @@ OsmoBSC(config-ms-power-ctrl)# show running-config
...
bs-power-control
mode dyn-bts
bs-power dyn-max 30
...
step-size inc 4 red 2
...
ms-power-control
mode dyn-bts
...
step-size inc 6 red 4
...