blob: 31f5c270f7977ca79efe11ebddbe384873f97bd8 [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
15type component IPA_Emulation_CT {
16 /* down-facing port to IPA codec port */
17 port IPA_CODEC_PT IPA_PORT;
18 /* up-facing port to SCCP */
19 port MTP3asp_SP_PT MTP3_SP_PORT;
20
21 var boolean g_initialized := false;
22 var ConnectionId g_ipa_conn_id := -1;
23}
24
25function f_connect(charstring remote_host, PortNumber remote_port,
26 charstring local_host, PortNumber local_port) runs on IPA_Emulation_CT {
27 var Result res;
28 res := IPA_CodecPort_CtrlFunct.f_IPL4_connect(IPA_PORT, remote_host, remote_port,
29 local_host, local_port, 0, { tcp:={} });
30 g_ipa_conn_id := res.connId;
31}
32
33template ASP_MTP3_TRANSFERind ts_MTP3_XFER_ind(integer opc, octetstring data) := {
34 sio := { '10'B, '00'B, '0011'B },
35 opc := opc,
36 dpc := 0,
37 sls := 0,
38 data := data
39}
40
41
42private template IpaCcmRespPart t_IdRespPart(IpaCcmIdTag tag, charstring payload) := {
43 len := 0, /* overwritten by codec */
44 tag := tag,
45 data := payload
46}
47
48/* build IPA CCM ID RESP response from IPA CCM GET */
49private function f_ccm_make_id_resp(PDU_IPA_CCM get) return PDU_IPA_CCM {
50 var integer i;
51 var PDU_IPA_CCM resp := {
52 msg_type := IPAC_MSGT_ID_RESP,
53 u := {
54 resp := {}
55 }
56 }
57
58 for (i := 0; i < sizeof(get.u.get); i := i + 1) {
59 var IpaCcmIdTag tag := get.u.get[i].tag;
60 var charstring foo;
61 select (tag) {
62 case (IPAC_IDTAG_UNIT) {
63 foo := "0/1/2";
64 }
65 case (IPAC_IDTAG_UNITNAME) {
66 foo := "mahlzeit";
67 }
68 case else {
69 foo := "foo";
70 }
71 }
72 resp.u.resp[sizeof(resp.u.resp)] := valueof(t_IdRespPart(tag, foo));
73 }
74
75 return resp;
76}
77
78/* transmit IPA CCM message */
79private function f_ccm_tx(PDU_IPA_CCM ccm) runs on IPA_Emulation_CT {
80 var IPA_Send ipa_tx := {
81 connId := g_ipa_conn_id,
82 streamId := IPAC_PROTO_CCM,
83 msg := enc_PDU_IPA_CCM(ccm)
84 }
85 log("CCM Tx:", ccm);
86 IPA_PORT.send(ipa_tx);
87}
88
89template PDU_IPA_CCM ts_IPA_PONG := {
90 msg_type := IPAC_MSGT_PONG,
91 u := omit
92}
93
94template PDU_IPA_CCM ts_IPA_ACK := {
95 msg_type := IPAC_MSGT_ID_ACK,
96 u := omit
97}
98
99/* receive IPA CCM message */
100private function f_ccm_rx(PDU_IPA_CCM ccm) runs on IPA_Emulation_CT {
101 select (ccm.msg_type) {
102 case (IPAC_MSGT_PING) {
103 f_ccm_tx(valueof(ts_IPA_PONG));
104 }
105 case (IPAC_MSGT_ID_ACK) {
106 f_ccm_tx(valueof(ts_IPA_ACK));
107 }
108 case (IPAC_MSGT_ID_GET) {
109 f_ccm_tx(f_ccm_make_id_resp(ccm));
110 }
111 case else {
112 log("Unknown/unsupported IPA CCM message type", ccm);
113 }
114 }
115}
116
117
118function ScanEvents() runs on IPA_Emulation_CT {
119 var IPA_RecvFrom ipa_rx;
120 var ASP_MTP3_TRANSFERreq mtp_req;
121
122 f_connect("127.0.0.1", 5000, "127.0.0.1", 49999);
123
124 while (true) {
125 alt {
126 /* Received IPA -> up into SCCP stack */
127 [] IPA_PORT.receive(IPA_RecvFrom: ?) -> value ipa_rx {
128 select (ipa_rx.streamId) {
129 case (IPAC_PROTO_CCM) {
130 var PDU_IPA_CCM ccm := dec_PDU_IPA_CCM(ipa_rx.msg);
131 log("CCM Rx:", ccm);
132 f_ccm_rx(ccm);
133 }
134 case (IPAC_PROTO_SCCP) {
135 var ASP_MTP3_TRANSFERind mtp;
136 mtp := valueof(ts_MTP3_XFER_ind(0, ipa_rx.msg));
137 MTP3_SP_PORT.send(mtp);
138 }
139 case else {
140 log("Unknown/unsupported IPA Stream ID", ipa_rx);
141 }
142 }
143 }
144
145 /* Received SCCP -> down into IPA */
146 [] MTP3_SP_PORT.receive(ASP_MTP3_TRANSFERreq: ?) -> value mtp_req {
147 var IPA_Send ipa_tx := {
148 connId := g_ipa_conn_id,
149 streamId := IPAC_PROTO_SCCP,
150 msg := mtp_req.data
151 }
152 IPA_PORT.send(ipa_tx);
153 }
154 }
155 }
156}
157
158}