blob: 5feaf0e2e8c6aa777a853edd88e4305e8b2808dd [file] [log] [blame]
Harald Welteb3414b22017-11-23 18:22:10 +01001module BSC_MS_Simulation {
2
Harald Welte34b5a952019-05-27 11:54:11 +02003/* (C) 2017-2018 Harald Welte <laforge@gnumonks.org>
4 * (C) 2018 sysmocom - s.f.m.c. Gmbh; Author: Daniel Willmann
5 * All rights reserved.
6 *
7 * Released under the terms of GNU General Public License, Version 2 or
8 * (at your option) any later version.
9 *
10 * SPDX-License-Identifier: GPL-2.0-or-later
11 */
12
Harald Welteb3414b22017-11-23 18:22:10 +010013import from IPL4asp_Types all;
14
15import from IPA_Emulation all;
16
17import from SCCP_Types all;
18import from SCCPasp_Types all;
19import from SCCP_Emulation all;
20
Harald Welte004f5fb2017-12-16 17:54:40 +010021import from BSSAP_CodecPort all;
Harald Welte6811d102019-04-14 22:23:14 +020022import from RAN_Emulation all;
Harald Welteb3414b22017-11-23 18:22:10 +010023
24import from BSC_MS_ConnectionHandler all;
25
26type component BSC_CT {
27 /* component references */
28 var IPA_Emulation_CT vc_IPA;
29 var SCCP_CT vc_SCCP;
Harald Welte6811d102019-04-14 22:23:14 +020030 var RAN_Emulation_CT vc_BSSMAP;
Harald Welteb3414b22017-11-23 18:22:10 +010031 /* test port to SCCP emulation */
32 port SCCPasp_PT SCCP;
33
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020034 var BSC_MS_TestHdlrParams g_pars;
Harald Weltebe620f62017-11-25 00:23:54 +010035
36 var charstring g_bsc_num_str;
Harald Welteb3414b22017-11-23 18:22:10 +010037}
38
Harald Welte2fb04792017-11-25 01:14:35 +010039modulepar {
40 integer mp_num_iterations := 10;
41}
42
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020043/* helper function to create and connect a BSC_MS_ConnHdlr component */
44private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {
45 /* connect client BSSAP port to BSSAP dispatcher */
46 connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
47}
48
49private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
50runs on BSC_CT return BSC_MS_ConnHdlr {
51 var BSC_MS_ConnHdlr vc_conn;
52 vc_conn := BSC_MS_ConnHdlr.create(id);
53 f_connect_handler(vc_conn);
54 vc_conn.start(f_handler_init(fn, id, pars));
55 return vc_conn;
56}
57
58/* first function inside ConnHdlr component; sets g_pars + starts function */
59private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
60runs on BSC_MS_ConnHdlr {
61 if (isvalue(pars)) {
62 g_pars := valueof(pars);
63 }
64 fn.apply(id);
65}
66
Harald Welteb3414b22017-11-23 18:22:10 +010067function main(charstring remote_ip, PortNumber remote_port,
68 charstring local_ip, PortNumber local_port,
69 MSC_SCCP_MTP3_parameters sccp_pars,
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020070 BSC_MS_TestHdlrParams pars,
71 void_fn_bsc_ms fn, charstring id) runs on BSC_CT
Harald Welteb3414b22017-11-23 18:22:10 +010072{
Harald Weltebe620f62017-11-25 00:23:54 +010073 var integer i := 0;
Harald Welte2fb04792017-11-25 01:14:35 +010074 timer T := 1.0;
Daniel Willmann909523e2018-10-25 17:21:24 +020075 var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;
76 ccm_pars.name := id;
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020077 g_pars := pars;
Harald Welteb3414b22017-11-23 18:22:10 +010078
Harald Welte2fb04792017-11-25 01:14:35 +010079 /* create components for IPA/SCCP/BSS[M]AP stack */
Harald Weltebe620f62017-11-25 00:23:54 +010080 vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
81 vc_SCCP := SCCP_CT.create(id & "-SCCP");
Harald Welte6811d102019-04-14 22:23:14 +020082 vc_BSSMAP := RAN_Emulation_CT.create(id & "-BSSMAP");
Harald Welteb3414b22017-11-23 18:22:10 +010083
84 map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
85
86 /* connect MTP3 service provider (IPA) to lower side of SCCP */
87 connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
88
Harald Weltec82eef42017-11-24 20:40:12 +010089 /* connect BSSMAP dispatcher to upper side of SCCP */
Harald Welte004f5fb2017-12-16 17:54:40 +010090 connect(vc_BSSMAP:BSSAP, vc_SCCP:SCCP_SP_PORT);
Harald Welteb3414b22017-11-23 18:22:10 +010091
Harald Weltec82eef42017-11-24 20:40:12 +010092 /* connect BSSMAP dispatcher to IPA_Emulation MGCP */
93 connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);
94
Harald Welte2fb04792017-11-25 01:14:35 +010095 /* start components */
Daniel Willmann909523e2018-10-25 17:21:24 +020096 vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port, ccm_pars));
Harald Welteb3414b22017-11-23 18:22:10 +010097 vc_SCCP.start(SCCPStart(sccp_pars));
Harald Welte6811d102019-04-14 22:23:14 +020098 vc_BSSMAP.start(RAN_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_RanOps, id));
Harald Welteb3414b22017-11-23 18:22:10 +010099
Harald Welte2fb04792017-11-25 01:14:35 +0100100 /* Initial delay to wait for IPA connection establishment */
101 T.start(2.0);
102 T.timeout;
Harald Weltebe620f62017-11-25 00:23:54 +0100103
Harald Welte2fb04792017-11-25 01:14:35 +0100104 for (i := 0; i < mp_num_iterations; i := i+1) {
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +0200105 f_start_BSC_MS(fn, id & "-MS-" & int2str(i));
Harald Welteb3414b22017-11-23 18:22:10 +0100106 }
107
Harald Welte2fb04792017-11-25 01:14:35 +0100108 /* explicitly stop all components that we started above */
109 vc_IPA.stop;
110 vc_BSSMAP.stop;
111 vc_SCCP.stop;
Harald Welteb3414b22017-11-23 18:22:10 +0100112}
113
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +0200114function f_start_BSC_MS(void_fn_bsc_ms fn, charstring id) runs on BSC_CT {
Harald Welteb3414b22017-11-23 18:22:10 +0100115 var BSC_MS_ConnHdlr vc_conn;
Harald Welteb3414b22017-11-23 18:22:10 +0100116 /* start component */
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +0200117 vc_conn := f_start_handler(fn, id, g_pars);
Harald Welte2fb04792017-11-25 01:14:35 +0100118 /* blocking wait until component terminates. If you want to start MSs in parallel,
119 * you have to remove this statement here */
120 vc_conn.done;
Harald Welteb3414b22017-11-23 18:22:10 +0100121}
122
123}