osmo-ttcn3-hacks/library/ICMP_Templates.ttcn

96 lines
2.4 KiB
Plaintext

/* ICMP Templates in TTCN-3
* (C) 2024 by sysmocom - s.f.m.c. GmbH <info@sysmocom.de>
* 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;
}
}