epdg: Introduce test TC_mt_ipv4_echo_req

Change-Id: Ie5dc1bd995262f9253cc067c97a82c801b0080e1
diff --git a/epdg/EPDG_Tests.ttcn b/epdg/EPDG_Tests.ttcn
index 0d1b10f..fb9f98b 100644
--- a/epdg/EPDG_Tests.ttcn
+++ b/epdg/EPDG_Tests.ttcn
@@ -6,6 +6,9 @@
 import from Osmocom_Types all;
 import from L3_Common all;
 import from DNS_Helpers all;
+import from IP_Types all;
+import from ICMP_Types all;
+import from ICMP_Templates all;
 
 import from IPA_Emulation all;
 import from PCO_Types all;
@@ -692,6 +695,31 @@
 	GTP2.send(ts_GTPU_PING(peer, seq := seq_nr));
 	GTP2.receive(tr_GTPU_PONG(peer));
 }
+private altstep as_GTPU_rx_icmp4(template (present) PDU_ICMP expected := ?) runs on EPDG_ConnHdlr {
+	var Gtp1uUnitdata rx_msg;
+	var template (value) Gtp1uPeer peer := ts_GtpPeerU(f_inet_addr(g_pars.bearer.gtpu_addr_remote));
+
+	[] GTP2.receive(tr_GTPU_GPDU(peer, g_pars.bearer.teid_local)) -> value rx_msg {
+			/*TODO: verify gtpu txseq:
+			if (f_verify_gtpu_txseq(ud.gtpu, use_gtpu_txseq) == false) {
+				setverdict(fail);
+				stop;
+			}
+			*/
+			var octetstring gpdu := rx_msg.gtpu.gtpu_IEs.g_PDU_IEs.data;
+			var IPv4_packet ip4 := f_IPv4_dec(gpdu);
+			if (ip4.header.ver != 4) {
+				repeat;
+			}
+			var PDU_ICMP icmp4 := f_dec_PDU_ICMP(ip4.payload);
+			if (not match(icmp4, expected)) {
+				repeat;
+			}
+	}
+	[] GTP2.receive(Gtp1uUnitdata:?) -> value rx_msg {
+		Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected GTP msg rx: ", rx_msg));
+	}
+}
 
 /* GSUP AuthInfo Req + Resp, triggers SWx MAR + MAA. */
 private function f_GSUP_AI_success() runs on EPDG_ConnHdlr {
@@ -942,6 +970,24 @@
 	setverdict(pass);
 }
 
+private function f_TC_mt_ipv4_echo_req(charstring id) runs on EPDG_ConnHdlr {
+	f_initial_attach();
+	/* Dispatch Echo Resp to this component: */
+	f_gtp2_register_teid('00000000'O);
+	var octetstring echo_req := f_gen_icmpv4_echo(f_inet_addr(mp_upf_gtpu_local_ip), f_inet_addr(g_pars.ue_ip));
+	f_GTP1U_send(echo_req);
+	as_GTPU_rx_icmp4((tr_ICMPv4_ERP, tr_ICMPv4_DU));
+	f_GSUP_PurgeMS_success();
+}
+testcase TC_mt_ipv4_echo_req() runs on MTC_CT {
+	var EPDG_ConnHdlrPars pars := f_init_pars();
+	var EPDG_ConnHdlr vc_conn;
+	f_init();
+	vc_conn := f_start_handler(refers(f_TC_mt_ipv4_echo_req), pars);
+	vc_conn.done;
+	setverdict(pass);
+}
+
 control {
 	execute ( TC_authinfo_normal() );
 	execute ( TC_ho_lte_to_wifi() );
@@ -950,6 +996,7 @@
 	execute ( TC_concurrent_ues2() );
 	execute ( TC_concurrent_ues100() );
 	execute ( TC_upf_echo_req() );
+	execute ( TC_mt_ipv4_echo_req() );
 }
 
 }
diff --git a/epdg/ICMP_Types.ttcn b/epdg/ICMP_Types.ttcn
new file mode 120000
index 0000000..361cad1
--- /dev/null
+++ b/epdg/ICMP_Types.ttcn
@@ -0,0 +1 @@
+../deps/titan.ProtocolModules.ICMP/src/ICMP_Types.ttcn
\ No newline at end of file
diff --git a/epdg/gen_links.sh b/epdg/gen_links.sh
index ed4209c..7a4e60d 100755
--- a/epdg/gen_links.sh
+++ b/epdg/gen_links.sh
@@ -17,6 +17,14 @@
 FILES="IPL4asp_Functions.ttcn  IPL4asp_PT.cc  IPL4asp_PT.hh IPL4asp_PortType.ttcn  IPL4asp_Types.ttcn  IPL4asp_discovery.cc IPL4asp_protocol_L234.hh"
 gen_links $DIR $FILES
 
+DIR=$BASEDIR/titan.ProtocolModules.IP/src
+FILES="IP_EncDec.cc IP_Types.ttcn"
+gen_links $DIR $FILES
+
+DIR=$BASEDIR/titan.ProtocolModules.ICMP/src
+FILES="ICMP_EncDec.cc ICMP_Types.ttcn"
+gen_links $DIR $FILES
+
 DIR=$BASEDIR/titan.TestPorts.TELNETasp/src
 FILES="TELNETasp_PT.cc  TELNETasp_PT.hh  TELNETasp_PortType.ttcn"
 gen_links $DIR $FILES
@@ -54,6 +62,7 @@
 FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn "
 FILES+="GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn "
 FILES+="GTPv2_CodecPort.ttcn GTPv2_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunct.ttcn GTPv2_Emulation.ttcn "
+FILES+="ICMP_Templates.ttcn "
 gen_links $DIR $FILES
 
 ignore_pp_results
diff --git a/epdg/regen_makefile.sh b/epdg/regen_makefile.sh
index eb5935e..9aa83b4 100755
--- a/epdg/regen_makefile.sh
+++ b/epdg/regen_makefile.sh
@@ -9,6 +9,8 @@
 	IPL4asp_PT.cc
 	IPL4asp_discovery.cc
 	Native_FunctionDefs.cc
+	IP_EncDec.cc
+	ICMP_EncDec.cc
 	TCCConversion.cc
 	TCCEncoding.cc
 	TCCInterface.cc