ipa: First version that emulates both MSC and BSC up to ASSIGNMENT REQ
diff --git a/ipa/IPA_Test.ttcn b/ipa/IPA_Test.ttcn
index 4e87fa6..c8b8205 100644
--- a/ipa/IPA_Test.ttcn
+++ b/ipa/IPA_Test.ttcn
@@ -1,48 +1,58 @@
 module IPA_Test {
 
+import from Osmocom_Types all;
+
 import from IPL4asp_Types all;
 
 import from IPA_Emulation all;
 
+import from MTP3asp_Types all;
+
 import from SCCP_Types all;
 import from SCCPasp_Types all;
 import from SCCP_Emulation all;
 
-import from MobileL3_Types all;
-import from MobileL3_CommonIE_Types all;
-import from L3_Templates all;
+import from MSC_Simulation all;
+import from BSC_MS_Simulation all;
 
-import from BSSAP_Types all;
-import from BSSMAP_Templates all;
+const integer NUM_MSC := 1;
+const integer NUM_BSC := 1;
+
+type record BscState {
+	BSC_CT BSC,
+	MSC_SCCP_MTP3_parameters sccp_pars,
+	SCCP_PAR_Address sccp_addr_own,
+	SCCP_PAR_Address sccp_addr_peer
+}
+
+type record MscState {
+	MSC_CT MSC,
+	MSC_SCCP_MTP3_parameters sccp_pars,
+	SCCP_PAR_Address sccp_addr_own
+}
 
 type component test_CT {
-	/* component references */
-	var IPA_Emulation_CT vc_IPA;
-	var SCCP_CT vc_SCCP;
-	/* test port to SCCP emulation */
-	port SCCPasp_PT SCCP;
+	var MscState msc[NUM_MSC];
+	var BscState bsc[NUM_BSC];
 
 	var boolean g_initialized := false;
-	var octetstring g_sio;
-	var MSC_SCCP_MTP3_parameters g_sccp_pars;
-	var SCCP_PAR_Address g_sccp_addr_own, g_sccp_addr_peer;
-
-	var ConnectionId g_ipa_conn_id := -1;
+	var octetstring g_sio := '83'O;
 }
 
 modulepar {
-	PortNumber mp_local_port := 0;
-	charstring mp_local_ip := "127.0.0.1";
-	PortNumber mp_remote_port := 3002;
-	charstring mp_remote_ip := "127.0.0.1";
+	PortNumber mp_bsc_port := 49999;
+	charstring mp_bsc_ip := "127.0.0.1";
+
+	PortNumber mp_msc_port := 5000;
+	charstring mp_msc_ip := "127.0.0.1";
 
 	charstring mp_sccp_service_type := "mtp3_itu";
 
-	integer mp_own_pc := 196;
-	integer mp_own_ssn := 254;
+	integer mp_bsc_pc := 196;
+	integer mp_bsc_ssn := 254;
 
-	integer mp_peer_pc := 185;	/* 0.23.1 */
-	integer mp_peer_ssn := 254;
+	integer mp_msc_pc := 185;	/* 0.23.1 */
+	integer mp_msc_ssn := 254;
 }
 
 /* construct a SCCP_PAR_Address with just PC + SSN and no GT */
@@ -59,76 +69,62 @@
 	globalTitle := omit
 }
 
