IPA_Emulation: Add support for RSL port
In addition to the MGCP and SCCP ports, we now also have a RSL port
through which other components can transceive RSL messages via IPA
diff --git a/library/IPA_Emulation.ttcn b/library/IPA_Emulation.ttcn
index 696019e..c8111e2 100644
--- a/library/IPA_Emulation.ttcn
+++ b/library/IPA_Emulation.ttcn
@@ -7,6 +7,7 @@
import from IPL4asp_PortType all;
import from MTP3asp_Types all;
import from MTP3asp_PortType all;
+import from RSL_Types all;
import from MGCP_Types all;
@@ -26,6 +27,20 @@
octetstring payload
}
+type enumerated ASP_IPA_EventUpDown {
+ ASP_IPA_EVENT_DOWN,
+ ASP_IPA_EVENT_UP,
+ ASP_IPA_EVENT_ID_ACK
+}
+
+type union ASP_IPA_Event {
+ ASP_IPA_EventUpDown up_down
+}
+
+template ASP_IPA_Event t_ASP_IPA_EVT_UD(ASP_IPA_EventUpDown ud) := {
+ up_down := ud
+}
+
template ASP_IPA_Unitdata t_ASP_IPA_UD(IpaStreamId sid, octetstring pl,
template IpaExtStreamId esid := omit) := {
streamId := sid,
@@ -33,14 +48,31 @@
payload := pl
}
+type record ASP_RSL_Unitdata {
+ IpaStreamId streamId,
+ RSL_Message rsl
+};
+
+template ASP_RSL_Unitdata t_ASP_RSL_UD(IpaStreamId sid, template RSL_Message rsl) := {
+ streamId := sid,
+ rsl := valueof(rsl)
+}
+
+template IpaStreamId t_IpaSidRSL := ( IPAC_PROTO_RSL_TRX0, IPAC_PROTO_RSL_TRX1,
+ IPAC_PROTO_RSL_TRX2, IPAC_PROTO_RSL_TRX3 );
+
type port IPA_SP_PT message {
- inout ASP_IPA_Unitdata;
+ inout ASP_IPA_Unitdata, ASP_IPA_Event;
} with { extension "internal" }
type port IPA_MGCP_PT message {
inout MgcpCommand, MgcpResponse;
} with { extension "internal" }
+type port IPA_RSL_PT message {
+ inout ASP_RSL_Unitdata, ASP_IPA_Event;
+} with { extension "internal" }
+
type component IPA_Emulation_CT {
/* down-facing port to IPA codec port */
port IPA_CODEC_PT IPA_PORT;
@@ -48,6 +80,8 @@
port MTP3asp_SP_PT MTP3_SP_PORT;
/* up-facing port for MGCP */
port IPA_MGCP_PT IPA_MGCP_PORT;
+ /* up-facing port for RSL */
+ port IPA_RSL_PT IPA_RSL_PORT;
/* up-facing port for other streams */
port IPA_SP_PT IPA_SP_PORT;
@@ -126,6 +160,11 @@
data := payload
}
+private function f_send_IPA_EVT(template ASP_IPA_Event evt) runs on IPA_Emulation_CT {
+ IPA_RSL_PORT.send(evt);
+ /* FIXME: to other ports */
+}
+
/* build IPA CCM ID RESP response from IPA CCM GET */
private function f_ccm_make_id_resp(PDU_IPA_CCM get) runs on IPA_Emulation_CT return PDU_IPA_CCM {
var integer i;
@@ -239,6 +278,12 @@
return ret;
}
+private function f_from_rsl(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;
+}
+
function main_client(charstring remote_host, PortNumber remote_port,
charstring local_host, PortNumber local_port,
IPA_CCM_Parameters ccm_pars := c_IPA_default_ccm_pars) runs on IPA_Emulation_CT {
@@ -280,6 +325,7 @@
var MgcpCommand mgcp_cmd;
var MgcpResponse mgcp_rsp;
var octetstring payload;
+ var ASP_RSL_Unitdata rsl;
while (true) {
alt {
@@ -296,6 +342,12 @@
MTP3_SP_PORT.send(mtp);
} case (IPAC_PROTO_MGCP_OLD) {
f_mgcp_to_user(ipa_rx.msg);
+ } case (t_IpaSidRSL) {
+ rsl := {
+ streamId := ipa_rx.streamId,
+ rsl := dec_RSL_Message(ipa_rx.msg)
+ };
+ IPA_RSL_PORT.send(rsl);
} case (IPAC_PROTO_OSMO) {
select (ipa_rx.streamIdExt) {
case (IPAC_PROTO_EXT_MGCP) {
@@ -314,6 +366,7 @@
[] IPA_PORT.receive(ASP_Event:{connOpened:=?}) -> value asp_evt {
log("IPA: Connected");
g_ipa_conn_id := asp_evt.connOpened.connId;
+ f_send_IPA_EVT(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_UP));
if (g_mode == IPA_MODE_SERVER) {
f_ccm_tx(valueof(ts_IPA_ID_GET));
}
@@ -322,6 +375,7 @@
[] IPA_PORT.receive(ASP_Event:{connClosed:=?}) -> value asp_evt {
log("IPA: Closed");
g_ipa_conn_id := -1;
+ f_send_IPA_EVT(t_ASP_IPA_EVT_UD(ASP_IPA_EVENT_DOWN));
self.stop;
}
@@ -344,8 +398,13 @@
IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud));
}
+ /* Received RSL -> down into IPA */
+ [] IPA_RSL_PORT.receive(ASP_RSL_Unitdata:?) -> value rsl {
+ IPA_PORT.send(f_from_rsl(g_ipa_conn_id, rsl));
+ }
- /* Received MISC (RSL/OML/CTRL) -> down into IPA */
+
+ /* Received MISC (OML/CTRL) -> down into IPA */
[] IPA_SP_PORT.receive(ASP_IPA_Unitdata: ?) -> value ipa_ud {
IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud));
}