<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/21904">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: check-in new parameters and default values<br><br>For the sake of simplicity, the old structures that are still used<br>by MS/BS power control loops are kept in place. Migration to the<br>new structures requires additional changes to the existing power<br>control logic, so it will be done in the follow-up changes.<br><br>The new parameters are integrated as follows:<br><br> + struct gsm_bts - a BTS instance:<br> | Hard-coded default (fall-back) parameters for all transceivers.<br> |<br> +-+-> struct gsm_bts_trx - a TRX instance (transceiver):<br> | Default parameters for all logical channels inherited from<br> | 'struct gsm_bts' at start-up. May be overwritten by the<br> | BSC using ip.access specific 'Measurement Pre-processing<br> | Defaults' message on the A-bis/RSL interface.<br> |<br> +---> struct gsm_lchan - a logical channel (e.g. TCH or SDCCH):<br> Connection specific parameters inherited from 'struct<br> gsm_bts_trx'. May be overwritten by parameters sent<br> by the BSC in CHANnel ACTIVation and other messages.<br><br>Change-Id: I6d41eb238aa6d4f5b77596c5477c2ecbe86de2a8<br>Related: SYS#4918<br>---<br>M include/osmo-bts/bts.h<br>M include/osmo-bts/bts_trx.h<br>M include/osmo-bts/gsm_data.h<br>M src/common/bts.c<br>M src/common/bts_trx.c<br>M src/common/gsm_data.c<br>6 files changed, 107 insertions(+), 6 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index 6d8b570..0b224be 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -321,10 +321,14 @@</span><br><span> bool vty_override; /* OML value overridden by VTY */</span><br><span> } radio_link_timeout;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Uplink/Downlink power control */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Uplink/Downlink power control (legacy parameters) */</span><br><span> struct bts_power_ctrl_params ul_power_ctrl;</span><br><span> struct bts_power_ctrl_params dl_power_ctrl;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Default (fall-back) Dynamic Power Control parameters for all transceivers */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params bs_dpc_params; /* BS Dynamic Power Control */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params ms_dpc_params; /* MS Dynamic Power Control */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* used by the sysmoBTS to adjust band */</span><br><span> uint8_t auto_band;</span><br><span> </span><br><span>diff --git a/include/osmo-bts/bts_trx.h b/include/osmo-bts/bts_trx.h</span><br><span>index 08eaf65..4474903 100644</span><br><span>--- a/include/osmo-bts/bts_trx.h</span><br><span>+++ b/include/osmo-bts/bts_trx.h</span><br><span>@@ -32,6 +32,8 @@</span><br><span> </span><br><span> </span><br><span> struct trx_power_params power_params;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params *bs_dpc_params; /* BS Dynamic Power Control */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params *ms_dpc_params; /* MS Dynamic Power Control */</span><br><span> bool ms_pwr_ctl_soft; /* is power control loop done by osmocom software? */</span><br><span> </span><br><span> struct {</span><br><span>diff --git a/include/osmo-bts/gsm_data.h b/include/osmo-bts/gsm_data.h</span><br><span>index fdd5ba3..b9e0e88 100644</span><br><span>--- a/include/osmo-bts/gsm_data.h</span><br><span>+++ b/include/osmo-bts/gsm_data.h</span><br><span>@@ -161,10 +161,65 @@</span><br><span> uint32_t fn;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Depending on the context (MS or BS power control), fields 'current' and 'max'</span><br><span style="color: hsl(0, 100%, 40%);">- * reflect either the MS power level (magic numbers), or BS Power reduction level</span><br><span style="color: hsl(0, 100%, 40%);">- * (attenuation, in dB). Field 'avg100_rxlev_dbm' is always in dBm. */</span><br><span style="color: hsl(120, 100%, 40%);">+/* MS/BS Power related measurement averaging algo */</span><br><span style="color: hsl(120, 100%, 40%);">+enum gsm_power_ctrl_meas_avg_algo {</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE = 0x00,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_PWR_CTRL_MEAS_AVG_ALGO_UNWEIGHTED = 0x01,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_PWR_CTRL_MEAS_AVG_ALGO_WEIGHTED = 0x02,</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_PWR_CTRL_MEAS_AVG_ALGO_MOD_MEDIAN = 0x03,</span><br><span style="color: hsl(120, 100%, 40%);">+ /* EWMA is an Osmocom specific algo */</span><br><span style="color: hsl(120, 100%, 40%);">+ GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA = 0x04,</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%);">+/* MS/BS Power related measurement parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_power_ctrl_meas_params {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Thresholds (see 3GPP TS 45.008, section A.3.2.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t lower_thresh; /* lower (decreasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t upper_thresh; /* upper (increasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Threshold Comparators for lower (decreasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t lower_cmp_p; /* P1 for RxLev, P3 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t lower_cmp_n; /* N1 for RxLev, N3 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Threshold Comparators for upper (increasing) direction */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t upper_cmp_p; /* P2 for RxLev, P4 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t upper_cmp_n; /* N2 for RxLev, N4 for RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Hreqave and Hreqt (see 3GPP TS 45.008, Annex A) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t h_reqave;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t h_reqt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* AVG algorithm and its specific parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gsm_power_ctrl_meas_avg_algo algo;</span><br><span style="color: hsl(120, 100%, 40%);">+ union {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Exponentially Weighted Moving Average */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Smoothing factor: higher the value - less smoothing */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t alpha; /* 1 .. 99 (in %) */</span><br><span style="color: hsl(120, 100%, 40%);">+ } ewma;</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* MS/BS Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_power_ctrl_params {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Power change step size (maximum) */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t inc_step_size_db; /* increasing direction */</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t red_step_size_db; /* reducing direction */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Measurement averaging parameters for RxLev & RxQual */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params rxqual_meas;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_meas_params rxlev_meas;</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%);">+/* Default MS/BS Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct gsm_power_ctrl_params power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct lchan_power_ctrl_state {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Dynamic Power Control parameters (NULL in static mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm_power_ctrl_params *dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Depending on the context (MS or BS power control), fields 'current' and 'max'</span><br><span style="color: hsl(120, 100%, 40%);">+ * reflect either the MS power level (magic numbers), or BS Power reduction level</span><br><span style="color: hsl(120, 100%, 40%);">+ * (attenuation, in dB). */</span><br><span> uint8_t current;</span><br><span> uint8_t max;</span><br><span> bool fixed;</span><br><span>@@ -319,10 +374,14 @@</span><br><span> /* RTP header Marker bit to indicate beginning of speech after pause */</span><br><span> bool rtp_tx_marker;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* MS/BS power control */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MS/BS power control state */</span><br><span> struct lchan_power_ctrl_state ms_power_ctrl;</span><br><span> struct lchan_power_ctrl_state bs_power_ctrl;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* MS/BS Dynamic Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params ms_dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_power_ctrl_params bs_dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct msgb *pending_rel_ind_msg;</span><br><span> </span><br><span> /* ECU (Error Concealment Unit) state */</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index ba24497..de07957 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -330,7 +330,7 @@</span><br><span> bts->rtp_port_range_next = bts->rtp_port_range_start;</span><br><span> bts->rtp_ip_dscp = -1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Default UL/DL power control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Default UL/DL power control parameters (legacy) */</span><br><span> bts->ul_power_ctrl = bts->dl_power_ctrl = \</span><br><span> (struct bts_power_ctrl_params) {</span><br><span> .target_dbm = -75,</span><br><span>@@ -346,6 +346,10 @@</span><br><span> }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Default (fall-back) MS/BS Power control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->bs_dpc_params = power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->ms_dpc_params = power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* configurable via OML */</span><br><span> bts->load.ccch.load_ind_period = 112;</span><br><span> load_timer_start(bts);</span><br><span>diff --git a/src/common/bts_trx.c b/src/common/bts_trx.c</span><br><span>index 38fb90a..9fc18e4 100644</span><br><span>--- a/src/common/bts_trx.c</span><br><span>+++ b/src/common/bts_trx.c</span><br><span>@@ -113,6 +113,10 @@</span><br><span> if (trx->nr != 0)</span><br><span> trx->nominal_power = bts->c0->nominal_power;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Default (fall-back) Dynamic Power Control parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ trx->bs_dpc_params = &bts->bs_dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+ trx->ms_dpc_params = &bts->ms_dpc_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> llist_add_tail(&trx->list, &bts->trx_list);</span><br><span> </span><br><span> return trx;</span><br><span>diff --git a/src/common/gsm_data.c b/src/common/gsm_data.c</span><br><span>index 978edc4..44ed7e9 100644</span><br><span>--- a/src/common/gsm_data.c</span><br><span>+++ b/src/common/gsm_data.c</span><br><span>@@ -420,3 +420,31 @@</span><br><span> return -1;</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Default MS/BS Power Control parameters (see 3GPP TS 45.008, table A.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct gsm_power_ctrl_params power_ctrl_params_def = {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Power increasing/reducing step size */</span><br><span style="color: hsl(120, 100%, 40%);">+ .inc_step_size_db = 4, /* FIXME: PWR_RAISE_MAX_DB */</span><br><span style="color: hsl(120, 100%, 40%);">+ .red_step_size_db = 8, /* FIXME: PWR_LOWER_MAX_DB */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* RxLev measurement parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rxlev_meas = {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Thresholds for RxLev (see 3GPP TS 45.008, A.3.2.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+ .lower_thresh = 32, /* L_RXLEV_XX_P (-78 dBm) */</span><br><span style="color: hsl(120, 100%, 40%);">+ .upper_thresh = 38, /* U_RXLEV_XX_P (-72 dBm) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* NOTE: only Osmocom specific EWMA is supported */</span><br><span style="color: hsl(120, 100%, 40%);">+ .algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_OSMO_EWMA,</span><br><span style="color: hsl(120, 100%, 40%);">+ .ewma.alpha = 50, /* Smoothing factor 50% */</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%);">+ /* RxQual measurement parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+ .rxqual_meas = {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Thresholds for RxQual (see 3GPP TS 45.008, A.3.2.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+ .lower_thresh = 3, /* U_RXQUAL_XX_P (0.8% <= BER < 1.6%) */</span><br><span style="color: hsl(120, 100%, 40%);">+ .upper_thresh = 0, /* L_RXQUAL_XX_P (BER < 0.2%) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: RxQual averaging is not yet implemented */</span><br><span style="color: hsl(120, 100%, 40%);">+ .algo = GSM_PWR_CTRL_MEAS_AVG_ALGO_NONE,</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/21904">change 21904</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-bts/+/21904"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I6d41eb238aa6d4f5b77596c5477c2ecbe86de2a8 </div>
<div style="display:none"> Gerrit-Change-Number: 21904 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-CC: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>