<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>