pespin has uploaded this change for review.

View Change

smf: Introduce test TC_5g_pfcp_heartbeat_timeout

Change-Id: Id1db247658aa11e10626357fbb47616ba425fb7f
---
M smf/SMF_Session_CT_5G.ttcn
M smf/SMF_Tests.ttcn
M smf/expected-results.xml
3 files changed, 173 insertions(+), 5 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/05/43905/1
diff --git a/smf/SMF_Session_CT_5G.ttcn b/smf/SMF_Session_CT_5G.ttcn
index ab35f03..a3a64f0 100644
--- a/smf/SMF_Session_CT_5G.ttcn
+++ b/smf/SMF_Session_CT_5G.ttcn
@@ -354,7 +354,57 @@
setverdict(pass);
}

-/* 3GPP TS 29.502 5.2.2.4 Release SM Context service operation */
+/* 3GPP TS 23.502 4.3.7 CN-initiated selective deactivation of UP connection of an existing PDU Session (step 9)
+ * 3GPP TS 23.502 Figure 4.3.4.2-1 step 7a */
+function f_n11_update_sm_context_pdu_sess_release_ngap()
+runs on SMF_Session_CT {
+ var template (value) SmContextUpdateData sm_ctx_update;
+ var template (value) octetstring body_enc;
+ var integer http2_stream_id := 3;
+ var HTTP2_Msg http2_tx;
+ var HTTP2_Msg http2_rx;
+
+ sm_ctx_update := ts_SmContextUpdateData(ueLocation := f_ts_UserLocation(),
+ n2SmInfo := TS29502_Nsmf_PDUSession_Templates.ts_RefToBinaryData("ngap-sm"),
+ n2SmInfoType := ts_N2SmInfoType(PDU_RES_REL_RSP));
+ var octetstring ngap_enc := enc_NGAP_PDUSessionResourceReleaseResponseTransfer(valueof(m_pDUSessionResourceReleaseResponseTransfer()));
+
+ http2_tx := f_n11_prepare_update_sm_context(valueof(sm_ctx_update), ngap_enc, omit);
+
+ f_http2_adapter_connect(mp_smf_hostname, mp_smf_sbi_port, mp_amf_local_ip, idx := http2_tx.conn_id);
+ f_http2_adapter_send(http2_tx);
+
+ /* Successful answer with no content: */
+ as_http2_adapter_receive(http2_rx, tr_HTTP2_Msg_204_No_Content(), idx := http2_tx.conn_id);
+ f_http2_adapter_close(idx := http2_tx.conn_id);
+ setverdict(pass);
+}
+
+function f_n11_update_sm_context_pdu_sess_release_ngnas()
+runs on SMF_Session_CT {
+ var template (value) SmContextUpdateData sm_ctx_update;
+ var template (value) octetstring body_enc;
+ var integer http2_stream_id := 3;
+ var HTTP2_Msg http2_tx;
+ var HTTP2_Msg http2_rx;
+
+ sm_ctx_update := ts_SmContextUpdateData(ueLocation := f_ts_UserLocation(),
+ n1SmMsg := TS29502_Nsmf_PDUSession_Templates.ts_RefToBinaryData("5gnas-sm"));
+ var octetstring ngnas_enc := f_ng_nas_gen_session_release_complete();
+
+ http2_tx := f_n11_prepare_update_sm_context(valueof(sm_ctx_update), omit, ngnas_enc);
+
+ f_http2_adapter_connect(mp_smf_hostname, mp_smf_sbi_port, mp_amf_local_ip, idx := http2_tx.conn_id);
+ f_http2_adapter_send(http2_tx);
+
+ /* Successful answer with no content: */
+ as_http2_adapter_receive(http2_rx, tr_HTTP2_Msg_204_No_Content(), idx := http2_tx.conn_id);
+ f_http2_adapter_close(idx := http2_tx.conn_id);
+ setverdict(pass);
+}
+
+/* 3GPP TS 29.502 5.2.2.4 Release SM Context service operation
+ * 3GPP TS 23.502 Figure 4.3.4.2-1 step 10a */
private function f_n11_prepare_release_sm_context(SmContextReleaseData sm_ctx_rel,
template (omit) octetstring ngap_enc := omit)
runs on SMF_Session_CT return HTTP2_Msg {
@@ -524,6 +574,48 @@
}
}

