cbc: Support mme/bsc sctp/tcp server mode

Related: OS#4945
Change-Id: I9fa4ddfa18ac85644f219874e6b2166e1795e3a9
diff --git a/cbc/BSC_ConnectionHandler.ttcn b/cbc/BSC_ConnectionHandler.ttcn
index ec86f01..a8601a6 100644
--- a/cbc/BSC_ConnectionHandler.ttcn
+++ b/cbc/BSC_ConnectionHandler.ttcn
@@ -25,15 +25,23 @@
 
 type function void_fn() runs on BSC_ConnHdlr;
 
+/* Coordinate with test_CT: */
+type port BSC_ConnHdlr_Coord_PT message {
+	inout charstring;
+} with { extension "internal" };
+
 /* this component represents a single subscriber connection */
 type component BSC_ConnHdlr extends CBSP_Adapter_CT {
 	var BSC_ConnHdlrPars g_pars;
+	port BSC_ConnHdlr_Coord_PT COORD;
 }
 
 type record BSC_ConnHdlrPars {
+	charstring bsc_host,
 	integer bsc_cbsp_port,
 	charstring cbc_host,
 	integer cbc_cbsp_port,
+	boolean tcp_is_client,
 	void_fn start_fn,
 	CBS_Message exp_cbs_msg optional,
 	BSSMAP_FIELD_CellIdentificationList cell_list_success optional
@@ -41,7 +49,13 @@
 
 function f_BSC_ConnHdlr_main(charstring id, BSC_ConnHdlrPars pars) runs on BSC_ConnHdlr {
 	g_pars := pars;
-	CBSP_Adapter.f_connect(g_pars.cbc_host, g_pars.cbc_cbsp_port, "", g_pars.bsc_cbsp_port);
+	if (g_pars.tcp_is_client) {
+		CBSP_Adapter.f_connect(g_pars.cbc_host, g_pars.cbc_cbsp_port,
+					g_pars.bsc_host, g_pars.bsc_cbsp_port);
+	} else {
+		CBSP_Adapter.f_bind(g_pars.bsc_host, g_pars.bsc_cbsp_port);
+		CBSP_Adapter.f_wait_client_connect();
+	}
 
 	var BSSMAP_FIELD_CellIdentificationList cell_list := {
 		cIl_allInBSS := ''O
@@ -51,6 +65,7 @@
 	f_cbsp_send(ts_CBSP_RESTART(cell_list, CBSP_BC_MSGT_CBS, CBSP_RI_DATA_LOST));
 	f_cbsp_send(ts_CBSP_RESTART(cell_list, CBSP_BC_MSGT_EMERG, CBSP_RI_DATA_LOST));
 	as_cbsp_reset(0);
+	COORD.send(COORD_MSG_CONNECTED);
 
 	g_pars.start_fn.apply();
 }