aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPau Espin Pedrol <pespin@sysmocom.de>2023-10-23 19:54:29 +0200
committerPau Espin Pedrol <pespin@sysmocom.de>2023-10-24 13:51:17 +0200
commit1344e47a59bfae84ef5faba362e3f52cd4b34f08 (patch)
treec5bffc201986abf5a9c09d0fb49417f40b710c1f
parent2c2e1877ecf44dade8692ba77fddbfa7f2c0787e (diff)
GTPv2: Declare GTP2C_Cause as enum
-rw-r--r--library/GTPv2_Templates.ttcn61
-rw-r--r--pgw/PGW_Tests.ttcn12
2 files changed, 47 insertions, 26 deletions
diff --git a/library/GTPv2_Templates.ttcn b/library/GTPv2_Templates.ttcn
index 753774d8..6bd3ba6c 100644
--- a/library/GTPv2_Templates.ttcn
+++ b/library/GTPv2_Templates.ttcn
@@ -147,28 +147,37 @@ template (omit) MSISDN {
/* 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 @@ template (value) Cause ts_GTP2C_Cause(template (value) OCT1 cause,
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 @@ template (present) Cause tr_GTP2C_Cause(template (present) OCT1 cause) := {
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 @@ template (omit) Cause {
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 @@ ts_GTP2C_CreateSessionResp(template (value) FullyQualifiedTEID_List fteids,
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 @@ ts_PDU_GTP2C('00000000'O, '000000'O, '21'O, {
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 @@ tr_PDU_GTP2C(d_teid, seq, {
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 @@ ts_PDU_GTP2C(d_teid, '000000'O, '24'O, {
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 @@ tr_PDU_GTP2C(d_teid, seq, {
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 @@ ts_PDU_GTP2C(d_teid, '000000'O, '25'O, {
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 @@ template (value) PDU_GTPCv2
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 @@ ts_PDU_GTP2C(d_teid, '000000'O, '63'O, {
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 47300400..182147d8 100644
--- a/pgw/PGW_Tests.ttcn
+++ b/pgw/PGW_Tests.ttcn
@@ -610,7 +610,7 @@ private function f_create_session() runs on PGW_Session_CT {
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 @@ private function f_create_session() runs on PGW_Session_CT {
}
/* 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 @@ testcase TC_createSession_ping4_256() runs on PGW_Test_CT {
/* 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 @@ testcase TC_createSession_deleteSession() runs on PGW_Test_CT {
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 @@ private function f_TC_gy_charging_cc_time() runs on PGW_Session_CT {
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);
}