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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">PCU: introduce f_shutdown() to ensure proper tear down<br><br>Most of existing test cases are built on top of the PCU interface<br>abstraction components (see PCUIF_Components.ttcn). This means<br>that during the test case execution, additional components are<br>running in parallel, among with the MTC (Main Test Component).<br><br>When a test case terminates, either normally or due to an error,<br>it may happen that the virtual BTS component is stopped before<br>the associated TDMA clock generator. In this situation, sending<br>a clock indication towards the stopped BTS component would<br>lead to a dynamic test case error.<br><br>Let's take the process of tear down under control, and ensure that<br>the clock generator is stopped first. To achieve that, every test<br>case needs to call f_shutdown() in case of an error, as well as<br>in case of the normal termination.<br><br>Note we cannot use the existing f_shutdown() from Misc_Helpers,<br>because doing 'all component.stop' does not gurantee that the<br>clock generator is stopped first, and I experienced at least<br>one DTE while trying to integrate it.<br><br>Change-Id: I6a859687d9605cc08c51ff44d946c279b79bedfa<br>Signed-off-by: Vadim Yanitskiy <axilirator@gmail.com><br>---<br>M pcu/PCUIF_Components.ttcn<br>M pcu/PCU_Tests.ttcn<br>2 files changed, 142 insertions(+), 82 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/pcu/PCUIF_Components.ttcn b/pcu/PCUIF_Components.ttcn</span><br><span>index c0266fb..aa2ab42 100644</span><br><span>--- a/pcu/PCUIF_Components.ttcn</span><br><span>+++ b/pcu/PCUIF_Components.ttcn</span><br><span>@@ -100,6 +100,7 @@</span><br><span> /* Commands are mostly used by the MTC to configure the components</span><br><span>  * at run-time, e.g. to enable or disable some optional features. */</span><br><span> type enumerated RAW_PCU_CommandType {</span><br><span style="color: hsl(120, 100%, 40%);">+    GENERAL_CMD_SHUTDOWN,           /*!< Shut down component and all its child components */</span><br><span>  TDMA_CMD_ENABLE_PTCCH_UL_FWD    /*!< Enable forwarding of TDMA_EV_PTCCH_UL_BURST to the MTC */</span><br><span> };</span><br><span> </span><br><span>@@ -417,6 +418,11 @@</span><br><span>   [] as_BTS_CT_TDMASched(bts_nr);</span><br><span> </span><br><span>  /* Command handling */</span><br><span style="color: hsl(120, 100%, 40%);">+        [] TC.receive(tr_RAW_PCU_CMD(GENERAL_CMD_SHUTDOWN)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         log("Shutting down virtual BTS #", bts_nr, "...");</span><br><span style="color: hsl(120, 100%, 40%);">+                vc_CLCK_GEN.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    [] TC.receive(tr_RAW_PCU_CMD(TDMA_CMD_ENABLE_PTCCH_UL_FWD)) {</span><br><span>                log("Enabling forwarding of PTCCH/U TDMA events to the TC");</span><br><span>               cfg_ptcch_burst_fwd := true;</span><br><span>diff --git a/pcu/PCU_Tests.ttcn b/pcu/PCU_Tests.ttcn</span><br><span>index a40819d..ac2aaf3 100644</span><br><span>--- a/pcu/PCU_Tests.ttcn</span><br><span>+++ b/pcu/PCU_Tests.ttcn</span><br><span>@@ -101,6 +101,11 @@</span><br><span> }</span><br><span> </span><br><span> type component RAW_PCU_Test_CT extends bssgp_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* PCU interface abstraction component */</span><br><span style="color: hsl(120, 100%, 40%);">+     var RAW_PCUIF_CT vc_PCUIF;</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Virtual BTS component */</span><br><span style="color: hsl(120, 100%, 40%);">+   var RAW_PCU_BTS_CT vc_BTS;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* Connection to the BTS component (one for now) */</span><br><span>  port RAW_PCU_MSG_PT BTS;</span><br><span>     /* Connection to the PCUIF component */</span><br><span>@@ -140,7 +145,7 @@</span><br><span> private altstep as_Tguard_RAW() runs on RAW_PCU_Test_CT {</span><br><span>   [] g_T_guard.timeout {</span><br><span>               setverdict(fail, "Timeout of T_guard");</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>             }</span><br><span> }</span><br><span> </span><br><span>@@ -189,9 +194,6 @@</span><br><span> </span><br><span> function f_init_raw(charstring id, template (value) PCUIF_info_ind info_ind := ts_PCUIF_INFO_default)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(0, 100%, 40%);">-      var RAW_PCUIF_CT vc_PCUIF;</span><br><span style="color: hsl(0, 100%, 40%);">-      var RAW_PCU_BTS_CT vc_BTS;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>   /* Start the guard timer */</span><br><span>  g_T_guard.start;</span><br><span>     activate(as_Tguard_RAW());</span><br><span>@@ -215,6 +217,26 @@</span><br><span>    BTS.receive(tr_RAW_PCU_EV(BTS_EV_SI13_NEGO));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+private function f_shutdown(charstring file, integer line,</span><br><span style="color: hsl(120, 100%, 40%);">+                        boolean final := false)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Determine if the test case was aborted in the middle */</span><br><span style="color: hsl(120, 100%, 40%);">+    if (not final) {</span><br><span style="color: hsl(120, 100%, 40%);">+              log("Test case ", testcasename(), " aborted at ", file, ":", line);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Guard verdict to avoid 'none' */</span><br><span style="color: hsl(120, 100%, 40%);">+           setverdict(pass);</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%);">+   /* Properly shutdown virtual BTS and its clock generator */</span><br><span style="color: hsl(120, 100%, 40%);">+   BTS.send(ts_RAW_PCU_CMD(GENERAL_CMD_SHUTDOWN));</span><br><span style="color: hsl(120, 100%, 40%);">+       vc_BTS.done; /* wait untill it's done */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* Shutdown the others and MTC */</span><br><span style="color: hsl(120, 100%, 40%);">+     all component.stop;</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> template AckNackDescription t_AckNackDescription_init := {</span><br><span>         final_ack := '0'B,</span><br><span>   starting_seq_nr := 0,</span><br><span>@@ -432,7 +454,7 @@</span><br><span>  rr_imm_ass := dec_GsmRrMessage(macblock);</span><br><span>    if (not match(rr_imm_ass, tr_IMM_TBF_ASS())) {</span><br><span>               setverdict(fail, "Failed to match Immediate Assignment: ", rr_imm_ass);</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span>    f_pcuif_tx_data_cnf(pcu_msg);</span><br><span> }</span><br><span>@@ -461,13 +483,13 @@</span><br><span>   rr_pag_req1 := dec_GsmRrMessage(macblock);</span><br><span>   if (not match(rr_pag_req1, tr_PAG_REQ1(tr_MI_LV(mi1)))) {</span><br><span>            setverdict(fail, "Failed to match Paging Request Type 1: ", rr_pag_req1);</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Make sure that received paging froup matches the expected one */</span><br><span>  if (not match(pag_group_rx, pag_group)) {</span><br><span>            setverdict(fail, "Paging group", pag_group_rx, " does not match expected ", pag_group);</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        f_pcuif_tx_data_cnf(pcu_msg);</span><br><span>@@ -515,7 +537,7 @@</span><br><span>  var CodingScheme cs_mcs := f_rlcmac_block_len2cs_mcs(len)</span><br><span>    if (not match(f_rlcmac_block_len2cs_mcs(len), exp_cs_mcs)) {</span><br><span>                 setverdict(fail, "Failed to match Coding Scheme exp ", exp_cs_mcs, " vs ", cs_mcs, " (", len, ")");</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span>@@ -526,7 +548,7 @@</span><br><span>     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span>       if (not match(dl_block, tr_RLCMAC_UL_ACK_NACK(ul_tfi := ?, tlli := ?))) {</span><br><span>            setverdict(fail, "Failed to match Packet Uplink ACK / NACK");</span><br><span style="color: hsl(0, 100%, 40%);">-         mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</span><br><span>@@ -539,7 +561,7 @@</span><br><span>        f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span>       if (not match(dl_block, tr_RLCMAC_DUMMY_CTRL())) {</span><br><span>           setverdict(fail, "Failed to match Packet DUMMY DL");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span>@@ -550,7 +572,7 @@</span><br><span>     f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span>       if (not match(dl_block, tr_RLCMAC_DL_PACKET_ASS())) {</span><br><span>                setverdict(fail, "Failed to match Packet Downlink Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</span><br><span>@@ -563,7 +585,7 @@</span><br><span>         f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span>         if (not match(dl_block, tr_RLCMAC_UL_PACKET_ASS())) {</span><br><span>                 setverdict(fail, "Failed to match Packet Uplink Assignment");</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+          f_shutdown(__BFILE__, __LINE__);</span><br><span>         }</span><br><span> </span><br><span>         poll_fn := dl_fn + f_rrbp_fn_delay(dl_block.ctrl.mac_hdr.rrbp);</span><br><span>@@ -577,12 +599,15 @@</span><br><span>         f_rx_rlcmac_dl_block(dl_block, dl_fn);</span><br><span>       if (not match(dl_block, tr_RLCMAC_PACKET_PAG_REQ())) {</span><br><span>               setverdict(fail, "Failed to match Packet Paging Request: ", dl_block, " vs ", tr_RLCMAC_PACKET_PAG_REQ());</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_verify_data_gprs(RlcmacDlBlock dl_block, uint32_t dl_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                  out uint32_t ack_fn, octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                template (present) uint7_t exp_bsn := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span>  log("verifying dl data block (gprs): ", dl_block);</span><br><span> </span><br><span>     ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data.mac_hdr.mac_hdr.rrbp);</span><br><span>@@ -594,31 +619,34 @@</span><br><span> </span><br><span>   if (lengthof(dl_block.data.blocks) < 1) {</span><br><span>                 setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        if (ispresent(dl_block.data.blocks[0].hdr) and dl_block.data.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span>           setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span>                        dl_block.data.blocks[0].hdr.length_ind, " vs ", lengthof(data));</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        if (dl_block.data.blocks[0].payload != data) {</span><br><span>               setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Check next data blocks contain dummy frames */</span><br><span>    if (lengthof(dl_block.data.blocks) > 1 and substr(dl_block.data.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span>          setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* TODO: check exp_cs */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn, out uint32_t ack_fn, octetstring data, template (present) uint14_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rlcmac_dl_block_verify_data_egprs(RlcmacDlBlock dl_block, uint32_t dl_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 out uint32_t ack_fn, octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                template (present) uint14_t exp_bsn := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                     template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span>         log("verifying dl data block (egprs): ", dl_block);</span><br><span> </span><br><span>    ack_fn := dl_fn + f_rrbp_fn_delay(dl_block.data_egprs.mac_hdr.rrbp);</span><br><span>@@ -630,31 +658,34 @@</span><br><span> </span><br><span>     if (lengthof(dl_block.data_egprs.blocks) < 1) {</span><br><span>           setverdict(fail, "DL block has no LLC payload: ", dl_block);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        if (ispresent(dl_block.data_egprs.blocks[0].hdr) and dl_block.data_egprs.blocks[0].hdr.length_ind != lengthof(data)) {</span><br><span>               setverdict(fail, "DL block has LLC header with wrong expected size: ",</span><br><span>                        dl_block.data_egprs.blocks[0].hdr.length_ind, " vs ", lengthof(data));</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        if (dl_block.data_egprs.blocks[0].payload != data) {</span><br><span>                 setverdict(fail, "Failed to match content of LLC payload in DL Block: ", dl_block, " vs ", data);</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Check next data blocks contain dummy frames */</span><br><span>    if (lengthof(dl_block.data_egprs.blocks) > 1 and substr(dl_block.data_egprs.blocks[1].payload, 0, 3) != '43C001'O) {</span><br><span>              setverdict(fail, "Second data payload is not a dummy frame: ", dl_block.data.blocks[1].payload);</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* TODO: Check exp_cs. In the case of EGPRS, first check mac_hdr.header_type and then decode CPS = exp_cs based on mac_hdr.header_type.</span><br><span>              See wireshark's egprs_Header_type1_coding_puncturing_scheme_to_mcs. */</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn, octetstring data, template (present) uint7_t exp_bsn := ?, template (present) CodingScheme exp_cs := ?)</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_rx_rlcmac_dl_block_exp_data(out RlcmacDlBlock dl_block, out uint32_t ack_fn,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          octetstring data,</span><br><span style="color: hsl(120, 100%, 40%);">+                                             template (present) uint7_t exp_bsn := ?,</span><br><span style="color: hsl(120, 100%, 40%);">+                                              template (present) CodingScheme exp_cs := ?)</span><br><span> runs on RAW_PCU_Test_CT {</span><br><span>     var PCUIF_Message pcu_msg;</span><br><span>   var uint32_t dl_fn;</span><br><span>@@ -668,7 +699,7 @@</span><br><span>            dl_template.data_egprs.blocks := ?;</span><br><span>          if (not match(dl_block, dl_template)) {</span><br><span>                      setverdict(fail, "Failed to match Packet data: ", dl_block, " vs ", dl_template);</span><br><span style="color: hsl(0, 100%, 40%);">-                   mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_shutdown(__BFILE__, __LINE__);</span><br><span>             }</span><br><span>            is_egprs := true;</span><br><span>    }</span><br><span>@@ -705,6 +736,8 @@</span><br><span>              setverdict(fail, "Timeout waiting for BSSGP SUSPEND");</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_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test of correct Timing Advance at the time of TBF establishment</span><br><span>@@ -723,7 +756,7 @@</span><br><span>                 ok := f_establish_tbf(rr_msg, bts_nr := 0, ta := ta);</span><br><span>                if (not ok) {</span><br><span>                        setverdict(fail, "Failed to establish an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span>               }</span><br><span> </span><br><span>                /* Make sure Timing Advance IE matches out expectations */</span><br><span>@@ -731,9 +764,11 @@</span><br><span>                    setverdict(fail, "Timing Advance mismatch: ",</span><br><span>                                 rr_msg.payload.imm_ass.timing_advance,</span><br><span>                               " vs expected ", ta);</span><br><span style="color: hsl(0, 100%, 40%);">-                      mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</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_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Verify Timing Advance value(s) indicated during the packet Downlink assignment</span><br><span>@@ -764,8 +799,9 @@</span><br><span>   * the procedures defined in 3GPP TS 44.060 or use the polling mechanism. */</span><br><span>         if (not match(rr_imm_ass, tr_IMM_TBF_ASS(ta := 0))) {</span><br><span>                setverdict(fail, "Timing Advance value doesn't match");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Verify that the PCU generates valid PTCCH/D messages</span><br><span>@@ -792,7 +828,7 @@</span><br><span>    [] BTS.receive(PCUIF_Message:?) { repeat; }</span><br><span>  [] T.timeout {</span><br><span>               setverdict(fail, "Timeout waiting for a PTCCH/D block");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>             }</span><br><span>    }</span><br><span> </span><br><span>@@ -803,8 +839,9 @@</span><br><span>   * TODO: do we expect all TA values to be equal '1111111'B? */</span><br><span>       if (not match(ptcch_msg, tr_PTCCHDownlinkMsg)) {</span><br><span>             setverdict(fail, "Malformed PTCCH/D message");</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test of correct Timing Advance during an active Uplink TBF.</span><br><span>@@ -856,7 +893,9 @@</span><br><span>     /* Send Access Bursts on PTCCH/U for every TA Index */</span><br><span>       [] BTS.receive(tr_RAW_PCU_EV(TDMA_EV_PTCCH_UL_BURST)) -> value event {</span><br><span>            ss := f_tdma_ptcch_fn2ss(event.data.tdma_fn);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (ss < 0) { mtc.stop; } /* Shall not happen */</span><br><span style="color: hsl(120, 100%, 40%);">+           if (ss < 0) { /* Shall not happen */</span><br><span style="color: hsl(120, 100%, 40%);">+                       f_shutdown(__BFILE__, __LINE__);</span><br><span style="color: hsl(120, 100%, 40%);">+              }</span><br><span> </span><br><span>                log("Sending an Access Burst on PTCCH/U",</span><br><span>              ", sub-slot=", ss, " (TAI)",</span><br><span>@@ -898,16 +937,13 @@</span><br><span>                 log("Rx PTCCH/D message: ", ta_msg);</span><br><span> </span><br><span>           /* Make sure Timing Advance values match our expectations */</span><br><span style="color: hsl(0, 100%, 40%);">-            if (match(ta_msg, t_ta_msg)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                  setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-               } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (not match(ta_msg, t_ta_msg)) {</span><br><span>                   setverdict(fail, "PTCCH/D message does not match: ", t_ta_msg);</span><br><span>            }</span><br><span>            }</span><br><span>    [] BTS.receive { repeat; }</span><br><span>   [] T.timeout {</span><br><span>               setverdict(fail, "Timeout waiting for a PTCCH/D block");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span>            }</span><br><span>    }</span><br><span> }</span><br><span>@@ -929,7 +965,7 @@</span><br><span>                 ok := f_establish_tbf(rr_msg[i], ta := 0);</span><br><span>           if (not ok) {</span><br><span>                        setverdict(fail, "Failed to establish an Uplink TBF #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                   mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span>               }</span><br><span> </span><br><span>                /* Make sure we received an UL TBF Assignment */</span><br><span>@@ -938,14 +974,14 @@</span><br><span>                     log("Rx Uplink TBF assignment for #", i, ": ", ul_tbf_ass[i]);</span><br><span>           } else {</span><br><span>                     setverdict(fail, "Failed to match UL TBF Assignment for #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                       mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span>               }</span><br><span> </span><br><span>                /* We expect incremental TFI/USF assignment (dynamic allocation) */</span><br><span>          t_ul_tbf_ass := tr_PacketUlDynAssign(tfi := i, usf := i);</span><br><span>            if (not match(ul_tbf_ass[i], t_ul_tbf_ass)) {</span><br><span>                        setverdict(fail, "Failed to match Packet Uplink Assignment for #", i);</span><br><span style="color: hsl(0, 100%, 40%);">-                        mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span>               }</span><br><span> </span><br><span>                /* We also expect Timing Advance Index to be a part of the assignment */</span><br><span>@@ -979,6 +1015,8 @@</span><br><span>              tai3_ta := 28, tai4_ta := 35, tai5_ta := 42,</span><br><span>                 /* Other values are out of our interest */</span><br><span>           tai6_ta := ?));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Default link quality adaptation (Coding Scheme) ranges (inclusive).</span><br><span>@@ -1010,13 +1048,13 @@</span><br><span>         ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span>@@ -1068,10 +1106,10 @@</span><br><span> </span><br><span>                if (not match(dl_block.ctrl.payload.u.ul_ack_nack.gprs.ch_coding_cmd, ch_coding)) {</span><br><span>                  setverdict(fail, "Channel Coding does not match our expectations: ", ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-              } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                        setverdict(pass);</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_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test the max UL CS set by VTY works fine */</span><br><span>@@ -1099,13 +1137,13 @@</span><br><span>         ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span>@@ -1133,11 +1171,8 @@</span><br><span> </span><br><span>         if (last_ch_coding != CH_CODING_CS3) {</span><br><span>               setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   setverdict(pass);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    /* Remaining UL blocks are used to make sure regardless of initial</span><br><span>   /* lqual, we can go lower at any time */</span><br><span> </span><br><span>@@ -1158,9 +1193,9 @@</span><br><span> </span><br><span>     if (last_ch_coding != CH_CODING_CS1) {</span><br><span>               setverdict(fail, "Channel Coding does not match our expectations (CS-1): ", last_ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test the max UL CS set by VTY works fine */</span><br><span>@@ -1184,13 +1219,13 @@</span><br><span>         ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        var template (value) RlcmacUlBlock ul_data := t_RLCMAC_UL_DATA(</span><br><span>@@ -1219,9 +1254,9 @@</span><br><span> </span><br><span>  if (last_ch_coding != CH_CODING_CS3) {</span><br><span>               setverdict(fail, "Channel Coding does not match our expectations (CS-3): ", last_ch_coding);</span><br><span style="color: hsl(0, 100%, 40%);">-  } else {</span><br><span style="color: hsl(0, 100%, 40%);">-                setverdict(pass);</span><br><span>    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Verify PCU drops TBF after some time of inactivity. */</span><br><span>@@ -1254,13 +1289,13 @@</span><br><span>      ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Send one UL block and make sure it is ACKED fine */</span><br><span>@@ -1275,6 +1310,8 @@</span><br><span>       /* Send an UL block once again, the TBF should be gone by now so no ACK */</span><br><span>   f_tx_rlcmac_ul_n_blocks(ul_tbf_ass, 1);</span><br><span>      f_rx_rlcmac_dl_block_exp_dummy(dl_block);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Verify that a Downlink TBF can be assigned using PACCH shortly after the</span><br><span>@@ -1306,7 +1343,7 @@</span><br><span>      ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span>    /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span>@@ -1329,6 +1366,8 @@</span><br><span>      f_rx_rlcmac_dl_block_exp_data(dl_block, sched_fn, data, 0);</span><br><span>  f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span>      f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span>@@ -1360,12 +1399,12 @@</span><br><span>       ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span>    ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        if (not istemplatekind(ms_racap, "omit")) {</span><br><span>@@ -1376,7 +1415,7 @@</span><br><span>                f_rx_rlcmac_dl_block_exp_pkt_ul_ass(dl_block, sched_fn);</span><br><span>             if (dl_block.ctrl.payload.u.ul_assignment.identity.tlli.tlli != tlli) {</span><br><span>                      setverdict(fail, "Wrong TLLI ", dl_block.ctrl.payload.u.ul_assignment.identity.tlli, " received vs exp ", tlli);</span><br><span style="color: hsl(0, 100%, 40%);">-                    mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+                     f_shutdown(__BFILE__, __LINE__);</span><br><span>             }</span><br><span>    }</span><br><span> </span><br><span>@@ -1396,7 +1435,7 @@</span><br><span>        ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>@@ -1406,6 +1445,8 @@</span><br><span>         /* ACK the DL block */</span><br><span>       f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span>      f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test scenario where MS wants to send some data on PDCH against SGSN and it is</span><br><span>@@ -1460,7 +1501,7 @@</span><br><span>         ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>@@ -1475,12 +1516,12 @@</span><br><span>       ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span>    ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Send one UL block and make sure it is ACKED fine */</span><br><span>@@ -1491,6 +1532,8 @@</span><br><span> </span><br><span>   /* UL block should be received in SGSN */</span><br><span>    BSSGP[0].receive(tr_BSSGP_UL_UD(tlli, mp_gb_cfg.cell_id));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> testcase TC_mt_ping_pong() runs on RAW_PCU_Test_CT {</span><br><span>@@ -1539,7 +1582,7 @@</span><br><span>     ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>@@ -1553,7 +1596,7 @@</span><br><span>         ok := f_imm_ass_verify_dl_tbf_ass(rr_imm_ass, dl_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not a Downlink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span>    /* Wait timer X2002 and DL block is available after CCCH IMM ASS: */</span><br><span>         f_sleep(X2002);</span><br><span>@@ -1562,35 +1605,40 @@</span><br><span>    /* ACK the DL block */</span><br><span>       f_acknackdesc_ack_block(ack_nack_desc, dl_block, '1'B);</span><br><span>      f_tx_rlcmac_ul_block(ts_RLCMAC_DL_ACK_NACK(f_rlcmac_dl_block_get_tfi(dl_block), ack_nack_desc), 0, sched_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pkt_paging_match_imsi(in PacketPagingReq req, hexstring imsi)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span>      var MobileIdentityLV_Paging mi_lv := req.repeated_pageinfo.cs.mobile_identity;</span><br><span>       var MobileIdentityV mi := dec_MobileIdentityV(mi_lv.mobile_id);</span><br><span> </span><br><span>  if (mi_lv.len != 8) { /* 8 octets: type of ID (3 bits) + even/odd flag (1 bit) + 15 BCD-encoded digits (60 bits) */</span><br><span>          setverdict(fail, "Mobile Identity length mismatch: ",</span><br><span>                         "expected: 8, got: ", mi_lv.len);</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Make sure MI contains IMSI before referencing it */</span><br><span>       if (mi.typeOfIdentity != '001'B) {</span><br><span>           setverdict(fail, "Mobile Identity must be of type IMSI ('001'B), ",</span><br><span>                           "got: ", mi.typeOfIdentity);</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     } else if (mi.oddEvenInd_identity.imsi.digits != imsi) {</span><br><span>             setverdict(fail, "Mobile Identity contains unexpected IMSI, ",</span><br><span>                        "expected: ", imsi, " got: ", mi.oddEvenInd_identity.imsi.digits);</span><br><span style="color: hsl(0, 100%, 40%);">-               mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-private function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi) {</span><br><span style="color: hsl(120, 100%, 40%);">+private function f_pkt_paging_match_tmsi(in PacketPagingReq req, template GsmTmsi tmsi)</span><br><span style="color: hsl(120, 100%, 40%);">+runs on RAW_PCU_Test_CT {</span><br><span style="color: hsl(120, 100%, 40%);">+       var MobileIdentityLV_Paging mi_lv := req.repeated_pageinfo.cs.mobile_identity;</span><br><span>       if (not match(req.repeated_pageinfo.cs.tmsi, tmsi)) {</span><br><span>                setverdict(fail, "Mobile Identity (TMSI/P-TMSI) mismatch: ",</span><br><span>                          "expected: ", tmsi, "got: ", req.repeated_pageinfo.cs.tmsi);</span><br><span style="color: hsl(0, 100%, 40%);">-             mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> }</span><br><span> </span><br><span>@@ -1626,13 +1674,13 @@</span><br><span>         ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span> </span><br><span>@@ -1649,7 +1697,7 @@</span><br><span>    /* Make sure that Packet Paging Request contains the same IMSI */</span><br><span>    f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> /* Test CS paging over Gb (SGSN->PCU->BTS[PDCH]).</span><br><span>@@ -1678,13 +1726,13 @@</span><br><span>        ok := f_establish_tbf(rr_imm_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Failed to establish TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-          mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        ok := f_imm_ass_verify_ul_tbf_ass(rr_imm_ass, ul_tbf_ass);</span><br><span>   if (not ok) {</span><br><span>                setverdict(fail, "Immediate Assignment not an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-           mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        /* Send paging request with or without TMSI */</span><br><span>@@ -1705,7 +1753,7 @@</span><br><span>               f_pkt_paging_match_imsi(dl_block.ctrl.payload.u.paging, imsi);</span><br><span>       }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> testcase TC_paging_cs_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {</span><br><span>@@ -1749,7 +1797,7 @@</span><br><span>           f_pcuif_rx_pch_pag_req1(tr_MI_IMSI(imsi), imsi_suff_tx);</span><br><span>     }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   setverdict(pass);</span><br><span style="color: hsl(120, 100%, 40%);">+     f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> testcase TC_paging_ps_from_sgsn_sign_ptmsi() runs on RAW_PCU_Test_CT {</span><br><span>@@ -1778,12 +1826,12 @@</span><br><span>         ok := f_establish_tbf(rr_msg, ra := ra11, is_11bit := 1, burst_type := bt);</span><br><span>  if (not ok) {</span><br><span>                setverdict(fail, "Failed to establush an Uplink TBF");</span><br><span style="color: hsl(0, 100%, 40%);">-                mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        if (not match(rr_msg, t_imm_ass)) {</span><br><span>          setverdict(fail, "Immediate Assignment does not match");</span><br><span style="color: hsl(0, 100%, 40%);">-              mtc.stop;</span><br><span style="color: hsl(120, 100%, 40%);">+             f_shutdown(__BFILE__, __LINE__);</span><br><span>     }</span><br><span> </span><br><span>        setverdict(pass);</span><br><span>@@ -1813,6 +1861,8 @@</span><br><span> </span><br><span>                f_TC_egprs_pkt_chan_req(req, imm_ass);</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> testcase TC_egprs_pkt_chan_req_one_phase() runs on RAW_PCU_Test_CT {</span><br><span>@@ -1845,6 +1895,8 @@</span><br><span> </span><br><span>                 f_TC_egprs_pkt_chan_req(req, imm_ass);</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> testcase TC_egprs_pkt_chan_req_two_phase() runs on RAW_PCU_Test_CT {</span><br><span>@@ -1875,6 +1927,8 @@</span><br><span> </span><br><span>                 f_TC_egprs_pkt_chan_req(req, imm_ass);</span><br><span>       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   f_shutdown(__BFILE__, __LINE__, final := true);</span><br><span> }</span><br><span> </span><br><span> control {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/18082">change 18082</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/+/18082"/><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: I6a859687d9605cc08c51ff44d946c279b79bedfa </div>
<div style="display:none"> Gerrit-Change-Number: 18082 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: fixeria <axilirator@gmail.com> </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>