<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>