This is merely a historical archive of years 2008-2021, before the migration to mailman3.
A maintained and still updated list archive can be found at https://lists.osmocom.org/hyperkitty/list/gerrit-log@lists.osmocom.org/.
fixeria gerrit-no-reply at lists.osmocom.orgfixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-bsc/+/21685 ) Change subject: vty: add commands for MS/BS Power Control parameters ...................................................................... vty: add commands for MS/BS Power Control parameters Change-Id: Ifd6ea29c3b9dbaccf92856131d5fb2e352b84eb2 Related: SYS#4918 --- M src/osmo-bsc/bsc_vty.c 1 file changed, 353 insertions(+), 0 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/85/21685/1 diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c index c98a254..80cbee0 100644 --- a/src/osmo-bsc/bsc_vty.c +++ b/src/osmo-bsc/bsc_vty.c @@ -4828,6 +4828,346 @@ return CMD_SUCCESS; } +#define BS_POWER_CONTROL_CMD \ + "bs-power-control" +#define MS_POWER_CONTROL_CMD \ + "ms-power-control" +#define POWER_CONTROL_CMD \ + "(" BS_POWER_CONTROL_CMD "|" MS_POWER_CONTROL_CMD ")" + +#define BS_POWER_CONTROL_DESC \ + "BS (Downlink) power control\n" +#define MS_POWER_CONTROL_DESC \ + "MS (Uplink) power control\n" +#define POWER_CONTROL_DESC \ + BS_POWER_CONTROL_DESC MS_POWER_CONTROL_DESC + +#define POWER_CONTROL_PARAMS(trx) \ + (strcmp(argv[0], BS_POWER_CONTROL_CMD) == 0) ? \ + &trx->bs_power_ctrl : &trx->ms_power_ctrl + +DEFUN_USRATTR(cfg_trx_no_power_ctrl, + cfg_trx_no_power_ctrl_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + "no " POWER_CONTROL_CMD, + NO_STR POWER_CONTROL_DESC) +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + + params = POWER_CONTROL_PARAMS(trx); + params->mode = TRX_PWR_CTRL_MODE_NONE; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_mode, + cfg_trx_power_ctrl_mode_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_CMD " mode (static|dyn-bts)", + POWER_CONTROL_DESC "Power control mode\n" + "Instruct the MS/BTS to use a static power level (default)\n" + "Power control to be performed dynamically by the BTS itself\n") +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + + params = POWER_CONTROL_PARAMS(trx); + if (strcmp(argv[1], "static") == 0) + params->mode = TRX_PWR_CTRL_MODE_STATIC; + else if (strcmp(argv[1], "dyn-bts") == 0) + params->mode = TRX_PWR_CTRL_MODE_DYN_BTS; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_step_size, + cfg_trx_power_ctrl_step_size_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_CMD " step-size inc <2-6> red <2-4>", + POWER_CONTROL_DESC "Set power change step size (for dynamic mode)\n" + "Increase step size (default is 4 dB)\n" + "Step size (2, 4, or 6 dB)\n" + "Reduce step size (default is 2 dB)\n" + "Step size (2 or 4 dB)\n") +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + + if (atoi(argv[1]) % 2 || atoi(argv[2]) % 2) { + vty_out(vty, "%% Power change step size must be " + "an even number%s", VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + params->inc_step_size_db = atoi(argv[1]); + params->red_step_size_db = atoi(argv[2]); + + return CMD_SUCCESS; +} + +#define POWER_CONTROL_MEAS_RXLEV_DESC \ + "RxLev value (signal strength, 0 is worst, 63 is best)\n" +#define POWER_CONTROL_MEAS_RXQUAL_DESC \ + "RxQual value (signal quality, 0 is best, 7 is worst)\n" + +DEFUN_USRATTR(cfg_trx_power_ctrl_rxlev_thresh, + cfg_trx_power_ctrl_rxlev_thresh_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_CMD " rxlev-thresh lower <0-63> upper <0-63>", + POWER_CONTROL_DESC "Set target RxLev thresholds (for dynamic mode)\n" + "Lower RxLev value (default is 32, i.e. -78 dBm)\n" + "Lower " POWER_CONTROL_MEAS_RXLEV_DESC + "Upper RxLev value (default is 38, i.e. -72 dBm)\n" + "Upper " POWER_CONTROL_MEAS_RXLEV_DESC) +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + int lower = atoi(argv[1]); + int upper = atoi(argv[2]); + + if (lower > upper) { + vty_out(vty, "%% Lower 'rxlev-thresh' (%d) must be less than upper (%d)%s", + lower, upper, VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + params->rxlev_meas.lower_thresh = lower; + params->rxlev_meas.upper_thresh = upper; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_rxqual_thresh, + cfg_trx_power_ctrl_rxqual_thresh_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_CMD " rxqual-thresh lower <0-7> upper <0-7>", + POWER_CONTROL_DESC "Set target RxQual thresholds (for dynamic mode)\n" + "Lower RxQual value (default is 0, i.e. BER < 0.2%)\n" + "Lower " POWER_CONTROL_MEAS_RXQUAL_DESC + "Upper RxQual value (default is 3, i.e. 0.8% <= BER < 1.6%)\n" + "Upper " POWER_CONTROL_MEAS_RXQUAL_DESC) +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + int lower = atoi(argv[1]); + int upper = atoi(argv[2]); + + if (lower > upper) { + vty_out(vty, "%% Lower 'rxqual-rxqual' (%d) must be less than upper (%d)%s", + lower, upper, VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + params->rxqual_meas.lower_thresh = lower; + params->rxqual_meas.upper_thresh = upper; + + return CMD_SUCCESS; +} + +#define POWER_CONTROL_MEAS_THRESH_COMP_CMD(meas) \ + POWER_CONTROL_CMD " " meas " lower <0-31> <0-31> upper <0-31> <0-31>" +#define POWER_CONTROL_MEAS_THRESH_COMP_DESC(meas, lp, ln, up, un) \ + POWER_CONTROL_DESC "Set " meas " threshold comparators (for dynamic mode)\n" \ + "Lower " meas " threshold comparators (see 3GPP TS 45.008, A.3.2.1)\n" lp ln \ + "Upper " meas " threshold comparators (see 3GPP TS 45.008, A.3.2.1)\n" up un + +DEFUN_USRATTR(cfg_trx_power_ctrl_rxlev_thresh_comp, + cfg_trx_power_ctrl_rxlev_thresh_comp_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_MEAS_THRESH_COMP_CMD("rxlev-thresh-comp"), + POWER_CONTROL_MEAS_THRESH_COMP_DESC("RxLev", + "P1 (default 10)\n", "N1 (default 12)\n", + "P2 (default 10)\n", "N2 (default 12)\n")) +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + int lower_cmp_p = atoi(argv[1]); + int lower_cmp_n = atoi(argv[2]); + int upper_cmp_p = atoi(argv[3]); + int upper_cmp_n = atoi(argv[4]); + + if (lower_cmp_p > lower_cmp_n) { + vty_out(vty, "%% Lower RxLev P1 %d must be less than N1 %d%s", + lower_cmp_p, lower_cmp_n, VTY_NEWLINE); + return CMD_WARNING; + } + + if (upper_cmp_p > upper_cmp_n) { + vty_out(vty, "%% Upper RxLev P2 %d must be less than N2 %d%s", + lower_cmp_p, lower_cmp_n, VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + params->rxlev_meas.lower_cmp_p = lower_cmp_p; + params->rxlev_meas.lower_cmp_n = lower_cmp_n; + params->rxlev_meas.upper_cmp_p = upper_cmp_p; + params->rxlev_meas.upper_cmp_n = upper_cmp_n; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_rxqual_thresh_comp, + cfg_trx_power_ctrl_rxqual_thresh_comp_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_MEAS_THRESH_COMP_CMD("rxqual-thresh-comp"), + POWER_CONTROL_MEAS_THRESH_COMP_DESC("RxQual", + "P3 (default 5)\n", "N3 (default 7)\n", + "P4 (default 15)\n", "N4 (default 18)\n")) +{ + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + int lower_cmp_p = atoi(argv[1]); + int lower_cmp_n = atoi(argv[2]); + int upper_cmp_p = atoi(argv[3]); + int upper_cmp_n = atoi(argv[4]); + + if (lower_cmp_p > lower_cmp_n) { + vty_out(vty, "%% Lower RxQual P3 %d must be less than N3 %d%s", + lower_cmp_p, lower_cmp_n, VTY_NEWLINE); + return CMD_WARNING; + } + + if (upper_cmp_p > upper_cmp_n) { + vty_out(vty, "%% Upper RxQual P4 %d must be less than N4 %d%s", + lower_cmp_p, lower_cmp_n, VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + params->rxqual_meas.lower_cmp_p = lower_cmp_p; + params->rxqual_meas.lower_cmp_n = lower_cmp_n; + params->rxqual_meas.upper_cmp_p = upper_cmp_p; + params->rxqual_meas.upper_cmp_n = upper_cmp_n; + + return CMD_SUCCESS; +} + +#define POWER_CONTROL_MEAS_AVG_CMD \ + POWER_CONTROL_CMD " (rxlev-avg|rxqual-avg)" +#define POWER_CONTROL_MEAS_AVG_DESC \ + POWER_CONTROL_DESC \ + "RxLev (signal strength) measurement averaging (for dynamic mode)\n" \ + "RxQual (signal quality) measurement averaging (for dynamic mode)\n" + +#define POWER_CONTROL_MEAS_AVG_PARAMS(params) \ + (strncmp(argv[1], "rxlev", 5) == 0) ? \ + ¶ms->rxlev_meas : ¶ms->rxqual_meas + +DEFUN_USRATTR(cfg_trx_no_power_ctrl_avg, + cfg_trx_no_power_ctrl_avg_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + "no " POWER_CONTROL_MEAS_AVG_CMD, + NO_STR POWER_CONTROL_MEAS_AVG_DESC) +{ + struct trx_power_ctrl_meas_params *avg_params; + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + + params = POWER_CONTROL_PARAMS(trx); + avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params); + avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_NONE; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_avg_params, + cfg_trx_power_ctrl_avg_params_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_MEAS_AVG_CMD " params hreqave <1-31> hreqt <1-31>", + POWER_CONTROL_MEAS_AVG_DESC "Configure general averaging parameters\n" + "Hreqave: the period over which an average is produced\n" + "Hreqave value (so that Hreqave * Hreqt < 32)\n" + "Hreqt: the number of averaged results that are maintained\n" + "Hreqt value (so that Hreqave * Hreqt < 32)\n") +{ + struct trx_power_ctrl_meas_params *avg_params; + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + int h_reqave = atoi(argv[1]); + int h_reqt = atoi(argv[2]); + + if (h_reqave * h_reqt > 31) { + vty_out(vty, "%% Hreqave (%d) * Hreqt (%d) = %d must be < 32%s", + h_reqave, h_reqt, h_reqave * h_reqt, VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params); + avg_params->h_reqave = h_reqave; + avg_params->h_reqt = h_reqt; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_avg_algo, + cfg_trx_power_ctrl_avg_algo_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + /* FIXME: add algorithm specific parameters */ + POWER_CONTROL_MEAS_AVG_CMD " algo (unweighted|weighted|mod-median)", + POWER_CONTROL_MEAS_AVG_DESC "Select the averaging algorithm\n" + "Un-weighted average\n" "Weighted average\n" + "Modified median calculation\n") +{ + struct trx_power_ctrl_meas_params *avg_params; + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + + params = POWER_CONTROL_PARAMS(trx); + avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params); + if (strcmp(argv[2], "unweighted") == 0) + avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED; + else if (strcmp(argv[2], "weighted") == 0) + avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED; + else if (strcmp(argv[2], "mod-median") == 0) + avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN; + + return CMD_SUCCESS; +} + +DEFUN_USRATTR(cfg_trx_power_ctrl_avg_ewma, + cfg_trx_power_ctrl_avg_ewma_cmd, + X(BSC_VTY_ATTR_VENDOR_SPECIFIC) | + X(BSC_VTY_ATTR_NEW_LCHAN), + POWER_CONTROL_MEAS_AVG_CMD " algo ewma beta <1-99>", + POWER_CONTROL_MEAS_AVG_DESC "Select the averaging algorithm\n" + "Exponentially Weighted Moving Average (EWMA)\n" + "Smoothing factor (in %): beta = (100 - alpha)\n" + "1% - lowest smoothing, 99% - highest smoothing\n") +{ + struct trx_power_ctrl_meas_params *avg_params; + struct trx_power_ctrl_params *params; + struct gsm_bts_trx *trx = vty->index; + + if (trx->bts->type != GSM_BTS_TYPE_OSMOBTS) { + vty_out(vty, "%% EWMA is an OsmoBTS specific algorithm, " + "it's not usable for other BTS types%s", VTY_NEWLINE); + return CMD_WARNING; + } + + params = POWER_CONTROL_PARAMS(trx); + avg_params = POWER_CONTROL_MEAS_AVG_PARAMS(params); + avg_params->algo = TRX_PWR_CTRL_MEAS_AVG_ALGO_EWMA; + avg_params->ewma.alpha = atoi(argv[2]); + + return CMD_SUCCESS; +} + /* NOTE: This requires a full restart as bsc_network_configure() is executed * only once on startup from osmo_bsc_main.c */ DEFUN(cfg_trx_rsl_e1, @@ -7205,6 +7545,19 @@ install_element(TRX_NODE, &cfg_trx_rsl_e1_tei_cmd); install_element(TRX_NODE, &cfg_trx_rf_locked_cmd); + install_element(TRX_NODE, &cfg_trx_no_power_ctrl_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_mode_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_step_size_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_rxlev_thresh_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_rxqual_thresh_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_rxlev_thresh_comp_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_rxqual_thresh_comp_cmd); + + install_element(TRX_NODE, &cfg_trx_no_power_ctrl_avg_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_avg_params_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_avg_algo_cmd); + install_element(TRX_NODE, &cfg_trx_power_ctrl_avg_ewma_cmd); + install_element(TRX_NODE, &cfg_ts_cmd); install_node(&ts_node, dummy_config_write); install_element(TS_NODE, &cfg_ts_pchan_cmd); -- To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/21685 To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings Gerrit-Project: osmo-bsc Gerrit-Branch: master Gerrit-Change-Id: Ifd6ea29c3b9dbaccf92856131d5fb2e352b84eb2 Gerrit-Change-Number: 21685 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanitskiy at sysmocom.de> Gerrit-MessageType: newchange -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.osmocom.org/pipermail/gerrit-log/attachments/20201212/1fb1ae02/attachment.htm>