ggsn: Append ChargingCharacteristics IE to CreatePdpCtxReq

This IE is conditionally added if the HLR provides it to the SGSN.
Let's add it by default so that we test code paths where GGSN parses it.

Related: SYS#5925
Change-Id: Ia0f74041d2107afeaa36b94e33474370b7b07c0e
diff --git a/ggsn_tests/GGSN_Tests.ttcn b/ggsn_tests/GGSN_Tests.ttcn
index b67645d..e3d9341 100644
--- a/ggsn_tests/GGSN_Tests.ttcn
+++ b/ggsn_tests/GGSN_Tests.ttcn
@@ -98,7 +98,8 @@
 		/* TEI (Control) remote side */
 		OCT4		teic_remote,
 		OCT1		ratType optional,
-		UserLocationInformation uli optional
+		UserLocationInformation uli optional,
+		OCT2 charging_char optional
 	}
 
 	type component GT_CT {
@@ -350,7 +351,8 @@
 			geographicLocation := {
 				geographicLocationCGI := ts_GeographicLocationCGI('262'H, '42F'H, '0001'O, '0002'O)
 			}
-		}
+		},
+		charging_char := '0000'O
 	}
 
 	/* send GTP-C for a given context and increment sequence number */
@@ -510,7 +512,8 @@
 		log("sending CreatePDP");
 		f_send_gtpc(ts_GTPC_CreatePDP(g_peer_c, g_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, ctx.pco_req, ctx.ratType, ctx.uli));
+						  g_sgsn_ip_c, g_sgsn_ip_u, ctx.msisdn, ctx.pco_req, ctx.ratType,
+						  ctx.uli, ctx.charging_char));
 		T_default.start;
 		d := activate(pingpong());
 		if (Gx_PROC.checkstate("Connected")) {
@@ -2006,7 +2009,7 @@
 							  ctx[next_req_ctx].teid, ctx[next_req_ctx].teic, ctx[next_req_ctx].nsapi,
 							  ctx[next_req_ctx].eua, ctx[next_req_ctx].apn,  g_sgsn_ip_c, g_sgsn_ip_u,
 							  ctx[next_req_ctx].msisdn, ctx[next_req_ctx].pco_req, ctx[next_req_ctx].ratType,
-							  ctx[next_req_ctx].uli));
+							  ctx[next_req_ctx].uli, ctx[next_req_ctx].charging_char));
 			next_req_ctx := next_req_ctx + 1;
 			if (next_req_ctx < num_ctx) {
 				T_next.start;
@@ -2120,7 +2123,7 @@
 									  ctx.teid, ctx.teic, ctx.nsapi,
 									  ctx.eua, ctx.apn,  g_sgsn_ip_c, g_sgsn_ip_u,
 									  ctx.msisdn, ctx.pco_req, ctx.ratType,
-									  ctx.uli));
+									  ctx.uli, ctx.charging_char));
 					next_req_ctx := next_req_ctx + 1;
 				}
 				T_next.start;
diff --git a/library/GTP_Templates.ttcn b/library/GTP_Templates.ttcn
index 049614a..0c5c003 100644
--- a/library/GTP_Templates.ttcn
+++ b/library/GTP_Templates.ttcn
@@ -119,6 +119,25 @@
 		restartCounter := restart_counter
 	}
 
+	/* Charging Characteristics IE TS 29.060 7.7.23 */
+	template ChargingCharacteristics_GTPC ts_ChargingCharacteristics(template (value) OCT2 chargingChar) := {
+		type_gtpc := '1A'O,
+		chargingChar := chargingChar
+	}
+	private function f_ts_ChargingCharacteristics(template (omit) OCT2 chargingChar)
+		return template (omit) ChargingCharacteristics_GTPC {
+		if (istemplatekind(chargingChar, "omit")) {
+			return omit;
+		}
+		return ts_ChargingCharacteristics(chargingChar);
+	}
+
+	template ChargingCharacteristics_GTPC tr_ChargingCharacteristics(template (present) OCT2 chargingChar) := {
+		type_gtpc := '1A'O,
+		chargingChar := chargingChar
+	}
+
+
 	/* template matching reception of GTP-C echo-request */
 	template Gtp1cUnitdata tr_GTPC_MsgType(template GtpPeer peer, template OCT1 msg_type, template OCT4 teid, template GTPC_PDUs pdus := ?) := {
 		peer := peer,
@@ -359,7 +378,8 @@
 					   octetstring sgsn_ip_sign, octetstring sgsn_ip_data,
 					   octetstring msisdn, template ProtConfigOptions pco := omit,
 					   template (omit) OCT1 ratType := omit,
-					   template (omit) UserLocationInformation uli := omit) := {
+					   template (omit) UserLocationInformation uli := omit,
+					   template (omit) OCT2 charging_char := omit) := {
 		createPDPContextRequest := {
 			imsi := ts_Imsi(imsi),
 			rai := omit,
@@ -383,7 +403,7 @@
 				unused := '0000'B
 			},
 			linked_nsapi := omit,
-			charging_char := omit,
+			charging_char := f_ts_ChargingCharacteristics(charging_char),
 			trace_ref := omit,
 			trace_type := omit,
 			endUserAddress := eua,
@@ -422,12 +442,13 @@
 						 octetstring sgsn_ip_data, octetstring msisdn,
 						 template ProtConfigOptions pco := omit,
 						 template (omit) OCT1 ratType := omit,
-						 template (omit) UserLocationInformation uli := omit) := {
+						 template (omit) UserLocationInformation uli := omit,
+						 template (omit) OCT2 charging_char := 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, pco, ratType, uli)), seq)
+								sgsn_ip_data, msisdn, pco, ratType, uli, charging_char)), seq)
 	}