<p>fixeria <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21786">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">power_control: add new structures and default parameters<br><br>Change-Id: I7fb8ccb997490b40a061d09c241359aaabc37c4a<br>Related: SYS#4918<br>---<br>M include/osmocom/bsc/bts.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/gsm_data.c<br>4 files changed, 140 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index d2f1307..7c988a8 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -470,6 +470,10 @@</span><br><span>        /* osmocom specific FACCH/SACCH repetition mode flags set by VTY to</span><br><span>   * enable/disable certain ACCH repeation features individually */</span><br><span>    struct abis_rsl_osmo_rep_acch_cap repeated_acch_policy;</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 ms_power_ctrl;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_power_ctrl_params bs_power_ctrl;</span><br><span> };</span><br><span> </span><br><span> #define GSM_BTS_SI2Q(bts, i)   (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i])</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 3472f39..f9d5736 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1269,4 +1269,74 @@</span><br><span> </span><br><span> int bsc_sccp_inst_next_conn_id(struct osmo_sccp_instance *sccp);</span><br><span> </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%);">+enum gsm_power_ctrl_dir {</span><br><span style="color: hsl(120, 100%, 40%);">+   GSM_PWR_CTRL_DIR_UL, /* MS Power Control */</span><br><span style="color: hsl(120, 100%, 40%);">+   GSM_PWR_CTRL_DIR_DL, /* BS Power Control */</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%);">+enum gsm_power_ctrl_mode {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Do not send MS/BS Power Control IEs */</span><br><span style="color: hsl(120, 100%, 40%);">+     GSM_PWR_CTRL_MODE_NONE = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Send MS/BS Power IE only (with target level) */</span><br><span style="color: hsl(120, 100%, 40%);">+    GSM_PWR_CTRL_MODE_STATIC,</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Send MS/BS Power [Parameters] IEs (dynamic mode) */</span><br><span style="color: hsl(120, 100%, 40%);">+        GSM_PWR_CTRL_MODE_DYN_BTS,</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 Control direction: Uplink or Downlink */</span><br><span style="color: hsl(120, 100%, 40%);">+     enum gsm_power_ctrl_dir dir;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Power Control mode to be used by the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+        enum gsm_power_ctrl_mode mode;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Power change step size (dynamic mode only) */</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%);">+extern const struct gsm_power_ctrl_params power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _GSM_DATA_H */</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 0c7fde9..d5a848d 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -349,6 +349,14 @@</span><br><span> </span><br><span>  bts->repeated_acch_policy.rxqual = 4;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* MS Power Control parameters (defaults) */</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->ms_power_ctrl = power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+        bts->ms_power_ctrl.dir = GSM_PWR_CTRL_DIR_UL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* BS Power Control parameters (defaults) */</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->bs_power_ctrl = power_ctrl_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+        bts->bs_power_ctrl.dir = GSM_PWR_CTRL_DIR_DL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   return bts;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 28f7c27..0b5650f 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -966,3 +966,61 @@</span><br><span>                 return GSM48_RR_CAUSE_ABNORMAL_UNSPEC;</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%);">+  /* Static Power Control is the safe default */</span><br><span style="color: hsl(120, 100%, 40%);">+        .mode = GSM_PWR_CTRL_MODE_STATIC,</span><br><span style="color: hsl(120, 100%, 40%);">+</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, /* 2, 4, or 6 dB */</span><br><span style="color: hsl(120, 100%, 40%);">+    .red_step_size_db = 2, /* 2 or 4 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%);">+            /* Increase {UL,DL}_TXPWR if at least LOWER_CMP_P averages</span><br><span style="color: hsl(120, 100%, 40%);">+             * out of LOWER_CMP_N averages are lower than L_RXLEV_XX_P */</span><br><span style="color: hsl(120, 100%, 40%);">+         .lower_cmp_p = 10, /* P1 as in 3GPP TS 45.008, A.3.2.1 (case a) */</span><br><span style="color: hsl(120, 100%, 40%);">+            .lower_cmp_n = 12, /* N1 as in 3GPP TS 45.008, A.3.2.1 (case a) */</span><br><span style="color: hsl(120, 100%, 40%);">+            /* Decrease {UL,DL}_TXPWR if at least UPPER_CMP_P averages</span><br><span style="color: hsl(120, 100%, 40%);">+             * out of UPPER_CMP_N averages are greater than L_RXLEV_XX_P */</span><br><span style="color: hsl(120, 100%, 40%);">+               .upper_cmp_p = 19, /* P2 as in 3GPP TS 45.008, A.3.2.1 (case b) */</span><br><span style="color: hsl(120, 100%, 40%);">+            .upper_cmp_n = 20, /* N2 as in 3GPP TS 45.008, A.3.2.1 (case b) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* No averaging (filtering) by default */</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%);">+            /* Hreqave: the period over which an average is produced */</span><br><span style="color: hsl(120, 100%, 40%);">+           .h_reqave = 4, /* TODO: investigate a reasonable default value */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Hreqt: the number of averaged results maintained */</span><br><span style="color: hsl(120, 100%, 40%);">+                .h_reqt = 6, /* TODO: investigate a reasonable default value */</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 = 0, /* L_RXQUAL_XX_P (BER < 0.2%) */</span><br><span style="color: hsl(120, 100%, 40%);">+                .upper_thresh = 3, /* U_RXQUAL_XX_P (0.8% <= BER < 1.6%) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           /* Increase {UL,DL}_TXPWR if at least LOWER_CMP_P averages</span><br><span style="color: hsl(120, 100%, 40%);">+             * out of LOWER_CMP_N averages are lower than L_RXLEV_XX_P */</span><br><span style="color: hsl(120, 100%, 40%);">+         .lower_cmp_p = 5, /* P3 as in 3GPP TS 45.008, A.3.2.1 (case c) */</span><br><span style="color: hsl(120, 100%, 40%);">+             .lower_cmp_n = 7, /* N3 as in 3GPP TS 45.008, A.3.2.1 (case c) */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Decrease {UL,DL}_TXPWR if at least UPPER_CMP_P averages</span><br><span style="color: hsl(120, 100%, 40%);">+             * out of UPPER_CMP_N averages are greater than L_RXLEV_XX_P */</span><br><span style="color: hsl(120, 100%, 40%);">+               .upper_cmp_p = 15, /* P4 as in 3GPP TS 45.008, A.3.2.1 (case d) */</span><br><span style="color: hsl(120, 100%, 40%);">+            .upper_cmp_n = 18, /* N4 as in 3GPP TS 45.008, A.3.2.1 (case d) */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+          /* No averaging (filtering) by default */</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%);">+            /* Hreqave: the period over which an average is produced */</span><br><span style="color: hsl(120, 100%, 40%);">+           .h_reqave = 4, /* TODO: investigate a reasonable default value */</span><br><span style="color: hsl(120, 100%, 40%);">+             /* Hreqt: the number of averaged results maintained */</span><br><span style="color: hsl(120, 100%, 40%);">+                .h_reqt = 6, /* TODO: investigate a reasonable default value */</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-bsc/+/21786">change 21786</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/+/21786"/><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: I7fb8ccb997490b40a061d09c241359aaabc37c4a </div>
<div style="display:none"> Gerrit-Change-Number: 21786 </div>
<div style="display:none"> Gerrit-PatchSet: 3 </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: fixeria <vyanitskiy@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>