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>