GTPv2: Declare GTP2C_Cause as enum

Change-Id: Id26f59274d7a8813b64b9b4b7c5c39cc12d5a0ac
diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn
index 753774d..6bd3ba6 100644
--- a/library/GTPv2_Templates.ttcn
+++ b/library/GTPv2_Templates.ttcn
@@ -147,28 +147,37 @@
 
 
 /* 8.4-1 */
-/*
 type enumerated GTP2C_Cause {
 	Local_Detach 				(2),
 	Complete_Detach				(3),
 	RAT_changed_from_3GPP_to_Non_3GPP	(4),
 	ISR_deactivation			(5),
-	Error_Ind_from_RNC_eNB_SGSN_MME		(5),
+	Error_Ind_from_RNC_eNB_SGSN_MME		(6),
 	IMSI_Detach_Only			(7),
 	Reactivation_Required			(8),
-}
-*/
-
-const integer c_GTP2C_Cause_LocalDetach := 1;
+	PDN_reconnection_to_APN_disallowed	(9),
+	Access_changed_from_Non_3GPP_to_3GPP	(10),
+	PDN_connection_inactivity_timer_expires	(11),
+	PGW_not_responding			(12),
+	Network_Failure				(13),
+	QoS_parameter_mismatch			(14),
+	EPS_to_5GS_Mobility			(15),
+	Request_accepted			(16),
+	Request_accepted_partially		(17),
+	New_PDN_type_due_to_network_preference	(18),
+	New_PDN_type_due_to_single_address_bearer_only (19),
+	/* ... */
+	Context_Not_Found			(64)
+} with { variant "FIELDLENGTH(8)" encode "RAW" };
 
 /* 8.4 */
