pespin has uploaded this change for review.

View Change

WIP: smf: Introduce test TC_pfcp_heartbeat_recovery_timestamp

Change-Id: I15ad5c295fc47ed9f38b91b6392b674bd0b4c4d7
---
M smf/SMF_Session_CT.ttcn
M smf/SMF_Tests.ttcn
M smf/expected-results.xml
3 files changed, 79 insertions(+), 4 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/80/43880/1
diff --git a/smf/SMF_Session_CT.ttcn b/smf/SMF_Session_CT.ttcn
index bb617cb..6de76b2 100644
--- a/smf/SMF_Session_CT.ttcn
+++ b/smf/SMF_Session_CT.ttcn
@@ -392,11 +392,12 @@
return rx;
}

-function f_Session_tr_PFCP_Session_Est_Req() runs on SMF_Session_CT return template (present) PDU_PFCP
+function f_Session_tr_PFCP_Session_Est_Req(boolean exp_sess_restoration := false) runs on SMF_Session_CT return template (present) PDU_PFCP
{
var template (present) Create_PDR_list create_pdr := ?;
var template (present) Create_FAR_list create_far := ?;
var template Create_URR_list create_urr := *;
+ var template PFCPSEReq_Flags pfcpSEReq_flags := *;

if (g_pars.pfcp_pars.pdn_type == c_PFCP_PDN_Type_IPv6 or
g_pars.pfcp_pars.pdn_type == c_PFCP_PDN_Type_IPv4v6) {
@@ -435,17 +436,39 @@
};
}

+ if (exp_sess_restoration) {
+ pfcpSEReq_flags := tr_PFCPSEReq_Flags(resti := '1'B);
+ }
+
return tr_PFCP_Session_Est_Req(create_pdr := create_pdr,
create_far := create_far,
create_urr := create_urr,
- pdn_type := tr_PFCP_PDN_Type(g_pars.pfcp_pars.pdn_type));
+ pdn_type := tr_PFCP_PDN_Type(g_pars.pfcp_pars.pdn_type),
+ pfcpSEReq_flags := pfcpSEReq_flags);
}

-altstep as_pfcp_sess_est_req()
+altstep as_pfcp_sess_est_req(boolean exp_sess_restoration := false)
runs on SMF_Session_CT {
- var template (present) PDU_PFCP exp_req := f_Session_tr_PFCP_Session_Est_Req();
+ var template (present) PDU_PFCP exp_req := f_Session_tr_PFCP_Session_Est_Req(exp_sess_restoration := exp_sess_restoration);
var PDU_PFCP req;
[] PFCP.receive(exp_req) -> value req {
+ var PFCP_Session_Establishment_Request serq := req.message_body.pfcp_session_establishment_request;
+ if (exp_sess_restoration) {
+ /* "NOTE 4: The UP function shall accept the CP function allocated GTP-U
+ * F-TEID and/or UE IP address in the PFCP Session Establishment Request
+ * message with the RESTI flag set to "1", if the requested GTP-U F-TEID
+ * and/or UE IP address are available." */
+ for (var integer i := 0; i < lengthof(serq.create_PDR_list); i := i + 1) {
+ var template (present) Create_PDR exp_pdr;
+ exp_pdr := tr_PFCP_Create_PDR(pdr_id := i + 1,
+ pdi := tr_PFCP_PDI(src_iface := (tr_PFCP_PDI(ACCESS), tr_PFCP_PDI(CORE), tr_PFCP_PDI(CP_FUNCTION)),
+ local_F_TEID := ?));
+ if (not match(serq.create_PDR_list[i], exp_pdr)){
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("Got CreatePDR ", req.create_PDR_list[i], " vs exp ", exp_pdr));
+ }
+ }
+ }
f_pfcp_sess_est_resp(req);
}
}
diff --git a/smf/SMF_Tests.ttcn b/smf/SMF_Tests.ttcn
index 9afb1d7..f695b08 100644
--- a/smf/SMF_Tests.ttcn
+++ b/smf/SMF_Tests.ttcn
@@ -625,6 +625,56 @@
}


