blob: 1b24855396277c1777962bf7b29ec03b9464b355 [file] [log] [blame]
Daniel Willmann0c6f34c2018-10-24 17:26:41 +02001module BSCNAT_Tests {
Harald Welte00566f52017-11-21 16:43:49 +01002
Harald Welte34b5a952019-05-27 11:54:11 +02003/* osmo-bsc_nat test suite in TTCN-3
4 * (C) 2018-2019 sysmocom - s.f.m.c. GmbH
5 * Author: Daniel Willmann
6 * All rights reserved.
7 *
8 * Released under the terms of GNU General Public License, Version 2 or
9 * (at your option) any later version.
10 *
11 * SPDX-License-Identifier: GPL-2.0-or-later
12 */
13
Harald Welteb3414b22017-11-23 18:22:10 +010014import from Osmocom_Types all;
15
Harald Weltec76f29f2017-11-22 12:46:46 +010016import from IPL4asp_Types all;
Harald Welte00566f52017-11-21 16:43:49 +010017
Harald Weltec76f29f2017-11-22 12:46:46 +010018import from IPA_Emulation all;
Pau Espin Pedrold1d49532019-06-10 18:09:16 +020019import from RAN_Emulation all;
Harald Welted86cdc62017-11-22 00:45:07 +010020
Harald Welteb3414b22017-11-23 18:22:10 +010021import from MTP3asp_Types all;
22
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020023import from Osmocom_CTRL_Functions all;
24import from Osmocom_CTRL_Types all;
25import from Osmocom_CTRL_Adapter all;
26
Harald Weltec76f29f2017-11-22 12:46:46 +010027import from SCCP_Types all;
28import from SCCPasp_Types all;
29import from SCCP_Emulation all;
Harald Welted86cdc62017-11-22 00:45:07 +010030
Harald Welteb3414b22017-11-23 18:22:10 +010031import from MSC_Simulation all;
Pau Espin Pedrold1d49532019-06-10 18:09:16 +020032import from MSC_ConnectionHandler all;
Harald Welteb3414b22017-11-23 18:22:10 +010033import from BSC_MS_Simulation all;
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +020034import from BSC_MS_ConnectionHandler all;
Harald Welted86cdc62017-11-22 00:45:07 +010035
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +020036import from Osmocom_VTY_Functions all;
37import from TELNETasp_PortType all;
38
Harald Welteb3414b22017-11-23 18:22:10 +010039const integer NUM_MSC := 1;
40const integer NUM_BSC := 1;
41
42type record BscState {
43 BSC_CT BSC,
44 MSC_SCCP_MTP3_parameters sccp_pars,
45 SCCP_PAR_Address sccp_addr_own,
46 SCCP_PAR_Address sccp_addr_peer
47}
48
49type record MscState {
50 MSC_CT MSC,
51 MSC_SCCP_MTP3_parameters sccp_pars,
52 SCCP_PAR_Address sccp_addr_own
53}
Harald Welte00566f52017-11-21 16:43:49 +010054
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020055type component test_CT extends CTRL_Adapter_CT {
Harald Welteb3414b22017-11-23 18:22:10 +010056 var MscState msc[NUM_MSC];
57 var BscState bsc[NUM_BSC];
Harald Welte00566f52017-11-21 16:43:49 +010058
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +020059 port TELNETasp_PT BSCNATVTY;
60
Harald Weltec76f29f2017-11-22 12:46:46 +010061 var boolean g_initialized := false;
Harald Welteb3414b22017-11-23 18:22:10 +010062 var octetstring g_sio := '83'O;
Harald Weltec76f29f2017-11-22 12:46:46 +010063}
Harald Welted86cdc62017-11-22 00:45:07 +010064
Harald Weltec76f29f2017-11-22 12:46:46 +010065modulepar {
Harald Welteb3414b22017-11-23 18:22:10 +010066 PortNumber mp_bsc_port := 49999;
67 charstring mp_bsc_ip := "127.0.0.1";
68
69 PortNumber mp_msc_port := 5000;
70 charstring mp_msc_ip := "127.0.0.1";
Harald Welted86cdc62017-11-22 00:45:07 +010071
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +020072 /* port number to which to establish the IPA CTRL connection */
73 integer mp_nat_ctrl_port := 4250;
74 /* port number to which to establish the SCCPLite connection */
Daniel Willmannfd338332017-11-24 17:23:23 +010075 PortNumber mp_nat_port := 5000;
76 charstring mp_nat_ip := "127.0.0.1";
77
Harald Weltec76f29f2017-11-22 12:46:46 +010078 charstring mp_sccp_service_type := "mtp3_itu";
79
Harald Welteb3414b22017-11-23 18:22:10 +010080 integer mp_bsc_pc := 196;
81 integer mp_bsc_ssn := 254;
Harald Weltec76f29f2017-11-22 12:46:46 +010082
Harald Welteb3414b22017-11-23 18:22:10 +010083 integer mp_msc_pc := 185; /* 0.23.1 */
84 integer mp_msc_ssn := 254;
Harald Weltec76f29f2017-11-22 12:46:46 +010085}
Harald Welte00566f52017-11-21 16:43:49 +010086
Harald Welted86cdc62017-11-22 00:45:07 +010087/* construct a SCCP_PAR_Address with just PC + SSN and no GT */
88template (value) SCCP_PAR_Address ts_SccpAddr_PC_SSN(integer pc, integer ssn) := {
89 addressIndicator := {
90 pointCodeIndic := '1'B,
91 ssnIndicator := '1'B,
92 globalTitleIndic := '0000'B,
93 routingIndicator := '1'B
94 },
95 signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, '83'O),
96 //signPointCode := SCCP_SPC_int2bit(pc, mp_sccp_service_type, g_sio),
97 subsystemNumber := ssn,
98 globalTitle := omit
99}
100
Harald Welteb3414b22017-11-23 18:22:10 +0100101template MTP3_Field_sio ts_sio(octetstring sio_in) := {
102 ni := substr(oct2bit(sio_in),0,2),
103 prio := substr(oct2bit(sio_in),2,2),
104 si := substr(oct2bit(sio_in),4,4)
Harald Weltec76f29f2017-11-22 12:46:46 +0100105}
106
Harald Welteb3414b22017-11-23 18:22:10 +0100107template MSC_SCCP_MTP3_parameters ts_SCCP_Pars(octetstring sio, integer opc, integer dpc,
108 integer local_ssn) := {
109 sio := ts_sio(sio),
110 opc := opc,
111 dpc := dpc,
112 sls := 0,
113 sccp_serviceType := mp_sccp_service_type,
114 ssn := local_ssn
115};
116
117function f_init_BscState(inout BscState bsc_st, integer opc, integer dpc, integer local_ssn, integer remote_ssn)
118runs on test_CT {
119 bsc_st.sccp_pars := valueof(ts_SCCP_Pars(g_sio, opc, dpc, local_ssn));
120 bsc_st.sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(opc, local_ssn));
121 bsc_st.sccp_addr_peer := valueof(ts_SccpAddr_PC_SSN(dpc, remote_ssn));
Harald Weltec76f29f2017-11-22 12:46:46 +0100122}
123
Harald Welteb3414b22017-11-23 18:22:10 +0100124function f_init_MscState(inout MscState msc_st, integer opc, integer dpc, integer local_ssn, integer remote_ssn)
125runs on test_CT {
126 msc_st.sccp_pars := valueof(ts_SCCP_Pars(g_sio, opc, dpc, local_ssn));
127 msc_st.sccp_addr_own := valueof(ts_SccpAddr_PC_SSN(opc, local_ssn));
Harald Welted86cdc62017-11-22 00:45:07 +0100128}
129
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +0200130function f_vty_allow_osmux(boolean allow) runs on test_CT {
131 if (allow) {
132 f_vty_config(BSCNATVTY, "mgcp", "osmux on");
133 } else {
134 f_vty_config(BSCNATVTY, "mgcp", "osmux off");
135 }
136}
137
138function f_init_vty(charstring id := "foo") runs on test_CT {
139 if (BSCNATVTY.checkstate("Mapped")) {
140 /* skip initialization if already executed once */
141 return;
142 }
143 map(self:BSCNATVTY, system:BSCNATVTY);
144 f_vty_set_prompts(BSCNATVTY);
145 f_vty_transceive(BSCNATVTY, "enable");
146}
147
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200148function f_init(void_fn_bsc_ms fn_bsc_ms, void_fn_bsc fn_bsc, BssmapCreateCallback cb_msc, boolean use_osmux) runs on test_CT {
Harald Welteb3414b22017-11-23 18:22:10 +0100149 var integer i;
Harald Weltebe620f62017-11-25 00:23:54 +0100150 var charstring id;
Harald Welte00566f52017-11-21 16:43:49 +0100151
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +0200152 f_init_vty("VirtBSCNAT");
153 f_vty_allow_osmux(use_osmux);
Pau Espin Pedrol9a5b8ff2021-01-04 19:01:31 +0100154 f_ipa_ctrl_start_client(mp_nat_ip, mp_nat_ctrl_port);
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +0200155
Harald Welteb3414b22017-11-23 18:22:10 +0100156 for (i := 0; i < NUM_MSC; i := i+1) {
157 f_init_MscState(msc[i], mp_msc_pc +i, mp_bsc_pc, mp_msc_ssn, mp_bsc_ssn);
Harald Weltebe620f62017-11-25 00:23:54 +0100158 id := "MSC" & int2str(i);
Daniel Willmannc07f6f52019-03-28 13:03:55 +0100159 msc[i].MSC := MSC_CT.create(id);
Pau Espin Pedrold1d49532019-06-10 18:09:16 +0200160 msc[i].MSC.start(MSC_Simulation.main(mp_msc_ip, mp_msc_port + i,
161 msc[i].sccp_pars, msc[i].sccp_addr_own,
162 cb_msc, id));
Harald Welte00566f52017-11-21 16:43:49 +0100163 }
164
Daniel Willmann991fd782018-10-25 17:20:27 +0200165 /* Wait for bsc_nat to attach to MSC. Before that all BSC connections will be dropped */
166 f_sleep(5.0);
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +0200167
Harald Welteb3414b22017-11-23 18:22:10 +0100168 for (i := 0; i < NUM_BSC; i := i+1) {
169 f_init_BscState(bsc[i], mp_bsc_pc +i, mp_msc_pc, mp_bsc_ssn, mp_msc_ssn);
Harald Weltebe620f62017-11-25 00:23:54 +0100170 id := "BSC" & int2str(i);
Daniel Willmannc07f6f52019-03-28 13:03:55 +0100171 bsc[i].BSC := BSC_CT.create(id);
Pau Espin Pedrol8d85ba42019-06-10 16:36:30 +0200172 var BSC_MS_TestHdlrParams pars;
173 pars.sccp_addr_own := bsc[i].sccp_addr_own;
174 pars.sccp_addr_remote := bsc[i].sccp_addr_peer;
175 pars.use_osmux := use_osmux;
Daniel Willmannfd338332017-11-24 17:23:23 +0100176 bsc[i].BSC.start(BSC_MS_Simulation.main(mp_nat_ip, mp_nat_port, mp_bsc_ip, mp_bsc_port+i,
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200177 bsc[i].sccp_pars, pars, fn_bsc_ms, fn_bsc, id));
Harald Welteb3414b22017-11-23 18:22:10 +0100178 }
Harald Welte00566f52017-11-21 16:43:49 +0100179
Harald Weltec76f29f2017-11-22 12:46:46 +0100180}
181
Pau Espin Pedrolbdcfe032019-06-10 16:54:42 +0200182function f_wait_finish(timer T) runs on test_CT {
Harald Welte2fb04792017-11-25 01:14:35 +0100183 var integer i;
Harald Welte2fb04792017-11-25 01:14:35 +0100184 alt {
185 /* wait for BSC to stop. The idea is that the BSC components terminate first */
186 [] bsc[0].BSC.done { }
187 [] T.timeout { setverdict(fail); }
188 }
Harald Weltec76f29f2017-11-22 12:46:46 +0100189
Harald Welte2fb04792017-11-25 01:14:35 +0100190 all component.stop;
191 /* terminate the MSCs */
192 for (i := 0; i < NUM_MSC; i := i+1) {
193 msc[i].MSC.stop;
Harald Welte00566f52017-11-21 16:43:49 +0100194 }
Pau Espin Pedrolf2b477b2019-06-13 17:16:44 +0200195 setverdict(pass);
Harald Weltec76f29f2017-11-22 12:46:46 +0100196}
Harald Welte00566f52017-11-21 16:43:49 +0100197
Pau Espin Pedrolbdcfe032019-06-10 16:54:42 +0200198
199function f_TC_recv_dump(boolean use_osmux := false) runs on test_CT {
200 timer T := 30.0;
Pau Espin Pedrol5f89adf2019-06-13 16:53:16 +0200201 T.start;
Pau Espin Pedrolbdcfe032019-06-10 16:54:42 +0200202
Pau Espin Pedrold1d49532019-06-10 18:09:16 +0200203 f_init(refers(bsc_ms_establish_fully),
Pau Espin Pedrola8396042019-06-10 19:21:52 +0200204 refers(bsc_do_nothing),
Pau Espin Pedrold1d49532019-06-10 18:09:16 +0200205 refers(CreateCallback_establish_fully),
206 use_osmux);
Pau Espin Pedrolbdcfe032019-06-10 16:54:42 +0200207
208 f_wait_finish(T);
209}
210
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +0200211testcase TC_recv_dump() runs on test_CT {
212 f_TC_recv_dump();
213}
214
215testcase TC_recv_dump_osmux() runs on test_CT {
216 f_TC_recv_dump(true);
217}
218
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200219testcase TC_ctrl_location() runs on test_CT {
220 timer T := 30.0;
Pau Espin Pedrol5f89adf2019-06-13 16:53:16 +0200221 T.start;
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200222
223 f_init(refers(bsc_ms_do_nothing),
224 refers(bsc_ctrl_location),
225 refers(CreateCallback_establish_fully),
226 false);
227
228 f_ctrl_exp_trap(IPA_CTRL, "net.0.bsc.0.bts.0.location-state",
229 "1234567,fix3d,0.340000,0.560000,0.780000,operational,unlocked,on,001,01",
230 10.0);
231 f_ctrl_set(IPA_CTRL, "net.0.bsc.0.rf_locked", "1");
232
233 f_wait_finish(T);
234}
235
Harald Weltec76f29f2017-11-22 12:46:46 +0100236control {
237 execute( TC_recv_dump() );
Pau Espin Pedrolf3c12222019-05-22 15:18:42 +0200238 execute( TC_recv_dump_osmux() );
Pau Espin Pedrol8ab9a792019-06-10 21:02:03 +0200239 execute( TC_ctrl_location() );
Harald Weltec76f29f2017-11-22 12:46:46 +0100240}
241
Harald Welte00566f52017-11-21 16:43:49 +0100242}