blob: 722f8eccac09cf2ab4da4a7fa854b90d2b67fe8f [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 };
70}
71
72type component RAW_Test_CT extends RAW_NS_CT {
73 port TELNETasp_PT NSVTY;
74}
75
76private function f_init_vty() runs on RAW_Test_CT {
77 map(self:NSVTY, system:NSVTY);
78 f_vty_set_prompts(NSVTY);
79 f_vty_transceive(NSVTY, "enable");
Alexander Couzens357c5722021-09-06 01:20:18 +020080 f_vty_config2(NSVTY, {}, "mirror-mode disable");
Alexander Couzens20cd41e2021-01-11 02:56:03 +010081 f_vty_transceive(NSVTY, "nsvc nsei " & int2str(mp_nsconfig.nsei) & " force-unconfigured");
Alexander Couzensbdef8102021-09-03 23:18:27 +020082 if (mp_dialect == NS2_DIALECT_SNS) {
83 f_vty_config2(NSVTY, {"ns", "nse " & int2str(mp_nsconfig.nsei)}, "ip-sns-bind local");
84 f_vty_config2(NSVTY, {"ns", "nse " & int2str(mp_nsconfig.nsei)}, "no ip-sns-bind local2");
85 f_vty_config2(NSVTY, {"ns", "bind udp local"}, "ip-sns signalling-weight 1 data-weight 1");
86 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 1 data-weight 1");
87 }
Alexander Couzens20cd41e2021-01-11 02:56:03 +010088}
89
90/* ensure no matching message is received within 'tout' */
91function f_ensure_no_ns(integer idx := 0, boolean answer_alive := false, float tout := 3.0)
92runs on RAW_Test_CT {
93 var PDU_NS nrf;
94
95 timer T := tout;
96 var default d := activate(ax_rx_fail_on_any_ns(idx));
97 T.start;
98 alt {
99 [answer_alive] as_rx_alive_tx_ack();
100 [] T.timeout {
101 setverdict(pass);
102 }
103 }
104 deactivate(d);
105}
106
107function f_fails_except_reset(integer idx := 0, float tout := 15.0)
108runs on RAW_Test_CT {
109 var PDU_NS nrf;
110 timer T := 15.0;
111 T.start;
112 alt {
113 [] NSCP[idx].receive(tr_NS_RESET(*, *, *)) {
114 repeat;
115 }
116 [] NSCP[idx].receive(PDU_NS: ?) -> value nrf {
117 setverdict(fail, "Received unexpected NS: ", nrf);
118 mtc.stop;
119 }
120 [] T.timeout {
121 setverdict(pass);
122 }
123 }
124}
125
126testcase TC_tx_reset() runs on RAW_Test_CT {
127 f_init_vty();
128 f_init_ns_codec(mp_nsconfig, guard_secs := 10.0);
129
130 /* do a NS Reset procedure */
131 f_outgoing_ns_reset();
132
133 setverdict(pass);
134 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200135 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100136}
137
138testcase TC_tx_reset_tx_alive() runs on RAW_Test_CT {
139 f_init_vty();
140 f_init_ns_codec(mp_nsconfig, guard_secs := 10.0);
141
142 /* do a NS Reset procedure */
143 f_outgoing_ns_reset();
144
145 /* check outgoing NS procedure */
146 f_outgoing_ns_alive();
147
148 setverdict(pass);
149 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200150 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100151}
152
153testcase TC_tx_reset_rx_alive() runs on RAW_Test_CT {
154 f_init_vty();
155 f_init_ns_codec(mp_nsconfig, guard_secs := 10.0);
156
157 /* do a NS Reset procedure */
158 f_outgoing_ns_reset();
159
160 activate(as_rx_ns_unblock_ack());
161 /* check outgoing NS procedure */
162 as_rx_alive_tx_ack(oneshot := true);
163
164 setverdict(pass);
165 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200166 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100167}
168
Alexander Couzens94d3d102021-09-06 00:20:42 +0200169/* 48.016 7.2.1 transmit a UNIT DATA over a BLOCKED NSVC when ttcn3 blocked it
170 *
171 * TTCN -> NS: reset
172 * TTCN <- NS: reset ack
173 * TTCN -> NS: unblock
174 * TTCN <- NS: unblock ack
175 * TTCN -> NS: block
176 * TTCN <- NS: block ack
177 * TTCN -> NS: unitdata
178 * TTCN <- NS: status (cause blocked)
179 */
180testcase TC_tx_block_unitdata_over_blocked() runs on RAW_Test_CT {
181 f_tx_block();
182 f_sleep(1.0);
183
184 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
185 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED));
186
187 setverdict(pass);
188 f_sleep(1.0);
189 f_clean_ns_codec();
190}
191
192/* 48.016 7.2.1 transmit a UNIT DATA over a BLOCKED NSVC when ns2 blocked it
193 *
194 * TTCN -> NS: reset
195 * TTCN <- NS: reset ack
196 * TTCN -> NS: unblock
197 * TTCN <- NS: unblock ack
198 * TTCN <- NS: block
199 * TTCN -> NS: block ack
200 * TTCN -> NS: unitdata
201 * TTCN <- NS: status (cause blocked)
202 */
203testcase TC_rx_block_unitdata_over_blocked() runs on RAW_Test_CT {
Alexander Couzens24788042021-09-06 00:42:51 +0200204 f_tx_block_by_vty();
Alexander Couzens94d3d102021-09-06 00:20:42 +0200205 f_sleep(1.0);
206
207 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
208 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED));
209
210 setverdict(pass);
211 f_sleep(1.0);
212 f_clean_ns_codec();
213}
214
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100215/* 48.016 7.2 unblock procedure
216 *
217 * TTCN -> NS: reset
218 * TTCN <- NS: reset ack
219 * TTCN -> NS: unblock
220 * TTCN <- NS: unblock ack
221 */
Alexander Couzens357c5722021-09-06 01:20:18 +0200222function f_tx_unblock() runs on RAW_Test_CT {
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100223 f_init_vty();
224 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
225
226 /* do a NS Reset procedure */
227 f_outgoing_ns_reset();
228 /* send alive acks */
229 activate(as_rx_alive_tx_ack());
230
231 f_outgoing_ns_unblock();
232 setverdict(pass);
Alexander Couzens357c5722021-09-06 01:20:18 +0200233}
234
235testcase TC_tx_unblock() runs on RAW_Test_CT {
236 f_tx_unblock();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100237 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200238 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100239}
240
241/* 48.016 7.2 tx unblock retries
242 *
243 * TTCN -> NS: reset
244 * TTCN <- NS: reset ack
245 * TTCN -> NS: unblock
246 * TTCN <- NS: unblock ack
247 * TTCN -> NS: unblock
248 * TTCN <- NS: unblock ack
249 * TTCN -> NS: unblock
250 * TTCN <- NS: unblock ack
251 */
252testcase TC_tx_unblock_retries() runs on RAW_Test_CT {
253 f_init_vty();
254 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
255
256 /* do a NS Reset procedure */
257 f_outgoing_ns_reset();
258 /* send alive acks */
259 activate(as_rx_alive_tx_ack());
260
261 f_outgoing_ns_unblock();
262 f_outgoing_ns_unblock();
263 f_outgoing_ns_unblock();
264 setverdict(pass);
265 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200266 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100267}
268
269/* 48.016 7.2 block procedure
270 *
271 * TTCN -> NS: reset
272 * TTCN <- NS: reset ack
273 * TTCN -> NS: unblock
274 * TTCN <- NS: unblock ack
275 * TTCN -> NS: block
276 * TTCN <- NS: block ack
277 */
Alexander Couzens94d3d102021-09-06 00:20:42 +0200278function f_tx_block(float guard_secs := 30.0) runs on RAW_Test_CT {
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100279 f_init_vty();
Alexander Couzens94d3d102021-09-06 00:20:42 +0200280 f_init_ns_codec(mp_nsconfig, guard_secs := guard_secs);
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100281
282 /* do a NS Reset procedure */
283 f_outgoing_ns_reset();
284 activate(as_rx_alive_tx_ack());
285
286 f_outgoing_ns_unblock();
287 f_sleep(1.0);
288
289 f_outgoing_ns_block(NS_CAUSE_EQUIPMENT_FAILURE);
290 setverdict(pass);
291 f_sleep(1.0);
292}
293
Alexander Couzens94d3d102021-09-06 00:20:42 +0200294testcase TC_tx_block() runs on RAW_Test_CT {
295 f_tx_block()
296 f_clean_ns_codec();
297}
298
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100299/* 48.016 7.2 block procedure by vty
300 *
301 * TTCN -> NS: reset
302 * TTCN <- NS: reset ack
303 * TTCN -> NS: unblock
304 * TTCN <- NS: unblock ack
305 * vty: block nsvc
306 * TTCN <- NS: block
307 * TTCN -> NS: block ack
308 */
Alexander Couzens24788042021-09-06 00:42:51 +0200309function f_tx_block_by_vty(float guard_secs := 30.0) runs on RAW_Test_CT {
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100310 f_init_vty();
311 f_init_ns_codec(mp_nsconfig, guard_secs := guard_secs);
312
313 /* do a NS Reset procedure */
314 f_outgoing_ns_reset();
315 activate(as_rx_alive_tx_ack());
316
317 f_outgoing_ns_unblock();
318 f_sleep(1.0);
319
320 f_vty_transceive(NSVTY, "nsvc " & int2str(mp_nsconfig.nsvc[0].nsvci) & " block");
321
322 alt {
323 [] as_rx_ns_block_ack(oneshot := true, nsvci := mp_nsconfig.nsvc[0].nsvci);
324 }
325 setverdict(pass);
326}
327
328testcase TC_tx_block_by_vty() runs on RAW_Test_CT {
Alexander Couzens24788042021-09-06 00:42:51 +0200329 f_tx_block_by_vty(30.0);
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100330 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200331 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100332}
333
334/* 48.016 7.2 block precedure by vty and reset the NSVC.
335 * The NSVC should be still blocked after the reset.
336 */
337testcase TC_tx_block_by_vty_reset() runs on RAW_Test_CT {
338 timer T := 10.0;
339
Alexander Couzens24788042021-09-06 00:42:51 +0200340 f_tx_block_by_vty(60.0);
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100341 f_outgoing_ns_reset();
342
343 var default d := activate(ax_rx_fail_on_any_ns());
344 T.start;
345 alt {
346 [] as_rx_alive_tx_ack();
347 [] T.timeout { setverdict(pass); }
348 }
349 deactivate(d);
Alexander Couzens36744052021-09-06 00:39:07 +0200350 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100351}
352
353/* 48.016 7.4.1 ignore unexpected NS_ALIVE ACK */
354testcase TC_no_reset_alive_ack() runs on RAW_Test_CT {
355 f_init_vty();
356 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
357
358 NSCP[0].send(t_NS_ALIVE_ACK);
359 f_fails_except_reset();
360 setverdict(pass);
361 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200362 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100363}
364
365/* 48.016 7.3.1 NS_RESET with wrong nsei */
366testcase TC_reset_wrong_nsei() runs on RAW_Test_CT {
367 f_init_vty();
368 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
369
370 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei + 20));
371 NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
372 f_fails_except_reset();
373 setverdict(pass);
374 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200375 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100376}
377
378/* 48.016 7.3.1 NS_RESET with wrong nsvci */
379testcase TC_reset_wrong_nsvci() runs on RAW_Test_CT {
380 f_init_vty();
381 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
382
383 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei));
384 NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
385 f_fails_except_reset();
386 setverdict(pass);
387 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200388 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100389}
390
391/* 48.016 7.3.1 NS_RESET with wrong nsvci + nsei */
392testcase TC_reset_wrong_nsei_nsvci() runs on RAW_Test_CT {
393 f_init_vty();
394 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
395
396 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei + 20));
397 NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
398 f_fails_except_reset();
399 setverdict(pass);
400 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200401 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100402}
403
404/* 48.016 7.3.1 NS_RESET_ACK with wrong nsei */
405testcase TC_reset_ack_wrong_nsei() runs on RAW_Test_CT {
406 f_init_vty();
407 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
408
409 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
410 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei + 20));
411 f_fails_except_reset();
412 setverdict(pass);
413 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200414 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100415}
416
417/* 48.016 7.3.1 NS_RESET_ACK with wrong nsvci */
418testcase TC_reset_ack_wrong_nsvci() runs on RAW_Test_CT {
419 f_init_vty();
420 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
421
422 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
423 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei));
424 f_fails_except_reset();
425 setverdict(pass);
426 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200427 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100428}
429
430/* 48.016 7.3.1 NS_RESET_ACK with wrong nsvci + nsei */
431testcase TC_reset_ack_wrong_nsei_nsvci() runs on RAW_Test_CT {
432 f_init_vty();
433 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
434
435 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
436 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci + 20, g_nsconfig.nsei + 20));
437 f_fails_except_reset();
438 setverdict(pass);
439 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200440 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100441}
442
443/* 48.016 7.3.1 ignore unexpected NS_RESET_ACK after NS_RESET+ALIVE */
444testcase TC_ignore_reset_ack() runs on RAW_Test_CT {
445 f_init_vty();
446 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
447
448 /* do a NS Reset procedure */
449 f_outgoing_ns_reset();
450
451 /* unblock and alive */
452 alt {
453 [] as_rx_ns_unblock_ack(oneshot := true);
454 [] as_rx_alive_tx_ack();
455 }
456
457 NSCP[0].send(ts_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
458 f_ensure_no_ns(answer_alive := true, tout := 15.0);
459 setverdict(pass);
460 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200461 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100462}
463
464/* 48.016 7.3 NS_RESET retries */
465testcase TC_reset_retries() runs on RAW_Test_CT {
466 var integer reset := 0;
467
468 f_init_vty();
469 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
470
471 alt {
472 [] NSCP[0].receive(tr_NS_RESET(*, *, *)) {
473 reset := reset + 1;
474 if (reset <= 3) {
475 repeat;
476 } else {
477 setverdict(pass);
478 }
479 }
480 }
481
482 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200483 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100484}
485
486/* 48.016 behave RESET_ACK got dropped
487 * TTCN -> NS: reset
488 * TTCN <- NS: reset ack
489 * TTCN <- NS: unblock
490 * TTCN -> NS: reset
491 * TTCN <- NS: reset ack
492 * TTCN <- NS: unblock
493 */
494testcase TC_reset_on_block_reset() runs on RAW_Test_CT {
495 var integer i := 0;
496
497 f_init_vty();
498 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
499
500 f_outgoing_ns_reset();
501 activate(as_rx_alive_tx_ack());
502
503 alt {
504 [] NSCP[0].receive(t_NS_UNBLOCK) {
505 NSCP[0].send(ts_NS_RESET(NS_CAUSE_EQUIPMENT_FAILURE, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
506 i := i + 1;
507 if (i < 3) {
508 repeat;
509 } else {
510 setverdict(pass);
511 }
512 }
513 [] NSCP[0].receive(tr_NS_RESET_ACK(g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei)) { repeat; }
514 }
515
516 f_sleep(1.0);
Alexander Couzens36744052021-09-06 00:39:07 +0200517 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100518}
519
520/* 48.016 7.4 test procedure for frame relay with a single nsvci */
521function f_alive_retries_single(boolean reset := false) runs on RAW_Test_CT {
522 f_init_vty();
523 f_init_ns_codec(mp_nsconfig, guard_secs := 60.0);
524
525 /* do a NS Reset procedure */
526 f_outgoing_ns_reset();
527
528 alt {
529 [] as_rx_ns_unblock_ack(oneshot := true);
530 [] as_rx_alive_tx_ack();
531 }
532
533 /* wait for one alive and answer it */
534 as_rx_alive_tx_ack(oneshot := true);
535 NSCP[0].receive(t_NS_ALIVE);
536 NSCP[0].receive(t_NS_ALIVE);
537 NSCP[0].receive(t_NS_ALIVE);
538 NSCP[0].receive(t_NS_ALIVE);
539 if (reset) {
540 NSCP[0].receive(tr_NS_RESET(*, g_nsconfig.nsvc[0].nsvci, g_nsconfig.nsei));
541 } else {
542 f_ensure_no_ns(tout := 10.0);
543 }
544
545 setverdict(pass);
546 f_sleep(1.0);
547}
548
549testcase TC_alive_retries_single_reset() runs on RAW_Test_CT {
550 f_alive_retries_single(reset := true);
Alexander Couzens36744052021-09-06 00:39:07 +0200551 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100552}
553
554testcase TC_alive_retries_single_no_resp() runs on RAW_Test_CT {
555 f_alive_retries_single(reset := false);
Alexander Couzens36744052021-09-06 00:39:07 +0200556 f_clean_ns_codec();
Alexander Couzens20cd41e2021-01-11 02:56:03 +0100557}
558
Alexander Couzenscbee32a2021-02-27 20:50:20 +0100559/* 48.016 SNS test cases */
560
561/* do a succesful SNS configuration */
Alexander Couzens79606cf2021-07-27 14:59:29 +0200562testcase TC_sns_bss_config_success() runs on RAW_Test_CT {
Alexander Couzenscbee32a2021-02-27 20:50:20 +0100563 f_init_vty();
564 f_init_ns_codec(mp_nsconfig);
565 f_incoming_sns_size();
566 f_incoming_sns_config();
567 f_outgoing_sns_config();
568 setverdict(pass);
569 f_clean_ns_codec();
570}
571
Alexander Couzensd5ac5102021-02-27 20:53:37 +0100572testcase TC_sns_bss_change_weight() runs on RAW_Test_CT {
Alexander Couzens60548b12021-04-14 19:39:26 +0200573 g_handle_rx_alive := true;
Alexander Couzensd5ac5102021-02-27 20:53:37 +0100574 f_init_vty();
575 f_init_ns_codec(mp_nsconfig);
576 f_incoming_sns_size();
577 f_incoming_sns_config();
578 f_outgoing_sns_config();
579 activate(as_rx_alive_tx_ack());
580 f_vty_config2(NSVTY, {"ns", "bind udp local"}, "ip-sns signalling-weight 99 data-weight 99");
581 f_incoming_sns_chg_weight();
582 setverdict(pass);
583 f_clean_ns_codec();
584}
585
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100586/* receive 3x SNS_CHG_WEIGHT but never answer on it */
587testcase TC_sns_bss_change_weight_timeout() runs on RAW_Test_CT {
588 var integer i := 0;
589 var template PDU_NS rx;
590 var NSVCConfiguration nsvc_cfg;
591
Alexander Couzens60548b12021-04-14 19:39:26 +0200592 g_handle_rx_alive := true;
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100593 f_init_vty();
594 f_init_ns_codec(mp_nsconfig);
595 f_incoming_sns_size();
596 f_incoming_sns_config();
597 f_outgoing_sns_config();
598 activate(as_rx_alive_tx_ack());
599 f_vty_config2(NSVTY, {"ns", "bind udp local"}, "ip-sns signalling-weight 99 data-weight 99");
600
601 nsvc_cfg := g_nsconfig.nsvc[0];
602 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
603 var template IP4_Elements v4_elem := { tr_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
604 nsvc_cfg.provider.ip.remote_udp_port) };
605
606 rx := tr_SNS_CHG_WEIGHT(g_nsconfig.nsei, ?, v4 := v4_elem);
607 } else {
608 var template IP6_Elements v6_elem := { tr_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
609 nsvc_cfg.provider.ip.remote_udp_port) };
610 rx := tr_SNS_CHG_WEIGHT(g_nsconfig.nsei, ?, v4 := omit, v6 := v6_elem);
611 }
612
Alexander Couzens60548b12021-04-14 19:39:26 +0200613 for (i := 0; i < 3; i := i + 1) {
614 f_ns_exp(rx);
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100615 }
616
Alexander Couzensa93cc362021-04-14 19:39:18 +0200617 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
618 /* expect one single SNS-SIZE with RESET flag; 4x v4 EP; no v6 EP */
619 rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
620 num_v4 := ?, num_v6 := omit), 0);
621 } else {
622 /* expect one single SNS-SIZE with RESET flag; no v4 EP; 4x v6 EP */
623 rx := f_ns_exp(tr_SNS_SIZE(g_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
624 num_v4 := omit, num_v6 := ?), 0);
625 }
626
Alexander Couzens6c723fb2021-03-01 00:12:00 +0100627 setverdict(pass);
628 f_clean_ns_codec();
629}
630
Alexander Couzens6f17ecc2021-05-25 13:43:57 +0200631testcase TC_sns_bss_add() runs on RAW_Test_CT {
632 g_handle_rx_alive := true;
633 f_init_vty();
634 f_init_ns_codec(mp_nsconfig);
635 f_init_ns_codec(mp_nsconfig, 1);
636 f_incoming_sns_size();
637 f_incoming_sns_config();
638 f_outgoing_sns_config();
639 activate(as_rx_alive_tx_ack());
640 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
641 f_incoming_sns_add(idx_add := 1);
642 as_rx_alive_tx_ack(oneshot := true, idx := 1);
643 setverdict(pass);
644 f_clean_ns_codec();
645}
646
647testcase TC_sns_bss_del() runs on RAW_Test_CT {
648 g_handle_rx_alive := true;
649 f_init_vty();
650 f_init_ns_codec(mp_nsconfig);
651 f_init_ns_codec(mp_nsconfig, 1);
652 f_incoming_sns_size();
653 f_incoming_sns_config();
654 f_outgoing_sns_config();
655 activate(as_rx_alive_tx_ack());
656 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
657 f_incoming_sns_add(idx_add := 1);
658 as_rx_alive_tx_ack(oneshot := true, idx := 1);
659
660 /* delete the endpoint */
661 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
662 f_incoming_sns_del(idx_del := 1);
663 setverdict(pass);
664 f_clean_ns_codec();
665}
666
Alexander Couzense23387a2021-06-06 23:15:42 +0200667/* 1. do SNS configuration
668 * 2. add a bind
669 * 3. receive the SNS_ADD
670 * 4. before answering the SNS_ADD, change the weight via vty and remove the bind
671 */
672testcase TC_sns_bss_add_change_del() runs on RAW_Test_CT {
673 var PDU_NS rx;
674 var NSVCConfiguration nsvc_cfg;
675
676 g_handle_rx_alive := true;
677 f_init_vty();
678 f_init_ns_codec(mp_nsconfig);
679 f_init_ns_codec(mp_nsconfig, 1);
680 f_incoming_sns_size();
681 f_incoming_sns_config();
682 f_outgoing_sns_config();
683 activate(as_rx_alive_tx_ack());
684 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
685
686 /* rx SNS ADD */
687 nsvc_cfg := g_nsconfig.nsvc[1];
688 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
689 var template (omit) IP4_Elements v4_elem := { ts_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
690 nsvc_cfg.provider.ip.remote_udp_port,
691 1, 1) };
692 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, v4 := v4_elem), 0);
693 } else {
694 var template (omit) IP6_Elements v6_elem := { ts_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
695 nsvc_cfg.provider.ip.remote_udp_port,
696 1, 1) };
697 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, omit, v6_elem), 0);
698 }
699
700 /* delete the endpoint */
701 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 99 data-weight 99");
702 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
703
704 /* accept the SNS_ADD */
705 NSCP[0].send(ts_SNS_ACK(g_nsconfig.nsei, rx.pDU_SNS_Add.transactionID));
706
707 f_incoming_sns_chg_weight(idx_chg := 1);
708 f_incoming_sns_del(idx_del := 1, w_sig := 99, w_user := 99);
709 setverdict(pass);
710 f_clean_ns_codec();
711}
712
Alexander Couzens31f81502021-07-12 18:15:01 +0200713/* Ensure the ns2 code doesn't crash when calling force unconfigured while sending SNS SIZE */
714testcase TC_sns_rx_size_force_unconf() runs on RAW_Test_CT {
715 g_handle_rx_alive := true;
716 f_init_vty();
717 f_init_ns_codec(mp_nsconfig);
718 f_init_ns_codec(mp_nsconfig, 1);
719 f_ns_exp(tr_SNS_SIZE(mp_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
720 num_v4 := ?, num_v6 := omit));
721 f_vty_transceive(NSVTY, "nsvc nsei " & int2str(mp_nsconfig.nsei) & " force-unconfigured");
722 f_ns_exp(tr_SNS_SIZE(mp_nsconfig.nsei, rst_flag := true, max_nsvcs := ?,
723 num_v4 := ?, num_v6 := omit));
724 setverdict(pass);
725 f_clean_ns_codec();
726}
727
Alexander Couzens1650b162021-06-13 04:05:56 +0200728/* Test if SNS fails when all signalling NSVCs failes
729 * 3GPP TS 48.016 § 7.4b.1.1
730 * 1. do success SNS configuration
731 * 2. change sig weight of the seconds inactive bind
732 * 3. add second bind to SNS
733 * 4. stop reacting to NS_ALIVE on first NSVC (only NSVC with sig weight)
734 * 5. expect SNS SIZE
Alexander Couzens8122ed22021-08-06 22:01:20 +0200735 *
736 * Broken: the test case tests the wrong side. The signalling
737 * and data weight are valid for the other side. The correct
738 * test case needs to add a second bind on the ttcn3 side.
Alexander Couzens1650b162021-06-13 04:05:56 +0200739 */
740testcase TC_sns_bss_all_signalling_nsvcs_failed() runs on RAW_Test_CT {
741 g_handle_rx_alive := true;
742 f_init_vty();
743 f_init_ns_codec(mp_nsconfig);
744 f_init_ns_codec(mp_nsconfig, 1);
745 f_incoming_sns_size();
746 f_incoming_sns_config();
747 f_outgoing_sns_config();
748 var default d := activate(as_rx_alive_tx_ack());
749
750 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 0 data-weight 99");
751 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
752 f_incoming_sns_add(idx_add := 1, w_sig := 0, w_user := 99);
753 as_rx_alive_tx_ack(oneshot := true, idx := 1);
754 activate(as_rx_alive_tx_ack(idx := 1));
755 /* 2x NSVCs up, stop first NSVC */
756 deactivate(d);
757 /* libosmocore will rotate the SNS binds on failure */
758 NSCP[0].receive(t_NS_ALIVE);
759 NSCP[0].receive(t_NS_ALIVE);
760 NSCP[0].receive(t_NS_ALIVE);
761 f_incoming_sns_size(idx := 1);
762
763 setverdict(pass);
764 f_clean_ns_codec();
765}
766
Alexander Couzensfdfe6382021-09-03 23:17:35 +0200767/* Test if SNS fails when removing a bind which has the last valid connection
768 *
769 * ns2 has 2 binds, ttcn3 1 bind.
770 *
771 * nsvcs:
772 * ns2 ttcn3
773 * 1*-----------*1
774 * /
775 * 2*-broken--/
776 *
777 * remove the 1st ns2 bind.
778 */
779testcase TC_sns_bss_remove_bind_fail_sns() runs on RAW_Test_CT {
780 g_handle_rx_alive := true;
781 f_init_vty();
782 f_init_ns_codec(mp_nsconfig);
783 f_init_ns_codec(mp_nsconfig, 1);
784 f_incoming_sns_size();
785 f_incoming_sns_config();
786 f_outgoing_sns_config();
787 var default d := activate(as_rx_alive_tx_ack());
788
789 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 1 data-weight 1");
790 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
791 f_incoming_sns_add(idx_add := 1, w_sig := 1, w_user := 1);
792 /* 2nd bind won't have a valid connection to the ttcn3 */
793 NSCP[1].receive(t_NS_ALIVE);
794 NSCP[1].receive(t_NS_ALIVE);
795 NSCP[1].receive(t_NS_ALIVE);
796 NSCP[1].receive(t_NS_ALIVE);
797 NSCP[1].receive(t_NS_ALIVE);
798 f_sleep(1.0);
799 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local");
800 setverdict(pass);
801 f_clean_ns_codec();
802}
803
Alexander Couzens5eeebaa2021-07-12 18:15:42 +0200804testcase TC_idle() runs on RAW_Test_CT {
805 f_init_vty();
806 f_init_ns_codec(mp_nsconfig, guard_secs := 30.0);
807
808 /* do a NS Reset procedure */
809 f_outgoing_ns_reset();
810 activate(as_rx_alive_tx_ack());
811
812 f_outgoing_ns_unblock();
813 f_sleep(30.0);
814
815 setverdict(pass);
816 f_sleep(1.0);
817 f_clean_ns_codec();
818}
819
Alexander Couzens358c74c2021-08-06 18:01:06 +0200820testcase TC_sns_sgsn_config_success() runs on RAW_Test_CT {
821 f_init_vty();
822 f_init_ns_codec(mp_nsconfig);
823 f_outgoing_sns_size();
824 f_outgoing_sns_config();
825 f_incoming_sns_config();
826 setverdict(pass);
827 f_clean_ns_codec();
828}
829
Alexander Couzens13b3ec82021-09-06 17:45:54 +0200830/* Ensure a SIZE after a success full configuration is handled */
831testcase TC_sns_sgsn_size_after_success() runs on RAW_Test_CT {
832 f_init_vty();
833 f_init_ns_codec(mp_nsconfig);
834 f_outgoing_sns_size();
835 f_outgoing_sns_config();
836 f_incoming_sns_config();
837 NSCP[0].receive(t_NS_ALIVE);
838
839 f_outgoing_sns_size();
840 f_outgoing_sns_config();
841 f_incoming_sns_config();
842 setverdict(pass);
843 f_clean_ns_codec();
844}
845
Alexander Couzens717bb212021-09-04 01:23:42 +0200846/* Ensure a SNS SIZE ACK is transmitted from the correct port */
847testcase TC_sns_sgsn_size_correct_port() runs on RAW_Test_CT {
848 f_init_vty();
849 f_init_ns_codec(mp_nsconfig);
850 f_init_ns_codec(mp_nsconfig, 1);
851 f_outgoing_sns_size(max_nsvcs := 10);
852 f_outgoing_sns_config();
853 f_incoming_sns_config();
854 NSCP[0].receive(t_NS_ALIVE);
855 f_outgoing_sns_size(max_nsvcs := 10, idx := 1);
856 setverdict(pass);
857 f_clean_ns_codec();
858}
859
Alexander Couzens6b51a3c2021-08-06 18:23:49 +0200860testcase TC_sns_sgsn_add() runs on RAW_Test_CT {
861 g_handle_rx_alive := true;
862 f_init_vty();
863 f_init_ns_codec(mp_nsconfig);
864 f_init_ns_codec(mp_nsconfig, 1);
865 f_outgoing_sns_size(max_nsvcs := 4, num_ip := 4);
866 f_outgoing_sns_config();
867 f_incoming_sns_config();
868 activate(as_rx_alive_tx_ack());
869
870 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
871 f_incoming_sns_add(idx_add := 1);
872 as_rx_alive_tx_ack(oneshot := true, idx := 1);
873
874 setverdict(pass);
875 f_clean_ns_codec();
876}
877
Alexander Couzens8a682d62021-08-06 22:24:47 +0200878testcase TC_sns_sgsn_del() runs on RAW_Test_CT {
879 g_handle_rx_alive := true;
880 f_init_vty();
881 f_init_ns_codec(mp_nsconfig);
882 f_init_ns_codec(mp_nsconfig, 1);
883 f_outgoing_sns_size(max_nsvcs := 4, num_ip := 4);
884 f_outgoing_sns_config();
885 f_incoming_sns_config();
886 activate(as_rx_alive_tx_ack());
887
888 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
889 f_incoming_sns_add(idx_add := 1);
890 as_rx_alive_tx_ack(oneshot := true, idx := 1);
891
892 /* delete the endpoint */
893 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
894 f_incoming_sns_del(idx_del := 1);
895
896 setverdict(pass);
897 f_clean_ns_codec();
898}
Alexander Couzens6b51a3c2021-08-06 18:23:49 +0200899
Alexander Couzens3921fb52021-08-12 04:04:20 +0200900/* 1. do SNS configuration
901 * 2. add a bind
902 * 3. receive the SNS_ADD
903 * 4. before answering the SNS_ADD, change the weight via vty and remove the bind
904 */
905testcase TC_sns_sgsn_add_change_del() runs on RAW_Test_CT {
906 var PDU_NS rx;
907 var NSVCConfiguration nsvc_cfg;
908
909 g_handle_rx_alive := true;
910 f_init_vty();
911 f_init_ns_codec(mp_nsconfig);
912 f_init_ns_codec(mp_nsconfig, 1);
913 f_outgoing_sns_size(max_nsvcs := 4, num_ip := 4);
914 f_outgoing_sns_config();
915 f_incoming_sns_config();
916 activate(as_rx_alive_tx_ack());
917 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "ip-sns-bind local2");
918
919 /* rx SNS ADD */
920 nsvc_cfg := g_nsconfig.nsvc[1];
921 if (nsvc_cfg.provider.ip.address_family == AF_INET) {
922 var template (omit) IP4_Elements v4_elem := { ts_SNS_IPv4(nsvc_cfg.provider.ip.remote_ip,
923 nsvc_cfg.provider.ip.remote_udp_port,
924 1, 1) };
925 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, v4 := v4_elem), 0);
926 } else {
927 var template (omit) IP6_Elements v6_elem := { ts_SNS_IPv6(nsvc_cfg.provider.ip.remote_ip,
928 nsvc_cfg.provider.ip.remote_udp_port,
929 1, 1) };
930 rx := f_ns_exp(tr_SNS_ADD(g_nsconfig.nsei, ?, omit, v6_elem), 0);
931 }
932
933 /* delete the endpoint */
934 f_vty_config2(NSVTY, {"ns", "bind udp local2"}, "ip-sns signalling-weight 99 data-weight 99");
935 f_vty_config2(NSVTY, {"ns", "nse " & int2str(g_nsconfig.nsei)}, "no ip-sns-bind local2");
936
937 /* accept the SNS_ADD */
938 NSCP[0].send(ts_SNS_ACK(g_nsconfig.nsei, rx.pDU_SNS_Add.transactionID));
939
940 f_incoming_sns_chg_weight(idx_chg := 1);
941 f_incoming_sns_del(idx_del := 1, w_sig := 99, w_user := 99);
942 setverdict(pass);
943 f_clean_ns_codec();
944}
945
Alexander Couzens357c5722021-09-06 01:20:18 +0200946/* 48.016 7.2 transmit a UNITDATA over an ALIVE connection
947 *
948 * TTCN -> NS: reset
949 * TTCN <- NS: reset ack
950 * TTCN -> NS: unblock
951 * TTCN <- NS: unblock ack
952 * TTCN -> NS: unitdata
953 * TTCN <- NS: unitdata (mirror)
954 */
955testcase TC_tx_unitdata() runs on RAW_Test_CT {
956 f_tx_unblock();
957
958 f_vty_config2(NSVTY, {}, "mirror-mode enable");
959 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
960 f_ns_exp(tr_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
961 f_vty_config2(NSVTY, {}, "mirror-mode disable");
962
963 f_sleep(1.0);
964 f_clean_ns_codec();
965}
966
Alexander Couzens9061ebd2021-09-07 01:00:23 +0200967/* 48.016 7.2 ensure tx status (blocked) is correctly parsed
968 *
969 * TTCN -> NS: reset
970 * TTCN <- NS: reset ack
971 * TTCN -> NS: unblock
972 * TTCN <- NS: unblock ack
973 * TTCN -> NS: unitdata
974 * TTCN <- NS: unitdata (mirror)
975 * TTCN -> NS: status (blocked)
976 * TTCN -> NS: unitdata
977 * TTCN <- NS: status (blocked)
978 */
979testcase TC_mirror_unitdata_tx_status_blocked() runs on RAW_Test_CT {
980 f_tx_unblock();
981
982 f_vty_config2(NSVTY, {}, "mirror-mode enable");
983 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
984 var PDU_NS pdu := f_ns_exp(tr_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
985
986 NSCP[0].send(ts_NS_STATUS(NS_CAUSE_NSVC_BLOCKED, pdu));
987 NSCP[0].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
988 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED));
989
990 f_vty_config2(NSVTY, {}, "mirror-mode disable");
991 f_sleep(1.0);
992 f_clean_ns_codec();
993}
994
Alexander Couzens6d916912021-09-23 15:16:08 +0200995/* 48.016 7.2 ensure tx status (blocked) is correctly parsed over a foreign NSVC
996 *
997 * 2x initialize NSVC (RESET/UNBLOCK)
998 * TTCN 0-> NS: block (nsvci 1)
999 * TTCN <-0 NS: block ack (nsvci 1)
1000 * TTCN 1-> NS: unit data (nsvci 1)
1001 * TTCN <-1 NS: status (blocked)
1002 */
1003testcase TC_tx_blocked_foreign_nsvc() runs on RAW_Test_CT {
1004 f_init_vty();
1005 f_vty_config2(NSVTY, {}, "mirror-mode enable");
1006 f_init_ns_codec(mp_nsconfig, idx := 0);
1007 f_init_ns_codec(mp_nsconfig, idx := 1);
1008
1009 /* do a NS Reset procedure */
1010 f_outgoing_ns_reset(idx := 0);
1011 f_outgoing_ns_reset(idx := 1);
1012
1013 /* send alive acks */
1014 activate(as_rx_alive_tx_ack(idx := 0));
1015 activate(as_rx_alive_tx_ack(idx := 1));
1016
1017 f_outgoing_ns_unblock(idx := 0);
1018 f_outgoing_ns_unblock(idx := 1);
1019
1020 /* both NSVC are alive and unblocked */
1021 NSCP[0].send(ts_NS_BLOCK(NS_CAUSE_TRANSIT_NETWORK_FAILURE, g_nsconfig.nsvc[1].nsvci));
1022 f_ns_exp(tr_NS_BLOCK_ACK(g_nsconfig.nsvc[1].nsvci));
1023
1024 NSCP[1].send(ts_NS_UNITDATA(t_SduCtrlB, 42, '0011234242230101'O));
1025 f_ns_exp(tr_NS_STATUS(NS_CAUSE_NSVC_BLOCKED), idx := 1);
1026
1027 setverdict(pass);
1028 f_clean_ns_codec();
1029}
1030
1031
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001032control {
Alexander Couzense48d3552021-02-27 20:01:16 +01001033 if (mp_dialect == NS2_DIALECT_STATIC_RESETBLOCK or mp_dialect == NS2_DIALECT_IPACCESS) {
1034 execute( TC_tx_reset() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001035
Alexander Couzense48d3552021-02-27 20:01:16 +01001036 /* 48.016 7.2 Block procedure */
1037 execute( TC_tx_block() );
1038 execute( TC_tx_block_by_vty() );
1039 execute( TC_tx_block_by_vty_reset() );
Alexander Couzens94d3d102021-09-06 00:20:42 +02001040 execute( TC_tx_block_unitdata_over_blocked() );
1041 execute( TC_rx_block_unitdata_over_blocked() );
Alexander Couzens9061ebd2021-09-07 01:00:23 +02001042 execute( TC_mirror_unitdata_tx_status_blocked() );
Alexander Couzens6d916912021-09-23 15:16:08 +02001043 execute( TC_tx_blocked_foreign_nsvc() );
Alexander Couzense48d3552021-02-27 20:01:16 +01001044 // execute( TC_block_other_nsvc() ); // reset, unblock, sleep(1), block over another nsvci
1045 /* 48.016 7.2 Unblock procedure */
1046 execute( TC_tx_unblock() );
1047 execute( TC_tx_unblock_retries() );
1048 // execute( TC_rx_unblock_tx_unblock() ); // wait for an rx unblock pdu, send an unblock pdu, expect unblock ack pdu
1049 // execute( TC_unblockable() ); // block a NS-VCI via vty, try block procedure
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001050
Alexander Couzense48d3552021-02-27 20:01:16 +01001051 /* 48.016 7.2.1 Block Abnormal Condition */
1052 /* 48.016 7.2.1 Unblock Abnormal Condition */
1053 /* 48.016 7.3.1 Abnormal Condition */
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001054 execute( TC_reset_wrong_nsei() );
1055 execute( TC_reset_wrong_nsvci() );
1056 execute( TC_reset_wrong_nsei_nsvci() );
1057 execute( TC_reset_ack_wrong_nsei() );
1058 execute( TC_reset_ack_wrong_nsvci() );
1059 execute( TC_reset_ack_wrong_nsei_nsvci() );
1060 execute( TC_reset_retries() );
1061 execute( TC_reset_on_block_reset() );
Alexander Couzense48d3552021-02-27 20:01:16 +01001062 execute( TC_ignore_reset_ack() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001063
Alexander Couzense48d3552021-02-27 20:01:16 +01001064 /* 48.016 7.4 Test procedure on frame relay */
1065 execute( TC_tx_reset_tx_alive() );
1066 execute( TC_tx_reset_rx_alive() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001067
Alexander Couzense48d3552021-02-27 20:01:16 +01001068 /* 48.016 7.4.1 Abnormal Condition */
1069 if (mp_dialect == NS2_DIALECT_STATIC_RESETBLOCK) {
1070 // execute( TC_alive_retries_multi() ); // check if alive retries works and block over an alive nsvc
1071 execute( TC_alive_retries_single_reset() );
1072 } else if (mp_dialect == NS2_DIALECT_IPACCESS) {
1073 execute( TC_alive_retries_single_no_resp() );
1074 }
1075
1076 execute( TC_no_reset_alive_ack() );
Alexander Couzens357c5722021-09-06 01:20:18 +02001077 execute( TC_tx_unitdata() );
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001078 }
Alexander Couzenscbee32a2021-02-27 20:50:20 +01001079
1080 if (mp_dialect == NS2_DIALECT_SNS) {
Alexander Couzensde3dfaa2021-08-06 17:59:54 +02001081 if (mp_sns_role == SNS_ROLE_BSS) {
1082 /* BSS test cases */
1083 execute( TC_sns_bss_config_success() );
1084 execute( TC_sns_bss_change_weight() );
1085 execute( TC_sns_bss_change_weight_timeout() );
1086 execute( TC_sns_bss_add() );
1087 execute( TC_sns_bss_del() );
1088 execute( TC_sns_bss_add_change_del() );
Alexander Couzens8122ed22021-08-06 22:01:20 +02001089 /* execute( TC_sns_bss_all_signalling_nsvcs_failed() ); */
Alexander Couzensde3dfaa2021-08-06 17:59:54 +02001090 execute( TC_sns_rx_size_force_unconf() );
Alexander Couzensfdfe6382021-09-03 23:17:35 +02001091 execute( TC_sns_bss_remove_bind_fail_sns() );
Alexander Couzensde3dfaa2021-08-06 17:59:54 +02001092 }
Alexander Couzens358c74c2021-08-06 18:01:06 +02001093
1094 if (mp_sns_role == SNS_ROLE_SGSN) {
1095 execute( TC_sns_sgsn_config_success() );
Alexander Couzens6b51a3c2021-08-06 18:23:49 +02001096 execute( TC_sns_sgsn_add() );
Alexander Couzens8a682d62021-08-06 22:24:47 +02001097 execute( TC_sns_sgsn_del() );
Alexander Couzens3921fb52021-08-12 04:04:20 +02001098 execute( TC_sns_sgsn_add_change_del() );
Alexander Couzens717bb212021-09-04 01:23:42 +02001099 execute( TC_sns_sgsn_size_correct_port() );
Alexander Couzens13b3ec82021-09-06 17:45:54 +02001100 execute( TC_sns_sgsn_size_after_success() );
Alexander Couzens358c74c2021-08-06 18:01:06 +02001101 }
Alexander Couzenscbee32a2021-02-27 20:50:20 +01001102 }
Alexander Couzens20cd41e2021-01-11 02:56:03 +01001103}
1104
1105}