blob: cf88e93d65d564668dfeadfce6e34488417c7a75 [file] [log] [blame]
Pau Espin Pedrole16e9282024-03-01 14:45:22 +01001/* ICMP Templates in TTCN-3
2 * (C) 2024 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
3 * All rights reserved.
4 *
5 * Released under the terms of GNU General Public License, Version 2 or
6 * (at your option) any later version.
7 *
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
10
11module ICMP_Templates {
12
13 import from General_Types all;
14 import from IP_Types all;
15 import from ICMP_Types all;
16
17 /* template for sending an ICMPv4 echo request */
18 template (value) PDU_ICMP ts_ICMPv4_ERQ(octetstring data := ''O) := {
19 echo := {
20 type_field := 8,
21 code := 0,
22 checksum := '0000'O,
23 identifier := '0345'O,
24 sequence_number := '0001'O,
25 data := data
26 }
27 }
28
29 /* template for receiving/matching an ICMPv4 echo request */
30 template (present) PDU_ICMP tr_ICMPv4_ERQ := {
31 echo := {
32 type_field := 8,
33 code := 0,
34 checksum := ?,
35 identifier := ?,
36 sequence_number := ?,
37 data := ?
38 }
39 }
40
41 /* template for receiving/matching an ICMPv4 echo reply */
42 template (present) PDU_ICMP tr_ICMPv4_ERP(template octetstring data := *) := {
43 echo_reply := {
44 type_field := 0,
45 code := 0,
46 checksum := ?,
47 identifier := ?,
48 sequence_number := ?,
49 data := data
50 }
51 }
52
53 /* template for receiving/matching an ICMPv6 Destination Unreachable */
54 template (present) PDU_ICMP tr_ICMPv4_DU := {
55 destination_unreachable := {
56 type_field := 1,
57 code := ?,
58 checksum := ?,
59 unused := ?,
60 original_ip_msg := ?
61 }
62 }
63
64 /* template to construct IPv4_packet from input arguments, ready for use in f_IPv4_enc() */
65 template (value) IPv4_packet ts_IP4(OCT4 srcaddr, OCT4 dstaddr, LIN1 proto, LIN2_BO_LAST tlen, octetstring payload) := {
66 header := {
67 ver := 4,
68 hlen := 5,
69 tos := 0,
70 tlen := tlen,
71 id := 35902,
72 res := '0'B,
73 dfrag := '1'B,
74 mfrag := '0'B,
75 foffset := 0,
76 ttl := 64,
77 proto := proto,
78 cksum := 0,
79 srcaddr := srcaddr,
80 dstaddr := dstaddr
81 },
82 ext_headers := omit,
83 payload := payload
84 }
85
86 /* Send an ICMPv4 echo msg through GTP given pdp ctx, and ip src and dst addr */
87 function f_gen_icmpv4_echo(OCT4 saddr, OCT4 daddr, octetstring pl := ''O) return octetstring {
88 var octetstring tmp := f_enc_PDU_ICMP(valueof(ts_ICMPv4_ERQ(pl)));
89 var IPv4_packet ip4 := valueof(ts_IP4(saddr, daddr, 1, 50, tmp));
90 var octetstring data := f_IPv4_enc(ip4);
91 var OCT2 cksum := f_IPv4_checksum(data);
92 data[10] := cksum[0];
93 data[11] := cksum[1];
94 return data;
95 }
96}