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 <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>