module BSC_MS_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 BSSAP_CodecPort all;
import from BSSMAP_Emulation all;

import from BSC_MS_ConnectionHandler all;

type component BSC_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;

	var SCCP_PAR_Address g_sccp_addr_own;
	var SCCP_PAR_Address g_sccp_addr_remote;

	var charstring g_bsc_num_str;
}

modulepar {
	integer mp_num_iterations := 10;
}

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, charstring id) runs on BSC_CT
{
	var integer i := 0;
	timer T := 1.0;

	g_sccp_addr_own := sccp_addr_own;
	g_sccp_addr_remote := sccp_addr_remote;

	/* create components for IPA/SCCP/BSS[M]AP stack */
	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 BSSMAP dispatcher to upper side of SCCP */
	connect(vc_BSSMAP:BSSAP, vc_SCCP:SCCP_SP_PORT);

	/* connect BSSMAP dispatcher to IPA_Emulation MGCP */
	connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);

	/* start components */
	vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port));
	vc_SCCP.start(SCCPStart(sccp_pars));
	vc_BSSMAP.start(BSSMAP_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_BssmapOps, id));

	/* Initial delay to wait for IPA connection establishment */
	T.start(2.0);
	T.timeout;

	for (i := 0; i < mp_num_iterations; i := i+1) {
		f_start_BSC_MS(id & "-MS-" & int2str(i));
	}

	/* explicitly stop all components that we started above */
	vc_IPA.stop;
	vc_BSSMAP.stop;
	vc_SCCP.stop;
}

function f_start_BSC_MS(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));
	/* blocking wait until component terminates.  If you want to start MSs in parallel,
	 * you have to remove this statement here */
	vc_conn.done;
}

}
