119 lines
3.2 KiB
Plaintext
119 lines
3.2 KiB
Plaintext
|
/* MME (Mobility Management Engine) test suite in TTCN-3
|
||
|
* (C) 2019 Harald Welte <laforge@gnumonks.org>
|
||
|
* All rights reserved.
|
||
|
*
|
||
|
* Released under the terms of GNU General Public License, Version 2 or
|
||
|
* (at your option) any later version.
|
||
|
*
|
||
|
* SPDX-License-Identifier: GPL-2.0-or-later
|
||
|
*/
|
||
|
|
||
|
module MME_Tests {
|
||
|
|
||
|
import from SGsAP_Types all;
|
||
|
import from SGsAP_Templates all;
|
||
|
import from SGsAP_Emulation all;
|
||
|
|
||
|
import from L3_Templates all;
|
||
|
import from DNS_Helpers all;
|
||
|
|
||
|
friend module MME_Tests_SGsAP;
|
||
|
|
||
|
type component MTC_CT {
|
||
|
var SGsAP_Emulation_CT vc_SGsAP;
|
||
|
port SGsAP_PT SGsAP_UNIT;
|
||
|
port SGsAPEM_PROC_PT SGsAP_PROC;
|
||
|
}
|
||
|
|
||
|
type component ConnHdlr extends SGsAP_ConnHdlr {
|
||
|
var ConnHdlrPars g_pars;
|
||
|
timer g_Tguard := 30.0;
|
||
|
}
|
||
|
|
||
|
type record ConnHdlrPars {
|
||
|
hexstring imsi
|
||
|
}
|
||
|
|
||
|
modulepar {
|
||
|
charstring mp_sgs_local_ip := "127.0.0.1";
|
||
|
integer mp_sgs_local_port := 29118;
|
||
|
charstring mp_vlr_name := "vlr.example.net";
|
||
|
charstring mp_mme_name := "mmec01.mmegi0001.mme.epc.mnc070.mcc901.3gppnetwork.org";
|
||
|
}
|
||
|
|
||
|
/* send incoming unit data messages (like reset) to global SGsAP_UNIT port */
|
||
|
friend function ForwardUnitdataCallback(PDU_SGsAP msg)
|
||
|
runs on SGsAP_Emulation_CT return template PDU_SGsAP {
|
||
|
SGsAP_UNIT.send(msg);
|
||
|
return omit;
|
||
|
}
|
||
|
|
||
|
friend function f_init_sgsap(charstring id) runs on MTC_CT {
|
||
|
id := id & "-SGsAP";
|
||
|
var SGsAPOps ops := {
|
||
|
create_cb := refers(SGsAP_Emulation.ExpectedCreateCallback),
|
||
|
unitdata_cb := refers(ForwardUnitdataCallback)
|
||
|
}
|
||
|
var SGsAP_conn_parameters pars := {
|
||
|
remote_ip := "",
|
||
|
remote_sctp_port := -1,
|
||
|
local_ip := mp_sgs_local_ip,
|
||
|
local_sctp_port := mp_sgs_local_port
|
||
|
}
|
||
|
|
||
|
vc_SGsAP := SGsAP_Emulation_CT.create(id);
|
||
|
map(vc_SGsAP:SGsAP, system:SGsAP_CODEC_PT);
|
||
|
connect(vc_SGsAP:SGsAP_PROC, self:SGsAP_PROC);
|
||
|
connect(vc_SGsAP:SGsAP_UNIT, self:SGsAP_UNIT);
|
||
|
vc_SGsAP.start(SGsAP_Emulation.main(ops, pars, id));
|
||
|
}
|
||
|
|
||
|
/* generate parameters for a connection handler */
|
||
|
friend function f_init_pars(integer imsi_suffix)
|
||
|
runs on MTC_CT return ConnHdlrPars {
|
||
|
var ConnHdlrPars pars := {
|
||
|
imsi := f_gen_imsi(imsi_suffix)
|
||
|
};
|
||
|
return pars;
|
||
|
}
|
||
|
|
||
|
type function void_fn(ConnHdlrPars pars) runs on ConnHdlr;
|
||
|
|
||
|
/* start a connection handler with given parameters */
|
||
|
friend function f_start_handler_with_pars(void_fn fn, ConnHdlrPars pars, integer s1ap_idx := 0)
|
||
|
runs on MTC_CT return ConnHdlr {
|
||
|
var ConnHdlr vc_conn;
|
||
|
var charstring id := testcasename() & int2str(s1ap_idx);
|
||
|
|
||
|
vc_conn := ConnHdlr.create(id);
|
||
|
/* SGsAP part */
|
||
|
connect(vc_conn:SGsAP, vc_SGsAP:SGsAP_CLIENT);
|
||
|
connect(vc_conn:SGsAP_PROC, vc_SGsAP:SGsAP_PROC);
|
||
|
|
||
|
/* We cannot use vc_conn.start(f_init_handler(fn, id, pars)); as we cannot have
|
||
|
* a stand-alone 'derefers()' call, see https://www.eclipse.org/forums/index.php/t/1091364/ */
|
||
|
vc_conn.start(derefers(fn)(pars));
|
||
|
return vc_conn;
|
||
|
}
|
||
|
|
||
|
/* altstep for the global guard timer */
|
||
|
private altstep as_Tguard()runs on ConnHdlr {
|
||
|
[] g_Tguard.timeout {
|
||
|
setverdict(fail, "Tguard timeout");
|
||
|
mtc.stop;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
friend function f_init_handler(ConnHdlrPars pars, float t_guard := 30.0) runs on ConnHdlr {
|
||
|
/* make parameters available via component variable */
|
||
|
g_pars := pars;
|
||
|
/* start guard timre and activate it as default */
|
||
|
g_Tguard.start(t_guard);
|
||
|
activate(as_Tguard());
|
||
|
/* Route all SGsAP mesages for our IMSIto us */
|
||
|
f_create_sgsap_expect(pars.imsi);
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|