fixeria has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/42496?usp=email )
Change subject: s1gw: generalize f_TC_e_rab_setup_failure() for N E-RABs ......................................................................
s1gw: generalize f_TC_e_rab_setup_failure() for N E-RABs
The existing TC only tested PFCP Session Establishment failure with a single E-RAB. Generalize f_TC_e_rab_setup_failure() to use g_pars.erabs throughout, so it works for any num_erabs: E-RAB 0 still triggers the only PFCP Session Establishment Request (S1GW processes sequentially), while all E-RABs in the request are expected to appear in the failure response.
Add TC_e_rab_setup3_failure() which re-uses the same body with num_erabs := 3, verifying that the S1GW lists all three E-RABs as failed rather than just the first one. Also make f_tr_E_RABList() non-private so it is accessible from S1GW_Tests.ttcn.
Change-Id: I8a5dc338d28013dc85e1ce4b3bdac92cb3b35304 Related: osmo-s1gw.git I7933fceb0edcdfdc95ace35416297b11c83f0bc9 --- M s1gw/S1GW_ConnHdlr.ttcn M s1gw/S1GW_Tests.ttcn M s1gw/expected-results.xml 3 files changed, 26 insertions(+), 20 deletions(-)
Approvals: Jenkins Builder: Verified pespin: Looks good to me, approved laforge: Looks good to me, but someone else must approve
diff --git a/s1gw/S1GW_ConnHdlr.ttcn b/s1gw/S1GW_ConnHdlr.ttcn index fd171d3..63e828b 100644 --- a/s1gw/S1GW_ConnHdlr.ttcn +++ b/s1gw/S1GW_ConnHdlr.ttcn @@ -886,8 +886,8 @@
return items; } -private function f_tr_E_RABList(in ERabList erabs, - S1AP_IEs.Cause cause) +function f_tr_E_RABList(in ERabList erabs, + S1AP_IEs.Cause cause) return template (present) E_RABList { var template (present) E_RABList items;
diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn index f86546c..61f2a61 100644 --- a/s1gw/S1GW_Tests.ttcn +++ b/s1gw/S1GW_Tests.ttcn @@ -493,11 +493,13 @@ f_TC_exec(refers(f_TC_e_rab_release_ind)); }
-/* Test E-RAB SETUP procedure being aborted by the S1GW due to - * PFCP Session Establishment failure (cause=REQUEST_REJECTED). */ +/* Test E-RAB SETUP failure: all E-RABs in the request fail because the first + * PFCP Session Establishment is rejected. The S1GW processes E-RABs sequentially, + * so only E-RAB 0 triggers a PFCP Session Establishment Request; the remaining + * E-RABs (if any) are abandoned. The S1GW must list all E-RABs as failed. */ function f_TC_e_rab_setup_failure(charstring id) runs on ConnHdlr { var OCT4 addr := f_inet_addr(g_pars.pfcp_loc_addr); - var ERab erab := g_pars.erabs[0]; + var ERab erab0 := g_pars.erabs[0];
f_ConnHdlr_s1ap_register(g_pars.genb_id); f_ConnHdlr_s1ap_connect(mp_enb_bind_ip, mp_s1gw_enb_ip); @@ -505,46 +507,48 @@
/* see comments in f_ConnHdlr_erab_setup_req() */ f_PFCPEM_subscribe_seid('0000000000000000'O); - f_PFCPEM_subscribe_seid(erab.pfcp_loc_seid); + f_PFCPEM_subscribe_seid(erab0.pfcp_loc_seid);
log("eNB <- [S1GW <- MME]: E-RAB SETUP REQUEST"); - f_ConnHdlr_tx_erab_setup_req({erab}, g_pars.mme_ue_id, g_pars.idx); - log("UPF <- S1GW: PFCP Session Establishment Request"); - var PDU_PFCP req := f_ConnHdlr_rx_session_establish_req(erab); - /* store peer's SEID, so that it can be used in outgoing PDUs later */ - erab.pfcp_rem_seid := req.message_body.pfcp_session_establishment_request.CP_F_SEID.seid; + f_ConnHdlr_tx_erab_setup_req(g_pars.erabs, g_pars.mme_ue_id, g_pars.idx); + log("UPF <- S1GW: PFCP Session Establishment Request (E-RAB 0)"); + var PDU_PFCP req := f_ConnHdlr_rx_session_establish_req(erab0); + erab0.pfcp_rem_seid := req.message_body.pfcp_session_establishment_request.CP_F_SEID.seid;
log("UPF -> S1GW: PFCP Session Establishment Response (failure)"); var template (value) PDU_PFCP resp; resp := ts_PFCP_Session_Est_Resp(seq_nr := req.sequence_number, node_id := ts_PFCP_Node_ID_ipv4(addr), - seid := erab.pfcp_rem_seid, - f_seid := ts_PFCP_F_SEID_ipv4(addr, erab.pfcp_loc_seid), + seid := erab0.pfcp_rem_seid, + f_seid := ts_PFCP_F_SEID_ipv4(addr, erab0.pfcp_loc_seid), created_pdr := {}, cause := ts_PFCP_Cause(REQUEST_REJECTED)); PFCP.send(resp);
/* see comments in f_ConnHdlr_erab_setup_req() */ f_PFCPEM_unsubscribe_seid('0000000000000000'O); - f_PFCPEM_unsubscribe_seid(erab.pfcp_loc_seid); + f_PFCPEM_unsubscribe_seid(erab0.pfcp_loc_seid);
- /* expect E-RAB SETUP RESPONSE replied by the S1GW */ + log("eNB -- [S1GW -> MME]: E-RAB SETUP RESPONSE (all E-RABs failed)"); + var template (present) E_RABList failed_items; var template (present) S1AP_PDU setup_rsp; - var template (present) E_RABItem item; var S1AP_PDU s1ap_pdu;
- log("eNB -- [S1GW -> MME]: E-RAB SETUP RESPONSE (failure)"); - item := tr_E_RABItem(erab.erab_id, {transport := transport_resource_unavailable}); + failed_items := f_tr_E_RABList(g_pars.erabs, + cause := {transport := transport_resource_unavailable}); setup_rsp := tr_S1AP_RABSetupRsp(g_pars.mme_ue_id, g_pars.idx, rab_setup_items := omit, - rab_failed_items := tr_E_RABList(item)); + rab_failed_items := failed_items); f_ConnHdlr_rx_s1ap_from_enb(s1ap_pdu, setup_rsp);
f_ConnHdlr_s1ap_disconnect(); f_ConnHdlr_s1ap_unregister(g_pars.genb_id); } testcase TC_e_rab_setup_failure() runs on test_CT { - f_TC_exec(refers(f_TC_e_rab_setup_failure)); + f_TC_exec(refers(f_TC_e_rab_setup_failure), num_erabs := 1); +} +testcase TC_e_rab_setup3_failure() runs on test_CT { + f_TC_exec(refers(f_TC_e_rab_setup_failure), num_erabs := 3); }
/* Test E-RAB MODIFY Req/Rsp procedure */ @@ -1374,6 +1378,7 @@ execute( TC_e_rab_setup3_multi() ); execute( TC_e_rab_release_ind() ); execute( TC_e_rab_setup_failure() ); + execute( TC_e_rab_setup3_failure() ); execute( TC_e_rab_modify_req_rsp() ); execute( TC_e_rab_modify_req_rsp_multi() ); execute( TC_e_rab_modify_ind_cnf() ); diff --git a/s1gw/expected-results.xml b/s1gw/expected-results.xml index b2b6cdb..5e1e9cb 100644 --- a/s1gw/expected-results.xml +++ b/s1gw/expected-results.xml @@ -10,6 +10,7 @@ <testcase classname='S1GW_Tests' name='TC_e_rab_setup3_multi' time='MASKED'/> <testcase classname='S1GW_Tests' name='TC_e_rab_release_ind' time='MASKED'/> <testcase classname='S1GW_Tests' name='TC_e_rab_setup_failure' time='MASKED'/> + <testcase classname='S1GW_Tests' name='TC_e_rab_setup3_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'/>