pespin has uploaded this change for review. ( https://gerrit.osmocom.org/c/osmo-ttcn3-hacks/+/40749?usp=email )
Change subject: Split GTPv1U out of GTP_Emulation ......................................................................
Split GTPv1U out of GTP_Emulation
We already have a GTPv1U_Emulation, use it.
Change-Id: I5b3da248719b79d402b945904e3840a2ec387dab --- M hnodeb/HNBGW_ConnectionHandler.ttcn M hnodeb/HNB_Tests.ttcn M hnodeb/gen_links.sh M hnodeb/regen_makefile.sh M library/GTP_Emulation.ttcn M mme/MME_Tests.ttcn M sgsn/BSSGP_ConnHdlr.ttcn M sgsn/SGSN_Tests.ttcn M sgsn/SGSN_Tests_Iu.ttcn M sgsn/gen_links.sh 10 files changed, 99 insertions(+), 118 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/osmo-ttcn3-hacks refs/changes/49/40749/1
diff --git a/hnodeb/HNBGW_ConnectionHandler.ttcn b/hnodeb/HNBGW_ConnectionHandler.ttcn index 5afeede..b1b2463 100644 --- a/hnodeb/HNBGW_ConnectionHandler.ttcn +++ b/hnodeb/HNBGW_ConnectionHandler.ttcn @@ -34,13 +34,13 @@ import from HNBLLIF_Types all; import from HNBLLIF_Templates all;
-import from GTP_Emulation all; import from GTPv1U_Templates all; import from GTPv1U_CodecPort all; import from GTPU_Types all; +import from GTPv1U_Emulation all;
/* this component represents a single Iuh connection at the HNBGW. */ -type component HNBGW_ConnHdlr extends Iuh_ConnHdlr, GTP_ConnHdlr, StatsD_ConnHdlr { +type component HNBGW_ConnHdlr extends Iuh_ConnHdlr, GTP1U_ConnHdlr, StatsD_ConnHdlr { port TELNETasp_PT HNBVTY; /* HNBLLIF Interface of HNodeB */ port HNBLLIF_CODEC_PT LLSK; @@ -50,7 +50,7 @@ port RTPEM_CTRL_PT RTPEM_CTRL; port RTPEM_DATA_PT RTPEM_DATA;
- var GTP_Emulation_CT vc_GTP; + var GTPv1U_Emulation_CT vc_GTP1U;
var TestHdlrParams g_pars; @@ -81,28 +81,26 @@ vc_Iuh.start(Iuh_Emulation.main(iuh_pars, id & "-Iuh")); }
-private function f_HNBGW_ConnHdlr_init_gtp(charstring id) runs on HNBGW_ConnHdlr { - id := id & "-GTP"; +private function f_HNBGW_ConnHdlr_init_gtp1u(charstring id) runs on HNBGW_ConnHdlr { + id := id & "-GTP1U";
- var GtpEmulationCfg gtp_cfg := { - gtpc_bind_ip := g_pars.hnbgw_addr, - gtpc_bind_port := GTP1C_PORT, + var Gtp1uEmulationCfg gtp_cfg := { gtpu_bind_ip := g_pars.hnbgw_addr, gtpu_bind_port := GTP1U_PORT, - sgsn_role := false + use_gtpu_daemon := false };
- vc_GTP := GTP_Emulation_CT.create(id) alive; - connect(self:GTP[0], vc_GTP:CLIENT); - connect(self:GTP_PROC[0], vc_GTP:CLIENT_PROC); - vc_GTP.start(GTP_Emulation.main(gtp_cfg)); + vc_GTP1U := GTPv1U_Emulation_CT.create(id) alive; + connect(self:GTP1U[0], vc_GTP1U:CLIENT); + connect(self:GTP1U_PROC[0], vc_GTP1U:CLIENT_PROC); + vc_GTP1U.start(GTPv1U_Emulation.main(gtp_cfg)); }
/* initialize all parameters */ function f_HNBGW_ConnHdlr_init(charstring id, TestHdlrParams pars) runs on HNBGW_ConnHdlr { g_pars := valueof(pars); f_HNBGW_ConnHdlr_init_iuh(id); - f_HNBGW_ConnHdlr_init_gtp(id); + f_HNBGW_ConnHdlr_init_gtp1u(id); f_HNBGW_ConnHdlr_init_vty();
/* Connect to HNB on LLSK and do HELLO ping-pong */ @@ -200,7 +198,7 @@
function f_gtpu_send(uint32_t tei, octetstring payload) runs on HNBGW_ConnHdlr { var Gtp1uPeer peer := valueof(ts_GtpPeerU(g_pars.hnodeb_addr)); - GTP[0].send(ts_GTP1U_GPDU(peer, omit /*opt_part*/, int2oct(tei, 4), payload)); + GTP1U[0].send(ts_GTP1U_GPDU(peer, omit /*opt_part*/, int2oct(tei, 4), payload)); }
/* HNBLLIF socket may at any time receive a new INFO.ind */ diff --git a/hnodeb/HNB_Tests.ttcn b/hnodeb/HNB_Tests.ttcn index 987108a..e848686 100644 --- a/hnodeb/HNB_Tests.ttcn +++ b/hnodeb/HNB_Tests.ttcn @@ -54,7 +54,7 @@
import from GTPU_Types all; import from GTPv1U_Templates all; -import from GTP_Emulation all; +import from GTPv1U_Emulation all;
import from IuUP_Types all;
@@ -409,7 +409,7 @@ var HNBLLIF_send_data sd; var uint32_t gtp_conn_id;
- f_gtp_register_teid(int2oct(remote_tei, 4)); + f_gtp1u_register_teid(int2oct(remote_tei, 4));
f_handle_hnbap_hnb_register_req();
@@ -438,7 +438,7 @@
/* Forward GTP data in both directions */ LLSK.send(f_llsk_tx(ts_HNBLLIF_GTP_CONN_DATA_REQ(gtp_conn_id, gtp_payload))); - GTP[0].receive(tr_GTPU_GPDU(ts_GtpPeerU(g_pars.hnodeb_addr), int2oct(remote_tei, 4), gtp_payload)); + GTP1U[0].receive(tr_GTPU_GPDU(ts_GtpPeerU(g_pars.hnodeb_addr), int2oct(remote_tei, 4), gtp_payload)); f_gtpu_send(local_tei, gtp_payload); LLSK.receive(f_llsk_rx(tr_HNBLLIF_GTP_CONN_DATA_IND(gtp_conn_id, gtp_payload)));
diff --git a/hnodeb/gen_links.sh b/hnodeb/gen_links.sh index 118bb8b..91dced9 100755 --- a/hnodeb/gen_links.sh +++ b/hnodeb/gen_links.sh @@ -45,7 +45,7 @@ gen_links $DIR $FILES
DIR=$BASEDIR/titan.ProtocolModules.GTP_v13.5.0/src -FILES="GTPC_EncDec.cc GTPC_Types.ttcn GTPU_EncDec.cc GTPU_Types.ttcn" +FILES="GTPU_EncDec.cc GTPU_Types.ttcn" gen_links $DIR $FILES
DIR=../library/hnbap @@ -63,9 +63,8 @@ FILES+="Iuh_Types.ttcn Iuh_CodecPort.ttcn Iuh_CodecPort_CtrlFunctDef.cc Iuh_CodecPort_CtrlFunct.ttcn Iuh_Emulation.ttcn DNS_Helpers.ttcn " FILES+="Misc_Helpers.ttcn General_Types.ttcn Osmocom_Types.ttcn Osmocom_VTY_Functions.ttcn Native_Functions.ttcn Native_FunctionDefs.cc IPA_Types.ttcn IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc IPA_Emulation.ttcnpp Osmocom_CTRL_Types.ttcn Osmocom_CTRL_Functions.ttcn Osmocom_CTRL_Adapter.ttcn RTP_CodecPort.ttcn RTP_CodecPort_CtrlFunct.ttcn RTP_CodecPort_CtrlFunctDef.cc RTP_Emulation.ttcn IuUP_Types.ttcn IuUP_EncDec.cc IuUP_Emulation.ttcn " FILES+="StatsD_Types.ttcn StatsD_CodecPort.ttcn StatsD_CodecPort_CtrlFunct.ttcn StatsD_CodecPort_CtrlFunctdef.cc StatsD_Checker.ttcnpp " -FILES+="GTPv1C_CodecPort.ttcn GTPv1C_CodecPort_CtrlFunct.ttcn GTPv1C_CodecPort_CtrlFunctDef.cc GTPv1C_Templates.ttcn " -FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn " -FILES+="GTP_Emulation.ttcn IPCP_Types.ttcn IPCP_Templates.ttcn GSM_Types.ttcn " +FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn GTPv1U_Emulation.ttcnpp " +FILES+="IPCP_Types.ttcn IPCP_Templates.ttcn GSM_Types.ttcn " FILES+="SCTP_Templates.ttcn " gen_links $DIR $FILES
diff --git a/hnodeb/regen_makefile.sh b/hnodeb/regen_makefile.sh index 6505cf6..2d86343 100755 --- a/hnodeb/regen_makefile.sh +++ b/hnodeb/regen_makefile.sh @@ -25,9 +25,7 @@ HNBAP_EncDec.cc RUA_EncDec.cc UD_PT.cc - GTPC_EncDec.cc GTPU_EncDec.cc - GTPv1C_CodecPort_CtrlFunctDef.cc GTPv1U_CodecPort_CtrlFunctDef.cc "
diff --git a/library/GTP_Emulation.ttcn b/library/GTP_Emulation.ttcn index c5e4e24..83aa42f 100644 --- a/library/GTP_Emulation.ttcn +++ b/library/GTP_Emulation.ttcn @@ -1,6 +1,7 @@ /* GTP Emulation in TTCN-3 * * (C) 2018 Harald Welte laforge@gnumonks.org + * (C) 2025 by sysmocom - s.f.m.c. GmbH info@sysmocom.de * All rights reserved. * * Released under the terms of GNU General Public License, Version 2 or @@ -15,11 +16,8 @@ import from General_Types all; import from Osmocom_Types all; import from GTPC_Types all; -import from GTPU_Types all; import from GTPv1C_CodecPort all; -import from GTPv1U_CodecPort all; import from GTPv1C_CodecPort_CtrlFunct all; -import from GTPv1U_CodecPort_CtrlFunct all;
/*********************************************************************** * Main Emulation Component @@ -27,20 +25,16 @@
const integer GTP0_PORT := 3386; const integer GTP1C_PORT := 2123; -const integer GTP1U_PORT := 2152;
type record GtpEmulationCfg { HostName gtpc_bind_ip optional, PortNumber gtpc_bind_port optional, - HostName gtpu_bind_ip optional, - PortNumber gtpu_bind_port optional, boolean sgsn_role };
type component GTP_Emulation_CT { /* Communication with underlying GTP CodecPort */ port GTPC_PT GTPC; - port GTPU_PT GTPU;
/* Communication with Clients */ port GTPEM_PT CLIENT; @@ -51,15 +45,15 @@ var GtpEmulationCfg g_gtp_cfg;
/* State */ - var integer g_gtpc_id, g_gtpu_id; + var integer g_gtpc_id; var OCT1 g_restart_ctr; - var uint16_t g_c_seq_nr, g_u_seq_nr; + var uint16_t g_c_seq_nr; var TidTableRec TidTable[16]; var ImsiTableRec ImsiTable[16]; };
type record TidTableRec { - OCT4 teid, + OCT4 teic, GTP_ConnHdlr vc_conn };
@@ -68,14 +62,14 @@ GTP_ConnHdlr vc_conn };
-private function f_comp_by_teid(OCT4 teid) runs on GTP_Emulation_CT return GTP_ConnHdlr { +private function f_comp_by_teic(OCT4 teic) runs on GTP_Emulation_CT return GTP_ConnHdlr { var integer i; for (i := 0; i < sizeof(TidTable); i := i+1) { - if (isbound(TidTable[i].teid) and TidTable[i].teid == teid) { + if (isbound(TidTable[i].teic) and TidTable[i].teic == teic) { return TidTable[i].vc_conn; } } - setverdict(fail, "No Component for TEID ", teid); + setverdict(fail, "No Component for TEIC ", teic); mtc.stop; }
@@ -90,16 +84,16 @@ mtc.stop; }
-private function f_tid_tbl_add(OCT4 teid, GTP_ConnHdlr vc_conn) runs on GTP_Emulation_CT { +private function f_tid_tbl_add(OCT4 teic, GTP_ConnHdlr vc_conn) runs on GTP_Emulation_CT { var integer i; for (i := 0; i < sizeof(TidTable); i := i+1) { - if (not isbound(TidTable[i].teid)) { - TidTable[i].teid := teid; + if (not isbound(TidTable[i].teic)) { + TidTable[i].teic := teic; TidTable[i].vc_conn := vc_conn; return; } } - testcase.stop("No Space in TidTable for ", teid); + testcase.stop("No Space in TidTable for ", teic); }
private function f_imsi_tbl_add(hexstring imsi, GTP_ConnHdlr vc_conn) runs on GTP_Emulation_CT { @@ -220,38 +214,29 @@ g_gtpc_id := res.connId; }
- 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_gtpu_id := res.connId; - } - g_restart_ctr := f_rnd_octstring(1); g_c_seq_nr := f_rnd_int(65535); - g_u_seq_nr := f_rnd_int(65535); g_gtp_cfg := cfg; }
function main(GtpEmulationCfg cfg) runs on GTP_Emulation_CT { var Gtp1cUnitdata g1c_ud; - var Gtp1uUnitdata g1u_ud; var GTP_ConnHdlr vc_conn; var hexstring imsi; - var OCT4 teid; + var OCT4 teic;
f_init(cfg);
while (true) { alt { - /* route inbound GTP-C based on IMSI or TEID */ + /* route inbound GTP-C based on IMSI or TEIC */ [] GTPC.receive(Gtp1cUnitdata:?) -> value g1c_ud { var template hexstring imsi_t := f_gtpc_extract_imsi(g1c_ud.gtpc); if (isvalue(imsi_t)) { vc_conn := f_comp_by_imsi(valueof(imsi_t)); CLIENT.send(g1c_ud) to vc_conn; } else if(g1c_ud.gtpc.teid != int2oct(0, 4)) { - vc_conn := f_comp_by_teid(g1c_ud.gtpc.teid); + vc_conn := f_comp_by_teic(g1c_ud.gtpc.teid); CLIENT.send(g1c_ud) to vc_conn; } else { /* Check if a default port is set: */ @@ -261,25 +246,18 @@ /* Send to all clients */ var integer i; for (i := 0; i < sizeof(TidTable); i := i+1) { - if (isbound(TidTable[i].teid) and TidTable[i].teid == teid) { + if (isbound(TidTable[i].teic) and TidTable[i].teic == teic) { CLIENT.send(g1c_ud) to TidTable[i].vc_conn; } } } } } - [] GTPU.receive(Gtp1uUnitdata:?) -> value g1u_ud { - vc_conn := f_comp_by_teid(g1u_ud.gtpu.teid); - CLIENT.send(g1u_ud) to vc_conn; - }
/* transparently forward any GTP-C / GTP-U from clients to peer[s] */ [] CLIENT.receive(Gtp1cUnitdata:?) -> value g1c_ud sender vc_conn { GTPC.send(g1c_ud); } - [] CLIENT.receive(Gtp1uUnitdata:?) -> value g1u_ud sender vc_conn { - GTPU.send(g1u_ud); - } [] CLIENT_DEFAULT.receive(Gtp1cUnitdata:?) -> value g1c_ud sender vc_conn { GTPC.send(g1c_ud); } @@ -289,9 +267,9 @@ CLIENT_PROC.reply(GTPEM_register_imsi:{imsi}) to vc_conn; }
- [] CLIENT_PROC.getcall(GTPEM_register_teid:{?}) -> param(teid) sender vc_conn { - f_tid_tbl_add(teid, vc_conn); - CLIENT_PROC.reply(GTPEM_register_teid:{teid}) to vc_conn; + [] CLIENT_PROC.getcall(GTPEM_register_teic:{?}) -> param(teic) sender vc_conn { + f_tid_tbl_add(teic, vc_conn); + CLIENT_PROC.reply(GTPEM_register_teic:{teic}) to vc_conn; }
} @@ -303,14 +281,14 @@ * Interaction between Main and Client Components ***********************************************************************/ type port GTPEM_PT message { - inout Gtp1cUnitdata, Gtp1uUnitdata; + inout Gtp1cUnitdata; } with { extension "internal" };
signature GTPEM_register_imsi(hexstring imsi); -signature GTPEM_register_teid(OCT4 teid); +signature GTPEM_register_teic(OCT4 teic);
type port GTPEM_PROC_PT procedure { - inout GTPEM_register_imsi, GTPEM_register_teid; + inout GTPEM_register_imsi, GTPEM_register_teic; } with { extension "internal" };
/*********************************************************************** @@ -331,13 +309,13 @@ } }
-function f_gtp_register_teid(OCT4 teid, integer gtp_idx := 0) runs on GTP_ConnHdlr { - GTP_PROC[gtp_idx].call(GTPEM_register_teid:{teid}) { - [] GTP_PROC[gtp_idx].getreply(GTPEM_register_teid:{teid}); +function f_gtp_register_teic(OCT4 teic, integer gtp_idx := 0) runs on GTP_ConnHdlr { + GTP_PROC[gtp_idx].call(GTPEM_register_teic:{teic}) { + [] GTP_PROC[gtp_idx].getreply(GTPEM_register_teic:{teic}); } }
-function f_gtp_teid_random() return OCT4 { +function f_gtp_teic_random() return OCT4 { return f_rnd_octstring(4); } } diff --git a/mme/MME_Tests.ttcn b/mme/MME_Tests.ttcn index 4885b1e..829adb3 100644 --- a/mme/MME_Tests.ttcn +++ b/mme/MME_Tests.ttcn @@ -1118,7 +1118,7 @@ private function f_TC_gn_echo_request(ConnHdlrPars pars) runs on ConnHdlr { timer T := 5.0; f_init_handler(pars); - f_gtp_register_teid('00000000'O); + f_gtp_register_teic('00000000'O);
GTP[0].send(ts_GTPC_PING(g_gn_iface_peer, 1)); T.start; @@ -1323,7 +1323,7 @@ private function f_TC_RIM_RAN_INF(ConnHdlrPars pars) runs on ConnHdlr { timer T := 5.0; f_init_handler(pars); - f_gtp_register_teid('00000000'O); + f_gtp_register_teic('00000000'O); var Gtp1cUnitdata req_gtpc_pdu; var Gtp1cUnitdata resp_gtpc_pdu; var GTP_CellId geran_gtp_ci; @@ -1529,10 +1529,10 @@ f_gtp_register_imsi(g_pars.ue_pars.imsi); f_gtp2_register_imsi(g_pars.ue_pars.imsi); /* SGSN Context Req doesn't necessarily contain IMSI, hence expect it through TEID=0 */ - f_gtp_register_teid('00000000'O); + f_gtp_register_teic('00000000'O); /* passed in SGSN Context Resp to MME, will be used by MME when answering with SGSN Context Ack: */ const OCT4 new_sgsn_teid := 'ABABABAB'O; - f_gtp_register_teid(new_sgsn_teid); + f_gtp_register_teic(new_sgsn_teid);
var template (value) EPS_MobileIdentityV mi := ts_NAS_MobileId_IMSI(pars.ue_pars.imsi); var template (value) S1AP_PDU tx; diff --git a/sgsn/BSSGP_ConnHdlr.ttcn b/sgsn/BSSGP_ConnHdlr.ttcn index 6e2e611..aea981c 100644 --- a/sgsn/BSSGP_ConnHdlr.ttcn +++ b/sgsn/BSSGP_ConnHdlr.ttcn @@ -39,6 +39,7 @@ import from GTPv1C_Templates all; import from GTPv1U_Templates all; import from GTP_Emulation all; +import from GTPv1U_Emulation all;
import from LLC_Types all; import from LLC_Templates all; @@ -59,7 +60,7 @@ return ran_index + 1 - NUM_GB; }
-type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr { +type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, GTP1U_ConnHdlr, RAN_ConnHdlr { var BSSGP_ConnHdlrPars g_pars; timer g_Tguard; var LLC_Entities llc; @@ -907,8 +908,8 @@ apars.sgsn_tei_u := gtpc_rx.createPDPContextRequest.teidDataI.teidDataI; apars.sgsn_ip_c := gtpc_rx.createPDPContextRequest.sgsn_addr_signalling.addressf; apars.sgsn_ip_u := gtpc_rx.createPDPContextRequest.sgsn_addr_traffic.addressf; - f_gtp_register_teid(apars.ggsn_tei_c, GTP_GGSN_IDX); - f_gtp_register_teid(apars.ggsn_tei_u, GTP_GGSN_IDX); + f_gtp_register_teic(apars.ggsn_tei_c, GTP_GGSN_IDX); + f_gtp1u_register_teid(apars.ggsn_tei_u, GTP_GGSN_IDX); } altstep as_ggsn_gtp_ctx_act_req(inout PdpActPars apars, boolean send_recovery := false) runs on BSSGP_ConnHdlr { var Gtp1cUnitdata g_ud; @@ -953,7 +954,7 @@ upd.sgsn_addr_traffic.addressf, ":", upd.teidDataI.teidDataI, " vs exp ", apars.rnc_ip_u, ":", apars.rnc_tei_u)); } - f_gtp_register_teid(apars.rnc_tei_u, ran2gtp_idx(ran_index)); + f_gtp1u_register_teid(apars.rnc_tei_u, ran2gtp_idx(ran_index)); } else { apars.sgsn_ip_u := upd.sgsn_addr_traffic.addressf; apars.sgsn_tei_u := upd.teidDataI.teidDataI; @@ -1114,7 +1115,7 @@ BSSGP[ran_index].clear; if (error_ind) { var Gtp1uPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_c)); - GTP[GTP_GGSN_IDX].send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u)); + GTP1U[GTP_GGSN_IDX].send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u)); } else { var Gtp1cPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c)); GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B)); @@ -1237,7 +1238,7 @@ peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u)); rem_teid := apars.sgsn_tei_u; } - GTP[GTP_GGSN_IDX].send(ts_GTP1U_GPDU(peer, omit /*opt_part*/, rem_teid, payload)); + GTP1U[GTP_GGSN_IDX].send(ts_GTP1U_GPDU(peer, omit /*opt_part*/, rem_teid, payload)); }
altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr { @@ -1296,8 +1297,8 @@ Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "GTP-U forwarded to BSSGP but not expected"); } /* Expect PDU directly from RNC (Direct Tunnel): */ - [is_iu(ran_index) and expect_fwd] GTP[ran2gtp_idx(ran_index)].receive(tr_GTPU_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), apars.rnc_tei_u, payload)); - [is_iu(ran_index) and not expect_fwd] GTP[ran2gtp_idx(ran_index)].receive(tr_GTPU_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), apars.rnc_tei_u, payload)) { + [is_iu(ran_index) and expect_fwd] GTP1U[ran2gtp_idx(ran_index)].receive(tr_GTPU_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), apars.rnc_tei_u, payload)); + [is_iu(ran_index) and not expect_fwd] GTP1U[ran2gtp_idx(ran_index)].receive(tr_GTPU_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), apars.rnc_tei_u, payload)) { Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, "GTP-U forwarded to BSSGP but not expected") } [expect_fwd] T.timeout { @@ -1320,11 +1321,11 @@ } else if (is_iu(ran_index)) { /* Send PDU via GTPv1U from simulated MS/RNC directly to the simulated GGSN: */ rx_peer := valueof(ts_GtpPeerU(apars.rnc_ip_u)); - GTP[ran2gtp_idx(ran_index)].send(ts_GTP1U_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), omit /*opt_part*/, apars.ggsn_tei_u, payload)); + GTP1U[ran2gtp_idx(ran_index)].send(ts_GTP1U_GPDU(valueof(ts_GtpPeerU(apars.ggsn_ip_u)), omit /*opt_part*/, apars.ggsn_tei_u, payload)); } /* Expect PDU via GTP from RNC/SGSN on simulated GGSN */ alt { - [] GTP[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(rx_peer, apars.ggsn_tei_u, payload)); + [] GTP1U[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(rx_peer, apars.ggsn_tei_u, payload)); } }
diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn index d5f98ce..3ab2485 100644 --- a/sgsn/SGSN_Tests.ttcn +++ b/sgsn/SGSN_Tests.ttcn @@ -50,6 +50,7 @@ import from GTPv1C_Templates all; import from GTPv1U_Templates all; import from GTP_Emulation all; +import from GTPv1U_Emulation all;
import from LLC_Types all; import from LLC_Templates all; @@ -167,12 +168,12 @@ const integer NUM_RNC := 1; type record IuInstance { RAN_Adapter ranap, - GTP_Emulation_CT vc_RNC_GTP + GTPv1U_Emulation_CT vc_RNC_GTP1U }; type record length(NUM_RNC) of IuInstance IuInstances; type record of RAN_Configuration RAN_Configurations;
-type component test_CT { +type component test_CT extends GTP_ConnHdlr { var GbInstances g_gb; var IuInstances g_iu; var boolean g_iu_enable := false; @@ -187,9 +188,9 @@
/* used by RIM related test */ port BSSGP_PT RIM[NUM_GB]; - port GTPEM_PT GTPC;
- var GTP_Emulation_CT vc_GGSN_GTP; + var GTP_Emulation_CT vc_GGSN_GTP1C; + var GTPv1U_Emulation_CT vc_GGSN_GTP1U;
port TELNETasp_PT SGSNVTY; port TELNETasp_PT STPVTY; @@ -277,31 +278,34 @@ private function f_init_rnc_gtp(charstring id, integer rnc_idx) runs on test_CT { id := id & "-RNC_GTP";
- var GtpEmulationCfg gtp_cfg := { - gtpc_bind_ip := omit, - gtpc_bind_port := omit, + var Gtp1uEmulationCfg gtp_cfg := { gtpu_bind_ip := mp_ranap_cfg[rnc_idx].sctp_addr.local_ip_addr, gtpu_bind_port := GTP1U_PORT, - sgsn_role := false + use_gtpu_daemon := false };
- g_iu[rnc_idx].vc_RNC_GTP := GTP_Emulation_CT.create(id); - g_iu[rnc_idx].vc_RNC_GTP.start(GTP_Emulation.main(gtp_cfg)); + g_iu[rnc_idx].vc_RNC_GTP1U := GTPv1U_Emulation_CT.create(id); + g_iu[rnc_idx].vc_RNC_GTP1U.start(GTPv1U_Emulation.main(gtp_cfg)); }
private function f_init_ggsn_gtp(charstring id) runs on test_CT { - id := id & "-GGSN_GTP"; - - var GtpEmulationCfg gtp_cfg := { + var GtpEmulationCfg gtp1c_cfg := { gtpc_bind_ip := mp_ggsn_ip, gtpc_bind_port := GTP1C_PORT, - gtpu_bind_ip := mp_ggsn_ip, - gtpu_bind_port := GTP1U_PORT, sgsn_role := false };
- vc_GGSN_GTP := GTP_Emulation_CT.create(id); - vc_GGSN_GTP.start(GTP_Emulation.main(gtp_cfg)); + vc_GGSN_GTP1C := GTP_Emulation_CT.create(id & "-GGSN_GTP1C"); + vc_GGSN_GTP1C.start(GTP_Emulation.main(gtp1c_cfg)); + + var Gtp1uEmulationCfg gtp1u_cfg := { + gtpu_bind_ip := mp_ggsn_ip, + gtpu_bind_port := GTP1U_PORT, + use_gtpu_daemon := false + }; + + vc_GGSN_GTP1U := GTPv1U_Emulation_CT.create(id & "-GGSN_GTP1U"); + vc_GGSN_GTP1U.start(GTPv1U_Emulation.main(gtp1u_cfg)); }
friend function f_init_vty() runs on test_CT { @@ -521,16 +525,18 @@
for (var integer i := 0; i < NUM_RNC; i := i+1) { /* GTP[0] is used by emulated GGSN: */ - connect(vc_conn:GTP[i + 1], g_iu[i].vc_RNC_GTP:CLIENT); - connect(vc_conn:GTP_PROC[i + 1], g_iu[i].vc_RNC_GTP:CLIENT_PROC); + connect(vc_conn:GTP1U[i + 1], g_iu[i].vc_RNC_GTP1U:CLIENT); + connect(vc_conn:GTP1U_PROC[i + 1], g_iu[i].vc_RNC_GTP1U:CLIENT_PROC); } }
connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT); connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
- connect(vc_conn:GTP[GTP_GGSN_IDX], vc_GGSN_GTP:CLIENT); - connect(vc_conn:GTP_PROC[GTP_GGSN_IDX], vc_GGSN_GTP:CLIENT_PROC); + connect(vc_conn:GTP[GTP_GGSN_IDX], vc_GGSN_GTP1C:CLIENT); + connect(vc_conn:GTP_PROC[GTP_GGSN_IDX], vc_GGSN_GTP1C:CLIENT_PROC); + connect(vc_conn:GTP1U[GTP_GGSN_IDX], vc_GGSN_GTP1U:CLIENT); + connect(vc_conn:GTP1U_PROC[GTP_GGSN_IDX], vc_GGSN_GTP1U:CLIENT_PROC);
vc_conn.start(f_handler_init(fn, id, pars)); return vc_conn; @@ -2818,7 +2824,7 @@ var BSSGP_ConnHdlr vc_conn; f_init(); /* connect RIM related port */ - connect(vc_GGSN_GTP:CLIENT_DEFAULT, self:GTPC); + connect(vc_GGSN_GTP1C:CLIENT_DEFAULT, self:GTP[0]);
var Gtp1cPeer peer := { connId := 1, @@ -2852,7 +2858,7 @@ gtpc_rim_ra_discr := ts_RIM_RoutingAddress_Discriminator(hex2bit(RIM_ADDR_GERAN_CELL_ID)); gtpc_pdu := ts_GTPC_RANInfoRelay(peer, ts_RANTransparentContainer_RAN_INFO_REQ(gtpc_bssgp_cont), gtpc_rim_ra, gtpc_rim_ra_discr); - GTPC.send(gtpc_pdu); + GTP[0].send(gtpc_pdu);
var template RIM_Routing_Address bssgp_dst_addr, bssgp_src_addr; var template PDU_BSSGP bssgp_rim_pdu_expect; @@ -2908,11 +2914,11 @@
T.start; alt { - [] GTPC.receive(gtpc_pdu_exp) { + [] GTP[0].receive(gtpc_pdu_exp) { setverdict(pass); T.stop; } - [] GTPC.receive { + [] GTP[0].receive { setverdict(fail, "Unexpected GTPC RIM PDU received"); } [] T.timeout { @@ -3004,7 +3010,7 @@ timer T := 2.0; T.start; alt { - [] GTP[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) { + [] GTP1U[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) { setverdict(fail, "Unexpected GTP message"); } [] T.timeout { setverdict(pass); } @@ -3058,7 +3064,7 @@ private function f_TC_sgsn_context_req_in(charstring id) runs on BSSGP_ConnHdlr { var integer seq_nr := f_rnd_int(65535); var Gtp1cUnitdata gtpc_ud; - var OCT4 teidc := f_gtp_teid_random(); + var OCT4 teidc := f_gtp_teic_random(); timer T;
var Gtp1cPeer peer := { @@ -3130,7 +3136,7 @@ private function f_TC_sgsn_context_req_out(charstring id) runs on BSSGP_ConnHdlr { var integer seq_nr := f_rnd_int(65535); var Gtp1cUnitdata gtpc_ud; - var OCT4 teidc := f_gtp_teid_random(); + var OCT4 teidc := f_gtp_teic_random(); timer T;
/* The MS goes to GERAN/UTRAN from an LTE cell */ diff --git a/sgsn/SGSN_Tests_Iu.ttcn b/sgsn/SGSN_Tests_Iu.ttcn index 776c333..e84869f 100644 --- a/sgsn/SGSN_Tests_Iu.ttcn +++ b/sgsn/SGSN_Tests_Iu.ttcn @@ -16,6 +16,7 @@ import from GTPv1C_Templates all; import from GTPv1U_Templates all; import from GTP_Emulation all; +import from GTPv1U_Emulation all;
import from BSSGP_ConnHdlr all;
@@ -329,7 +330,7 @@ as_ggsn_gtp_ctx_upd_req(apars, exp_dir_tun := false, ran_index := 3);
/* Now GGSN receives new MT data and forwards it to SGSN: */ - f_gtp_register_teid('00000000'O, GTP_GGSN_IDX); /* Ease debugging in case SGSN sends ErrorInd */ + f_gtp_register_teic('00000000'O, GTP_GGSN_IDX); /* Ease debugging in case SGSN sends ErrorInd */ f_ran_register_imsi(g_pars.imsi, g_pars.p_tmsi); /* Forward Paging below to this component */ var octetstring payload := f_rnd_octstring(100); f_ggsn_gtpu_send(apars, payload); @@ -374,12 +375,12 @@ /* then transceive a downlink PDU */ f_gtpu_xceive_mt(apars, f_rnd_octstring(100), ran_index := ran_index); /* RNC answers with Error Indication, it probably crashed and lost state: */ - f_gtp_register_teid('00000000'O, GTP_GGSN_IDX); /* Ease debugging in case SGSN sends ErrorInd */ + f_gtp1u_register_teid('00000000'O, GTP_GGSN_IDX); /* Ease debugging in case SGSN sends ErrorInd */ f_ran_register_imsi(g_pars.imsi, g_pars.p_tmsi); /* Forward Paging below to this component */ - GTP[ran2gtp_idx(ran_index)].send(ts_GTPU_ErrorIndication(ts_GtpPeerU(apars.ggsn_ip_u), + GTP1U[ran2gtp_idx(ran_index)].send(ts_GTPU_ErrorIndication(ts_GtpPeerU(apars.ggsn_ip_u), 0, apars.rnc_tei_u, apars.rnc_ip_u)); - GTP[GTP_GGSN_IDX].receive(tr_GTPU_ErrorIndication(ts_GtpPeerU(apars.rnc_ip_u), + GTP1U[GTP_GGSN_IDX].receive(tr_GTPU_ErrorIndication(ts_GtpPeerU(apars.rnc_ip_u), apars.rnc_tei_u, apars.rnc_ip_u));
diff --git a/sgsn/gen_links.sh b/sgsn/gen_links.sh index 992e757..fe1bf08 100755 --- a/sgsn/gen_links.sh +++ b/sgsn/gen_links.sh @@ -95,7 +95,7 @@ FILES+="IPA_Types.ttcn IPA_Emulation.ttcnpp IPA_CodecPort.ttcn IPA_CodecPort_CtrlFunct.ttcn IPA_CodecPort_CtrlFunctDef.cc Native_Functions.ttcn Native_FunctionDefs.cc " FILES+="PCO_Types.ttcn GSUP_Types.ttcn GSUP_Templates.ttcn GSUP_Emulation.ttcn " FILES+="GTPv1C_CodecPort.ttcn GTPv1C_CodecPort_CtrlFunct.ttcn GTPv1C_CodecPort_CtrlFunctDef.cc GTPv1C_Templates.ttcn Osmocom_Gb_Types.ttcn " -FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn " +FILES+="GTPv1U_CodecPort.ttcn GTPv1U_CodecPort_CtrlFunct.ttcn GTPv1U_CodecPort_CtrlFunctDef.cc GTPv1U_Templates.ttcn GTPv1U_Emulation.ttcnpp " FILES+="GTP_Emulation.ttcn IPCP_Types.ttcn IPCP_Templates.ttcn RAW_NS.ttcnpp " gen_links $DIR $FILES