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>

Reply via email to