pespin submitted this change.
smf: Implement PFCP Sess Est and Sess Del procedures
With these in place, the following tests now pass:
TC_createSession_deleteSession
f_TC_deleteSession_unknown
TC_s2b_createSession_v4_noapco
TC_s2b_createSession_v4_apco
Change-Id: I661a1893a3f7c3659753c82b009398763a06a92d
---
M library/PFCP_Templates.ttcn
M smf/SMF_Session_CT.ttcn
M smf/SMF_Tests.ttcn
M smf/expected-results.xml
M smf/gen_links.sh
5 files changed, 395 insertions(+), 26 deletions(-)
diff --git a/library/PFCP_Templates.ttcn b/library/PFCP_Templates.ttcn
index eba36da..5857048 100644
--- a/library/PFCP_Templates.ttcn
+++ b/library/PFCP_Templates.ttcn
@@ -190,6 +190,98 @@
spare:= '0'B
}
+/* 8.2.41 Usage Report Trigger */
+template (value) Usage_Report_Trigger
+ts_PFCP_Usage_Report_Trigger(template (value) BIT1 perio := '0'B,
+ template (value) BIT1 volth := '0'B,
+ template (value) BIT1 timth := '0'B,
+ template (value) BIT1 quhti := '0'B,
+ template (value) BIT1 start_ := '0'B,
+ template (value) BIT1 stop_ := '0'B,
+ template (value) BIT1 droth := '0'B,
+ template (value) BIT1 immer := '0'B,
+ template (value) BIT1 volqu := '0'B,
+ template (value) BIT1 timqu := '0'B,
+ template (value) BIT1 liusa := '0'B,
+ template (value) BIT1 termr := '0'B,
+ template (value) BIT1 monit := '0'B,
+ template (value) BIT1 envcl := '0'B,
+ template (value) BIT1 macar := '0'B,
+ template (value) BIT1 eveth := '0'B,
+ template (value) BIT1 evequ := '0'B,
+ template (value) BIT1 tebur := '0'B,
+ template (value) BIT1 ipmjl := '0'B,
+ template (value) BIT1 quvti := '0'B,
+ template (value) BIT1 emrre := '0'B,
+ template (value) BIT1 upint := '0'B) := {
+ elementIdentifier := 63,
+ lengthIndicator := 0, /* overwritten */
+ perio := perio,
+ volth := volth,
+ timth := timth,
+ quhti := quhti,
+ start_ := start_,
+ stop_ := stop_,
+ droth := droth,
+ immer := immer,
+ volqu := volqu,
+ timqu := timqu,
+ liusa := liusa,
+ termr := termr,
+ monit := monit,
+ envcl := envcl,
+ macar := macar,
+ eveth := eveth,
+ evequ := evequ,
+ tebur := tebur,
+ ipmjl := ipmjl,
+ quvti := quvti,
+ emrre := emrre,
+ upint := upint,
+ spare7_7 := '0'B,
+ spare7_8 := '0'B
+}
+
+/* 8.2.45 Duration Measurement */
+template (value) Duration_Measurement
+ts_PFCP_Duration_Measurement(template (value) LIN4_BO_LAST duration) := {
+ elementIdentifier := 67,
+ lengthIndicator := 0, /* overwritten */
+ duration := duration
+}
+
+/* 8.2.52 Start Time */
+template (value) Start_Time
+ts_PFCP_Start_Time(template (value) OCT4 start_time) := {
+ elementIdentifier := 75,
+ lengthIndicator := 0,
+ start_time := start_time
+};
+function f_ts_PFCP_Start_Time_omit(template (omit) OCT4 start_time)
+return template (omit) Start_Time
+{
+ if (isvalue(start_time)) {
+ return ts_PFCP_Start_Time(valueof(start_time))
+ }
+ return omit;
+}
+
+/* 8.2.53 End Time */
+template (value) End_Time
+ts_PFCP_End_Time(template (value) OCT4 end_time) := {
+ elementIdentifier := 76,
+ lengthIndicator := 0,
+ end_time := end_time
+};
+function f_ts_PFCP_End_Time_omit(template (omit) OCT4 end_time)
+return template (omit) End_Time
+{
+ if (isvalue(end_time)) {
+ return ts_PFCP_End_Time(valueof(end_time))
+ }
+ return omit;
+}
+
/* 8.2.65 Recovery Time Stamp */
template (value) Recovery_Time_Stamp
ts_PFCP_Recovery_Timestamp(template (value) LIN4_BO_LAST time_value) := {
@@ -204,6 +296,14 @@
time_value := time_value
};
+/* 8.2.71 UR-SEQN */
+template (value) UR_SEQN
+ts_UR_SEQN(template (value) LIN4_BO_LAST ur_seqn) := {
+ elementIdentifier := 104,
+ lengthIndicator := 0, /* overwritten */
+ ur_seqn := ur_seqn
+}
+
template (value) PDU_PFCP ts_PDU_PFCP_ := {
s_flag := '0'B,
mp := '0'B,
@@ -1110,10 +1210,12 @@
}
/* 7.5.7 PFCP Session Deletion Response */
+
template (value) PDU_PFCP
ts_PFCP_Session_Del_Resp(template (value) LIN3_BO_LAST seq_nr,
template (value) OCT8 seid,
- template (value) Cause cause := ts_PFCP_Cause(REQUEST_ACCEPTED))
+ template (value) Cause cause := ts_PFCP_Cause(REQUEST_ACCEPTED),
+ template (omit) Usage_Report_Deletion_Response_list usage_report := omit)
modifies ts_PDU_PFCP_ := {
seid := seid,
sequence_number := seq_nr,
@@ -1123,13 +1225,14 @@
offending_IE := omit,
load_control_information := omit,
overload_control_information := omit,
- usage_report := omit
+ usage_report := usage_report
}
}
}
template (present) PDU_PFCP
tr_PFCP_Session_Del_Resp(template (present) OCT8 seid,
- template (present) Cause cause := tr_PFCP_Cause(REQUEST_ACCEPTED))
+ template (present) Cause cause := tr_PFCP_Cause(REQUEST_ACCEPTED),
+ template Usage_Report_Deletion_Response_list usage_report := *)
modifies tr_PDU_PFCP_ := {
seid := seid,
message_body := {
@@ -1138,9 +1241,37 @@
offending_IE := *,
load_control_information := *,
overload_control_information := *,
- usage_report := *
+ usage_report := usage_report
}
}
}
+/* 7.5.7.2 Usage Report IE within PFCP Session Deletion Response */
+template (value) Usage_Report_Deletion_Response
+ts_Usage_Report_Deletion_Response(template (value) URR_ID urr_id,
+ template (value) LIN4_BO_LAST ur_seqn,
+ template (value) Usage_Report_Trigger usage_report_trigger,
+ template (omit) Start_Time start_time := omit,
+ template (omit) End_Time end_time := omit,
+ template (omit) Volume_Measurement volume_measurement := omit,
+ template (omit) Duration_Measurement duration_measurement := omit,
+ template (omit) Time_of_First_Packet time_of_first_packet := omit,
+ template (omit) Time_of_Last_Packet time_of_last_packet := omit,
+ template (omit) Usage_Information usage_information := omit) := {
+ elementIdentifier := 79,
+ lengthIndicator := 0,
+ grouped_ie := {
+ urr_id := urr_id,
+ ur_seqn := ts_UR_SEQN(ur_seqn),
+ usage_report_trigger := usage_report_trigger,
+ start_time := start_time,
+ end_time := end_time,
+ volume_measurement := volume_measurement,
+ duration_measurement := duration_measurement,
+ time_of_first_packet := time_of_first_packet,
+ time_of_last_packet := time_of_last_packet,
+ usage_information := usage_information
+ }
+}
+
}
diff --git a/smf/SMF_Session_CT.ttcn b/smf/SMF_Session_CT.ttcn
index 9c5024b..363114c 100644
--- a/smf/SMF_Session_CT.ttcn
+++ b/smf/SMF_Session_CT.ttcn
@@ -1,6 +1,7 @@
module SMF_Session_CT {
import from TCCEncoding_Functions all;
+import from TCCDateTime_Functions all;
import from General_Types all;
import from Osmocom_Types all;
@@ -15,7 +16,6 @@
import from DNS_Helpers all;
-
import from DIAMETER_Types all;
import from DIAMETER_Templates all;
import from DIAMETER_ts29_212_Templates all;
@@ -24,14 +24,25 @@
import from DIAMETER_ts32_299_Templates all;
import from DIAMETER_Emulation all;
+import from PFCP_Types all;
+import from PFCP_Emulation all;
+import from PFCP_Templates all;
+import from PFCP_CodecPort all;
+
+import from NTP_Functions all;
+
+import from Mutex all;
+
import from SMF_Tests all;
const integer DIA_Gx := 0;
const integer DIA_Gy := 1;
const integer DIA_S6b := 2;
+const OCT8 c_SEID0 := '0000000000000000'O;
+
/* per-session component; we typically have 1..N per testcase */
-type component SMF_Session_CT extends GTP2_ConnHdlr, GTP1U_ConnHdlr, DIAMETER_ConnHdlr {
+type component SMF_Session_CT extends GTP2_ConnHdlr, GTP1U_ConnHdlr, DIAMETER_ConnHdlr, PFCP_ConnHdlr, MutexCT {
var SessionPars g_pars;
/* GTP-U IPv4 address remote sie */
@@ -64,6 +75,77 @@
DIAMETER_Resultcode cca_res_code
};
+type record FTeids {
+ F_TEID local,
+ F_TEID remote optional
+}
+template (value) FTeids t_FTeids(template (value) F_TEID local,
+ template (omit) F_TEID remote) := {
+ local := local,
+ remote := remote
+}
+
+/* 'local' and 'remote' refer to the GTP information from the UPF's point of view:
+ * HNB UPF CN
+ * access.remote <---> access.local | core.local <---> core.remote
+ */
+type record Gtp1uParameters {
+ FTeids core,
+ FTeids access
+}
+template (value) Gtp1uParameters
+t_Gtp1uParameters_default(uint32_t idx := 1,
+ charstring mp_pfcp_ip_local) := {
+ core := {
+ local := ts_PFCP_F_TEID_ipv4(int2oct(idx + 8192, 4),
+ f_inet_addr(mp_pfcp_ip_local)),
+ remote := omit
+ },
+ access := {
+ local := ts_PFCP_F_TEID_ipv4(int2oct(idx, 4),
+ f_inet_addr(mp_pfcp_ip_local)),
+ remote := omit
+ }
+}
+
+type record Session_URR {
+ URR_ID urr_id,
+ integer ur_seqn,
+ integer start_time /* In system clock, call */
+}
+type record of Session_URR Session_URR_List;
+template (value) Session_URR
+ts_Session_URR(template (value) URR_ID urr_id, integer start_time) := {
+ urr_id := urr_id,
+ ur_seqn := 0,
+ start_time := start_time
+}
+type record PfcpParameters {
+ charstring pfcp_local_addr,
+ Node_ID local_node_id,
+ F_SEID local_f_seid,
+ F_SEID remote_cp_f_seid optional,
+ Session_URR_List urr_list optional,
+ Gtp1uParameters gtp1u_pars
+}
+
+
+function f_t_PfcpParams(uint32_t idx := 1,
+ charstring pfcp_local_addr := mp_pfcp_ip_local,
+ template (value) Node_ID local_node_id := ts_PFCP_Node_ID_ipv4(f_inet_addr(mp_pfcp_ip_local)))
+return PfcpParameters {
+ var uint64_t local_f_seid := idx;
+ var template (value) PfcpParameters pfcp_pars := {
+ pfcp_local_addr := pfcp_local_addr,
+ local_node_id := local_node_id,
+ local_f_seid := ts_PFCP_F_SEID_ipv4(f_inet_addr(pfcp_local_addr), int2oct(local_f_seid, 8)),
+ remote_cp_f_seid := omit,
+ urr_list := omit,
+ gtp1u_pars := t_Gtp1uParameters_default(idx, pfcp_local_addr)
+ }
+ return valueof(pfcp_pars);
+}
+
/* configuration data for a given Session */
type record SessionPars {
hexstring imsi,
@@ -88,7 +170,9 @@
/* Bearer Contexts to be created */
BearerConfig bearer optional,
- SessionParsGy gy
+ SessionParsGy gy,
+
+ PfcpParameters pfcp_pars
}
template (value) SessionPars
@@ -97,7 +181,8 @@
GTP2C_RAT_Type rat_type := GTP2C_RAT_EUTRAN,
charstring apn := "internet",
boolean selection_mode := false,
- GTP2C_PDN_Type pdn_type := GTP2C_PDN_IPv4) := {
+ GTP2C_PDN_Type pdn_type := GTP2C_PDN_IPv4,
+ template (value) PfcpParameters pfcp_pars := f_t_PfcpParams(1)) := {
imsi := imsi,
msisdn := msisdn,
rat_type := rat_type,
@@ -116,7 +201,8 @@
gy := {
validity_time := 0,
cca_res_code := DIAMETER_SUCCESS
- }
+ },
+ pfcp_pars := pfcp_pars
}
@@ -305,6 +391,19 @@
apco := apco);
g2c.gtpcv2_pdu.createSessionRequest.servingNetwork := ts_GTP2C_ServingNetwork('001'H, '01F'H);
+ /////////// START MUTUAL EXCLUSION ZONE ////////////
+ /* This code block cannot be executed by more than one component at a time because
+ * the RANAP RAB Ass Request triggers the IUT to send PFCP Session Establishment
+ * Request PDU(s), which needs to be routed to the respective ConnHdlr component (us).
+ * As per 3GPP TS 29.244, section 7.2.2.4.2, these PFCP PDUs shall all have SEID=0,
+ * so that the PFCPEM component cannot route them unambiguously. This is why we
+ * need to ensure that only one ConnHdlr is triggering PFCP session establishment
+ * at the given moment of time. */
+ f_Mutex_lock(__BFILE__, __LINE__);
+ /* Subscribe for PFCP Session Establishment Request PDU(s), which are
+ * expected to have SEID set to 0, as per 3GPP TS 29.244, section 7.2.2.4.2. */
+ f_PFCPEM_subscribe_seid(c_SEID0);
+
GTP2.send(g2c);
if (do_s6b and DIAMETER[DIA_S6b].checkstate("Connected")) {
as_DIA_S6b_AAR();
@@ -316,6 +415,18 @@
if (DIAMETER[DIA_Gy].checkstate("Connected")) {
as_DIA_Gy_CCR(INITIAL_REQUEST);
}
+
+ /* Expect PFCP Session Establishment Request. */
+ as_pfcp_sess_est_req();
+ /* Ask PFCPEM to route PDUs with to be indicated F-SEID to us. */
+ f_PFCPEM_subscribe_seid(g_pars.pfcp_pars.local_f_seid.seid);
+ /* We're done establishing PFCP sessions, so at this point we no longer expect to
+ * receive Session Establishment Request PDUs with SEID=0. Unregister and unlock
+ * the mutex, enabling other components to establish PFCP sessions after us. */
+ f_PFCPEM_unsubscribe_seid(c_SEID0);
+ f_Mutex_unlock(__BFILE__, __LINE__);
+ /////////// END MUTUAL EXCLUSION ZONE ////////////
+
alt {
[] GTP2.receive(tr_GTP2C_CreateSessionResp(d_teid := g_pars.teic_local,
cause := Request_accepted,
@@ -422,6 +533,7 @@
/* delete the session from the SMF */
function f_delete_session(template (omit) GTP2C_Cause tx_cause := omit,
template (present) GTP2C_Cause exp_cause,
+ boolean expect_pfcp := true,
boolean expect_diameter := true) runs on SMF_Session_CT {
var template (value) FullyQualifiedTEID fteid_c_ie
fteid_c_ie := ts_GTP2C_FTEID(FTEID_IF_S5S8_SGW_GTPC, g_pars.teic_local, 0,
@@ -432,6 +544,11 @@
teid_list := {}, bearer_id := g_pars.bearer.ebi);
GTP2.send(g2c);
+
+ if (expect_pfcp) {
+ as_pfcp_sess_del_req();
+ }
+
if (DIAMETER[DIA_Gx].checkstate("Connected") and expect_diameter) {
as_DIA_Gx_CCR(TERMINATION_REQUEST);
}
@@ -453,4 +570,125 @@
}
}
+/*******
+ * PFCP
+ *******/
+
+private function f_End_Time_now()
+return End_Time {
+ return valueof(ts_PFCP_End_Time(int2oct(f_time_ntp32_now(), 4)));
+}
+
+private function f_Session_URR_Start_Time(Session_URR urr)
+return Start_Time {
+ return valueof(ts_PFCP_Start_Time(int2oct(f_time_to_ntp32(urr.start_time), 4)));
+}
+
+private function f_Session_URR_Duration_Measurement(Session_URR urr)
+return Duration_Measurement {
+ return valueof(ts_PFCP_Duration_Measurement(f_time() - urr.start_time));
+}
+
+private function f_Session_URR_Usage_Report_Deletion_Response(Session_URR urr)
+return Usage_Report_Deletion_Response {
+ var template (value) Usage_Report_Deletion_Response usage_report;
+ usage_report:= ts_Usage_Report_Deletion_Response(urr.urr_id,
+ urr.ur_seqn,
+ ts_PFCP_Usage_Report_Trigger(termr := '1'B),
+ start_time := f_Session_URR_Start_Time(urr),
+ end_time := f_End_Time_now());
+ return valueof(usage_report);
+}
+
+function f_pfcp_expect(template (present) PDU_PFCP exp_rx, float wait_time := 5.0) runs on SMF_Session_CT return PDU_PFCP
+{
+ var PDU_PFCP rx;
+ timer T := wait_time;
+ T.start;
+ alt {
+ [] PFCP.receive(exp_rx) -> value rx {
+ setverdict(pass);
+ }
+ [] PFCP.receive(PDU_PFCP:?) {
+ setverdict(fail, "Got an unexpected PFCP message, was waiting for ", exp_rx);
+ mtc.stop;
+ }
+ [] T.timeout {
+ setverdict(fail, "Timeout waiting for PFCP ", exp_rx);
+ mtc.stop;
+ }
+ }
+ T.stop;
+ return rx;
+}
+
+private altstep as_pfcp_sess_est_req()
+runs on SMF_Session_CT {
+ var PDU_PFCP req;
+ [] PFCP.receive(tr_PFCP_Session_Est_Req()) -> value req {
+ f_pfcp_sess_est_resp(req);
+ }
+}
+
+function f_pfcp_sess_est_resp(PDU_PFCP req) runs on SMF_Session_CT {
+ var template PDU_PFCP resp;
+ var PFCP_Session_Establishment_Response.created_PDR_list pdrs := {};
+ var PFCP_Session_Establishment_Request serq := req.message_body.pfcp_session_establishment_request;
+
+ /* Store peer's F-SEID for later: */
+ g_pars.pfcp_pars.remote_cp_f_seid := serq.CP_F_SEID;
+
+ var integer now := f_time();
+ for (var integer i := 0; i < lengthof(serq.create_URR_list); i := i + 1) {
+ g_pars.pfcp_pars.urr_list[i] := valueof(ts_Session_URR(serq.create_URR_list[i].grouped_ie.urr_id,
+ now));
+ }
+
+
+ /* Acting as UPF, invent a new PFCP SEID to send to the peer. Respond to the Session Establishment.
+ * The PFCP response must have the same sequence_number as the request. */
+ var Gtp1uParameters gtp1_pars := g_pars.pfcp_pars.gtp1u_pars;
+ /* Core N6: */
+ pdrs := pdrs & { valueof(ts_PFCP_Created_PDR(pdr_id := serq.create_PDR_list[0].grouped_ie.pdr_id,
+ local_F_TEID := gtp1_pars.core.local)) };
+ /* Access N3: */
+ pdrs := pdrs & { valueof(ts_PFCP_Created_PDR(pdr_id := serq.create_PDR_list[1].grouped_ie.pdr_id,
+ local_F_TEID := gtp1_pars.access.local)) };
+ /* CP Function: */
+ pdrs := pdrs & { valueof(ts_PFCP_Created_PDR(pdr_id := serq.create_PDR_list[2].grouped_ie.pdr_id,
+ local_F_TEID := gtp1_pars.core.local)) };
+ /* Set UE-to-CP Flow-Description: */
+ pdrs := pdrs & { valueof(ts_PFCP_Created_PDR(pdr_id := serq.create_PDR_list[3].grouped_ie.pdr_id,
+ local_F_TEID := gtp1_pars.access.local)) };
+
+ resp := ts_PFCP_Session_Est_Resp(seq_nr := req.sequence_number,
+ node_id := g_pars.pfcp_pars.local_node_id,
+ seid := g_pars.pfcp_pars.remote_cp_f_seid.seid,
+ f_seid := g_pars.pfcp_pars.local_f_seid,
+ created_pdr := pdrs);
+ PFCP.send(resp);
+}
+
+private altstep as_pfcp_sess_del_req(template (value) PFCP_Types.Cause resp_cause := ts_PFCP_Cause(REQUEST_ACCEPTED))
+runs on SMF_Session_CT {
+ var PDU_PFCP req;
+ [] PFCP.receive(tr_PFCP_Session_Del_Req(g_pars.pfcp_pars.local_f_seid.seid)) -> value req {
+ f_pfcp_sess_del_resp(req, resp_cause);
+ }
+}
+
+private function f_pfcp_sess_del_resp(PDU_PFCP req,
+ template (value) PFCP_Types.Cause resp_cause := ts_PFCP_Cause(REQUEST_ACCEPTED))
+runs on SMF_Session_CT {
+ var template (present) PDU_PFCP resp;
+ var template (omit) Usage_Report_Deletion_Response_list usage_reports := omit;
+
+ for(var integer i := 0; i < lengthof(g_pars.pfcp_pars.urr_list); i := i +1) {
+ var Session_URR urr := g_pars.pfcp_pars.urr_list[i];
+ usage_reports[i] := f_Session_URR_Usage_Report_Deletion_Response(urr);
+ }
+ resp := ts_PFCP_Session_Del_Resp(req.sequence_number, g_pars.pfcp_pars.remote_cp_f_seid.seid, resp_cause, usage_report := usage_reports)
+ PFCP.send(resp);
+}
+
}
diff --git a/smf/SMF_Tests.ttcn b/smf/SMF_Tests.ttcn
index c94e851..97d4315 100644
--- a/smf/SMF_Tests.ttcn
+++ b/smf/SMF_Tests.ttcn
@@ -28,6 +28,7 @@
import from PFCP_Templates all;
import from PFCP_CodecPort all;
+import from Mutex all;
import from SMF_Session_CT all;
modulepar {
@@ -73,6 +74,7 @@
/* emulated UPF */
var PFCP_Emulation_CT vc_PFCP;
+ var MutexDispCT vc_mutex_disp;
var boolean g_pfcp_answer_heartbeat_req := true;
/* global test case guard timer (actual timeout value is set in f_init()) */
@@ -195,6 +197,8 @@
function f_init_pfcp(charstring id) runs on SMF_Test_CT {
id := id & "-PFCP";
+ vc_mutex_disp := f_MutexDisp_start();
+
var PFCP_Emulation_Cfg pfcp_cfg := {
pfcp_bind_ip := mp_pfcp_ip_local,
pfcp_bind_port := PFCP_PORT,
@@ -211,7 +215,8 @@
connect(self:PFCP, vc_PFCP:CLIENT);
connect(self:PFCP_PROC, vc_PFCP:CLIENT_PROC);
f_pfcp_force_assoc_setup_req(ts_PFCP_Node_ID_ipv4(f_inet_addr(mp_pfcp_ip_local)),
- fail_timeout := true);
+ fail_timeout := true,
+ up_function_features := ts_PFCP_UP_Function_Features(ftup := '1'B));
disconnect(self:PFCP, vc_PFCP:CLIENT);
disconnect(self:PFCP_PROC, vc_PFCP:CLIENT_PROC);
@@ -250,6 +255,10 @@
connect(vc_conn:GTP1U[0], vc_GTP1U:CLIENT);
connect(vc_conn:GTP1U_PROC[0], vc_GTP1U:CLIENT_PROC);
+ connect(vc_conn:PFCP, vc_PFCP:CLIENT);
+ connect(vc_conn:PFCP_PROC, vc_PFCP:CLIENT_PROC);
+ f_MutexDisp_connect(vc_mutex_disp, vc_conn);
+
if (isbound(vc_Gx)) {
connect(vc_conn:DIAMETER_PROC[DIA_Gx], vc_Gx:DIAMETER_PROC);
connect(vc_conn:DIAMETER[DIA_Gx], vc_Gx:DIAMETER_CLIENT);
@@ -287,20 +296,6 @@
}
}
-/* create a session, expect it to succeed */
-private function f_TC_createSession() runs on SMF_Session_CT {
- f_s5s8_create_session();
- setverdict(pass);
-}
-testcase TC_createSession() runs on SMF_Test_CT {
- var SMF_Session_CT vc_conn;
- var SessionPars pars := valueof(t_SessionPars('001010123456789'H,
- pdn_type := GTP2C_PDN_IPv4));
- f_init();
- vc_conn := f_start_handler(refers(f_TC_createSession), pars);
- vc_conn.done;
-}
-
/* create a session, then delete it again */
private function f_TC_createSession_deleteSession() runs on SMF_Session_CT {
f_s5s8_create_session();
@@ -318,7 +313,7 @@
/* send a DeleteSessionReq for an unknown/invalid TEID */
private function f_TC_deleteSession_unknown() runs on SMF_Session_CT {
g_pars.teic_remote := f_rnd_octstring(4);
- f_delete_session(omit, Context_Not_Found, false);
+ f_delete_session(omit, Context_Not_Found, false, false);
setverdict(pass);
}
testcase TC_deleteSession_unknown() runs on SMF_Test_CT {
@@ -395,7 +390,6 @@
control {
execute( TC_tx_echo() );
- execute( TC_createSession() );
execute( TC_createSession_deleteSession() );
execute( TC_deleteSession_unknown() );
execute( TC_gy_ccr_update_rejected() );
diff --git a/smf/expected-results.xml b/smf/expected-results.xml
index fc32e75..32dd281 100644
--- a/smf/expected-results.xml
+++ b/smf/expected-results.xml
@@ -1,4 +1,9 @@
<?xml version="1.0"?>
<testsuite name='Titan' tests='1' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='SMF_Tests' name='TC_tx_echo' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_createSession_deleteSession' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_deleteSession_unknown' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_gy_ccr_update_rejected' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_s2b_createSession_v4_noapco' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_s2b_createSession_v4_apco' time='MASKED'/>
</testsuite>
diff --git a/smf/gen_links.sh b/smf/gen_links.sh
index 3b4fe2a..f8a3166 100755
--- a/smf/gen_links.sh
+++ b/smf/gen_links.sh
@@ -69,6 +69,7 @@
FILES+="DIAMETER_Templates.ttcn DIAMETER_rfc4004_Templates.ttcn DIAMETER_rfc5447_Templates.ttcn DIAMETER_ts29_212_Templates.ttcn DIAMETER_ts29_212_Templates.ttcn DIAMETER_ts29_229_Templates.ttcn DIAMETER_ts29_272_Templates.ttcn DIAMETER_ts29_273_Templates.ttcn DIAMETER_ts32_299_Templates.ttcn "
FILES+="SCTP_Templates.ttcn "
FILES+="NTP_Functions.ttcn PFCP_Templates.ttcn PFCP_CodecPort.ttcn PFCP_CodecPort_CtrlFunct.ttcn PFCP_CodecPort_CtrlFunctDef.cc PFCP_Emulation.ttcn "
+FILES+="Mutex.ttcn "
gen_links $DIR $FILES
gen_links_finish
To view, visit change 43378. To unsubscribe, or for help writing mail filters, visit settings.