<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/15926">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;">bsc: Adapt maximum MS Power Ctrl level based on band and MS Power class<br><br>Related: OS#4244<br>Change-Id: I6bff440b7797e710bca5af94fae546e5d55e6972<br>---<br>M include/osmocom/bsc/abis_rsl.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/osmo-bsc/abis_rsl.c<br>M src/osmo-bsc/gsm_08_08.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/lchan_fsm.c<br>6 files changed, 133 insertions(+), 14 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/abis_rsl.h b/include/osmocom/bsc/abis_rsl.h</span><br><span>index f7db779..b43e3ae 100644</span><br><span>--- a/include/osmocom/bsc/abis_rsl.h</span><br><span>+++ b/include/osmocom/bsc/abis_rsl.h</span><br><span>@@ -85,7 +85,7 @@</span><br><span>                        const uint8_t *data, int len);</span><br><span> </span><br><span> int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db);</span><br><span style="color: hsl(0, 100%, 40%);">-int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan);</span><br><span> </span><br><span> /* SMSCB functionality */</span><br><span> int rsl_sms_cb_command(struct gsm_bts *bts, uint8_t chan_number,</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index fe626b1..040e36d 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -309,6 +309,9 @@</span><br><span>          /* pointer to "other" connection, if Call Leg Relocation was successful */</span><br><span>                 struct gsm_subscriber_connection *other;</span><br><span>     } lcls;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* MS Power Class, TS 05.05 sec 4.1.1 "Mobile station". 0 means unset. */</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t ms_power_class:3;</span><br><span> };</span><br><span> </span><br><span> </span><br><span>@@ -1374,6 +1377,9 @@</span><br><span>      return conn->lchan->ts->trx->bts;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void conn_update_ms_power_class(struct gsm_subscriber_connection *conn, uint8_t power_class);</span><br><span style="color: hsl(120, 100%, 40%);">+void lchan_update_ms_power_ctrl_level(struct gsm_lchan *lchan, int ms_power_dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum {</span><br><span>         BTS_CTR_CHREQ_TOTAL,</span><br><span>         BTS_CTR_CHREQ_NO_CHANNEL,</span><br><span>diff --git a/src/osmo-bsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>index 8df0e81..80f54b3 100644</span><br><span>--- a/src/osmo-bsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -293,26 +293,16 @@</span><br><span>   return abis_rsl_sendmsg(msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm)</span><br><span style="color: hsl(120, 100%, 40%);">+int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan)</span><br><span> {</span><br><span>       struct gsm_bts_trx *trx = lchan->ts->trx;</span><br><span>      struct gsm_bts *bts = trx->bts;</span><br><span>   struct abis_rsl_dchan_hdr *dh;</span><br><span>       struct msgb *msg;</span><br><span>    uint8_t chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">-     int ctl_lvl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    ctl_lvl = ms_pwr_ctl_lvl(bts->band, dbm);</span><br><span style="color: hsl(0, 100%, 40%);">-    if (ctl_lvl < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-             return ctl_lvl;</span><br><span> </span><br><span>  msg = rsl_msgb_alloc();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     lchan->ms_power = ctl_lvl;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   if (fpc)</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->ms_power |= 0x20;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  dh = (struct abis_rsl_dchan_hdr *) msgb_put(msg, sizeof(*dh));</span><br><span>       init_dchan_hdr(dh, RSL_MT_MS_POWER_CONTROL);</span><br><span>         dh->chan_nr = chan_nr;</span><br><span>diff --git a/src/osmo-bsc/gsm_08_08.c b/src/osmo-bsc/gsm_08_08.c</span><br><span>index ad67c3f..3efc665 100644</span><br><span>--- a/src/osmo-bsc/gsm_08_08.c</span><br><span>+++ b/src/osmo-bsc/gsm_08_08.c</span><br><span>@@ -395,12 +395,16 @@</span><br><span>       return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* TS 04.08 sec 9.2.15 "Location updating request" */</span><br><span> static void handle_lu_request(struct gsm_subscriber_connection *conn,</span><br><span>                               struct msgb *msg)</span><br><span> {</span><br><span>         struct gsm48_hdr *gh;</span><br><span>        struct gsm48_loc_upd_req *lu;</span><br><span>        struct gsm48_loc_area_id lai;</span><br><span style="color: hsl(120, 100%, 40%);">+ int8_t rc8;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = conn_get_bts(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> </span><br><span>      if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*lu)) {</span><br><span>                LOGP(DMSC, LOGL_ERROR, "LU too small to look at: %u\n", msgb_l3len(msg));</span><br><span>@@ -416,6 +420,47 @@</span><br><span>           LOGP(DMSC, LOGL_DEBUG, "Marking con for welcome USSD.\n");</span><br><span>                 conn->new_subscriber = 1;</span><br><span>         }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   rc8 = osmo_gsm48_rfpowercap2powerclass(bts->band, lu->classmark1.pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (rc8 < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Unable to decode RF power capability %x from classmark1 during LU.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     lu->classmark1.pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+              rc8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     conn_update_ms_power_class(conn, rc8);</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%);">+/* TS 04.08 sec 9.2.15 "Location updating request" */</span><br><span style="color: hsl(120, 100%, 40%);">+static void handle_cm_serv_req(struct gsm_subscriber_connection *conn,</span><br><span style="color: hsl(120, 100%, 40%);">+                              struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm48_hdr *gh;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm48_service_request *serv_req;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm48_classmark2* cm2;</span><br><span style="color: hsl(120, 100%, 40%);">+ int8_t rc8;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = conn_get_bts(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (msgb_l3len(msg) < sizeof(*gh) + sizeof(*serv_req)) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGP(DMSC, LOGL_ERROR, "CM Serv Req too small to look at: %u\n", msgb_l3len(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</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%);">+   gh = msgb_l3(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+    serv_req = (struct gsm48_service_request *) gh->data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    cm2 = (struct gsm48_classmark2*)(((uint8_t*)&serv_req->classmark)+1);</span><br><span style="color: hsl(120, 100%, 40%);">+  /* FIXME: one classmark2 is available in libosmocore:</span><br><span style="color: hsl(120, 100%, 40%);">+ cm2 = &serv_req->classmark2; */</span><br><span style="color: hsl(120, 100%, 40%);">+        rc8 = osmo_gsm48_rfpowercap2powerclass(bts->band, cm2->pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (rc8 < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Unable to decode RF power capability %x from classmark2 during CM Service Req.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 cm2->pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+                rc8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     conn_update_ms_power_class(conn, rc8);</span><br><span> }</span><br><span> </span><br><span> int bsc_scan_bts_msg(struct gsm_subscriber_connection *conn, struct msgb *msg)</span><br><span>@@ -427,6 +472,8 @@</span><br><span>      if (pdisc == GSM48_PDISC_MM) {</span><br><span>               if (mtype == GSM48_MT_MM_LOC_UPD_REQUEST)</span><br><span>                    handle_lu_request(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+         else if(mtype == GSM48_MT_MM_CM_SERV_REQ)</span><br><span style="color: hsl(120, 100%, 40%);">+                     handle_cm_serv_req(conn, msg);</span><br><span>       } else if (pdisc == GSM48_PDISC_RR) {</span><br><span>                if (mtype == GSM48_MT_RR_PAG_RESP)</span><br><span>                   handle_page_resp(conn, msg);</span><br><span>@@ -677,8 +724,20 @@</span><br><span>             const uint8_t *cm2, uint8_t cm2_len,</span><br><span>                 const uint8_t *cm3, uint8_t cm3_len)</span><br><span> {</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm48_classmark2 *cm2_parsed = (struct gsm48_classmark2 *)cm2;</span><br><span style="color: hsl(120, 100%, 40%);">+ int8_t rc8;</span><br><span>  int rc;</span><br><span>      struct msgb *resp;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts = conn_get_bts(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   rc8 = osmo_gsm48_rfpowercap2powerclass(bts->band, cm2_parsed->pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc8 < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+             LOGP(DMSC, LOGL_NOTICE,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Unable to decode RF power capability %x from classmark1 during CM Update.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+              cm2_parsed->pwr_lev);</span><br><span style="color: hsl(120, 100%, 40%);">+         rc8 = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     conn_update_ms_power_class(conn, rc8);</span><br><span> </span><br><span>   if (!msc_connected(conn))</span><br><span>            return;</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 1c2c4d8..2a77837 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -24,6 +24,7 @@</span><br><span> #include <errno.h></span><br><span> #include <ctype.h></span><br><span> #include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span> #include <netinet/in.h></span><br><span> #include <talloc.h></span><br><span> </span><br><span>@@ -1685,6 +1686,67 @@</span><br><span>   return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void conn_update_ms_power_class(struct gsm_subscriber_connection *conn, uint8_t power_class)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        struct gsm_bts *bts = conn_get_bts(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+     LOGP(DRLL, LOGL_DEBUG, "MS Power class update: %" PRIu8 " -> %" PRIu8 "\n",</span><br><span style="color: hsl(120, 100%, 40%);">+       conn->ms_power_class, power_class);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ conn->ms_power_class = power_class;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* If there's an associated lchan, attempt to update its max power to be</span><br><span style="color: hsl(120, 100%, 40%);">+     on track with band maximum values */</span><br><span style="color: hsl(120, 100%, 40%);">+       if (conn->lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+           lchan_update_ms_power_ctrl_level(conn->lchan, bts->ms_max_power);</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%);">+void lchan_update_ms_power_ctrl_level(struct gsm_lchan *lchan, int ms_power_dbm)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts *bts = lchan->ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_subscriber_connection *conn = lchan->conn;</span><br><span style="color: hsl(120, 100%, 40%);">+      int max_pwr_dbm_pwclass, new_pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   LOG_LCHAN(lchan, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+            "MS Power level update requested: %d dBm\n", ms_power_dbm);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (!conn)</span><br><span style="color: hsl(120, 100%, 40%);">+            goto ms_power_default;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if (conn->ms_power_class == 0)</span><br><span style="color: hsl(120, 100%, 40%);">+             goto ms_power_default;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      if ((max_pwr_dbm_pwclass = (int)ms_class_gmsk_dbm(bts->band, conn->ms_power_class)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+           LOG_LCHAN(lchan, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Failed getting max ms power for power class %" PRIu8</span><br><span style="color: hsl(120, 100%, 40%);">+                       " on band %s, providing default max ms power\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                    conn->ms_power_class, gsm_band_name(bts->band));</span><br><span style="color: hsl(120, 100%, 40%);">+               goto ms_power_default;</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%);">+   /* Current configured max pwr is above maximum one allowed on</span><br><span style="color: hsl(120, 100%, 40%);">+    current band + ms power class, so use that one. */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ms_power_dbm > max_pwr_dbm_pwclass)</span><br><span style="color: hsl(120, 100%, 40%);">+            ms_power_dbm = max_pwr_dbm_pwclass;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ms_power_default:</span><br><span style="color: hsl(120, 100%, 40%);">+      if ((new_pwr = ms_pwr_ctl_lvl(bts->band, ms_power_dbm)) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOG_LCHAN(lchan, LOGL_INFO,</span><br><span style="color: hsl(120, 100%, 40%);">+                    "Failed getting max ms power level %d on band %s,"</span><br><span style="color: hsl(120, 100%, 40%);">+                  " providing default max ms power\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        ms_power_dbm, gsm_band_name(bts->band));</span><br><span style="color: hsl(120, 100%, 40%);">+          return;</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%);">+   LOG_LCHAN(lchan, LOGL_DEBUG,</span><br><span style="color: hsl(120, 100%, 40%);">+            "MS Power level update (power class %" PRIu8 "): %" PRIu8 " -> %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                conn ? conn->ms_power_class : 0, lchan->ms_power, new_pwr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan->ms_power = new_pwr;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: if chan is active and lchan->ms_power != new_pwr, consider</span><br><span style="color: hsl(120, 100%, 40%);">+          sending an MS Power Control message (RSL) towards BTS to announce the</span><br><span style="color: hsl(120, 100%, 40%);">+         new max ms power lvl, see rsl_chan_ms_power_ctrl() */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const struct value_string lchan_activate_mode_names[] = {</span><br><span>   OSMO_VALUE_STRING(FOR_NONE),</span><br><span>         OSMO_VALUE_STRING(FOR_MS_CHANNEL_REQUEST),</span><br><span>diff --git a/src/osmo-bsc/lchan_fsm.c b/src/osmo-bsc/lchan_fsm.c</span><br><span>index f2fef99..9ca73df 100644</span><br><span>--- a/src/osmo-bsc/lchan_fsm.c</span><br><span>+++ b/src/osmo-bsc/lchan_fsm.c</span><br><span>@@ -511,6 +511,7 @@</span><br><span>        struct osmo_mgcpc_ep_ci *use_mgwep_ci;</span><br><span>       struct gsm_lchan *old_lchan = lchan->activate.info.re_use_mgw_endpoint_from_lchan;</span><br><span>        struct lchan_activate_info *info = &lchan->activate.info;</span><br><span style="color: hsl(120, 100%, 40%);">+      int ms_power_dbm;</span><br><span> </span><br><span>        if (lchan->release.requested) {</span><br><span>           lchan_fail("Release requested while activating");</span><br><span>@@ -522,11 +523,12 @@</span><br><span>  /* If there is a previous lchan, and the new lchan is on the same cell as previous one,</span><br><span>       * take over power and TA values. Otherwise, use max power and zero TA. */</span><br><span>   if (old_lchan && old_lchan->ts->trx->bts == bts) {</span><br><span style="color: hsl(0, 100%, 40%);">-             lchan->ms_power = old_lchan->ms_power;</span><br><span style="color: hsl(120, 100%, 40%);">+          ms_power_dbm = ms_pwr_dbm(bts->band, old_lchan->ms_power);</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_update_ms_power_ctrl_level(lchan, ms_power_dbm >= 0 ? ms_power_dbm : bts->ms_max_power);</span><br><span>                 lchan->bs_power = old_lchan->bs_power;</span><br><span>                 lchan->rqd_ta = old_lchan->rqd_ta;</span><br><span>     } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                lchan->ms_power = ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);</span><br><span style="color: hsl(120, 100%, 40%);">+              lchan_update_ms_power_ctrl_level(lchan, bts->ms_max_power);</span><br><span>               /* Upon last entering the UNUSED state, from lchan_reset():</span><br><span>           * - bs_power is still zero, 0dB reduction, output power = Pn.</span><br><span>                * - TA is still zero, to be determined by RACH. */</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/15926">change 15926</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/+/15926"/><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: I6bff440b7797e710bca5af94fae546e5d55e6972 </div>
<div style="display:none"> Gerrit-Change-Number: 15926 </div>
<div style="display:none"> Gerrit-PatchSet: 7 </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: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </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>