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. mode (static|dyn-bts) [reset]
. l. bs-power (static|dyn-max) <0-30> . l. bs-power (static|dyn-max) <0-30>
. lv ctrl-interval <0-31>
. lv step-size inc <2-6> red <2-4> . lv step-size inc <2-6> red <2-4>
. lv rxlev-thresh lower <0-63> upper <0-63> . lv rxlev-thresh lower <0-63> upper <0-63>
. lv rxqual-thresh lower <0-7> upper <0-7> . 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 and a fixed power reduction value in `static` mode. In the later case, no
attenuation (0 dB) is applied by default (full power). 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 ==== Power change step size
In order to slow down the reactivity of the power control loop and thus make it more 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). <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. <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: // TODO: Document other power control parameters:
// OsmoBSC(config-net-bts)# ms max power <0-40> // OsmoBSC(config-net-bts)# ms max power <0-40>
// OsmoBSC(config-net-bts-trx)# max_power_red <0-100> // 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 inc_step_size_db; /* increasing direction */
uint8_t red_step_size_db; /* reducing 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 */ /* Measurement averaging parameters for RxLev & RxQual */
struct gsm_power_ctrl_meas_params rxqual_meas; struct gsm_power_ctrl_meas_params rxqual_meas;
struct gsm_power_ctrl_meas_params rxlev_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) if (cp->dir == GSM_PWR_CTRL_DIR_DL)
cfg_out(" bs-power dyn-max %u%s", cp->bs_power_max_db, VTY_NEWLINE); 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", cfg_out(" step-size inc %u red %u%s",
cp->inc_step_size_db, cp->red_step_size_db, cp->inc_step_size_db, cp->red_step_size_db,
VTY_NEWLINE); VTY_NEWLINE);
@ -4938,6 +4940,21 @@ DEFUN_USRATTR(cfg_power_ctrl_bs_power,
return CMD_SUCCESS; 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, DEFUN_USRATTR(cfg_power_ctrl_step_size,
cfg_power_ctrl_step_size_cmd, cfg_power_ctrl_step_size_cmd,
X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | 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_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_mode_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_bs_power_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_step_size_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_cmd); install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxlev_thresh_cmd);
install_element(POWER_CTRL_NODE, &cfg_power_ctrl_rxqual_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->p4 = cp->rxqual_meas.upper_cmp_p & 0x1f;
thresh_comp->n4 = cp->rxqual_meas.upper_cmp_n & 0x1f; thresh_comp->n4 = cp->rxqual_meas.upper_cmp_n & 0x1f;
/* FIXME: TIMER_PWR_CON_INTERVAL (P_Con_INTERVAL) */ /* Minimum interval between power level changes (P_CON_INTERVAL) */
thresh_comp->pc_interval = 0; /* 0 .. 30 seconds */ thresh_comp->pc_interval = cp->ctrl_interval;
/* Change step limitations: POWER_{INC,RED}_STEP_SIZE */ /* Change step limitations: POWER_{INC,RED}_STEP_SIZE */
thresh_comp->inc_step_size = cp->inc_step_size_db & 0x0f; 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. mode (static|dyn-bts) [reset]
. l. bs-power (static|dyn-max) <0-30> . l. bs-power (static|dyn-max) <0-30>
. lv ctrl-interval <0-31>
. lv step-size inc <2-6> red <2-4> . lv step-size inc <2-6> red <2-4>
. lv rxlev-thresh lower <0-63> upper <0-63> . lv rxlev-thresh lower <0-63> upper <0-63>
. lv rxqual-thresh lower <0-7> upper <0-7> . lv rxqual-thresh lower <0-7> upper <0-7>
@ -83,12 +84,23 @@ OsmoBSC(config-bs-power-ctrl)# show running-config
mode dyn-bts mode dyn-bts
... !bs-power ... !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-bs-power-ctrl)# exit
OsmoBSC(config-net-bts)# ms-power-control OsmoBSC(config-net-bts)# ms-power-control
OsmoBSC(config-ms-power-ctrl)# list with-flags OsmoBSC(config-ms-power-ctrl)# list with-flags
... ...
. l. mode (static|dyn-bts) [reset] . l. mode (static|dyn-bts) [reset]
. l. bs-power (static|dyn-max) <0-30> . l. bs-power (static|dyn-max) <0-30>
. lv ctrl-interval <0-31>
. lv step-size inc <2-6> red <2-4> . lv step-size inc <2-6> red <2-4>
. lv rxlev-thresh lower <0-63> upper <0-63> . lv rxlev-thresh lower <0-63> upper <0-63>
. lv rxqual-thresh lower <0-7> upper <0-7> . 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 OsmoBSC(config-ms-power-ctrl)# bs-power dyn-max 30
% This command is only valid for 'bs-power-control' node % 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 OsmoBSC(config-ms-power-ctrl)# step-size inc 5 red 4
% Power change step size must be an even number % Power change step size must be an even number
OsmoBSC(config-ms-power-ctrl)# step-size inc 2 red 3 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 bs-power-control
mode dyn-bts mode dyn-bts
bs-power dyn-max 30 ...
step-size inc 4 red 2 step-size inc 4 red 2
... ...
ms-power-control ms-power-control
mode dyn-bts mode dyn-bts
...
step-size inc 6 red 4 step-size inc 6 red 4
... ...