+/* 5.2.2.3.1 N1N2MessageTransfer, PDU Session release (see clause 4.3.4 of TS 3GPP 23.502)
+ * 3GPP TS 23.502 4.3.7 CN-initiated selective deactivation of UP connection of an existing PDU Session */
+altstep as_namf_comm_post_n1n2_messages_pdu_sess_release_command()
+runs on SMF_Session_CT {
+ var HTTP2_Msg http2_rx;
+ var HTTP2_multipart_part_list parts;
+ [] as_namf_comm_post_n1n2_messages(http2_rx, parts) {
+ var N1N2MessageTransferReqData n1n2msg_req;
+ var NGAP_IEs.PDUSessionResourceReleaseCommandTransfer rel_cmd_transf;
+ var template (value) N1N2MessageTransferRspData n1n2msg_rsp;
+ var NG_NAS_DL_SM_Message_Type dl_nas;
+ var template (value) HTTP2_Msg http2_tx;
+ var octetstring body_enc;
+
+ /* Decode 1st part: SBI json: */
+ f_dec_N1N2MessageTransferReqData(parts[0].data, n1n2msg_req); // TODO: check returned integer.
+
+ /* Decode 2nd part: NG-NAS: */
+ dl_nas := dec_NG_NAS_DL_SM_Message_Type(parts[1].data);
+ //f_ng_nas_handle_session_release_command(dl_nas);
+
+ /* Decode 3rd part: NGAP: 3GPP TS 24.501 8.3.14 */
+ rel_cmd_transf := dec_NGAP_PDUSessionResourceReleaseCommandTransfer(parts[2].data);
+ //f_ngap_pdu_handle_PDUSessionResourceReleaseCommandTransfer(rel_cmd_transf);
+
+ /* Tx answer: */
+ n1n2msg_rsp := ts_N1N2MessageTransferRspData(cause := ts_N1N2MessageTransferCause(N1_N2_TRANSFER_INITIATED))
+ body_enc := f_enc_N1N2MessageTransferRspData(valueof(n1n2msg_rsp));
+
+ http2_tx := ts_HTTP2_Msg_200_OK(http2_rx.conn_id,
+ http2_rx.stream_id,
+ headers := {
+ ts_HTTP2_Hdr_content_type("application/json; charset=utf-8")
+ },
+ body := ts_HTTP2_Data_frame(http2_rx.stream_id,
+ end_stream_flag := true,
+ data := body_enc));
+ HTTP2_CONN[HTTP2_CONN_SCP].send(http2_tx);
+ setverdict(pass);
+ }
+}
+
/************************************************
* N10 Nudm (SBI): Emulated UDM, 3GPP TS 29.503
************************************************/
@@ -642,7 +734,7 @@
}

/* 3GPP TS 29.503 5.3.2.4.4 SMF deregistration */
-private altstep as_nudm_uecm_delete_IndividualSmfRegistration()
+altstep as_nudm_uecm_delete_IndividualSmfRegistration()
runs on SMF_Session_CT {
var HTTP2_Msg http2_rx;
[] HTTP2_CONN[HTTP2_CONN_SCP].receive(f_tr_Nudm_UECM_delete_IndividualSmfRegistration()) -> value http2_rx {
@@ -793,7 +885,7 @@
}

/* 3GPP TS 29.503 5.2.2.3.2 Subscription to notifications of data change */
-private altstep as_nudm_sdm_delete_IndividualSubscription()
+altstep as_nudm_sdm_delete_IndividualSubscription()
runs on SMF_Session_CT {
var HTTP2_Msg http2_rx;
[] HTTP2_CONN[HTTP2_CONN_SCP].receive(f_tr_Nudm_SDM_delete_IndividualSubscription()) -> value http2_rx {
@@ -900,7 +992,7 @@
}

/* 3GPP TS 29.503 4.2.5.2 SM Policy Association termination */
-private altstep as_npcf_smpolicycontrol_post_IndividualSMPOlicyTermination()
+altstep as_npcf_smpolicycontrol_post_IndividualSMPOlicyTermination()
runs on SMF_Session_CT {
var HTTP2_Msg http2_rx;
[] HTTP2_CONN[HTTP2_CONN_SCP].receive(f_tr_SMPolicyControl_post_IndividualSMPolicyTermination()) -> value http2_rx {
@@ -1075,4 +1167,19 @@
}
}

+/* 3GPP TS 24.501 8.3.15 PDU session release complete */
+private function f_ng_nas_gen_session_release_complete()
+runs on SMF_Session_CT return octetstring {
+ var BIT3 pdu_sess_type := f_pfcp_pdn_type_2_ng_nas_pdu_session_type(g_pars.pfcp_pars.pdn_type);
+ var ProcedureTransactionIdentifier pti := f_next_pti();
+ var template (value) NG_NAS_UL_Message_Type nas_ul_msg;
+ var octetstring nas_enc;
+
+ nas_ul_msg := cs_NG_PDU_SESSION_RELEASE_COMPLETE(cs_NG_PDU_SessionIdV(int2oct(g_pars.namf.pdu_sess_id, 1)),
+ pti,
+ cs_GMM_GSM_Cause('59'O, '00100100'B));
+ nas_enc := enc_NG_NAS_UL_Message_Type(valueof(nas_ul_msg));
+ return nas_enc;
+}
+
}
diff --git a/smf/SMF_Tests.ttcn b/smf/SMF_Tests.ttcn
index b829df8..9a58434 100644
--- a/smf/SMF_Tests.ttcn
+++ b/smf/SMF_Tests.ttcn
@@ -809,6 +809,66 @@
f_TC_n11_createSession_deleteSession_250(c_PFCP_PDN_Type_IPv4v6);
}

