blob: d5af707def8c8283d42203e13340c84d2a5907a5 [file] [log] [blame]
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001module NS_Tests {
2
3/* Osmocom NS test suite for NS over framerelay or udp ip.access style in TTCN-3
4 * (C) 2021 sysmocom s.f.m.c. GmbH <info@sysmocom.de>
5 * Author: Alexander Couzens <lynxis@fe80.eu>
6 * All rights reserved.
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 */
13
14import from General_Types all;
15import from Osmocom_Types all;
16import from Osmocom_Gb_Types all;
17import from NS_Types all;
18import from BSSGP_Types all;
19import from UD_Types all;
20import from NS_Emulation all;
21import from Native_Functions all;
22import from IPL4asp_Types all;
23import from RAW_NS all;
24import from Osmocom_VTY_Functions all;
25import from TELNETasp_PortType all;
26
Alexander Couzensde3dfaa2021-08-06 17:59:54 +020027type enumerated SnsRole {
28 SNS_ROLE_BSS ('00'H),
29 SNS_ROLE_SGSN ('01'H)
30};
31
Alexander Couzens20cd41e2021-01-11 02:56:03 +010032modulepar {
Alexander Couzensde3dfaa2021-08-06 17:59:54 +020033 SnsRole mp_sns_role := SNS_ROLE_BSS;
Alexander Couzens20cd41e2021-01-11 02:56:03 +010034 OsmoNsDialect mp_dialect := NS2_DIALECT_IPACCESS;
35 NSConfiguration mp_nsconfig := {
36 nsei := 96,
37 role_sgsn := false,
38 handle_sns := false,
39 nsvc := {
40 {
41 provider := {
42 ip := {
43 address_family := AF_INET,
44 local_udp_port := 21000,
45 local_ip := "127.0.0.1",
46 remote_udp_port := 23000,
Alexander Couzens87e44cf2021-02-03 15:15:27 +010047 remote_ip := "127.0.0.1",
48 data_weight := 2,
49 signalling_weight := 2
Alexander Couzens20cd41e2021-01-11 02:56:03 +010050 }
51 },
52 nsvci := 97
Alexander Couzens6f17ecc2021-05-25 13:43:57 +020053 },
54 {
55 provider := {
56 ip := {
57 address_family := AF_INET,
58 local_udp_port := 21000,
59 local_ip := "127.0.0.1",
60 remote_udp_port := 23001,
61 remote_ip := "127.0.0.1",
62 data_weight := 1,
63 signalling_weight := 1
64 }
65 },
66 nsvci := 98
Alexander Couzens20cd41e2021-01-11 02:56:03 +010067 }
68 }
69 };
arehbein2a6726c2022-11-30 22:40:43 +010070 NsIEI mp_ns_iei_num_ipv4_ep := NS_IEI_NUM_IPv4_EP;
71 NsIEI mp_ns_iei_num_ipv6_ep := NS_IEI_NUM_IPv6_EP;
72 NsIEI mp_ns_iei_nsei := NS_IEI_NSEI;
Alexander Couzens20cd41e2021-01-11 02:56:03 +010073}
74
75type component RAW_Test_CT extends RAW_NS_CT {
76 port TELNETasp_PT NSVTY;
77}
78
79private function f_init_vty() runs on RAW_Test_CT {
80 map(self:NSVTY, system:NSVTY);
81 f_vty_set_prompts(NSVTY);
82 f_vty_transceive(NSVTY, "enable");
Alexander Couzens357c5722021-09-06 01:20:18 +020083 f_vty_config2(NSVTY, {}, "mirror-mode disable");
Alexander Couzens20cd41e2021-01-11 02:56:03 +010084 f_vty_transceive(NSVTY, "nsvc nsei " & int2str(mp_nsconfig.nsei) & " force-unconfigured");
Alexander Couzensbdef8102021-09-03 23:18:27 +020085 if (mp_dialect == NS2_DIALECT_SNS) {
86 f_vty_config2(NSVTY, {"ns", "nse " & int2str(mp_nsconfig.nsei)}, "ip-sns-bind local");
87 f_vty_config2(NSVTY, {"ns", "nse " & int2str(mp_nsconfig.nsei)}, "no ip-sns-bind local2");
88 f_vty_config2(NSVTY, {"ns", "bind udp local"}, "ip-sns signalling-weight 1 data-weight 1");
89 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 1 data-weight 1");
90 }
Alexander Couzens20cd41e2021-01-11 02:56:03 +010091}
92
93/* ensure no matching message is received within 'tout' */
94function f_ensure_no_ns(integer idx := 0, boolean answer_alive := false, float tout := 3.0)
95runs on RAW_Test_CT {
96 var PDU_NS nrf;
97
98 timer T := tout;
99 var default d := activate(ax_rx_fail_on_any_ns(idx));
100 T.start;
101 alt {
102 [answer_alive] as_rx_alive_tx_ack();
103 [] T.timeout {
104 setverdict(pass);
105 }
106 }
107 deactivate(d);
108}
109
110function f_fails_except_reset(integer idx := 0, float tout := 15.0)
111runs on RAW_Test_CT {
112 var PDU_NS nrf;
113 timer T := 15.0;
114 T.start;
115 alt {
116 [] NSCP[idx].receive(tr_NS_RESET(*, *, *)) {
117 repeat;
118 }
119 [] NSCP[idx].receive(PDU_NS: ?) -> value nrf {
120 setverdict(fail, "Received unexpected NS: ", nrf);
121 mtc.stop;
122 }
123 [] T.timeout {
124 setverdict(pass);
125 }
126 }
127}
128
129testcase TC_tx_reset() runs on RAW_Test_CT {
130 f_init_vty();
131 f_init_ns_codec(mp_nsconfig, guard_secs := 10.0);
132
133 /* do a NS Reset procedure */
134 f_outgoing_ns_reset();
135
136 setverdict(pass);
137 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200138 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100139}
140
141testcase TC_tx_reset_tx_alive() runs on RAW_Test_CT {
142 f_init_vty();
143 f_init_ns_codec(mp_nsconfig, guard_secs := 10.0);
144
145 /* do a NS Reset procedure */
146 f_outgoing_ns_reset();
147
148 /* check outgoing NS procedure */
149 f_outgoing_ns_alive();
150
151 setverdict(pass);
152 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200153 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100154}
155
156testcase TC_tx_reset_rx_alive() runs on RAW_Test_CT {
157 f_init_vty();
158 f_init_ns_codec(mp_nsconfig, guard_secs := 10.0);
159
160 /* do a NS Reset procedure */
161 f_outgoing_ns_reset();
162
163 activate(as_rx_ns_unblock_ack());
164 /* check outgoing NS procedure */
165 as_rx_alive_tx_ack(oneshot := true);
166
167 setverdict(pass);
168 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200169 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100170}
171
Alexander Couzens94d3d102021-09-06 00:20:42 +0200172/* 48.016 7.2.1 transmit a UNIT DATA over a BLOCKED NSVC when ttcn3 blocked it
173 *
174 * TTCN -> NS: reset
175 * TTCN <- NS: reset ack
176 * TTCN -> NS: unblock
177 * TTCN <- NS: unblock ack
178 * TTCN -> NS: block
179 * TTCN <- NS: block ack
180 * TTCN -> NS: unitdata
181 * TTCN <- NS: status (cause blocked)
182 */
183testcase TC_tx_block_unitdata_over_blocked() runs on RAW_Test_CT {
184 f_tx_block();
185 f_sleep(1.0);
186
187 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
188 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED));
189
190 setverdict(pass);
191 f_sleep(1.0);
192 f_clean_ns_codec();
193}
194
195/* 48.016 7.2.1 transmit a UNIT DATA over a BLOCKED NSVC when ns2 blocked it
196 *
197 * TTCN -> NS: reset
198 * TTCN <- NS: reset ack
199 * TTCN -> NS: unblock
200 * TTCN <- NS: unblock ack
201 * TTCN <- NS: block
202 * TTCN -> NS: block ack
203 * TTCN -> NS: unitdata
204 * TTCN <- NS: status (cause blocked)
205 */
206testcase TC_rx_block_unitdata_over_blocked() runs on RAW_Test_CT {
Alexander Couzens24788042021-09-06 00:42:51 +0200207 f_tx_block_by_vty();
Alexander Couzens94d3d102021-09-06 00:20:42 +0200208 f_sleep(1.0);
209
210 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
211 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED));
212
213 setverdict(pass);
214 f_sleep(1.0);
215 f_clean_ns_codec();
216}
217
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100218/* 48.016 7.2 unblock procedure
219 *
220 * TTCN -> NS: reset
221 * TTCN <- NS: reset ack
222 * TTCN -> NS: unblock
223 * TTCN <- NS: unblock ack
224 */
Alexander Couzens357c5722021-09-06 01:20:18 +0200225function f_tx_unblock() runs on RAW_Test_CT {
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100226 f_init_vty();
227 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
228
229 /* do a NS Reset procedure */
230 f_outgoing_ns_reset();
231 /* send alive acks */
232 activate(as_rx_alive_tx_ack());
233
234 f_outgoing_ns_unblock();
235 setverdict(pass);
Alexander Couzens357c5722021-09-06 01:20:18 +0200236}
237
238testcase TC_tx_unblock() runs on RAW_Test_CT {
239 f_tx_unblock();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100240 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200241 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100242}
243
244/* 48.016 7.2 tx unblock retries
245 *
246 * TTCN -> NS: reset
247 * TTCN <- NS: reset ack
248 * TTCN -> NS: unblock
249 * TTCN <- NS: unblock ack
250 * TTCN -> NS: unblock
251 * TTCN <- NS: unblock ack
252 * TTCN -> NS: unblock
253 * TTCN <- NS: unblock ack
254 */
255testcase TC_tx_unblock_retries() runs on RAW_Test_CT {
256 f_init_vty();
257 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
258
259 /* do a NS Reset procedure */
260 f_outgoing_ns_reset();
261 /* send alive acks */
262 activate(as_rx_alive_tx_ack());
263
264 f_outgoing_ns_unblock();
265 f_outgoing_ns_unblock();
266 f_outgoing_ns_unblock();
267 setverdict(pass);
268 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200269 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100270}
271
272/* 48.016 7.2 block procedure
273 *
274 * TTCN -> NS: reset
275 * TTCN <- NS: reset ack
276 * TTCN -> NS: unblock
277 * TTCN <- NS: unblock ack
278 * TTCN -> NS: block
279 * TTCN <- NS: block ack
280 */
Alexander Couzens94d3d102021-09-06 00:20:42 +0200281function f_tx_block(float guard_secs := 30.0) runs on RAW_Test_CT {
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100282 f_init_vty();
Alexander Couzens94d3d102021-09-06 00:20:42 +0200283 f_init_ns_codec(mp_nsconfig, guard_secs := guard_secs);
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100284
285 /* do a NS Reset procedure */
286 f_outgoing_ns_reset();
287 activate(as_rx_alive_tx_ack());
288
289 f_outgoing_ns_unblock();
290 f_sleep(1.0);
291
292 f_outgoing_ns_block(NS_CAUSE_EQUIPMENT_FAILURE);
293 setverdict(pass);
294 f_sleep(1.0);
295}
296
Alexander Couzens94d3d102021-09-06 00:20:42 +0200297testcase TC_tx_block() runs on RAW_Test_CT {
298 f_tx_block()
299 f_clean_ns_codec();
300}
301
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100302/* 48.016 7.2 block procedure by vty
303 *
304 * TTCN -> NS: reset
305 * TTCN <- NS: reset ack
306 * TTCN -> NS: unblock
307 * TTCN <- NS: unblock ack
308 * vty: block nsvc
309 * TTCN <- NS: block
310 * TTCN -> NS: block ack
311 */
Alexander Couzens24788042021-09-06 00:42:51 +0200312function f_tx_block_by_vty(float guard_secs := 30.0) runs on RAW_Test_CT {
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100313 f_init_vty();
314 f_init_ns_codec(mp_nsconfig, guard_secs := guard_secs);
315
316 /* do a NS Reset procedure */
317 f_outgoing_ns_reset();
318 activate(as_rx_alive_tx_ack());
319
320 f_outgoing_ns_unblock();
321 f_sleep(1.0);
322
323 f_vty_transceive(NSVTY, "nsvc " & int2str(mp_nsconfig.nsvc[0].nsvci) & " block");
324
325 alt {
326 [] as_rx_ns_block_ack(oneshot := true, nsvci := mp_nsconfig.nsvc[0].nsvci);
327 }
328 setverdict(pass);
329}
330
331testcase TC_tx_block_by_vty() runs on RAW_Test_CT {
Alexander Couzens24788042021-09-06 00:42:51 +0200332 f_tx_block_by_vty(30.0);
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100333 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200334 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100335}
336
337/* 48.016 7.2 block precedure by vty and reset the NSVC.
338 * The NSVC should be still blocked after the reset.
339 */
340testcase TC_tx_block_by_vty_reset() runs on RAW_Test_CT {
341 timer T := 10.0;
342
Alexander Couzens24788042021-09-06 00:42:51 +0200343 f_tx_block_by_vty(60.0);
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100344 f_outgoing_ns_reset();
345
346 var default d := activate(ax_rx_fail_on_any_ns());
347 T.start;
348 alt {
349 [] as_rx_alive_tx_ack();
350 [] T.timeout { setverdict(pass); }
351 }
352 deactivate(d);
Alexander Couzens36744052021-09-06 00:39:07 +0200353 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100354}
355
356/* 48.016 7.4.1 ignore unexpected NS_ALIVE ACK */
357testcase TC_no_reset_alive_ack() runs on RAW_Test_CT {
358 f_init_vty();
359 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
360
361 NSCP[0].send(t_NS_ALIVE_ACK);
362 f_fails_except_reset();
363 setverdict(pass);
364 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200365 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100366}
367
368/* 48.016 7.3.1 NS_RESET with wrong nsei */
369testcase TC_reset_wrong_nsei() runs on RAW_Test_CT {
370 f_init_vty();
371 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
372
373 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei + 20));
374 NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
375 f_fails_except_reset();
376 setverdict(pass);
377 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200378 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100379}
380
381/* 48.016 7.3.1 NS_RESET with wrong nsvci */
382testcase TC_reset_wrong_nsvci() runs on RAW_Test_CT {
383 f_init_vty();
384 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
385
386 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei));
387 NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
388 f_fails_except_reset();
389 setverdict(pass);
390 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200391 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100392}
393
394/* 48.016 7.3.1 NS_RESET with wrong nsvci + nsei */
395testcase TC_reset_wrong_nsei_nsvci() runs on RAW_Test_CT {
396 f_init_vty();
397 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
398
399 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei + 20));
400 NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
401 f_fails_except_reset();
402 setverdict(pass);
403 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200404 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100405}
406
407/* 48.016 7.3.1 NS_RESET_ACK with wrong nsei */
408testcase TC_reset_ack_wrong_nsei() runs on RAW_Test_CT {
409 f_init_vty();
410 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
411
412 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
413 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei + 20));
414 f_fails_except_reset();
415 setverdict(pass);
416 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200417 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100418}
419
420/* 48.016 7.3.1 NS_RESET_ACK with wrong nsvci */
421testcase TC_reset_ack_wrong_nsvci() runs on RAW_Test_CT {
422 f_init_vty();
423 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
424
425 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
426 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei));
427 f_fails_except_reset();
428 setverdict(pass);
429 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200430 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100431}
432
433/* 48.016 7.3.1 NS_RESET_ACK with wrong nsvci + nsei */
434testcase TC_reset_ack_wrong_nsei_nsvci() runs on RAW_Test_CT {
435 f_init_vty();
436 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
437
438 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
439 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei + 20));
440 f_fails_except_reset();
441 setverdict(pass);
442 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200443 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100444}
445
446/* 48.016 7.3.1 ignore unexpected NS_RESET_ACK after NS_RESET+ALIVE */
447testcase TC_ignore_reset_ack() runs on RAW_Test_CT {
448 f_init_vty();
449 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
450
451 /* do a NS Reset procedure */
452 f_outgoing_ns_reset();
453
454 /* unblock and alive */
455 alt {
456 [] as_rx_ns_unblock_ack(oneshot := true);
457 [] as_rx_alive_tx_ack();
458 }
459
460 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
461 f_ensure_no_ns(answer_alive := true, tout := 15.0);
462 setverdict(pass);
463 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200464 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100465}
466
467/* 48.016 7.3 NS_RESET retries */
468testcase TC_reset_retries() runs on RAW_Test_CT {
469 var integer reset := 0;
470
471 f_init_vty();
472 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
473
474 alt {
475 [] NSCP[0].receive(tr_NS_RESET(*, *, *)) {
476 reset := reset + 1;
477 if (reset <= 3) {
478 repeat;
479 } else {
480 setverdict(pass);
481 }
482 }
483 }
484
485 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200486 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100487}
488
489/* 48.016 behave RESET_ACK got dropped
490 * TTCN -> NS: reset
491 * TTCN <- NS: reset ack
492 * TTCN <- NS: unblock
493 * TTCN -> NS: reset
494 * TTCN <- NS: reset ack
495 * TTCN <- NS: unblock
496 */
497testcase TC_reset_on_block_reset() runs on RAW_Test_CT {
498 var integer i := 0;
499
500 f_init_vty();
501 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
502
503 f_outgoing_ns_reset();
504 activate(as_rx_alive_tx_ack());
505
506 alt {
507 [] NSCP[0].receive(t_NS_UNBLOCK) {
508 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
509 i := i + 1;
510 if (i < 3) {
511 repeat;
512 } else {
513 setverdict(pass);
514 }
515 }
516 [] NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei)) { repeat; }
517 }
518
519 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200520 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100521}
522
523/* 48.016 7.4 test procedure for frame relay with a single nsvci */
524function f_alive_retries_single(boolean reset := false) runs on RAW_Test_CT {
525 f_init_vty();
526 f_init_ns_codec(mp_nsconfig, guard_secs := 60.0);
527
528 /* do a NS Reset procedure */
529 f_outgoing_ns_reset();
530
531 alt {
532 [] as_rx_ns_unblock_ack(oneshot := true);
533 [] as_rx_alive_tx_ack();
534 }
535
536 /* wait for one alive and answer it */
537 as_rx_alive_tx_ack(oneshot := true);
538 NSCP[0].receive(t_NS_ALIVE);
539 NSCP[0].receive(t_NS_ALIVE);
540 NSCP[0].receive(t_NS_ALIVE);
541 NSCP[0].receive(t_NS_ALIVE);
542 if (reset) {
543 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
544 } else {
545 f_ensure_no_ns(tout := 10.0);
546 }
547
548 setverdict(pass);
549 f_sleep(1.0);
550}
551
552testcase TC_alive_retries_single_reset() runs on RAW_Test_CT {
553 f_alive_retries_single(reset := true);
Alexander Couzens36744052021-09-06 00:39:07 +0200554 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100555}
556
557testcase TC_alive_retries_single_no_resp() runs on RAW_Test_CT {
558 f_alive_retries_single(reset := false);
Alexander Couzens36744052021-09-06 00:39:07 +0200559 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100560}
561
Alexander Couzenscbee32a2021-02-27 20:50:20 +0100562/* 48.016 SNS test cases */
563
564/* do a succesful SNS configuration */
arehbein2a6726c2022-11-30 22:40:43 +0100565function f_send_expect(in integer NSCP_IDX, in template (omit) PDU_NS pdu,
566 in NsCause c) runs on RAW_Test_CT {
567 log("Expected cause: ", c);
568 NSCP[NSCP_IDX].send(pdu);
569 f_ns_exp(tr_SNS_SIZE_ACK(g_nsconfig.nsei, c), NSCP_IDX);
570}
571
572function f_set_num_of_ip_endpoints(inout template (omit) PDU_NS base, AddressFamily af) runs on RAW_Test_CT {
573 const integer NUM_IP := 1;
574 if (af == AF_INET) {
575 base.pDU_SNS_Size.numberOfIP4_Endpoints :=
576 {iEI := int2oct(enum2int(mp_ns_iei_num_ipv4_ep), 1),
577 numberOfIP_Endpoints := int2oct(NUM_IP, 2)};
578 } else {
579 base.pDU_SNS_Size.numberOfIP4_Endpoints :=
580 {iEI := int2oct(enum2int(mp_ns_iei_num_ipv6_ep), 1),
581 numberOfIP_Endpoints := int2oct(NUM_IP, 2)};
582 }
583}
584
585/* Send SNS Size PDUs with invalid IEs */
586testcase TC_sns_sgsn_sns_size_syntactically_wrong_NSEI() runs on RAW_Test_CT {
587 f_init_vty();
588 f_init_ns_codec(mp_nsconfig);
589 const integer IDX := 0;
590 /* Assumption: No connections to other NSEs for SUT and testcomponent */
591 const integer sgsn_ip4_endpoints := lengthof(mp_nsconfig.nsvc);
592 const integer ip4_endpoints := lengthof(mp_nsconfig.nsvc);
593 const integer num_of_nsvcs := sgsn_ip4_endpoints * ip4_endpoints;
594 /* Template that would be accepted, only missing the number of IP endpoints
595 * (since there are no ternary operators in TTCN-3...) */
596 var template (omit) PDU_NS ts_base_SNS_SIZE_configured :=
597 ts_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := num_of_nsvcs,
598 num_v4 := omit, num_v6 := omit);
599 var NSVCConfiguration nsvc_cfg := g_nsconfig.nsvc[IDX];
600
601 f_set_num_of_ip_endpoints(ts_base_SNS_SIZE_configured, g_nsconfig.nsvc[0].provider.ip.address_family);
602 /* Syntactical error here: length of 1 (has to be >=2) */
603 ts_base_SNS_SIZE_configured.pDU_SNS_Size.nSEI_NS :=
604 {iEI := int2oct(enum2int(mp_ns_iei_nsei), 1), ext := '0'B, lengthIndicator := {length1 := 1},
605 nSEI := int2oct(g_nsconfig.nsei, 2)};
606 const NsCause cause := NS_CAUSE_INVALID_ESSENTIAL_IE;
607 f_send_expect(IDX, ts_base_SNS_SIZE_configured, cause);
608 setverdict(pass);
609 f_clean_ns_codec();
610}
611
Alexander Couzens79606cf2021-07-27 14:59:29 +0200612testcase TC_sns_bss_config_success() runs on RAW_Test_CT {
Alexander Couzenscbee32a2021-02-27 20:50:20 +0100613 f_init_vty();
614 f_init_ns_codec(mp_nsconfig);
615 f_incoming_sns_size();
616 f_incoming_sns_config();
617 f_outgoing_sns_config();
618 setverdict(pass);
619 f_clean_ns_codec();
620}
621
Alexander Couzensd5ac5102021-02-27 20:53:37 +0100622testcase TC_sns_bss_change_weight() runs on RAW_Test_CT {
Alexander Couzens60548b12021-04-14 19:39:26 +0200623 g_handle_rx_alive := true;
Alexander Couzensd5ac5102021-02-27 20:53:37 +0100624 f_init_vty();
625 f_init_ns_codec(mp_nsconfig);
626 f_incoming_sns_size();
627 f_incoming_sns_config();
628 f_outgoing_sns_config();
629 activate(as_rx_alive_tx_ack());
630 f_vty_config2(NSVTY, {"ns", "bind udp local"}, "ip-sns signalling-weight 99 data-weight 99");
631 f_incoming_sns_chg_weight();
632 setverdict(pass);
633 f_clean_ns_codec();
634}
635
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100636/* receive 3x SNS_CHG_WEIGHT but never answer on it */
637testcase TC_sns_bss_change_weight_timeout() runs on RAW_Test_CT {
638 var integer i := 0;
639 var template PDU_NS rx;
640 var NSVCConfiguration nsvc_cfg;
641
Alexander Couzens60548b12021-04-14 19:39:26 +0200642 g_handle_rx_alive := true;
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100643 f_init_vty();
644 f_init_ns_codec(mp_nsconfig);
645 f_incoming_sns_size();
646 f_incoming_sns_config();
647 f_outgoing_sns_config();
648 activate(as_rx_alive_tx_ack());
649 f_vty_config2(NSVTY, {"ns", "bind udp local"}, "ip-sns signalling-weight 99 data-weight 99");
650
651 nsvc_cfg := g_nsconfig.nsvc[0];
652 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
653 var template IP4_Elements v4_elem := { tr_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
654 nsvc_cfg.provider.ip.remote_udp_port) };
655
656 rx := tr_SNS_CHG_WEIGHT(g_nsconfig.nsei, ?, v4 := v4_elem);
657 } else {
658 var template IP6_Elements v6_elem := { tr_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
659 nsvc_cfg.provider.ip.remote_udp_port) };
660 rx := tr_SNS_CHG_WEIGHT(g_nsconfig.nsei, ?, v4 := omit, v6 := v6_elem);
661 }
662
Alexander Couzens60548b12021-04-14 19:39:26 +0200663 for (i := 0; i < 3; i := i + 1) {
664 f_ns_exp(rx);
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100665 }
666
Alexander Couzensa93cc362021-04-14 19:39:18 +0200667 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
668 /* expect one single SNS-SIZE with RESET flag; 4x v4 EP; no v6 EP */
669 rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
670 num_v4 := ?, num_v6 := omit), 0);
671 } else {
672 /* expect one single SNS-SIZE with RESET flag; no v4 EP; 4x v6 EP */
673 rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
674 num_v4 := omit, num_v6 := ?), 0);
675 }
676
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100677 setverdict(pass);
678 f_clean_ns_codec();
679}
680
Alexander Couzens6f17ecc2021-05-25 13:43:57 +0200681testcase TC_sns_bss_add() runs on RAW_Test_CT {
682 g_handle_rx_alive := true;
683 f_init_vty();
684 f_init_ns_codec(mp_nsconfig);
685 f_init_ns_codec(mp_nsconfig, 1);
686 f_incoming_sns_size();
687 f_incoming_sns_config();
688 f_outgoing_sns_config();
689 activate(as_rx_alive_tx_ack());
690 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
691 f_incoming_sns_add(idx_add := 1);
692 as_rx_alive_tx_ack(oneshot := true, idx := 1);
693 setverdict(pass);
694 f_clean_ns_codec();
695}
696
697testcase TC_sns_bss_del() runs on RAW_Test_CT {
698 g_handle_rx_alive := true;
699 f_init_vty();
700 f_init_ns_codec(mp_nsconfig);
701 f_init_ns_codec(mp_nsconfig, 1);
702 f_incoming_sns_size();
703 f_incoming_sns_config();
704 f_outgoing_sns_config();
705 activate(as_rx_alive_tx_ack());
706 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
707 f_incoming_sns_add(idx_add := 1);
708 as_rx_alive_tx_ack(oneshot := true, idx := 1);
709
710 /* delete the endpoint */
711 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
712 f_incoming_sns_del(idx_del := 1);
713 setverdict(pass);
714 f_clean_ns_codec();
715}
716
Alexander Couzense23387a2021-06-06 23:15:42 +0200717/* 1. do SNS configuration
718 * 2. add a bind
719 * 3. receive the SNS_ADD
720 * 4. before answering the SNS_ADD, change the weight via vty and remove the bind
721 */
722testcase TC_sns_bss_add_change_del() runs on RAW_Test_CT {
723 var PDU_NS rx;
724 var NSVCConfiguration nsvc_cfg;
725
726 g_handle_rx_alive := true;
727 f_init_vty();
728 f_init_ns_codec(mp_nsconfig);
729 f_init_ns_codec(mp_nsconfig, 1);
730 f_incoming_sns_size();
731 f_incoming_sns_config();
732 f_outgoing_sns_config();
733 activate(as_rx_alive_tx_ack());
734 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
735
736 /* rx SNS ADD */
737 nsvc_cfg := g_nsconfig.nsvc[1];
738 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
739 var template (omit) IP4_Elements v4_elem := { ts_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
740 nsvc_cfg.provider.ip.remote_udp_port,
741 1, 1) };
742 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, v4 := v4_elem), 0);
743 } else {
744 var template (omit) IP6_Elements v6_elem := { ts_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
745 nsvc_cfg.provider.ip.remote_udp_port,
746 1, 1) };
747 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, omit, v6_elem), 0);
748 }
749
750 /* delete the endpoint */
751 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 99 data-weight 99");
752 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
753
754 /* accept the SNS_ADD */
755 NSCP[0].send(ts_SNS_ACK(g_nsconfig.nsei, rx.pDU_SNS_Add.transactionID));
756
757 f_incoming_sns_chg_weight(idx_chg := 1);
758 f_incoming_sns_del(idx_del := 1, w_sig := 99, w_user := 99);
759 setverdict(pass);
760 f_clean_ns_codec();
761}
762
Alexander Couzens31f81502021-07-12 18:15:01 +0200763/* Ensure the ns2 code doesn't crash when calling force unconfigured while sending SNS SIZE */
764testcase TC_sns_rx_size_force_unconf() runs on RAW_Test_CT {
765 g_handle_rx_alive := true;
766 f_init_vty();
767 f_init_ns_codec(mp_nsconfig);
768 f_init_ns_codec(mp_nsconfig, 1);
769 f_ns_exp(tr_SNS_SIZE(mp_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
770 num_v4 := ?, num_v6 := omit));
771 f_vty_transceive(NSVTY, "nsvc nsei " & int2str(mp_nsconfig.nsei) & " force-unconfigured");
772 f_ns_exp(tr_SNS_SIZE(mp_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
773 num_v4 := ?, num_v6 := omit));
774 setverdict(pass);
775 f_clean_ns_codec();
776}
777
Alexander Couzens1650b162021-06-13 04:05:56 +0200778/* Test if SNS fails when all signalling NSVCs failes
779 * 3GPP TS 48.016 § 7.4b.1.1
780 * 1. do success SNS configuration
781 * 2. change sig weight of the seconds inactive bind
782 * 3. add second bind to SNS
783 * 4. stop reacting to NS_ALIVE on first NSVC (only NSVC with sig weight)
784 * 5. expect SNS SIZE
Alexander Couzens8122ed22021-08-06 22:01:20 +0200785 *
786 * Broken: the test case tests the wrong side. The signalling
787 * and data weight are valid for the other side. The correct
788 * test case needs to add a second bind on the ttcn3 side.
Alexander Couzens1650b162021-06-13 04:05:56 +0200789 */
790testcase TC_sns_bss_all_signalling_nsvcs_failed() runs on RAW_Test_CT {
791 g_handle_rx_alive := true;
792 f_init_vty();
793 f_init_ns_codec(mp_nsconfig);
794 f_init_ns_codec(mp_nsconfig, 1);
795 f_incoming_sns_size();
796 f_incoming_sns_config();
797 f_outgoing_sns_config();
798 var default d := activate(as_rx_alive_tx_ack());
799
800 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 0 data-weight 99");
801 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
802 f_incoming_sns_add(idx_add := 1, w_sig := 0, w_user := 99);
803 as_rx_alive_tx_ack(oneshot := true, idx := 1);
804 activate(as_rx_alive_tx_ack(idx := 1));
805 /* 2x NSVCs up, stop first NSVC */
806 deactivate(d);
807 /* libosmocore will rotate the SNS binds on failure */
808 NSCP[0].receive(t_NS_ALIVE);
809 NSCP[0].receive(t_NS_ALIVE);
810 NSCP[0].receive(t_NS_ALIVE);
811 f_incoming_sns_size(idx := 1);
812
813 setverdict(pass);
814 f_clean_ns_codec();
815}
816
Alexander Couzensfdfe6382021-09-03 23:17:35 +0200817/* Test if SNS fails when removing a bind which has the last valid connection
818 *
819 * ns2 has 2 binds, ttcn3 1 bind.
820 *
821 * nsvcs:
822 * ns2 ttcn3
823 * 1*-----------*1
824 * /
825 * 2*-broken--/
826 *
827 * remove the 1st ns2 bind.
828 */
829testcase TC_sns_bss_remove_bind_fail_sns() runs on RAW_Test_CT {
830 g_handle_rx_alive := true;
831 f_init_vty();
832 f_init_ns_codec(mp_nsconfig);
833 f_init_ns_codec(mp_nsconfig, 1);
834 f_incoming_sns_size();
835 f_incoming_sns_config();
836 f_outgoing_sns_config();
837 var default d := activate(as_rx_alive_tx_ack());
838
839 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 1 data-weight 1");
840 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
841 f_incoming_sns_add(idx_add := 1, w_sig := 1, w_user := 1);
842 /* 2nd bind won't have a valid connection to the ttcn3 */
843 NSCP[1].receive(t_NS_ALIVE);
844 NSCP[1].receive(t_NS_ALIVE);
845 NSCP[1].receive(t_NS_ALIVE);
846 NSCP[1].receive(t_NS_ALIVE);
847 NSCP[1].receive(t_NS_ALIVE);
848 f_sleep(1.0);
849 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local");
850 setverdict(pass);
851 f_clean_ns_codec();
852}
853
Alexander Couzens5eeebaa2021-07-12 18:15:42 +0200854testcase TC_idle() runs on RAW_Test_CT {
855 f_init_vty();
856 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
857
858 /* do a NS Reset procedure */
859 f_outgoing_ns_reset();
860 activate(as_rx_alive_tx_ack());
861
862 f_outgoing_ns_unblock();
863 f_sleep(30.0);
864
865 setverdict(pass);
866 f_sleep(1.0);
867 f_clean_ns_codec();
868}
869
Alexander Couzens358c74c2021-08-06 18:01:06 +0200870testcase TC_sns_sgsn_config_success() runs on RAW_Test_CT {
871 f_init_vty();
872 f_init_ns_codec(mp_nsconfig);
873 f_outgoing_sns_size();
874 f_outgoing_sns_config();
875 f_incoming_sns_config();
876 setverdict(pass);
877 f_clean_ns_codec();
878}
879
Alexander Couzens13b3ec82021-09-06 17:45:54 +0200880/* Ensure a SIZE after a success full configuration is handled */
881testcase TC_sns_sgsn_size_after_success() runs on RAW_Test_CT {
882 f_init_vty();
883 f_init_ns_codec(mp_nsconfig);
884 f_outgoing_sns_size();
885 f_outgoing_sns_config();
886 f_incoming_sns_config();
887 NSCP[0].receive(t_NS_ALIVE);
888
889 f_outgoing_sns_size();
890 f_outgoing_sns_config();
891 f_incoming_sns_config();
892 setverdict(pass);
893 f_clean_ns_codec();
894}
895
Alexander Couzens717bb212021-09-04 01:23:42 +0200896/* Ensure a SNS SIZE ACK is transmitted from the correct port */
897testcase TC_sns_sgsn_size_correct_port() runs on RAW_Test_CT {
898 f_init_vty();
899 f_init_ns_codec(mp_nsconfig);
900 f_init_ns_codec(mp_nsconfig, 1);
901 f_outgoing_sns_size(max_nsvcs := 10);
902 f_outgoing_sns_config();
903 f_incoming_sns_config();
904 NSCP[0].receive(t_NS_ALIVE);
905 f_outgoing_sns_size(max_nsvcs := 10, idx := 1);
906 setverdict(pass);
907 f_clean_ns_codec();
908}
909
Alexander Couzens6b51a3c2021-08-06 18:23:49 +0200910testcase TC_sns_sgsn_add() runs on RAW_Test_CT {
911 g_handle_rx_alive := true;
912 f_init_vty();
913 f_init_ns_codec(mp_nsconfig);
914 f_init_ns_codec(mp_nsconfig, 1);
915 f_outgoing_sns_size(max_nsvcs := 4, num_ip := 4);
916 f_outgoing_sns_config();
917 f_incoming_sns_config();
918 activate(as_rx_alive_tx_ack());
919
920 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
921 f_incoming_sns_add(idx_add := 1);
922 as_rx_alive_tx_ack(oneshot := true, idx := 1);
923
924 setverdict(pass);
925 f_clean_ns_codec();
926}
927
Alexander Couzens8a682d62021-08-06 22:24:47 +0200928testcase TC_sns_sgsn_del() runs on RAW_Test_CT {
929 g_handle_rx_alive := true;
930 f_init_vty();
931 f_init_ns_codec(mp_nsconfig);
932 f_init_ns_codec(mp_nsconfig, 1);
933 f_outgoing_sns_size(max_nsvcs := 4, num_ip := 4);
934 f_outgoing_sns_config();
935 f_incoming_sns_config();
936 activate(as_rx_alive_tx_ack());
937
938 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
939 f_incoming_sns_add(idx_add := 1);
940 as_rx_alive_tx_ack(oneshot := true, idx := 1);
941
942 /* delete the endpoint */
943 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
944 f_incoming_sns_del(idx_del := 1);
945
946 setverdict(pass);
947 f_clean_ns_codec();
948}
Alexander Couzens6b51a3c2021-08-06 18:23:49 +0200949
Alexander Couzens3921fb52021-08-12 04:04:20 +0200950/* 1. do SNS configuration
951 * 2. add a bind
952 * 3. receive the SNS_ADD
953 * 4. before answering the SNS_ADD, change the weight via vty and remove the bind
954 */
955testcase TC_sns_sgsn_add_change_del() runs on RAW_Test_CT {
956 var PDU_NS rx;
957 var NSVCConfiguration nsvc_cfg;
958
959 g_handle_rx_alive := true;
960 f_init_vty();
961 f_init_ns_codec(mp_nsconfig);
962 f_init_ns_codec(mp_nsconfig, 1);
963 f_outgoing_sns_size(max_nsvcs := 4, num_ip := 4);
964 f_outgoing_sns_config();
965 f_incoming_sns_config();
966 activate(as_rx_alive_tx_ack());
967 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
968
969 /* rx SNS ADD */
970 nsvc_cfg := g_nsconfig.nsvc[1];
971 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
972 var template (omit) IP4_Elements v4_elem := { ts_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
973 nsvc_cfg.provider.ip.remote_udp_port,
974 1, 1) };
975 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, v4 := v4_elem), 0);
976 } else {
977 var template (omit) IP6_Elements v6_elem := { ts_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
978 nsvc_cfg.provider.ip.remote_udp_port,
979 1, 1) };
980 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, omit, v6_elem), 0);
981 }
982
983 /* delete the endpoint */
984 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 99 data-weight 99");
985 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
986
987 /* accept the SNS_ADD */
988 NSCP[0].send(ts_SNS_ACK(g_nsconfig.nsei, rx.pDU_SNS_Add.transactionID));
989
990 f_incoming_sns_chg_weight(idx_chg := 1);
991 f_incoming_sns_del(idx_del := 1, w_sig := 99, w_user := 99);
992 setverdict(pass);
993 f_clean_ns_codec();
994}
995
Alexander Couzens357c5722021-09-06 01:20:18 +0200996/* 48.016 7.2 transmit a UNITDATA over an ALIVE connection
997 *
998 * TTCN -> NS: reset
999 * TTCN <- NS: reset ack
1000 * TTCN -> NS: unblock
1001 * TTCN <- NS: unblock ack
1002 * TTCN -> NS: unitdata
1003 * TTCN <- NS: unitdata (mirror)
1004 */
1005testcase TC_tx_unitdata() runs on RAW_Test_CT {
1006 f_tx_unblock();
1007
1008 f_vty_config2(NSVTY, {}, "mirror-mode enable");
1009 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1010 f_ns_exp(tr_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1011 f_vty_config2(NSVTY, {}, "mirror-mode disable");
1012
1013 f_sleep(1.0);
1014 f_clean_ns_codec();
1015}
1016
Alexander Couzens9061ebd2021-09-07 01:00:23 +02001017/* 48.016 7.2 ensure tx status (blocked) is correctly parsed
1018 *
1019 * TTCN -> NS: reset
1020 * TTCN <- NS: reset ack
1021 * TTCN -> NS: unblock
1022 * TTCN <- NS: unblock ack
1023 * TTCN -> NS: unitdata
1024 * TTCN <- NS: unitdata (mirror)
1025 * TTCN -> NS: status (blocked)
1026 * TTCN -> NS: unitdata
1027 * TTCN <- NS: status (blocked)
1028 */
1029testcase TC_mirror_unitdata_tx_status_blocked() runs on RAW_Test_CT {
1030 f_tx_unblock();
1031
1032 f_vty_config2(NSVTY, {}, "mirror-mode enable");
1033 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1034 var PDU_NS pdu := f_ns_exp(tr_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1035
1036 NSCP[0].send(ts_NS_STATUS(NS_CAUSE_NSVC_BLOCKED, pdu));
1037 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1038 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED));
1039
1040 f_vty_config2(NSVTY, {}, "mirror-mode disable");
1041 f_sleep(1.0);
1042 f_clean_ns_codec();
1043}
1044
Alexander Couzens6d916912021-09-23 15:16:08 +02001045/* 48.016 7.2 ensure tx status (blocked) is correctly parsed over a foreign NSVC
1046 *
1047 * 2x initialize NSVC (RESET/UNBLOCK)
1048 * TTCN 0-> NS: block (nsvci 1)
1049 * TTCN <-0 NS: block ack (nsvci 1)
1050 * TTCN 1-> NS: unit data (nsvci 1)
1051 * TTCN <-1 NS: status (blocked)
1052 */
1053testcase TC_tx_blocked_foreign_nsvc() runs on RAW_Test_CT {
1054 f_init_vty();
1055 f_vty_config2(NSVTY, {}, "mirror-mode enable");
1056 f_init_ns_codec(mp_nsconfig, idx := 0);
1057 f_init_ns_codec(mp_nsconfig, idx := 1);
1058
1059 /* do a NS Reset procedure */
1060 f_outgoing_ns_reset(idx := 0);
1061 f_outgoing_ns_reset(idx := 1);
1062
1063 /* send alive acks */
1064 activate(as_rx_alive_tx_ack(idx := 0));
1065 activate(as_rx_alive_tx_ack(idx := 1));
1066
1067 f_outgoing_ns_unblock(idx := 0);
1068 f_outgoing_ns_unblock(idx := 1);
1069
1070 /* both NSVC are alive and unblocked */
1071 NSCP[0].send(ts_NS_BLOCK(NS_CAUSE_TRANSIT_NETWORK_FAILURE, g_nsconfig.nsvc[1].nsvci));
1072 f_ns_exp(tr_NS_BLOCK_ACK(g_nsconfig.nsvc[1].nsvci));
1073
1074 NSCP[1].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1075 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED), idx := 1);
1076
1077 setverdict(pass);
1078 f_clean_ns_codec();
1079}
1080
1081
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001082control {
Alexander Couzense48d3552021-02-27 20:01:16 +01001083 if (mp_dialect == NS2_DIALECT_STATIC_RESETBLOCK or mp_dialect == NS2_DIALECT_IPACCESS) {
1084 execute( TC_tx_reset() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001085
Alexander Couzense48d3552021-02-27 20:01:16 +01001086 /* 48.016 7.2 Block procedure */
1087 execute( TC_tx_block() );
1088 execute( TC_tx_block_by_vty() );
1089 execute( TC_tx_block_by_vty_reset() );
Alexander Couzens94d3d102021-09-06 00:20:42 +02001090 execute( TC_tx_block_unitdata_over_blocked() );
1091 execute( TC_rx_block_unitdata_over_blocked() );
Alexander Couzens9061ebd2021-09-07 01:00:23 +02001092 execute( TC_mirror_unitdata_tx_status_blocked() );
Alexander Couzens6d916912021-09-23 15:16:08 +02001093 execute( TC_tx_blocked_foreign_nsvc() );
Alexander Couzense48d3552021-02-27 20:01:16 +01001094 // execute( TC_block_other_nsvc() ); // reset, unblock, sleep(1), block over another nsvci
1095 /* 48.016 7.2 Unblock procedure */
1096 execute( TC_tx_unblock() );
1097 execute( TC_tx_unblock_retries() );
1098 // execute( TC_rx_unblock_tx_unblock() ); // wait for an rx unblock pdu, send an unblock pdu, expect unblock ack pdu
1099 // execute( TC_unblockable() ); // block a NS-VCI via vty, try block procedure
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001100
Alexander Couzense48d3552021-02-27 20:01:16 +01001101 /* 48.016 7.2.1 Block Abnormal Condition */
1102 /* 48.016 7.2.1 Unblock Abnormal Condition */
1103 /* 48.016 7.3.1 Abnormal Condition */
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001104 execute( TC_reset_wrong_nsei() );
1105 execute( TC_reset_wrong_nsvci() );
1106 execute( TC_reset_wrong_nsei_nsvci() );
1107 execute( TC_reset_ack_wrong_nsei() );
1108 execute( TC_reset_ack_wrong_nsvci() );
1109 execute( TC_reset_ack_wrong_nsei_nsvci() );
1110 execute( TC_reset_retries() );
1111 execute( TC_reset_on_block_reset() );
Alexander Couzense48d3552021-02-27 20:01:16 +01001112 execute( TC_ignore_reset_ack() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001113
Alexander Couzense48d3552021-02-27 20:01:16 +01001114 /* 48.016 7.4 Test procedure on frame relay */
1115 execute( TC_tx_reset_tx_alive() );
1116 execute( TC_tx_reset_rx_alive() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001117
Alexander Couzense48d3552021-02-27 20:01:16 +01001118 /* 48.016 7.4.1 Abnormal Condition */
1119 if (mp_dialect == NS2_DIALECT_STATIC_RESETBLOCK) {
1120 // execute( TC_alive_retries_multi() ); // check if alive retries works and block over an alive nsvc
1121 execute( TC_alive_retries_single_reset() );
1122 } else if (mp_dialect == NS2_DIALECT_IPACCESS) {
1123 execute( TC_alive_retries_single_no_resp() );
1124 }
1125
1126 execute( TC_no_reset_alive_ack() );
Alexander Couzens357c5722021-09-06 01:20:18 +02001127 execute( TC_tx_unitdata() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001128 }
Alexander Couzenscbee32a2021-02-27 20:50:20 +01001129
1130 if (mp_dialect == NS2_DIALECT_SNS) {
Alexander Couzensde3dfaa2021-08-06 17:59:54 +02001131 if (mp_sns_role == SNS_ROLE_BSS) {
1132 /* BSS test cases */
1133 execute( TC_sns_bss_config_success() );
1134 execute( TC_sns_bss_change_weight() );
1135 execute( TC_sns_bss_change_weight_timeout() );
1136 execute( TC_sns_bss_add() );
1137 execute( TC_sns_bss_del() );
1138 execute( TC_sns_bss_add_change_del() );
Alexander Couzens8122ed22021-08-06 22:01:20 +02001139 /* execute( TC_sns_bss_all_signalling_nsvcs_failed() ); */
Alexander Couzensde3dfaa2021-08-06 17:59:54 +02001140 execute( TC_sns_rx_size_force_unconf() );
Alexander Couzensfdfe6382021-09-03 23:17:35 +02001141 execute( TC_sns_bss_remove_bind_fail_sns() );
Alexander Couzensde3dfaa2021-08-06 17:59:54 +02001142 }
Alexander Couzens358c74c2021-08-06 18:01:06 +02001143
1144 if (mp_sns_role == SNS_ROLE_SGSN) {
1145 execute( TC_sns_sgsn_config_success() );
Alexander Couzens6b51a3c2021-08-06 18:23:49 +02001146 execute( TC_sns_sgsn_add() );
Alexander Couzens8a682d62021-08-06 22:24:47 +02001147 execute( TC_sns_sgsn_del() );
Alexander Couzens3921fb52021-08-12 04:04:20 +02001148 execute( TC_sns_sgsn_add_change_del() );
Alexander Couzens717bb212021-09-04 01:23:42 +02001149 execute( TC_sns_sgsn_size_correct_port() );
Alexander Couzens13b3ec82021-09-06 17:45:54 +02001150 execute( TC_sns_sgsn_size_after_success() );
arehbein2a6726c2022-11-30 22:40:43 +01001151 execute( TC_sns_sgsn_sns_size_syntactically_wrong_NSEI() );
Alexander Couzens358c74c2021-08-06 18:01:06 +02001152 }
Alexander Couzenscbee32a2021-02-27 20:50:20 +01001153 }
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001154}
1155
1156}