pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/43378?usp=email )
Change subject: smf: Implement PFCP Sess Est and Sess Del procedures ......................................................................
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(-)
Approvals: Jenkins Builder: Verified fixeria: Looks good to me, approved
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