pespin has uploaded this change for review.

View Change

5gc: Introduce test TC_handover_inter_ngran_n2_dataforwardingpossible_change

Validate that DataForwardingNotPossible in Handover Request is applied
based on info obtained during Handover Required.

Related: SYS#8269
Change-Id: I51731e9fb771666d39d7ee53055b44bdec636cf6
---
M 5gc/C5G_Tests.ttcn
M 5gc/ConnHdlr.ttcn
M 5gc/expected-results.xml
3 files changed, 129 insertions(+), 26 deletions(-)

git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/92/43792/1
diff --git a/5gc/C5G_Tests.ttcn b/5gc/C5G_Tests.ttcn
index 0edd792..85e0bae 100644
--- a/5gc/C5G_Tests.ttcn
+++ b/5gc/C5G_Tests.ttcn
@@ -956,13 +956,8 @@
vc_conn[1].done;
}

-/* 3GPP TS 23.502 4.9.1.3 Inter NG-RAN node N2 based handover */
-private function f_TC_handover_inter_ngran_n2_source() runs on ConnHdlr {
- f_register();
- f_pdu_sess_establish();
- f_sleep(1.0);
- f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
-
+private function f_handover_inter_ngran_n2_source(integer tgt_idx := 1,
+ template (omit) DirectForwardingPathAvailability direct_forwarding_avail := omit) runs on ConnHdlr {
var NG_NAS_UE_State nus := f_ngap_obtain_nus(g_pars.ue_pars.ran_id);

COORD.send(Handover_n2_Pars:{
@@ -970,26 +965,23 @@
pti := g_pars.ue_pars.pti,
sess_pars := g_pars.ue_pars.sess_pars,
kset_id := g_pars.kset_id,
- nus := nus
+ nus := nus,
+ exp_ho_request_data_forwarding_not_possible := not isvalue(direct_forwarding_avail)
});

/* 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]))
- ));
+ f_n2_handover_required(m_targetID_targetRANNodeID(m_targetRANNodeID(g_pars.ngran_pars[tgt_idx].global_ngran_id,
+ ts_ngran_NGAP_TAI(g_pars.ngran_pars[tgt_idx]))
+ ),
+ direct_forwarding_avail := direct_forwarding_avail);
/* 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: */
COORD.send("HANDOVER_COMMAND_CONFIRM");
-
- /* 3GPP TS 23.502 4.9.1.3.3 step 14a + 14b: */
- as_ngap_handle_UeContextReleaseCmd(exp_cause := mw_cause_radioNetwork(successful_handover));
}
-private function f_TC_handover_inter_ngran_n2_target() runs on ConnHdlr {
- var Handover_n2_Pars ho_n2_pars;

- /* Redirect Handover Request from AMF containing new AMF ID to our target ConnHdlr: */
- f_create_ngap_expect_proc(id_HandoverResourceAllocation, self);
+private function f_handover_inter_ngran_n2_target() runs on ConnHdlr {
+ var Handover_n2_Pars ho_n2_pars;

COORD.receive(Handover_n2_Pars:?) -> value ho_n2_pars;
g_pars.ue_pars.guti := ho_n2_pars.guti;
@@ -1002,7 +994,7 @@


/* 3GPP TS 23.502 4.9.1.3.2 step 9+10: */
- f_n2_handover_request();
+ f_n2_handover_request(ho_n2_pars.exp_ho_request_data_forwarding_not_possible);

/* 3GPP TS 23.502 4.9.1.3.3 step 4 */
COORD.receive("HANDOVER_COMMAND_CONFIRM");
@@ -1010,6 +1002,25 @@

/* 3GPP TS 23.502 4.9.1.3.3 step 5: */
f_n2_handover_notify();
+}
+
+/* 3GPP TS 23.502 4.9.1.3 Inter NG-RAN node N2 based handover */
+private function f_TC_handover_inter_ngran_n2_source() runs on ConnHdlr {
+ f_register();
+ f_pdu_sess_establish();
+ f_sleep(1.0);
+ f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
+
+ f_handover_inter_ngran_n2_source(tgt_idx := 1);
+
+ /* 3GPP TS 23.502 4.9.1.3.3 step 14a + 14b: */
+ as_ngap_handle_UeContextReleaseCmd(exp_cause := mw_cause_radioNetwork(successful_handover));
+}
+private function f_TC_handover_inter_ngran_n2_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);
+
+ f_handover_inter_ngran_n2_target();

f_sleep(1.0);

@@ -1069,7 +1080,7 @@
f_create_ngap_expect_proc(id_HandoverResourceAllocation, self);

/* 3GPP TS 23.502 4.9.1.3.2 step 9+10: */
- f_n2_handover_request();
+ f_n2_handover_request(true);

/* Expect to get a release on the target gNB due to cancelled Handover: */
as_ngap_handle_UeContextReleaseCmd(exp_cause := mw_cause_radioNetwork(handover_cancelled));
@@ -1096,6 +1107,82 @@
vc_conn[1].done;
}