-
-function f_gen_cl3() return PDU_BSSAP {
-	var MobileIdentityLV mi := valueof(ts_MI_IMSI_LV('901770123456789'H));
-	var PDU_ML3_MS_NW l3 := valueof(ts_CM_SERV_REQ('0001'B, mi));
-	var BSSMAP_IE_CellIdentifier cell_id := valueof(ts_CellID_LAC_CI(23, 42));
-	var PDU_BSSAP bssap := valueof(ts_BSSMAP_ComplL3(cell_id, enc_PDU_ML3_MS_NW(l3)));
-	return bssap;
+template MTP3_Field_sio ts_sio(octetstring sio_in) := {
+	ni := substr(oct2bit(sio_in),0,2),
+	prio := substr(oct2bit(sio_in),2,2),
+	si := substr(oct2bit(sio_in),4,4)
 }
 
-function f_send_bssap_cc(PDU_BSSAP bssap) runs on test_CT {
-	var ASP_SCCP_N_CONNECT_req prim;
-	prim := valueof(t_ASP_N_CONNECT_req(g_sccp_addr_peer, g_sccp_addr_own, omit, omit,
-				    enc_PDU_BSSAP(bssap), 23, omit));
-	SCCP.send(prim);
+template MSC_SCCP_MTP3_parameters ts_SCCP_Pars(octetstring sio, integer opc, integer dpc,
+						integer local_ssn) := {
+	sio := ts_sio(sio),
+	opc := opc,
+	dpc := dpc,
+	sls := 0,
+	sccp_serviceType := mp_sccp_service_type,
+	ssn := local_ssn
+};
+
+function f_init_BscState(inout BscState bsc_st, integer opc, integer dpc, integer local_ssn, integer remote_ssn)
+runs on test_CT {
+	bsc_st.sccp_pars := valueof(ts_SCCP_Pars(g_sio, opc, dpc, local_ssn));
+	bsc_st.sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(opc, local_ssn));
+	bsc_st.sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(dpc, remote_ssn));
 }
 
-function init_pars() runs on test_CT {
-	g_sio := '83'O;
-	g_sccp_pars := {
-		sio := {
-			ni := substr(oct2bit(g_sio),0,2),
-			prio := substr(oct2bit(g_sio),2,2),
-			si := substr(oct2bit(g_sio),4,4)
-		},
-		opc := mp_own_pc,
-		dpc := mp_peer_pc,
-		sls := 0,
-		sccp_serviceType := mp_sccp_service_type,
-		ssn := mp_own_ssn
-	};
-	g_sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(mp_own_pc, mp_own_ssn));
-	g_sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(mp_peer_pc, mp_peer_ssn));
+function f_init_MscState(inout MscState msc_st, integer opc, integer dpc, integer local_ssn, integer remote_ssn)
+runs on test_CT {
+	msc_st.sccp_pars := valueof(ts_SCCP_Pars(g_sio, opc, dpc, local_ssn));
+	msc_st.sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(opc, local_ssn));
 }
 
-private function f_init() runs on test_CT {
-	var Result res;
+function f_init() runs on test_CT {
+	var integer i;
 
-	if (g_initialized == true) {
-		return;
+	for (i := 0; i < NUM_MSC; i := i+1) {
+		f_init_MscState(msc[i], mp_msc_pc +i, mp_bsc_pc, mp_msc_ssn, mp_bsc_ssn);
+		msc[i].MSC := MSC_CT.create;
+		msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i, msc[i].sccp_pars, msc[i].sccp_addr_own));
 	}
-	g_initialized := true;
 
-	init_pars();
+	for (i := 0; i < NUM_BSC; i := i+1) {
+		f_init_BscState(bsc[i], mp_bsc_pc +i, mp_msc_pc, mp_bsc_ssn, mp_msc_ssn);
+		bsc[i].BSC := BSC_CT.create;
+		bsc[i].BSC.start(BSC_MS_Simulation.main(mp_msc_ip, mp_msc_port, mp_bsc_ip, mp_bsc_port+i,
+							bsc[i].sccp_pars, bsc[i].sccp_addr_own,
+							bsc[i].sccp_addr_peer));
+	}
 
-	/* create components */
-	vc_IPA := IPA_Emulation_CT.create;
-	vc_SCCP := SCCP_CT.create;
-
-	map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
-
-	/* connect MTP3 service provider (IPA) to lower side of SCCP */
-	connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
-
-	/* connect us to upper side of SCCP */
-	connect(self:SCCP, vc_SCCP:SCCP_SP_PORT);
-
-	vc_IPA.start(IPA_Emulation.ScanEvents());
-	vc_SCCP.start(SCCPStart(g_sccp_pars));
-
-	//IPA_Emulation.f_connect(mp_remote_ip, mp_remote_port, mp_local_ip, mp_local_port);
 }
 
 testcase TC_recv_dump() runs on test_CT {
 	f_init();
 
-	var PDU_BSSAP bssap := f_gen_cl3();
-	f_send_bssap_cc(bssap);
+	//var PDU_BSSAP bssap := f_gen_cl3();
+	//f_send_bssap_cc(bssap);
 
 	while (true) {
-		SCCP.receive;
+		//SCCP.receive;
 	}
 }