bscnat: Refactor BSC_MS side code to allow different actions per test

Each test can now plug in different actions to be done by the emulated
BSC_MS, by passing a function to f_init(). Old hardcoded behaviour (main())
is renamed and used in already existing tests.

Change-Id: Ic82ca333267535c5859e6439deacbf3b1d1fe391
diff --git a/bsc-nat/BSC_MS_Simulation.ttcn b/bsc-nat/BSC_MS_Simulation.ttcn
index d4e37a4..5feaf0e 100644
--- a/bsc-nat/BSC_MS_Simulation.ttcn
+++ b/bsc-nat/BSC_MS_Simulation.ttcn
@@ -31,9 +31,7 @@
 	/* test port to SCCP emulation */
 	port SCCPasp_PT SCCP;
 
-	var SCCP_PAR_Address g_sccp_addr_own;
-	var SCCP_PAR_Address g_sccp_addr_remote;
-	var boolean g_use_osmux;
+	var BSC_MS_TestHdlrParams g_pars;
 
 	var charstring g_bsc_num_str;
 }
@@ -42,21 +40,41 @@
 	integer mp_num_iterations := 10;
 }
 
+/* helper function to create and connect a BSC_MS_ConnHdlr component */
+private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {
+	/* connect client BSSAP port to BSSAP dispatcher */
+	connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
+}
+
+private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
+runs on BSC_CT return BSC_MS_ConnHdlr {
+	var BSC_MS_ConnHdlr vc_conn;
+	vc_conn := BSC_MS_ConnHdlr.create(id);
+	f_connect_handler(vc_conn);
+	vc_conn.start(f_handler_init(fn, id, pars));
+	return vc_conn;
+}
+
+/* first function inside ConnHdlr component; sets g_pars + starts function */
+private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
+runs on BSC_MS_ConnHdlr {
+	if (isvalue(pars)) {
+		g_pars := valueof(pars);
+	}
+	fn.apply(id);
+}
+
 function main(charstring remote_ip, PortNumber remote_port,
 		charstring local_ip, PortNumber local_port,
 		MSC_SCCP_MTP3_parameters sccp_pars,
-		SCCP_PAR_Address sccp_addr_own,
-		SCCP_PAR_Address sccp_addr_remote,
-		boolean use_osmux, charstring id) runs on BSC_CT
+		BSC_MS_TestHdlrParams pars,
+		void_fn_bsc_ms fn, charstring id) runs on BSC_CT
 {
 	var integer i := 0;
 	timer T := 1.0;
 	var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;
 	ccm_pars.name := id;
-
-	g_sccp_addr_own := sccp_addr_own;
-	g_sccp_addr_remote := sccp_addr_remote;
-	g_use_osmux := use_osmux;
+	g_pars := pars;
 
 	/* create components for IPA/SCCP/BSS[M]AP stack */
 	vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
@@ -84,7 +102,7 @@
 	T.timeout;
 
 	for (i := 0; i < mp_num_iterations; i := i+1) {
-		f_start_BSC_MS(id & "-MS-" & int2str(i));
+		f_start_BSC_MS(fn, id & "-MS-" & int2str(i));
 	}
 
 	/* explicitly stop all components that we started above */
@@ -93,15 +111,10 @@
 	vc_SCCP.stop;
 }
 
-function f_start_BSC_MS(charstring id) runs on BSC_CT {
+function f_start_BSC_MS(void_fn_bsc_ms fn, charstring id) runs on BSC_CT {
 	var BSC_MS_ConnHdlr vc_conn;
-
-	/* start new component */
-	vc_conn := BSC_MS_ConnHdlr.create(id);
-	/* connect client BSSAP port to BSSAP dispatcher */
-	connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
 	/* start component */
-	vc_conn.start(BSC_MS_ConnectionHandler.main(g_sccp_addr_own, g_sccp_addr_remote, g_use_osmux));
+	vc_conn := f_start_handler(fn, id, g_pars);
 	/* blocking wait until component terminates.  If you want to start MSs in parallel,
 	 * you have to remove this statement here */
 	vc_conn.done;