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>

Reply via email to