fixeria submitted this change.
s1gw: add TC_e_rab_modify_ind_cnf[_multi]
Test the E-RAB Modify procedure (eNB initiated), which is defined
in 3GPP TS 36.413 section 8.2.4.
Change-Id: Iec95ca0ecf37290bddfbefce1861f8ae66bf4db1
Related: osmo-s1gw.git I750ada0a5a21edc8bc06d567c8000b6304966474
Related: osmo-s1gw.git Icc16a57d40b68bd17c5d207b643927d58176e088
Related: SYS#7308
---
M s1gw/S1GW_ConnHdlr.ttcn
M s1gw/S1GW_Tests.ttcn
M s1gw/expected-results.xml
3 files changed, 258 insertions(+), 1 deletion(-)
diff --git a/s1gw/S1GW_ConnHdlr.ttcn b/s1gw/S1GW_ConnHdlr.ttcn
index f5ff588..3414315 100644
--- a/s1gw/S1GW_ConnHdlr.ttcn
+++ b/s1gw/S1GW_ConnHdlr.ttcn
@@ -292,6 +292,7 @@
ERabParams a2u, /* Access -> UPF params */
ERabParams u2a, /* UPF -> Access params */
ERabParams u2cm, /* UPF -> Core params (modified) */
+ ERabParams u2am, /* UPF -> Access params (modified) */
OCT8 pfcp_loc_seid,
OCT8 pfcp_rem_seid optional
};
@@ -538,6 +539,164 @@
return pdu;
}
+function f_ConnHdlr_tx_erab_modify_ind(in ERabIdxList erabs_modified,
+ in ERabIdxList erabs_not_modified := {})
+runs on ConnHdlr {
+ var template (value) E_RABToBeModifiedListBearerModInd items_modified;
+ var template (omit) E_RABNotToBeModifiedListBearerModInd items_not_modified := omit;
+ var ENB_UE_S1AP_ID enb_ue_id := g_pars.idx;
+
+ for (var integer i := 0; i < lengthof(erabs_modified); i := i + 1) {
+ var template (value) E_RABToBeModifiedItemBearerModInd item;
+ var ERabIdx idx := erabs_modified[i];
+ var ERabParams epars := g_pars.erabs[idx].u2am;
+
+ item := ts_E_RABToBeModifiedItemBearerModInd(rab_id := g_pars.erabs[idx].erab_id,
+ tla := oct2bit(f_inet_addr(epars.tla)),
+ gtp_teid := epars.teid);
+
+ items_modified[i] := ts_E_RABToBeModifiedListBearerModInd(item)[0];
+ }
+
+ for (var integer i := 0; i < lengthof(erabs_not_modified); i := i + 1) {
+ var template (value) E_RABNotToBeModifiedItemBearerModInd item;
+ var ERabIdx idx := erabs_not_modified[i];
+ var ERabParams epars := g_pars.erabs[idx].u2a;
+
+ item := ts_E_RABNotToBeModifiedItemBearerModInd(rab_id := g_pars.erabs[idx].erab_id,
+ tla := oct2bit(f_inet_addr(epars.tla)),
+ gtp_teid := epars.teid);
+
+ items_not_modified[i] := ts_E_RABNotToBeModifiedListBearerModInd(item)[0];
+ }
+
+ f_ConnHdlr_tx_s1ap_from_enb(ts_S1AP_RABModifyInd(g_pars.mme_ue_id, enb_ue_id,
+ rab_do_modify_items := items_modified,
+ rab_no_modify_items := items_not_modified));
+}
+
+function f_ConnHdlr_rx_erab_modify_ind(in ERabIdxList erabs_modified,
+ in ERabIdxList erabs_not_modified := {})
+runs on ConnHdlr return S1AP_PDU {
+ var template (present) E_RABToBeModifiedListBearerModInd items_modified;
+ var template E_RABNotToBeModifiedListBearerModInd items_not_modified := omit;
+ var ENB_UE_S1AP_ID enb_ue_id := g_pars.idx;
+ var S1AP_PDU pdu;
+
+ for (var integer i := 0; i < lengthof(erabs_modified); i := i + 1) {
+ var template (present) E_RABToBeModifiedItemBearerModInd item;
+ var ERabIdx idx := erabs_modified[i];
+ var ERabParams epars := g_pars.erabs[idx].c2u;
+
+ item := tr_E_RABToBeModifiedItemBearerModInd(rab_id := g_pars.erabs[idx].erab_id,
+ tla := oct2bit(f_inet_addr(epars.tla)),
+ gtp_teid := epars.teid);
+
+ items_modified[i] := tr_E_RABToBeModifiedListBearerModInd(item)[0];
+ }
+
+ for (var integer i := 0; i < lengthof(erabs_not_modified); i := i + 1) {
+ var template (present) E_RABNotToBeModifiedItemBearerModInd item;
+ var ERabIdx idx := erabs_not_modified[i];
+ var ERabParams epars := g_pars.erabs[idx].c2u;
+
+ item := tr_E_RABNotToBeModifiedItemBearerModInd(rab_id := g_pars.erabs[idx].erab_id,
+ tla := oct2bit(f_inet_addr(epars.tla)),
+ gtp_teid := epars.teid);
+
+ items_not_modified[i] := tr_E_RABNotToBeModifiedListBearerModInd(item)[0];
+ }
+
+ f_ConnHdlr_rx_s1ap_from_enb(pdu, tr_S1AP_RABModifyInd(g_pars.mme_ue_id, enb_ue_id,
+ rab_do_modify_items := items_modified,
+ rab_no_modify_items := items_not_modified));
+ return pdu;
+}
+
+function f_ConnHdlr_tx_erab_modify_cnf(in ERabIdxList erabs_modified := {},
+ in ERabIdxList erabs_not_modified := {},
+ in ERabIdxList erabs_release := {})
+runs on ConnHdlr {
+ var template (omit) E_RABModifyListBearerModConf items_modified := omit;
+ var template (omit) E_RABList items_not_modified := omit;
+ var template (omit) E_RABList items_release := omit;
+ var ENB_UE_S1AP_ID enb_ue_id := g_pars.idx;
+
+ for (var integer i := 0; i < lengthof(erabs_modified); i := i + 1) {
+ var template (value) E_RABModifyItemBearerModConf item;
+ var ERabIdx idx := erabs_modified[i];
+
+ item := ts_E_RABModifyItemBearerModConf(rab_id := g_pars.erabs[idx].erab_id);
+ items_modified[i] := ts_E_RABModifyListBearerModConf(item)[0];
+ }
+
+ for (var integer i := 0; i < lengthof(erabs_not_modified); i := i + 1) {
+ var template (value) E_RABItem item;
+ var ERabIdx idx := erabs_not_modified[i];
+
+ item := ts_E_RABItem(rab_id := g_pars.erabs[idx].erab_id,
+ cause := { transport := transport_resource_unavailable });
+ items_not_modified[i] := ts_E_RABList(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_mme(ts_S1AP_RABModifyCnf(g_pars.mme_ue_id, enb_ue_id,
+ rab_modified_items := items_modified,
+ rab_failed_items := items_not_modified,
+ rab_release_items := items_release));
+}
+
+function f_ConnHdlr_rx_erab_modify_cnf(in ERabIdxList erabs_modified := {},
+ in ERabIdxList erabs_not_modified := {},
+ in ERabIdxList erabs_release := {})
+runs on ConnHdlr return S1AP_PDU {
+ var template E_RABModifyListBearerModConf items_modified := omit;
+ var template E_RABList items_not_modified := omit;
+ var template E_RABList items_release := omit;
+ var ENB_UE_S1AP_ID enb_ue_id := g_pars.idx;
+ var S1AP_PDU pdu;
+
+ for (var integer i := 0; i < lengthof(erabs_modified); i := i + 1) {
+ var template (present) E_RABModifyItemBearerModConf item;
+ var ERabIdx idx := erabs_modified[i];
+
+ item := tr_E_RABModifyItemBearerModConf(rab_id := g_pars.erabs[idx].erab_id);
+ items_modified[i] := tr_E_RABModifyListBearerModConf(item)[0];
+ }
+
+ for (var integer i := 0; i < lengthof(erabs_not_modified); i := i + 1) {
+ var template (present) E_RABItem item;
+ var ERabIdx idx := erabs_not_modified[i];
+
+ item := tr_E_RABItem(rab_id := g_pars.erabs[idx].erab_id,
+ cause := { transport := transport_resource_unavailable });
+ items_not_modified[i] := tr_E_RABList(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_mme(pdu, tr_S1AP_RABModifyCnf(g_pars.mme_ue_id, enb_ue_id,
+ rab_modified_items := items_modified,
+ rab_failed_items := items_not_modified,
+ rab_release_items := items_release));
+ return pdu;
+}
+
private function f_ts_E_RABList(in ERabList erabs,
S1AP_IEs.Cause cause)
return template (value) E_RABList {
@@ -996,6 +1155,64 @@
f_ConnHdlr_rx_erab_modify_rsp(erabs_modified, erabs_failed);
}
+function f_ConnHdlr_erab_modify_ind(in ERabIdxList erabs_modified,
+ in ERabIdxList erabs_not_modified := {})
+runs on ConnHdlr {
+ log("[eNB -> S1GW] -> MME: E-RAB MODIFICATION INDICATION");
+ f_ConnHdlr_tx_erab_modify_ind(erabs_modified, erabs_not_modified);
+ /* Expect the S1GW to modify FARs (id=1) of the respective PFCP sessions */
+ for (var integer i := 0; i < lengthof(erabs_modified); i := i + 1) {
+ var ERabIdx idx := erabs_modified[i];
+ var ERab erab := g_pars.erabs[idx];
+
+ log("UPF <- S1GW: PFCP Session Modification Request for E-RAB ID ", erab.erab_id);
+ var PDU_PFCP pdu := f_ConnHdlr_rx_session_modify_req(epars := erab.u2am,
+ seid := erab.pfcp_loc_seid,
+ far_id := c_PFCP_FAR_ID_C2A);
+ log("UPF -> S1GW: PFCP Session Modification Response for E-RAB ID ", erab.erab_id);
+ f_ConnHdlr_tx_session_modify_resp(erab, pdu);
+ }
+ log("eNB -> [S1GW -> MME]: E-RAB MODIFICATION INDICATION");
+ f_ConnHdlr_rx_erab_modify_ind(erabs_modified, erabs_not_modified);
+}
+
+function f_ConnHdlr_erab_modify_cnf(in ERabIdxList erabs_modified := {},
+ in ERabIdxList erabs_not_modified := {},
+ in ERabIdxList erabs_release := {})
+runs on ConnHdlr {
+ log("eNB <- [S1GW <- MME]: E-RAB MODIFICATION CONFIRMATION");
+ f_ConnHdlr_tx_erab_modify_cnf(erabs_modified, erabs_not_modified, erabs_release);
+ /* For successfully modified E-RABs, U2AM becomes U2A */
+ for (var integer i := 0; i < lengthof(erabs_modified); i := i + 1) {
+ var ERabIdx idx := erabs_modified[i];
+ g_pars.erabs[idx].u2a := g_pars.erabs[idx].u2am;
+ }
+ /* Expect the S1GW to modify (revert) FARs (id=1) for failed E-RABs (if any) */
+ for (var integer i := 0; i < lengthof(erabs_not_modified); i := i + 1) {
+ var ERabIdx idx := erabs_not_modified[i];
+ var ERab erab := g_pars.erabs[idx];
+
+ log("UPF <- S1GW: PFCP Session Modification Request for E-RAB ID ", erab.erab_id);
+ var PDU_PFCP pdu := f_ConnHdlr_rx_session_modify_req(epars := erab.u2a,
+ seid := erab.pfcp_loc_seid,
+ far_id := c_PFCP_FAR_ID_C2A);
+ log("UPF -> S1GW: PFCP Session Modification Response for E-RAB ID ", erab.erab_id);
+ f_ConnHdlr_tx_session_modify_resp(erab, pdu);
+ }
+ /* Expect the S1GW to delete sessions for released E-RABs (if any) */
+ if (lengthof(erabs_release) > 0) {
+ var ERabList erabs;
+
+ for (var integer i := 0; i < lengthof(erabs_release); i := i + 1) {
+ var ERabIdx idx := erabs_release[i];
+ erabs[i] := g_pars.erabs[idx];
+ }
+ f_ConnHdlr_session_delete(erabs);
+ }
+ log("[eNB <- S1GW] <- MME: E-RAB MODIFICATION CONFIRMATION");
+ f_ConnHdlr_rx_erab_modify_cnf(erabs_modified, erabs_not_modified, erabs_release);
+}
+
function f_ConnHdlr_erab_release_cmd(inout ERabList erabs,
S1AP_IEs.Cause cause := c_REL_CMD_CAUSE)
runs on ConnHdlr {
diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn
index 2533fd6..e722a10 100644
--- a/s1gw/S1GW_Tests.ttcn
+++ b/s1gw/S1GW_Tests.ttcn
@@ -159,6 +159,7 @@
a2u := {'0202'O & uid, "127.0.2.2"},
u2a := {'0002'O & uid, "127.0.0.2"},
u2cm := {'0011'O & uid, "127.127.0.1"},
+ u2am := {'0022'O & uid, "127.127.0.2"},
pfcp_loc_seid := seid_prefix & uid,
pfcp_rem_seid := omit /* assigned by S1GW */
};
@@ -434,6 +435,41 @@
f_TC_exec(refers(f_TC_e_rab_modify_req_rsp), mp_multi_enb_num, 4);
}
+/* Test E-RAB MODIFICATION Ind/Cnf procedure */
+function f_TC_e_rab_modify_ind_cnf(charstring id) runs on ConnHdlr {
+ 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(g_pars.erabs);
+ f_ConnHdlr_erab_setup_rsp(g_pars.erabs);
+
+ /* eNB wants to modify all E-RABs but E-RAB 4 */
+ f_ConnHdlr_erab_modify_ind(erabs_modified := {0, 1, 2, 3},
+ erabs_not_modified := {4});
+ /* MME modifies E-RABs 1 and 3, but not E-RAB 0 and 2 */
+ f_ConnHdlr_erab_modify_cnf(erabs_modified := {1, 3},
+ erabs_not_modified := {0, 2});
+
+ /* For the sake of fun, test forwarding of an empty confirmation,
+ * which is expected to be forwarded unmodified */
+ f_ConnHdlr_erab_modify_cnf();
+
+ f_ConnHdlr_erab_release_cmd(g_pars.erabs);
+ f_ConnHdlr_erab_release_rsp(g_pars.erabs);
+
+ f_ConnHdlr_s1ap_disconnect();
+ f_ConnHdlr_s1ap_unregister(g_pars.genb_id);
+}
+/* 5 E-RABs at a time, single eNB */
+testcase TC_e_rab_modify_ind_cnf() runs on test_CT {
+ f_TC_exec(refers(f_TC_e_rab_modify_ind_cnf), 1, 5);
+}
+/* 5 E-RABs at a time, multiple eNB connections */
+testcase TC_e_rab_modify_ind_cnf_multi() runs on test_CT {
+ f_TC_exec(refers(f_TC_e_rab_modify_ind_cnf), mp_multi_enb_num, 5);
+}
+
/* Test INITIAL CONTEXT SETUP procedure (successful case) */
function f_TC_initial_ctx_setup(charstring id) runs on ConnHdlr {
f_ConnHdlr_s1ap_register(g_pars.genb_id);
@@ -571,6 +607,8 @@
execute( TC_e_rab_setup_failure() );
execute( TC_e_rab_modify_req_rsp() );
execute( TC_e_rab_modify_req_rsp_multi() );
+ execute( TC_e_rab_modify_ind_cnf() );
+ execute( TC_e_rab_modify_ind_cnf_multi() );
execute( TC_initial_ctx_setup() );
execute( TC_initial_ctx_setup3() );
execute( TC_initial_ctx_setup_multi() );
diff --git a/s1gw/expected-results.xml b/s1gw/expected-results.xml
index a4e6e02..74936f5 100644
--- a/s1gw/expected-results.xml
+++ b/s1gw/expected-results.xml
@@ -1,5 +1,5 @@
<?xml version="1.0"?>
-<testsuite name='S1GW_Tests' tests='22' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
+<testsuite name='S1GW_Tests' tests='24' failures='0' errors='0' skipped='0' inconc='0' time='MASKED'>
<testcase classname='S1GW_Tests' name='TC_setup' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_setup_multi' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_conn_term_by_mme' time='MASKED'/>
@@ -12,6 +12,8 @@
<testcase classname='S1GW_Tests' name='TC_e_rab_setup_failure' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_e_rab_modify_req_rsp' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_e_rab_modify_req_rsp_multi' time='MASKED'/>
+ <testcase classname='S1GW_Tests' name='TC_e_rab_modify_ind_cnf' time='MASKED'/>
+ <testcase classname='S1GW_Tests' name='TC_e_rab_modify_ind_cnf_multi' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_initial_ctx_setup' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_initial_ctx_setup3' time='MASKED'/>
<testcase classname='S1GW_Tests' name='TC_initial_ctx_setup_multi' time='MASKED'/>
To view, visit change 39145. To unsubscribe, or for help writing mail filters, visit settings.