pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42328?usp=email )
Change subject: 5gc: Introduce TC_handover_inter_ngran_n2_cancel ......................................................................
5gc: Introduce TC_handover_inter_ngran_n2_cancel
Change-Id: I1137c9a82478cca0372678d3c3299e9eebc79bd5 --- M 5gc/C5G_Tests.ttcn M 5gc/ConnHdlr.ttcn M 5gc/expected-results.xml M library/NGAP_Emulation.ttcn M library/NGAP_Functions.ttcn 5 files changed, 88 insertions(+), 2 deletions(-)
Approvals: osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn index bf3cfd3..bdb0c84 100644 --- a/5gc/C5G_Tests.ttcn +++ b/5gc/C5G_Tests.ttcn @@ -760,6 +760,61 @@ vc_conn[1].done; }
+/* 3GPP TS 23.502 4.9.1.4 Inter NG-RAN node N2 based handover, Cancel */ +private function f_TC_handover_inter_ngran_n2_cancel_source() runs on ConnHdlr { + f_register(); + f_pdu_sess_establish(); + f_sleep(1.0); + f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + + /* 3GPP TS 23.502 4.9.1.3.2 step 1: */ + f_n2_handover_required(m_targetID_targetRANNodeID(m_targetRANNodeID(g_pars.ngran_pars[1].global_ngran_id, + ts_ngran_NGAP_TAI(g_pars.ngran_pars[1])) + )); + /* 3GPP TS 23.502 4.9.1.3.3 step 1: */ + f_n2_handover_command(); + /* 3GPP TS 23.502 4.9.1.3.3 step 2: */ + f_n2_handover_cancel(); + + /* Test UE can still use the network after HO cancel: */ + f_ping4(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname); + + f_pdu_sess_release(); + f_deregister(); +} +private function f_TC_handover_inter_ngran_n2_cancel_target() runs on ConnHdlr { + + /* Redirect Handover Request from AMF containing new AMF ID to our target ConnHdlr: */ + f_create_ngap_expect_proc(id_HandoverResourceAllocation, self); + + /* 3GPP TS 23.502 4.9.1.3.2 step 9+10: */ + f_n2_handover_request(); + + /* Expect to get a release on the target gNB due to cancelled Handover: */ + as_ngap_handle_UeContextReleaseCmd(exp_cause := mw_cause_radioNetwork(handover_cancelled)); +} +testcase TC_handover_inter_ngran_n2_cancel() runs on MTC_CT { + var ConnHdlr vc_conn[2]; + var integer i; + + f_init(); + f_ngap_setup(0); + f_ngap_setup(1); + + var ConnHdlrPars pars := f_init_pars(ue_idx := 0, c5g_idx := 0); + vc_conn[0] := f_start_handler_create(ngap_idx := 0); + vc_conn[1] := f_start_handler_create(ngap_idx := 1); + connect(vc_conn[0]:COORD, vc_conn[1]:COORD); + + f_start_handler_run(vc_conn[0], refers(f_TC_handover_inter_ngran_n2_cancel_source), pars); + pars.c5g_idx := 1; + pars.ue_pars.sess_pars.ran_gtpu_teid := int2oct(oct2int(pars.ue_pars.sess_pars.ran_gtpu_teid) + 1, 4); + f_start_handler_run(vc_conn[1], refers(f_TC_handover_inter_ngran_n2_cancel_target), pars); + + vc_conn[0].done; + vc_conn[1].done; +} + control { execute( TC_ng_setup() ); execute( TC_ng_setup_unknown_global_gnb_id_plmn() ); @@ -787,6 +842,7 @@
execute( TC_handover_inter_ngran_xn() ); execute( TC_handover_inter_ngran_n2() ); + execute( TC_handover_inter_ngran_n2_cancel() ); }
/* TODO: @@ -804,7 +860,6 @@ * - 3GPP TS 23.502 4.8.1.1(a) Connection Inactive procedure: Not supported by open5gs (https://github.com/open5gs/open5gs/issues/4319) * - 3GPP TS 23.502 4.8.1.2 Connection Suspend procedure: Not supported by open5gs (https://github.com/open5gs/open5gs/issues/4322) * - 3GPP TS 23.502 4.8.2 Connection Resume procedure: Not supported by open5gs (https://github.com/open5gs/open5gs/issues/4322) - * - 3GPP TS 23.502 4.9 Handover procedures * - 3GPP TS 23.502 4.12 Procedures for Untrusted non-3GPP access * - 3GPP TS 23.502 4.12a Procedures for Trusted non-3GPP access * - 3GPP TS 23.502 4.13.3 SMS over NAS procedures diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn index e6621f8..e40cdd4 100644 --- a/5gc/ConnHdlr.ttcn +++ b/5gc/ConnHdlr.ttcn @@ -1076,6 +1076,24 @@ NGAP.send(tx_pdu); }
+/* 3GPP TS 23.502 9.2.3.11 HANDOVER CANCEL + * 3GPP TS 23.502 4.9.1.4 */ +function f_n2_handover_cancel() runs on ConnHdlr +{ + var template (value) NGAP_PDU tx_pdu; + var NGAP_PDU rx_pdu; + + tx_pdu := m_ngap_initMsg(m_n2_HandoverCancel( + g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id, + m_cause_radioNetwork(unspecified))); + NGAP.send(tx_pdu); + + NGAP.receive(mw_ngap_succMsg(mw_n2_HandoverCancelAcknowledge( + g_pars.ue_pars.amf_id, + g_pars.ue_pars.ran_id))) -> value rx_pdu; +} + /* Handle a PDUSessionResourceSetupRequestTransfer contained inside NGAP InitialContextSetupRequest and return a Result for InitialContextSetupResponse */ private function f_pdu_handle_session_resource_released_item(PDUSessionResourceToReleaseItemRelCmd cmd) runs on ConnHdlr return PDUSessionResourceReleasedItemRelRes { diff --git a/5gc/expected-results.xml b/5gc/expected-results.xml index 03bbd43..e28ce57 100644 --- a/5gc/expected-results.xml +++ b/5gc/expected-results.xml @@ -25,4 +25,5 @@ </testcase> <testcase classname='C5G_Tests' name='TC_handover_inter_ngran_xn' time='MASKED'/> <testcase classname='C5G_Tests' name='TC_handover_inter_ngran_n2' time='MASKED'/> + <testcase classname='C5G_Tests' name='TC_handover_inter_ngran_n2_cancel' time='MASKED'/> </testsuite> diff --git a/library/NGAP_Emulation.ttcn b/library/NGAP_Emulation.ttcn index f493260..ea23a35 100644 --- a/library/NGAP_Emulation.ttcn +++ b/library/NGAP_Emulation.ttcn @@ -317,7 +317,7 @@ } return i; } - setverdict(fail, "NGAP Association Table not found by component ", client); + setverdict(fail, "NGAP Association Table not found by component ", client, " RAN-ID=", ran_id); mtc.stop; }
diff --git a/library/NGAP_Functions.ttcn b/library/NGAP_Functions.ttcn index 64e1450..1466678 100644 --- a/library/NGAP_Functions.ttcn +++ b/library/NGAP_Functions.ttcn @@ -46,6 +46,9 @@ case (id_HandoverNotification) { return im.value_.HandoverNotify.protocolIEs[0].value_.aMF_UE_NGAP_ID; } + case (id_HandoverCancel) { + return im.value_.HandoverCancel.protocolIEs[0].value_.aMF_UE_NGAP_ID; + } /* TODO */ } } else if (ischosen(ngap.successfulOutcome)) { @@ -60,6 +63,9 @@ case (id_HandoverPreparation) { return so.value_.HandoverCommand.protocolIEs[0].value_.aMF_UE_NGAP_ID; } + case (id_HandoverCancel) { + return so.value_.HandoverCancelAcknowledge.protocolIEs[0].value_.aMF_UE_NGAP_ID; + } case (?) { return omit; /* TODO */ @@ -112,6 +118,9 @@ case (id_HandoverNotification) { return im.value_.HandoverNotify.protocolIEs[1].value_.RAN_UE_NGAP_ID; } + case (id_HandoverCancel) { + return im.value_.HandoverCancel.protocolIEs[1].value_.RAN_UE_NGAP_ID; + } /* TODO */ } } else if (ischosen(ngap.successfulOutcome)) { @@ -126,6 +135,9 @@ case (id_HandoverPreparation) { return so.value_.HandoverCommand.protocolIEs[1].value_.rAN_UE_NGAP_ID; } + case (id_HandoverCancel) { + return so.value_.HandoverCancelAcknowledge.protocolIEs[1].value_.rAN_UE_NGAP_ID; + } case (?) { return omit; /* TODO */