<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19299">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;">Move gsm_bts_{trx_}set_system_infos APIs to bts{_trx}.*<br><br>Change-Id: I2aa83b499d6e5d06a0fa1001fee3111f7e639c94<br>---<br>M include/osmocom/bsc/bts.h<br>M include/osmocom/bsc/bts_trx.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/ipaccess/ipaccess-config.c<br>M src/ipaccess/ipaccess-proxy.c<br>M src/osmo-bsc/bsc_init.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_trx.c<br>M src/utils/bs11_config.c<br>M src/utils/meas_json.c<br>M tests/abis/abis_test.c<br>M tests/bsc/bsc_test.c<br>M tests/gsm0408/gsm0408_test.c<br>M tests/nanobts_omlattr/nanobts_omlattr_test.c<br>14 files changed, 200 insertions(+), 170 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 9b89f4f..730dee9 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -622,6 +622,8 @@</span><br><span> </span><br><span> int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_set_system_infos(struct gsm_bts *bts);</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/include/osmocom/bsc/bts_trx.h b/include/osmocom/bsc/bts_trx.h</span><br><span>index 7e64439..3a635ba 100644</span><br><span>--- a/include/osmocom/bsc/bts_trx.h</span><br><span>+++ b/include/osmocom/bsc/bts_trx.h</span><br><span>@@ -90,3 +90,5 @@</span><br><span> void gsm_trx_all_ts_dispatch(struct gsm_bts_trx *trx, uint32_t ts_ev, void *data);</span><br><span> int trx_count_free_ts(struct gsm_bts_trx *trx, enum gsm_phys_chan_config pchan);</span><br><span> bool trx_has_valid_pchan_config(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx);</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index e85be70..a8b495f 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -1189,9 +1189,6 @@</span><br><span> void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr,</span><br><span>             uint8_t e1_ts, uint8_t e1_ts_ss);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx);</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_set_system_infos(struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* generic E1 line operations for all ISDN-based BTS. */</span><br><span> extern struct e1inp_line_ops bts_isdn_e1inp_line_ops;</span><br><span> </span><br><span>diff --git a/src/ipaccess/ipaccess-config.c b/src/ipaccess/ipaccess-config.c</span><br><span>index 34ad57f..c9264d7 100644</span><br><span>--- a/src/ipaccess/ipaccess-config.c</span><br><span>+++ b/src/ipaccess/ipaccess-config.c</span><br><span>@@ -1133,18 +1133,12 @@</span><br><span> </span><br><span> /* Stub */</span><br><span> int osmo_bsc_sigtran_send(struct gsm_subscriber_connection *conn, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Stub */</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span> int osmo_bsc_sigtran_open_conn(struct gsm_subscriber_connection *conn, struct msgb *msg)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Stub */</span><br><span style="color: hsl(0, 100%, 40%);">-int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/src/ipaccess/ipaccess-proxy.c b/src/ipaccess/ipaccess-proxy.c</span><br><span>index 05a6f63..d5dd8d4 100644</span><br><span>--- a/src/ipaccess/ipaccess-proxy.c</span><br><span>+++ b/src/ipaccess/ipaccess-proxy.c</span><br><span>@@ -1254,7 +1254,9 @@</span><br><span> }</span><br><span> </span><br><span> /* Stub */</span><br><span style="color: hsl(0, 100%, 40%);">-int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c</span><br><span>index 4fc0ab1..e45b5e8 100644</span><br><span>--- a/src/osmo-bsc/bsc_init.c</span><br><span>+++ b/src/osmo-bsc/bsc_init.c</span><br><span>@@ -69,155 +69,6 @@</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i, int si_len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-      int rc, j;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      if (si_len) {</span><br><span style="color: hsl(0, 100%, 40%);">-           DEBUGP(DRR, "SI%s: %s\n", get_value_string(osmo_sitype_strs, i),</span><br><span style="color: hsl(0, 100%, 40%);">-                      osmo_hexdump(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN));</span><br><span style="color: hsl(0, 100%, 40%);">-    } else</span><br><span style="color: hsl(0, 100%, 40%);">-          DEBUGP(DRR, "SI%s: OFF\n", get_value_string(osmo_sitype_strs, i));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (i) {</span><br><span style="color: hsl(0, 100%, 40%);">-    case SYSINFO_TYPE_5:</span><br><span style="color: hsl(0, 100%, 40%);">-    case SYSINFO_TYPE_5bis:</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_5ter:</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_6:</span><br><span style="color: hsl(0, 100%, 40%);">-            rc = rsl_sacch_filling(trx, osmo_sitype2rsl(i),</span><br><span style="color: hsl(0, 100%, 40%);">-                                si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(0, 100%, 40%);">-             break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case SYSINFO_TYPE_2quater:</span><br><span style="color: hsl(0, 100%, 40%);">-              if (si_len == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      rc = rsl_bcch_info(trx, i, NULL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                    break;</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-         for (j = 0; j <= bts->si2q_count; j++)</span><br><span style="color: hsl(0, 100%, 40%);">-                    rc = rsl_bcch_info(trx, i, (const uint8_t *)GSM_BTS_SI2Q(bts, j), GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(0, 100%, 40%);">-            break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                rc = rsl_bcch_info(trx, i, si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(0, 100%, 40%);">-         break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* set all system information types for a TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   int i, rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">-      uint8_t gen_si[_MAX_SYSINFO_TYPE], n_si = 0, n;</span><br><span style="color: hsl(0, 100%, 40%);">- int si_len[_MAX_SYSINFO_TYPE];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->si_common.cell_sel_par.ms_txpwr_max_ccch =</span><br><span style="color: hsl(0, 100%, 40%);">-                      ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);</span><br><span style="color: hsl(0, 100%, 40%);">-     bts->si_common.cell_sel_par.neci = bts->network->neci;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Zero/forget the state of the dynamically computed SIs, leeping the static ones */</span><br><span style="color: hsl(0, 100%, 40%);">-    bts->si_valid = bts->si_mode_static;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* First, we determine which of the SI messages we actually need */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (trx == bts->c0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                /* 1...4 are always present on a C0 TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-              gen_si[n_si++] = SYSINFO_TYPE_1;</span><br><span style="color: hsl(0, 100%, 40%);">-                gen_si[n_si++] = SYSINFO_TYPE_2;</span><br><span style="color: hsl(0, 100%, 40%);">-                gen_si[n_si++] = SYSINFO_TYPE_2bis;</span><br><span style="color: hsl(0, 100%, 40%);">-             gen_si[n_si++] = SYSINFO_TYPE_2ter;</span><br><span style="color: hsl(0, 100%, 40%);">-             gen_si[n_si++] = SYSINFO_TYPE_2quater;</span><br><span style="color: hsl(0, 100%, 40%);">-          gen_si[n_si++] = SYSINFO_TYPE_3;</span><br><span style="color: hsl(0, 100%, 40%);">-                gen_si[n_si++] = SYSINFO_TYPE_4;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                /* 13 is always present on a C0 TRX of a GPRS BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (bts->gprs.mode != BTS_GPRS_NONE)</span><br><span style="color: hsl(0, 100%, 40%);">-                 gen_si[n_si++] = SYSINFO_TYPE_13;</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* 5 and 6 are always present on every TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-   gen_si[n_si++] = SYSINFO_TYPE_5;</span><br><span style="color: hsl(0, 100%, 40%);">-        gen_si[n_si++] = SYSINFO_TYPE_5bis;</span><br><span style="color: hsl(0, 100%, 40%);">-     gen_si[n_si++] = SYSINFO_TYPE_5ter;</span><br><span style="color: hsl(0, 100%, 40%);">-     gen_si[n_si++] = SYSINFO_TYPE_6;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Second, we generate the selected SI via RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         i = gen_si[n];</span><br><span style="color: hsl(0, 100%, 40%);">-          /* Only generate SI if this SI is not in "static" (user-defined) mode */</span><br><span style="color: hsl(0, 100%, 40%);">-              if (!(bts->si_mode_static & (1 << i))) {</span><br><span style="color: hsl(0, 100%, 40%);">-                   /* Set SI as being valid. gsm_generate_si() might unset</span><br><span style="color: hsl(0, 100%, 40%);">-                  * it, if SI is not required. */</span><br><span style="color: hsl(0, 100%, 40%);">-                        bts->si_valid |= (1 << i);</span><br><span style="color: hsl(0, 100%, 40%);">-                     rc = gsm_generate_si(bts, i);</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                          goto err_out;</span><br><span style="color: hsl(0, 100%, 40%);">-                   si_len[i] = rc;</span><br><span style="color: hsl(0, 100%, 40%);">-         } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (i == SYSINFO_TYPE_5 || i == SYSINFO_TYPE_5bis</span><br><span style="color: hsl(0, 100%, 40%);">-                        || i == SYSINFO_TYPE_5ter)</span><br><span style="color: hsl(0, 100%, 40%);">-                             si_len[i] = 18;</span><br><span style="color: hsl(0, 100%, 40%);">-                 else if (i == SYSINFO_TYPE_6)</span><br><span style="color: hsl(0, 100%, 40%);">-                           si_len[i] = 11;</span><br><span style="color: hsl(0, 100%, 40%);">-                 else</span><br><span style="color: hsl(0, 100%, 40%);">-                            si_len[i] = 23;</span><br><span style="color: hsl(0, 100%, 40%);">-         }</span><br><span style="color: hsl(0, 100%, 40%);">-       }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Third, we send the selected SI via RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(0, 100%, 40%);">-         i = gen_si[n];</span><br><span style="color: hsl(0, 100%, 40%);">-          /* 3GPP TS 08.58 §8.5.1 BCCH INFORMATION. If we don't currently</span><br><span style="color: hsl(0, 100%, 40%);">-             * have this SI, we send a zero-length RSL BCCH FILLING /</span><br><span style="color: hsl(0, 100%, 40%);">-                * SACCH FILLING in order to deactivate the SI, in case it</span><br><span style="color: hsl(0, 100%, 40%);">-               * might have previously been active */</span><br><span style="color: hsl(0, 100%, 40%);">-         if (!GSM_BTS_HAS_SI(bts, i)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (bts->si_unused_send_empty)</span><br><span style="color: hsl(0, 100%, 40%);">-                               rc = rsl_si(trx, i, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-                 else</span><br><span style="color: hsl(0, 100%, 40%);">-                            rc = 0; /* some nanoBTS fw don't like receiving empty unsupported SI */</span><br><span style="color: hsl(0, 100%, 40%);">-             } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  rc = rsl_si(trx, i, si_len[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                  return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Make sure the PCU is aware (in case anything GPRS related has</span><br><span style="color: hsl(0, 100%, 40%);">-         * changed in SI */</span><br><span style="color: hsl(0, 100%, 40%);">-     pcu_info_update(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-err_out:</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DRR, LOGL_ERROR, "Cannot generate SI%s for BTS %u: error <%s>, "</span><br><span style="color: hsl(0, 100%, 40%);">-        "most likely a problem with neighbor cell list generation\n",</span><br><span style="color: hsl(0, 100%, 40%);">-         get_value_string(osmo_sitype_strs, i), bts->nr, strerror(-rc));</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* set all system information types for a BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_set_system_infos(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* Generate a new ID */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->bcch_change_mark += 1;</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->bcch_change_mark %= 0x7;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-                int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-         rc = gsm_bts_trx_set_system_infos(trx);</span><br><span style="color: hsl(0, 100%, 40%);">-         if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                    return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* XXX hard-coded for now */</span><br><span> #define T3122_CHAN_LOAD_SAMPLE_INTERVAL 1 /* in seconds */</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index c943684..055cc47 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -750,3 +750,23 @@</span><br><span> </span><br><span>         return count;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* set all system information types for a BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_set_system_infos(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Generate a new ID */</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->bcch_change_mark += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+        bts->bcch_change_mark %= 0x7;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    llist_for_each_entry(trx, &bts->trx_list, list) {</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_trx_set_system_infos(trx);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/bts_trx.c b/src/osmo-bsc/bts_trx.c</span><br><span>index 15d5b59..25a3fc7 100644</span><br><span>--- a/src/osmo-bsc/bts_trx.c</span><br><span>+++ b/src/osmo-bsc/bts_trx.c</span><br><span>@@ -25,7 +25,10 @@</span><br><span> #include <osmocom/bsc/bts_trx.h></span><br><span> #include <osmocom/bsc/timeslot_fsm.h></span><br><span> #include <osmocom/bsc/abis_nm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_rsl.h></span><br><span> #include <osmocom/bsc/lchan_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/system_information.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/pcu_if.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> </span><br><span> struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)</span><br><span>@@ -286,3 +289,132 @@</span><br><span> </span><br><span>       return result;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i, int si_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc, j;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (si_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+         DEBUGP(DRR, "SI%s: %s\n", get_value_string(osmo_sitype_strs, i),</span><br><span style="color: hsl(120, 100%, 40%);">+                    osmo_hexdump(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN));</span><br><span style="color: hsl(120, 100%, 40%);">+  } else</span><br><span style="color: hsl(120, 100%, 40%);">+                DEBUGP(DRR, "SI%s: OFF\n", get_value_string(osmo_sitype_strs, i));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (i) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case SYSINFO_TYPE_5:</span><br><span style="color: hsl(120, 100%, 40%);">+  case SYSINFO_TYPE_5bis:</span><br><span style="color: hsl(120, 100%, 40%);">+       case SYSINFO_TYPE_5ter:</span><br><span style="color: hsl(120, 100%, 40%);">+       case SYSINFO_TYPE_6:</span><br><span style="color: hsl(120, 100%, 40%);">+          rc = rsl_sacch_filling(trx, osmo_sitype2rsl(i),</span><br><span style="color: hsl(120, 100%, 40%);">+                                      si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(120, 100%, 40%);">+           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case SYSINFO_TYPE_2quater:</span><br><span style="color: hsl(120, 100%, 40%);">+            if (si_len == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    rc = rsl_bcch_info(trx, i, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                  break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span style="color: hsl(120, 100%, 40%);">+             rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+               for (j = 0; j <= bts->si2q_count; j++)</span><br><span style="color: hsl(120, 100%, 40%);">+                  rc = rsl_bcch_info(trx, i, (const uint8_t *)GSM_BTS_SI2Q(bts, j), GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = rsl_bcch_info(trx, i, si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(120, 100%, 40%);">+               break;</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 rc;</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%);">+/* set all system information types for a TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       int i, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+    uint8_t gen_si[_MAX_SYSINFO_TYPE], n_si = 0, n;</span><br><span style="color: hsl(120, 100%, 40%);">+       int si_len[_MAX_SYSINFO_TYPE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bts->si_common.cell_sel_par.ms_txpwr_max_ccch =</span><br><span style="color: hsl(120, 100%, 40%);">+                    ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);</span><br><span style="color: hsl(120, 100%, 40%);">+   bts->si_common.cell_sel_par.neci = bts->network->neci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Zero/forget the state of the dynamically computed SIs, leeping the static ones */</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->si_valid = bts->si_mode_static;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* First, we determine which of the SI messages we actually need */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx == bts->c0) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* 1...4 are always present on a C0 TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+            gen_si[n_si++] = SYSINFO_TYPE_1;</span><br><span style="color: hsl(120, 100%, 40%);">+              gen_si[n_si++] = SYSINFO_TYPE_2;</span><br><span style="color: hsl(120, 100%, 40%);">+              gen_si[n_si++] = SYSINFO_TYPE_2bis;</span><br><span style="color: hsl(120, 100%, 40%);">+           gen_si[n_si++] = SYSINFO_TYPE_2ter;</span><br><span style="color: hsl(120, 100%, 40%);">+           gen_si[n_si++] = SYSINFO_TYPE_2quater;</span><br><span style="color: hsl(120, 100%, 40%);">+                gen_si[n_si++] = SYSINFO_TYPE_3;</span><br><span style="color: hsl(120, 100%, 40%);">+              gen_si[n_si++] = SYSINFO_TYPE_4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+            /* 13 is always present on a C0 TRX of a GPRS BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bts->gprs.mode != BTS_GPRS_NONE)</span><br><span style="color: hsl(120, 100%, 40%);">+                       gen_si[n_si++] = SYSINFO_TYPE_13;</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%);">+   /* 5 and 6 are always present on every TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_5;</span><br><span style="color: hsl(120, 100%, 40%);">+      gen_si[n_si++] = SYSINFO_TYPE_5bis;</span><br><span style="color: hsl(120, 100%, 40%);">+   gen_si[n_si++] = SYSINFO_TYPE_5ter;</span><br><span style="color: hsl(120, 100%, 40%);">+   gen_si[n_si++] = SYSINFO_TYPE_6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Second, we generate the selected SI via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               i = gen_si[n];</span><br><span style="color: hsl(120, 100%, 40%);">+                /* Only generate SI if this SI is not in "static" (user-defined) mode */</span><br><span style="color: hsl(120, 100%, 40%);">+            if (!(bts->si_mode_static & (1 << i))) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 /* Set SI as being valid. gsm_generate_si() might unset</span><br><span style="color: hsl(120, 100%, 40%);">+                        * it, if SI is not required. */</span><br><span style="color: hsl(120, 100%, 40%);">+                      bts->si_valid |= (1 << i);</span><br><span style="color: hsl(120, 100%, 40%);">+                   rc = gsm_generate_si(bts, i);</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                                goto err_out;</span><br><span style="color: hsl(120, 100%, 40%);">+                 si_len[i] = rc;</span><br><span style="color: hsl(120, 100%, 40%);">+               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      if (i == SYSINFO_TYPE_5 || i == SYSINFO_TYPE_5bis</span><br><span style="color: hsl(120, 100%, 40%);">+                      || i == SYSINFO_TYPE_5ter)</span><br><span style="color: hsl(120, 100%, 40%);">+                           si_len[i] = 18;</span><br><span style="color: hsl(120, 100%, 40%);">+                       else if (i == SYSINFO_TYPE_6)</span><br><span style="color: hsl(120, 100%, 40%);">+                         si_len[i] = 11;</span><br><span style="color: hsl(120, 100%, 40%);">+                       else</span><br><span style="color: hsl(120, 100%, 40%);">+                          si_len[i] = 23;</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%);">+   /* Third, we send the selected SI via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(120, 100%, 40%);">+               i = gen_si[n];</span><br><span style="color: hsl(120, 100%, 40%);">+                /* 3GPP TS 08.58 §8.5.1 BCCH INFORMATION. If we don't currently</span><br><span style="color: hsl(120, 100%, 40%);">+           * have this SI, we send a zero-length RSL BCCH FILLING /</span><br><span style="color: hsl(120, 100%, 40%);">+              * SACCH FILLING in order to deactivate the SI, in case it</span><br><span style="color: hsl(120, 100%, 40%);">+             * might have previously been active */</span><br><span style="color: hsl(120, 100%, 40%);">+               if (!GSM_BTS_HAS_SI(bts, i)) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        if (bts->si_unused_send_empty)</span><br><span style="color: hsl(120, 100%, 40%);">+                             rc = rsl_si(trx, i, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                       else</span><br><span style="color: hsl(120, 100%, 40%);">+                          rc = 0; /* some nanoBTS fw don't like receiving empty unsupported SI */</span><br><span style="color: hsl(120, 100%, 40%);">+           } else</span><br><span style="color: hsl(120, 100%, 40%);">+                        rc = rsl_si(trx, i, si_len[i]);</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Make sure the PCU is aware (in case anything GPRS related has</span><br><span style="color: hsl(120, 100%, 40%);">+       * changed in SI */</span><br><span style="color: hsl(120, 100%, 40%);">+   pcu_info_update(bts);</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%);">+err_out:</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DRR, LOGL_ERROR, "Cannot generate SI%s for BTS %u: error <%s>, "</span><br><span style="color: hsl(120, 100%, 40%);">+      "most likely a problem with neighbor cell list generation\n",</span><br><span style="color: hsl(120, 100%, 40%);">+       get_value_string(osmo_sitype_strs, i), bts->nr, strerror(-rc));</span><br><span style="color: hsl(120, 100%, 40%);">+       return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/utils/bs11_config.c b/src/utils/bs11_config.c</span><br><span>index c43c008..c279179 100644</span><br><span>--- a/src/utils/bs11_config.c</span><br><span>+++ b/src/utils/bs11_config.c</span><br><span>@@ -990,3 +990,8 @@</span><br><span> void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}</span><br><span> int abis_rsl_rcvmsg(struct msgb *msg) { return 0; }</span><br><span> int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/src/utils/meas_json.c b/src/utils/meas_json.c</span><br><span>index 0fd99c0..b44a300 100644</span><br><span>--- a/src/utils/meas_json.c</span><br><span>+++ b/src/utils/meas_json.c</span><br><span>@@ -205,3 +205,8 @@</span><br><span> void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}</span><br><span> int abis_rsl_rcvmsg(struct msgb *msg) { return 0; }</span><br><span> int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/tests/abis/abis_test.c b/tests/abis/abis_test.c</span><br><span>index 767a9fb..9d26edd 100644</span><br><span>--- a/tests/abis/abis_test.c</span><br><span>+++ b/tests/abis/abis_test.c</span><br><span>@@ -191,3 +191,8 @@</span><br><span> bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; }</span><br><span> void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}</span><br><span> int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/tests/bsc/bsc_test.c b/tests/bsc/bsc_test.c</span><br><span>index 164f78f..dd2b1bb 100644</span><br><span>--- a/tests/bsc/bsc_test.c</span><br><span>+++ b/tests/bsc/bsc_test.c</span><br><span>@@ -240,3 +240,8 @@</span><br><span> bool neighbor_ident_bts_entry_exists(uint8_t from_bts) { return false; }</span><br><span> const char *handover_status(struct gsm_subscriber_connection *conn) { return "x"; }</span><br><span> int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index b3e8b11..e53b83a 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -969,3 +969,8 @@</span><br><span> int rsl_encryption_cmd(struct msgb *msg) { return 0; }</span><br><span> </span><br><span> int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span>diff --git a/tests/nanobts_omlattr/nanobts_omlattr_test.c b/tests/nanobts_omlattr/nanobts_omlattr_test.c</span><br><span>index 4180f4a..ea98409 100644</span><br><span>--- a/tests/nanobts_omlattr/nanobts_omlattr_test.c</span><br><span>+++ b/tests/nanobts_omlattr/nanobts_omlattr_test.c</span><br><span>@@ -320,3 +320,8 @@</span><br><span> </span><br><span> void ts_fsm_alloc(struct gsm_bts_trx_ts *ts) {}</span><br><span> int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+void pcu_info_update(struct gsm_bts *bts) {};</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type, const uint8_t *data, int len) { return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type si_type) { return 0; }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/19299">change 19299</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/+/19299"/><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: I2aa83b499d6e5d06a0fa1001fee3111f7e639c94 </div>
<div style="display:none"> Gerrit-Change-Number: 19299 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@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-MessageType: merged </div>