hlr: add emulated GSUP server (second HLR)

Prepare for upcoming D-GSM test, which needs to emulate a GSUP server.

Related: OS#4380
Change-Id: Idbfe8a145c90a524145089a06d9bbefac4d7edd8
This commit is contained in:
Oliver Smith 2020-01-29 14:25:41 +01:00 committed by laforge
parent deb80a6a82
commit 6e81f7e940
2 changed files with 73 additions and 5 deletions

View File

@ -36,6 +36,7 @@ import from MSLookup_mDNS_Emulation all;
import from MSLookup_mDNS_Templates all;
type component test_CT extends CTRL_Adapter_CT {
/* emulated GSUP client (MSC/SGSN) */
var IPA_Emulation_CT vc_IPA;
var IPA_CCM_Parameters ccm_pars;
/* legacy tests without ConnHdlr */
@ -49,10 +50,15 @@ type component test_CT extends CTRL_Adapter_CT {
var MSLookup_mDNS_Emulation_CT vc_MSLookup_mDNS;
/* emulated GSUP server (second HLR) */
var IPA_Emulation_CT vc_IPA_server;
var GSUP_Emulation_CT vc_GSUP_server;
timer g_Tguard := 10.0;
};
modulepar {
/* OsmoHLR */
charstring mp_hlr_ip := "127.0.0.1";
integer mp_hlr_gsup_port := 4222;
integer mp_hlr_ctrl_port := 4259;
@ -60,6 +66,10 @@ modulepar {
when IE ts_GSUP_IE_NUM_VECTORS_REQ is absent */
integer mp_default_num_auth_tuples := 5;
/* emulated GSUP server (second HLR) */
charstring mp_hlr_ts_ip := "127.0.0.99";
integer mp_hlr_ts_port := 4222;
/* drop after osmo-hlr release > 1.2.0 */
boolean mp_hlr_supports_dgsm := true;
};
@ -90,6 +100,11 @@ type component HLR_ConnHdlr extends GSUP_ConnHdlr {
var HLR_ConnHdlrPars g_pars;
port TELNETasp_PT VTY;
port MSLookup_mDNS_PT mDNS;
/* Pass from test_CT for explicit addressing */
var GSUP_Emulation_CT vc_GSUP_server;
var GSUP_Emulation_CT vc_GSUP_client;
var IPA_CCM_Parameters ccm_pars_client;
}
type record HLR_ConnHdlrPars {
@ -138,6 +153,7 @@ private altstep as_Tguard() runs on test_CT {
}
}
/* emulated GSUP client (MSC/SGSN) */
function f_init_gsup(charstring id, boolean legacy) runs on test_CT {
id := id & "-GSUP";
var GsupOps ops := {
@ -180,12 +196,29 @@ function f_init_gsup(charstring id, boolean legacy) runs on test_CT {
}
}
/* emulated GSUP server (second HLR) */
function f_init_gsup_server(charstring id) runs on test_CT {
id := id & "-GSUP-server";
var GsupOps ops := {
create_cb := refers(GSUP_Emulation.ExpectedCreateCallback)
}
vc_GSUP_server := GSUP_Emulation_CT.create(id);
vc_IPA_server := IPA_Emulation_CT.create(id & "-IPA");
connect(vc_GSUP_server:GSUP, vc_IPA_server:IPA_GSUP_PORT);
map(vc_IPA_server:IPA_PORT, system:IPA_CODEC_PT);
vc_GSUP_server.start(GSUP_Emulation.main(ops, id));
vc_IPA_server.start(IPA_Emulation.main_server(mp_hlr_ts_ip, mp_hlr_ts_port));
}
function f_init_mslookup() runs on test_CT {
vc_MSLookup_mDNS := MSLookup_mDNS_Emulation_CT.create;
vc_MSLookup_mDNS.start(MSLookup_mDNS_Emulation.f_main());
}
function f_init(boolean legacy := true) runs on test_CT {
function f_init(boolean legacy := true, boolean gsup_server := false) runs on test_CT {
/* activate default guard timer to ensure all tests eventually terminate */
g_Tguard.start;
@ -195,10 +228,20 @@ function f_init(boolean legacy := true) runs on test_CT {
f_init_vty();
f_init_mslookup();
if (gsup_server) {
f_init_gsup_server("HLR_Test");
}
f_ipa_ctrl_start(mp_hlr_ip, mp_hlr_ctrl_port);
}
function f_start_handler(void_fn fn, HLR_ConnHdlrPars pars) runs on test_CT return HLR_ConnHdlr {
/*! Start HLR_ConnHdlr from testCT in a separate thread.
* \param void_fn function to run inside the thread.
* \param gsup_server if true, connect the emulated GSUP server ports to the new HLR_ConnHdlr. Then both the emulated
* GSUP client (MSC/SGSN) and server (second HLR) are connected. Explicit addressing with "to" and
* "from" must be used, i.e. 'GSUP.receive(tr_GSUP_UL_REQ(...)) from vc_GSUP_server'. */
function f_start_handler(void_fn fn, HLR_ConnHdlrPars pars, boolean gsup_server := false) runs on test_CT
return HLR_ConnHdlr {
var HLR_ConnHdlr vc_conn;
var charstring id := testcasename();
@ -207,7 +250,14 @@ function f_start_handler(void_fn fn, HLR_ConnHdlrPars pars) runs on test_CT retu
connect(vc_conn:GSUP_PROC, vc_GSUP:GSUP_PROC);
connect(vc_conn:mDNS, vc_MSLookup_mDNS:mDNS);
vc_conn.start(f_handler_init(fn, id, pars));
if (gsup_server) {
connect(vc_conn:GSUP, vc_GSUP_server:GSUP_CLIENT);
connect(vc_conn:GSUP_PROC, vc_GSUP_server:GSUP_PROC);
vc_conn.start(f_handler_init(fn, id, vc_GSUP_server, vc_GSUP, ccm_pars, pars));
} else {
vc_conn.start(f_handler_init(fn, id, omit, vc_GSUP, ccm_pars, pars));
}
return vc_conn;
}
@ -218,12 +268,23 @@ private function f_handler_init_vty() runs on HLR_ConnHdlr {
}
/* first function inside ConnHdlr component; sets g_pars + starts function */
function f_handler_init(void_fn fn, charstring id, template (omit) HLR_ConnHdlrPars pars := omit)
function f_handler_init(void_fn fn, charstring id,
template (omit) GSUP_Emulation_CT vc_GSUP_server_test_ct,
GSUP_Emulation_CT vc_GSUP_client_test_ct,
IPA_CCM_Parameters ccm_pars_client_test_ct,
template (omit) HLR_ConnHdlrPars pars := omit)
runs on HLR_ConnHdlr
{
/* Pass from test_CT for explicit addressing */
if (isvalue(vc_GSUP_server_test_ct)) {
vc_GSUP_server := valueof(vc_GSUP_server_test_ct);
}
vc_GSUP_client := vc_GSUP_client_test_ct;
ccm_pars_client := ccm_pars_client_test_ct;
if (isvalue(pars)) {
g_pars := valueof(pars);
f_create_gsup_expect(hex2str(g_pars.sub.imsi));
f_create_gsup_expect_explicit(hex2str(g_pars.sub.imsi), vc_GSUP_client);
}
f_handler_init_vty();
fn.apply();

View File

@ -295,4 +295,11 @@ function f_create_gsup_expect(charstring imsi) runs on GSUP_ConnHdlr {
}
}
/* Same as f_create_gsup_expect, but with explicit addressing. Needed when connecting multiple ports to GSUP_PROC. */
function f_create_gsup_expect_explicit(charstring imsi, GSUP_Emulation_CT ct) runs on GSUP_ConnHdlr {
GSUP_PROC.call(GSUPEM_register:{imsi, self}) to ct {
[] GSUP_PROC.getreply(GSUPEM_register:{?,?}) {};
}
}
}