+/* Validate IUT detects PFCP Heartbeat timeout and recovers from it tearing down
+ * existing subscriber connections: */
+private template (value) PrometheusExpects t_TC_5g_pfcp_heartbeat_timeout_Metrics_Expect(integer pfcp_peers_active, integer ues_active) := {
+ ts_PrometheusExpect("pfcp_peers_active", GAUGE, min := pfcp_peers_active, max := pfcp_peers_active),
+ ts_PrometheusExpect("ues_active", GAUGE, min := ues_active, max := ues_active),
+ ts_PrometheusExpect("pfcp_sessions_active", GAUGE, min := ues_active, max := ues_active)
+};
+private function f_TC_5g_pfcp_heartbeat_timeout() runs on SMF_Session_CT {
+ var PDU_PFCP m;
+ var integer rts := f_PFCPEM_get_recovery_timestamp();
+
+ f_prometheus_expect(valueof(t_TC_5g_pfcp_heartbeat_timeout_Metrics_Expect(1, 0)), wait_converge := true);
+
+ /* Drop all received Hearbeat requests from IUT: */
+ f_PFCPEM_subscribe_bcast();
+ var default d := activate(as_pfcp_ignore(PFCP, tr_PFCP_Heartbeat_Req));
+
+ f_n11_create_session();
+ f_prometheus_expect(valueof(t_TC_5g_pfcp_heartbeat_timeout_Metrics_Expect(1, 1)), wait_converge := true);
+
+ /* Wait for IUT to detect peer went down after Heartbeat timeout, ie. wait for sessions
+ * being released and another ASSOC SETUP REQ to attempt re-association: */
+ as_namf_comm_post_n1n2_messages_pdu_sess_release_command();
+ f_n11_update_sm_context_pdu_sess_release_ngap();
+ f_n11_update_sm_context_pdu_sess_release_ngnas();
+
+ /* SMF deletes policy in PCF: */
+ as_npcf_smpolicycontrol_post_IndividualSMPOlicyTermination();
+
+ /* SMF deregisters on UDM: */
+ as_nudm_sdm_delete_IndividualSubscription();
+ as_nudm_uecm_delete_IndividualSmfRegistration();
+
+ f_prometheus_expect(valueof(t_TC_5g_pfcp_heartbeat_timeout_Metrics_Expect(0, 0)), wait_converge := true);
+
+ PFCP.receive(tr_PFCP_Assoc_Setup_Req()) -> value m;
+ deactivate(d);
+ activate(as_pfcp_handle_heartbeat_req(rts, do_repeat := 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(PFCP_Cause_REQUEST_ACCEPTED),
+ rts,
+ up_function_features := ts_PFCP_UP_Function_Features(ftup := '1'B,
+ vtime := '1'B)));
+
+ /* After we answer the ASSOC SETUP RESP, IUT detects peer up: */
+ f_prometheus_expect(valueof(t_TC_5g_pfcp_heartbeat_timeout_Metrics_Expect(1, 0)), wait_converge := true);
+ setverdict(pass);
+}
+testcase TC_5g_pfcp_heartbeat_timeout() runs on SMF_Test_CT {
+ var SMF_Session_CT vc_conn;
+ var SessionPars pars := f_SessionPars(9,
+ rat_type := GTP2C_RAT_NR);
+ g_pfcp_answer_heartbeat_req := false;
+ f_init(guard_timeout := 60.0);
+ vc_conn := f_start_handler(refers(f_TC_5g_pfcp_heartbeat_timeout), pars);
+ vc_conn.done;
+ f_shutdown();
+}
+
control {
execute( TC_tx_echo() );
execute( TC_createSession_deleteSession() );
@@ -830,10 +890,10 @@
execute( TC_n11_createSession_deleteSession() );
execute( TC_n11_createSession_deleteSession_ipv6() );
execute( TC_n11_createSession_deleteSession_ipv4v6() );
-
execute( TC_n11_createSession_deleteSession_250() );
execute( TC_n11_createSession_deleteSession_250_ipv6() );
execute( TC_n11_createSession_deleteSession_250_ipv4v6() );
+ execute( TC_5g_pfcp_heartbeat_timeout() );
}


diff --git a/smf/expected-results.xml b/smf/expected-results.xml
index 1493d31..77ba9ca 100644
--- a/smf/expected-results.xml
+++ b/smf/expected-results.xml
@@ -21,4 +21,5 @@
<testcase classname='SMF_Tests' name='TC_n11_createSession_deleteSession_250' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_n11_createSession_deleteSession_250_ipv6' time='MASKED'/>
<testcase classname='SMF_Tests' name='TC_n11_createSession_deleteSession_250_ipv4v6' time='MASKED'/>
+ <testcase classname='SMF_Tests' name='TC_5g_pfcp_heartbeat_timeout' time='MASKED'/>
</testsuite>

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

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