+
+/* 3GPP TS 23.502 4.9.1.3 Inter NG-RAN node N2 based handover.
+ * 0->1 handover with directForwardingPathAvailability=false,
+ * 0<-1 handover with directForwardingPathAvailability=true */
+private function f_TC_handover_inter_ngran_n2_dataforwardingpossible_change_source() runs on ConnHdlr {
+ f_register();
+ f_pdu_sess_establish();
+ f_sleep(1.0);
+ f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
+
+ f_handover_inter_ngran_n2_source(tgt_idx := 1, direct_forwarding_avail := omit);
+
+ /* 3GPP TS 23.502 4.9.1.3.3 step 14a + 14b: */
+ as_ngap_handle_UeContextReleaseCmd(exp_cause := mw_cause_radioNetwork(successful_handover));
+ f_pdu_sess_delete_tun();
+
+ log("0: Handover 0->1 successful!");
+
+ /* Now wait for handover 1->0: */
+ f_create_ngap_expect_proc(id_HandoverResourceAllocation, self);
+ f_handover_inter_ngran_n2_target();
+
+ f_sleep(1.0);
+
+ f_pdu_sess_create_tun();
+ f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
+
+ log("0: Handover 1->0 successful!");
+ f_pdu_sess_release();
+ f_deregister();
+
+}
+private function f_TC_handover_inter_ngran_n2_dataforwardingpossible_change_target() runs on ConnHdlr {
+ var Handover_n2_Pars ho_n2_pars;
+
+ /* Redirect Handover Request from AMF containing new AMF ID to our target ConnHdlr: */
+ f_create_ngap_expect_proc(id_HandoverResourceAllocation, self);
+
+ f_handover_inter_ngran_n2_target();
+
+ f_sleep(1.0);
+
+ f_pdu_sess_create_tun();
+ f_ping(g_pars.ue_pars.sess_pars.run_prog_pars.ping_hostname);
+
+ log("1: Handover 0->1 successful!");
+
+ /* Now initiate handover 1->0: */
+ f_handover_inter_ngran_n2_source(tgt_idx := 0, direct_forwarding_avail := direct_path_available);
+
+ /* 3GPP TS 23.502 4.9.1.3.3 step 14a + 14b: */
+ as_ngap_handle_UeContextReleaseCmd(exp_cause := mw_cause_radioNetwork(successful_handover));
+ log("1: Handover 1->0 successful!");
+}
+testcase TC_handover_inter_ngran_n2_dataforwardingpossible_change() runs on MTC_CT {
+ var ConnHdlr vc_conn[2];
+ var integer i;
+
+ f_init(t_guard := 60.0);
+ 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_dataforwardingpossible_change_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_dataforwardingpossible_change_target), pars);
+
+ vc_conn[0].done;
+ vc_conn[1].done;
+}
+
/* 3GPP TS 23.502 4.21 Secondary RAT Usage Data Reporting Procedure
* 3GPP TS 38.413 8.15.1 Secondary RAT Data Usage Report
* 3GPP TS 29.502 5.2.2.3.7 RAN Initiated QoS Flow Mobility
@@ -1185,6 +1272,7 @@

execute( TC_handover_inter_ngran_n2() );
execute( TC_handover_inter_ngran_n2_cancel() );
+ execute( TC_handover_inter_ngran_n2_dataforwardingpossible_change() );

execute( TC_ran_initiated_qos_flow_mobility() );
execute( TC_secondary_rat_data_usage_report() );
diff --git a/5gc/ConnHdlr.ttcn b/5gc/ConnHdlr.ttcn
index c7b93ea..3332f9d 100644
--- a/5gc/ConnHdlr.ttcn
+++ b/5gc/ConnHdlr.ttcn
@@ -131,7 +131,9 @@
ProcedureTransactionIdentifier pti,
PDUSessionParams sess_pars,
NAS_KeySetIdentifier kset_id,
- NG_NAS_UE_State nus /* 3GPP TS 38.423 9.2.1.13 UE Context Information */
+ NG_NAS_UE_State nus /* 3GPP TS 38.423 9.2.1.13 UE Context Information */,
+ /* Whether to expect received HO Request should contain a DataForwardingNotPossible IE: */
+ boolean exp_ho_request_data_forwarding_not_possible
};

type port ConnHdlr_Coord_PT message
@@ -365,12 +367,14 @@
}

