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

}
