fixeria has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38102?usp=email )
Change subject: s1gw: fix TC_e_rab_setup: handle PFCP Session related PDUs ...................................................................... s1gw: fix TC_e_rab_setup: handle PFCP Session related PDUs S1GW_Tests.TC_e_rab_setup is failing since we introduced the PFCP support to osmo-s1gw. The IUT now requires co-located UPF, which we need to emulate in the testsuite. This patch patch adds the following API: * S1GW_ConnHdlr.f_ConnHdlr_rx_session_establish_req(), * S1GW_ConnHdlr.f_ConnHdlr_tx_session_establish_resp(), * S1GW_ConnHdlr.f_ConnHdlr_rx_session_modify_req(), * S1GW_ConnHdlr.f_ConnHdlr_tx_session_modify_resp(), and makes use of it in S1GW_Tests.TC_e_rab_setup. Change-Id: Ibbb326badaa1e3df968c137f3e4b576ca5c6f94d --- M s1gw/S1GW_ConnHdlr.ttcn M s1gw/S1GW_Tests.ttcn 2 files changed, 136 insertions(+), 13 deletions(-) git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/02/38102/1 diff --git a/s1gw/S1GW_ConnHdlr.ttcn b/s1gw/S1GW_ConnHdlr.ttcn index a43f333..0f205a4 100644 --- a/s1gw/S1GW_ConnHdlr.ttcn +++ b/s1gw/S1GW_ConnHdlr.ttcn @@ -51,7 +51,11 @@ type record ConnHdlrPars { integer idx, Global_ENB_ID genb_id, - charstring statsd_prefix + charstring statsd_prefix, + charstring pfcp_loc_addr, + charstring pfcp_rem_addr, + OCT8 pfcp_loc_seid, + OCT8 pfcp_rem_seid optional }; template Global_ENB_ID @@ -384,4 +388,106 @@ return pdu; } +function f_ConnHdlr_rx_session_establish_req(in ERabParams u2c) +runs on ConnHdlr return PDU_PFCP { + var OCT4 addr := f_inet_addr(g_pars.pfcp_rem_addr); + + /* Packet Detection Rules */ + var template (present) Outer_Header_Removal ohr; + var template (present) Create_PDR pdr1; + var template (present) Create_PDR pdr2; + + ohr := tr_PFCP_Outer_Header_Removal(GTP_U_UDP_IPV4); + pdr1 := tr_PFCP_Create_PDR(pdr_id := 1, /* -- for Core -> Access */ + pdi := tr_PFCP_PDI(CORE), + ohr := ohr, + far_id := 1); + pdr2 := tr_PFCP_Create_PDR(pdr_id := 2, /* -- for Access -> Core */ + pdi := tr_PFCP_PDI(ACCESS), + ohr := ohr, + far_id := 2); + + /* Forwarding Action Rules */ + var template (present) Outer_Header_Creation ohc2; + var template (present) Forwarding_Parameters fpars2; + var template (present) Create_FAR far1; + var template (present) Create_FAR far2; + + ohc2 := tr_PFCP_Outer_Header_Creation_GTP_ipv4(u2c.teid, f_inet_addr(u2c.tla)); + fpars2 := tr_PFCP_Forwarding_Parameters(CORE, ohc2); + + far1 := tr_PFCP_Create_FAR(far_id := 1, /* -- for Core -> Access */ + aa := tr_PFCP_Apply_Action_DROP, + fp := omit); + far2 := tr_PFCP_Create_FAR(far_id := 2, /* -- for Access -> Core */ + aa := tr_PFCP_Apply_Action_FORW, + fp := fpars2); + + /* The final Session Establishment Request PDU */ + var template (present) PDU_PFCP tr_pdu; + tr_pdu := tr_PFCP_Session_Est_Req(node_id := tr_PFCP_Node_ID_ipv4(addr), + cp_f_seid := tr_PFCP_F_SEID_ipv4(addr), + create_pdr := {pdr1, pdr2}, + create_far := {far1, far2}); + return f_ConnHdlr_pfcp_expect(tr_pdu); +} + +function f_ConnHdlr_tx_session_establish_resp(in PDU_PFCP req, + in ERabParams c2u, + in ERabParams a2u) +runs on ConnHdlr { + var OCT4 addr := f_inet_addr(g_pars.pfcp_loc_addr); + var PFCP_Session_Establishment_Request serq; + + serq := req.message_body.pfcp_session_establishment_request; + g_pars.pfcp_rem_seid := serq.CP_F_SEID.seid; /* store peer's SEID */ + + /* Created Packet Detection Rules */ + var template (value) Created_PDR pdr1; + var template (value) Created_PDR pdr2; + pdr1 := ts_PFCP_Created_PDR(pdr_id := serq.create_PDR_list[0].grouped_ie.pdr_id, + local_F_TEID := ts_PFCP_F_TEID_ipv4(c2u.teid, f_inet_addr(c2u.tla))); + pdr2 := ts_PFCP_Created_PDR(pdr_id := serq.create_PDR_list[1].grouped_ie.pdr_id, + local_F_TEID := ts_PFCP_F_TEID_ipv4(a2u.teid, f_inet_addr(a2u.tla))); + + /* The final Session Establishment Response PDU */ + 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 := g_pars.pfcp_rem_seid, + f_seid := ts_PFCP_F_SEID_ipv4(addr, g_pars.pfcp_loc_seid), + created_pdr := {pdr1, pdr2}); + PFCP.send(resp); +} + +function f_ConnHdlr_rx_session_modify_req(in ERabParams u2a) +runs on ConnHdlr return PDU_PFCP { + /* Forwarding Action Rules */ + var template (present) Outer_Header_Creation ohc1; + var template (present) Update_Forwarding_Parameters fpars1; + var template (present) Update_FAR far1; + + ohc1 := tr_PFCP_Outer_Header_Creation_GTP_ipv4(u2a.teid, f_inet_addr(u2a.tla)); + fpars1 := tr_PFCP_Update_Forwarding_Parameters(ohc := ohc1); + + far1 := tr_PFCP_Update_FAR(far_id := 1, /* -- for Core -> Access */ + aa := tr_PFCP_Apply_Action_FORW, + fp := fpars1); + + /* The final Session Modification Request PDU */ + var template (present) PDU_PFCP tr_pdu; + tr_pdu := tr_PFCP_Session_Mod_Req(seid := g_pars.pfcp_loc_seid, + update_far := far1); + return f_ConnHdlr_pfcp_expect(tr_pdu); +} + +function f_ConnHdlr_tx_session_modify_resp(in PDU_PFCP req) +runs on ConnHdlr { + /* The final Session Modification Response PDU */ + var template (value) PDU_PFCP resp; + resp := ts_PFCP_Session_Mod_Resp(seq_nr := req.sequence_number, + seid := g_pars.pfcp_rem_seid); + PFCP.send(resp); +} + } diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn index ce378f8..9a21594 100644 --- a/s1gw/S1GW_Tests.ttcn +++ b/s1gw/S1GW_Tests.ttcn @@ -111,10 +111,16 @@ template (value) ConnHdlrPars t_ConnHdlrPars(integer idx := 0, - charstring statsd_prefix := mp_statsd_prefix) := { + charstring statsd_prefix := mp_statsd_prefix, + charstring pfcp_loc_addr := mp_upf_bind_ip, + charstring pfcp_rem_addr := mp_s1gw_upf_ip) := { idx := idx, genb_id := ts_Global_ENB_ID(idx), - statsd_prefix := statsd_prefix + statsd_prefix := statsd_prefix, + pfcp_loc_addr := pfcp_loc_addr, + pfcp_rem_addr := pfcp_rem_addr, + pfcp_loc_seid := int2oct(idx, 8), + pfcp_rem_seid := omit /* generated by the IUT */ } function f_ConnHdlr_spawn(void_fn fn, ConnHdlrPars pars) @@ -251,23 +257,34 @@ function f_TC_e_rab_setup(charstring id) runs on ConnHdlr { const E_RAB_ID erab_id := 0; - var GTP_TEID teid; + const ERabParams u2c := {erab_id, '00000001'O, "127.0.0.1"}; + const ERabParams c2u := {erab_id, '00000101'O, "127.0.1.1"}; + const ERabParams a2u := {erab_id, '00000202'O, "127.0.2.2"}; + const ERabParams u2a := {erab_id, '00000002'O, "127.0.0.2"}; + var PDU_PFCP pfcp_pdu; f_ConnHdlr_register_pfcp(); 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); - log("eNB <- [S1GW] <- MME: E-RAB SETUP REQUEST"); - teid := f_rnd_octstring(4); - f_ConnHdlr_tx_erab_setup_req({{erab_id, teid, "1.2.3.4"}}); - f_ConnHdlr_rx_erab_setup_req({{erab_id, teid, mp_s1gw_mme_ip}}); + log("eNB <- [S1GW <- MME]: E-RAB SETUP REQUEST"); + f_ConnHdlr_tx_erab_setup_req({u2c}); + log("UPF <- S1GW: PFCP Session Establishment Request"); + pfcp_pdu := f_ConnHdlr_rx_session_establish_req(u2c); + log("UPF -> S1GW: PFCP Session Establishment Response"); + f_ConnHdlr_tx_session_establish_resp(pfcp_pdu, c2u, a2u); + log("[eNB <- S1GW] <- MME: E-RAB SETUP REQUEST"); + f_ConnHdlr_rx_erab_setup_req({a2u}); - - log("eNB -> [S1GW] -> MME: E-RAB SETUP RESPONSE"); - teid := f_rnd_octstring(4); - f_ConnHdlr_tx_erab_setup_rsp({{erab_id, teid, "4.3.2.1"}}); - f_ConnHdlr_rx_erab_setup_rsp({{erab_id, teid, mp_s1gw_enb_ip}}); + log("[eNB -> S1GW] -> MME: E-RAB SETUP RESPONSE"); + f_ConnHdlr_tx_erab_setup_rsp({u2a}); + log("UPF <- S1GW: PFCP Session Modification Request"); + pfcp_pdu := f_ConnHdlr_rx_session_modify_req(u2a); + log("UPF -> S1GW: PFCP Session Modification Response"); + f_ConnHdlr_tx_session_modify_resp(pfcp_pdu); + log("eNB -> [S1GW -> MME]: E-RAB SETUP RESPONSE"); + f_ConnHdlr_rx_erab_setup_rsp({c2u}); f_ConnHdlr_s1ap_disconnect(); f_ConnHdlr_s1ap_unregister(g_pars.genb_id); -- To view, visit https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/38102?usp=email To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email Gerrit-MessageType: newchange Gerrit-Project: osmo-ttcn3-hacks Gerrit-Branch: master Gerrit-Change-Id: Ibbb326badaa1e3df968c137f3e4b576ca5c6f94d Gerrit-Change-Number: 38102 Gerrit-PatchSet: 1 Gerrit-Owner: fixeria <vyanits...@sysmocom.de>