ggsn_tests: Split out generic ICMP(v6) related templates and functions

Change-Id: I53a5da05caeef4cdd59778840a6f4eed489f1b93
diff --git a/library/ICMP_Templates.ttcn b/library/ICMP_Templates.ttcn
new file mode 100644
index 0000000..cf88e93
--- /dev/null
+++ b/library/ICMP_Templates.ttcn
@@ -0,0 +1,96 @@
+/* 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;
+	}
+}
\ No newline at end of file