pespin submitted this change.
GTP_ConnHdlr: Allow connection to multiple GTP_Emulation
This feature will be used by SGSN_Tests' BSSGP_ConnHdlr, which in 3G
scenario needs to connect to GTP at both GGSN and HNBGW/RNC endpoints.
Change-Id: I6fc49428967ebcf0f6c8a9f9f20f4a98a81f3273
---
M hnodeb/HNBGW_ConnectionHandler.ttcn
M hnodeb/HNB_Tests.ttcn
M library/GTP_Emulation.ttcn
M mme/MME_Tests.ttcn
M sgsn/BSSGP_ConnHdlr.ttcn
M sgsn/SGSN_Tests.ttcn
6 files changed, 93 insertions(+), 75 deletions(-)
diff --git a/hnodeb/HNBGW_ConnectionHandler.ttcn b/hnodeb/HNBGW_ConnectionHandler.ttcn
index e256963..a72b5f2 100644
--- a/hnodeb/HNBGW_ConnectionHandler.ttcn
+++ b/hnodeb/HNBGW_ConnectionHandler.ttcn
@@ -93,8 +93,8 @@
};
vc_GTP := GTP_Emulation_CT.create(id) alive;
- connect(self:GTP, vc_GTP:CLIENT);
- connect(self:GTP_PROC, vc_GTP:CLIENT_PROC);
+ connect(self:GTP[0], vc_GTP:CLIENT);
+ connect(self:GTP_PROC[0], vc_GTP:CLIENT_PROC);
vc_GTP.start(GTP_Emulation.main(gtp_cfg));
}
@@ -200,7 +200,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.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, int2oct(tei, 4), payload));
+ GTP[0].send(ts_GTP1U_GPDU(peer, 0 /*seq*/, 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 29f0bbb..ca36ad7 100644
--- a/hnodeb/HNB_Tests.ttcn
+++ b/hnodeb/HNB_Tests.ttcn
@@ -437,7 +437,7 @@
/* Forward GTP data in both directions */
LLSK.send(f_llsk_tx(ts_HNBLLIF_GTP_CONN_DATA_REQ(gtp_conn_id, gtp_payload)));
- GTP.receive(tr_GTPU_GPDU(ts_GtpPeerU(g_pars.hnodeb_addr), int2oct(remote_tei, 4), gtp_payload));
+ GTP[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/library/GTP_Emulation.ttcn b/library/GTP_Emulation.ttcn
index aa620ed..c5ac029 100644
--- a/library/GTP_Emulation.ttcn
+++ b/library/GTP_Emulation.ttcn
@@ -316,21 +316,24 @@
/***********************************************************************
* 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 GTP_ConnHdlr {
- port GTPEM_PT GTP;
- port GTPEM_PROC_PT GTP_PROC;
+ port GTPEM_PT GTP[NUM_MAX_GTP];
+ port GTPEM_PROC_PT GTP_PROC[NUM_MAX_GTP];
};
-function f_gtp_register_imsi(hexstring imsi) runs on GTP_ConnHdlr {
- GTP_PROC.call(GTPEM_register_imsi:{imsi}) {
- [] GTP_PROC.getreply(GTPEM_register_imsi:{imsi});
+function f_gtp_register_imsi(hexstring imsi, integer gtp_idx := 0) runs on GTP_ConnHdlr {
+ GTP_PROC[gtp_idx].call(GTPEM_register_imsi:{imsi}) {
+ [] GTP_PROC[gtp_idx].getreply(GTPEM_register_imsi:{imsi});
}
}
-function f_gtp_register_teid(OCT4 teid) runs on GTP_ConnHdlr {
- GTP_PROC.call(GTPEM_register_teid:{teid}) {
- [] GTP_PROC.getreply(GTPEM_register_teid:{teid});
+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});
}
}
diff --git a/mme/MME_Tests.ttcn b/mme/MME_Tests.ttcn
index 76c9c7e..7a6b34c 100644
--- a/mme/MME_Tests.ttcn
+++ b/mme/MME_Tests.ttcn
@@ -426,8 +426,8 @@
connect(vc_conn:DIAMETER_PROC, vc_DIAMETER:DIAMETER_PROC);
}
if (isbound(vc_GTP)) {
- connect(vc_conn:GTP, vc_GTP:CLIENT);
- connect(vc_conn:GTP_PROC, vc_GTP:CLIENT_PROC);
+ connect(vc_conn:GTP[0], vc_GTP:CLIENT);
+ connect(vc_conn:GTP_PROC[0], vc_GTP:CLIENT_PROC);
}
if (isbound(vc_GTP2)) {
connect(vc_conn:GTP2, vc_GTP2:CLIENT);
@@ -937,18 +937,18 @@
SGSNContextReqPDU := ts_SGSNContextReqPDU(rai, new_sgsn_local_teid, f_inet_addr(mp_gn_local_ip),
ptmsi := ts_PTMSI(ptmsi), ptmsi_sig := ts_PTMSI_sig(ptmsi_sig));
- GTP.send(ts_GTPC_SGSNContextReq(g_gn_iface_peer, gtpc_seq_nr, SGSNContextReqPDU));
+ GTP[0].send(ts_GTPC_SGSNContextReq(g_gn_iface_peer, gtpc_seq_nr, SGSNContextReqPDU));
timer T := 5.0;
T.start;
alt {
- [] GTP.receive(tr_GTPC_SGSNContextResp(g_gn_iface_peer, new_sgsn_local_teid,
+ [] GTP[0].receive(tr_GTPC_SGSNContextResp(g_gn_iface_peer, new_sgsn_local_teid,
tr_SGSNContextRespPDU(GTP_CAUSE_REQUEST_ACCEPTED,
g_pars.ue_pars.imsi))) -> value gtpc_pdu {
old_mme_local_teid := gtpc_pdu.gtpc.gtpc_pdu.sgsn_ContextResponse.teidControlPlane.teidControlPlane;
setverdict(pass);
}
- [] GTP.receive {
+ [] GTP[0].receive {
Misc_Helpers.f_shutdown(__BFILE__, __LINE__, fail, log2str("unexpected GTPC message from MME"));
}
[] T.timeout {
@@ -956,7 +956,7 @@
}
}
- GTP.send(ts_GTPC_SGSNContextAck(g_gn_iface_peer, old_mme_local_teid,
+ GTP[0].send(ts_GTPC_SGSNContextAck(g_gn_iface_peer, old_mme_local_teid,
oct2int(gtpc_pdu.gtpc.opt_part.sequenceNumber),
ts_SGSNContextAckPDU(GTP_CAUSE_REQUEST_ACCEPTED)));
@@ -969,7 +969,7 @@
) runs on ConnHdlr {
var Gtp1cUnitdata gtpc_pdu;
- [] GTP.receive(tr_GTPC_SGSNContextReq(g_gn_iface_peer, tr_SGSNContextReqPDU(rai := rai, ptmsi := ts_PTMSI(ptmsi), ptmsi_sig := ts_PTMSI_sig(ptmsi_sig), rat_type := int2oct(enum2int(rat_type), 1)))) -> value gtpc_pdu {
+ [] GTP[0].receive(tr_GTPC_SGSNContextReq(g_gn_iface_peer, tr_SGSNContextReqPDU(rai := rai, ptmsi := ts_PTMSI(ptmsi), ptmsi_sig := ts_PTMSI_sig(ptmsi_sig), rat_type := int2oct(enum2int(rat_type), 1)))) -> value gtpc_pdu {
var template (value) PDP_Context_GTPC pdp_ctx;
var template (value) GTPC_PDUs SGSNContextRespPDU;
var Gtp1cUnitdata gtpc_pdu_ack;
@@ -989,16 +989,16 @@
f_inet_addr(mp_gn_local_ip),
ts_MM_ContextUMTS(ck, ik),
{ pdp_ctx });
- GTP.send(ts_GTPC_SGSNContextResp(g_gn_iface_peer,
+ GTP[0].send(ts_GTPC_SGSNContextResp(g_gn_iface_peer,
old_mme_remote_teid,
oct2int(gtpc_pdu.gtpc.opt_part.sequenceNumber),
SGSNContextRespPDU));
- GTP.receive(tr_GTPC_SGSNContextAck(g_gn_iface_peer, new_sgsn_teid,
+ GTP[0].receive(tr_GTPC_SGSNContextAck(g_gn_iface_peer, new_sgsn_teid,
tr_SGSNContextAckPDU(GTP_CAUSE_REQUEST_ACCEPTED))) -> value gtpc_pdu;
setverdict(pass);
}
- [] GTP.receive {
+ [] GTP[0].receive {
setverdict(fail, "unexpected GTPC message from MME");
}
}
@@ -1078,13 +1078,13 @@
f_init_handler(pars);
f_gtp_register_teid('00000000'O);
- GTP.send(ts_GTPC_PING(g_gn_iface_peer, 1));
+ GTP[0].send(ts_GTPC_PING(g_gn_iface_peer, 1));
T.start;
alt {
- [] GTP.receive(tr_GTPC_PONG(?)) {
+ [] GTP[0].receive(tr_GTPC_PONG(?)) {
setverdict(pass);
}
- [] GTP.receive {
+ [] GTP[0].receive {
setverdict(fail, "unexpected GTPC message from MME");
}
[] T.timeout {
@@ -1301,10 +1301,10 @@
S1AP.send(f_make_ts_S1AP_eNBDirectInfTrans(geran_gtp_ci));
T.start;
alt {
- [] GTP.receive(f_make_tr_GTPC_MsgType(geran_gtp_ci)) -> value req_gtpc_pdu {
+ [] GTP[0].receive(f_make_tr_GTPC_MsgType(geran_gtp_ci)) -> value req_gtpc_pdu {
setverdict(pass);
}
- [] GTP.receive {
+ [] GTP[0].receive {
setverdict(fail, "unexpected GTPC message from MME");
}
[] T.timeout {
@@ -1316,7 +1316,7 @@
* (SGSN -> MME -> eNB) */
f_create_s1ap_expect_proc(id_MMEDirectInformationTransfer, self);
resp_gtpc_pdu := valueof(f_make_ts_GTPC_RANInfoRelay(req_gtpc_pdu, geran_gtp_ci, geran_si));
- GTP.send(resp_gtpc_pdu);
+ GTP[0].send(resp_gtpc_pdu);
T.start;
alt {
[] S1AP.receive(f_make_tr_S1AP_MMEDirectInfTrans(resp_gtpc_pdu)) {
diff --git a/sgsn/BSSGP_ConnHdlr.ttcn b/sgsn/BSSGP_ConnHdlr.ttcn
index eb1416d..5847ac0 100644
--- a/sgsn/BSSGP_ConnHdlr.ttcn
+++ b/sgsn/BSSGP_ConnHdlr.ttcn
@@ -49,6 +49,9 @@
const integer NUM_GB := 3;
type record length(NUM_GB) of BssgpCellId BssgpCellIds;
+/* Emulated GGSN is at GTP_ConnHdlr.GTP[0] */
+const integer GTP_GGSN_IDX := 0;
+
type component BSSGP_ConnHdlr extends BSSGP_Client_CT, GSUP_ConnHdlr, GTP_ConnHdlr, RAN_ConnHdlr {
var BSSGP_ConnHdlrPars g_pars;
timer g_Tguard;
@@ -647,10 +650,10 @@
f_send_l3(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
apars.apn, apars.pco), ran_index);
- GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud {
f_process_gtp_ctx_act_req(apars, g_ud.gtpc);
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
- GTP.send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_CreatePdpResp(g_ud.peer, seq_nr,
apars.sgsn_tei_c, apars.gtp_resp_cause,
apars.ggsn_tei_c, apars.ggsn_tei_u,
apars.nsapi,
@@ -686,10 +689,10 @@
var Gtp1cUnitdata g_ud;
f_send_l3(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause, false, omit), ran_index);
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
BSSGP[ran_index].clear;
- GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
}
alt {
[] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
@@ -707,10 +710,10 @@
BSSGP[ran_index].clear;
if (error_ind) {
var Gtp1uPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_c));
- GTP.send(ts_GTPU_ErrorIndication(peer, 0 /* seq */, apars.ggsn_tei_u, apars.ggsn_ip_u));
+ GTP[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.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
}
timer T := 5.0;
@@ -720,7 +723,7 @@
[] BSSGP[ran_index].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), ran_index);
}
- [not error_ind] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
+ [not error_ind] GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {
repeat;
}
[] T.timeout {
@@ -818,7 +821,7 @@
function f_gtpu_send(inout PdpActPars apars, octetstring payload) runs on BSSGP_ConnHdlr {
var Gtp1uPeer peer := valueof(ts_GtpPeerU(apars.sgsn_ip_u));
- GTP.send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
+ GTP[GTP_GGSN_IDX].send(ts_GTP1U_GPDU(peer, 0 /*seq*/, apars.sgsn_tei_u, payload));
}
altstep as_xid(PdpActPars apars, integer ran_index := 0) runs on BSSGP_ConnHdlr {
@@ -893,7 +896,7 @@
BSSGP[ran_index].send(ts_LLC_UI(enc_PDU_SN(sndcp), apars.sapi, '0'B, n_u));
/* Expect PDU via GTP from SGSN on simulated GGSN */
alt {
- [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload));
}
}
diff --git a/sgsn/SGSN_Tests.ttcn b/sgsn/SGSN_Tests.ttcn
index 9b9831a..8274d43 100644
--- a/sgsn/SGSN_Tests.ttcn
+++ b/sgsn/SGSN_Tests.ttcn
@@ -469,8 +469,8 @@
connect(vc_conn:GSUP, vc_GSUP:GSUP_CLIENT);
connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
- connect(vc_conn:GTP, vc_GGSN_GTP:CLIENT);
- connect(vc_conn:GTP_PROC, vc_GGSN_GTP:CLIENT_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);
vc_conn.start(f_handler_init(fn, id, pars));
return vc_conn;
@@ -1001,7 +1001,7 @@
[] BSSGP[0].receive(tr_GMM_DET_REQ_MT(?, ?)) {
setverdict(pass);
}
- [] GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) {
setverdict(fail, "Unexpected GTP PDP CTX ACT");
mtc.stop;
}
@@ -1119,10 +1119,10 @@
f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, cause_regular_deact, false, omit), 0);
for (i := 0; i < 2; i := i+1) {
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
log("Received deletePDPContextResponse " & int2str(i) & ", seq_nr=" & int2str(seq_nr));
- GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
}
}
@@ -1186,10 +1186,10 @@
f_pdp_ctx_act(apars);
/* Wait to receive first echo request and send initial Restart counter */
- GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
BSSGP[0].clear;
seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
- GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
f_sleep(int2float(mp_echo_interval)); /* wait until around next echo is expected */
}
@@ -1202,14 +1202,14 @@
f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
setverdict(pass);
}
- [] GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud {
/* SGSN currently doesn't send this message because it expects GGSN to be non-reachable anyway */
seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
log("Received deletePDPContextRequest seq_nr=" & int2str(seq_nr));
- GTP.send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePdpResp(g_ud.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
repeat;
}
- [] GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
log("Received EchoRequest seq_nr=" & int2str(seq_nr));
repeat;
@@ -1244,17 +1244,17 @@
/* Activate a pdp context against the GGSN */
f_pdp_ctx_act(apars);
/* Wait to receive first echo request and send initial Restart counter */
- GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
- GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
}
/* Wait to receive second echo request and send incremented Restart
counter. This will fake a restarted GGSN, and pdp ctx allocated
should be released by SGSN */
apars.ggsn_restart_ctr := int2oct(oct2int(apars.ggsn_restart_ctr) + 1, 1);
- GTP.receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, echoRequest, ?)) -> value g_ud {
var integer seq_nr := oct2int(g_ud.gtpc.opt_part.sequenceNumber);
- GTP.send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_PONG(g_ud.peer, seq_nr, apars.ggsn_restart_ctr));
}
var OCT1 cause_network_failure := int2oct(38, 1)
alt {
@@ -1330,7 +1330,7 @@
BSSGP[0].clear;
peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
- GTP.send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B));
for (i := 0; i < 5; i := i+1) {
alt {
@@ -1339,7 +1339,7 @@
}
}
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) {}
f_send_l3(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid));
setverdict(pass);
@@ -1364,16 +1364,16 @@
f_send_l3_gmm_llc(ts_SM_ACT_PDP_REQ(apars.tid, apars.nsapi, apars.sapi, apars.qos, apars.addr,
apars.apn, apars.pco), 0);
- GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_first {}
log("First createPDPContextRequest received, dropping & waiting for retransmission");
- GTP.receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, createPDPContextRequest, ?)) -> value g_ud_second {
if (g_ud_first != g_ud_second) {
setverdict(fail, "Retransmitted GTP message createPDPContextRequest is different from original one!");
mtc.stop;
}
f_process_gtp_ctx_act_req(apars, g_ud_second.gtpc);
var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
- GTP.send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_CreatePdpResp(g_ud_second.peer, seq_nr,
apars.sgsn_tei_c, apars.gtp_resp_cause,
apars.ggsn_tei_c, apars.ggsn_tei_u,
apars.nsapi,
@@ -1384,16 +1384,16 @@
/* Now the same with Deact */
f_send_l3_gmm_llc(ts_SM_DEACT_PDP_REQ_MO(apars.tid, '00'O, false, omit), 0);
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_first {}
log("First deletePDPContextRequest received, dropping & waiting for retransmission");
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextRequest, apars.ggsn_tei_c)) -> value g_ud_second {
if (g_ud_first != g_ud_second) {
setverdict(fail, "Retransmitted GTP message deletePDPContextRequest is different from original one!");
mtc.stop;
}
var integer seq_nr := oct2int(g_ud_second.gtpc.opt_part.sequenceNumber);
BSSGP[0].clear;
- GTP.send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_DeletePdpResp(g_ud_second.peer, seq_nr, apars.sgsn_tei_c, '7F'O));
}
alt {
[] BSSGP[0].receive(tr_SM_DEACT_PDP_ACCEPT_MT(apars.tid)) {
@@ -1426,14 +1426,14 @@
BSSGP[0].clear;
var Gtp1cPeer peer := valueof(ts_GtpPeerC(apars.sgsn_ip_c));
g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr, apars.sgsn_tei_c, apars.nsapi, '1'B);
- GTP.send(g_delete_req);
+ GTP[GTP_GGSN_IDX].send(g_delete_req);
alt {
[] BSSGP[0].receive(tr_SM_DEACT_PDP_REQ_MT(apars.tid, ?, true)) {
f_send_l3_gmm_llc(ts_SM_DEACT_PDP_ACCEPT_MO(apars.tid), 0);
}
[] as_xid(apars, 0);
}
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_first {
if (g_ud_first.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != '80'O) {
setverdict(fail, "Received deletePDPContextResponse cause is not 'Request accepted'");
mtc.stop;
@@ -1442,8 +1442,8 @@
/* Send duplicate DeleteCtxReq */
log("First deletePDPContextResponse received, dropping & retransmitting retransmission of deletePDPContextRequest");
- GTP.send(g_delete_req);
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
+ GTP[GTP_GGSN_IDX].send(g_delete_req);
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextResponse, apars.ggsn_tei_c)) -> value g_ud_second {
if (g_ud_first != g_ud_second) {
setverdict(fail, "Retransmitted GTP message deletePDPContextResponse is different from original one!");
mtc.stop;
@@ -1453,9 +1453,9 @@
/* Let's send now a new DeleteCtxReq (increased seq_nr) to make sure it
* is handled differently by SGSN (expect "non-existent" cause) */
g_delete_req := ts_GTPC_DeletePDP(peer, seq_nr + 1, apars.sgsn_tei_c, apars.nsapi, '1'B);
- GTP.send(g_delete_req);
+ GTP[GTP_GGSN_IDX].send(g_delete_req);
/* Response with cause "non-existent" must be sent with TEID 0 according to specs */
- GTP.receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
+ GTP[GTP_GGSN_IDX].receive(tr_GTPC_MsgType(?, deletePDPContextResponse, '00000000'O)) -> value g_ud_second {
if (g_ud_second.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue != 'C0'O) {
setverdict(fail, "Received deletePDPContextResponse cause is not 'Non-existent'");
mtc.stop;
@@ -2843,7 +2843,7 @@
timer T := 2.0;
T.start;
alt {
- [] GTP.receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPU_GPDU(peer, apars.ggsn_tei_u, payload)) {
setverdict(fail, "Unexpected GTP message");
}
[] T.timeout { setverdict(pass); }
@@ -2916,7 +2916,7 @@
sgsn_addr_control := f_inet_addr(mp_ggsn_ip),
ptmsi := ts_PTMSI(g_pars.p_tmsi),
ptmsi_sig := ts_PTMSI_sig('010203'O));
- GTP.send(ts_GTPC_SGSNContextReq(peer, seq_nr, ctx_req));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_SGSNContextReq(peer, seq_nr, ctx_req));
/* The SGSN responds with subscriber's IMSI */
var template (present) GTPC_PDUs ctx_rsp;
@@ -2941,13 +2941,13 @@
T.start(2.0);
alt {
- [] GTP.receive(tr_GTPC_SGSNContextResp(?, ?, ctx_rsp)) -> value gtpc_ud {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_SGSNContextResp(?, ?, ctx_rsp)) -> value gtpc_ud {
log("Rx SGSN Context Resp from SGSN, sending Ack");
- GTP.send(ts_GTPC_SGSNContextAck(gtpc_ud.peer, '12345678'O, seq_nr));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_SGSNContextAck(gtpc_ud.peer, '12345678'O, seq_nr));
setverdict(pass);
}
- [] GTP.receive(tr_GTPC_SGSNContextResp) -> value gtpc_ud {
- GTP.send(ts_GTPC_SGSNContextAck(gtpc_ud.peer, '12345678'O, seq_nr,
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_SGSNContextResp) -> value gtpc_ud {
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_SGSNContextAck(gtpc_ud.peer, '12345678'O, seq_nr,
ts_SGSNContextAckPDU(GTP_CAUSE_INVALID_MSG_FORMAT)));
setverdict(fail, "Rx unexpected SGSN Context Resp");
}
@@ -2985,12 +2985,12 @@
/* The SGSN has no idea about the MS and inquires the MME about it */
T.start(2.0);
alt {
- [] GTP.receive(tr_GTPC_SGSNContextReq(?, ?)) -> value gtpc_ud {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_SGSNContextReq(?, ?)) -> value gtpc_ud {
log("Rx SGSN Context Req from SGSN");
setverdict(pass);
T.stop;
}
- [] GTP.receive(tr_GTPC_SGSNContextResp) {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_SGSNContextResp) {
setverdict(fail, "Rx unexpected SGSN Context Req");
mtc.stop;
}
@@ -3023,14 +3023,14 @@
teic := '12345678'O,
mm_context := ts_MM_ContextGSM(kc),
pdp_ctx_list := { pdp_ctx });
- GTP.send(ts_GTPC_SGSNContextResp(gtpc_ud.peer, '12345678'O, seq_nr, ctx_rsp));
+ GTP[GTP_GGSN_IDX].send(ts_GTPC_SGSNContextResp(gtpc_ud.peer, '12345678'O, seq_nr, ctx_rsp));
/* TODO: Security Functions (auth/ciphering?) */
/* The SGSN ACKs */
T.start(2.0);
alt {
- [] GTP.receive(tr_GTPC_SGSNContextAck) -> value gtpc_ud {
+ [] GTP[GTP_GGSN_IDX].receive(tr_GTPC_SGSNContextAck) -> value gtpc_ud {
log("Rx SGSN Context ACK from SGSN");
setverdict(pass);
T.stop;
To view, visit change 37591. To unsubscribe, or for help writing mail filters, visit settings.