GGSN_Tests: Actually request the right IPv4 PCO according to the test case

Missing: Verification of returned PCO
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index eaad436..0c16345 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -79,7 +79,7 @@
 	}
 
 	/* generalized GTP-C receive template */
-	template PDU_GTPC tr_GTP1C_PDU(template OCT1 msg_type, template OCT4 teid) := {
+	template PDU_GTPC tr_GTP1C_PDU(template OCT1 msg_type, template OCT4 teid, template GTPC_PDUs pdu := ?) := {
 		/* N-PDU Number flag (PN) shall be set to '0'. A GTP-C receiver shall not return an
 		 * error if this flag is set to '1'. */
 		pn_bit := '0'B,
@@ -95,7 +95,7 @@
 		lengthf := ?,
 		teid := teid,
 		opt_part := *,
-		gtpc_pdu := ?
+		gtpc_pdu := pdu
 	}
 
 	/* generalized GTP-C send template */
@@ -125,25 +125,37 @@
 
 	/* recovery IE */
 	template Recovery_gtpc ts_Recovery(OCT1 restart_counter) := {
-		type_gtpc := '00'O, /* we assume encoder fixes this */
+		type_gtpc := '0E'O,
+		restartCounter := restart_counter
+	}
+
+	template Recovery_gtpc tr_Recovery(template OCT1 restart_counter) := {
+		type_gtpc := '0E'O,
 		restartCounter := restart_counter
 	}
 
 	/* template matching reception of GTP-C echo-request */
-	template Gtp1cUnitdata tr_GTPC_MsgType(template GtpPeer peer, template OCT1 msg_type, template OCT4 teid) := {
+	template Gtp1cUnitdata tr_GTPC_MsgType(template GtpPeer peer, template OCT1 msg_type, template OCT4 teid, template GTPC_PDUs pdus := ?) := {
 		peer := peer,
-		gtpc := tr_GTP1C_PDU(msg_type, teid)
+		gtpc := tr_GTP1C_PDU(msg_type, teid, pdus)
 	}
 
 	/* template matching reception of GTP-C echo-request */
 	template Gtp1cUnitdata tr_GTPC_PING(template GtpPeer peer) := tr_GTPC_MsgType(peer, echoRequest, '00000000'O);
 
+	template GTPC_PDUs tr_EchoRespPDU(template OCT1 restart_counter) := {
+		echoResponse := {
+			recovery := tr_Recovery(restart_counter),
+			private_extension_gtpc := *
+		}
+	}
+
+	/* template matching reception of GTP-C echo-response */
+	template Gtp1cUnitdata tr_GTPC_PONG(template GtpPeer peer) := tr_GTPC_MsgType(peer, echoResponse, '00000000'O, tr_EchoRespPDU(?));
+
 	template GTPC_PDUs ts_EchoRespPDU(OCT1 restart_counter) := {
 		echoResponse := {
-			recovery := {
-				type_gtpc := '00'O, /* we assume encoder fixes? */
-				restartCounter := restart_counter
-			},
+			recovery := ts_Recovery(restart_counter),
 			private_extension_gtpc := omit
 		}
 	}
@@ -154,6 +166,18 @@
 		gtpc := ts_GTP1C_PDU(echoResponse, '00000000'O, valueof(ts_EchoRespPDU(rest_ctr)), seq)
 	}
 
+	template GTPC_PDUs ts_EchoReqPDU := {
+		echoRequest := {
+			private_extension_gtpc := omit
+		}
+	}
+
+	/* master template for sending a GTP-C echo request */
+	template Gtp1cUnitdata ts_GTPC_PING(GtpPeer peer, uint16_t seq) := {
+		peer := peer,
+		gtpc := ts_GTP1C_PDU(echoRequest, '00000000'O, valueof(ts_EchoReqPDU), seq)
+	}
+
 	template EndUserAddress t_EuaIPv4(template OCT4 ip_addr) := {
 		type_gtpc := '80'O,
 		endUserAddress := {
@@ -836,6 +860,7 @@
 	testcase TC_pdp4_act_deact_ipcp() runs on GT_CT {
 		f_init();
 		var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));
+		ctx.pco_req := valueof(ts_PCO_IPv4_DNS_IPCP);
 		f_pdp_ctx_act(ctx);
 		f_pdp_ctx_del(ctx, '1'B);
 	}
@@ -843,10 +868,23 @@
 	testcase TC_pdp4_act_deact_pcodns() runs on GT_CT {
 		f_init();
 		var PdpContext ctx := valueof(t_DefinePDP(f_rnd_imsi('26242'H), '1234'O, c_ApnInternet, valueof(t_EuaIPv4Dyn)));
+		ctx.pco_req := valueof(ts_PCO_IPv4_DNS_CONT);
 		f_pdp_ctx_act(ctx);
 		f_pdp_ctx_del(ctx, '1'B);
 	}
 
+	testcase TC_echo_req_resp() runs on GT_CT {
+		f_init();
+		f_send_gtpc(ts_GTPC_PING(g_peer_c, g_c_seq_nr));
+		T_default.start;
+		alt {
+			[] GTPC.receive(tr_GTPC_PONG(g_peer_c)) { setverdict(pass); };
+			[] GTPC.receive { repeat; };
+			[] T_default.timeout { setverdict(fail); }
+		}
+		T_default.stop;
+	}
+
 	control {
 		execute(TC_pdp4_act_deact());
 		execute(TC_pdp4_act_deact_ipcp());
@@ -855,5 +893,7 @@
 		execute(TC_pdp6_act_deact());
 		execute(TC_pdp6_act_deact_pcodns());
 		execute(TC_pdp6_act_deact_icmp6());
+
+		execute(TC_echo_req_resp());
 	}
 }