<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/25016">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: add RSL port args in MSC_ConnHdlr, RSLEM<br><br>Add explicit RSL_DCHAN_PT and RSLEM_PROC_PT args to functions and<br>altsteps related to channel establishment and assignment. This allows<br>establishing and assigning a channel on cells other than bts 0.<br><br>This is required for upcoming BSC_Tests.TC_cm_reestablishment().<br><br>Related: SYS#5130<br>Change-Id: Ic3206b7125ee22bf98330080d9b136cefe7da03f<br>---<br>M bsc/MSC_ConnectionHandler.ttcn<br>M library/RSL_Emulation.ttcn<br>2 files changed, 37 insertions(+), 36 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/16/25016/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/MSC_ConnectionHandler.ttcn b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>index fc12307..af93343 100644</span><br><span>--- a/bsc/MSC_ConnectionHandler.ttcn</span><br><span>+++ b/bsc/MSC_ConnectionHandler.ttcn</span><br><span>@@ -187,11 +187,11 @@</span><br><span> </span><br><span> /* altstep for handling of IPACC media related commands. Activated by as_Media() to test</span><br><span> * RSL level media handling */</span><br><span style="color: hsl(0, 100%, 40%);">-altstep as_Media_ipacc() runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_Media_ipacc(RSL_DCHAN_PT rsl_pt := RSL, RSL_DCHAN_PT rsl_pt_ho_target := RSL1) runs on MSC_ConnHdlr {</span><br><span> var RSL_Message rsl;</span><br><span> var RSL_IE_Body ie;</span><br><span> var boolean b_unused;</span><br><span style="color: hsl(0, 100%, 40%);">- [not g_media.bts.ipa_crcx_seen] RSL.receive(tr_RSL_IPA_CRCX(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+ [not g_media.bts.ipa_crcx_seen] rsl_pt.receive(tr_RSL_IPA_CRCX(g_chan_nr)) -> value rsl {</span><br><span> /* Extract parameters from request + use in response */</span><br><span> if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD, ie)) {</span><br><span> g_media.bts.rtp_pt := ie.ipa_rtp_pt;</span><br><span>@@ -199,14 +199,14 @@</span><br><span> if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD2, ie)) {</span><br><span> g_media.bts.rtp_pt := ie.ipa_rtp_pt2;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_IPA_CRCX_ACK(g_chan_nr, g_media.bts.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_IPA_CRCX_ACK(g_chan_nr, g_media.bts.conn_id,</span><br><span> f_inet_addr(g_media.bts.bts.host),</span><br><span> g_media.bts.bts.port_nr,</span><br><span> g_media.bts.rtp_pt));</span><br><span> g_media.bts.ipa_crcx_seen := true;</span><br><span> repeat;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [g_media.bts.ipa_crcx_seen] RSL.receive(tr_RSL_IPA_MDCX(g_chan_nr, ?)) -> value rsl{</span><br><span style="color: hsl(120, 100%, 40%);">+ [g_media.bts.ipa_crcx_seen] rsl_pt.receive(tr_RSL_IPA_MDCX(g_chan_nr, ?)) -> value rsl{</span><br><span> /* Extract conn_id, ip, port, rtp_pt2 from request + use in response */</span><br><span> b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_CONN_ID, ie);</span><br><span> if (g_media.bts.conn_id != ie.ipa_conn_id) {</span><br><span>@@ -224,7 +224,7 @@</span><br><span> if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD2, ie)) {</span><br><span> g_media.bts.rtp_pt := ie.ipa_rtp_pt2;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_IPA_MDCX_ACK(g_chan_nr, g_media.bts.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_IPA_MDCX_ACK(g_chan_nr, g_media.bts.conn_id,</span><br><span> f_inet_addr(g_media.bts.peer.host),</span><br><span> g_media.bts.peer.port_nr,</span><br><span> g_media.bts.rtp_pt));</span><br><span>@@ -233,7 +233,7 @@</span><br><span> }</span><br><span> </span><br><span> /* on second (new) BTS during hand-over */</span><br><span style="color: hsl(0, 100%, 40%);">- [not g_media.bts1.ipa_crcx_seen] RSL1.receive(tr_RSL_IPA_CRCX(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+ [not g_media.bts1.ipa_crcx_seen] rsl_pt_ho_target.receive(tr_RSL_IPA_CRCX(g_chan_nr)) -> value rsl {</span><br><span> /* Extract parameters from request + use in response */</span><br><span> if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD, ie)) {</span><br><span> g_media.bts1.rtp_pt := ie.ipa_rtp_pt;</span><br><span>@@ -241,7 +241,7 @@</span><br><span> if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD2, ie)) {</span><br><span> g_media.bts1.rtp_pt := ie.ipa_rtp_pt2;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- RSL1.send(ts_RSL_IPA_CRCX_ACK(g_chan_nr, g_media.bts1.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt_ho_target.send(ts_RSL_IPA_CRCX_ACK(g_chan_nr, g_media.bts1.conn_id,</span><br><span> f_inet_addr(g_media.bts1.bts.host),</span><br><span> g_media.bts1.bts.port_nr,</span><br><span> g_media.bts1.rtp_pt));</span><br><span>@@ -249,7 +249,7 @@</span><br><span> repeat;</span><br><span> }</span><br><span> /* on second (new) BTS during hand-over */</span><br><span style="color: hsl(0, 100%, 40%);">- [g_media.bts1.ipa_crcx_seen] RSL1.receive(tr_RSL_IPA_MDCX(g_chan_nr, ?)) -> value rsl{</span><br><span style="color: hsl(120, 100%, 40%);">+ [g_media.bts1.ipa_crcx_seen] rsl_pt_ho_target.receive(tr_RSL_IPA_MDCX(g_chan_nr, ?)) -> value rsl{</span><br><span> /* Extract conn_id, ip, port, rtp_pt2 from request + use in response */</span><br><span> b_unused := f_rsl_find_ie(rsl, RSL_IE_IPAC_CONN_ID, ie);</span><br><span> if (g_media.bts1.conn_id != ie.ipa_conn_id) {</span><br><span>@@ -267,7 +267,7 @@</span><br><span> if (f_rsl_find_ie(rsl, RSL_IE_IPAC_RTP_PAYLOAD2, ie)) {</span><br><span> g_media.bts1.rtp_pt := ie.ipa_rtp_pt2;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- RSL1.send(ts_RSL_IPA_MDCX_ACK(g_chan_nr, g_media.bts1.conn_id,</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt_ho_target.send(ts_RSL_IPA_MDCX_ACK(g_chan_nr, g_media.bts1.conn_id,</span><br><span> f_inet_addr(g_media.bts1.peer.host),</span><br><span> g_media.bts1.peer.port_nr,</span><br><span> g_media.bts1.rtp_pt));</span><br><span>@@ -654,17 +654,17 @@</span><br><span> }</span><br><span> </span><br><span> function f_rsl_send_l3(template PDU_ML3_MS_NW l3, template (omit) RslLinkId link_id := omit,</span><br><span style="color: hsl(0, 100%, 40%);">- template (omit) RslChannelNr chan_nr := omit) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ template (omit) RslChannelNr chan_nr := omit, RSL_DCHAN_PT rsl_pt := RSL) runs on MSC_ConnHdlr {</span><br><span> if (not isvalue(link_id)) {</span><br><span> link_id := ts_RslLinkID_DCCH(0);</span><br><span> }</span><br><span> if (not isvalue(chan_nr)) {</span><br><span> chan_nr := g_chan_nr;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_DATA_IND(valueof(chan_nr), valueof(link_id), enc_PDU_ML3_MS_NW(valueof(l3))));</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_DATA_IND(valueof(chan_nr), valueof(link_id), enc_PDU_ML3_MS_NW(valueof(l3))));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_rsl_reply(template PDU_ML3_MS_NW l3, RSL_Message orig) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+function f_rsl_reply(template PDU_ML3_MS_NW l3, RSL_Message orig, RSL_DCHAN_PT rsl_pt := RSL) runs on MSC_ConnHdlr {</span><br><span> var RslChannelNr chan_nr := orig.ies[0].body.chan_nr;</span><br><span> var RslLinkId link_id;</span><br><span> if (orig.msg_type == RSL_MT_ENCR_CMD) {</span><br><span>@@ -672,7 +672,7 @@</span><br><span> } else {</span><br><span> link_id := orig.ies[1].body.link_id;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- f_rsl_send_l3(l3, link_id, chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rsl_send_l3(l3, link_id, chan_nr, rsl_pt := rsl_pt);</span><br><span> }</span><br><span> </span><br><span> /* Convert the cipher representation on BSSMAP to the representation used on RSL */</span><br><span>@@ -783,7 +783,8 @@</span><br><span> setverdict(pass);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-function f_cipher_mode(TestHdlrEncrParams enc, boolean exp_fail := false)</span><br><span style="color: hsl(120, 100%, 40%);">+function f_cipher_mode(TestHdlrEncrParams enc, boolean exp_fail := false,</span><br><span style="color: hsl(120, 100%, 40%);">+ RSL_DCHAN_PT rsl_pt := RSL, RSLEM_PROC_PT rsl_proc_pt := RSL_PROC)</span><br><span> runs on MSC_ConnHdlr {</span><br><span> var PDU_BSSAP bssap;</span><br><span> var RSL_Message rsl;</span><br><span>@@ -796,14 +797,14 @@</span><br><span> </span><br><span> alt {</span><br><span> /* RSL/UE Side */</span><br><span style="color: hsl(0, 100%, 40%);">- [] RSL.receive(tr_RSL_ENCR_CMD(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] rsl_pt.receive(tr_RSL_ENCR_CMD(g_chan_nr)) -> value rsl {</span><br><span> var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[3].body.l3_info.payload);</span><br><span> log("Rx L3 from net: ", l3);</span><br><span> </span><br><span> f_verify_encr_info(rsl);</span><br><span> </span><br><span> if (ischosen(l3.msgs.rrm.cipheringModeCommand)) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_rsl_reply(ts_RRM_CiphModeCompl, rsl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rsl_reply(ts_RRM_CiphModeCompl, rsl, rsl_pt := rsl_pt);</span><br><span> }</span><br><span> repeat;</span><br><span> }</span><br><span>@@ -956,9 +957,9 @@</span><br><span> return tsc;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-altstep as_assignment(inout AssignmentState st) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+altstep as_assignment(inout AssignmentState st, RSL_DCHAN_PT rsl_pt := RSL, RSLEM_PROC_PT rsl_proc_pt := RSL_PROC) runs on MSC_ConnHdlr {</span><br><span> var RSL_Message rsl;</span><br><span style="color: hsl(0, 100%, 40%);">- [not st.rr_ass_cmpl_seen] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+ [not st.rr_ass_cmpl_seen] rsl_pt.receive(tr_RSL_DATA_REQ(g_chan_nr)) -> value rsl {</span><br><span> var PDU_ML3_NW_MS l3 := dec_PDU_ML3_NW_MS(rsl.ies[2].body.l3_info.payload);</span><br><span> log("Rx L3 from net: ", l3);</span><br><span> if (ischosen(l3.msgs.rrm.assignmentCommand)) {</span><br><span>@@ -979,20 +980,20 @@</span><br><span> /* FIXME: Determine TRX NR by ARFCN, instead of hard-coded TRX0! */</span><br><span> </span><br><span> /* register our component for this channel number at the RSL Emulation */</span><br><span style="color: hsl(0, 100%, 40%);">- f_rslem_register(0, new_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rslem_register(0, new_chan_nr, PT := rsl_proc_pt);</span><br><span> /* dispatch queued messages for this channel (if any) */</span><br><span style="color: hsl(0, 100%, 40%);">- f_rslem_dchan_queue_dispatch();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rslem_dchan_queue_dispatch(PT := rsl_proc_pt);</span><br><span> </span><br><span> var PDU_ML3_MS_NW l3_tx := valueof(ts_RRM_AssignmentComplete('00'O));</span><br><span> /* send assignment complete over the new channel */</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_EST_IND(new_chan_nr, valueof(ts_RslLinkID_DCCH(0)),</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_EST_IND(new_chan_nr, valueof(ts_RslLinkID_DCCH(0)),</span><br><span> enc_PDU_ML3_MS_NW(l3_tx)));</span><br><span> /* by default, send via the new channel from now */</span><br><span> st.old_chan_nr := g_chan_nr;</span><br><span> g_chan_nr := new_chan_nr;</span><br><span> st.rr_ass_cmpl_seen := true;</span><br><span> /* obtain channel activation from RSL_Emulation for new channel */</span><br><span style="color: hsl(0, 100%, 40%);">- var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ var RSL_Message chan_act := f_rslem_get_last_act(rsl_proc_pt, 0, g_chan_nr);</span><br><span> /* check it (e.g. for correct ciphering parameters) */</span><br><span> f_check_chan_act(st, chan_act);</span><br><span> repeat;</span><br><span>@@ -1000,20 +1001,20 @@</span><br><span> Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected L3 received", l3));</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [st.rr_ass_cmpl_seen] RSL.receive(tr_RSL_DEACT_SACCH(st.old_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [st.rr_ass_cmpl_seen] rsl_pt.receive(tr_RSL_DEACT_SACCH(st.old_chan_nr)) {</span><br><span> st.old_lchan_deact_sacch_seen := true;</span><br><span> repeat;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [st.rr_ass_cmpl_seen] RSL.receive(tr_RSL_REL_REQ(st.old_chan_nr, tr_RslLinkID_DCCH(0))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [st.rr_ass_cmpl_seen] rsl_pt.receive(tr_RSL_REL_REQ(st.old_chan_nr, tr_RslLinkID_DCCH(0))) {</span><br><span> st.old_lchan_rll_rel_req_seen := true;</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_REL_CONF(st.old_chan_nr, valueof(ts_RslLinkID_DCCH(0))));</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_REL_CONF(st.old_chan_nr, valueof(ts_RslLinkID_DCCH(0))));</span><br><span> repeat;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [st.rr_ass_cmpl_seen] RSL.receive(tr_RSL_RF_CHAN_REL(st.old_chan_nr)) {</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_RF_CHAN_REL_ACK(st.old_chan_nr));</span><br><span style="color: hsl(120, 100%, 40%);">+ [st.rr_ass_cmpl_seen] rsl_pt.receive(tr_RSL_RF_CHAN_REL(st.old_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_RF_CHAN_REL_ACK(st.old_chan_nr));</span><br><span> /* unregister for old channel number in RSL emulation */</span><br><span> /* FIXME: Determine TRX NR by ARFCN, instead of hard-coded TRX0! */</span><br><span style="color: hsl(0, 100%, 40%);">- f_rslem_unregister(0, st.old_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rslem_unregister(0, st.old_chan_nr, PT := rsl_proc_pt);</span><br><span> st.assignment_done := true;</span><br><span> repeat;</span><br><span> }</span><br><span>diff --git a/library/RSL_Emulation.ttcn b/library/RSL_Emulation.ttcn</span><br><span>index f64329a..969dbce 100644</span><br><span>--- a/library/RSL_Emulation.ttcn</span><br><span>+++ b/library/RSL_Emulation.ttcn</span><br><span>@@ -109,7 +109,7 @@</span><br><span> * Client Component for a single dedicated channel</span><br><span> ***********************************************************************/</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_or_fail(template RSL_Message exp_rx) runs on RSL_DchanHdlr return RSL_Message</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rx_or_fail(template RSL_Message exp_rx, RSL_DCHAN_PT rsl_pt := RSL) runs on RSL_DchanHdlr return RSL_Message</span><br><span> {</span><br><span> var RSL_Message rx_rsl;</span><br><span> timer T := 10.0;</span><br><span>@@ -117,11 +117,11 @@</span><br><span> /* request a channel to be established */</span><br><span> T.start;</span><br><span> alt {</span><br><span style="color: hsl(0, 100%, 40%);">- [] RSL.receive(exp_rx) -> value rx_rsl {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] rsl_pt.receive(exp_rx) -> value rx_rsl {</span><br><span> T.stop;</span><br><span> return rx_rsl;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [] RSL.receive {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] rsl_pt.receive {</span><br><span> setverdict(fail, "Unexpected RSL message on DCHAN");</span><br><span> mtc.stop;</span><br><span> }</span><br><span>@@ -136,16 +136,16 @@</span><br><span> </span><br><span> /* establish a dedicated channel using 'ra' */</span><br><span> function f_chan_est(OCT1 ra, octetstring est_l3, template RslLinkId link_id, GsmFrameNumber fn := 23,</span><br><span style="color: hsl(0, 100%, 40%);">- template uint3_t tsc := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+ template uint3_t tsc := ?, RSL_DCHAN_PT rsl_pt := RSL, RSLEM_PROC_PT rsl_proc_pt := RSL_PROC)</span><br><span> runs on RSL_DchanHdlr {</span><br><span> var RSL_Message rx_rsl;</span><br><span> var GsmRrMessage rr;</span><br><span> </span><br><span> /* request a channel to be established */</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSLDC_ChanRqd(ra, fn));</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSLDC_ChanRqd(ra, fn));</span><br><span> /* At this point the BSC sends a CHAN ACTIV which we always ACK. Checking it below. */</span><br><span> /* expect immediate assignment */</span><br><span style="color: hsl(0, 100%, 40%);">- rx_rsl := f_rx_or_fail(tr_RSL_IMM_ASSIGN);</span><br><span style="color: hsl(120, 100%, 40%);">+ rx_rsl := f_rx_or_fail(tr_RSL_IMM_ASSIGN, rsl_pt := rsl_pt);</span><br><span> rr := dec_GsmRrMessage(rx_rsl.ies[1].body.full_imm_ass_info.payload);</span><br><span> if (not match(rr.payload.imm_ass.chan_desc.tsc, tsc)) {</span><br><span> setverdict(fail, "Immediate Assignment: unexpected TSC in Channel Description: expected ", tsc, " got ",</span><br><span>@@ -153,10 +153,10 @@</span><br><span> mtc.stop;</span><br><span> }</span><br><span> g_chan_nr := rr.payload.imm_ass.chan_desc.chan_nr;</span><br><span style="color: hsl(0, 100%, 40%);">- RSL.send(ts_RSL_EST_IND(g_chan_nr, valueof(link_id), est_l3));</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_pt.send(ts_RSL_EST_IND(g_chan_nr, valueof(link_id), est_l3));</span><br><span> </span><br><span> /* Check above CHAN ACTIV */</span><br><span style="color: hsl(0, 100%, 40%);">- var RSL_Message chan_act := f_rslem_get_last_act(RSL_PROC, 0, g_chan_nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ var RSL_Message chan_act := f_rslem_get_last_act(rsl_proc_pt, 0, g_chan_nr);</span><br><span> var RSL_IE_Body ie;</span><br><span> if (f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, ie)) {</span><br><span> var uint3_t got_tsc := ie.chan_ident.ch_desc.v.tsc;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/25016">change 25016</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-ttcn3-hacks/+/25016"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-ttcn3-hacks </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ic3206b7125ee22bf98330080d9b136cefe7da03f </div>
<div style="display:none"> Gerrit-Change-Number: 25016 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>