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>
--
To view, visit
https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/41094?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: Ic70ba19c0a6e349f63aae124607d075b6d19e779
Gerrit-Change-Number: 41094
Gerrit-PatchSet: 4
Gerrit-Owner: jolly <andreas(a)eversberg.eu>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: jolly <andreas(a)eversberg.eu>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>