pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/43792?usp=email )
Change subject: 5gc: Introduce test TC_handover_inter_ngran_n2_dataforwardingpossible_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