msc: Add global g_Tguard timer to make sure BSC_ConnHdlr terminates

Change-Id: I10fc0ff04c16eacc12f09ac1759940676ae62213
diff --git a/msc_tests/MSC_Tests.ttcn b/msc_tests/MSC_Tests.ttcn
index 8512d3e..f38b989 100644
--- a/msc_tests/MSC_Tests.ttcn
+++ b/msc_tests/MSC_Tests.ttcn
@@ -379,6 +379,8 @@
 	connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
 	connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
 
+	/* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have
+	 * a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */
 	vc_conn.start(derefers(fn)(id, pars));
 	return vc_conn;
 }
@@ -395,7 +397,7 @@
 }
 
 private function f_tc_lu_imsi_noauth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	f_perform_lu(false, true, true);
 }
 testcase TC_lu_imsi_noauth_tmsi() runs on MTC_CT {
@@ -407,7 +409,7 @@
 }
 
 private function f_tc_lu_imsi_noauth_notmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	f_perform_lu(false, false, true);
 }
 testcase TC_lu_imsi_noauth_notmsi() runs on MTC_CT {
@@ -421,7 +423,7 @@
 
 /* Do LU by IMSI, refuse it on GSUP and expect LU REJ back to MS */
 private function f_tc_lu_imsi_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
 
 	f_create_gsup_expect(hex2str(g_pars.imsi));
@@ -450,7 +452,7 @@
 
 /* Do LU by IMSI, timeout on GSUP */
 private function f_tc_lu_imsi_timeout_gsup(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi);
 
 	f_create_gsup_expect(hex2str(g_pars.imsi));
@@ -479,7 +481,7 @@
 }
 
 private function f_tc_lu_imsi_auth_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	f_perform_lu(true, true, true);
 }
 testcase TC_lu_imsi_auth_tmsi() runs on MTC_CT {
@@ -495,7 +497,7 @@
 /* Send CM SERVICE REQ for IMSI that has never performed LU before */
 private function f_tc_cmserv_imsi_unknown(charstring id, BSC_ConnHdlrPars pars)
 runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
 	var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellId_CGI('262'H, '042'H, 23, 42));
