blob: 974765e96848cafdaa2c1a91b0d8fc1e0338a575 [file] [log] [blame]
Harald Welte023b61b2020-09-12 20:41:05 +02001module FR_Tests {
2
3import from General_Types all;
4import from Osmocom_Types all;
5import from Osmocom_Gb_Types all;
6
7import from NS_Emulation all;
8import from BSSGP_Emulation all;
Harald Welte27119672021-02-04 14:39:54 +01009import from LLC_Types all;
Harald Welted6de9842020-11-12 21:50:10 +010010import from LLC_Templates all;
Harald Welte023b61b2020-09-12 20:41:05 +020011
12modulepar {
Harald Weltef1f23bf2021-02-03 18:08:29 +010013 /* number of BVCs to bring up in one Gb instance */
Harald Weltede6f3ee2020-11-11 19:01:46 +010014 integer mp_num_bvc := 10;
Harald Weltef1f23bf2021-02-03 18:08:29 +010015 /* number of UEs to start in each PTP BVC */
Harald Welted6de9842020-11-12 21:50:10 +010016 integer mp_num_ue_in_bvc := 10;
Harald Weltef1f23bf2021-02-03 18:08:29 +010017 /* NS configurations; one per NSE; each with any number of NSVC */
Harald Welte023b61b2020-09-12 20:41:05 +020018 NSConfigurations mp_nsconfig := {
19 {
Harald Welte023b61b2020-09-12 20:41:05 +020020 nsei := 123,
21 role_sgsn := false,
Harald Welte90f19742020-11-06 19:34:40 +010022 handle_sns := false,
23 nsvc := {
24 {
25 provider := {
26 fr := {
27 netdev := "hdlc1",
Harald Weltebfff7172021-02-04 10:46:55 +010028 dlci := 1
Harald Welte90f19742020-11-06 19:34:40 +010029 }
30 },
Harald Weltebfff7172021-02-04 10:46:55 +010031 nsvci := 101
32 }, {
33 provider := {
34 fr := {
35 netdev := "hdlc2",
36 dlci := 2
37 }
38 },
39 nsvci := 102
40 }, {
41 provider := {
42 fr := {
43 netdev := "hdlc3",
44 dlci := 3
45 }
46 },
47 nsvci := 103
48 }, {
49 provider := {
50 fr := {
51 netdev := "hdlc4",
52 dlci := 4
53 }
54 },
55 nsvci := 104
Harald Welte90f19742020-11-06 19:34:40 +010056 }
57 }
Harald Welte023b61b2020-09-12 20:41:05 +020058 }
59 };
60}
61
62type record GbInstance {
63 NS_CT vc_NS,
64 BSSGP_CT vc_BSSGP,
65 BssgpConfig cfg
66};
67
Harald Weltede6f3ee2020-11-11 19:01:46 +010068type record of GbInstance GbInstances;
69type record of NSConfiguration NSConfigurations;
70type record of BssgpCellId BssgpCellIds;
Harald Welte023b61b2020-09-12 20:41:05 +020071
72
73type component test_CT {
74 var GbInstances g_gb;
Harald Welted6de9842020-11-12 21:50:10 +010075 port BSSGP_CT_PROC_PT BSSGP_PROC[16];
Harald Welte023b61b2020-09-12 20:41:05 +020076};
77
Harald Weltef1f23bf2021-02-03 18:08:29 +010078/* initialize one Gb interface */
Harald Welte023b61b2020-09-12 20:41:05 +020079private function f_init_gb(inout GbInstance gb, charstring id, integer offset) runs on test_CT {
80 var charstring id_idx := id & int2str(offset);
81 gb.vc_NS := NS_CT.create(id_idx & "-NSemu");
82 gb.vc_BSSGP := BSSGP_CT.create(id_idx & "-BSSGPemu");
83 connect(gb.vc_BSSGP:BSCP, gb.vc_NS:NS_SP);
84 gb.vc_NS.start(NSStart(mp_nsconfig[offset], id_idx));
Harald Welted6de9842020-11-12 21:50:10 +010085 connect(self:BSSGP_PROC[offset], gb.vc_BSSGP:PROC);
Harald Welte023b61b2020-09-12 20:41:05 +020086 gb.vc_BSSGP.start(BssgpStart(gb.cfg, testcasename()));
87}
88
Harald Weltef1f23bf2021-02-03 18:08:29 +010089/* generate a BVC dynamically, using distinct number ranges for BVCI, CID, LAC, ... */
90private function f_gen_bvc(integer base, integer idx) return BssgpBvcConfig {
Harald Weltede6f3ee2020-11-11 19:01:46 +010091 var BssgpBvcConfig bvc := {
92 bvci := base + 100 + idx,
93 cell_id := {
94 ra_id := {
95 lai := {
96 mcc_mnc := '262F42'H,
97 lac := base + 300 + idx
Harald Welte023b61b2020-09-12 20:41:05 +020098 },
Harald Weltede6f3ee2020-11-11 19:01:46 +010099 rac := 1
100 },
101 cell_id := base + 600 + idx
102 },
Harald Welte4d112c92020-11-12 19:48:31 +0100103 depth := BSSGP_DECODE_DEPTH_LLC,
104 create_cb := refers(BSSGP_Emulation.DefaultCreateCallback)
Harald Welte023b61b2020-09-12 20:41:05 +0200105 };
Harald Weltede6f3ee2020-11-11 19:01:46 +0100106 return bvc;
107}
108
Harald Welted6de9842020-11-12 21:50:10 +0100109/***********************************************************************
110 * UE simulation component
111 ***********************************************************************/
112
113type component UE_CT extends BSSGP_Client_CT {
114 var UE_Pars g_pars;
115 timer g_Tguard;
116 var LLC_Entities llc;
117}
Harald Welte056858a2021-01-28 18:44:53 +0100118type record of UE_CT ro_ue;
Harald Welted6de9842020-11-12 21:50:10 +0100119
120type record UE_Pars {
121 hexstring imsi,
Harald Welte681949b2021-01-28 18:49:42 +0100122 OCT4 tlli,
Harald Welte85257642021-02-04 13:19:58 +0100123 float tguard,
124 BssgpBvci bvci,
125 BssgpCellId cell_id
Harald Welted6de9842020-11-12 21:50:10 +0100126};
127
128type function void_fn(charstring id) runs on UE_CT;
129
Harald Welte681949b2021-01-28 18:49:42 +0100130private altstep as_ue_tguard() runs on UE_CT {
131[] g_Tguard.timeout {
132 setverdict(fail, "Tguard timeout after ", g_pars.tguard);
133 self.stop;
134 }
135}
136
Harald Weltef1f23bf2021-02-03 18:08:29 +0100137/* first function executed in UE_CT; creates LLC context, registers with BSSGP, starts Tguard */
Harald Welted6de9842020-11-12 21:50:10 +0100138function f_handler_init(void_fn fn, charstring id, UE_Pars pars) runs on UE_CT {
139 g_pars := pars;
140 llc := f_llc_create(false);
141 f_bssgp_client_register(g_pars.imsi, g_pars.tlli);
Harald Welte681949b2021-01-28 18:49:42 +0100142 g_Tguard.start(g_pars.tguard);
143 activate(as_ue_tguard());
Harald Welted6de9842020-11-12 21:50:10 +0100144
Harald Welte02cdc7c2021-02-03 17:46:38 +0100145 log(id, " Waiting for BVC-UNBLOCK");
146 timer T := 15.0;
147 T.start;
Harald Welted6de9842020-11-12 21:50:10 +0100148 alt {
149 [] BSSGP[0].receive(BssgpStatusIndication:{*,?,BVC_S_UNBLOCKED}) { }
150 [] BSSGP[0].receive { repeat; }
Harald Welte02cdc7c2021-02-03 17:46:38 +0100151 [] T.timeout {
152 setverdict(fail, id, " Timeout waiting for BVC-UNBLOCK");
153 self.stop;
154 }
Harald Welted6de9842020-11-12 21:50:10 +0100155 }
156
Harald Welte02cdc7c2021-02-03 17:46:38 +0100157 log (id, " Entering main loop");
Harald Weltef1f23bf2021-02-03 18:08:29 +0100158 fn.apply(id);
Harald Welte02cdc7c2021-02-03 17:46:38 +0100159 log (id, "Leaving main loop");
Harald Weltef1f23bf2021-02-03 18:08:29 +0100160 f_bssgp_client_unregister(g_pars.imsi);
Harald Welted6de9842020-11-12 21:50:10 +0100161}
162
Harald Weltef1f23bf2021-02-03 18:08:29 +0100163/* start a single UE component; connect it to BSSGP */
Harald Welte85257642021-02-04 13:19:58 +0100164function f_start_ue(void_fn fn, charstring id, BssgpBvcConfig bvc, integer imsi_suffix, BSSGP_BVC_CT bvc_comp, float t_guard := 40.0)
Harald Welte056858a2021-01-28 18:44:53 +0100165runs on test_CT return UE_CT
Harald Welted6de9842020-11-12 21:50:10 +0100166{
167 var UE_CT ue_comp;
168 var UE_Pars ue_pars := {
169 imsi := f_gen_imsi(imsi_suffix),
Harald Welte681949b2021-01-28 18:49:42 +0100170 tlli := f_gprs_tlli_random(),
Harald Welte85257642021-02-04 13:19:58 +0100171 tguard := t_guard,
172 bvci := bvc.bvci,
173 cell_id := bvc.cell_id
Harald Welted6de9842020-11-12 21:50:10 +0100174 };
175
176 ue_comp := UE_CT.create(id);
177 connect(ue_comp:BSSGP[0], bvc_comp:BSSGP_SP);
178 connect(ue_comp:BSSGP_SIG[0], bvc_comp:BSSGP_SP_SIG);
179 connect(ue_comp:BSSGP_PROC[0], bvc_comp:BSSGP_PROC);
180 ue_comp.start(f_handler_init(fn, id, ue_pars));
Harald Welte056858a2021-01-28 18:44:53 +0100181
182 return ue_comp;
Harald Welted6de9842020-11-12 21:50:10 +0100183}
184
Harald Weltede6f3ee2020-11-11 19:01:46 +0100185
Harald Weltef1f23bf2021-02-03 18:08:29 +0100186/* main test case body function; start Gb instances, start UE_CTs on top; wait for termination */
187private function f_tc_body(void_fn ue_fn, integer ue_per_bvc := mp_num_ue_in_bvc,
188 float delay_between_ue := 0.005, float ue_tguard := 40.0) runs on test_CT {
Harald Welte056858a2021-01-28 18:44:53 +0100189 var ro_ue ues := {};
Harald Weltede6f3ee2020-11-11 19:01:46 +0100190
191 for (var integer i := 0; i < lengthof(mp_nsconfig); i := i+1) {
192 g_gb[i].cfg := {
193 nsei := mp_nsconfig[i].nsei,
194 sgsn_role := false,
195 bvc := { }
196 };
197 /* create 'mp_num_bvc' number of BVCs */
198 for (var integer j := 0; j < mp_num_bvc; j := j+1) {
199 g_gb[i].cfg.bvc := g_gb[i].cfg.bvc & { f_gen_bvc(i * 1000, j) };
200 }
Harald Welted6de9842020-11-12 21:50:10 +0100201 log("Initializing Gb interface ", i, ": NSEI=", g_gb[i].cfg.nsei);
Harald Weltede6f3ee2020-11-11 19:01:46 +0100202 f_init_gb(g_gb[i], "gb", i);
203 }
Harald Welte056858a2021-01-28 18:44:53 +0100204
Harald Welted6de9842020-11-12 21:50:10 +0100205 for (var integer i := 0; i < lengthof(mp_nsconfig); i := i+1) {
206 for (var integer j := 0; j < mp_num_bvc; j := j+1) {
207 var BSSGP_BVC_CT bvc_comp := f_bssgp_get_bvci_ct(g_gb[i].cfg.bvc[j].bvci, BSSGP_PROC[i]);
Harald Weltef1f23bf2021-02-03 18:08:29 +0100208 for (var integer k := 0; k < ue_per_bvc; k := k+1) {
Harald Welted6de9842020-11-12 21:50:10 +0100209 var charstring id := "gb" & int2str(i) & "-bvc" & int2str(g_gb[i].cfg.bvc[j].bvci) & "-UEsim" & int2str(k);
Harald Welte056858a2021-01-28 18:44:53 +0100210 var UE_CT ue;
Harald Welte85257642021-02-04 13:19:58 +0100211 ue := f_start_ue(ue_fn, id, g_gb[i].cfg.bvc[j], i*10000+j*100+k, bvc_comp,
Harald Weltef1f23bf2021-02-03 18:08:29 +0100212ue_tguard);
Harald Welte056858a2021-01-28 18:44:53 +0100213 ues := ues & { ue };
Harald Welted6de9842020-11-12 21:50:10 +0100214 /* a bit of staggering to ensure the timers above don't run all at the same time */
Harald Weltef1f23bf2021-02-03 18:08:29 +0100215 f_sleep(delay_between_ue);
Harald Welte5e787882021-02-03 17:44:13 +0100216 /* FIXME: as the BSSGP emulation is already running, we must not
217 * take too long to start the UE components. If we do, the
218 * BVC_S_UNBLOCKED notification will arrive before the components
219 * all are running, meaning we never get that one :( */
Harald Welted6de9842020-11-12 21:50:10 +0100220 }
221 }
222 }
Harald Welte056858a2021-01-28 18:44:53 +0100223
224 /* wait for all UE components to terminate */
225 for (var integer i := 0; i < lengthof(ues); i := i + 1) {
226 ues[i].done;
Harald Welte023b61b2020-09-12 20:41:05 +0200227 }
Harald Welte056858a2021-01-28 18:44:53 +0100228 setverdict(pass);
Harald Welte023b61b2020-09-12 20:41:05 +0200229}
230
Harald Weltef1f23bf2021-02-03 18:08:29 +0100231private function f_ul_ud(charstring id) runs on UE_CT
232{
233 for (var integer num_pkts := 0; num_pkts < 50; num_pkts := num_pkts + 1) {
234 var integer ran_index := 0;
235 //BSSGP[ran_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.bssgp_cell_id[ran_index], llc_enc));
236 BSSGP[ran_index].send(ts_LLC_UI(f_rnd_octstring(512), '0000'B, '1'B, 0))
237 f_sleep(0.5);
238 /* 512 bytes + 32 bytes HDR every 0.5s (1088/s) means about 8704/s per UE */
239 /* at 100 UE that ends up about 870 kBps */
240 }
241}
242/* Generate uplink-unitdata traffic */
243testcase TC_ul_ud() runs on test_CT
244{
245 f_tc_body(refers(f_ul_ud));
246}
247
248
Harald Welte106ba342021-02-03 18:15:19 +0100249/* test bring-up of all BVCs */
250private function f_pass(charstring id) runs on UE_CT
251{
252 setverdict(pass);
253}
254testcase TC_bvc_bringup() runs on test_CT
255{
256 f_tc_body(refers(f_pass), ue_per_bvc := 1, ue_tguard := 20.0);
257}
258
259
Harald Welte27119672021-02-04 14:39:54 +0100260private function f_ul2dl_ud(charstring id) runs on UE_CT
261{
262 for (var integer num_pkts := 0; num_pkts < 50; num_pkts := num_pkts + 1) {
263 var integer ran_index := 0;
264 var template (value) PDU_LLC llc_tx;
265 var template (present) PDU_LLC llc_rx_exp;
266 var PDU_LLC llc_rx;
267 timer T := 5.0;
268
269 /* SAPI '0010'B is looped back by FRNET_Tests.ttcn */
270 llc_tx := ts_LLC_UI(f_rnd_octstring(512), '0010'B, '1'B, 0);
271 llc_rx_exp := llc_tx;
272 llc_rx_exp.pDU_LLC_UI.fCS := ?;
273
274 //BSSGP[ran_index].send(ts_BSSGP_UL_UD(g_pars.tlli, g_pars.cell_id, llc_enc));
275 BSSGP[ran_index].send(llc_tx);
276 T.start;
277 alt {
278 [] BSSGP[ran_index].receive(llc_rx_exp) -> value llc_rx { }
279 [] BSSGP[ran_index].receive(PDU_LLC:?) -> value llc_rx {
280 setverdict(fail, "Unexpected LLC: ", llc_rx);
281 break;
282 }
283 [] T.timeout {
284 setverdict(fail, "Timeout waiting for ", llc_rx_exp);
285 break;
286 }
287 }
288 //f_sleep(0.1);
289 /* 512 bytes + 32 bytes HDR every 0.5s (1088/s) means about 8704/s per UE */
290 /* at 100 UE that ends up about 870 kBps */
291 }
292}
293/* Generate uplink-unitdata traffic */
294testcase TC_ul2dl_ud() runs on test_CT
295{
296 f_tc_body(refers(f_ul2dl_ud), ue_tguard := 100.0);
297}
298
299
Harald Welte023b61b2020-09-12 20:41:05 +0200300control {
Harald Welte106ba342021-02-03 18:15:19 +0100301 execute( TC_bvc_bringup() );
Harald Weltef1f23bf2021-02-03 18:08:29 +0100302 execute( TC_ul_ud() );
Harald Welte27119672021-02-04 14:39:54 +0100303 execute( TC_ul2dl_ud() );
Harald Welte023b61b2020-09-12 20:41:05 +0200304}
305
306}