laforge has submitted this change. ( 
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, 174 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 7737676..cd61123 100644
--- a/s1gw/S1GW_ConnHdlr.ttcn
+++ b/s1gw/S1GW_ConnHdlr.ttcn
@@ -51,7 +51,10 @@
 type record ConnHdlrPars {
        integer idx,
        Global_ENB_ID genb_id,
-       charstring statsd_prefix
+       charstring statsd_prefix,
+       charstring pfcp_loc_addr,
+       charstring pfcp_rem_addr,
+       ERabList erabs
 };

 template Global_ENB_ID
@@ -289,7 +292,9 @@
        ERabParams u2c,         /* UPF -> Core params */
        ERabParams c2u,         /* Core -> UPF params */
        ERabParams a2u,         /* Access -> UPF params */
-       ERabParams u2a          /* UPF -> Access params */
+       ERabParams u2a,         /* UPF -> Access params */
+       OCT8 pfcp_loc_seid,
+       OCT8 pfcp_rem_seid optional
 };

 type record ERabParams {
@@ -394,4 +399,139 @@
        return pdu;
 }

+function f_ConnHdlr_rx_session_establish_req(in ERab erab)
+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(erab.u2c.teid,
+                                                      
f_inet_addr(erab.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 ERab erab,
+                                             in PDU_PFCP req)
+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;
+
+       /* 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(erab.c2u.teid,
+                                                                       
f_inet_addr(erab.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(erab.a2u.teid,
+                                                                       
f_inet_addr(erab.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 := erab.pfcp_rem_seid,
+                                        f_seid := ts_PFCP_F_SEID_ipv4(addr, 
erab.pfcp_loc_seid),
+                                        created_pdr := {pdr1, pdr2});
+       PFCP.send(resp);
+}
+
+function f_ConnHdlr_rx_session_modify_req(in ERab erab)
+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(erab.u2a.teid,
+                                                      
f_inet_addr(erab.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 := erab.pfcp_loc_seid,
+                                         update_far := far1);
+       return f_ConnHdlr_pfcp_expect(tr_pdu);
+}
+
+function f_ConnHdlr_tx_session_modify_resp(in ERab erab,
+                                          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 := erab.pfcp_rem_seid);
+       PFCP.send(resp);
+}
+
+function f_ConnHdlr_erab_setup_req(inout ERabList erabs)
+runs on ConnHdlr {
+       log("eNB <- [S1GW <- MME]: E-RAB SETUP REQUEST");
+       f_ConnHdlr_tx_erab_setup_req(erabs);
+       for (var integer i := 0; i < lengthof(erabs); i := i + 1) {
+               log("UPF <- S1GW: PFCP Session Establishment Request for E-RAB 
ID ", erabs[i].erab_id);
+               var PDU_PFCP pdu := 
f_ConnHdlr_rx_session_establish_req(erabs[i]);
+               /* store peer's SEID, so that it can be used in outgoing PDUs 
later */
+               erabs[i].pfcp_rem_seid := 
pdu.message_body.pfcp_session_establishment_request.CP_F_SEID.seid;
+               log("UPF -> S1GW: PFCP Session Establishment Response for E-RAB 
ID ", erabs[i].erab_id);
+               f_ConnHdlr_tx_session_establish_resp(erabs[i], pdu);
+       }
+       log("[eNB <- S1GW] <- MME: E-RAB SETUP REQUEST");
+       f_ConnHdlr_rx_erab_setup_req(erabs);
+}
+
+function f_ConnHdlr_erab_setup_rsp(in ERabList erabs)
+runs on ConnHdlr {
+       log("[eNB -> S1GW] -> MME: E-RAB SETUP RESPONSE");
+       f_ConnHdlr_tx_erab_setup_rsp(erabs);
+       for (var integer i := 0; i < lengthof(erabs); i := i + 1) {
+               log("UPF <- S1GW: PFCP Session Modification Request for E-RAB 
ID ", erabs[i].erab_id);
+               var PDU_PFCP pdu := f_ConnHdlr_rx_session_modify_req(erabs[i]);
+               log("UPF -> S1GW: PFCP Session Modification Response for E-RAB 
ID ", erabs[i].erab_id);
+               f_ConnHdlr_tx_session_modify_resp(erabs[i], pdu);
+       }
+       log("eNB -> [S1GW -> MME]: E-RAB SETUP RESPONSE");
+       f_ConnHdlr_rx_erab_setup_rsp(erabs);
+}
+
 }
diff --git a/s1gw/S1GW_Tests.ttcn b/s1gw/S1GW_Tests.ttcn
index 1896e30..fb4ee9b 100644
--- a/s1gw/S1GW_Tests.ttcn
+++ b/s1gw/S1GW_Tests.ttcn
@@ -111,10 +111,38 @@

 template (value) ConnHdlrPars
 t_ConnHdlrPars(integer idx := 0,
-              charstring statsd_prefix := mp_statsd_prefix) := {
+              integer num_erabs := 1,
+              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,
+       erabs := f_gen_erab_list(idx, num_erabs)
+}
+
+private function f_gen_erab_list(integer idx, integer num_erabs)
+return ERabList {
+       var OCT6 seid_prefix := char2oct("TTCN-3");
+       var ERabList erabs;
+
+       for (var integer id := 0; id < num_erabs; id := id + 1) {
+               var OCT2 uid := int2oct(idx, 1) & int2oct(id, 1);
+
+               erabs[id] := {
+                       erab_id := id, /* sequentially assign E-RAB IDs */
+                       u2c := {'0001'O & uid, "127.0.0.1"},
+                       c2u := {'0101'O & uid, "127.0.1.1"},
+                       a2u := {'0202'O & uid, "127.0.2.2"},
+                       u2a := {'0002'O & uid, "127.0.0.2"},
+                       pfcp_loc_seid := seid_prefix & uid,
+                       pfcp_rem_seid := omit /* assigned by S1GW */
+               };
+       }
+
+       return erabs;
 }

 function f_ConnHdlr_spawn(void_fn fn, ConnHdlrPars pars)
@@ -250,27 +278,13 @@
 }

 function f_TC_e_rab_setup(charstring id) runs on ConnHdlr {
-       const ERab erab := {
-               erab_id := 0,
-               u2c := {'42424242'O, "1.2.3.4"},
-               c2u := {'42424242'O, mp_s1gw_mme_ip},
-               a2u := {'24242424'O, "4.3.2.1"},
-               u2a := {'24242424'O, mp_s1gw_enb_ip}
-       };
-
        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");
-       f_ConnHdlr_tx_erab_setup_req({erab});
-       f_ConnHdlr_rx_erab_setup_req({erab});
-
-
-       log("eNB -> [S1GW] -> MME: E-RAB SETUP RESPONSE");
-       f_ConnHdlr_tx_erab_setup_rsp({erab});
-       f_ConnHdlr_rx_erab_setup_rsp({erab});
+       f_ConnHdlr_erab_setup_req(g_pars.erabs);
+       f_ConnHdlr_erab_setup_rsp(g_pars.erabs);

        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: merged
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: Ibbb326badaa1e3df968c137f3e4b576ca5c6f94d
Gerrit-Change-Number: 38102
Gerrit-PatchSet: 3
Gerrit-Owner: fixeria <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>

Reply via email to