-template (value) Cause ts_GTP2C_Cause(template (value) OCT1 cause,
+template (value) Cause ts_GTP2C_Cause(template (value) GTP2C_Cause cause,
 				      template (value) BIT1 cs) := {
 	elementIdentifier := '02'O,
 	lengthIndicator := 0, /* overwritten */
 	instance := '0000'B,
 	spare := '0000'B,
-	causeValue := cause,
+	causeValue := int2oct(enum2int(valueof(cause)), 1),
 	cS := cs,
 	bCE := '0'B,
 	pCE := '0'B,
@@ -178,12 +187,24 @@
 	instanceOfOffendingIE := omit,
 	spare3 := omit
 }
-template (present) Cause tr_GTP2C_Cause(template (present) OCT1 cause) := {
+private function enum2int_GTP2C_Cause_tmpl(template GTP2C_Cause inp) return template integer
+{
+	if (istemplatekind(inp, "omit")) {
+		return omit;
+	} else if (istemplatekind(inp, "*")) {
+		return *;
+	} else if (istemplatekind(inp, "?")) {
+		return ?;
+	} else {
+		return enum2int(valueof(inp));
+	}
+}
+template (present) Cause tr_GTP2C_Cause(template (present) GTP2C_Cause cause) := {
 	elementIdentifier := '02'O,
 	lengthIndicator := ?,
 	instance := ?,
 	spare := '0000'B,
-	causeValue := cause,
+	causeValue := int2oct_tmpl(enum2int_GTP2C_Cause_tmpl(cause), 1),
 	cS := ?,
 	bCE := ?,
 	pCE := ?,
@@ -193,7 +214,7 @@
 	instanceOfOffendingIE := *,
 	spare3 := *
 }
-private function fs_GTP2C_Cause(template (omit) OCT1 cause, template (value) BIT1 cs) return
+private function fs_GTP2C_Cause(template (omit) GTP2C_Cause cause, template (value) BIT1 cs) return
 template (omit) Cause {
 	if (istemplatekind(cause, "omit")) {
 		return omit;
@@ -201,7 +222,7 @@
 		return ts_GTP2C_Cause(cause, cs);
 	}
 }
-private function fr_GTP2C_Cause(template OCT1 cause) return
+private function fr_GTP2C_Cause(template GTP2C_Cause cause) return
 template Cause {
 	if (istemplatekind(cause, "omit")) {
 		return omit;
@@ -793,7 +814,7 @@
 			   template (value) PDN_AddressAllocation addr) :=
 ts_PDU_GTP2C('00000000'O, '000000'O, '21'O, {
 	createSessionResponse := {
-		cause := ts_GTP2C_Cause(int2oct(16, 1), '0'B),
+		cause := ts_GTP2C_Cause(Request_accepted, '0'B),
 		changeReportingAction := omit,
 		cSG_InformationReportingAction := omit,
 		heNBInformationReporting := omit,
@@ -824,7 +845,7 @@
 template (present) PDU_GTPCv2
 tr_GTP2C_CreateSessionResp(template (present) OCT4 d_teid := ?,
 			   template (present) OCT3 seq := ?,
-			   template (present) OCT1 cause := ?,
+			   template (present) GTP2C_Cause cause := ?,
 			   template FullyQualifiedTEID_List fteids := *,
 			   template PDN_AddressAllocation addr := *,
 			   template BearerContextGrouped_List bctxg := *) :=
@@ -862,7 +883,7 @@
 
 template (value) PDU_GTPCv2
 ts_GTP2C_DeleteSessionReq(template (value) OCT4 d_teid,
-			  template (omit) OCT1 cause := omit,
+			  template (omit) GTP2C_Cause cause := omit,
 			  template (value) FullyQualifiedTEID sender_fteid,
 			  template (omit) FullyQualifiedTEID_List teid_list := omit,
 			  template (value) uint4_t bearer_id) :=
@@ -889,7 +910,7 @@
 template (present) PDU_GTPCv2
 tr_GTP2C_DeleteSessionReq(template (present) OCT4 d_teid,
 			  template (present) OCT3 seq := ?,
-			  template (omit) OCT1 cause,
+			  template (omit) GTP2C_Cause cause,
 			  template (present) FullyQualifiedTEID sender_fteid,
 			  template FullyQualifiedTEID_List teid_list,
 			  template (present) uint4_t bearer_id) :=
@@ -918,7 +939,7 @@
 template (value) PDU_GTPCv2
 ts_GTP2C_DeleteSessionResp(template (value) OCT4 d_teid,
 			   template (value) OCT3 seq,
-			   template (value) OCT1 cause) :=
+			   template (value) GTP2C_Cause cause) :=
 ts_PDU_GTP2C(d_teid, '000000'O, '25'O, {
 	deleteSessionResponse := {
 		cause := ts_GTP2C_Cause(cause, '0'B),
@@ -934,7 +955,7 @@
 template (present) PDU_GTPCv2
 tr_GTP2C_DeleteSessionResp(template (present) OCT4 d_teid,
 			   template (present) OCT3 seq := ?,
-			   template (present) OCT1 cause := ?
+			   template (present) GTP2C_Cause cause := ?
 			) :=
 tr_PDU_GTP2C(d_teid, seq, {
 	deleteSessionResponse := {
@@ -993,7 +1014,7 @@
 ts_GTP2C_DeleteBearerReq(template (value) OCT4 d_teid,
 			 template (value) integer proc_trans_id,
 			 template (value) uint4_t bearer_id,
-			 template (value) OCT1 cause) :=
+			 template (value) GTP2C_Cause cause) :=
 ts_PDU_GTP2C(d_teid, '000000'O, '63'O, {
 	deleteBearerRequest := {
 		epsBearerIdentity := { ts_GTP2C_EpsBearerId(bearer_id) },
@@ -1014,7 +1035,7 @@
 template (present) PDU_GTPCv2
 tr_GTP2C_DeleteBearerResp(template (present) OCT4 d_teid,
 			  template (present) OCT3 seq := ?,
-			  template (present) OCT1 cause := ?) :=
+			  template (present) GTP2C_Cause cause := ?) :=
 tr_PDU_GTP2C(d_teid, seq, {
 	deleteBearerResponse := {
 		cause := tr_GTP2C_Cause(cause),
diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn
index 4730040..182147d 100644
--- a/pgw/PGW_Tests.ttcn
+++ b/pgw/PGW_Tests.ttcn
@@ -610,7 +610,7 @@
 		as_DIA_Gy_CCR(INITIAL_REQUEST);
 	}
 	alt {
-	[] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:='10'O)) -> value rx {
+	[] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid:=g_teic, cause:=Request_accepted)) -> value rx {
 		/* extract TEIDs */
 		var CreateSessionResponse resp := rx.gtpcv2_pdu.createSessionResponse;
 		g_teic_remote := resp.fullyQualifiedTEID[0].tEID_GRE_Key;
@@ -655,9 +655,9 @@
 }
 
 /* delete the session from the PGW */
-private function f_delete_session(template (omit) OCT1 tx_cause := omit,
+private function f_delete_session(template (omit) GTP2C_Cause tx_cause := omit,
 				  template (present) OCT4 exp_teid,
-				  template (present) OCT1 exp_cause,
+				  template (present) GTP2C_Cause exp_cause,
 				  boolean expect_diameter := true) runs on PGW_Session_CT {
 	var template (value) FullyQualifiedTEID fteid_c_ie
 	fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_teic, 0,
@@ -844,7 +844,7 @@
 /* create a session, then delete it again */
 private function f_TC_createSession_deleteSession() runs on PGW_Session_CT {
 	f_create_session();
-	f_delete_session(omit, g_teic, '10'O);
+	f_delete_session(omit, g_teic, Request_accepted);
 	setverdict(pass);
 }
 testcase TC_createSession_deleteSession() runs on PGW_Test_CT {
@@ -859,7 +859,7 @@
 private function f_TC_deleteSession_unknown() runs on PGW_Session_CT {
 	g_teic := f_gtp2_allocate_teid();
 	g_teic_remote := f_rnd_octstring(4);
-	f_delete_session(omit, '00000000'O, '40'O /* Context Unknown */, false);
+	f_delete_session(omit, '00000000'O, Context_Not_Found, false);
 	setverdict(pass);
 }
 testcase TC_deleteSession_unknown() runs on PGW_Test_CT {
@@ -890,7 +890,7 @@
 	as_DIA_Gy_CCR(UPDATE_REQUEST);
 	f_validate_gy_cc_report(g_rx_gy, VALIDITY_TIME, (3..4), ?, ?);
 
-	f_delete_session(omit, g_teic, '10'O);
+	f_delete_session(omit, g_teic, Request_accepted);
 	f_validate_gy_cc_report(g_rx_gy, FINAL, (0..1), 0, 0);
 	setverdict(pass);
 }