jolly submitted this change.

View Change

Approvals: fixeria: Looks good to me, but someone else must approve pespin: Looks good to me, approved Jenkins Builder: Verified
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(-)

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 change 41095. To unsubscribe, or for help writing mail filters, visit settings.

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 <andreas@eversberg.eu>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy@sysmocom.de>
Gerrit-Reviewer: jolly <andreas@eversberg.eu>
Gerrit-Reviewer: pespin <pespin@sysmocom.de>