Change in osmo-bsc[master]: vty: add commands for MS/BS Power Control parameters

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.org
Sat Dec 12 02:52:50 UTC 2020


fixeria 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) ? \
+		&params->rxlev_meas : &params->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>


More information about the gerrit-log mailing list