pespin has uploaded this change for review.
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(+), 1 deletion(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/28/42328/1
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn
index bf3cfd3..fe43ad4 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:
diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn
index b1f76d2..a561949 100644
--- a/5gc/ConnHdlr.ttcn
+++ b/5gc/ConnHdlr.ttcn
@@ -1078,6 +1078,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 */
To view, visit change 42328. To unsubscribe, or for help writing mail filters, visit settings.