blob: 10367ad031a10a3aedbae4160957b2405770ae13 [file] [log] [blame]
Harald Welte0db44132019-10-17 11:09:05 +02001module STP_Tests_IPA {
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
13friend module STP_Tests;
14
15import from General_Types all;
16import from Osmocom_Types all;
17import from IPL4asp_Types all;
18
19import from TELNETasp_PortType all;
20import from Osmocom_VTY_Functions all;
21
22import from SCCP_Types all;
23import from SCCP_Templates all;
24import from SCCPasp_Types all;
25import from SCCP_Emulation all;
26
27import from IPA_Emulation all;
28
29import from M3UA_Emulation all;
30import from M3UA_CodecPort all;
31import from MTP3asp_Types all;
32import from MTP3asp_PortType all;
33
34import from STP_Tests_Common all;
35
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +010036private const integer NR_IPA := 7;
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010037
38type record of charstring AspNameArray;
Harald Welte0db44132019-10-17 11:09:05 +020039
40modulepar {
Pau Espin Pedrolb51c0872020-08-21 13:42:30 +020041 charstring mp_stp_ipa_ip := "127.0.0.1";
42 charstring mp_local_ipa_ip := "127.0.0.1";
Harald Welte0db44132019-10-17 11:09:05 +020043 integer mp_stp_ipa_port := 5000;
44 integer mp_local_ipa_port := 20000;
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010045 AspNameArray mp_ipa_as_names := {"ipa-as-loadshare-sender",
46 "ipa-as-loadshare-receiver",
47 "ipa-as-loadshare-receiver",
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +010048 "ipa-as-dynamic-asp",
49 "ipa-as-override-sender",
50 "ipa-as-override-receiver",
51 "ipa-as-override-receiver"
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010052 };
Harald Welte0db44132019-10-17 11:09:05 +020053}
54
55type component IPA_CT extends Test_CT {
56 /* for IPA we use the IPA_Emulation and not directly IPA_CodecPort to avoid
57 * having to re-invent IPA CCM handling here */
58 port MTP3asp_PT IPA[NR_IPA];
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +020059 port IPA_SP_PT IPA_CTRL[NR_IPA];
Harald Welte0db44132019-10-17 11:09:05 +020060 var IPA_Emulation_CT vc_IPA[NR_IPA];
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010061 var IPA_CCM_Parameters g_ccm_pars[NR_IPA];
Harald Welte0db44132019-10-17 11:09:05 +020062}
63
64friend function f_IPA_send(integer idx, octetstring data) runs on IPA_CT {
65 var MTP3_Field_sio sio := { ni := '00'B, prio := '00'B, si := '0011'B };
66 IPA[idx].send(t_ASP_MTP3_TRANSFERreq(sio, 0, 0, 0, data));
67}
68
69friend function f_IPA_exp(integer idx, template (present) octetstring data) runs on IPA_CT {
Harald Welte0db44132019-10-17 11:09:05 +020070 alt {
71 [] IPA[idx].receive(t_ASP_MTP3_TRANSFERind(?, ?, ?, ?, data)) {
72 setverdict(pass);
73 }
74 [] IPA[idx].receive {
75 setverdict(fail, "Received unexpected data on IPA port while waiting for ", data);
76 mtc.stop;
77 }
78 }
79}
80
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +010081private function f_rnd_ipa_len() runs on IPA_CT return integer {
82 var integer rnd_len := f_rnd_int(100);
83 /* We need at least 1 byte of data, othewise osmocom IPA stack will discard and close the socket */
84 if (rnd_len == 0) {
85 rnd_len := 1;
86 }
87 return rnd_len;
88}
89
90/* Test if traffic is routed from idx_tx to idx_rx */
91private function f_test_traffic(integer idx_tx, integer idx_rx)
92runs on IPA_CT {
93 var octetstring data := f_rnd_octstring(f_rnd_ipa_len());
94 f_IPA_send(idx_tx, data);
95 f_IPA_exp(idx_rx, data);
96}
97
Harald Welte0db44132019-10-17 11:09:05 +020098friend function f_init_ipa() runs on IPA_CT {
99 var integer i;
100
101 f_init_common();
102
103 for (i := 0; i < NR_IPA; i:=i+1) {
104 vc_IPA[i] := IPA_Emulation_CT.create("IPA" & int2str(i));
105 map(vc_IPA[i]:IPA_PORT, system:IPA_CODEC_PT);
106 connect(self:IPA[i], vc_IPA[i]:MTP3_SP_PORT);
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200107 connect(self:IPA_CTRL[i], vc_IPA[i]:IPA_SP_PORT);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100108 g_ccm_pars[i] := c_IPA_default_ccm_pars;
109 g_ccm_pars[i].name := mp_ipa_as_names[i];
Harald Welte0db44132019-10-17 11:09:05 +0200110 }
111}
112
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200113friend function f_connect_ipa(integer idx, boolean use_unknown_asp_port := false, boolean exp_act := true) runs on IPA_CT {
Pau Espin Pedrol9f514832019-11-08 15:24:13 +0100114 var integer port_offset := 0;
115 if (use_unknown_asp_port) {
116 /* Add 100 to the port since we know that port is not configured in any
117 ASP only up to NR_IPA are configured. */
118 port_offset := 100;
119 }
Pau Espin Pedrolb51c0872020-08-21 13:42:30 +0200120 vc_IPA[idx].start(IPA_Emulation.main_client(mp_stp_ipa_ip, mp_stp_ipa_port, mp_local_ipa_ip,
Pau Espin Pedrol9f514832019-11-08 15:24:13 +0100121 mp_local_ipa_port + idx + port_offset, g_ccm_pars[idx]));
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200122 IPA_CTRL[idx].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP));
123 alt {
124 [exp_act] IPA_CTRL[idx].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_ID_ACK));
125 [not exp_act] IPA_CTRL[idx].receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_DOWN));
126 [] IPA_CTRL[idx].receive(tr_ASP_IPA_EV(?)) { repeat; }
127 }
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100128}
Harald Welte0db44132019-10-17 11:09:05 +0200129
130
131/* "accept-asp-connections pre-configured" and client from unknown source */
132testcase TC_unknown_client_nodynamic() runs on IPA_CT {
133 f_init_common();
134 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
135 "accept-asp-connections pre-configured");
136 f_init_ipa();
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200137 f_connect_ipa(0, true, false);
138
Harald Welte0db44132019-10-17 11:09:05 +0200139 /* switch back to default */
140 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
141 "accept-asp-connections dynamic-permitted");
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200142 setverdict(pass);
Harald Welte0db44132019-10-17 11:09:05 +0200143}
144
145/* "accept-asp-connections pre-configured" and client from known source */
146testcase TC_known_client_nodynamic() runs on IPA_CT {
147 f_init_common();
148 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
149 "accept-asp-connections pre-configured");
Harald Welte0db44132019-10-17 11:09:05 +0200150 f_init_ipa();
Pau Espin Pedrol9f514832019-11-08 15:24:13 +0100151 f_connect_ipa(0, false);
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200152
Harald Welte0db44132019-10-17 11:09:05 +0200153 /* switch back to default */
154 f_vty_config2(VTY, {"cs7 instance 0", "listen ipa 5000"},
155 "accept-asp-connections dynamic-permitted");
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200156 setverdict(pass);
Harald Welte0db44132019-10-17 11:09:05 +0200157}
158
159
160/* "accept-asp-connections dynamic-permitted" and client from unknown source */
161testcase TC_unknown_client_dynamic() runs on IPA_CT {
162 f_init_common();
163 f_init_ipa();
Pau Espin Pedrol9f514832019-11-08 15:24:13 +0100164 f_connect_ipa(0, true);
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200165 setverdict(pass);
Harald Welte0db44132019-10-17 11:09:05 +0200166}
167
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100168private function f_tc_tmt_override(boolean unknwon_dynamic_asp)
169runs on IPA_CT {
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +0100170 f_init_ipa();
171
172 /* bring up the 'sender' side (single ASP in AS) */
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100173 f_connect_ipa(4, unknwon_dynamic_asp);
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +0100174 /* activate the first 'receiver' side ASP */
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100175 f_connect_ipa(5, unknwon_dynamic_asp);
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +0100176
177 /* verify traffic is routed from sender to [sole] receiver */
178 f_test_traffic(4, 5);
179
180 /* activate the second 'receiver' side ASP */
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100181 f_connect_ipa(6, unknwon_dynamic_asp);
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +0100182
183 /* verify traffic is routed from sender to new receiver */
184 f_test_traffic(4, 6);
Pau Espin Pedrol8c0f2fc2020-09-23 18:39:30 +0200185 setverdict(pass);
Pau Espin Pedrolb72928d2019-11-07 17:38:32 +0100186}
187
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100188/* test "traffic-mode override" behavior */
189testcase TC_tmt_override() runs on IPA_CT {
190 f_tc_tmt_override(false);
191}
192
193/* test "traffic-mode override" behavior, with "accept-asp-connections dynamic-permitted" and clients from unknown ASPs */
194testcase TC_unknown_client_dynamic_tmt_override() runs on IPA_CT {
195 f_tc_tmt_override(true);
196}
197
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100198private altstep as_count_rx(integer idx, template (present) octetstring exp, inout integer counter)
199runs on IPA_CT {
200 [] IPA[idx].receive(t_ASP_MTP3_TRANSFERind(?, ?, ?, ?, exp)) {
201 counter := counter + 1;
202 }
203}
204
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100205private function f_tc_tmt_loadshare(boolean unknwon_dynamic_asp)
206runs on IPA_CT {
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100207 var integer i;
208
209 f_init_ipa();
210
211 /* bring up the 'sender' side (single ASP in AS) */
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100212 f_connect_ipa(0, unknwon_dynamic_asp);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100213 /* activate the first 'receiver' side ASP */
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100214 f_connect_ipa(1, unknwon_dynamic_asp);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100215
216 /* verify traffic is routed from sender to [sole] receiver */
217 for (i := 0; i < 10; i := i+1) {
218 f_test_traffic(0, 1);
219 }
220
221 /* activate the second 'receiver' side ASP */
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100222 f_connect_ipa(2, unknwon_dynamic_asp);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100223
224 /* verify traffic is routed from sender to new receiver */
225 const integer iter_per_asp := 5;
226 var integer num_rx[3] := { 0, 0, 0 };
227 for (i := 0; i < 2*iter_per_asp; i := i+1) {
228 var octetstring data := f_rnd_octstring(f_rnd_ipa_len());
229 f_IPA_send(0, data);
230 alt {
Pau Espin Pedrol4d915782020-08-21 12:24:35 +0200231 [] as_count_rx(1, data, num_rx[1]);
232 [] as_count_rx(2, data, num_rx[2]);
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100233 }
234 }
235 /* FIXME: check for extraneous messages? */
236 for (i := 1; i <= 2; i := i+1) {
237 if (num_rx[i] != iter_per_asp) {
238 setverdict(fail, "Received ", num_rx[i], " out of expected ", iter_per_asp,
239 "DATA messages at IPA port ", i);
240 }
241 }
242 setverdict(pass);
243}
244
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100245/* test "traffic-mode load-share" behavior */
246testcase TC_tmt_loadshare() runs on IPA_CT {
247 f_tc_tmt_loadshare(false);
248}
249
250/* test "traffic-mode override" behavior, with "accept-asp-connections dynamic-permitted" and clients from unknown ASPs */
251testcase TC_unknown_client_dynamic_tmt_loadshare() runs on IPA_CT {
252 f_tc_tmt_override(true);
253}
254
Harald Welte0db44132019-10-17 11:09:05 +0200255control {
256 execute( TC_unknown_client_nodynamic() );
257 execute( TC_known_client_nodynamic() );
258 execute( TC_unknown_client_dynamic() );
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100259 execute( TC_tmt_override() );
260 execute( TC_unknown_client_dynamic_tmt_override() );
Pau Espin Pedrol01ec0bf2019-11-07 14:50:07 +0100261 execute( TC_tmt_loadshare() );
Pau Espin Pedrol7021cfd2019-11-08 15:25:44 +0100262 execute( TC_unknown_client_dynamic_tmt_loadshare() );
Harald Welte0db44132019-10-17 11:09:05 +0200263}
264
265
266}