blob: 453f304045044d7fe8c02d8e0811f01a9ff33bc1 [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
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020017import from Osmocom_CTRL_Functions all;
18import from Osmocom_CTRL_Types all;
19
Harald Welteb3414b22017-11-23 18:22:10 +010020import from SCCP_Types all;
21import from SCCPasp_Types all;
22import from SCCP_Emulation all;
23
Harald Welte004f5fb2017-12-16 17:54:40 +010024import from BSSAP_CodecPort all;
Harald Welte6811d102019-04-14 22:23:14 +020025import from RAN_Emulation all;
Harald Welteb3414b22017-11-23 18:22:10 +010026
27import from BSC_MS_ConnectionHandler all;
28
Pau Espin Pedrola8396042019-06-10 19:21:52 +020029type function void_fn_bsc(charstring id) runs on BSC_CT;
30type record of BSC_MS_ConnHdlr BSC_MS_ConnHdlrList;
31
Harald Welteb3414b22017-11-23 18:22:10 +010032type component BSC_CT {
33 /* component references */
34 var IPA_Emulation_CT vc_IPA;
35 var SCCP_CT vc_SCCP;
Harald Welte6811d102019-04-14 22:23:14 +020036 var RAN_Emulation_CT vc_BSSMAP;
Harald Welteb3414b22017-11-23 18:22:10 +010037 /* test port to SCCP emulation */
38 port SCCPasp_PT SCCP;
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020039 /* test port to SCCPLite CTRL over IPA emulation */
40 port IPA_CTRL_PT SCCPLITE_IPA_CTRL;
Harald Welteb3414b22017-11-23 18:22:10 +010041
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020042 var BSC_MS_TestHdlrParams g_pars;
Harald Weltebe620f62017-11-25 00:23:54 +010043
44 var charstring g_bsc_num_str;
Harald Welteb3414b22017-11-23 18:22:10 +010045}
46
Harald Welte2fb04792017-11-25 01:14:35 +010047modulepar {
48 integer mp_num_iterations := 10;
49}
50
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020051/* helper function to create and connect a BSC_MS_ConnHdlr component */
52private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {
53 /* connect client BSSAP port to BSSAP dispatcher */
54 connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
55}
56
57private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
58runs on BSC_CT return BSC_MS_ConnHdlr {
59 var BSC_MS_ConnHdlr vc_conn;
60 vc_conn := BSC_MS_ConnHdlr.create(id);
61 f_connect_handler(vc_conn);
62 vc_conn.start(f_handler_init(fn, id, pars));
63 return vc_conn;
64}
65
66/* first function inside ConnHdlr component; sets g_pars + starts function */
67private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
68runs on BSC_MS_ConnHdlr {
69 if (isvalue(pars)) {
70 g_pars := valueof(pars);
71 }
72 fn.apply(id);
73}
74
Pau Espin Pedrola8396042019-06-10 19:21:52 +020075function bsc_do_nothing(charstring id)
76runs on BSC_CT {
77}
78
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020079/* Submit a location-state TRAP BSC->BSC-NAT */
80function bsc_ctrl_location(charstring id)
81runs on BSC_CT {
82 log("Starting main of BSC_CT");
83 f_ctrl_trap(SCCPLITE_IPA_CTRL, "bts.0.location-state",
84 "1234567,fix3d,0.340000,0.560000,0.780000,operational,unlocked,on,001,01");
85 f_ctrl_exp_set(SCCPLITE_IPA_CTRL, "rf_locked", "1", "1");
86}
87
Harald Welteb3414b22017-11-23 18:22:10 +010088function main(charstring remote_ip, PortNumber remote_port,
89 charstring local_ip, PortNumber local_port,
90 MSC_SCCP_MTP3_parameters sccp_pars,
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020091 BSC_MS_TestHdlrParams pars,
Pau Espin Pedrola8396042019-06-10 19:21:52 +020092 void_fn_bsc_ms fn_bsc_ms, void_fn_bsc fn_bsc, charstring id) runs on BSC_CT
Harald Welteb3414b22017-11-23 18:22:10 +010093{
Harald Weltebe620f62017-11-25 00:23:54 +010094 var integer i := 0;
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020095 timer T := 2.0;
Daniel Willmann909523e2018-10-25 17:21:24 +020096 var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;
97 ccm_pars.name := id;
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020098 g_pars := pars;
Harald Welteb3414b22017-11-23 18:22:10 +010099
Harald Welte2fb04792017-11-25 01:14:35 +0100100 /* create components for IPA/SCCP/BSS[M]AP stack */
Harald Weltebe620f62017-11-25 00:23:54 +0100101 vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
102 vc_SCCP := SCCP_CT.create(id & "-SCCP");
Harald Welte6811d102019-04-14 22:23:14 +0200103 vc_BSSMAP := RAN_Emulation_CT.create(id & "-BSSMAP");
Harald Welteb3414b22017-11-23 18:22:10 +0100104
105 map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
106
107 /* connect MTP3 service provider (IPA) to lower side of SCCP */
108 connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
109
Harald Weltec82eef42017-11-24 20:40:12 +0100110 /* connect BSSMAP dispatcher to upper side of SCCP */
Harald Welte004f5fb2017-12-16 17:54:40 +0100111 connect(vc_BSSMAP:BSSAP, vc_SCCP:SCCP_SP_PORT);
Harald Welteb3414b22017-11-23 18:22:10 +0100112
Harald Weltec82eef42017-11-24 20:40:12 +0100113 /* connect BSSMAP dispatcher to IPA_Emulation MGCP */
114 connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200115 /* connect BSSMAP dispatcher to IPA_Emulation CTRL */
116 connect(vc_BSSMAP:CTRL, vc_IPA:IPA_CTRL_PORT);
117
118 /* connect BSSMAP dispatcher to IPA_Emulation CTRL */
119 connect(self:SCCPLITE_IPA_CTRL, vc_BSSMAP:CTRL_CLIENT);
Harald Weltec82eef42017-11-24 20:40:12 +0100120
Harald Welte2fb04792017-11-25 01:14:35 +0100121 /* start components */
Daniel Willmann909523e2018-10-25 17:21:24 +0200122 vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port, ccm_pars));
Harald Welteb3414b22017-11-23 18:22:10 +0100123 vc_SCCP.start(SCCPStart(sccp_pars));
Harald Welte6811d102019-04-14 22:23:14 +0200124 vc_BSSMAP.start(RAN_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_RanOps, id));
Harald Welteb3414b22017-11-23 18:22:10 +0100125
Harald Welte2fb04792017-11-25 01:14:35 +0100126 /* Initial delay to wait for IPA connection establishment */
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200127 T.start;
128 alt {
129 [] SCCPLITE_IPA_CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
130 [] T.timeout {
131 setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
132 mtc.stop;
133 }
134 }
Harald Weltebe620f62017-11-25 00:23:54 +0100135
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200136 var BSC_MS_ConnHdlrList vc_conns;
Harald Welte2fb04792017-11-25 01:14:35 +0100137 for (i := 0; i < mp_num_iterations; i := i+1) {
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200138 vc_conns[i] := f_start_handler(fn_bsc_ms, id & "-MS-" & int2str(i), g_pars);
139 }
140
141 fn_bsc.apply(id);
142
143 for (i := 0; i < mp_num_iterations; i := i+1) {
144 vc_conns[i].done;
Harald Welteb3414b22017-11-23 18:22:10 +0100145 }
146
Harald Welte2fb04792017-11-25 01:14:35 +0100147 /* explicitly stop all components that we started above */
148 vc_IPA.stop;
149 vc_BSSMAP.stop;
150 vc_SCCP.stop;
Harald Welteb3414b22017-11-23 18:22:10 +0100151}
152
Harald Welteb3414b22017-11-23 18:22:10 +0100153}