aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Smith <osmith@sysmocom.de>2020-01-29 14:25:41 +0100
committerOliver Smith <osmith@sysmocom.de>2020-01-29 15:24:07 +0100
commit55511aae4a80a743de7b34d296cf95e49ecd01b9 (patch)
treebc35aaae556474156327bf256917ca3366819e11
parented1b5f6ad5b6f8b9d601586490bec28fa844eaf2 (diff)
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
-rw-r--r--hlr/HLR_Tests.ttcn71
-rw-r--r--library/GSUP_Emulation.ttcn7
2 files changed, 73 insertions, 5 deletions
diff --git a/hlr/HLR_Tests.ttcn b/hlr/HLR_Tests.ttcn
index d4681dc0..2becad81 100644
--- a/hlr/HLR_Tests.ttcn
+++ b/hlr/HLR_Tests.ttcn
@@ -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();
diff --git a/library/GSUP_Emulation.ttcn b/library/GSUP_Emulation.ttcn
index 5695534a..4a033597 100644
--- a/library/GSUP_Emulation.ttcn
+++ b/library/GSUP_Emulation.ttcn
@@ -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:{?,?}) {};
+ }
+}
+
}