jolly has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41095?usp=email )
Change subject: S1GW: Add test case to test release of failed e-RABs during handover resource allocation ...................................................................... S1GW: Add test case to test release of failed e-RABs during handover resource allocation HANDOVER REQUEST ACKNOWLEDGE indicates admitted and failed eRABs. The test provides two lists and expects osmo-s1gw to release only those e-RABs that are included int the "E-RABs Failed to Setup List" IE. Related: SYS#7309 Change-Id: Ic14f560ae16b8386e58ac85f8af53b19d7c7a5c9 --- M library/s1ap/S1AP_Templates.ttcn M s1gw/S1GW_ConnHdlr.ttcn M s1gw/S1GW_Tests.ttcn M s1gw/expected-results.xml 4 files changed, 97 insertions(+), 23 deletions(-) Approvals: fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved Jenkins Builder: Verified diff --git a/library/s1ap/S1AP_Templates.ttcn b/library/s1ap/S1AP_Templates.ttcn index 34b1cb0..8c89c75 100644 --- a/library/s1ap/S1AP_Templates.ttcn +++ b/library/s1ap/S1AP_Templates.ttcn @@ -2870,6 +2870,7 @@ iE_Extensions := * } +/* 9.2.1.63 E-RAB List */ template (value) E_RABFailedtoSetupListHOReqAck ts_E_RABFailedToSetupListHOReqAck(template (value) E_RABFailedToSetupItemHOReqAck it) := { { diff --git a/s1gw/S1GW_ConnHdlr.ttcn b/s1gw/S1GW_ConnHdlr.ttcn index 09a5fee..4e47544 100644 --- a/s1gw/S1GW_ConnHdlr.ttcn +++ b/s1gw/S1GW_ConnHdlr.ttcn @@ -1138,57 +1138,83 @@ return pdu; } -function f_ConnHdlr_tx_handover_ack(in ERabList erabs, +function f_ConnHdlr_tx_handover_ack(ERabIdxList erabs_admitted, MME_UE_S1AP_ID mme_ue_id, - ENB_UE_S1AP_ID enb_ue_id) + ENB_UE_S1AP_ID enb_ue_id, + ERabIdxList erabs_failed := {}) runs on ConnHdlr { - var template (value) E_RABAdmittedList items; + var template (value) E_RABAdmittedList items_admitted; + var template (omit) E_RABFailedtoSetupListHOReqAck items_failed := omit; - for (var integer i := 0; i < lengthof(erabs); i := i + 1) { + for (var integer i := 0; i < lengthof(erabs_admitted); i := i + 1) { var template (value) E_RABAdmittedItem item; var template (value) TransportLayerAddress tla; - var ERabParams epars := erabs[i].u2a; + var ERabIdx idx := erabs_admitted[i]; + var ERabParams epars := g_pars.erabs[idx].u2a; tla := oct2bit(f_inet_addr(epars.tla)); - item := ts_E_RABAdmittedItem(rab_id := erabs[i].erab_id, + item := ts_E_RABAdmittedItem(rab_id := g_pars.erabs[idx].erab_id, tla := tla, gtp_teid := epars.teid, dl_tla := omit, dl_gtp_teid := omit, ul_tla := omit, ul_gtp_teid := omit); - items[i] := ts_E_RABAdmittedList(item)[0]; + items_admitted[i] := ts_E_RABAdmittedList(item)[0]; + } + + for (var integer i := 0; i < lengthof(erabs_failed); i := i + 1) { + var template (value) E_RABFailedToSetupItemHOReqAck item; + var ERabIdx idx := erabs_failed[i]; + + item := ts_E_RABFailedToSetupItemHOReqAck(rab_id := g_pars.erabs[idx].erab_id, + cause := { transport := transport_resource_unavailable }); + items_failed[i] := ts_E_RABFailedToSetupListHOReqAck(item)[0]; } f_ConnHdlr_tx_s1ap_from_enb(ts_S1AP_HandoverAck(mme_id := mme_ue_id, enb_id := enb_ue_id, - rab_admit_items := items, - container := '123456'O)); + rab_admit_items := items_admitted, + container := '123456'O, + rab_failed_items := items_failed)); } -function f_ConnHdlr_rx_handover_ack(in ERabList erabs, +function f_ConnHdlr_rx_handover_ack(ERabIdxList erabs_admitted, MME_UE_S1AP_ID mme_ue_id, - ENB_UE_S1AP_ID enb_ue_id) + ENB_UE_S1AP_ID enb_ue_id, + ERabIdxList erabs_failed := {}) runs on ConnHdlr return S1AP_PDU { - var template (present) E_RABAdmittedList items; + var template (present) E_RABAdmittedList items_admitted; + var template E_RABFailedtoSetupListHOReqAck items_failed := omit; var S1AP_PDU pdu; - for (var integer i := 0; i < lengthof(erabs); i := i + 1) { + for (var integer i := 0; i < lengthof(erabs_admitted); i := i + 1) { var template (present) E_RABAdmittedItem item; var template (present) TransportLayerAddress tla; - var ERabParams epars := erabs[i].c2u; + var ERabIdx idx := erabs_admitted[i]; + var ERabParams epars := g_pars.erabs[idx].c2u; tla := oct2bit(f_inet_addr(epars.tla)); - item := tr_E_RABAdmittedItem(rab_id := erabs[i].erab_id, + item := tr_E_RABAdmittedItem(rab_id := g_pars.erabs[idx].erab_id, tla := tla, gtp_teid := epars.teid); - items[i] := tr_E_RABAdmittedList(item)[0]; + items_admitted[i] := tr_E_RABAdmittedList(item)[0]; + } + + for (var integer i := 0; i < lengthof(erabs_failed); i := i + 1) { + var template (present) E_RABFailedToSetupItemHOReqAck item; + var ERabIdx idx := erabs_failed[i]; + + item := tr_E_RABFailedToSetupItemHOReqAck(rab_id := g_pars.erabs[idx].erab_id, + cause := { transport := transport_resource_unavailable }); + items_failed[i] := tr_E_RABFailedToSetupListHOReqAck(item)[0]; } f_ConnHdlr_rx_s1ap_from_enb(pdu, tr_S1AP_HandoverAck(mme_id := mme_ue_id, enb_id := enb_ue_id, - rab_admit_items := items, - container := '123456'O)); + rab_admit_items := items_admitted, + container := '123456'O, + rab_failed_items := items_failed)); return pdu; } @@ -1690,18 +1716,33 @@ function f_ConnHdlr_handover_ack_() runs on ConnHdlr { - f_ConnHdlr_handover_ack(g_pars.erabs, g_pars.mme_ue_id, g_pars.idx); + var ERabIdxList erabs_admitted; + for (var integer i := 0; i < lengthof(g_pars.erabs); i := i + 1) { + erabs_admitted[i] := i; + } + f_ConnHdlr_handover_ack(erabs_admitted, {}, g_pars.mme_ue_id, g_pars.idx); } -function f_ConnHdlr_handover_ack(inout ERabList erabs, + +function f_ConnHdlr_handover_ack(ERabIdxList erabs_admitted, + ERabIdxList erabs_failed, MME_UE_S1AP_ID mme_ue_id, ENB_UE_S1AP_ID enb_ue_id) runs on ConnHdlr { log("[eNB -> S1GW] -> MME: HANDOVER REQUEST ACKNOWLEDGE"); - f_ConnHdlr_tx_handover_ack(erabs, mme_ue_id, enb_ue_id); - f_ConnHdlr_session_modify(erabs); + f_ConnHdlr_tx_handover_ack(erabs_admitted, mme_ue_id, enb_ue_id, erabs_failed); + /* Expect the S1GW to modify sessions for admitted E-RABs (if any) */ + if (lengthof(erabs_admitted) > 0) { + var ERabList erabs := f_ERabList_compose(erabs_admitted); + f_ConnHdlr_session_modify(erabs); + } + /* Expect the S1GW to delete sessions for failed E-RABs (if any) */ + if (lengthof(erabs_failed) > 0) { + var ERabList erabs := f_ERabList_compose(erabs_failed); + f_ConnHdlr_session_delete(erabs); + } log("eNB -> [S1GW -> MME]: HANDOVER REQUEST ACKNOWLEDGE"); - f_ConnHdlr_rx_handover_ack(erabs, mme_ue_id, enb_ue_id); + f_ConnHdlr_rx_handover_ack(erabs_admitted, mme_ue_id, enb_ue_id, erabs_failed); } function f_ConnHdlr_handover_rqd_() diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn index 391584e..296c234 100644 --- a/s1gw/S1GW_Tests.ttcn +++ b/s1gw/S1GW_Tests.ttcn @@ -938,6 +938,36 @@ f_TC_exec(refers(f_TC_handover_res_alloc)); } +/* Test Handover Resource Allocation procedures with falures */ +function f_TC_handover_res_alloc_fail(charstring id) runs on ConnHdlr { + var ERabIdxList erabs_admitted := {0, 2, 4}; + var ERabIdxList erabs_failed := {1, 3, 5}; + var ERabList erabs_left; + + f_ConnHdlr_s1ap_register(g_pars.genb_id); + f_ConnHdlr_s1ap_connect(mp_enb_bind_ip, mp_s1gw_enb_ip); + f_ConnHdlr_s1ap_setup(g_pars.genb_id); + + f_ConnHdlr_handover_req_(); + f_ConnHdlr_handover_ack(erabs_admitted, + erabs_failed, + g_pars.mme_ue_id, + g_pars.idx); + + if (lengthof(erabs_admitted) > 0) { + erabs_left := f_ERabList_compose(erabs_admitted); + f_ConnHdlr_erab_release_cmd(erabs_left, g_pars.mme_ue_id, g_pars.idx); + f_ConnHdlr_erab_release_rsp(erabs_left, g_pars.mme_ue_id, g_pars.idx); + } + + f_ConnHdlr_s1ap_disconnect(); + f_ConnHdlr_s1ap_unregister(g_pars.genb_id); +} +/* 6 E-RABs at a time, single eNB */ +testcase TC_handover_res_alloc_fail() runs on test_CT { + f_TC_exec(refers(f_TC_handover_res_alloc_fail), 1, 6); +} + function f_TC_pfcp_heartbeat(charstring id) runs on ConnHdlr { var integer rts := f_PFCPEM_get_recovery_timestamp(); var PDU_PFCP pfcp_pdu; @@ -989,6 +1019,7 @@ execute( TC_handover_preparation() ); execute( TC_handover_preparation_release() ); execute( TC_handover_res_alloc() ); + execute( TC_handover_res_alloc_fail() ); execute( TC_pfcp_heartbeat() ); } diff --git a/s1gw/expected-results.xml b/s1gw/expected-results.xml index bcf1d83..f560a60 100644 --- a/s1gw/expected-results.xml +++ b/s1gw/expected-results.xml @@ -33,5 +33,6 @@ <testcase classname='S1GW_Tests' name='TC_handover_preparation' time='MASKED'/> <testcase classname='S1GW_Tests' name='TC_handover_preparation_release' time='MASKED'/> <testcase classname='S1GW_Tests' name='TC_handover_res_alloc' time='MASKED'/> + <testcase classname='S1GW_Tests' name='TC_handover_res_alloc_fail' time='MASKED'/> <testcase classname='S1GW_Tests' name='TC_pfcp_heartbeat' time='MASKED'/> </testsuite> -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41095?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: merged Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: Ic14f560ae16b8386e58ac85f8af53b19d7c7a5c9 Gerrit-Change-Number: 41095 Gerrit-PatchSet: 4 Gerrit-Owner: jolly <andr...@eversberg.eu> Gerrit-Reviewer: Jenkins Builder Gerrit-Reviewer: fixeria <vyanits...@sysmocom.de> Gerrit-Reviewer: jolly <andr...@eversberg.eu> Gerrit-Reviewer: pespin <pes...@sysmocom.de>