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 <vyanitskiy(a)sysmocom.de>