@@ -534,7 +536,7 @@
 }
 
 private function f_tc_lu_and_mo_call(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
 	cpars.bss_rtp_port := 1110;
 	cpars.mgcp_connection_id_bss := '22222'H;
@@ -553,7 +555,7 @@
 
 /* Test LU (with authentication enabled), where HLR times out sending SAI response */
 private function f_tc_lu_auth_sai_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
 	var PDU_DTAP_MT dtap_mt;
@@ -587,7 +589,7 @@
 
 /* Test LU (with authentication enabled), where HLR rejects sending SAI error */
 private function f_tc_lu_auth_sai_err(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
 	var PDU_DTAP_MT dtap_mt;
@@ -621,7 +623,7 @@
 
 /* Test LU but BSC will send a clear request in the middle */
 private function f_tc_lu_clear_request(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
 	var PDU_DTAP_MT dtap_mt;
@@ -653,7 +655,7 @@
 
 /* Test LU but BSC will send a clear request in the middle */
 private function f_tc_lu_disconnect(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
 	var PDU_DTAP_MT dtap_mt;
@@ -683,7 +685,7 @@
 
 /* Test LU but with illegal mobile identity type = IMEI */
 private function f_tc_lu_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imei(g_pars.imei)
 	var PDU_DTAP_MT dtap_mt;
@@ -717,7 +719,7 @@
 
 /* Test LU by TMSI with unknown TMSI, expect (and answer) ID REQ. */
 private function f_tc_lu_tmsi_noauth_unknown(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_tmsi('01020304'O); /* FIXME: Random */
 	var PDU_DTAP_MT dtap_mt;
@@ -767,7 +769,7 @@
 
 /* Test IMSI DETACH (MI=IMSI) */
 private function f_tc_imsi_detach_by_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV(g_pars.imsi));
 
@@ -793,7 +795,7 @@
 
 /* Test IMSI DETACH (MI=TMSI) */
 private function f_tc_imsi_detach_by_tmsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var MobileIdentityLV mi := valueof(ts_MI_TMSI_LV('01020304'O));
 
@@ -819,7 +821,7 @@
 
 /* Test IMSI DETACH (MI=IMEI), which is illegal */
 private function f_tc_imsi_detach_by_imei(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
 
@@ -892,7 +894,7 @@
 
 /* establish an emergency call by IMEI, no SIM inserted (and hence no IMSI) */
 private function f_tc_emerg_call_imei_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var MobileIdentityLV mi := valueof(ts_MI_IMEI_LV(g_pars.imei));
 	var PDU_ML3_MS_NW l3_info := valueof(ts_CM_SERV_REQ(CM_TYPE_EMERG_CALL, mi));
@@ -913,7 +915,7 @@
 
 /* establish an emergency call by IMSI, SIM inserted (and hence IMSI) */
 private function f_tc_emerg_call_imsi(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	/* First perform location update to ensure subscriber is known */
 	f_perform_lu(false, true, true);
 	/* Then issue emergency call identified by IMSI */
@@ -929,7 +931,7 @@
 
 /* CM Service Request for VGCS -> reject */
 private function f_tc_cm_serv_req_vgcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	/* First perform location update to ensure subscriber is known */
 	f_perform_lu(false, true, true);
@@ -953,7 +955,7 @@
 
 /* CM Service Request for VBS -> reject */
 private function f_tc_cm_serv_req_vbs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	/* First perform location update to ensure subscriber is known */
 	f_perform_lu(false, true, true);
@@ -977,7 +979,7 @@
 
 /* CM Service Request for LCS -> reject */
 private function f_tc_cm_serv_req_lcs_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	/* First perform location update to ensure subscriber is known */
 	f_perform_lu(false, true, true);
@@ -1001,7 +1003,7 @@
 
 /* CM Re-Establishment Request */
 private function f_tc_cm_reest_req_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	/* First perform location update to ensure subscriber is known */
 	f_perform_lu(false, true, true);
@@ -1025,7 +1027,7 @@
 
 /* Test LU (with authentication enabled), with wrong response from MS */
 private function f_tc_lu_auth_2G_fail(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var PDU_ML3_MS_NW l3_lu := f_build_lu_imsi(g_pars.imsi)
 
@@ -1067,7 +1069,7 @@
 }
 
 private function f_tc_lu_imsi_auth_tmsi_encr_13_13(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	f_perform_lu(true, true, true, true);
 }
 testcase TC_lu_imsi_auth_tmsi_encr_13_13() runs on MTC_CT {
@@ -1082,7 +1084,7 @@
 
 /* Test Complete L3 without payload */
 private function f_tc_cl3_no_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	/* Send Complete L3 Info with empty L3 frame */
 	BSSAP.send(ts_BSSAP_Conn_Req(g_pars.sccp_addr_peer, g_pars.sccp_addr_own,
@@ -1108,7 +1110,7 @@
 
 /* Test Complete L3 with random payload */
 private function f_tc_cl3_rnd_payload(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	var integer len := float2int(rnd() * 256.0);
 	var octetstring payl := f_rnd_octstring(len);
@@ -1139,7 +1141,7 @@
 
 /* Test Complete L3 with random payload */
 private function f_tc_establish_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 
 	f_perform_lu(false, true, true, false);
 
@@ -1169,7 +1171,8 @@
 
 /* Test MO Call SETUP with no response from MNCC */
 private function f_tc_mo_setup_and_nothing(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
+
 	var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
 
 	f_perform_lu(false, true, true, false);
@@ -1205,7 +1208,7 @@
 
 /* Test MO Call with no response to RAN-side CRCX */
 private function f_tc_mo_crcx_ran_timeout(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
 	var MNCC_PDU mncc;
 	var MgcpCommand mgcp_cmd;
@@ -1252,7 +1255,7 @@
 
 /* Test MO Call with reject to RAN-side CRCX */
 private function f_tc_mo_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var CallParameters cpars := valueof(t_CallParams('12345'H, 0));
 	var MNCC_PDU mncc;
 	var MgcpCommand mgcp_cmd;
@@ -1344,7 +1347,7 @@
 
 /* Test MT Call */
 private function f_tc_mt_crcx_ran_reject(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
 	var MNCC_PDU mncc;
 	var MgcpCommand mgcp_cmd;
@@ -1402,7 +1405,7 @@
 
 /* Test MT Call T310 timer */
 private function f_tc_mt_t310(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
-	g_pars := pars;
+	f_init_handler(pars);
 	var CallParameters cpars := valueof(t_CallParams('123456'H, 0));
 	var MNCC_PDU mncc;
 	var MgcpCommand mgcp_cmd;