blob: d99039e77a1aceb321e85f18164fe23d3785544b [file] [log] [blame]
Harald Welte28d943e2017-11-25 15:00:50 +01001module BSC_Tests {
2
3import from Osmocom_Types all;
Harald Welteae026692017-12-09 01:03:01 +01004import from GSM_Types all;
Harald Welte28d943e2017-11-25 15:00:50 +01005import from IPL4asp_Types all;
6
Harald Welteae026692017-12-09 01:03:01 +01007import from BSSAP_Adapter all;
8import from BSSAP_CodecPort all;
9import from BSSMAP_Templates all;
Harald Welte28d943e2017-11-25 15:00:50 +010010import from IPA_Emulation all;
Harald Welteae026692017-12-09 01:03:01 +010011import from IPA_Types all;
12import from RSL_Types all;
Harald Welte28d943e2017-11-25 15:00:50 +010013
Harald Welte96c94412017-12-09 03:12:45 +010014import from Osmocom_CTRL_Functions all;
Harald Weltea5d2ab22017-12-09 14:21:42 +010015import from Osmocom_CTRL_Types all;
Harald Welte96c94412017-12-09 03:12:45 +010016
Harald Welteae026692017-12-09 01:03:01 +010017import from RSL_Tests all;
Harald Welte28d943e2017-11-25 15:00:50 +010018
Harald Welte696ddb62017-12-08 14:01:43 +010019const integer NUM_BTS := 1;
Harald Welteae026692017-12-09 01:03:01 +010020const float T3101_MAX := 12.0;
Harald Welte28d943e2017-11-25 15:00:50 +010021
Harald Welte96c94412017-12-09 03:12:45 +010022type record BTS_State {
Harald Weltea5d2ab22017-12-09 14:21:42 +010023 IPA_Client rsl
Harald Welte96c94412017-12-09 03:12:45 +010024}
25
Harald Welteae026692017-12-09 01:03:01 +010026type component test_CT extends BSSAP_Adapter_CT {
Harald Welte96c94412017-12-09 03:12:45 +010027 var BTS_State bts[NUM_BTS];
Harald Welteae026692017-12-09 01:03:01 +010028 port IPA_RSL_PT IPA_RSL[NUM_BTS];
Harald Weltea5d2ab22017-12-09 14:21:42 +010029
30 var IPA_Client ctrl;
31 port IPA_CTRL_PT IPA_CTRL;
Harald Welte28d943e2017-11-25 15:00:50 +010032
33 var boolean g_initialized := false;
Harald Welteae026692017-12-09 01:03:01 +010034 timer T_guard := 30.0;
35
Harald Welte28d943e2017-11-25 15:00:50 +010036}
37
38modulepar {
Harald Welte696ddb62017-12-08 14:01:43 +010039 charstring mp_bsc_ip := "127.0.0.1";
40 integer mp_bsc_rsl_port := 3003;
Harald Welte96c94412017-12-09 03:12:45 +010041 integer mp_bsc_ctrl_port := 4249;
Harald Welte28d943e2017-11-25 15:00:50 +010042}
43
Harald Welteae026692017-12-09 01:03:01 +010044type record IPA_Client {
45 IPA_Emulation_CT vc_IPA,
46 IPA_CCM_Parameters ccm_pars,
47 charstring id
Harald Welte28d943e2017-11-25 15:00:50 +010048}
49
Harald Welteae026692017-12-09 01:03:01 +010050function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i)
Harald Welte28d943e2017-11-25 15:00:50 +010051runs on test_CT {
Harald Welteae026692017-12-09 01:03:01 +010052 timer T := 10.0;
53
Harald Welte96c94412017-12-09 03:12:45 +010054 clnt.id := "IPA" & int2str(i) & "-RSL";
Harald Welteae026692017-12-09 01:03:01 +010055 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
56 clnt.ccm_pars := c_IPA_default_ccm_pars;
57 clnt.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
58 clnt.ccm_pars.unit_id := int2str(1234+i) & "/0/0";
59
60 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
61 connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]);
62
63 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1, clnt.ccm_pars));
64
65 /* wait for IPA RSL link to connect and send ID ACK */
66 T.start;
67 alt {
68 [] IPA_RSL[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) {
69 T.stop;
70 IPA_RSL[i].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_PAGING_LOAD_IND(23)));
71 }
72 [] IPA_RSL[i].receive { repeat }
73 [] T.timeout {
Harald Welte96c94412017-12-09 03:12:45 +010074 setverdict(fail, "Timeout RSL waiting for ASP_IPA_EVENT_ID_ACK");
Harald Welteae026692017-12-09 01:03:01 +010075 self.stop;
76 }
77 }
78}
79
Harald Welte96c94412017-12-09 03:12:45 +010080function f_ipa_ctrl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i)
81runs on test_CT {
82 timer T := 10.0;
83
84 clnt.id := "IPA" & int2str(i) & "-CTRL";
85 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
86
87 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
Harald Weltea5d2ab22017-12-09 14:21:42 +010088 connect(clnt.vc_IPA:IPA_CTRL_PORT, self:IPA_CTRL);
Harald Welte96c94412017-12-09 03:12:45 +010089
90 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1));
91
92 /* wait for IPA CTRL link to connect and send UP */
93 T.start;
94 alt {
Harald Weltea5d2ab22017-12-09 14:21:42 +010095 [] IPA_CTRL.receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
Harald Welte96c94412017-12-09 03:12:45 +010096 [] T.timeout {
97 setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
98 self.stop;
99 }
100 }
101}
102
103
Harald Weltea5d2ab22017-12-09 14:21:42 +0100104function f_wait_oml(integer bts_nr, charstring status, float secs_max) runs on test_CT {
105 timer T := secs_max;
106 T.start;
107 while (true) {
108 if (f_ctrl_get_bts(IPA_CTRL, bts_nr, "oml-connection-state") == status) {
109 T.stop;
110 return;
111 }
112 f_sleep(0.1);
113 if (not T.running) {
114 setverdict(fail, "Timeout waiting for oml-connection-state ", status);
115 self.stop;
116 }
117 }
118}
119
Harald Welteae026692017-12-09 01:03:01 +0100120function f_sleep(float seconds) {
121 timer T := seconds;
122 T.start;
123 T.timeout;
124}
125
126altstep as_Tguard() runs on test_CT {
127 [] T_guard.timeout { setverdict(fail, "Timeout of T_guard"); }
Harald Welte28d943e2017-11-25 15:00:50 +0100128}
129
130function f_init() runs on test_CT {
131 var integer i;
Harald Welte28d943e2017-11-25 15:00:50 +0100132
Harald Welteae026692017-12-09 01:03:01 +0100133 if (g_initialized) {
134 return;
Harald Welte28d943e2017-11-25 15:00:50 +0100135 }
Harald Welteae026692017-12-09 01:03:01 +0100136 g_initialized := true;
137
138 /* Call a function of our 'parent component' BSSAP_Adapter_CT to start the
139 * MSC-side BSSAP emulation */
140 f_bssap_init("VirtMSC");
Harald Weltea5d2ab22017-12-09 14:21:42 +0100141 f_ipa_ctrl_start(ctrl, mp_bsc_ip, mp_bsc_ctrl_port, 0);
Harald Welte28d943e2017-11-25 15:00:50 +0100142
Harald Welte696ddb62017-12-08 14:01:43 +0100143 for (i := 0; i < NUM_BTS; i := i+1) {
Harald Weltea5d2ab22017-12-09 14:21:42 +0100144 /* wait until osmo-bts-omldummy has respawned */
145 f_wait_oml(i, "degraded", 5.0);
146 /* start RSL connection */
Harald Welte96c94412017-12-09 03:12:45 +0100147 f_ipa_rsl_start(bts[i].rsl, mp_bsc_ip, mp_bsc_rsl_port, i);
Harald Weltea5d2ab22017-12-09 14:21:42 +0100148 /* wait until BSC tells us "connected" */
149 f_wait_oml(i, "connected", 5.0);
Harald Welte696ddb62017-12-08 14:01:43 +0100150 }
Harald Welteae026692017-12-09 01:03:01 +0100151 f_sleep(0.5);
Harald Welte696ddb62017-12-08 14:01:43 +0100152
Harald Welteae026692017-12-09 01:03:01 +0100153 T_guard.start;
154 activate(as_Tguard());
Harald Welte28d943e2017-11-25 15:00:50 +0100155}
156
Harald Welteae026692017-12-09 01:03:01 +0100157function f_exp_ipa_rx(integer bts_nr, template RSL_Message t_rx, float t_secs := 2.0, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
158runs on test_CT return RSL_Message {
159 var ASP_RSL_Unitdata rx_rsl_ud;
160 timer T := t_secs;
161
162 T.start;
163 alt {
164 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(sid, t_rx)) -> value rx_rsl_ud {
165 T.stop;
166 }
167 [] IPA_RSL[bts_nr].receive { repeat; }
168 [] T.timeout { setverdict(fail, "Timeout expecting ", t_rx); }
169 }
170 return rx_rsl_ud.rsl;
171}
172
173function f_ipa_tx(integer bts_nr, template RSL_Message t_tx, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
174runs on test_CT {
175 IPA_RSL[bts_nr].send(ts_ASP_RSL_UD(sid, t_tx));
176}
177
178
179testcase TC_chan_act_noreply() runs on test_CT {
180 var BSSAP_N_UNITDATA_ind ud_ind;
Harald Welte28d943e2017-11-25 15:00:50 +0100181
182 f_init();
Harald Welteae026692017-12-09 01:03:01 +0100183 f_bssap_reset();
Harald Welte28d943e2017-11-25 15:00:50 +0100184
Harald Welteae026692017-12-09 01:03:01 +0100185 IPA_RSL[0].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_CHAN_RQD('23'O, 23)));
186 f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
187 setverdict(pass);
Harald Welte28d943e2017-11-25 15:00:50 +0100188}
189
Harald Welteae026692017-12-09 01:03:01 +0100190/* CHAN RQD -> CHAN ACT -> CHAN ACT ACK -> RF CHAN REL */
191testcase TC_chan_act_ack_noest() runs on test_CT {
192 var RSL_Message rx_rsl;
193
194 f_init();
195 f_bssap_reset();
196
197 /* Send CHAN RQD and wait for allocation; acknowledge it */
198 f_ipa_tx(0, ts_RSL_CHAN_RQD('23'O, 23));
199 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
200 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
201 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23));
202
203 /* expect BSC to disable the channel again if there's no RLL EST IND */
204 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
205
206 setverdict(pass);
207}
208
209/* Test behavior if MSC never answers to CR */
210testcase TC_chan_act_ack_est_ind_noreply() runs on test_CT {
211 var RSL_Message rx_rsl;
212
213 f_init();
214 f_bssap_reset();
215
216 /* Send CHAN RQD and wait for allocation; acknowledge it */
217 f_ipa_tx(0, ts_RSL_CHAN_RQD('23'O, 23));
218 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
219 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
220 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23));
221
222 var octetstring l3 := '00010203040506'O
223 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
224
225 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3)));
226
227 /* expect BSC to disable the channel again if there's no response from MSC */
228 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
229
230 setverdict(pass);
231}
232
233/* Test behavior if MSC answers with CREF to CR */
234testcase TC_chan_act_ack_est_ind_refused() runs on test_CT {
235 var BSSAP_N_CONNECT_ind rx_c_ind;
236 var RSL_Message rx_rsl;
237
238 f_init();
239 f_bssap_reset();
240
241 /* Send CHAN RQD and wait for allocation; acknowledge it */
242 f_ipa_tx(0, ts_RSL_CHAN_RQD('23'O, 23));
243 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
244 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
245 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23));
246
247 var octetstring l3 := '00010203040506'O
248 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
249
250 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
251 BSSAP.send(ts_BSSAP_DISC_req(rx_c_ind.connectionId, 0));
252
253 /* expect BSC to disable the channel */
254 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
255
256 setverdict(pass);
257}
258
Harald Weltea5d2ab22017-12-09 14:21:42 +0100259
260/* BSC specific CTRL helper functions */
261function f_ctrl_get_bts(IPA_CTRL_PT pt, integer bts_nr, charstring suffix) return CtrlValue {
262 return f_ctrl_get(pt, "bts." & int2str(bts_nr) & "." & suffix);
263}
264
265template charstring ts_bts(integer bts_nr) := "bts." & int2str(bts_nr) & ".";
266template charstring ts_bts_trx(integer bts_nr, integer trx_nr ) :=
267 valueof(ts_bts(bts_nr)) & "trx." & int2str(trx_nr) & ".";
268
269function f_ctrl_get_exp_bts(IPA_CTRL_PT pt, integer bts_nr, CtrlVariable suffix, template CtrlValue exp) {
270 f_ctrl_get_exp(pt, valueof(ts_bts(bts_nr)) & suffix, exp);
271}
272
273function f_ctrl_get_exp_trx(IPA_CTRL_PT pt, integer bts_nr, integer trx_nr, CtrlVariable suffix,
274 template CtrlValue exp)
275{
276 f_ctrl_get_exp(pt, valueof(ts_bts_trx(bts_nr, trx_nr)) & suffix, exp);
277}
278
Harald Welte96c94412017-12-09 03:12:45 +0100279testcase TC_ctrl() runs on test_CT {
280
281 f_init();
282 f_bssap_reset();
283
284 f_ctrl_get(IPA_CTRL[0], "bts.0.location-area-code");
285}
286
Harald Welteae026692017-12-09 01:03:01 +0100287
288
Harald Welte28d943e2017-11-25 15:00:50 +0100289control {
Harald Welte96c94412017-12-09 03:12:45 +0100290 execute( TC_ctrl() );
Harald Welteae026692017-12-09 01:03:01 +0100291 execute( TC_chan_act_noreply() );
292 execute( TC_chan_act_ack_noest() );
293 execute( TC_chan_act_ack_est_ind_noreply() );
294 execute( TC_chan_act_ack_est_ind_refused() );
Harald Welte28d943e2017-11-25 15:00:50 +0100295}
296
297}