pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/36128?usp=email )
Change subject: GTPv2_Emulation: Add support to handle GTPv1-U ......................................................................
GTPv2_Emulation: Add support to handle GTPv1-U
Change-Id: I34c744015c09a387cbf736063303bdb61ca4744e --- M epdg/EPDG_Tests.ttcn M epdg/gen_links.sh M epdg/regen_makefile.sh M library/GTPv2_Emulation.ttcn 4 files changed, 54 insertions(+), 4 deletions(-)
Approvals: pespin: Looks good to me, approved laforge: Looks good to me, but someone else must approve Jenkins Builder: Verified osmith: Looks good to me, but someone else must approve
diff --git a/epdg/EPDG_Tests.ttcn b/epdg/EPDG_Tests.ttcn index 6263828..92f49ff 100644 --- a/epdg/EPDG_Tests.ttcn +++ b/epdg/EPDG_Tests.ttcn @@ -18,6 +18,10 @@ import from DIAMETER_ts29_273_Templates all; import from DIAMETER_Emulation all;
+import from GTPv1U_CodecPort all; +import from GTPU_Types all; +import from GTPv1U_Templates all; + import from GTPv2_Types all; import from GTPv2_Templates all; import from GTPv2_Emulation all; @@ -50,6 +54,8 @@ charstring mp_s2b_dns_ipv6 := "::1"; charstring mp_s2b_pcscf_ipv4 := "5.6.7.8"; charstring mp_s2b_pcscf_ipv6 := "::2"; + /* our emulated PGW /* GTP1U */ + charstring mp_upf_gtpu_local_ip := "127.0.0.100";
charstring mp_diam_realm := "localdomain"; integer mp_diam_watchdog_initial_wait_sec := 6*3; @@ -289,6 +295,8 @@ gtpc_bind_port := mp_s2b_local_port, gtpc_remote_ip := mp_s2b_remote_ip, gtpc_remote_port := mp_s2b_remote_port, + gtpu_bind_ip := mp_upf_gtpu_local_ip, + gtpu_bind_port := GTP1U_PORT, sgw_role := false, use_gtpu_daemon := false /* TODO: maybe use, set to true */ }; diff --git a/epdg/gen_links.sh b/epdg/gen_links.sh index f981586..ed4209c 100755 --- a/epdg/gen_links.sh +++ b/epdg/gen_links.sh @@ -33,6 +33,10 @@ FILES="UECUPS_CodecPort.ttcn UECUPS_CodecPort_CtrlFunct.ttcn UECUPS_CodecPort_CtrlFunctDef.cc UECUPS_Types.ttcn " gen_links $DIR $FILES
+DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src +FILES="GTPU_EncDec.cc GTPU_Types.ttcn " +gen_links $DIR $FILES + DIR=$BASEDIR/titan.ProtocolModules.GTPv2_v13.7.0/src FILES="GTPv2_Types.ttcn" gen_links $DIR $FILES @@ -47,6 +51,7 @@ FILES+="IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp " FILES+="PCO_Types.ttcn GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn " +FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn " FILES+="GTPv2_PrivateExtensions.ttcn GTPv2_Templates.ttcn " FILES+="GTPv2_CodecPort.ttcn GTPv2_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunct.ttcn GTPv2_Emulation.ttcn " gen_links $DIR $FILES diff --git a/epdg/regen_makefile.sh b/epdg/regen_makefile.sh index 8be3bde..eb5935e 100755 --- a/epdg/regen_makefile.sh +++ b/epdg/regen_makefile.sh @@ -16,6 +16,8 @@ DIAMETER_EncDec.cc DIAMETER_CodecPort_CtrlFunctDef.cc UECUPS_CodecPort_CtrlFunctDef.cc + GTPU_EncDec.cc + GTPv1U_CodecPort_CtrlFunctDef.cc GTPv2_CodecPort_CtrlFunctDef.cc "
diff --git a/library/GTPv2_Emulation.ttcn b/library/GTPv2_Emulation.ttcn index 054bd4b..f3f09f8 100644 --- a/library/GTPv2_Emulation.ttcn +++ b/library/GTPv2_Emulation.ttcn @@ -14,6 +14,9 @@ import from IPL4asp_Types all; import from General_Types all; import from Osmocom_Types all; +import from GTPU_Types all; +import from GTPv1U_CodecPort all; +import from GTPv1U_CodecPort_CtrlFunct all; import from GTPv2_Types all; import from GTPv2_Templates all; import from GTPv2_CodecPort all; @@ -40,8 +43,8 @@ IPL4asp_Types.PortNumber gtpc_bind_port, HostName gtpc_remote_ip, IPL4asp_Types.PortNumber gtpc_remote_port, - //HostName gtpu_bind_ip, - //PortNumber gtpu_bind_port, + HostName gtpu_bind_ip optional, + IPL4asp_Types.PortNumber gtpu_bind_port optional, boolean sgw_role, boolean use_gtpu_daemon }; @@ -49,6 +52,7 @@ type component GTPv2_Emulation_CT { /* Communication with underlying GTP CodecPort */ port GTPv2C_PT GTP2C; + port GTPU_PT GTPU;
/* Control port to GTP-U Daemon */ port UECUPS_CODEC_PT UECUPS; @@ -63,7 +67,7 @@
/* State */ var Gtp2cPeer g_peer; - var integer g_gtp2c_id; + var integer g_gtp2c_id, g_gtp1u_id; var OCT1 g_restart_ctr; var uint16_t g_c_seq_nr; var TidTableRec TidTable[256]; @@ -508,6 +512,11 @@
/* clear all tunnel state in the daemon at start */ f_uecups_xceive({reset_all_state := {}}, {reset_all_state_res:=?}, 30.0); + } else if (isvalue(cfg.gtpu_bind_ip) and isvalue(cfg.gtpu_bind_port)) { + map(self:GTPU, system:GTPU); + res := GTPv1U_CodecPort_CtrlFunct.f_GTPU_listen(GTPU, cfg.gtpu_bind_ip, + cfg.gtpu_bind_port, {udp:={}}); + g_gtp1u_id := res.connId; }
/* make sure we always pass incoming UECUPS indications whenever receiving fom the UECUPS port */ @@ -543,6 +552,7 @@
function main(Gtp2EmulationCfg cfg) runs on GTPv2_Emulation_CT { var Gtp2cUnitdata g2c_ud; + var Gtp1uUnitdata g1u_ud; var PDU_GTPCv2 g2c; var GTP2_ConnHdlr vc_conn; var hexstring imsi; @@ -589,6 +599,16 @@ }
} + [] GTPU.receive(Gtp1uUnitdata:?) -> value g1u_ud { + if (f_teid_known(g1u_ud.gtpu.teid)) { + vc_conn := f_comp_by_teid(g1u_ud.gtpu.teid); + CLIENT.send(g1u_ud) to vc_conn; + } else if (g1u_ud.gtpu.teid == '00000000'O) { + TEID0.send(g1u_ud); + } else { + log("No client registered for TEID=", g1u_ud.gtpu.teid, "!"); + } + }
[] TEID0.receive(PDU_GTPCv2:?) -> value g2c sender vc_conn { /* patch in the next sequence number on outbound Initial message */ @@ -603,6 +623,9 @@ f_seq_tbl_add(g2c.sequenceNumber, vc_conn); } } + [] TEID0.receive(Gtp1uUnitdata:?) -> value g1u_ud sender vc_conn { + GTPU.send(g1u_ud); + }
[] CLIENT.receive(PDU_GTPCv2:?) -> value g2c sender vc_conn { /* patch in the next sequence number on outbound Initial message */ @@ -617,6 +640,9 @@ f_seq_tbl_add(g2c.sequenceNumber, vc_conn); } } + [] CLIENT.receive(Gtp1uUnitdata:?) -> value g1u_ud sender vc_conn { + GTPU.send(g1u_ud); + }
[] CLIENT_PROC.getcall(GTP2EM_register_imsi:{?}) -> param(imsi) sender vc_conn { f_imsi_tbl_add(imsi, vc_conn); @@ -662,7 +688,7 @@ * Interaction between Main and Client Components ***********************************************************************/ type port GTP2EM_PT message { - inout PDU_GTPCv2, UECUPS_ProgramTermInd; + inout PDU_GTPCv2, Gtp1uUnitdata, UECUPS_ProgramTermInd; } with { extension "internal" };
signature GTP2EM_register_imsi(hexstring imsi);