/* Handle a PDUSessionResourceSetupRequestTransfer and return a Result */
-private function f_pdu_handle_PDUSessionResourceSetupRequestTransfer(NGAP_IEs.PDUSessionResourceSetupRequestTransfer setup_req_transf)
+private function f_pdu_handle_PDUSessionResourceSetupRequestTransfer(NGAP_IEs.PDUSessionResourceSetupRequestTransfer setup_req_transf,
+ boolean exp_data_forwarding_not_possible)
runs on ConnHdlr return NGAP_IEs.PDUSessionResourceSetupResponseTransfer {
var template (value) UPTransportLayerInformation utla;
var template (value) QosFlowPerTNLInformation qos;
var NGAP_IEs.PDUSessionResourceSetupResponseTransfer setup_resp_transf;
var integer qos_id := 0;
+ var boolean found_data_forwarding_not_possible := false;

for (var integer i := 0; i < lengthof(setup_req_transf.protocolIEs); i := i + 1) {
select (setup_req_transf.protocolIEs[i].id) {
@@ -383,7 +387,17 @@
var QosFlowSetupRequestList qos_req_li := setup_req_transf.protocolIEs[i].value_.QosFlowSetupRequestList;
qos_id := qos_req_li[0].qosFlowIdentifier;
}
+ case (id_DataForwardingNotPossible) {
+ found_data_forwarding_not_possible := true;
}
+ }
+ }
+
+ if (exp_data_forwarding_not_possible != found_data_forwarding_not_possible) {
+ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail,
+ log2str("PDUSessionResourceSetupRequestTransfer: DataForwardingNotPossible IE: received presence ",
+ found_data_forwarding_not_possible, " vs exp ",
+ exp_data_forwarding_not_possible));
}

/* Prepare Response for it: */
@@ -406,7 +420,7 @@

/* Parse PDUSessionResourceSetupRequestTransfer contained inside InitialContextSetupRequest's PDUSessionResourceSetup Item: */
setup_req_transf := dec_NGAP_PDUSessionResourceSetupRequestTransfer(req.pDUSessionResourceSetupRequestTransfer);
- setup_resp_transf := f_pdu_handle_PDUSessionResourceSetupRequestTransfer(setup_req_transf);
+ setup_resp_transf := f_pdu_handle_PDUSessionResourceSetupRequestTransfer(setup_req_transf, false);

setup_trans_enc := enc_NGAP_PDUSessionResourceSetupResponseTransfer(setup_resp_transf)
resp := valueof(m_pDUSessionResourceSetupItemCxtRes(req.pDUSessionID, setup_trans_enc));
@@ -479,7 +493,7 @@

/* Parse PDUSessionResourceSetupRequestTransfer contained inside InitialContextSetupRequest's PDUSessionResourceSetup Item: */
setup_req_transf := dec_NGAP_PDUSessionResourceSetupRequestTransfer(req.pDUSessionResourceSetupRequestTransfer);
- setup_resp_transf := f_pdu_handle_PDUSessionResourceSetupRequestTransfer(setup_req_transf);
+ setup_resp_transf := f_pdu_handle_PDUSessionResourceSetupRequestTransfer(setup_req_transf, false);

setup_trans_enc := enc_NGAP_PDUSessionResourceSetupResponseTransfer(setup_resp_transf)
resp := valueof(m_pDUSessionResourceSetupItemSURes(req.pDUSessionID, setup_trans_enc));
@@ -1168,7 +1182,7 @@

/* 3GPP TS 38.413 9.2.3.4 HANDOVER REQUEST
* 3GPP TS 23.502 4.9.1.3.2 step 9+10 */
-function f_n2_handover_request() runs on ConnHdlr
+function f_n2_handover_request(boolean exp_ho_request_data_forwarding_not_possible := true) runs on ConnHdlr
{
var template (value) QosFlowItemWithDataForwarding qos;
var template (value) HandoverRequestAcknowledgeTransfer transfer;
@@ -1196,7 +1210,7 @@
var NGAP_IEs.PDUSessionResourceSetupRequestTransfer setup_req_transf;
var NGAP_IEs.PDUSessionResourceSetupResponseTransfer setup_resp_transf;
setup_req_transf := dec_NGAP_PDUSessionResourceSetupRequestTransfer(res_it.handoverRequestTransfer);
- setup_resp_transf := f_pdu_handle_PDUSessionResourceSetupRequestTransfer(setup_req_transf);
+ setup_resp_transf := f_pdu_handle_PDUSessionResourceSetupRequestTransfer(setup_req_transf, exp_ho_request_data_forwarding_not_possible);
qos_id := setup_resp_transf.dLQosFlowPerTNLInformation.associatedQosFlowList[0].qosFlowIdentifier;
}
}
diff --git a/5gc/expected-results.xml b/5gc/expected-results.xml
index bbdc0b2..6f4af71 100644
--- a/5gc/expected-results.xml
+++ b/5gc/expected-results.xml
@@ -45,6 +45,7 @@
<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'/>
+ <testcase classname='C5G_Tests' name='TC_handover_inter_ngran_n2_dataforwardingpossible_change' time='MASKED'/>
<testcase classname='C5G_Tests' name='TC_ran_initiated_qos_flow_mobility' time='MASKED'>
<failure type='fail-verdict'>"C5G_Tests.ttcn:MASKED : Tguard timeout"
C5G_Tests.ttcn:MASKED TC_ran_initiated_qos_flow_mobility testcase

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

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