<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/25021">View Change</a></p><div style="white-space:pre-wrap">Approvals:
laforge: Looks good to me, approved
pespin: Looks good to me, but someone else must approve
osmith: Looks good to me, but someone else must approve
Jenkins Builder: Verified
</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: add TC_cm_reestablishment<br><br>Related: SYS#5130<br>Change-Id: I1e7d446644f46b8a0a94688e618ffb4f23a8900e<br>---<br>M bsc/BSC_Tests.ttcn<br>M library/L3_Templates.ttcn<br>2 files changed, 158 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/bsc/BSC_Tests.ttcn b/bsc/BSC_Tests.ttcn</span><br><span>index c4ae469..0ab8bde 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -9434,6 +9434,141 @@</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+const charstring REEST_LOST_CONNECTION := "REEST_LOST_CONNECTION";</span><br><span style="color: hsl(120, 100%, 40%);">+const charstring REEST_CLEAR := "REEST_CLEAR";</span><br><span style="color: hsl(120, 100%, 40%);">+const charstring REEST_CLEAR_DONE := "REEST_CLEAR_DONE";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* CM Re-Establishment, 3GPP TS 24.008 4.5.1.6.</span><br><span style="color: hsl(120, 100%, 40%);">+ * The MS <-> BTS loses radio connection, MS shows up on second BTS and asks for CM Re-Establishment.</span><br><span style="color: hsl(120, 100%, 40%);">+ * BSC should establish a separate A conn for the same MS, the original A conn is then cleared by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the MSC as the CM Re-Establishment is handled.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * MS bts0 bts1 bsc msc test-component</span><br><span style="color: hsl(120, 100%, 40%);">+ * |<----->|<----------------->|<-0-->| _1 Establish channel on bts 0</span><br><span style="color: hsl(120, 100%, 40%);">+ * | | _1 wait a bit, to settle down</span><br><span style="color: hsl(120, 100%, 40%);">+ * |<-x x--| | _1 "lose connection"</span><br><span style="color: hsl(120, 100%, 40%);">+ * | | REEST_LOST_CONNECTION</span><br><span style="color: hsl(120, 100%, 40%);">+ * |----------------->|------->|--1-->| _2 new A-conn: Chan Rqd, Imm Ass, Compl L3 with CM Re-Establishment Req</span><br><span style="color: hsl(120, 100%, 40%);">+ * | | REEST_CLEAR</span><br><span style="color: hsl(120, 100%, 40%);">+ * | |<-0---| _1 Clear Command on first A-conn</span><br><span style="color: hsl(120, 100%, 40%);">+ * | |--0-->| _1 Clear Complete</span><br><span style="color: hsl(120, 100%, 40%);">+ * | |<----------------->| | _1 Release first channel</span><br><span style="color: hsl(120, 100%, 40%);">+ * | | REEST_CLEAR_DONE</span><br><span style="color: hsl(120, 100%, 40%);">+ * |<-----------------|<-------|<-1---| _2 Chan Activ, Assignment Command</span><br><span style="color: hsl(120, 100%, 40%);">+ * |<-----------------|<-------|<-1---| _2 Clear Command, Release</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%);">+private function f_tc_cm_reestablishment_1(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PDU_BSSAP exp_compl := f_gen_exp_compl();</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);</span><br><span style="color: hsl(120, 100%, 40%);">+ ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The original channel loses connection, MS attemts CM Re-Establishment on another cell, see</span><br><span style="color: hsl(120, 100%, 40%);">+ * f_tc_cm_reestablishment_2(). This established channel stays active until MSC sends a Clear Command. The time</span><br><span style="color: hsl(120, 100%, 40%);">+ * when exactly that happens is determined by f_tc_cm_reestablishment_2(). */</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ COORD.send(REEST_LOST_CONNECTION);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] COORD.receive(REEST_CLEAR);</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Unexpected channel release");</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ [] RSL.receive(tr_RSL_RF_CHAN_REL(g_chan_nr)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ setverdict(fail, "Unexpected channel release");</span><br><span style="color: hsl(120, 100%, 40%);">+ mtc.stop;</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%);">+ f_perform_clear()</span><br><span style="color: hsl(120, 100%, 40%);">+ f_expect_dlcx_conns();</span><br><span style="color: hsl(120, 100%, 40%);">+ COORD.send(REEST_CLEAR_DONE);</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%);">+private function f_tc_cm_reestablishment_2(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_MscConnHdlr_init(g_pars.media_nr, host_bts, host_mgw_mgcp, FR_AMR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* The MS lost the connection on the first channel, now establishes another one */</span><br><span style="color: hsl(120, 100%, 40%);">+ COORD.receive(REEST_LOST_CONNECTION);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_ML3_MS_NW l3_info := valueof(ts_CM_REESTABL_REQ(mi));</span><br><span style="color: hsl(120, 100%, 40%);">+ var octetstring l3_enc := enc_PDU_ML3_MS_NW(l3_info);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_bssmap_exp(l3_enc);</span><br><span style="color: hsl(120, 100%, 40%);">+ RSL_Emulation.f_chan_est(g_pars.ra, l3_enc, g_pars.link_id, g_pars.fn);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_ComplL3(l3_enc));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* MSC got the CM Re-Establishment request and first off clears the previous conn. */</span><br><span style="color: hsl(120, 100%, 40%);">+ COORD.send(REEST_CLEAR);</span><br><span style="color: hsl(120, 100%, 40%);">+ COORD.receive(REEST_CLEAR_DONE);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(2.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Answer the CM Re-Establishment with an Assignment Command. */</span><br><span style="color: hsl(120, 100%, 40%);">+ var template PDU_BSSAP expect_assignment_compl := f_gen_exp_compl();</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span style="color: hsl(120, 100%, 40%);">+ ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelType);</span><br><span style="color: hsl(120, 100%, 40%);">+ ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var AssignmentState st := valueof(ts_AssignmentStateInit);</span><br><span style="color: hsl(120, 100%, 40%);">+ st.voice_call := true;</span><br><span style="color: hsl(120, 100%, 40%);">+ st.is_assignment := true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var ExpectCriteria mgcpcrit := {</span><br><span style="color: hsl(120, 100%, 40%);">+ connid := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ endpoint := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ transid := omit</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+ f_create_mgcp_expect(mgcpcrit);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_rslem_dchan_queue_enable();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ass_cmd);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var PDU_BSSAP bssap;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ alt {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_assignment(st);</span><br><span style="color: hsl(120, 100%, 40%);">+ [] as_Media();</span><br><span style="color: hsl(120, 100%, 40%);">+ [st.assignment_done] BSSAP.receive(expect_assignment_compl) {</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(3.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_logp(BSCVTY, "f_tc_cm_reestablishment_2 clearing");</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_expect_dlcx_conns();</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%);">+testcase TC_cm_reestablishment() runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+ var TestHdlrParams pars1 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+ var MSC_ConnHdlr vc_conn1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ var TestHdlrParams pars2 := f_gen_test_hdlr_pars();</span><br><span style="color: hsl(120, 100%, 40%);">+ var MSC_ConnHdlr vc_conn2;</span><br><span style="color: hsl(120, 100%, 40%);">+ pars2.imsi := pars1.imsi;</span><br><span style="color: hsl(120, 100%, 40%);">+ pars2.media_nr := 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(2, true, guard_timeout := 40.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1 := f_start_handler_create(pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn2 := f_start_handler_create(pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+ connect(vc_conn1:COORD, vc_conn2:COORD);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_start_handler_run(vc_conn1, refers(f_tc_cm_reestablishment_1), pars1);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_start_handler_run(vc_conn2, refers(f_tc_cm_reestablishment_2), pars2);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn1.done;</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_conn2.done;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_shutdown_helper();</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> control {</span><br><span> /* CTRL interface testing */</span><br><span>@@ -9722,6 +9857,8 @@</span><br><span> execute( TC_refuse_mode_modif_to_vamos() );</span><br><span> </span><br><span> execute( TC_reassignment_fr() );</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ execute( TC_cm_reestablishment() );</span><br><span> }</span><br><span> </span><br><span> }</span><br><span>diff --git a/library/L3_Templates.ttcn b/library/L3_Templates.ttcn</span><br><span>index 53731c0..c6ebeb4 100644</span><br><span>--- a/library/L3_Templates.ttcn</span><br><span>+++ b/library/L3_Templates.ttcn</span><br><span>@@ -372,6 +372,27 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+template (value) PDU_ML3_MS_NW ts_CM_REESTABL_REQ(MobileIdentityLV mi_lv) := {</span><br><span style="color: hsl(120, 100%, 40%);">+ discriminator := '0000'B, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ tiOrSkip := {</span><br><span style="color: hsl(120, 100%, 40%);">+ skipIndicator := '0000'B</span><br><span style="color: hsl(120, 100%, 40%);">+ },</span><br><span style="color: hsl(120, 100%, 40%);">+ msgs := {</span><br><span style="color: hsl(120, 100%, 40%);">+ mm := {</span><br><span style="color: hsl(120, 100%, 40%);">+ cMReEstablReq := {</span><br><span style="color: hsl(120, 100%, 40%);">+ messageType := '000000'B, /* overwritten */</span><br><span style="color: hsl(120, 100%, 40%);">+ nsd := '00'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ cipheringKeySequenceNumber := { '000'B, '0'B },</span><br><span style="color: hsl(120, 100%, 40%);">+ spare := '0000'B,</span><br><span style="color: hsl(120, 100%, 40%);">+ mobileStationClassmark2 := ts_CM2,</span><br><span style="color: hsl(120, 100%, 40%);">+ mobileIdentityLV := mi_lv,</span><br><span style="color: hsl(120, 100%, 40%);">+ locationAreaIdentification := omit,</span><br><span style="color: hsl(120, 100%, 40%);">+ deviceProperties := omit</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> template (value) CipheringKeySequenceNumberV ts_CKSN(integer key_seq) := {</span><br><span> keySequence := int2bit(key_seq, 3),</span><br><span> spare := '0'B</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/25021">change 25021</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/+/25021"/><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: I1e7d446644f46b8a0a94688e618ffb4f23a8900e </div>
<div style="display:none"> Gerrit-Change-Number: 25021 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@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-Reviewer: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>