jolly has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41094?usp=email )
Change subject: S1GW: Add test case to test release of e-RABs during handover preperation ......................................................................
S1GW: Add test case to test release of e-RABs during handover preperation
HANDOVER COMMAND allows e-EABs to be forwarded or to be released. The test provides two lists and expects osmo-s1gw to release only those e-RABs that are included int the "E-RABs to Release List" IE.
Related: SYS#7309 Change-Id: Ic70ba19c0a6e349f63aae124607d075b6d19e779 --- M s1gw/S1GW_ConnHdlr.ttcn M s1gw/S1GW_Tests.ttcn M s1gw/expected-results.xml 3 files changed, 102 insertions(+), 20 deletions(-)
Approvals: pespin: Looks good to me, approved fixeria: Looks good to me, but someone else must approve Jenkins Builder: Verified
diff --git a/s1gw/S1GW_ConnHdlr.ttcn b/s1gw/S1GW_ConnHdlr.ttcn index 1d41d0d..09a5fee 100644 --- a/s1gw/S1GW_ConnHdlr.ttcn +++ b/s1gw/S1GW_ConnHdlr.ttcn @@ -350,6 +350,19 @@ return -1; /* make compiler happy */ }
+/* Compose an E-RAB list by selecting entries from the global E-RAB list as indicated by index list. */ +function f_ERabList_compose(ERabIdxList idx_list) +runs on ConnHdlr return ERabList { + var ERabList erabs; + + for (var integer i := 0; i < lengthof(idx_list); i := i + 1) { + var ERabIdx idx := idx_list[i]; + erabs[i] := g_pars.erabs[idx]; + } + + return erabs; +} + function f_ConnHdlr_tx_erab_setup_req(in ERabList erabs, MME_UE_S1AP_ID mme_ue_id, ENB_UE_S1AP_ID enb_ue_id) @@ -1204,49 +1217,75 @@ return pdu; }
-function f_ConnHdlr_tx_handover_cmd(in ERabList erabs, +function f_ConnHdlr_tx_handover_cmd(ERabIdxList erabs_forward, MME_UE_S1AP_ID mme_ue_id, - ENB_UE_S1AP_ID enb_ue_id) + ENB_UE_S1AP_ID enb_ue_id, + ERabIdxList erabs_release := {}) runs on ConnHdlr { - var template (value) E_RABSubjecttoDataForwardingList items; + var template (value) E_RABSubjecttoDataForwardingList items_forward; + var template (omit) E_RABList items_release := omit;
- for (var integer i := 0; i < lengthof(erabs); i := i + 1) { + for (var integer i := 0; i < lengthof(erabs_forward); i := i + 1) { var template (value) E_RABDataForwardingItem item; + var ERabIdx idx := erabs_forward[i];
- item := ts_E_RABDataForwardingItem(rab_id := erabs[i].erab_id, + item := ts_E_RABDataForwardingItem(rab_id := g_pars.erabs[idx].erab_id, dl_tla := omit, dl_gtp_teid := omit, ul_tla := omit, ul_gtp_teid := omit); - items[i] := ts_E_RABSubjecttoDataForwardingList(item)[0]; + items_forward[i] := ts_E_RABSubjecttoDataForwardingList(item)[0]; }
+ for (var integer i := 0; i < lengthof(erabs_release); i := i + 1) { + var template (value) E_RABItem item; + var ERabIdx idx := erabs_release[i]; + + item := ts_E_RABItem(rab_id := g_pars.erabs[idx].erab_id, + cause := { transport := transport_resource_unavailable }); + items_release[i] := ts_E_RABList(item)[0]; + } + f_ConnHdlr_tx_s1ap_from_enb(ts_S1AP_HandoverCmd(mme_id := mme_ue_id, enb_id := enb_ue_id, ho_type := intralte, - rab_forward_items := items, - container := '123456'O)); + rab_forward_items := items_forward, + container := '123456'O, + rab_release_items := items_release)); }
-function f_ConnHdlr_rx_handover_cmd(in ERabList erabs, +function f_ConnHdlr_rx_handover_cmd(ERabIdxList erabs_forward, MME_UE_S1AP_ID mme_ue_id, - ENB_UE_S1AP_ID enb_ue_id) + ENB_UE_S1AP_ID enb_ue_id, + ERabIdxList erabs_release := {}) runs on ConnHdlr return S1AP_PDU { - var template (present) E_RABSubjecttoDataForwardingList items; + var template (present) E_RABSubjecttoDataForwardingList items_forward; + var template E_RABList items_release := omit; var S1AP_PDU pdu;
- for (var integer i := 0; i < lengthof(erabs); i := i + 1) { + for (var integer i := 0; i < lengthof(erabs_forward); i := i + 1) { var template (present) E_RABDataForwardingItem item; + var ERabIdx idx := erabs_forward[i];
- item := tr_E_RABDataForwardingItem(rab_id := erabs[i].erab_id) - items[i] := tr_E_RABSubjecttoDataForwardingList(item)[0]; + item := tr_E_RABDataForwardingItem(rab_id := g_pars.erabs[idx].erab_id) + items_forward[i] := tr_E_RABSubjecttoDataForwardingList(item)[0]; + } + + for (var integer i := 0; i < lengthof(erabs_release); i := i + 1) { + var template (present) E_RABItem item; + var ERabIdx idx := erabs_release[i]; + + item := tr_E_RABItem(rab_id := g_pars.erabs[idx].erab_id, + cause := { transport := transport_resource_unavailable }); + items_release[i] := tr_E_RABList(item)[0]; }
f_ConnHdlr_rx_s1ap_from_enb(pdu, tr_S1AP_HandoverCmd(mme_id := mme_ue_id, enb_id := enb_ue_id, ho_type := intralte, - rab_forward_items := items, - container := '123456'O)); + rab_forward_items := items_forward, + container := '123456'O, + rab_release_items := items_release)); return pdu; }
@@ -1682,17 +1721,27 @@
function f_ConnHdlr_handover_cmd_() runs on ConnHdlr { - f_ConnHdlr_handover_cmd(g_pars.erabs, g_pars.mme_ue_id, g_pars.idx); + var ERabIdxList erabs_forward; + for (var integer i := 0; i < lengthof(g_pars.erabs); i := i + 1) { + erabs_forward[i] := i; + } + f_ConnHdlr_handover_cmd(erabs_forward, {}, g_pars.mme_ue_id, g_pars.idx); }
-function f_ConnHdlr_handover_cmd(in ERabList erabs, +function f_ConnHdlr_handover_cmd(ERabIdxList erabs_forward, + ERabIdxList erabs_release, MME_UE_S1AP_ID mme_ue_id, ENB_UE_S1AP_ID enb_ue_id) runs on ConnHdlr { log("[eNB -> S1GW] -> MME: HANDOVER COMMAND"); - f_ConnHdlr_tx_handover_cmd(erabs, mme_ue_id, enb_ue_id); + f_ConnHdlr_tx_handover_cmd(erabs_forward, mme_ue_id, enb_ue_id, erabs_release); + /* Expect the S1GW to delete sessions for released E-RABs (if any) */ + if (lengthof(erabs_release) > 0) { + var ERabList erabs := f_ERabList_compose(erabs_release); + f_ConnHdlr_session_delete(erabs); + } log("eNB -> [S1GW -> MME]: HANDOVER COMMAND"); - f_ConnHdlr_rx_handover_cmd(erabs, mme_ue_id, enb_ue_id); + f_ConnHdlr_rx_handover_cmd(erabs_forward, mme_ue_id, enb_ue_id, erabs_release); }
} diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn index 17c63cb..391584e 100644 --- a/s1gw/S1GW_Tests.ttcn +++ b/s1gw/S1GW_Tests.ttcn @@ -889,6 +889,37 @@ f_TC_exec(refers(f_TC_handover_preparation)); }
+/* Test Handover Preparation procedures with release */ +function f_TC_handover_preparation_release(charstring id) runs on ConnHdlr { + var ERabIdxList erabs_forward := {0, 2}; + var ERabIdxList erabs_release := {1, 3}; + 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_erab_setup_req_(); + f_ConnHdlr_erab_setup_rsp_(); + f_ConnHdlr_handover_rqd_(); + f_ConnHdlr_handover_cmd(erabs_forward, + erabs_release, + g_pars.mme_ue_id, + g_pars.idx); + + if (lengthof(erabs_forward) > 0) { + erabs_left := f_ERabList_compose(erabs_forward); + 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); +} +testcase TC_handover_preparation_release() runs on test_CT { + f_TC_exec(refers(f_TC_handover_preparation_release), 1, 4); +} + /* Test Handover Resource Allocation procedures */ function f_TC_handover_res_alloc(charstring id) runs on ConnHdlr { f_ConnHdlr_s1ap_register(g_pars.genb_id); @@ -956,6 +987,7 @@ execute( TC_uemux_ue_ctx_release_req() ); execute( TC_uemux_ue_ctx_release_cmd() ); execute( TC_handover_preparation() ); + execute( TC_handover_preparation_release() ); execute( TC_handover_res_alloc() ); execute( TC_pfcp_heartbeat() ); } diff --git a/s1gw/expected-results.xml b/s1gw/expected-results.xml index 24c0fe0..bcf1d83 100644 --- a/s1gw/expected-results.xml +++ b/s1gw/expected-results.xml @@ -31,6 +31,7 @@ <testcase classname='S1GW_Tests' name='TC_uemux_ue_ctx_release_req' time='MASKED'/> <testcase classname='S1GW_Tests' name='TC_uemux_ue_ctx_release_cmd' time='MASKED'/> <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_pfcp_heartbeat' time='MASKED'/> </testsuite>