blob: 4d21bb4661dd456f741e9d3267a0d0b46ff6c06e [file] [log] [blame]
Harald Welted86cdc62017-11-22 00:45:07 +01001module IPA_Emulation {
2
3import from IPA_Types all;
4import from IPA_CodecPort all;
5import from IPA_CodecPort_CtrlFunct all;
6import from IPL4asp_Types all;
7import from MTP3asp_Types all;
8import from MTP3asp_PortType all;
9
10/*
11modulepar {
12}
13*/
14
Harald Weltec76f29f2017-11-22 12:46:46 +010015type record ASP_IPA_Unitdata {
16 IpaStreamId streamId,
17 octetstring payload
18}
19
20type port IPA_SP_PT message {
21 inout ASP_IPA_Unitdata;
22} with { extension "internal" }
23
Harald Welted86cdc62017-11-22 00:45:07 +010024type component IPA_Emulation_CT {
25 /* down-facing port to IPA codec port */
26 port IPA_CODEC_PT IPA_PORT;
27 /* up-facing port to SCCP */
28 port MTP3asp_SP_PT MTP3_SP_PORT;
Harald Weltec76f29f2017-11-22 12:46:46 +010029 /* up-facing port for other streams */
30 port IPA_SP_PT IPA_SP_PORT;
Harald Welted86cdc62017-11-22 00:45:07 +010031
32 var boolean g_initialized := false;
33 var ConnectionId g_ipa_conn_id := -1;
34}
35
36function f_connect(charstring remote_host, PortNumber remote_port,
37 charstring local_host, PortNumber local_port) runs on IPA_Emulation_CT {
38 var Result res;
39 res := IPA_CodecPort_CtrlFunct.f_IPL4_connect(IPA_PORT, remote_host, remote_port,
40 local_host, local_port, 0, { tcp:={} });
41 g_ipa_conn_id := res.connId;
42}
43
44template ASP_MTP3_TRANSFERind ts_MTP3_XFER_ind(integer opc, octetstring data) := {
45 sio := { '10'B, '00'B, '0011'B },
46 opc := opc,
47 dpc := 0,
48 sls := 0,
49 data := data
50}
51
52
53private template IpaCcmRespPart t_IdRespPart(IpaCcmIdTag tag, charstring payload) := {
54 len := 0, /* overwritten by codec */
55 tag := tag,
56 data := payload
57}
58
59/* build IPA CCM ID RESP response from IPA CCM GET */
60private function f_ccm_make_id_resp(PDU_IPA_CCM get) return PDU_IPA_CCM {
61 var integer i;
62 var PDU_IPA_CCM resp := {
63 msg_type := IPAC_MSGT_ID_RESP,
64 u := {
65 resp := {}
66 }
67 }
68
69 for (i := 0; i < sizeof(get.u.get); i := i + 1) {
70 var IpaCcmIdTag tag := get.u.get[i].tag;
71 var charstring foo;
72 select (tag) {
73 case (IPAC_IDTAG_UNIT) {
74 foo := "0/1/2";
75 }
76 case (IPAC_IDTAG_UNITNAME) {
77 foo := "mahlzeit";
78 }
79 case else {
80 foo := "foo";
81 }
82 }
83 resp.u.resp[sizeof(resp.u.resp)] := valueof(t_IdRespPart(tag, foo));
84 }
85
86 return resp;
87}
88
89/* transmit IPA CCM message */
90private function f_ccm_tx(PDU_IPA_CCM ccm) runs on IPA_Emulation_CT {
91 var IPA_Send ipa_tx := {
92 connId := g_ipa_conn_id,
93 streamId := IPAC_PROTO_CCM,
94 msg := enc_PDU_IPA_CCM(ccm)
95 }
96 log("CCM Tx:", ccm);
97 IPA_PORT.send(ipa_tx);
98}
99
100template PDU_IPA_CCM ts_IPA_PONG := {
101 msg_type := IPAC_MSGT_PONG,
102 u := omit
103}
104
105template PDU_IPA_CCM ts_IPA_ACK := {
106 msg_type := IPAC_MSGT_ID_ACK,
107 u := omit
108}
109
110/* receive IPA CCM message */
111private function f_ccm_rx(PDU_IPA_CCM ccm) runs on IPA_Emulation_CT {
112 select (ccm.msg_type) {
113 case (IPAC_MSGT_PING) {
114 f_ccm_tx(valueof(ts_IPA_PONG));
115 }
116 case (IPAC_MSGT_ID_ACK) {
117 f_ccm_tx(valueof(ts_IPA_ACK));
118 }
119 case (IPAC_MSGT_ID_GET) {
120 f_ccm_tx(f_ccm_make_id_resp(ccm));
121 }
122 case else {
123 log("Unknown/unsupported IPA CCM message type", ccm);
124 }
125 }
126}
127
Harald Weltec76f29f2017-11-22 12:46:46 +0100128private function f_to_asp(IPA_RecvFrom ipa_rx) return ASP_IPA_Unitdata {
129 var ASP_IPA_Unitdata ret := {
130 streamId := ipa_rx.streamId,
131 payload := ipa_rx.msg
132 }
133 return ret;
134}
135
136private function f_from_asp(ConnectionId connId, ASP_IPA_Unitdata ipa_tx) return IPA_Send {
137 var IPA_Send ret := {
138 connId := connId,
139 streamId := ipa_tx.streamId,
140 msg := ipa_tx.payload
141 }
142 return ret;
143}
Harald Welted86cdc62017-11-22 00:45:07 +0100144
145function ScanEvents() runs on IPA_Emulation_CT {
146 var IPA_RecvFrom ipa_rx;
Harald Weltec76f29f2017-11-22 12:46:46 +0100147 var ASP_IPA_Unitdata ipa_ud;
Harald Welted86cdc62017-11-22 00:45:07 +0100148 var ASP_MTP3_TRANSFERreq mtp_req;
149
150 f_connect("127.0.0.1", 5000, "127.0.0.1", 49999);
151
152 while (true) {
153 alt {
154 /* Received IPA -> up into SCCP stack */
155 [] IPA_PORT.receive(IPA_RecvFrom: ?) -> value ipa_rx {
156 select (ipa_rx.streamId) {
157 case (IPAC_PROTO_CCM) {
158 var PDU_IPA_CCM ccm := dec_PDU_IPA_CCM(ipa_rx.msg);
159 log("CCM Rx:", ccm);
160 f_ccm_rx(ccm);
161 }
162 case (IPAC_PROTO_SCCP) {
163 var ASP_MTP3_TRANSFERind mtp;
164 mtp := valueof(ts_MTP3_XFER_ind(0, ipa_rx.msg));
165 MTP3_SP_PORT.send(mtp);
166 }
167 case else {
Harald Weltec76f29f2017-11-22 12:46:46 +0100168 IPA_SP_PORT.send(f_to_asp(ipa_rx));
Harald Welted86cdc62017-11-22 00:45:07 +0100169 }
170 }
171 }
172
173 /* Received SCCP -> down into IPA */
174 [] MTP3_SP_PORT.receive(ASP_MTP3_TRANSFERreq: ?) -> value mtp_req {
175 var IPA_Send ipa_tx := {
176 connId := g_ipa_conn_id,
177 streamId := IPAC_PROTO_SCCP,
178 msg := mtp_req.data
179 }
180 IPA_PORT.send(ipa_tx);
181 }
Harald Weltec76f29f2017-11-22 12:46:46 +0100182
183 /* Received MISC (RSL/OML/CTRL/MGCP) -> down into IPA */
184 [] IPA_SP_PORT.receive(ASP_IPA_Unitdata: ?) -> value ipa_ud {
185 IPA_PORT.send(f_from_asp(g_ipa_conn_id, ipa_ud));
186 }
187
188
Harald Welted86cdc62017-11-22 00:45:07 +0100189 }
190 }
191}
192
193}