pespin has uploaded this change for review.

View Change

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


To view, visit change 40749. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-MessageType: newchange
Gerrit-Project: osmo-ttcn3-hacks
Gerrit-Branch: master
Gerrit-Change-Id: I5b3da248719b79d402b945904e3840a2ec387dab
Gerrit-Change-Number: 40749
Gerrit-PatchSet: 1
Gerrit-Owner: pespin <pespin@sysmocom.de>