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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Make interference measurement parameters configurable<br><br>According to 3GPP TS 45.008, the BSS shall monitor the levels of<br>interference on its IDLE traffic channels.  The actual measurements<br>are performed in the BTS and then reported to the BSC over the<br>A-bis/RSL link(s) in RF RESource INDication messages.<br><br>3GPP TS 45.008 defines the following measurement parameters:<br><br>  * Intave: Interference Averaging period (see table A.1),<br>  * Interference level Boundaries (see table A.1).<br><br>Both parameters are sent to the BTS over the A-bis/OML, and can<br>now be configured via the VTY interface.  Only those BTS models<br>which 'speak' the OML protocol defined in 3GPP TS 52.021 will<br>actually get the configured parameters, others will keep using<br>the hard-coded parameters.<br><br>Change-Id: I99ebf57aac1f3ca7e0497c3b4f6b0738c6ed7e47<br>Related: SYS#5313, OS#1866<br>---<br>M include/osmocom/bsc/bts.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c<br>M src/osmo-bsc/gsm_data.c<br>M tests/Makefile.am<br>A tests/interf_meas.vty<br>8 files changed, 139 insertions(+), 5 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 7a491d9..72f83eb 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -534,6 +534,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%);">+       /* Interference Measurement Parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_interf_meas_params interf_meas_params;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* We will ignore CHAN RQD with access delay greater than rach_max_delay */</span><br><span>  uint8_t rach_max_delay;</span><br><span> };</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index 3f1446b..1540864 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1414,6 +1414,16 @@</span><br><span> </span><br><span> extern const struct gsm_power_ctrl_params power_ctrl_params_def;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Interference Measurement Parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_interf_meas_params {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Intave: Interference Averaging period (see 3GPP TS 45.008, table A.1) */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t avg_period; /* number of SACCH multiframes, 1 .. 31 */</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Interference level Boundaries (see 3GPP TS 52.021, section 9.4.25) */</span><br><span style="color: hsl(120, 100%, 40%);">+      uint8_t bounds_dbm[6]; /* -x dBm values for boundaries 0 .. X5 */</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_interf_meas_params interf_meas_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum rsl_cmod_spd chan_mode_to_rsl_cmod_spd(enum gsm48_chan_mode chan_mode);</span><br><span> </span><br><span> #endif /* _GSM_DATA_H */</span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 5bd27fc..1db284a 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -1236,6 +1236,25 @@</span><br><span>      || bts->repeated_acch_policy.dl_facch_cmd)</span><br><span>            vty_out(vty, "  repeat rxqual %u%s", bts->repeated_acch_policy.rxqual, VTY_NEWLINE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->interf_meas_params.avg_period != interf_meas_params_def.avg_period) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vty_out(vty, "  interference-meas avg-period %u%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                 bts->interf_meas_params.avg_period,</span><br><span style="color: hsl(120, 100%, 40%);">+                        VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (memcmp(bts->interf_meas_params.bounds_dbm,</span><br><span style="color: hsl(120, 100%, 40%);">+                interf_meas_params_def.bounds_dbm,</span><br><span style="color: hsl(120, 100%, 40%);">+            sizeof(interf_meas_params_def.bounds_dbm))) {</span><br><span style="color: hsl(120, 100%, 40%);">+              vty_out(vty, "  interference-meas level-bounds "</span><br><span style="color: hsl(120, 100%, 40%);">+                    "%d %d %d %d %d %d%s",</span><br><span style="color: hsl(120, 100%, 40%);">+                      -1 * bts->interf_meas_params.bounds_dbm[0],</span><br><span style="color: hsl(120, 100%, 40%);">+                        -1 * bts->interf_meas_params.bounds_dbm[1],</span><br><span style="color: hsl(120, 100%, 40%);">+                        -1 * bts->interf_meas_params.bounds_dbm[2],</span><br><span style="color: hsl(120, 100%, 40%);">+                        -1 * bts->interf_meas_params.bounds_dbm[3],</span><br><span style="color: hsl(120, 100%, 40%);">+                        -1 * bts->interf_meas_params.bounds_dbm[4],</span><br><span style="color: hsl(120, 100%, 40%);">+                        -1 * bts->interf_meas_params.bounds_dbm[5],</span><br><span style="color: hsl(120, 100%, 40%);">+                        VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* BS/MS Power Control parameters */</span><br><span>         config_write_power_ctrl(vty, 2, &bts->bs_power_ctrl);</span><br><span>         config_write_power_ctrl(vty, 2, &bts->ms_power_ctrl);</span><br><span>@@ -4890,6 +4909,46 @@</span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_bts_interf_meas_avg_period,</span><br><span style="color: hsl(120, 100%, 40%);">+         cfg_bts_interf_meas_avg_period_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+           X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "interference-meas avg-period <1-31>",</span><br><span style="color: hsl(120, 100%, 40%);">+        "Interference measurement parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "Averaging period (Intave)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+       "Number of SACCH multiframes\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        bts->interf_meas_params.avg_period = atoi(argv[0]);</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 style="color: hsl(120, 100%, 40%);">+DEFUN_USRATTR(cfg_bts_interf_meas_level_bounds,</span><br><span style="color: hsl(120, 100%, 40%);">+           cfg_bts_interf_meas_level_bounds_cmd,</span><br><span style="color: hsl(120, 100%, 40%);">+         X(BSC_VTY_ATTR_RESTART_ABIS_OML_LINK),</span><br><span style="color: hsl(120, 100%, 40%);">+        "interference-meas level-bounds "</span><br><span style="color: hsl(120, 100%, 40%);">+             "<-120-0> <-120-0> <-120-0> <-120-0> <-120-0> <-120-0>",</span><br><span style="color: hsl(120, 100%, 40%);">+              "Interference measurement parameters\n"</span><br><span style="color: hsl(120, 100%, 40%);">+             "Interference level Boundaries\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "Interference boundary 0 (dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+           "Interference boundary X1 (dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Interference boundary X2 (dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Interference boundary X3 (dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Interference boundary X4 (dBm)\n"</span><br><span style="color: hsl(120, 100%, 40%);">+          "Interference boundary X5 (dBm)\n")</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts *bts = vty->index;</span><br><span style="color: hsl(120, 100%, 40%);">+  unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     for (i = 0; i < ARRAY_SIZE(bts->interf_meas_params.bounds_dbm); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->interf_meas_params.bounds_dbm[i] = abs(atoi(argv[i]));</span><br><span style="color: hsl(120, 100%, 40%);">+                /* TODO: ensure ascending (or descending?) order */</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> #define BS_POWER_CONTROL_CMD \</span><br><span>   "bs-power-control"</span><br><span> #define MS_POWER_CONTROL_CMD \</span><br><span>@@ -7868,6 +7927,8 @@</span><br><span>       install_element(BTS_NODE, &cfg_bts_rep_ul_dl_sacch_cmd);</span><br><span>         install_element(BTS_NODE, &cfg_bts_rep_no_ul_dl_sacch_cmd);</span><br><span>      install_element(BTS_NODE, &cfg_bts_rep_rxqual_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+       install_element(BTS_NODE, &cfg_bts_interf_meas_avg_period_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+   install_element(BTS_NODE, &cfg_bts_interf_meas_level_bounds_cmd);</span><br><span> </span><br><span>    neighbor_ident_vty_init();</span><br><span>   /* See also handover commands added on bts level from handover_vty.c */</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 652d126..4b02042 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -357,6 +357,9 @@</span><br><span>   bts->bs_power_ctrl = power_ctrl_params_def;</span><br><span>       bts->bs_power_ctrl.dir = GSM_PWR_CTRL_DIR_DL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  /* Interference Measurement Parameters (defaults) */</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->interf_meas_params = interf_meas_params_def;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>       bts->rach_max_delay = 63;</span><br><span> </span><br><span>     return bts;</span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>index 885f4cc..ed3a802 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>@@ -35,11 +35,12 @@</span><br><span>   if (!msgb)</span><br><span>           return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(buf, "\x55\x5b\x61\x67\x6d\x73", 6);</span><br><span style="color: hsl(0, 100%, 40%);">-   msgb_tv_fixed_put(msgb, NM_ATT_INTERF_BOUND, 6, buf);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   /* interference avg. period in numbers of SACCH multifr */</span><br><span style="color: hsl(0, 100%, 40%);">-      msgb_tv_put(msgb, NM_ATT_INTAVE_PARAM, 0x06);</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Interference level Boundaries: 0 .. X5 (3GPP TS 52.021, section 9.4.25) */</span><br><span style="color: hsl(120, 100%, 40%);">+ msgb_tv_fixed_put(msgb, NM_ATT_INTERF_BOUND,</span><br><span style="color: hsl(120, 100%, 40%);">+                    sizeof(bts->interf_meas_params.bounds_dbm),</span><br><span style="color: hsl(120, 100%, 40%);">+                        &bts->interf_meas_params.bounds_dbm[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Intave: Interference Averaging period (3GPP TS 52.021, section 9.4.24) */</span><br><span style="color: hsl(120, 100%, 40%);">+  msgb_tv_put(msgb, NM_ATT_INTAVE_PARAM, bts->interf_meas_params.avg_period);</span><br><span> </span><br><span>   rlt = gsm_bts_get_radio_link_timeout(bts);</span><br><span>   if (rlt == -1) {</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index ea6c685..b33b1c3 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -1002,6 +1002,19 @@</span><br><span>   }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Default Interference Measurement Parameters */</span><br><span style="color: hsl(120, 100%, 40%);">+const struct gsm_interf_meas_params interf_meas_params_def = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .avg_period = 6, /* 6 SACCH periods */</span><br><span style="color: hsl(120, 100%, 40%);">+        .bounds_dbm = {</span><br><span style="color: hsl(120, 100%, 40%);">+                85, /*  0:  -85 dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+                91, /* X1:  -91 dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+                97, /* X2:  -97 dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+               103, /* X3: -103 dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+               109, /* X4: -109 dBm */</span><br><span style="color: hsl(120, 100%, 40%);">+               115, /* X5: -115 dBm */</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> /* Default MS/BS Power Control parameters (see 3GPP TS 45.008, table A.1) */</span><br><span> const struct gsm_power_ctrl_params power_ctrl_params_def = {</span><br><span>     /* Static Power Control is the safe default */</span><br><span>diff --git a/tests/Makefile.am b/tests/Makefile.am</span><br><span>index 5e23be0..0831dee 100644</span><br><span>--- a/tests/Makefile.am</span><br><span>+++ b/tests/Makefile.am</span><br><span>@@ -41,6 +41,7 @@</span><br><span>  osmo-bsc.vty \</span><br><span>       timer.vty \</span><br><span>  power_ctrl.vty \</span><br><span style="color: hsl(120, 100%, 40%);">+      interf_meas.vty \</span><br><span>    ctrl/osmo-bsc-neigh-test.cfg \</span><br><span>       ctrl/osmo-bsc-apply-config-file.cfg \</span><br><span>        ctrl/osmo-bsc-apply-config-file-invalid.cfg \</span><br><span>diff --git a/tests/interf_meas.vty b/tests/interf_meas.vty</span><br><span>new file mode 100644</span><br><span>index 0000000..76b33e5</span><br><span>--- /dev/null</span><br><span>+++ b/tests/interf_meas.vty</span><br><span>@@ -0,0 +1,42 @@</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC> enable</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# ### Default configuration</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC# configure terminal</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config)# network</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net)# bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas?</span><br><span style="color: hsl(120, 100%, 40%);">+  interference-meas  Interference measurement parameters</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas ?</span><br><span style="color: hsl(120, 100%, 40%);">+  avg-period    Averaging period (Intave)</span><br><span style="color: hsl(120, 100%, 40%);">+  level-bounds  Interference level Boundaries</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# ### Averaging period</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas avg-period ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <1-31>  Number of SACCH multiframes</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas avg-period 0</span><br><span style="color: hsl(120, 100%, 40%);">+% Unknown command.</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas avg-period 30</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span style="color: hsl(120, 100%, 40%);">+  interference-meas avg-period 30</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# ### Interference level Boundaries</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas level-bounds ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <-120-0>  Interference boundary 0 (dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas level-bounds -85 -90 -95 -100 -105 ?</span><br><span style="color: hsl(120, 100%, 40%);">+  <-120-0>  Interference boundary X5 (dBm)</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# interference-meas level-bounds -85 -90 -95 -100 -105 -110</span><br><span style="color: hsl(120, 100%, 40%);">+OsmoBSC(config-net-bts)# show running-config</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span style="color: hsl(120, 100%, 40%);">+ bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span style="color: hsl(120, 100%, 40%);">+  interference-meas avg-period 30</span><br><span style="color: hsl(120, 100%, 40%);">+  interference-meas level-bounds -85 -90 -95 -100 -105 -110</span><br><span style="color: hsl(120, 100%, 40%);">+... !interference-meas</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/24548">change 24548</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/+/24548"/><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: I99ebf57aac1f3ca7e0497c3b4f6b0738c6ed7e47 </div>
<div style="display:none"> Gerrit-Change-Number: 24548 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>