module MSC_Simulation {

import from IPL4asp_Types all;

import from IPA_Emulation 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 BSSAP_Types all;
import from BSSMAP_Templates all;
*/
import from BSSMAP_Emulation all;

import from MGCP_Adapter all;

import from MSC_ConnectionHandler all;

type component MSC_CT {
	/* component references */
	var IPA_Emulation_CT vc_IPA;
	var SCCP_CT vc_SCCP;
	var BSSMAP_Emulation_CT vc_BSSMAP;
	var MGCP_Adapter_CT vc_MGCP_UDP;
	/* test port to SCCP emulation */
	port SCCPasp_PT SCCP;
}

modulepar {
	boolean mp_mgcp_uses_udp := false;
}

function main(charstring local_ip, PortNumber local_port,
	      MSC_SCCP_MTP3_parameters sccp_pars,
	      SCCP_PAR_Address sccp_addr_own, charstring id) runs on MSC_CT
{
	/* create components */
	vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
	vc_SCCP := SCCP_CT.create(id & "-SCCP");
	vc_BSSMAP := BSSMAP_Emulation_CT.create(id & "-BSSMAP");

	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 BSSNAP dispatcher to upper side of SCCP */
	connect(vc_BSSMAP:BSSAP, vc_SCCP:SCCP_SP_PORT);

	if (mp_mgcp_uses_udp == false) {
		/* connect BSSMAP dispatcher to IPA_Emulation MGCP */
		connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);
	} else {
		vc_MGCP_UDP := MGCP_Adapter_CT.create(id & "-MGCP_UDP");
		connect(vc_BSSMAP:MGCP, vc_MGCP_UDP:MGCP);
		vc_MGCP_UDP.start(MGCP_Adapter.main());
	}

	vc_IPA.start(IPA_Emulation.main_server(local_ip, local_port));
	vc_SCCP.start(SCCPStart(sccp_pars));
	vc_BSSMAP.start(BSSMAP_Emulation.main(MSC_BssmapOps, id & "-BSSMAP"));

	/* wait until termination of respective components */
	vc_IPA.done;
	vc_BSSMAP.done;
	vc_SCCP.done;
	if (mp_mgcp_uses_udp) {
		vc_MGCP_UDP.done;
	}
}

}
