<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26621">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">bsc: properly clean up conn after each test<br><br>Make all tests clean up BSSAP conn and RSL link. Now all<br>f_verify_talloc_count() in f_shutdown_helper() should pass, verifying no<br>conn or bsc_subscr leaks.<br><br>Related: OS#5337<br>Change-Id: I9396efcabc085d2850244c6468b83c5f3a3ff3a2<br>---<br>M bsc/BSC_Tests.ttcn<br>1 file changed, 163 insertions(+), 16 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/21/26621/1</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 c9c9103..604c65e 100644</span><br><span>--- a/bsc/BSC_Tests.ttcn</span><br><span>+++ b/bsc/BSC_Tests.ttcn</span><br><span>@@ -1622,6 +1622,7 @@</span><br><span> }</span><br><span> [] BSSAP.receive { repeat; }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -1700,7 +1701,7 @@</span><br><span> </span><br><span> /* Run everything required up to sending a caller-specified assignment command and expect response */</span><br><span> function f_assignment_exp(PDU_BSSAP ass_cmd, template PDU_BSSAP exp, charstring fail_text)</span><br><span style="color: hsl(0, 100%, 40%);">-runs on test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+runs on test_CT return DchanTuple {</span><br><span> var BSSAP_N_CONNECT_ind rx_c_ind;</span><br><span> var RSL_Message rx_rsl;</span><br><span> var DchanTuple dt;</span><br><span>@@ -1727,13 +1728,15 @@</span><br><span> }</span><br><span> [] BSSAP.receive { repeat; }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ return dt;</span><br><span> }</span><br><span> testcase TC_assignment_csd() runs on test_CT {</span><br><span> var template PDU_BSSAP exp_fail := tr_BSSMAP_AssignmentFail;</span><br><span> var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCSD);</span><br><span> //exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);</span><br><span style="color: hsl(0, 100%, 40%);">- f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for CSD");</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt := f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for CSD");</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -1742,7 +1745,8 @@</span><br><span> var PDU_BSSAP ass_cmd := f_gen_ass_req();</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.channelType := valueof(ts_BSSMAP_IE_ChannelTypeCTM);</span><br><span> //exp_fail.pdu.bssmap.assignmentFailure.cause.causeValue := int2bit(enum2int(GSM0808_CAUSE_REQ_CODEC_TYPE_OR_CONFIG_UNAVAIL), 7);</span><br><span style="color: hsl(0, 100%, 40%);">- f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for Speech+CTM");</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt := f_assignment_exp(ass_cmd, exp_fail, "BSC accepted Assignment for Speech+CTM");</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -1972,6 +1976,8 @@</span><br><span> {name := "TTCN3.bts.0.chan.rf_fail_sdcch", mtype := "c", min := 1, max := 1}</span><br><span> };</span><br><span> f_statsd_expect(expect);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_ClearRequest);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_stats_conn_fail() runs on test_CT {</span><br><span> var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span>@@ -2434,6 +2440,7 @@</span><br><span> /* Send MT message: BSSAP -> RSL */</span><br><span> f_mt_l3_transceive(RSL, link_id, dlci, l3);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_tch_dlci_link_id_sapi() runs on test_CT {</span><br><span> var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span>@@ -3545,8 +3552,10 @@</span><br><span> /* Expevct a CR with a matching Paging response on the A-Interface */</span><br><span> T.start;</span><br><span> alt {</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(rr_pag_resp))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(rr_pag_resp))) -> value rx_c_ind {</span><br><span> setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.sccp_conn_id := rx_c_ind.connectionId;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_CONNECT_res(dt.sccp_conn_id));</span><br><span> }</span><br><span> [] BSSAP.receive {</span><br><span> setverdict(fail, "Received unexpected message on A-Interface!");</span><br><span>@@ -3556,6 +3565,7 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -3727,6 +3737,7 @@</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.aoIPTransportLayer := omit;</span><br><span> </span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ciph_mode_a5_0() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -3815,6 +3826,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span> </span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_assignment_aoip_tla_v6() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -3837,6 +3849,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span> </span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_assignment_fr_a5_0() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -3910,6 +3923,7 @@</span><br><span> /* Omit: ass_cmd.pdu.bssmap.assignmentRequest.codecList */</span><br><span> </span><br><span> f_establish_fully(ass_cmd, exp_fail);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_assignment_fr_a5_1_codec_missing() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -3941,6 +3955,7 @@</span><br><span> </span><br><span> /* Start ciphering, expect Cipher Mode Reject */</span><br><span> f_cipher_mode(g_pars.encr, exp_fail := true);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_assignment_fr_a5_not_sup() runs on test_CT {</span><br><span> var TestHdlrParams pars := f_gen_test_hdlr_pars();</span><br><span>@@ -3972,6 +3987,7 @@</span><br><span> { name := "TTCN3.bsc.0.assignment.completed", mtype := "c", min := 1, max := 1}</span><br><span> };</span><br><span> f_statsd_expect(expect);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> testcase TC_assignment_sign() runs on test_CT {</span><br><span>@@ -4114,6 +4130,10 @@</span><br><span> type record of CodecListTest CodecListTests</span><br><span> </span><br><span> private function f_TC_assignment_codec(charstring id) runs on MSC_ConnHdlr {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_assignment_codec(id);</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_assignment_codec(charstring id, boolean do_perform_clear := true) runs on MSC_ConnHdlr {</span><br><span> var PDU_BSSAP ass_cmd := f_gen_ass_req(g_pars.use_osmux);</span><br><span> var template PDU_BSSAP exp_compl := f_gen_exp_compl(g_pars.use_osmux);</span><br><span> </span><br><span>@@ -4168,6 +4188,10 @@</span><br><span> }</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (do_perform_clear) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> private function f_TC_assignment_codec_fail(charstring id) runs on MSC_ConnHdlr {</span><br><span>@@ -4184,6 +4208,7 @@</span><br><span> log("expecting ASS FAIL like this: ", exp_fail);</span><br><span> </span><br><span> f_establish_fully(ass_cmd, exp_fail);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> const CounterNameVals counternames_bsc_bts_assignment := {</span><br><span>@@ -4697,6 +4722,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '05'O;</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR only */</span><br><span>@@ -4709,6 +4735,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '01'O;</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow HR only (expect assignment failure) */</span><br><span>@@ -4721,6 +4748,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '05'O;</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR}));</span><br><span> f_establish_fully(ass_cmd, exp_fail);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR only (expect assignment failure) */</span><br><span>@@ -4733,6 +4761,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.channelType.speechId_DataIndicator := '01'O;</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR}));</span><br><span> f_establish_fully(ass_cmd, exp_fail);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR and HR, but prefer FR */</span><br><span>@@ -4746,6 +4775,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR, ts_CodecHR}));</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000101'B; /* Expect HR */</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR and HR, but prefer HR */</span><br><span>@@ -4759,6 +4789,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR, ts_CodecFR}));</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000101'B; /* Expect HR */</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR and HR, but prefer FR */</span><br><span>@@ -4772,6 +4803,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR, ts_CodecHR}));</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000001'B; /* Expect FR */</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR and HR, but prefer HR */</span><br><span>@@ -4785,6 +4817,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR, ts_CodecFR}));</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000001'B; /* Expect FR */</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Request a HR channel while all FR channels are exhausted, this is expected</span><br><span>@@ -4910,6 +4943,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecHR, ts_CodecFR}));</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000101'B; /* Expect HR */</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Allow FR and HR, but prefer FR */</span><br><span>@@ -4923,6 +4957,7 @@</span><br><span> ass_cmd.pdu.bssmap.assignmentRequest.codecList := valueof(ts_BSSMAP_IE_CodecList({ts_CodecFR, ts_CodecHR}));</span><br><span> exp_compl.pdu.bssmap.assignmentComplete.speechVersion.speechVersionIdentifier := '0000001'B; /* Expect FR */</span><br><span> f_establish_fully(ass_cmd, exp_compl);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Request a HR (prefered) or alternatively a FR channel, it is expected that</span><br><span>@@ -4973,6 +5008,8 @@</span><br><span> Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_assignment_sdcch_exhausted_req_signalling() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5035,6 +5072,7 @@</span><br><span> Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "Timeout waiting for COMPLETE LAYER 3 INFORMATION");</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_assignment_sdcch_exhausted_req_voice_tch_forbidden() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5095,6 +5133,8 @@</span><br><span> f_rsl_send_l3(ts_RRM_CM_CHG(valueof(ts_CM2)));</span><br><span> BSSAP.receive(tr_BSSMAP_ClassmarkUpd(?, omit));</span><br><span> setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_classmark() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5122,6 +5162,8 @@</span><br><span> f_vty_transceive_match_regexp_retry(BSCVTY, "show conns", regex, 0, 4, 1.0);</span><br><span> </span><br><span> setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_common_id() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5160,6 +5202,7 @@</span><br><span> private function f_tc_unsol_ass_fail(charstring id) runs on MSC_ConnHdlr {</span><br><span> f_est_single_l3(ts_RRM_AssignmentFailure('00'O));</span><br><span> f_bssap_expect_nothing();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_unsol_ass_fail() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5175,6 +5218,7 @@</span><br><span> private function f_tc_unsol_ass_compl(charstring id) runs on MSC_ConnHdlr {</span><br><span> f_est_single_l3(ts_RRM_AssignmentComplete('00'O));</span><br><span> f_bssap_expect_nothing();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_unsol_ass_compl() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5190,6 +5234,7 @@</span><br><span> private function f_tc_unsol_ho_fail(charstring id) runs on MSC_ConnHdlr {</span><br><span> f_est_single_l3(ts_RRM_HandoverFailure('00'O));</span><br><span> f_bssap_expect_nothing();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_unsol_ho_fail() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5210,6 +5255,7 @@</span><br><span> /* send short message */</span><br><span> RSL.send(ts_RSL_DATA_IND(g_chan_nr, valueof(ts_RslLinkID_DCCH(0)), ''O));</span><br><span> f_bssap_expect_nothing();</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_err_82_short_msg() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5232,6 +5278,7 @@</span><br><span> [] BSSAP.receive { setverdict(fail, "unexpected BSSAP"); }</span><br><span> [] T.timeout { setverdict(fail, "Timeout waiting for RR STATUS"); }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_err_84_unknown_msg() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5338,6 +5385,8 @@</span><br><span> </span><br><span> f_chan_act_verify_tsc(chan_act, BTS_TSC[1]);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear(RSL1, RSL1_PROC);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> f_sleep(0.5);</span><br><span> }</span><br><span> </span><br><span>@@ -5488,7 +5537,9 @@</span><br><span> RSL1.send(ts_RSL_RF_CHAN_REL_ACK(new_chan_nr));</span><br><span> f_rslem_unregister(0, g_chan_nr, PT := RSL1_PROC);</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSMAP_ClearComplete) {}</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_ClearComplete) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> </span><br><span> f_sleep(0.5);</span><br><span>@@ -5604,7 +5655,9 @@</span><br><span> [] RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_RRM_RR_RELEASE));</span><br><span> [] RSL.receive(tr_RSL_DEACT_SACCH(g_chan_nr));</span><br><span> [] RSL.receive(tr_RSL_RF_CHAN_REL(g_chan_nr));</span><br><span style="color: hsl(0, 100%, 40%);">- [] BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ [] BSSAP.receive(tr_BSSMAP_ClearComplete) {</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span> }</span><br><span> setverdict(pass);</span><br><span> }</span><br><span>@@ -5711,6 +5764,7 @@</span><br><span> </span><br><span> f_mo_l3_transceive();</span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_out_fail_no_msc_response() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5792,6 +5846,7 @@</span><br><span> </span><br><span> setverdict(pass);</span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_out_fail_rr_ho_failure() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -5889,6 +5944,7 @@</span><br><span> </span><br><span> f_expect_dlcx_conns();</span><br><span> BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span> </span><br><span> setverdict(pass);</span><br><span> f_sleep(1.0);</span><br><span>@@ -6222,6 +6278,7 @@</span><br><span> </span><br><span> f_expect_dlcx_conns();</span><br><span> BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span> </span><br><span> setverdict(pass);</span><br><span> f_sleep(1.0);</span><br><span>@@ -6315,6 +6372,7 @@</span><br><span> </span><br><span> f_expect_dlcx_conns();</span><br><span> BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span> }</span><br><span>@@ -6404,6 +6462,7 @@</span><br><span> </span><br><span> f_expect_dlcx_conns();</span><br><span> BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span> }</span><br><span>@@ -6485,6 +6544,7 @@</span><br><span> };</span><br><span> f_expect_dlcx_conns();</span><br><span> BSSAP.receive(tr_BSSMAP_ClearComplete);</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(RAN_Conn_Prim:MSC_CONN_PRIM_DISC_REQ);</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span> }</span><br><span>@@ -6700,6 +6760,8 @@</span><br><span> f_probe_for_handover("1.d", "HO to 871-11 still works (verify that this test properly cleans up)",</span><br><span> "handover any to arfcn 871 bsic 11",</span><br><span> true, expect_target_tsc := BTS_TSC[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_1() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -6764,6 +6826,7 @@</span><br><span> f_probe_for_handover("2.b", "HO to bts 2 doesn't work, not listed as neighbor",</span><br><span> "handover any to arfcn 871 bsic 12",</span><br><span> false);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_2() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -6815,6 +6878,7 @@</span><br><span> f_probe_for_handover("3.b", "HO to bts 2 works, explicitly listed as neighbor; no ambiguity because bts 3 is not listed as neighbor",</span><br><span> "handover any to arfcn 871 bsic 12",</span><br><span> true, expect_target_tsc := BTS_TSC[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_3() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -6869,6 +6933,7 @@</span><br><span> f_probe_for_handover("4.c", "HO to 123-45 triggers inter-BSC HO",</span><br><span> "handover any to arfcn 123 bsic 45",</span><br><span> true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_4() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -6919,6 +6984,7 @@</span><br><span> f_probe_for_handover("5.a", "HO to 871-12 triggers inter-BSC HO (ignoring local cells with same ARFCN+BSIC)",</span><br><span> "handover any to arfcn 871 bsic 12",</span><br><span> true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_5() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -6962,6 +7028,7 @@</span><br><span> f_probe_for_handover("6.a", "HO to 871-12 is ambiguous = error",</span><br><span> "handover any to arfcn 871 bsic 12",</span><br><span> false);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_6() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -7006,6 +7073,7 @@</span><br><span> f_probe_for_handover("7.b", "HO to 123-45 triggers inter-BSC HO",</span><br><span> "handover any to arfcn 123 bsic 45",</span><br><span> true, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> testcase TC_ho_neighbor_config_7() runs on test_CT {</span><br><span> var MSC_ConnHdlr vc_conn;</span><br><span>@@ -7467,9 +7535,11 @@</span><br><span> </span><br><span> /* Fill TS0 SDCCH channels (NOTE: only 3 SDCCH/4 channels are available</span><br><span> * on CCCH+SDCCH4+CBCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuples sdcch_cleanup := {};</span><br><span> var integer i;</span><br><span> for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) {</span><br><span> dt := f_est_dchan('23'O, i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ sdcch_cleanup := sdcch_cleanup & { dt };</span><br><span> }</span><br><span> </span><br><span> /* Now the dyn ts is selected. First PDCH is released, then sdcch chan is activated */</span><br><span>@@ -7501,6 +7571,11 @@</span><br><span> f_sleep(1.0);</span><br><span> f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clean up SDCCH lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(sdcch_cleanup); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(sdcch_cleanup[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* clean up config */</span><br><span> f_ts_set_chcomb(0, 0, 6, "PDCH");</span><br><span> </span><br><span>@@ -7523,7 +7598,7 @@</span><br><span> }</span><br><span> f_vty_transceive(BSCVTY, "drop bts connection 0 oml");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- f_init(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(1, guard_timeout := 60.0);</span><br><span> </span><br><span> /* The dyn TS want to activate PDCH mode, ACK that. */</span><br><span> var RslChannelNr chan_nr;</span><br><span>@@ -7537,15 +7612,21 @@</span><br><span> /* GSM 44.018 Table 9.1.8.2:</span><br><span> * RA = '13'O -> Establishment cause = 0001xxxx (MS dual rate capable and asks for "SDCCH").</span><br><span> */</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuples chan_cleanup := {};</span><br><span> for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</span><br><span> }</span><br><span> </span><br><span> /* Only the dyn TS is still available. Its first lchan gets converted to SDCCH8 */</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan_dyn('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</span><br><span> /* Also occupy the seven other SDCCH of the dyn TS */</span><br><span> for (i := 0; i < 7; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</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%);">+ /* Clean up SDCCH lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(chan_cleanup); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(chan_cleanup[i]);</span><br><span> }</span><br><span> </span><br><span> /* clean up config */</span><br><span>@@ -7591,9 +7672,11 @@</span><br><span> </span><br><span> /* Fill TS0 SDCCH channels (NOTE: only 3 SDCCH/4 channels are available</span><br><span> * on CCCH+SDCCH4+CBCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuples chan_cleanup := {};</span><br><span> var OCT1 ra := '43'O; /* RA containing reason=originating speech call*/</span><br><span> for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) {</span><br><span> dt := f_est_dchan(ra, i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { dt };</span><br><span> }</span><br><span> </span><br><span> /* Now the dyn ts is selected. First PDCH is released, then TCH chan is activated */</span><br><span>@@ -7625,6 +7708,11 @@</span><br><span> f_sleep(1.0);</span><br><span> f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clean up SDCCH lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(chan_cleanup); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(chan_cleanup[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* clean up config */</span><br><span> f_ts_reset_chcomb(0);</span><br><span> /* TODO: clean up other channels? */</span><br><span>@@ -7661,9 +7749,11 @@</span><br><span> </span><br><span> /* Fill TS0 SDCCH channels (NOTE: only 3 SDCCH/4 channels are available</span><br><span> * on CCCH+SDCCH4+CBCH) */</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuples chan_cleanup := {};</span><br><span> var integer i;</span><br><span> for (i := 0; i < NUM_SDCCH_PER_BTS; i := i + 1) {</span><br><span> dt := f_est_dchan('23'O, i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { dt };</span><br><span> }</span><br><span> </span><br><span> /* Now the dyn ts is selected. First PDCH is released, then sdcch chan is activated */</span><br><span>@@ -7691,6 +7781,11 @@</span><br><span> * f_ts_dyn_mode_assert(0, 0, pdch_chan_nr.tn, PDCH_MODE)</span><br><span> */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clean up SDCCH lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(chan_cleanup); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(chan_cleanup[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* clean up config */</span><br><span> f_ts_set_chcomb(0, 0, 6, "PDCH");</span><br><span> </span><br><span>@@ -7825,6 +7920,15 @@</span><br><span> deactivate(ack_rel_req);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_perform_clear_test_ct(DchanTuple dt)</span><br><span style="color: hsl(120, 100%, 40%);">+ runs on test_CT</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Instruct BSC to clear channel */</span><br><span style="color: hsl(120, 100%, 40%);">+ var BssmapCause cause := 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.send(ts_BSSAP_DATA_req(dt.sccp_conn_id, ts_BSSMAP_ClearCommand(cause)));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_exp_chan_rel_and_clear(dt, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> private function f_perform_compl_l3(RSL_DCHAN_PT rsl_pt, RSLEM_PROC_PT rsl_proc_pt,</span><br><span> template PDU_ML3_MS_NW l3_info, boolean do_clear := true, boolean expect_bssmap_l3 := true)</span><br><span> runs on MSC_ConnHdlr {</span><br><span>@@ -8567,6 +8671,7 @@</span><br><span> }</span><br><span> </span><br><span> setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* Test if the EMERGENCY SETUP gets blocked by the BSC if EMERGENCY CALLS are</span><br><span>@@ -8589,6 +8694,8 @@</span><br><span> setverdict(fail, "timout waiting for RR CHANNEL RELEASE!");</span><br><span> }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+ BSSAP.receive(tr_BSSMAP_ClearRequest);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* EMERGENCY CALL situation #1, allowed globally and by BTS */</span><br><span>@@ -9076,6 +9183,8 @@</span><br><span> setverdict(fail, "FH disabled, but Mobile Allocation IE is present");</span><br><span> continue;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> }</span><br><span> </span><br><span> /* Give the IUT some time to release all channels */</span><br><span>@@ -9147,6 +9256,8 @@</span><br><span> setverdict(fail, "FH enabled, but Mobile Allocation IE is absent");</span><br><span> return;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> }</span><br><span> testcase TC_fh_params_handover_cmd() runs on test_CT {</span><br><span> var FHParamsTrx fhp := f_TC_fh_params_gen();</span><br><span>@@ -9888,6 +9999,8 @@</span><br><span> }</span><br><span> }</span><br><span> T.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> }</span><br><span> </span><br><span> /* The BSC does *not* indicate BTS_FEAT_VAMOS; make sure that a channel Mode Modify to VAMOS mode is refused by</span><br><span>@@ -9937,7 +10050,7 @@</span><br><span> </span><br><span> private function f_TC_reassignment_codec(charstring id) runs on MSC_ConnHdlr {</span><br><span> /* First fully set up a speech lchan */</span><br><span style="color: hsl(0, 100%, 40%);">- f_TC_assignment_codec(id);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_assignment_codec(id, do_perform_clear := false);</span><br><span> </span><br><span> /* Trigger re-assignment to another lchan */</span><br><span> var AssignmentState assignment_st := valueof(ts_AssignmentStateInit);</span><br><span>@@ -10235,6 +10348,8 @@</span><br><span> </span><br><span> /* First send the Chan Act ACK */</span><br><span> var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.rsl_chan_nr := chan_nr;</span><br><span> var RSL_IE_Body chan_ident_ie;</span><br><span> if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) {</span><br><span> setverdict(fail, "RSL Channel Identification IE is absent");</span><br><span>@@ -10255,9 +10370,11 @@</span><br><span> </span><br><span> var BSSAP_N_CONNECT_ind rx_c_ind;</span><br><span> BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.sccp_conn_id := rx_c_ind.connectionId;</span><br><span> BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -10280,6 +10397,8 @@</span><br><span> </span><br><span> chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));</span><br><span> var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.rsl_chan_nr := chan_nr;</span><br><span> var RSL_IE_Body chan_ident_ie;</span><br><span> if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) {</span><br><span> setverdict(fail, "RSL Channel Identification IE is absent");</span><br><span>@@ -10300,9 +10419,11 @@</span><br><span> </span><br><span> var BSSAP_N_CONNECT_ind rx_c_ind;</span><br><span> BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.sccp_conn_id := rx_c_ind.connectionId;</span><br><span> BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -10325,6 +10446,8 @@</span><br><span> </span><br><span> chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));</span><br><span> var RslChannelNr chan_nr := chan_act.ies[0].body.chan_nr;</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.rsl_chan_nr := chan_nr;</span><br><span> var RSL_IE_Body chan_ident_ie;</span><br><span> if (not f_rsl_find_ie(chan_act, RSL_IE_CHAN_IDENT, chan_ident_ie)) {</span><br><span> setverdict(fail, "RSL Channel Identification IE is absent");</span><br><span>@@ -10345,9 +10468,11 @@</span><br><span> </span><br><span> var BSSAP_N_CONNECT_ind rx_c_ind;</span><br><span> BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.sccp_conn_id := rx_c_ind.connectionId;</span><br><span> BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -10395,6 +10520,8 @@</span><br><span> </span><br><span> /* Now activation as SDCCH8 */</span><br><span> chan_nr := valueof(t_RslChanNr_SDCCH8(tn := 6, sub_slot := 0));</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.rsl_chan_nr := chan_nr;</span><br><span> </span><br><span> chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));</span><br><span> var RSL_IE_Body chan_ident_ie;</span><br><span>@@ -10417,9 +10544,11 @@</span><br><span> </span><br><span> var BSSAP_N_CONNECT_ind rx_c_ind;</span><br><span> BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.sccp_conn_id := rx_c_ind.connectionId;</span><br><span> BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -10472,6 +10601,8 @@</span><br><span> </span><br><span> /* Now activation as SDCCH8 */</span><br><span> chan_nr := valueof(t_RslChanNr_SDCCH8(tn := 6, sub_slot := 0));</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuple dt;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.rsl_chan_nr := chan_nr;</span><br><span> </span><br><span> chan_act := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));</span><br><span> var RSL_IE_Body chan_ident_ie;</span><br><span>@@ -10490,9 +10621,11 @@</span><br><span> </span><br><span> var BSSAP_N_CONNECT_ind rx_c_ind;</span><br><span> BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;</span><br><span style="color: hsl(120, 100%, 40%);">+ dt.sccp_conn_id := rx_c_ind.connectionId;</span><br><span> BSSAP.send(ts_BSSAP_CONNECT_res(rx_c_ind.connectionId));</span><br><span> </span><br><span> f_sleep(1.0);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(dt);</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -10596,6 +10729,8 @@</span><br><span> f_create_chan_and_exp();</span><br><span> /* we should now have a COMPL_L3 at the MSC */</span><br><span> BSSAP.send(ts_PDU_DTAP_MT(ts_CM_SERV_REJ('02'O), '00'O));</span><br><span style="color: hsl(120, 100%, 40%);">+ RSL.receive(tr_RSL_DATA_REQ(g_chan_nr, ?, decmatch tr_CM_SERV_REJ));</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear();</span><br><span> f_sleep(1.0);</span><br><span> }</span><br><span> testcase TC_cm_serv_rej() runs on test_CT {</span><br><span>@@ -10722,15 +10857,16 @@</span><br><span> var integer i;</span><br><span> var integer chreq_total, chreq_nochan;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- f_init(1);</span><br><span style="color: hsl(120, 100%, 40%);">+ f_init(1, guard_timeout := 60.0);</span><br><span> f_sleep(1.0);</span><br><span> </span><br><span> /* Exhaust all dedicated SDCCH lchans.</span><br><span> /* GSM 44.018 Table 9.1.8.2:</span><br><span> * RA = '13'O -> Establishment cause = 0001xxxx (MS dual rate capable and asks for "SDCCH").</span><br><span> */</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuples chan_cleanup := {};</span><br><span> for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</span><br><span> }</span><br><span> </span><br><span> /* Since only bts 0 is connected, expecting all_allocated to become true for both bts 0 and the "global" bsc</span><br><span>@@ -10740,13 +10876,18 @@</span><br><span> </span><br><span> /* Also fill up all remaining (TCH) channels */</span><br><span> for (i := 0; i < NUM_TCHF_PER_BTS + NUM_TCHH_PER_BTS; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</span><br><span> }</span><br><span> </span><br><span> /* All TCH are now also occupied */</span><br><span> f_all_allocated_expect_counter_change({"all_allocated:sdcch", "all_allocated:static_sdcch",</span><br><span> "all_allocated:tch", "all_allocated:static_tch"});</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clean up SDCCH lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(chan_cleanup); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(chan_cleanup[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> f_shutdown_helper();</span><br><span> }</span><br><span> </span><br><span>@@ -10773,8 +10914,9 @@</span><br><span> /* GSM 44.018 Table 9.1.8.2:</span><br><span> * RA = '13'O -> Establishment cause = 0001xxxx (MS dual rate capable and asks for "SDCCH").</span><br><span> */</span><br><span style="color: hsl(120, 100%, 40%);">+ var DchanTuples chan_cleanup := {};</span><br><span> for (i := 0; i < NUM_SDCCH_PER_BTS; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan('13'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</span><br><span> }</span><br><span> </span><br><span> /* The static SDCCH should now be occupied, while still 3x8 dynamic SDCCH potentially remain. So only</span><br><span>@@ -10796,7 +10938,7 @@</span><br><span> </span><br><span> /* occupy the remaining TCH, three TCH/F and two TCH/H lchans */</span><br><span> for (i := 0; i < 5; i := i+1) {</span><br><span style="color: hsl(0, 100%, 40%);">- f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O);</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_cleanup := chan_cleanup & { f_est_dchan('33'O, NUM_SDCCH_PER_BTS + i, '00010203040506'O) };</span><br><span> }</span><br><span> </span><br><span> /* All TCH lchans are now also occupied, both static and dynamic */</span><br><span>@@ -10830,6 +10972,11 @@</span><br><span> /* Now all channels are occupied except the dyn TS, so expecting only the static counters to increment */</span><br><span> f_all_allocated_expect_counter_change({"all_allocated:static_sdcch", "all_allocated:static_tch"});</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ /* Clean up SDCCH lchans */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i := 0; i < lengthof(chan_cleanup); i := i + 1) {</span><br><span style="color: hsl(120, 100%, 40%);">+ f_perform_clear_test_ct(chan_cleanup[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* clean up config */</span><br><span> f_ts_reset_chcomb(0);</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/26621">change 26621</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/+/26621"/><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: I9396efcabc085d2850244c6468b83c5f3a3ff3a2 </div>
<div style="display:none"> Gerrit-Change-Number: 26621 </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-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>