blob: 032a900a44983170b5c0aafbd0861809f501bd48 [file] [log] [blame]
Harald Welte0db44132019-10-17 11:09:05 +02001module STP_Tests {
2
3/* Osmocom STP test suite in in TTCN-3
4 * (C) 2019 Harald Welte <laforge@gnumonks.org>
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
13import from General_Types all;
14import from Osmocom_Types all;
15import from IPL4asp_Types all;
16
17import from Osmocom_VTY_Functions all;
18
19import from M3UA_Types all;
20import from M3UA_Templates all;
21import from M3UA_CodecPort all;
22import from M3UA_CodecPort_CtrlFunct all;
23
24import from M3UA_Emulation all;
25import from MTP3asp_Types all;
26import from MTP3asp_PortType all;
27
28import from SCCP_Types all;
29import from SCCP_Templates all;
30import from SCCPasp_Types all;
31import from SCCP_Emulation all;
32
33import from IPA_Emulation all;
34
35import from STP_Tests_Common all;
36import from STP_Tests_IPA all;
37import from STP_Tests_M3UA all;
38
39
40type component IPA_M3UA_CT extends RAW_M3UA_CT, IPA_CT {
41};
42
43const OCT1 c_M3UA_SI_SCCP := '03'O;
44
45
46/* copy+pasted from SCCP_Emulation.ttcn, where for some reason it is marked as "runs on SCCP_CT"
47 * without depending on anything of that component */
48 function ConvertASPAddressToEncodedAddress_itu( in SCCP_PAR_Address pl_ASPAddress)
49 return SCCP_param_CPartyAddressEnc
50 {
51
52 var SCCP_param_CPartyAddress_itu vl_PDUAddress; //structured fit to encoding
53 var SCCP_param_CPartyAddressEnc vl_PDUAddressEncoded;
54
55 vl_PDUAddress.addressIndicator.pointCodeIndic:=
56 pl_ASPAddress.addressIndicator.pointCodeIndic;
57
58 vl_PDUAddress.addressIndicator.ssnIndicator:=
59 pl_ASPAddress.addressIndicator.ssnIndicator;
60
61 vl_PDUAddress.addressIndicator.globalTitleIndic:=
62 pl_ASPAddress.addressIndicator.globalTitleIndic;
63
64 vl_PDUAddress.addressIndicator.routingIndicator:=
65 pl_ASPAddress.addressIndicator.routingIndicator;
66
67 vl_PDUAddress.addressIndicator.reserved:='0'B;
68 // if (ischosen(pl_ASPAddress.signPointCode) ) not used because it is mandatory field (???)
69
70 //----signPointCode handling
71 if ( ispresent( pl_ASPAddress.signPointCode )) {
72 vl_PDUAddress.signPointCode :=
73 '00'B&pl_ASPAddress.signPointCode;
74 } else {
75 vl_PDUAddress.signPointCode := omit;
76 };
77
78 //----subsystemNumber handling
79 if ( ispresent( pl_ASPAddress.subsystemNumber ) ){
80 vl_PDUAddress.subsystemNumber := pl_ASPAddress.subsystemNumber;
81 } else {
82 vl_PDUAddress.subsystemNumber :=omit;
83 };
84
85 // --- globalTitle handling--
86 if ( ispresent(pl_ASPAddress.globalTitle))
87 {//startif1
88
89 var SCCP_ASPfield_GlobalTitle tmpGT ;
90 tmpGT := pl_ASPAddress.globalTitle;
91
92 if (ischosen(tmpGT.gti0001))
93 {
94 vl_PDUAddress.globalTitle.gti0001.natureOfAddress:=tmpGT.gti0001.natureOfAddress;
95 vl_PDUAddress.globalTitle.gti0001.oddeven:=tmpGT.gti0001.oddeven;
96 vl_PDUAddress.globalTitle.gti0001.globalTitleAddress:=tmpGT.gti0001.globalTitleAddress;
97 }
98 else if (ischosen(tmpGT.gti0010))
99 {
100 vl_PDUAddress.globalTitle.gti0010.translationType:=tmpGT.gti0010.translationType;
101 vl_PDUAddress.globalTitle.gti0010.globalTitleAddress:=tmpGT.gti0010.globalTitleAddress;
102 }
103 else if (ischosen(tmpGT.gti0011))
104 {
105 vl_PDUAddress.globalTitle.gti0011.translationType:=tmpGT.gti0011.translationType;
106 vl_PDUAddress.globalTitle.gti0011.encodingScheme:=tmpGT.gti0011.encodingScheme;
107 vl_PDUAddress.globalTitle.gti0011.numberingPlan:=tmpGT.gti0011.numberingPlan;
108 vl_PDUAddress.globalTitle.gti0011.globalTitleAddress:=tmpGT.gti0011.globalTitleAddress;
109 }
110 else if (ischosen(tmpGT.gti0100))
111 {
112 vl_PDUAddress.globalTitle.gti0100.translationType:=tmpGT.gti0100.translationType;
113 vl_PDUAddress.globalTitle.gti0100.encodingScheme:=tmpGT.gti0100.encodingScheme;
114 vl_PDUAddress.globalTitle.gti0100.numberingPlan:=tmpGT.gti0100.numberingPlan;
115 vl_PDUAddress.globalTitle.gti0100.natureOfAddress:=tmpGT.gti0100.natureOfAddress;
116 vl_PDUAddress.globalTitle.gti0100.reserved:='0'B;
117 vl_PDUAddress.globalTitle.gti0100.globalTitleAddress:=tmpGT.gti0100.globalTitleAddress;
118 }
119 }
120 else
121 {
122 vl_PDUAddress.globalTitle := omit;
123 };
124
125 vl_PDUAddressEncoded.addr:= enc_PDU_SCCP_Address_itu( vl_PDUAddress);
126 vl_PDUAddressEncoded.paramLength:= lengthof(vl_PDUAddressEncoded.addr);
127
128 return vl_PDUAddressEncoded;
129
130 } //ConvertASPAddressToEncodedAddress_itu
131
132template (value) PDU_SCCP ts_SCCP_UDT(SCCP_PAR_Address called, SCCP_PAR_Address calling,
133 template (value) octetstring data,
134 template (value) BIT4 msg_hdl := '0000'B) := {
135 unitdata := {
136 messageType := udt,
137 protClass := {'0000'B, msg_hdl},
138 pointer1 := 0,
139 pointer2 := 0,
140 pointer3 := 0,
141 calledPAddress := ConvertASPAddressToEncodedAddress_itu(called),
142 callingPAddress := ConvertASPAddressToEncodedAddress_itu(calling),
143 data := {
144 paramLength := 0,
145 data := data
146 }
147 }
148}
149
150/* Test routing of SCCP between an M3UA and an IPA ASP */
151testcase TC_m3ua_to_ipa() runs on IPA_M3UA_CT {
152 var OCT4 rctx_sender := int2oct(1023, 4);
153 var OCT4 pc_sender := int2oct(23, 4);
154 var OCT4 pc_receiver := int2oct(5, 4);
155
156 f_init_m3ua();
157 f_init_ipa();
158
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100159 f_connect_ipa(3);
Harald Welte0db44132019-10-17 11:09:05 +0200160 f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx
161
162 /* send a well-formed, encoded SCCP message via M3UA */
163 var octetstring data := f_rnd_octstring(f_rnd_int(100));
164 var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H));
165 var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H));
166 var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data));
167 var octetstring sccp_enc := enc_PDU_SCCP(sccp);
168 var template (value) M3UA_Protocol_Data tx_pd;
169 tx_pd := ts_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc);
170 f_M3UA_send(0, ts_M3UA_DATA(rctx_sender, tx_pd), 1);
171
172 /* expect to receive it via IPA */
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100173 f_IPA_exp(3, sccp_enc);
Pau Espin Pedrol05726dd2019-11-06 15:55:57 +0100174
175 f_clear_m3ua();
Harald Welte0db44132019-10-17 11:09:05 +0200176}
177
178/* test routing an SCCP message from IPA ASP to M3UA ASP */
179testcase TC_ipa_to_m3ua() runs on IPA_M3UA_CT {
180 var OCT4 pc_sender := int2oct(5, 4);
181 var OCT4 rctx_receiver := int2oct(1023, 4);
182 var OCT4 pc_receiver := int2oct(23, 4);
183
184 f_init_common();
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100185 f_vty_config2(VTY, {"cs7 instance 0", "as ipa-as-dynamic-asp ipa"},
Harald Welte0db44132019-10-17 11:09:05 +0200186 "point-code override patch-sccp disabled");
187
188 f_init_m3ua();
189 f_init_ipa();
190
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100191 f_connect_ipa(3);
Harald Welte0db44132019-10-17 11:09:05 +0200192 f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx
193
194 /* send a well-formed, encoded SCCP message via IPA */
195 var octetstring data := f_rnd_octstring(f_rnd_int(100));
196 var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H));
197 var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H));
198 var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data));
199 var octetstring sccp_enc := enc_PDU_SCCP(sccp);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100200 f_IPA_send(3, sccp_enc);
Harald Welte0db44132019-10-17 11:09:05 +0200201
202 /* expect to receive it via M3UA */
203 var template (present) M3UA_Protocol_Data rx_pd;
204 rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O, sccp_enc);
205 f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd));
Pau Espin Pedrol05726dd2019-11-06 15:55:57 +0100206
207 f_clear_m3ua();
Harald Welte0db44132019-10-17 11:09:05 +0200208}
209
210/* test routing an SCCP message from IPA ASP to M3UA ASP while patching PC into SCCP addresses */
211testcase TC_ipa_to_m3ua_patch_sccp() runs on IPA_M3UA_CT {
212 var OCT4 pc_sender := int2oct(5, 4);
213 var OCT4 rctx_receiver := int2oct(1023, 4);
214 var OCT4 pc_receiver := int2oct(23, 4);
215
216 f_init_common();
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100217 f_vty_config2(VTY, {"cs7 instance 0", "as ipa-as-dynamic-asp ipa"},
Harald Welte0db44132019-10-17 11:09:05 +0200218 "point-code override patch-sccp both");
219
220 f_init_m3ua();
221 f_init_ipa();
222
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100223 f_connect_ipa(3);
Harald Welte0db44132019-10-17 11:09:05 +0200224 f_M3UA_asp_up_act(0, omit, omit); // TODO: rctx
225
226 /* send a well-formed, encoded SCCP message via IPA */
227 var octetstring data := f_rnd_octstring(f_rnd_int(100));
228 var SCCP_PAR_Address called := valueof(ts_SccpAddr_GT('1234'H));
229 var SCCP_PAR_Address calling := valueof(ts_SccpAddr_GT('5678'H));
230 var PDU_SCCP sccp := valueof(ts_SCCP_UDT(called, calling, data));
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100231 f_IPA_send(3, enc_PDU_SCCP(sccp));
Harald Welte0db44132019-10-17 11:09:05 +0200232
233 /* patch point codes into addresses */
234 called := valueof(ts_SccpAddr_PC_GT(oct2int(pc_receiver), '83'O, "mtp3_itu", '1234'H));
235 calling := valueof(ts_SccpAddr_PC_GT(oct2int(pc_sender), '83'O, "mtp3_itu", '5678'H));
236 var PDU_SCCP sccp_exp := valueof(ts_SCCP_UDT(called, calling, data));
237
238 /* expect to receive it via M3UA */
239 var template (present) M3UA_Protocol_Data rx_pd;
240 rx_pd := tr_M3UA_protocol_data(pc_sender, pc_receiver, c_M3UA_SI_SCCP, '00'O, '00'O, '00'O,
241 enc_PDU_SCCP(sccp_exp));
242 f_M3UA_exp(0, tr_M3UA_DATA(rctx_receiver, rx_pd));
Pau Espin Pedrol05726dd2019-11-06 15:55:57 +0100243
244 f_clear_m3ua();
Harald Welte0db44132019-10-17 11:09:05 +0200245}
246
247
248
249control {
250 /* M3UA <-> IPA Tests */
251 execute( TC_m3ua_to_ipa() );
252 execute( TC_ipa_to_m3ua() );
253 execute( TC_ipa_to_m3ua_patch_sccp() );
254}
255
256
257
258}