GGSN: Test PDP Context activation wtih different PCOs
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index 43e754b..03cc288 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -21,6 +21,8 @@
 		hexstring	imsi,
 		octetstring	msisdn optional,
 		octetstring	apn,
+		ProtConfigOptions	pco_req optional,
+		ProtConfigOptions	pco_neg optional,
 		EndUserAddress	eua,
 		OCT16		ip6_prefix optional,
 		BIT4		nsapi,
@@ -229,7 +231,7 @@
 	template GTPC_PDUs ts_CreatePdpPDU(hexstring imsi, OCT1 restart_ctr, OCT4 teid_data, OCT4 teid_ctrl,
 					   BIT4 nsapi, EndUserAddress eua, octetstring apn,
 					   octetstring sgsn_ip_sign, octetstring sgsn_ip_data,
-					   octetstring msisdn) := {
+					   octetstring msisdn, template ProtConfigOptions pco := omit) := {
 		createPDPContextRequest := {
 			imsi := ts_Imsi(imsi),
 			rai := omit,
@@ -258,7 +260,7 @@
 			trace_type := omit,
 			endUserAddress := eua,
 			accessPointName := ts_APN(apn),
-			protConfigOptions := omit,
+			protConfigOptions := pco,
 			sgsn_addr_signalling := ts_GsnAddr(sgsn_ip_sign),
 			sgsn_addr_traffic := ts_GsnAddr(sgsn_ip_data),
 			msisdn := ts_Msisdn(msisdn),
@@ -289,12 +291,41 @@
 						 OCT1 restart_ctr, OCT4 teid_data,
 						 OCT4 teid_ctrl, BIT4 nsapi, EndUserAddress eua,
 						 octetstring apn, octetstring sgsn_ip_sign,
-						 octetstring sgsn_ip_data, octetstring msisdn) := {
+						 octetstring sgsn_ip_data, octetstring msisdn,
+						 template ProtConfigOptions pco := omit) := {
 		peer := peer,
 		gtpc := ts_GTP1C_PDU(createPDPContextRequest, '00000000'O,
 					valueof(ts_CreatePdpPDU(imsi, restart_ctr, teid_data, teid_ctrl,
 								nsapi, eua, apn, sgsn_ip_sign,
-								sgsn_ip_data, msisdn)), seq)
+								sgsn_ip_data, msisdn, pco)), seq)
+	}
+
+	template ProtConfigOptions ts_PCO := {
+		type_gtpc := '84'O,
+		lengthf := 0,
+		configProtocol := '000'B,
+		spare := '0000'B,
+		extension0 := '1'B,
+		protocols := {}
+	}
+
+
+	template ProtConfigOptions ts_PCO_IPv6_DNS modifies ts_PCO := {
+		protocols := {
+			{ protocolID := '0003'O, lengthProtoID := 0, protoIDContents := ''O }
+		}
+	}
+
+	template ProtConfigOptions ts_PCO_IPv4_DNS_IPCP modifies ts_PCO := {
+		protocols := {
+			{ protocolID := '8021'O, lengthProtoID := 16, protoIDContents := '01000010810600000000830600000000'O }
+		}
+	}
+
+	template ProtConfigOptions ts_PCO_IPv4_DNS_CONT modifies ts_PCO := {
+		protocols := {
+			{ protocolID := '000d'O, lengthProtoID := 0, protoIDContents := ''O }
+		}
 	}
 
 	function f_teardown_ind_IE(in template BIT1 ind) return template TearDownInd {
@@ -466,6 +497,7 @@
 		msisdn := msisdn,
 		nsapi := f_rnd_nsapi(),
 		apn := apn,
+		pco_req := omit,
 		eua := eua,
 		teid := f_rnd_tei(),
 		teic := f_rnd_tei(),
@@ -493,7 +525,7 @@
 		log("sending CreatePDP");
 		f_send_gtpc(ctx, ts_GTPC_CreatePDP(g_peer_c, ctx.c_seq_nr, ctx.imsi, g_restart_ctr,
 						  ctx.teid, ctx.teic, ctx.nsapi, ctx.eua, ctx.apn,
-						  g_sgsn_ip_c, g_sgsn_ip_u, ctx.msisdn));
+						  g_sgsn_ip_c, g_sgsn_ip_u, ctx.msisdn, ctx.pco_req));
 		T_default.start;
 		d := activate(pingpong());
 		alt {
@@ -503,6 +535,7 @@
 					ctx.teid_remote := cpr.teidDataI.teidDataI;
 					ctx.teic_remote := cpr.teidControlPlane.teidControlPlane;
 					ctx.eua := cpr.endUserAddress;
+					ctx.pco_neg := cpr.protConfigOptions;
 					setverdict(pass);
 				} else {
 					setverdict(fail);
@@ -537,12 +570,6 @@
 	/* IPv6 neighbor solicitation fe80::2 -> ff02::1:ff00:2 from 02:88:b5:1f:25:59 */
 	const octetstring c_neigh_solicit:= '6000000000203afffe800000000000000000000000000002ff0200000000000000000001ff00000287009f9600000000fe80000000000000000000000000000201010288b51f2559'O;
 
-	testcase TC_activate_pdp4() runs on GT_CT {
-		f_init();
-		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv4Dyn)));
-		f_pdp_ctx_act(ctx);
-	}
-
 	/* template to generate a 'Prefix Information' ICMPv6 option */
 	template OptionField ts_ICMP6_OptPrefix(OCT16 prefix, INT1 prefix_len) := {
 		prefixInformation := {
@@ -724,11 +751,29 @@
 		T_default.stop;
 	}
 
-	testcase TC_activate_pdp6() runs on GT_CT {
+	testcase TC_pdp6_act_deact() runs on GT_CT {
 		f_init();
 
 		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv6Dyn)));
 		f_pdp_ctx_act(ctx);
