/* ICMP Templates in TTCN-3 * (C) 2024 by sysmocom - s.f.m.c. GmbH * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or * (at your option) any later version. * * SPDX-License-Identifier: GPL-2.0-or-later */ module ICMP_Templates { import from General_Types all; import from IP_Types all; import from ICMP_Types all; /* template for sending an ICMPv4 echo request */ template (value) PDU_ICMP ts_ICMPv4_ERQ(octetstring data := ''O) := { echo := { type_field := 8, code := 0, checksum := '0000'O, identifier := '0345'O, sequence_number := '0001'O, data := data } } /* template for receiving/matching an ICMPv4 echo request */ template (present) PDU_ICMP tr_ICMPv4_ERQ := { echo := { type_field := 8, code := 0, checksum := ?, identifier := ?, sequence_number := ?, data := ? } } /* template for receiving/matching an ICMPv4 echo reply */ template (present) PDU_ICMP tr_ICMPv4_ERP(template octetstring data := *) := { echo_reply := { type_field := 0, code := 0, checksum := ?, identifier := ?, sequence_number := ?, data := data } } /* template for receiving/matching an ICMPv6 Destination Unreachable */ template (present) PDU_ICMP tr_ICMPv4_DU := { destination_unreachable := { type_field := 1, code := ?, checksum := ?, unused := ?, original_ip_msg := ? } } /* template to construct IPv4_packet from input arguments, ready for use in f_IPv4_enc() */ template (value) IPv4_packet ts_IP4(OCT4 srcaddr, OCT4 dstaddr, LIN1 proto, LIN2_BO_LAST tlen, octetstring payload) := { header := { ver := 4, hlen := 5, tos := 0, tlen := tlen, id := 35902, res := '0'B, dfrag := '1'B, mfrag := '0'B, foffset := 0, ttl := 64, proto := proto, cksum := 0, srcaddr := srcaddr, dstaddr := dstaddr }, ext_headers := omit, payload := payload } /* Send an ICMPv4 echo msg through GTP given pdp ctx, and ip src and dst addr */ function f_gen_icmpv4_echo(OCT4 saddr, OCT4 daddr, octetstring pl := ''O) return octetstring { var octetstring tmp := f_enc_PDU_ICMP(valueof(ts_ICMPv4_ERQ(pl))); var IPv4_packet ip4 := valueof(ts_IP4(saddr, daddr, 1, 50, tmp)); var octetstring data := f_IPv4_enc(ip4); var OCT2 cksum := f_IPv4_checksum(data); data[10] := cksum[0]; data[11] := cksum[1]; return data; } }