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 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;
	/* test port to SCCP emulation */
	port SCCPasp_PT SCCP;
}

function main(charstring local_ip, PortNumber local_port,
	      MSC_SCCP_MTP3_parameters sccp_pars,
	      SCCP_PAR_Address sccp_addr_own) runs on MSC_CT
{
	/* create components */
	vc_IPA := IPA_Emulation_CT.create;
	vc_SCCP := SCCP_CT.create;
	vc_BSSMAP := BSSMAP_Emulation_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 BSSNAP dispatcher to upper side of SCCP */
	connect(vc_BSSMAP:SCCP, vc_SCCP:SCCP_SP_PORT);

	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));

	/* wait until termination of respective components */
	vc_IPA.done;
	vc_BSSMAP.done;
	vc_SCCP.done;
}

}