+		f_pdp_ctx_del(ctx, '1'B);
+	}
+
+	testcase TC_pdp6_act_deact_pcodns() runs on GT_CT {
+		f_init();
+
+		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv6Dyn)));
+		ctx.pco_req := valueof(ts_PCO_IPv6_DNS);
+		f_pdp_ctx_act(ctx);
+		f_pdp_ctx_del(ctx, '1'B);
+	}
+
+	testcase TC_pdp6_act_deact_icmp6() runs on GT_CT {
+		f_init();
+
+		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv6Dyn)));
+		ctx.pco_req := valueof(ts_PCO_IPv6_DNS);
+		f_pdp_ctx_act(ctx);
 
 		//f_send_gtpu(ctx, c_router_solicit);
 		//f_send_gtpu(ctx, c_neigh_solicit);
@@ -740,8 +785,34 @@
 		f_pdp_ctx_del(ctx, '1'B);
 	}
 
+	testcase TC_pdp4_act_deact() runs on GT_CT {
+		f_init();
+		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv4Dyn)));
+		f_pdp_ctx_act(ctx);
+		f_pdp_ctx_del(ctx, '1'B);
+	}
+
+	testcase TC_pdp4_act_deact_ipcp() runs on GT_CT {
+		f_init();
+		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv4Dyn)));
+		f_pdp_ctx_act(ctx);
+		f_pdp_ctx_del(ctx, '1'B);
+	}
+
+	testcase TC_pdp4_act_deact_pcodns() runs on GT_CT {
+		f_init();
+		var PdpContext ctx := valueof(t_DefinePDP('262420123456789'H, '1234'O, valueof(t_ApnInternet), valueof(t_EuaIPv4Dyn)));
+		f_pdp_ctx_act(ctx);
+		f_pdp_ctx_del(ctx, '1'B);
+	}
+
 	control {
-		execute(TC_activate_pdp4());
-		execute(TC_activate_pdp6());
+		execute(TC_pdp4_act_deact());
+		execute(TC_pdp4_act_deact_ipcp());
+		execute(TC_pdp4_act_deact_pcodns());
+
+		execute(TC_pdp6_act_deact());
+		execute(TC_pdp6_act_deact_pcodns());
+		execute(TC_pdp6_act_deact_icmp6());
 	}
 }