Pau Espin Pedrol | e16e928 | 2024-03-01 14:45:22 +0100 | [diff] [blame] | 1 | /* 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 | |
| 11 | module 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 | } |