pespin has submitted this change. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40746?usp=email )
Change subject: GTPv1U_Emulation: support multiple client ports per GTP1U_ConnHdlr ......................................................................
GTPv1U_Emulation: support multiple client ports per GTP1U_ConnHdlr
This feature is already present in GTP1U code of GTP_Emulation. That part of the code will be removed and ported to use GTPv1U_Emulation, so we need to also support this feature here.
Change-Id: I10ce33f30a2da5159f8040725df619844a71d6bc --- M epdg/EPDG_Tests.ttcn M library/GTPv1U_Emulation.ttcnpp M pgw/PGW_Tests.ttcn 3 files changed, 33 insertions(+), 31 deletions(-)
Approvals: pespin: Looks good to me, approved osmith: Looks good to me, but someone else must approve Jenkins Builder: Verified laforge: Looks good to me, but someone else must approve
diff --git a/epdg/EPDG_Tests.ttcn b/epdg/EPDG_Tests.ttcn index f67fc2c..9d22b15 100644 --- a/epdg/EPDG_Tests.ttcn +++ b/epdg/EPDG_Tests.ttcn @@ -371,8 +371,8 @@ connect(vc_conn:GTP2, vc_GTP2:CLIENT); connect(vc_conn:GTP2_PROC, vc_GTP2:CLIENT_PROC); /* GTP1U */ - connect(vc_conn:GTP1U, vc_GTP1U:CLIENT); - connect(vc_conn:GTP1U_PROC, vc_GTP1U:CLIENT_PROC); + connect(vc_conn:GTP1U[0], vc_GTP1U:CLIENT); + connect(vc_conn:GTP1U_PROC[0], vc_GTP1U:CLIENT_PROC);
/* SWx */ vc_conn_swx := DIAMETER_ConnHdlr_CT.create(id); @@ -880,18 +880,18 @@ } private function f_GTP1U_send(octetstring payload) runs on EPDG_ConnHdlr { var Gtp1uPeer peer := valueof(ts_GtpPeerU(f_inet_addr(g_pars.bearer.gtpu_addr_remote))); - GTP1U.send(ts_GTP1U_GPDU(peer, omit /*opt_part*/, g_pars.bearer.teid_remote, payload)); + GTP1U[0].send(ts_GTP1U_GPDU(peer, omit /*opt_part*/, g_pars.bearer.teid_remote, payload)); } private function f_GTP1U_echo_ping_pong(uint16_t seq_nr := 0) runs on EPDG_ConnHdlr { var Gtp1uPeer peer := valueof(ts_GtpPeerU(f_inet_addr(g_pars.bearer.gtpu_addr_remote))); - GTP1U.send(ts_GTPU_PING(peer, seq := seq_nr)); - GTP1U.receive(tr_GTPU_PONG(peer)); + GTP1U[0].send(ts_GTPU_PING(peer, seq := seq_nr)); + GTP1U[0].receive(tr_GTPU_PONG(peer)); } private altstep as_GTPU_rx_icmp4(template (present) PDU_ICMP expected := ?) runs on EPDG_ConnHdlr { var Gtp1uUnitdata rx_msg; var template (value) Gtp1uPeer peer := ts_GtpPeerU(f_inet_addr(g_pars.bearer.gtpu_addr_remote));
- [] GTP1U.receive(tr_GTPU_GPDU(peer, g_pars.bearer.teid_local)) -> value rx_msg { + [] GTP1U[0].receive(tr_GTPU_GPDU(peer, g_pars.bearer.teid_local)) -> value rx_msg { /*TODO: verify gtpu txseq: if (f_verify_gtpu_txseq(ud.gtpu, use_gtpu_txseq) == false) { setverdict(fail); @@ -908,7 +908,7 @@ repeat; } } - [] GTP1U.receive(Gtp1uUnitdata:?) -> value rx_msg { + [] GTP1U[0].receive(Gtp1uUnitdata:?) -> value rx_msg { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Unexpected GTP msg rx: ", rx_msg)); } } diff --git a/library/GTPv1U_Emulation.ttcnpp b/library/GTPv1U_Emulation.ttcnpp index b3de2ab..8b76379 100644 --- a/library/GTPv1U_Emulation.ttcnpp +++ b/library/GTPv1U_Emulation.ttcnpp @@ -342,48 +342,50 @@ /*********************************************************************** * Client Component ***********************************************************************/ +/* maximum number of GTP ports a GTP_ConnHdlr component can manage. This allows + * connection one GTP_ConnHdlr to several GTP_Emulation(s). */ +const integer NUM_MAX_GTP := 4;
type component GTP1U_ConnHdlr { - port GTP1UEM_PT GTP1U; - port GTP1UEM_PROC_PT GTP1U_PROC; + port GTP1UEM_PT GTP1U[NUM_MAX_GTP]; + port GTP1UEM_PROC_PT GTP1U_PROC[NUM_MAX_GTP]; };
- -function f_gtp1u_register_teid(OCT4 teid) runs on GTP1U_ConnHdlr { - GTP1U_PROC.call(GTP1UEM_register_teid:{teid}) { - [] GTP1U_PROC.getreply(GTP1UEM_register_teid:{teid}); +function f_gtp1u_register_teid(OCT4 teid, integer port_idx := 0) runs on GTP1U_ConnHdlr { + GTP1U_PROC[port_idx].call(GTP1UEM_register_teid:{teid}) { + [] GTP1U_PROC[port_idx].getreply(GTP1UEM_register_teid:{teid}); } }
-function f_gtp1u_allocate_teid() runs on GTP1U_ConnHdlr return OCT4 { +function f_gtp1u_allocate_teid(integer port_idx := 0) runs on GTP1U_ConnHdlr return OCT4 { var OCT4 t; - GTP1U_PROC.call(GTP1UEM_allocate_teid:{}) { - [] GTP1U_PROC.getreply(GTP1UEM_allocate_teid:{}) -> value t { + GTP1U_PROC[port_idx].call(GTP1UEM_allocate_teid:{}) { + [] GTP1U_PROC[port_idx].getreply(GTP1UEM_allocate_teid:{}) -> value t { return t; } } }
#ifdef GTP1U_EMULATION_HAVE_UECUPS -function f_gtp1u_create_tunnel(template (value) UECUPS_CreateTun gtc) +function f_gtp1u_create_tunnel(template (value) UECUPS_CreateTun gtc, integer port_idx := 0) runs on GTP1U_ConnHdlr { - GTP1U_PROC.call(GTP1UEM_create_tunnel:{valueof(gtc)}) { - [] GTP1U_PROC.getreply(GTP1UEM_create_tunnel:{gtc}); + GTP1U_PROC[port_idx].call(GTP1UEM_create_tunnel:{valueof(gtc)}) { + [] GTP1U_PROC[port_idx].getreply(GTP1UEM_create_tunnel:{gtc}); } }
-function f_gtp1u_destroy_tunnel(template (value) UECUPS_DestroyTun gtd) +function f_gtp1u_destroy_tunnel(template (value) UECUPS_DestroyTun gtd, integer port_idx := 0) runs on GTP1U_ConnHdlr { - GTP1U_PROC.call(GTP1UEM_destroy_tunnel:{valueof(gtd)}) { - [] GTP1U_PROC.getreply(GTP1UEM_destroy_tunnel:{gtd}); + GTP1U_PROC[port_idx].call(GTP1UEM_destroy_tunnel:{valueof(gtd)}) { + [] GTP1U_PROC[port_idx].getreply(GTP1UEM_destroy_tunnel:{gtd}); } }
-function f_gtp1u_start_program(template (value) UECUPS_StartProgram sprog) +function f_gtp1u_start_program(template (value) UECUPS_StartProgram sprog, integer port_idx := 0) runs on GTP1U_ConnHdlr return UECUPS_StartProgramRes { var UECUPS_StartProgramRes res; - GTP1U_PROC.call(GTP1UEM_start_program:{valueof(sprog)}) { - [] GTP1U_PROC.getreply(GTP1UEM_start_program:{sprog}) -> value res; + GTP1U_PROC[port_idx].call(GTP1UEM_start_program:{valueof(sprog)}) { + [] GTP1U_PROC[port_idx].getreply(GTP1UEM_start_program:{sprog}) -> value res; } return res; } diff --git a/pgw/PGW_Tests.ttcn b/pgw/PGW_Tests.ttcn index 4d225fa..16ac9ee 100644 --- a/pgw/PGW_Tests.ttcn +++ b/pgw/PGW_Tests.ttcn @@ -311,8 +311,8 @@ vc_GTP1U := GTPv1U_Emulation_CT.create("GTP1U_EM"); map(vc_GTP1U:GTP1U, system:GTP1U); connect(vc_GTP1U:TEID0, self:TEID0); - connect(vc_GTP1U:CLIENT, self:GTP1U); - connect(vc_GTP1U:CLIENT_PROC, self:GTP1U_PROC); + connect(vc_GTP1U:CLIENT, self:GTP1U[0]); + connect(vc_GTP1U:CLIENT_PROC, self:GTP1U_PROC[0]); vc_GTP1U.start(GTPv1U_Emulation.main(cfg)); }
@@ -344,8 +344,8 @@ vc_conn := PGW_Session_CT.create(id); connect(vc_conn:GTP2, vc_GTP2:CLIENT); connect(vc_conn:GTP2_PROC, vc_GTP2:CLIENT_PROC); - connect(vc_conn:GTP1U, vc_GTP1U:CLIENT); - connect(vc_conn:GTP1U_PROC, vc_GTP1U:CLIENT_PROC); + connect(vc_conn:GTP1U[0], vc_GTP1U:CLIENT); + connect(vc_conn:GTP1U_PROC[0], vc_GTP1U:CLIENT_PROC);
if (isbound(vc_Gx)) { vc_conn_gx := DIAMETER_ConnHdlr_CT.create(id); @@ -937,10 +937,10 @@
T.start; alt { - [] GTP1U.receive(UECUPS_ProgramTermInd:{pid := pid, exit_code := exit_code}) { + [] GTP1U[0].receive(UECUPS_ProgramTermInd:{pid := pid, exit_code := exit_code}) { setverdict(pass); } - [] GTP1U.receive(UECUPS_ProgramTermInd:?) -> value pti { + [] GTP1U[0].receive(UECUPS_ProgramTermInd:?) -> value pti { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("Received unexpected ProgramTermInd := ", pti)); }