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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Fill Last Used E-UTRAN PLMN Id when in CSFB<br><br>Since recently, osmo-bsc behaves strictly as per specs, meaning it will<br>only send the "Cell selection indicator after release of all TCH and SDCCH IE"<br>in RR Channel Release iff:<br>* "Last Used E-UTRAN PLMN Id" was received in the CommonID sent MSC->BSC<br>* "Last Used E-UTRAN PLMN Id" was received insider "old BSS to new BSS Information"<br>  in the HandoverRequest sent MSC->BSC.<br>On the other hand, CSFB_Indicator from ClearCommand MSC->BSC is nw<br>ignored and not taken into account.<br><br>Hence, let's update osmo-msc to also behave correctly by sending the<br>Last Used E-UTRAN PLMN ID at CommonID tx time to avoid regressions in<br>CSFB support when running against newer osmo-bsc.<br><br>Let's keep sending the CSFB Indicator in ClearCommand as we used too, in<br>order to keep compatibility with older BSCs (as per spec).<br><br>Related: SYS#5337<br>Change-Id: Ic5f175b179973d0a50d94f00e15f5a3e332605fc<br>---<br>M include/osmocom/msc/ran_msg.h<br>M include/osmocom/msc/vlr.h<br>M include/osmocom/msc/vlr_sgs.h<br>M src/libmsc/gsm_04_08.c<br>M src/libmsc/msc_a.c<br>M src/libmsc/ran_msg_a.c<br>M src/libmsc/sgs_iface.c<br>M src/libvlr/vlr.c<br>M src/libvlr/vlr_sgs.c<br>9 files changed, 86 insertions(+), 5 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/ran_msg.h b/include/osmocom/msc/ran_msg.h</span><br><span>index 3b08b46..1303ba3 100644</span><br><span>--- a/include/osmocom/msc/ran_msg.h</span><br><span>+++ b/include/osmocom/msc/ran_msg.h</span><br><span>@@ -220,6 +220,8 @@</span><br><span>             } cipher_mode_reject;</span><br><span>                struct {</span><br><span>                     const char *imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+                     bool last_eutran_plmn_present;</span><br><span style="color: hsl(120, 100%, 40%);">+                        struct osmo_plmn_id last_eutran_plmn;</span><br><span>                } common_id;</span><br><span>                 struct {</span><br><span>                     enum gsm48_reject_value cause;</span><br><span>diff --git a/include/osmocom/msc/vlr.h b/include/osmocom/msc/vlr.h</span><br><span>index 3b9bbc4..6e65283 100644</span><br><span>--- a/include/osmocom/msc/vlr.h</span><br><span>+++ b/include/osmocom/msc/vlr.h</span><br><span>@@ -193,6 +193,8 @@</span><br><span>                vlr_sgs_lu_mminfo_cb_t mminfo_cb;</span><br><span>            enum sgsap_service_ind paging_serv_ind;</span><br><span>              struct osmo_timer_list Ts5;</span><br><span style="color: hsl(120, 100%, 40%);">+           bool last_eutran_plmn_present;</span><br><span style="color: hsl(120, 100%, 40%);">+                struct osmo_plmn_id last_eutran_plmn;</span><br><span>        } sgs;</span><br><span> </span><br><span>   struct osmo_gsm48_classmark classmark;</span><br><span>@@ -398,6 +400,8 @@</span><br><span> void vlr_subscr_set_imei(struct vlr_subscr *vsub, const char *imei);</span><br><span> void vlr_subscr_set_imeisv(struct vlr_subscr *vsub, const char *imeisv);</span><br><span> void vlr_subscr_set_msisdn(struct vlr_subscr *vsub, const char *msisdn);</span><br><span style="color: hsl(120, 100%, 40%);">+void vlr_subscr_set_last_used_eutran_plmn_id(struct vlr_subscr *vsub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        const struct osmo_plmn_id *last_eutran_plmn);</span><br><span> </span><br><span> bool vlr_subscr_matches_imsi(struct vlr_subscr *vsub, const char *imsi);</span><br><span> bool vlr_subscr_matches_tmsi(struct vlr_subscr *vsub, uint32_t tmsi);</span><br><span>diff --git a/include/osmocom/msc/vlr_sgs.h b/include/osmocom/msc/vlr_sgs.h</span><br><span>index fa9d948..1a4984d 100644</span><br><span>--- a/include/osmocom/msc/vlr_sgs.h</span><br><span>+++ b/include/osmocom/msc/vlr_sgs.h</span><br><span>@@ -97,7 +97,7 @@</span><br><span> int vlr_sgs_loc_update(struct vlr_instance *vlr, struct vlr_sgs_cfg *cfg,</span><br><span>                       vlr_sgs_lu_response_cb_t response_cb, vlr_sgs_lu_paging_cb_t paging_cb,</span><br><span>                      vlr_sgs_lu_mminfo_cb_t mminfo_cb, char *mme_name, enum vlr_lu_type type, const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                      struct osmo_location_area_id *new_lai);</span><br><span style="color: hsl(120, 100%, 40%);">+                       struct osmo_location_area_id *new_lai, struct osmo_plmn_id *last_eutran_plmn);</span><br><span> void vlr_sgs_loc_update_acc_sent(struct vlr_subscr *vsub);</span><br><span> void vlr_sgs_loc_update_rej_sent(struct vlr_subscr *vsub);</span><br><span> void vlr_sgs_detach(struct vlr_instance *vlr, const char *imsi, bool eps);</span><br><span>diff --git a/src/libmsc/gsm_04_08.c b/src/libmsc/gsm_04_08.c</span><br><span>index 6379059..58ef074 100644</span><br><span>--- a/src/libmsc/gsm_04_08.c</span><br><span>+++ b/src/libmsc/gsm_04_08.c</span><br><span>@@ -1368,12 +1368,19 @@</span><br><span> static int msc_vlr_tx_common_id(void *msc_conn_ref)</span><br><span> {</span><br><span>   struct msc_a *msc_a = msc_conn_ref;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct vlr_subscr *vsub = msc_a_vsub(msc_a);</span><br><span>         struct ran_msg msg = {</span><br><span>               .msg_type = RAN_MSG_COMMON_ID,</span><br><span>               .common_id = {</span><br><span style="color: hsl(0, 100%, 40%);">-                  .imsi = msc_a_vsub(msc_a)->imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                   .imsi = vsub->imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                        .last_eutran_plmn_present = vsub->sgs.last_eutran_plmn_present,</span><br><span>           },</span><br><span>   };</span><br><span style="color: hsl(120, 100%, 40%);">+    if (vsub->sgs.last_eutran_plmn_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+          memcpy(&msg.common_id.last_eutran_plmn, &vsub->sgs.last_eutran_plmn,</span><br><span style="color: hsl(120, 100%, 40%);">+                       sizeof(vsub->sgs.last_eutran_plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  return msc_a_ran_down(msc_a, MSC_ROLE_I, &msg);</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/libmsc/msc_a.c b/src/libmsc/msc_a.c</span><br><span>index 0645c54..daa5bc7 100644</span><br><span>--- a/src/libmsc/msc_a.c</span><br><span>+++ b/src/libmsc/msc_a.c</span><br><span>@@ -1648,8 +1648,13 @@</span><br><span>           .msg_type = RAN_MSG_COMMON_ID,</span><br><span>               .common_id = {</span><br><span>                       .imsi = vsub->imsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                        .last_eutran_plmn_present = vsub->sgs.last_eutran_plmn_present,</span><br><span>           },</span><br><span>   };</span><br><span style="color: hsl(120, 100%, 40%);">+    if (vsub->sgs.last_eutran_plmn_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+          memcpy(&msg.common_id.last_eutran_plmn, &vsub->sgs.last_eutran_plmn,</span><br><span style="color: hsl(120, 100%, 40%);">+                       sizeof(vsub->sgs.last_eutran_plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span> </span><br><span>        return msc_a_ran_down(msc_a, to_role, &msg);</span><br><span> }</span><br><span>diff --git a/src/libmsc/ran_msg_a.c b/src/libmsc/ran_msg_a.c</span><br><span>index 2890076..4cce289 100644</span><br><span>--- a/src/libmsc/ran_msg_a.c</span><br><span>+++ b/src/libmsc/ran_msg_a.c</span><br><span>@@ -1218,7 +1218,11 @@</span><br><span>          return ran_a_make_assignment_command(caller_fi, &ran_enc_msg->assignment_command);</span><br><span> </span><br><span>        case RAN_MSG_COMMON_ID:</span><br><span style="color: hsl(0, 100%, 40%);">-         return gsm0808_create_common_id(ran_enc_msg->common_id.imsi, NULL, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+          return gsm0808_create_common_id(ran_enc_msg->common_id.imsi, NULL,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         ran_enc_msg->common_id.last_eutran_plmn_present ?</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  &ran_enc_msg->common_id.last_eutran_plmn :</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     NULL</span><br><span style="color: hsl(120, 100%, 40%);">+                                          );</span><br><span> </span><br><span>       case RAN_MSG_CIPHER_MODE_COMMAND:</span><br><span>            return ran_a_make_cipher_mode_command(caller_fi, &ran_enc_msg->cipher_mode_command);</span><br><span>diff --git a/src/libmsc/sgs_iface.c b/src/libmsc/sgs_iface.c</span><br><span>index d13449d..04302ae 100644</span><br><span>--- a/src/libmsc/sgs_iface.c</span><br><span>+++ b/src/libmsc/sgs_iface.c</span><br><span>@@ -608,12 +608,14 @@</span><br><span>     char *mme_name;</span><br><span>      struct vlr_sgs_cfg vlr_sgs_cfg;</span><br><span>      struct vlr_subscr *vsub;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_plmn_id last_eutran_plmn_buf, *last_eutran_plmn = NULL;</span><br><span> </span><br><span>      /* Check for lingering connections */</span><br><span>        vsub = vlr_subscr_find_by_imsi(gsm_network->vlr, imsi, __func__);</span><br><span>         if (vsub) {</span><br><span>          subscr_conn_toss(vsub);</span><br><span>              vlr_subscr_put(vsub, __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+               vsub = NULL;</span><br><span>         }</span><br><span> </span><br><span>        /* Determine MME-Name */</span><br><span>@@ -639,11 +641,29 @@</span><br><span>             return sgs_tx_status(sgc, imsi, SGSAP_SGS_CAUSE_MISSING_MAND_IE, msg, SGSAP_IE_LAI);</span><br><span>         gsm48_decode_lai2(gsm48_lai, &new_lai);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       /* 3GPP TS 23.272 sec 4.3.3 (CSFB):</span><br><span style="color: hsl(120, 100%, 40%);">+    * "During the SGs location update procedure, obtaining the last used LTE PLMN ID via TAI"</span><br><span style="color: hsl(120, 100%, 40%);">+   */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (TLVP_PRES_LEN(tp, SGSAP_IE_TAI, 3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             last_eutran_plmn = &last_eutran_plmn_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_plmn_from_bcd(TLVP_VAL(tp, SGSAP_IE_TAI), last_eutran_plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+             /* TODO: we could also gather the TAC from here, but we don't need it yet */</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (TLVP_PRES_LEN(tp, SGSAP_IE_EUTRAN_CGI, 3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Since TAI is optional, let's try harder getting Last Used</span><br><span style="color: hsl(120, 100%, 40%);">+               * E-UTRAN PLMN ID by fetching it from E-UTRAN CGI */</span><br><span style="color: hsl(120, 100%, 40%);">+         last_eutran_plmn = &last_eutran_plmn_buf;</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_plmn_from_bcd(TLVP_VAL(tp, SGSAP_IE_EUTRAN_CGI), last_eutran_plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+              /* TODO: we could also gather the ECI from here, but we don't need it yet */</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGSGC(sgc, LOGL_INFO, "Receiving SGsAP-LOCATION-UPDATE-REQUEST without TAI nor "</span><br><span style="color: hsl(120, 100%, 40%);">+                  "E-CGI IEs, fast fallback GERAN->EUTRAN won't be possible!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Perform actual location update */</span><br><span>         memcpy(vlr_sgs_cfg.timer, sgc->sgs->cfg.timer, sizeof(vlr_sgs_cfg.timer));</span><br><span>     memcpy(vlr_sgs_cfg.counter, sgc->sgs->cfg.counter, sizeof(vlr_sgs_cfg.counter));</span><br><span>       rc = vlr_sgs_loc_update(gsm_network->vlr, &vlr_sgs_cfg, sgs_tx_loc_upd_resp_cb, sgs_iface_tx_paging,</span><br><span style="color: hsl(0, 100%, 40%);">-                             sgs_tx_mm_info_cb, mme_name, type, imsi, &new_lai);</span><br><span style="color: hsl(120, 100%, 40%);">+                               sgs_tx_mm_info_cb, mme_name, type, imsi, &new_lai, last_eutran_plmn);</span><br><span>    if (rc != 0) {</span><br><span>               resp = gsm29118_create_lu_rej(imsi, SGSAP_SGS_CAUSE_IMSI_UNKNOWN, NULL);</span><br><span>             sgs_tx(sgc, resp);</span><br><span>@@ -905,6 +925,26 @@</span><br><span>    if (!vsub)</span><br><span>           return sgs_tx_status(sgc, imsi, SGSAP_SGS_CAUSE_IMSI_UNKNOWN, msg, SGSAP_IE_IMSI);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        /* 3GPP TS 23.272 sec 4.3.3 (CSFB):</span><br><span style="color: hsl(120, 100%, 40%);">+    * "During the SGs location update procedure, obtaining the last used LTE PLMN ID via TAI"</span><br><span style="color: hsl(120, 100%, 40%);">+   */</span><br><span style="color: hsl(120, 100%, 40%);">+   vsub->sgs.last_eutran_plmn_present = TLVP_PRES_LEN(tp, SGSAP_IE_EUTRAN_CGI, 3);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (TLVP_PRES_LEN(tp, SGSAP_IE_TAI, 3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+             vsub->sgs.last_eutran_plmn_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_plmn_from_bcd(TLVP_VAL(tp, SGSAP_IE_TAI), &vsub->sgs.last_eutran_plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+           /* TODO: we could also gather the TAC from here, but we don't need it yet */</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (TLVP_PRES_LEN(tp, SGSAP_IE_EUTRAN_CGI, 3)) {</span><br><span style="color: hsl(120, 100%, 40%);">+               /* Since TAI is optional, let's try harder getting Last Used</span><br><span style="color: hsl(120, 100%, 40%);">+               * E-UTRAN PLMN ID by fetching it from E-UTRAN CGI */</span><br><span style="color: hsl(120, 100%, 40%);">+         vsub->sgs.last_eutran_plmn_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_plmn_from_bcd(TLVP_VAL(tp, SGSAP_IE_EUTRAN_CGI), &vsub->sgs.last_eutran_plmn);</span><br><span style="color: hsl(120, 100%, 40%);">+            /* TODO: we could also gather the ECI from here, but we don't need it yet */</span><br><span style="color: hsl(120, 100%, 40%);">+      } else if (!vsub->sgs.last_eutran_plmn_present) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGSGC(sgc, LOGL_INFO, "Receiving SGsAP-MO-CSFB-INDICATION without TAI nor "</span><br><span style="color: hsl(120, 100%, 40%);">+                       "E-CGI IEs, and they are not known from previous SGsAP-LOCATION-UPDATE-REQUEST. "</span><br><span style="color: hsl(120, 100%, 40%);">+                   "Fast fallback GERAN->EUTRAN won't be possible!\n");</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  /* Check for lingering connections */</span><br><span>        subscr_conn_toss(vsub);</span><br><span> </span><br><span>diff --git a/src/libvlr/vlr.c b/src/libvlr/vlr.c</span><br><span>index 33d6331..02aceef 100644</span><br><span>--- a/src/libvlr/vlr.c</span><br><span>+++ b/src/libvlr/vlr.c</span><br><span>@@ -476,6 +476,23 @@</span><br><span>             vsub->imsi, vsub->msisdn);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void vlr_subscr_set_last_used_eutran_plmn_id(struct vlr_subscr *vsub,</span><br><span style="color: hsl(120, 100%, 40%);">+                                            const struct osmo_plmn_id *last_eutran_plmn)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!vsub)</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</span><br><span style="color: hsl(120, 100%, 40%);">+       if (last_eutran_plmn) {</span><br><span style="color: hsl(120, 100%, 40%);">+               vsub->sgs.last_eutran_plmn_present = true;</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(&vsub->sgs.last_eutran_plmn, last_eutran_plmn, sizeof(*last_eutran_plmn));</span><br><span style="color: hsl(120, 100%, 40%);">+      } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              vsub->sgs.last_eutran_plmn_present = false;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+     DEBUGP(DVLR, "set Last E-UTRAN PLMN ID on subscriber: %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+               vsub->sgs.last_eutran_plmn_present ?</span><br><span style="color: hsl(120, 100%, 40%);">+                 osmo_plmn_name(&vsub->sgs.last_eutran_plmn) :</span><br><span style="color: hsl(120, 100%, 40%);">+          "(none)");</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> bool vlr_subscr_matches_imsi(struct vlr_subscr *vsub, const char *imsi)</span><br><span> {</span><br><span>   return vsub && imsi && vsub->imsi[0] && !strcmp(vsub->imsi, imsi);</span><br><span>diff --git a/src/libvlr/vlr_sgs.c b/src/libvlr/vlr_sgs.c</span><br><span>index 269dda6..5659886 100644</span><br><span>--- a/src/libvlr/vlr_sgs.c</span><br><span>+++ b/src/libvlr/vlr_sgs.c</span><br><span>@@ -68,11 +68,12 @@</span><br><span>  * \param[in] type location update type (normal or IMSI attach).</span><br><span>  * \param[in] imsi mobile identity (IMSI).</span><br><span>  * \param[in] new_lai identifier of the new location area.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param[in] last_eutran_plnm_id Last E-UTRAN PLMN ID (can be NULL).</span><br><span>  * \returns 0 in case of success, -EINVAL in case of error. */</span><br><span> int vlr_sgs_loc_update(struct vlr_instance *vlr, struct vlr_sgs_cfg *cfg,</span><br><span>                   vlr_sgs_lu_response_cb_t response_cb, vlr_sgs_lu_paging_cb_t paging_cb,</span><br><span>                      vlr_sgs_lu_mminfo_cb_t mminfo_cb, char *mme_name, enum vlr_lu_type type, const char *imsi,</span><br><span style="color: hsl(0, 100%, 40%);">-                      struct osmo_location_area_id *new_lai)</span><br><span style="color: hsl(120, 100%, 40%);">+                struct osmo_location_area_id *new_lai, struct osmo_plmn_id *last_eutran_plmn)</span><br><span> {</span><br><span>    struct vlr_subscr *vsub = NULL;</span><br><span> </span><br><span>@@ -93,6 +94,7 @@</span><br><span>      vsub->sgs.paging_cb = paging_cb;</span><br><span>  vsub->sgs.mminfo_cb = mminfo_cb;</span><br><span>  vlr_subscr_set_imsi(vsub, imsi);</span><br><span style="color: hsl(120, 100%, 40%);">+      vlr_subscr_set_last_used_eutran_plmn_id(vsub, last_eutran_plmn);</span><br><span>     osmo_strlcpy(vsub->sgs.mme_name, mme_name, sizeof(vsub->sgs.mme_name));</span><br><span> </span><br><span>    osmo_fsm_inst_dispatch(vsub->sgs_fsm, SGS_UE_E_RX_LU_FROM_MME, NULL);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-msc/+/23915">change 23915</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-msc/+/23915"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic5f175b179973d0a50d94f00e15f5a3e332605fc </div>
<div style="display:none"> Gerrit-Change-Number: 23915 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </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 <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>