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:SCCP, 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;
	}
}

}
