Add tests for OS#2714, "close RSL connections from unknown Unit ID".

This adds two new tests: One for RSL, and a second one which performs
the same test on the OML port. Both tests open an IPA connection and
send a unit ID which is unknown to the BSC. The tests expect the BSC
to close the connection immediately.

We need to add handling for a socket error in IPA_Emulation because
otherwise these tests do not pass reliably as some closed connections
are not properly detected.

Change-Id: I6a947d7411a016e4d7650031396cae3575756453
diff --git a/library/IPA_Emulation.ttcn b/library/IPA_Emulation.ttcn
index b3e28e9..53a86ec 100644
--- a/library/IPA_Emulation.ttcn
+++ b/library/IPA_Emulation.ttcn
@@ -23,6 +23,7 @@
 import from MTP3asp_Types all;
 import from MTP3asp_PortType all;
 import from RSL_Types all;
+import from Socket_API_Definitions all;
 
 import from MGCP_Types all;
 import from GSUP_Types all;
@@ -132,7 +133,7 @@
 	port IPA_SP_PT IPA_SP_PORT;
 
 	var boolean g_initialized := false;
-	var ConnectionId g_ipa_conn_id := -1;
+	var IPL4asp_Types.ConnectionId g_ipa_conn_id := -1;
 	/* Are we a BSC/MGW (truel) or MSC (false) */
 	var boolean g_is_bsc_mgw;
 
@@ -167,10 +168,10 @@
 };
 
 /* Function to use to connect as client to a remote IPA Server */
-function f_connect(charstring remote_host, PortNumber remote_port,
-		   charstring local_host, PortNumber local_port,
+function f_connect(charstring remote_host, IPL4asp_Types.PortNumber remote_port,
+		   charstring local_host, IPL4asp_Types.PortNumber local_port,
 		   IPA_CCM_Parameters ccm_pars := c_IPA_default_ccm_pars) runs on IPA_Emulation_CT {
-	var Result res;
+	var IPL4asp_Types.Result res;
 	res := IPA_CodecPort_CtrlFunct.f_IPL4_connect(IPA_PORT, remote_host, remote_port,
 						local_host, local_port, 0, { tcp:={} });
 	g_ipa_conn_id := res.connId;
@@ -179,9 +180,9 @@
 }
 
 /* Function to use to bind to a local port as IPA server, accepting remote clients */
-function f_bind(charstring local_host, PortNumber local_port,
+function f_bind(charstring local_host, IPL4asp_Types.PortNumber local_port,
 		IPA_CCM_Parameters ccm_pars := c_IPA_default_ccm_pars) runs on IPA_Emulation_CT {
-	var Result res;
+	var IPL4asp_Types.Result res;
 	res := IPA_CodecPort_CtrlFunct.f_IPL4_listen(IPA_PORT, 
 						local_host, local_port, { tcp:={} });
 	g_ipa_conn_id := res.connId;
@@ -324,21 +325,21 @@
 	return ret;
 }
 
-private function f_from_asp(ConnectionId connId, ASP_IPA_Unitdata ipa_tx) return IPA_Send {
+private function f_from_asp(IPL4asp_Types.ConnectionId connId, ASP_IPA_Unitdata ipa_tx) return IPA_Send {
 	var IPA_Send ret := valueof(t_IPA_Send(connId, ipa_tx.streamId, ipa_tx.payload,
 						ipa_tx.streamIdExt));
 	return ret;
 }
 
-private function f_from_rsl(ConnectionId connId, ASP_RSL_Unitdata rsl_tx) return IPA_Send {
+private function f_from_rsl(IPL4asp_Types.ConnectionId connId, ASP_RSL_Unitdata rsl_tx) return IPA_Send {
 	var octetstring payload := enc_RSL_Message(rsl_tx.rsl);
 	var IPA_Send ret := valueof(t_IPA_Send(connId, rsl_tx.streamId, payload));
 	return ret;
 }
 
 /* main function to use for a client-side IPA implementation */
-function main_client(charstring remote_host, PortNumber remote_port,
-		     charstring local_host, PortNumber local_port,
+function main_client(charstring remote_host, IPL4asp_Types.PortNumber remote_port,
+		     charstring local_host, IPL4asp_Types.PortNumber local_port,
 		     IPA_CCM_Parameters ccm_pars := c_IPA_default_ccm_pars) runs on IPA_Emulation_CT {
 	g_mode := IPA_MODE_CLIENT;
 	f_connect(remote_host, remote_port, local_host, local_port, ccm_pars);
@@ -347,7 +348,7 @@
 }
 
 /* main function to use for a server-side IPA implementation */
-function main_server(charstring local_host, PortNumber local_port) runs on IPA_Emulation_CT {
+function main_server(charstring local_host, IPL4asp_Types.PortNumber local_port) runs on IPA_Emulation_CT {
 	g_mode := IPA_MODE_SERVER;
 	f_bind(local_host, local_port);
 	ScanEvents();
@@ -389,6 +390,7 @@
 	var ASP_IPA_Unitdata ipa_ud;
 	var ASP_MTP3_TRANSFERreq mtp_req;
 	var ASP_Event asp_evt;
+	var Socket_API_Definitions.PortEvent port_evt;
 	var MgcpCommand mgcp_cmd;
 	var MgcpResponse mgcp_rsp;
 	var CtrlMessage ctrl_msg;
@@ -456,6 +458,13 @@
 			self.stop;
 		}
 
+		[] IPA_PORT.receive(Socket_API_Definitions.PortEvent:{result:={errorCode:=ERROR_SOCKET, connId:=?, os_error_code:=?, os_error_text:=?}}) -> value port_evt {
+			log("PortEvent: ERROR_SOCKET: ", port_evt);
+			g_ipa_conn_id := -1;
+			f_send_IPA_EVT(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_DOWN));
+			self.stop;
+		}
+
 		/* Received SCCP -> down into IPA */
 		[] MTP3_SP_PORT.receive(ASP_MTP3_TRANSFERreq: ?) -> value mtp_req {
 			var IPA_Send ipa_tx := valueof(t_IPA_Send(g_ipa_conn_id, IPAC_PROTO_SCCP,