blob: 67354591136f775f09b6eca8c45c9ac5674fe738 [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;
15
Harald Welteae026692017-12-09 01:03:01 +010016import from RSL_Tests all;
Harald Welte28d943e2017-11-25 15:00:50 +010017
Harald Welte696ddb62017-12-08 14:01:43 +010018const integer NUM_BTS := 1;
Harald Welteae026692017-12-09 01:03:01 +010019const float T3101_MAX := 12.0;
Harald Welte28d943e2017-11-25 15:00:50 +010020
Harald Welte96c94412017-12-09 03:12:45 +010021type record BTS_State {
22 IPA_Client rsl,
23 IPA_Client ctrl
24}
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 Welte96c94412017-12-09 03:12:45 +010029 port IPA_CTRL_PT IPA_CTRL[NUM_BTS];
Harald Welte28d943e2017-11-25 15:00:50 +010030
31 var boolean g_initialized := false;
Harald Welteae026692017-12-09 01:03:01 +010032 timer T_guard := 30.0;
33
Harald Welte28d943e2017-11-25 15:00:50 +010034}
35
36modulepar {
Harald Welte696ddb62017-12-08 14:01:43 +010037 charstring mp_bsc_ip := "127.0.0.1";
38 integer mp_bsc_rsl_port := 3003;
Harald Welte96c94412017-12-09 03:12:45 +010039 integer mp_bsc_ctrl_port := 4249;
Harald Welte28d943e2017-11-25 15:00:50 +010040}
41
Harald Welteae026692017-12-09 01:03:01 +010042type record IPA_Client {
43 IPA_Emulation_CT vc_IPA,
44 IPA_CCM_Parameters ccm_pars,
45 charstring id
Harald Welte28d943e2017-11-25 15:00:50 +010046}
47
Harald Welteae026692017-12-09 01:03:01 +010048function f_ipa_rsl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i)
Harald Welte28d943e2017-11-25 15:00:50 +010049runs on test_CT {
Harald Welteae026692017-12-09 01:03:01 +010050 timer T := 10.0;
51
Harald Welte96c94412017-12-09 03:12:45 +010052 clnt.id := "IPA" & int2str(i) & "-RSL";
Harald Welteae026692017-12-09 01:03:01 +010053 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
54 clnt.ccm_pars := c_IPA_default_ccm_pars;
55 clnt.ccm_pars.name := "Osmocom TTCN-3 BTS Simulator";
56 clnt.ccm_pars.unit_id := int2str(1234+i) & "/0/0";
57
58 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
59 connect(clnt.vc_IPA:IPA_RSL_PORT, self:IPA_RSL[i]);
60
61 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1, clnt.ccm_pars));
62
63 /* wait for IPA RSL link to connect and send ID ACK */
64 T.start;
65 alt {
66 [] IPA_RSL[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_ID_ACK}) {
67 T.stop;
68 IPA_RSL[i].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_PAGING_LOAD_IND(23)));
69 }
70 [] IPA_RSL[i].receive { repeat }
71 [] T.timeout {
Harald Welte96c94412017-12-09 03:12:45 +010072 setverdict(fail, "Timeout RSL waiting for ASP_IPA_EVENT_ID_ACK");
Harald Welteae026692017-12-09 01:03:01 +010073 self.stop;
74 }
75 }
76}
77
Harald Welte96c94412017-12-09 03:12:45 +010078function f_ipa_ctrl_start(inout IPA_Client clnt, charstring bsc_host, PortNumber bsc_port, integer i)
79runs on test_CT {
80 timer T := 10.0;
81
82 clnt.id := "IPA" & int2str(i) & "-CTRL";
83 clnt.vc_IPA := IPA_Emulation_CT.create(clnt.id & "-IPA");
84
85 map(clnt.vc_IPA:IPA_PORT, system:IPA_CODEC_PT);
86 connect(clnt.vc_IPA:IPA_CTRL_PORT, self:IPA_CTRL[i]);
87
88 clnt.vc_IPA.start(IPA_Emulation.main_client(bsc_host, bsc_port, "", -1));
89
90 /* wait for IPA CTRL link to connect and send UP */
91 T.start;
92 alt {
93 [] IPA_CTRL[i].receive(ASP_IPA_Event:{up_down := ASP_IPA_EVENT_UP}) { }
94 [] T.timeout {
95 setverdict(fail, "Timeout CTRL waiting for ASP_IPA_EVENT_UP");
96 self.stop;
97 }
98 }
99}
100
101
Harald Welteae026692017-12-09 01:03:01 +0100102function f_sleep(float seconds) {
103 timer T := seconds;
104 T.start;
105 T.timeout;
106}
107
108altstep as_Tguard() runs on test_CT {
109 [] T_guard.timeout { setverdict(fail, "Timeout of T_guard"); }
Harald Welte28d943e2017-11-25 15:00:50 +0100110}
111
112function f_init() runs on test_CT {
113 var integer i;
Harald Welte28d943e2017-11-25 15:00:50 +0100114
Harald Welteae026692017-12-09 01:03:01 +0100115 if (g_initialized) {
116 return;
Harald Welte28d943e2017-11-25 15:00:50 +0100117 }
Harald Welteae026692017-12-09 01:03:01 +0100118 g_initialized := true;
119
120 /* Call a function of our 'parent component' BSSAP_Adapter_CT to start the
121 * MSC-side BSSAP emulation */
122 f_bssap_init("VirtMSC");
123
124 f_sleep(5.0);
Harald Welte28d943e2017-11-25 15:00:50 +0100125
Harald Welte696ddb62017-12-08 14:01:43 +0100126 for (i := 0; i < NUM_BTS; i := i+1) {
Harald Welte96c94412017-12-09 03:12:45 +0100127 f_ipa_rsl_start(bts[i].rsl, mp_bsc_ip, mp_bsc_rsl_port, i);
128 f_ipa_ctrl_start(bts[i].ctrl, mp_bsc_ip, mp_bsc_ctrl_port, i);
Harald Welte696ddb62017-12-08 14:01:43 +0100129 }
Harald Welteae026692017-12-09 01:03:01 +0100130 f_sleep(0.5);
Harald Welte696ddb62017-12-08 14:01:43 +0100131
Harald Welteae026692017-12-09 01:03:01 +0100132 T_guard.start;
133 activate(as_Tguard());
Harald Welte28d943e2017-11-25 15:00:50 +0100134}
135
Harald Welteae026692017-12-09 01:03:01 +0100136function f_exp_ipa_rx(integer bts_nr, template RSL_Message t_rx, float t_secs := 2.0, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
137runs on test_CT return RSL_Message {
138 var ASP_RSL_Unitdata rx_rsl_ud;
139 timer T := t_secs;
140
141 T.start;
142 alt {
143 [] IPA_RSL[bts_nr].receive(tr_ASP_RSL_UD(sid, t_rx)) -> value rx_rsl_ud {
144 T.stop;
145 }
146 [] IPA_RSL[bts_nr].receive { repeat; }
147 [] T.timeout { setverdict(fail, "Timeout expecting ", t_rx); }
148 }
149 return rx_rsl_ud.rsl;
150}
151
152function f_ipa_tx(integer bts_nr, template RSL_Message t_tx, IpaStreamId sid := IPAC_PROTO_RSL_TRX0)
153runs on test_CT {
154 IPA_RSL[bts_nr].send(ts_ASP_RSL_UD(sid, t_tx));
155}
156
157
158testcase TC_chan_act_noreply() runs on test_CT {
159 var BSSAP_N_UNITDATA_ind ud_ind;
Harald Welte28d943e2017-11-25 15:00:50 +0100160
161 f_init();
Harald Welteae026692017-12-09 01:03:01 +0100162 f_bssap_reset();
Harald Welte28d943e2017-11-25 15:00:50 +0100163
Harald Welteae026692017-12-09 01:03:01 +0100164 IPA_RSL[0].send(ts_ASP_RSL_UD(IPAC_PROTO_RSL_TRX0,ts_RSL_CHAN_RQD('23'O, 23)));
165 f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
166 setverdict(pass);
Harald Welte28d943e2017-11-25 15:00:50 +0100167}
168
Harald Welteae026692017-12-09 01:03:01 +0100169/* CHAN RQD -> CHAN ACT -> CHAN ACT ACK -> RF CHAN REL */
170testcase TC_chan_act_ack_noest() runs on test_CT {
171 var RSL_Message rx_rsl;
172
173 f_init();
174 f_bssap_reset();
175
176 /* Send CHAN RQD and wait for allocation; acknowledge it */
177 f_ipa_tx(0, ts_RSL_CHAN_RQD('23'O, 23));
178 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
179 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
180 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23));
181
182 /* expect BSC to disable the channel again if there's no RLL EST IND */
183 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
184
185 setverdict(pass);
186}
187
188/* Test behavior if MSC never answers to CR */
189testcase TC_chan_act_ack_est_ind_noreply() runs on test_CT {
190 var RSL_Message rx_rsl;
191
192 f_init();
193 f_bssap_reset();
194
195 /* Send CHAN RQD and wait for allocation; acknowledge it */
196 f_ipa_tx(0, ts_RSL_CHAN_RQD('23'O, 23));
197 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
198 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
199 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23));
200
201 var octetstring l3 := '00010203040506'O
202 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
203
204 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3)));
205
206 /* expect BSC to disable the channel again if there's no response from MSC */
207 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
208
209 setverdict(pass);
210}
211
212/* Test behavior if MSC answers with CREF to CR */
213testcase TC_chan_act_ack_est_ind_refused() runs on test_CT {
214 var BSSAP_N_CONNECT_ind rx_c_ind;
215 var RSL_Message rx_rsl;
216
217 f_init();
218 f_bssap_reset();
219
220 /* Send CHAN RQD and wait for allocation; acknowledge it */
221 f_ipa_tx(0, ts_RSL_CHAN_RQD('23'O, 23));
222 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_CHAN_ACTIV));
223 var RslChannelNr chan_nr := rx_rsl.ies[0].body.chan_nr;
224 f_ipa_tx(0, ts_RSL_CHAN_ACT_ACK(chan_nr, 23));
225
226 var octetstring l3 := '00010203040506'O
227 f_ipa_tx(0, ts_RSL_EST_IND(chan_nr, valueof(ts_RslLinkID_DCCH(0)), l3));
228
229 BSSAP.receive(tr_BSSAP_CONNECT_ind(?, ?, tr_BSSMAP_ComplL3(l3))) -> value rx_c_ind;
230 BSSAP.send(ts_BSSAP_DISC_req(rx_c_ind.connectionId, 0));
231
232 /* expect BSC to disable the channel */
233 rx_rsl := f_exp_ipa_rx(0, tr_RSL_MsgTypeD(RSL_MT_RF_CHAN_REL), T3101_MAX);
234
235 setverdict(pass);
236}
237
Harald Welte96c94412017-12-09 03:12:45 +0100238testcase TC_ctrl() runs on test_CT {
239
240 f_init();
241 f_bssap_reset();
242
243 f_ctrl_get(IPA_CTRL[0], "bts.0.location-area-code");
244}
245
Harald Welteae026692017-12-09 01:03:01 +0100246
247
Harald Welte28d943e2017-11-25 15:00:50 +0100248control {
Harald Welte96c94412017-12-09 03:12:45 +0100249 execute( TC_ctrl() );
Harald Welteae026692017-12-09 01:03:01 +0100250 execute( TC_chan_act_noreply() );
251 execute( TC_chan_act_ack_noest() );
252 execute( TC_chan_act_ack_est_ind_noreply() );
253 execute( TC_chan_act_ack_est_ind_refused() );
Harald Welte28d943e2017-11-25 15:00:50 +0100254}
255
256}