+/* Validate IUT detects PFCP Heartbeat Recovery Timestamp change and recovers from it restoring
+ * existing subscriber connections: */
+private function f_TC_pfcp_heartbeat_recovery_timestamp() runs on SMF_Session_CT {
+ var PDU_PFCP m;
+ var integer rts := f_PFCPEM_get_recovery_timestamp();
+
+ f_prometheus_expect(valueof(t_Metrics_Expect(1, 0)), wait_converge := true);
+
+ f_PFCPEM_subscribe_bcast();
+ as_pfcp_handle_heartbeat_req(rts);
+
+ f_s5s8_create_session();
+ f_prometheus_expect(valueof(t_Metrics_Expect(1, 1)), wait_converge := true);
+
+ rts := rts + 1;
+ as_pfcp_handle_heartbeat_req(rts);
+ activate(as_pfcp_handle_heartbeat_req(rts, do_repeat := true));
+
+ /* Wait for IUT to detect during rx of Heartbeat Response that peer restarted, ie. wait for a
+ * 2nd ASSOC SETUP REQ after Heartbeat timeout: */
+ PFCP.receive(tr_PFCP_Assoc_Setup_Req()) -> value m;
+
+ f_prometheus_expect(valueof(t_Metrics_Expect(0, 1)), wait_converge := true);
+ PFCP.send(ts_PFCP_Assoc_Setup_Resp(m.sequence_number,
+ ts_PFCP_Node_ID_ipv4(f_inet_addr(mp_pfcp_ip_local)),
+ ts_PFCP_Cause(REQUEST_ACCEPTED),
+ rts,
+ up_function_features := ts_PFCP_UP_Function_Features(ftup := '1'B,
+ vtime := '1'B)));
+
+ /* IUT restores existing subscriber connections */
+ as_pfcp_sess_est_req(exp_sess_restoration := true);
+ /* 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);
+
+ f_sleep(3.0);
+ f_s5s8_delete_session(omit, Request_accepted);
+
+ setverdict(pass);
+}
+testcase TC_pfcp_heartbeat_recovery_timestamp() runs on SMF_Test_CT {
+ var SMF_Session_CT vc_conn;
+ var SessionPars pars := f_SessionPars(800);
+ g_pfcp_answer_heartbeat_req := false;
+ f_init(guard_timeout := 60.0);
+ vc_conn := f_start_handler(refers(f_TC_pfcp_heartbeat_recovery_timestamp), pars);
+ vc_conn.done;
+ f_shutdown();
+}
+
/* create an IPv4 session from 5G AMF, then delete it again */
private function f_TC_n11_createSession_deleteSession() runs on SMF_Session_CT {
var PrometheusExpects expects0 := valueof({
@@ -727,6 +777,7 @@
execute( TC_s2b_createSession_v4_apco() );

execute( TC_pfcp_heartbeat_timeout() );
+ execute( TC_pfcp_heartbeat_recovery_timestamp() );

execute( TC_n11_createSession_deleteSession() );
execute( TC_n11_createSession_deleteSession_ipv6() );
diff --git a/smf/expected-results.xml b/smf/expected-results.xml
index 1deaf2c..aab8202 100644
--- a/smf/expected-results.xml
+++ b/smf/expected-results.xml
@@ -13,6 +13,7 @@
<testcase classname='SMF_Tests' name='TC_s2b_createSession_v4_noapco' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_s2b_createSession_v4_apco' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_pfcp_heartbeat_timeout' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_pfcp_heartbeat_recovery_timestamp' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_n11_createSession_deleteSession' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_n11_createSession_deleteSession_ipv6' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_n11_createSession_deleteSession_ipv4v6' time='MASKED'/>

To view, visit change 43880. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I15ad5c295fc47ed9f38b91b6392b674bd0b4c4d7
Gerrit-Change-Number: 43880
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>