blob: 0a057a3ab22e7c7f04c8abd9a2257b54b6c39b5f [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
Pau Espin Pedrol298fa912019-06-13 17:12:12 +020013import from Osmocom_Types all;
Harald Welteb3414b22017-11-23 18:22:10 +010014import from IPL4asp_Types all;
15
16import from IPA_Emulation all;
17
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020018import from Osmocom_CTRL_Functions all;
19import from Osmocom_CTRL_Types all;
20
Harald Welteb3414b22017-11-23 18:22:10 +010021import from SCCP_Types all;
22import from SCCPasp_Types all;
23import from SCCP_Emulation all;
24
Harald Welte004f5fb2017-12-16 17:54:40 +010025import from BSSAP_CodecPort all;
Harald Welte6811d102019-04-14 22:23:14 +020026import from RAN_Emulation all;
Harald Welteb3414b22017-11-23 18:22:10 +010027
28import from BSC_MS_ConnectionHandler all;
29
Pau Espin Pedrola8396042019-06-10 19:21:52 +020030type function void_fn_bsc(charstring id) runs on BSC_CT;
31type record of BSC_MS_ConnHdlr BSC_MS_ConnHdlrList;
32
Harald Welteb3414b22017-11-23 18:22:10 +010033type component BSC_CT {
34 /* component references */
35 var IPA_Emulation_CT vc_IPA;
36 var SCCP_CT vc_SCCP;
Harald Welte6811d102019-04-14 22:23:14 +020037 var RAN_Emulation_CT vc_BSSMAP;
Harald Welteb3414b22017-11-23 18:22:10 +010038 /* test port to SCCP emulation */
39 port SCCPasp_PT SCCP;
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020040 /* test port to SCCPLite CTRL over IPA emulation */
41 port IPA_CTRL_PT SCCPLITE_IPA_CTRL;
Harald Welteb3414b22017-11-23 18:22:10 +010042
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020043 var BSC_MS_TestHdlrParams g_pars;
Harald Weltebe620f62017-11-25 00:23:54 +010044
45 var charstring g_bsc_num_str;
Harald Welteb3414b22017-11-23 18:22:10 +010046}
47
Harald Welte2fb04792017-11-25 01:14:35 +010048modulepar {
49 integer mp_num_iterations := 10;
50}
51
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020052/* helper function to create and connect a BSC_MS_ConnHdlr component */
53private function f_connect_handler(inout BSC_MS_ConnHdlr vc_conn) runs on BSC_CT {
54 /* connect client BSSAP port to BSSAP dispatcher */
55 connect(vc_conn:BSSAP, vc_BSSMAP:CLIENT);
56}
57
58private function f_start_handler(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
59runs on BSC_CT return BSC_MS_ConnHdlr {
60 var BSC_MS_ConnHdlr vc_conn;
61 vc_conn := BSC_MS_ConnHdlr.create(id);
62 f_connect_handler(vc_conn);
63 vc_conn.start(f_handler_init(fn, id, pars));
64 return vc_conn;
65}
66
67/* first function inside ConnHdlr component; sets g_pars + starts function */
68private function f_handler_init(void_fn_bsc_ms fn, charstring id, template (omit) BSC_MS_TestHdlrParams pars := omit)
69runs on BSC_MS_ConnHdlr {
70 if (isvalue(pars)) {
71 g_pars := valueof(pars);
72 }
73 fn.apply(id);
74}
75
Pau Espin Pedrola8396042019-06-10 19:21:52 +020076function bsc_do_nothing(charstring id)
77runs on BSC_CT {
78}
79
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020080/* Submit a location-state TRAP BSC->BSC-NAT */
81function bsc_ctrl_location(charstring id)
82runs on BSC_CT {
83 log("Starting main of BSC_CT");
84 f_ctrl_trap(SCCPLITE_IPA_CTRL, "bts.0.location-state",
85 "1234567,fix3d,0.340000,0.560000,0.780000,operational,unlocked,on,001,01");
86 f_ctrl_exp_set(SCCPLITE_IPA_CTRL, "rf_locked", "1", "1");
Pau Espin Pedrol298fa912019-06-13 17:12:12 +020087 /* Leave some time for SET_REPLY to reach the other side before closing
88 conn towards BSC-NAT, otherwise TCP FIN is sent before SET_REPLY and
89 bsc-nat sends a CTRL ERR to whoever sent the SET cmd. */
90 f_sleep(1.0);
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020091}
92
Harald Welteb3414b22017-11-23 18:22:10 +010093function main(charstring remote_ip, PortNumber remote_port,
94 charstring local_ip, PortNumber local_port,
95 MSC_SCCP_MTP3_parameters sccp_pars,
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020096 BSC_MS_TestHdlrParams pars,
Pau Espin Pedrola8396042019-06-10 19:21:52 +020097 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 +010098{
Harald Weltebe620f62017-11-25 00:23:54 +010099 var integer i := 0;
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200100 timer T := 2.0;
Daniel Willmann909523e2018-10-25 17:21:24 +0200101 var IPA_CCM_Parameters ccm_pars := IPA_Emulation.c_IPA_default_ccm_pars;
102 ccm_pars.name := id;
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +0200103 g_pars := pars;
Harald Welteb3414b22017-11-23 18:22:10 +0100104
Harald Welte2fb04792017-11-25 01:14:35 +0100105 /* create components for IPA/SCCP/BSS[M]AP stack */
Harald Weltebe620f62017-11-25 00:23:54 +0100106 vc_IPA := IPA_Emulation_CT.create(id & "-IPA");
107 vc_SCCP := SCCP_CT.create(id & "-SCCP");
Harald Welte6811d102019-04-14 22:23:14 +0200108 vc_BSSMAP := RAN_Emulation_CT.create(id & "-BSSMAP");
Harald Welteb3414b22017-11-23 18:22:10 +0100109
110 map(vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
111
112 /* connect MTP3 service provider (IPA) to lower side of SCCP */
113 connect(vc_IPA:MTP3_SP_PORT, vc_SCCP:MTP3_SCCP_PORT);
114
Harald Weltec82eef42017-11-24 20:40:12 +0100115 /* connect BSSMAP dispatcher to upper side of SCCP */
Harald Welte004f5fb2017-12-16 17:54:40 +0100116 connect(vc_BSSMAP:BSSAP, vc_SCCP:SCCP_SP_PORT);
Harald Welteb3414b22017-11-23 18:22:10 +0100117
Harald Weltec82eef42017-11-24 20:40:12 +0100118 /* connect BSSMAP dispatcher to IPA_Emulation MGCP */
119 connect(vc_BSSMAP:MGCP, vc_IPA:IPA_MGCP_PORT);
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200120 /* connect BSSMAP dispatcher to IPA_Emulation CTRL */
121 connect(vc_BSSMAP:CTRL, vc_IPA:IPA_CTRL_PORT);
122
123 /* connect BSSMAP dispatcher to IPA_Emulation CTRL */
124 connect(self:SCCPLITE_IPA_CTRL, vc_BSSMAP:CTRL_CLIENT);
Harald Weltec82eef42017-11-24 20:40:12 +0100125
Harald Welte2fb04792017-11-25 01:14:35 +0100126 /* start components */
Daniel Willmann909523e2018-10-25 17:21:24 +0200127 vc_IPA.start(IPA_Emulation.main_client(remote_ip, remote_port, local_ip, local_port, ccm_pars));
Harald Welteb3414b22017-11-23 18:22:10 +0100128 vc_SCCP.start(SCCPStart(sccp_pars));
Harald Welte6811d102019-04-14 22:23:14 +0200129 vc_BSSMAP.start(RAN_Emulation.main(BSC_MS_ConnectionHandler.BSC_MS_RanOps, id));
Harald Welteb3414b22017-11-23 18:22:10 +0100130
Harald Welte2fb04792017-11-25 01:14:35 +0100131 /* Initial delay to wait for IPA connection establishment */
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200132 T.start;
133 alt {
Vadim Yanitskiya2afacc2020-05-18 21:16:19 +0700134 [] SCCPLITE_IPA_CTRL.receive(tr_ASP_IPA_EV(ASP_IPA_EVENT_UP)) { }
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200135 [] T.timeout {
136 setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
137 mtc.stop;
138 }
139 }
Harald Weltebe620f62017-11-25 00:23:54 +0100140
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200141 var BSC_MS_ConnHdlrList vc_conns;
Harald Welte2fb04792017-11-25 01:14:35 +0100142 for (i := 0; i < mp_num_iterations; i := i+1) {
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200143 vc_conns[i] := f_start_handler(fn_bsc_ms, id & "-MS-" & int2str(i), g_pars);
144 }
145
146 fn_bsc.apply(id);
147
148 for (i := 0; i < mp_num_iterations; i := i+1) {
149 vc_conns[i].done;
Harald Welteb3414b22017-11-23 18:22:10 +0100150 }
151
Harald Welte2fb04792017-11-25 01:14:35 +0100152 /* explicitly stop all components that we started above */
153 vc_IPA.stop;
154 vc_BSSMAP.stop;
155 vc_SCCP.stop;
Harald Welteb3414b22017-11-23 18:22:10 +0100156}
157
Harald Welteb3414b22017-11-23 18:22:10 +0100158}