<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24777">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, but someone else must approve
fixeria: Looks good to me, approved
Hoernchen: Looks good to me, but someone else must approve
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: implement BCCH carrier power reduction operation<br><br>The BCCH carrier (sometimes called C0) of a BTS shall maintain<br>discontinuous Downlink transmission at full power in order to<br>stay 'visible' to the mobile stations. Because of that, early<br>versions of 3GPP TS 45.008 prohibited BS power reduction on C0.<br><br>However, starting from version 13.0.0 (2015-11) there is a feature<br>called 'BCCH carrier power reduction operation'. This is a special<br>mode of operation, where the variation of RF level for some<br>timeslots is relaxed for the purpose of energy saving.<br><br>In BCCH carrier power reduction operation, for timeslots on the<br>C0 carrier, except timeslots carrying BCCH/CCCH, the output power<br>may be lower than the output power used for timeslots carrying<br>BCCH/CCCH. In this case the maximum allowed difference in output<br>power actually transmitted by the BTS is 6 dB.<br><br>Introduce a VTY command to turn on and off the BCCH carrier power<br>reduction operation. Also introduce a CTRL command. On the<br>A-bis/RSL, abuse the BS POWER CONTROL message by setting<br>the Channel Number IE to 0x80 (RSL_CHAN_BCCH).<br><br>Currently, only osmo-bts-trx is supported. A value greater than<br>zero makes it reduce the power on *inactive* timeslots of the<br>BCCH carrier. Sending zero disables the BCCH power reduction<br>mode completely.<br><br>For more details, see 3GPP TS 45.008, section 7.1, and 3GPP TR 45.926.<br><br>Change-Id: I047fce33d4d3e4c569dd006ba17858467a2f4783<br>Related: SYS#4919<br>---<br>M doc/manuals/chapters/power_control.adoc<br>M include/osmocom/bsc/bts.h<br>M src/osmo-bsc/bsc_ctrl_commands.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_osmobts.c<br>M tests/osmo-bsc.vty<br>7 files changed, 235 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/doc/manuals/chapters/power_control.adoc b/doc/manuals/chapters/power_control.adoc</span><br><span>index 4c1a275..bb87c85 100644</span><br><span>--- a/doc/manuals/chapters/power_control.adoc</span><br><span>+++ b/doc/manuals/chapters/power_control.adoc</span><br><span>@@ -327,3 +327,84 @@</span><br><span> // TODO: Document other power control parameters:</span><br><span> // OsmoBSC(config-net-bts)# ms max power <0-40></span><br><span> // OsmoBSC(config-net-bts-trx)# max_power_red <0-100></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+=== BCCH carrier power reduction operation</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+According to 3GPP TS 45.008, section 7.1, the BCCH carrier (sometimes called C0) of</span><br><span style="color: hsl(120, 100%, 40%);">+a BTS shall maintain continuous Downlink transmission at full power in order to</span><br><span style="color: hsl(120, 100%, 40%);">+stay "visible" to the mobile stations. Because of that, early versions of this 3GPP</span><br><span style="color: hsl(120, 100%, 40%);">+document prohibited BS power reduction on C0. However, a new feature was introduced</span><br><span style="color: hsl(120, 100%, 40%);">+in version 13.0.0 (2015-11) - "BCCH carrier power reduction operation".</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+This is a special mode of operation, in which the variation of RF power level for</span><br><span style="color: hsl(120, 100%, 40%);">+some timeslots is relaxed for the purpose of energy saving. In other words, the</span><br><span style="color: hsl(120, 100%, 40%);">+output power on some timeslots, except the timeslot(s) carrying BCCH/CCCH, can be</span><br><span style="color: hsl(120, 100%, 40%);">+lower than the full power. In this case the maximum allowed difference is 6 dB.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Of course, energy saving comes at a price and has impacts to the network KPI. In</span><br><span style="color: hsl(120, 100%, 40%);">+particular, it does negatively affect cell reselection performance and does increase</span><br><span style="color: hsl(120, 100%, 40%);">+handover failure and call drop rates. This is why BCCH carrier power reduction</span><br><span style="color: hsl(120, 100%, 40%);">+operation mode is not enabled by default. More information on potential impact</span><br><span style="color: hsl(120, 100%, 40%);">+and the simulation results can be found in 3GPP TR 45.926.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Supported BTS models</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+At the time of writing this manual, the only BTS model that can be instructed to</span><br><span style="color: hsl(120, 100%, 40%);">+enter or leave the BCCH power reduction mode is osmo-bts-trx. Support for other</span><br><span style="color: hsl(120, 100%, 40%);">+BTS vendors/models may be added in the future.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+TIP: If you're using OsmoBTS, make sure that it reports feature #021 "BCCH carrier</span><br><span style="color: hsl(120, 100%, 40%);">+power reduction mode" in the feature vector. This can be checked by issuing</span><br><span style="color: hsl(120, 100%, 40%);">+`show bts` command in OsmoBSC's VTY interface.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+==== Managing BCCH carrier power reduction</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+The BCCH carrier power reduction can be controlled via the CTRL and VTY interfaces.</span><br><span style="color: hsl(120, 100%, 40%);">+There is currently no logic in OsmoBSC for automatic activation and deactivation</span><br><span style="color: hsl(120, 100%, 40%);">+of this mode, so it's up to the network operator (or an external monitoring suite)</span><br><span style="color: hsl(120, 100%, 40%);">+when and depending on which factors to toggle it. Setting a value greater than</span><br><span style="color: hsl(120, 100%, 40%);">+zero enables the BCCH power reduction mode; setting zero disables it completely.</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Activating BCCH carrier power reduction via the VTY</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 <1> c0-power-reduction ?</span><br><span style="color: hsl(120, 100%, 40%);">+ <0-6> Power reduction value (in dB, even numbers only)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 <1> c0-power-reduction 4 <2></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> BTS number for which to activate BCCH carrier power reduction</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Maximum BCCH carrier power reduction (in 2 dB steps, 4 dB in this example)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Activating BCCH carrier power reduction via the CTRL</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo_ctrl.py \</span><br><span style="color: hsl(120, 100%, 40%);">+ --host 127.0.0.1 <1> -p 4249 \</span><br><span style="color: hsl(120, 100%, 40%);">+ --set "bts.0.c0-power-reduction" 4 <2></span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> Remote address of the host running osmo-bsc (localhost in this example)</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Maximum BCCH carrier power reduction (in 2 dB steps, 4 dB in this example)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+Once activated, it's possible to introspect the current maximum reduction value:</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Checking BCCH carrier power reduction state via the VTY</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC> enable</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# show bts 0 <1></span><br><span style="color: hsl(120, 100%, 40%);">+BTS 0 is of osmo-bts type in band DCS1800, has CI 0 LAC 1, BSIC 63 (NCC=7, BCC=7) and 2 TRX</span><br><span style="color: hsl(120, 100%, 40%);">+ Description: (null)</span><br><span style="color: hsl(120, 100%, 40%);">+ ARFCNs: 751 753</span><br><span style="color: hsl(120, 100%, 40%);">+ BCCH carrier power reduction (maximum): 4 dB <2></span><br><span style="color: hsl(120, 100%, 40%);">+ ...</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> BTS number for which to show BCCH carrier power reduction state</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Maximum BCCH carrier power reduction currently applied</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+.Example: Checking BCCH carrier power reduction state via the CTRL</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+$ osmo_ctrl.py \</span><br><span style="color: hsl(120, 100%, 40%);">+ --host 127.0.0.1 <1> -p 4249 \</span><br><span style="color: hsl(120, 100%, 40%);">+ --get "bts.0.c0-power-reduction"</span><br><span style="color: hsl(120, 100%, 40%);">+Got message: b'GET_REPLY 3652121201381481804 bts.0.c0-power-reduction 4 <2>'</span><br><span style="color: hsl(120, 100%, 40%);">+----</span><br><span style="color: hsl(120, 100%, 40%);">+<1> Remote address of the host running osmo-bsc (localhost in this example)</span><br><span style="color: hsl(120, 100%, 40%);">+<2> Maximum BCCH carrier power reduction currently applied</span><br><span>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index 49691e0..65c3be5 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -236,6 +236,8 @@</span><br><span> int (*power_ctrl_enc_rsl_params)(struct msgb *msg, const struct gsm_power_ctrl_params *cp);</span><br><span> /* (Optional) function for sending default MS/BS Power Control paramaters */</span><br><span> int (*power_ctrl_send_def_params)(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* (Optional) function for toggling BCCH carrier power reduction operation */</span><br><span style="color: hsl(120, 100%, 40%);">+ int (*power_ctrl_set_c0_power_red)(const struct gsm_bts *bts, const uint8_t red);</span><br><span> </span><br><span> void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts);</span><br><span> void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx);</span><br><span>@@ -543,6 +545,9 @@</span><br><span> struct gsm_power_ctrl_params ms_power_ctrl;</span><br><span> struct gsm_power_ctrl_params bs_power_ctrl;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Maximum BCCH carrier power reduction */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t c0_max_power_red_db;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Interference Measurement Parameters */</span><br><span> struct gsm_interf_meas_params interf_meas_params;</span><br><span> </span><br><span>@@ -691,6 +696,8 @@</span><br><span> </span><br><span> int gsm_bts_set_system_infos(struct gsm_bts *bts);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_set_c0_power_red(struct gsm_bts *bts, const uint8_t red);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int gsm_bts_model_register(struct gsm_bts_model *model);</span><br><span> struct gsm_bts_model *bts_model_find(enum gsm_bts_type type);</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_ctrl_commands.c b/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>index 15f5536..be83b1b 100644</span><br><span>--- a/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>+++ b/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>@@ -550,6 +550,54 @@</span><br><span> }</span><br><span> CTRL_CMD_DEFINE(trx_max_power, "max-power-reduction");</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int verify_bts_c0_power_red(struct ctrl_cmd *cmd, const char *value, void *_data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const int red = atoi(value);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (red < 0 || red > 6) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd->reply = "Value is out of range";</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (red % 2 != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd->reply = "Value must be even";</span><br><span style="color: hsl(120, 100%, 40%);">+ return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int get_bts_c0_power_red(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm_bts *bts = cmd->node;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd->reply = talloc_asprintf(cmd, "%u", bts->c0_max_power_red_db);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!cmd->reply) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd->reply = "OOM.";</span><br><span style="color: hsl(120, 100%, 40%);">+ return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CTRL_CMD_REPLY;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int set_bts_c0_power_red(struct ctrl_cmd *cmd, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = cmd->node;</span><br><span style="color: hsl(120, 100%, 40%);">+ const int red = atoi(cmd->value);</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gsm_bts_set_c0_power_red(bts, red);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc == -ENOTSUP) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd->reply = "BCCH carrier power reduction is not supported";</span><br><span style="color: hsl(120, 100%, 40%);">+ return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (rc != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cmd->reply = "Failed to enable BCCH carrier power reduction";</span><br><span style="color: hsl(120, 100%, 40%);">+ return CTRL_CMD_ERROR;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return get_bts_c0_power_red(cmd, data);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+CTRL_CMD_DEFINE(bts_c0_power_red, "c0-power-reduction");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int bsc_base_ctrl_cmds_install(void)</span><br><span> {</span><br><span> int rc = 0;</span><br><span>@@ -571,6 +619,7 @@</span><br><span> rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_oml_up);</span><br><span> rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_gprs_mode);</span><br><span> rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_rf_state);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc |= ctrl_cmd_install(CTRL_NODE_BTS, &cmd_bts_c0_power_red);</span><br><span> </span><br><span> rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_max_power);</span><br><span> rc |= ctrl_cmd_install(CTRL_NODE_TRX, &cmd_trx_arfcn);</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 7207341..efa59d3 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -444,6 +444,8 @@</span><br><span> if (strnlen(bts->pcu_version, MAX_VERSION_LENGTH))</span><br><span> vty_out(vty, " PCU version %s connected%s", bts->pcu_version,</span><br><span> VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, " BCCH carrier power reduction (maximum): %u dB%s",</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->c0_max_power_red_db, VTY_NEWLINE);</span><br><span> vty_out(vty, " MS Max power: %u dBm%s", bts->ms_max_power, VTY_NEWLINE);</span><br><span> vty_out(vty, " Minimum Rx Level for Access: %i dBm%s",</span><br><span> rxlev2dbm(bts->si_common.cell_sel_par.rxlev_acc_min),</span><br><span>@@ -6020,6 +6022,45 @@</span><br><span> return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN(bts_c0_power_red,</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_c0_power_red_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+ "bts <0-255> c0-power-reduction <0-6>",</span><br><span style="color: hsl(120, 100%, 40%);">+ "BTS Specific Commands\n" BTS_NR_STR</span><br><span style="color: hsl(120, 100%, 40%);">+ "BCCH carrier power reduction operation\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Power reduction value (in dB, even numbers only)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int bts_nr = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+ int red = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts = gsm_bts_num(gsmnet_from_vty(vty), bts_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% No such BTS (%d)%s", bts_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (red % 2 != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% Incorrect BCCH power reduction value, "</span><br><span style="color: hsl(120, 100%, 40%);">+ "an even number is expected%s", VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gsm_bts_set_c0_power_red(bts, red);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc == -ENOTSUP) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% BCCH carrier power reduction operation mode "</span><br><span style="color: hsl(120, 100%, 40%);">+ "is not supported for BTS%u%s", bts_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else if (rc != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ vty_out(vty, "%% Failed to %sable BCCH carrier power reduction "</span><br><span style="color: hsl(120, 100%, 40%);">+ "operation mode for BTS%u%s", red ? "en" : "dis",</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_nr, VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_WARNING;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return CMD_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* this command is now hidden, as it's a low-level debug hack, and people should</span><br><span> * instead use osmo-cbc these days */</span><br><span> DEFUN_HIDDEN(smscb_cmd, smscb_cmd_cmd,</span><br><span>@@ -8172,6 +8213,7 @@</span><br><span> install_element(ENABLE_NODE, &restart_bts_cmd);</span><br><span> install_element(ENABLE_NODE, &bts_resend_sysinfo_cmd);</span><br><span> install_element(ENABLE_NODE, &bts_resend_power_ctrl_params_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+ install_element(ENABLE_NODE, &bts_c0_power_red_cmd);</span><br><span> install_element(ENABLE_NODE, &pdch_act_cmd);</span><br><span> install_element(ENABLE_NODE, &lchan_act_cmd);</span><br><span> install_element(ENABLE_NODE, &lchan_act_all_cmd);</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index b64890f..c1f09ff 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -1,5 +1,5 @@</span><br><span> /* (C) 2008-2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2020 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span> *</span><br><span> * All Rights Reserved</span><br><span> *</span><br><span>@@ -747,6 +747,24 @@</span><br><span> return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_set_c0_power_red(struct gsm_bts *bts, const uint8_t red)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!osmo_bts_has_feature(&bts->features, BTS_FEAT_BCCH_POWER_RED))</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->model->power_ctrl_set_c0_power_red == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bts->model->power_ctrl_set_c0_power_red(bts, red);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->c0_max_power_red_db = red;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const struct rate_ctr_desc bts_ctr_description[] = {</span><br><span> [BTS_CTR_CHREQ_TOTAL] = \</span><br><span> { "chreq:total",</span><br><span>diff --git a/src/osmo-bsc/bts_osmobts.c b/src/osmo-bsc/bts_osmobts.c</span><br><span>index 1814ada..9813a26 100644</span><br><span>--- a/src/osmo-bsc/bts_osmobts.c</span><br><span>+++ b/src/osmo-bsc/bts_osmobts.c</span><br><span>@@ -1,6 +1,7 @@</span><br><span> /* Osmocom OsmoBTS specific code */</span><br><span> </span><br><span> /* (C) 2010-2012 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2021 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span> *</span><br><span> * All Rights Reserved</span><br><span> *</span><br><span>@@ -43,6 +44,35 @@</span><br><span> </span><br><span> static struct gsm_bts_model model_osmobts;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static int power_ctrl_set_c0_power_red(const struct gsm_bts *bts,</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t red)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct abis_rsl_dchan_hdr *dh;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct msgb *msg;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msg = rsl_msgb_alloc();</span><br><span style="color: hsl(120, 100%, 40%);">+ if (msg == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DRSL, LOGL_NOTICE, "%sabling BCCH carrier power reduction "</span><br><span style="color: hsl(120, 100%, 40%);">+ "operation mode for BTS%u (maximum %u dB)\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ red ? "En" : "Dis", bts->nr, red);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Abuse the standard BS POWER CONTROL message by specifying 'Common Channel'</span><br><span style="color: hsl(120, 100%, 40%);">+ * in the Protocol Discriminator field and 'BCCH' in the Channel Number IE. */</span><br><span style="color: hsl(120, 100%, 40%);">+ dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span style="color: hsl(120, 100%, 40%);">+ dh->c.msg_discr = ABIS_RSL_MDISC_COM_CHAN;</span><br><span style="color: hsl(120, 100%, 40%);">+ dh->c.msg_type = RSL_MT_BS_POWER_CONTROL;</span><br><span style="color: hsl(120, 100%, 40%);">+ dh->ie_chan = RSL_IE_CHAN_NR;</span><br><span style="color: hsl(120, 100%, 40%);">+ dh->chan_nr = RSL_CHAN_BCCH;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_tv_put(msg, RSL_IE_BS_POWER, red / 2);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ msg->dst = bts->c0->rsl_link_primary;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return abis_rsl_sendmsg(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int bts_model_osmobts_init(void)</span><br><span> {</span><br><span> model_osmobts = bts_model_nanobts;</span><br><span>@@ -52,6 +82,9 @@</span><br><span> /* Unlike nanoBTS, osmo-bts does support SI2bis and SI2ter fine */</span><br><span> model_osmobts.force_combined_si = false;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Power control API */</span><br><span style="color: hsl(120, 100%, 40%);">+ model_osmobts.power_ctrl_set_c0_power_red = &power_ctrl_set_c0_power_red;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> model_osmobts.features.data = &model_osmobts._features_data[0];</span><br><span> model_osmobts.features.data_len =</span><br><span> sizeof(model_osmobts._features_data);</span><br><span>diff --git a/tests/osmo-bsc.vty b/tests/osmo-bsc.vty</span><br><span>index 48f3f0b..22e2a06 100644</span><br><span>--- a/tests/osmo-bsc.vty</span><br><span>+++ b/tests/osmo-bsc.vty</span><br><span>@@ -46,10 +46,14 @@</span><br><span> OsmoBSC# bts 0 ?</span><br><span> resend-system-information Re-generate + re-send BCCH SYSTEM INFORMATION</span><br><span> resend-power-control-defaults Re-generate + re-send default MS/BS Power control parameters</span><br><span style="color: hsl(120, 100%, 40%);">+ c0-power-reduction BCCH carrier power reduction operation</span><br><span> trx TRX for manual command</span><br><span> oml Manipulate the OML managed objects</span><br><span> om2000 Manipulate the OM2000 managed objects</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# bts 0 c0-power-reduction ?</span><br><span style="color: hsl(120, 100%, 40%);">+ <0-6> Power reduction value (in dB, even numbers only)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> OsmoBSC# bts 0 trx ?</span><br><span> <0-255> TRX Number</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24777">change 24777</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bsc/+/24777"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I047fce33d4d3e4c569dd006ba17858467a2f4783 </div>
<div style="display:none"> Gerrit-Change-Number: 24777 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Hoernchen <ewild@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>