blob: 9864da1f2fb2d0d6fba1aef807030fe2d62bbd97 [file] [log] [blame]
Harald Welte379d45a2017-08-03 09:55:15 +02001module GGSN_Tests {
2
Harald Welte94ade362017-08-04 00:36:55 +02003 import from General_Types all;
4 import from IPL4asp_PortType all;
5 import from IPL4asp_Types all;
6 import from GTP_CodecPort all;
7 import from GTP_CodecPort_CtrlFunct all;
8 import from GTPC_Types all;
9 import from GTPU_Types all;
10
11 const integer GTP0_PORT := 3386;
12 const integer GTP1C_PORT := 2123;
13 const integer GTP1U_PORT := 2152;
Harald Welte876345e2017-08-04 16:19:59 +020014 const charstring g_bind_ip_c := "127.23.42.1";
15 const charstring g_bind_ip_u := g_bind_ip_c;
Harald Welte94ade362017-08-04 00:36:55 +020016
17 type component GT_CT {
18 port GTPC_PT GTPC;
19 port GTPU_PT GTPU;
20
21 var OCT1 g_restart_ctr := '01'O;
22 /* FIXME: unify with g_bind_ip + parse from config file */
Harald Welte876345e2017-08-04 16:19:59 +020023 var OCT4 g_sgsn_ip_c := '7f172a01'O;
24 var OCT4 g_sgsn_ip_u := '7f172a01'O;
Harald Welte94ade362017-08-04 00:36:55 +020025 /* FIXME: parse remName from config file */
26 var GtpPeer g_peer := { connId := 0, remName := "127.0.0.6", remPort := GTP1C_PORT };
27 timer T_default := 3.0;
28 }
29
30 function f_init() runs on GT_CT {
31 var Result res;
32 map(self:GTPC, system:GTPC);
Harald Welte876345e2017-08-04 16:19:59 +020033 res := GTP_CodecPort_CtrlFunct.f_IPL4_listen(GTPC, g_bind_ip_c, GTP1C_PORT, {udp:={}});
Harald Welte94ade362017-08-04 00:36:55 +020034 log("GTP1C ConnectionID: ", res.connId);
35 g_peer.connId := res.connId;
36
37 map(self:GTPU, system:GTPU);
Harald Welte876345e2017-08-04 16:19:59 +020038 GTP_CodecPort_CtrlFunct.f_GTPU_listen(GTPU, g_bind_ip_u, GTP1U_PORT, {udp:={}});
Harald Welte94ade362017-08-04 00:36:55 +020039 }
40
41 /* generalized GTP-C receive template */
42 template PDU_GTPC tr_GTP1C_PDU(template OCT1 msg_type, template OCT4 teid) := {
43 /* N-PDU Number flag (PN) shall be set to '0'. A GTP-C receiver shall not return an
44 * error if this flag is set to '1'. */
45 pn_bit := '0'B,
46 /* Sequence number flag (S) shall be set to '1'. */
47 s_bit := '1'B,
48 e_bit := ?,
49 spare := ?,
50 /* Protocol Type flag (PT) shall be set to '1'.*/
51 pt := '1'B,
52 /* Version shall be set to decimal 1 ('001'). */
53 version := '001'B,
54 messageType := msg_type,
55 lengthf := ?,
56 teid := teid,
57 opt_part := *,
58 gtpc_pdu := ?
59 }
60
61 /* generalized GTP-C send template */
62 template PDU_GTPC ts_GTP1C_PDU(OCT1 msg_type, OCT4 teid, GTPC_PDUs pdu) := {
63 /* N-PDU Number flag (PN) shall be set to '0'. A GTP-C receiver shall not return an
64 * error if this flag is set to '1'. */
65 pn_bit := '0'B,
66 /* Sequence number flag (S) shall be set to '1'. */
67 s_bit := '1'B,
68 e_bit := '0'B,
69 spare := '0'B,
70 /* Protocol Type flag (PT) shall be set to '1'.*/
71 pt := '1'B,
72 /* Version shall be set to decimal 1 ('001'). */
73 version := '001'B,
74 messageType := msg_type,
75 lengthf := 0, /* we assume encoder overwrites this */
76 teid := teid,
77 opt_part := {
78 sequenceNumber := '9801'O,
79 npduNumber := '00'O,
80 nextExtHeader := '00'O,
81 gTPC_extensionHeader_List := omit
82 },
83 gtpc_pdu := pdu
84 }
85
86 /* recovery IE */
87 template Recovery_gtpc ts_Recovery(OCT1 restart_counter) := {
88 type_gtpc := '00'O, /* we assume encoder fixes this */
89 restartCounter := restart_counter
90 }
91
92 /* template matching reception of GTP-C echo-request */
93 template Gtp1cUnitdata tr_GTPC_MsgType(template GtpPeer peer, template OCT1 msg_type, template OCT4 teid) := {
94 peer := peer,
95 gtpc := tr_GTP1C_PDU(msg_type, teid)
96 }
97
98 /* template matching reception of GTP-C echo-request */
99 template Gtp1cUnitdata tr_GTPC_PING(template GtpPeer peer) := tr_GTPC_MsgType(peer, echoRequest, '00000000'O);
100
101 template GTPC_PDUs ts_EchoRespPDU(OCT1 restart_counter) := {
102 echoResponse := {
103 recovery := {
104 type_gtpc := '00'O, /* we assume encoder fixes? */
105 restartCounter := restart_counter
106 },
107 private_extension_gtpc := omit
108 }
109 }
110
111 /* master template for senidng a GTP-C echo response */
112 template Gtp1cUnitdata ts_GTPC_PONG(GtpPeer peer, OCT1 rest_ctr) := {
113 peer := peer,
114 gtpc := ts_GTP1C_PDU(echoResponse, '00000000'O, valueof(ts_EchoRespPDU(rest_ctr)))
115 }
116
117 template EndUserAddress t_EuaIPv4(template OCT4 ip_addr) := {
118 type_gtpc := '80'O,
119 endUserAddress := {
120 endUserAddressIPv4 := {
121 lengthf := 2,
122 pdp_typeorg := '0001'B,
123 spare := '1111'B,
124 pdp_typenum := '21'O,
125 ipv4_address := ip_addr
126 }
127 }
128 }
129 template EndUserAddress t_EuaIPv4Dyn := t_EuaIPv4(omit);
130 template EndUserAddress t_EuaIPv6(template OCT16 ip_addr) := {
131 type_gtpc := '80'O,
132 endUserAddress := {
133 endUserAddressIPv6 := {
134 lengthf := 2,
135 pdp_typeorg := '0001'B,
136 spare := '1111'B,
137 pdp_typenum := '57'O,
138 ipv6_address := ip_addr
139 }
140 }
141 }
142 template EndUserAddress t_EuaIPv6Dyn := t_EuaIPv6(omit);
143
144 template AccessPointName ts_APN(octetstring apn) := {
145 type_gtpc := '83'O,
146 lengthf := lengthof(apn),
147 apn_value := apn
148 }
149
150 template GSN_Address_GTPC ts_GsnAddr(octetstring ip_addr) := {
151 type_gtpc := '85'O,
152 lengthf := lengthof(ip_addr),
153 addressf := ip_addr
154 }
155
156 template MSISDN ts_Msisdn(octetstring msisdn) := {
157 type_gtpc := '86'O,
158 lengthf := lengthof(msisdn),
159 msisdn := msisdn
160 }
161
162 template QualityOfServiceProfile ts_QosDefault := {
163 type_gtpc := '87'O,
164 lengthf := 4,
165 allocRetensionPrio := '00'O,
166 qos_ProfileValue := {
167 reliabilityClass := '011'B,
168 delayClass := '001'B,
169 spare1 := '00'B,
170 precedenceClass := '010'B,
171 spare2 := '0'B,
172 peakThroughput := '1001'B,
173 meanThroughput := '11111'B,
174 spare3 := '000'B,
175 deliverErroneusSDU := omit,
176 deliveryOrder := omit,
177 trafficClass := omit,
178 maxSDUSize := omit,
179 maxBitrateUplink := omit,
180 maxBitrateDownlink := omit,
181 sduErrorRatio := omit,
182 residualBER := omit,
183 trafficHandlingPriority := omit,
184 transferDelay := omit,
185 guaranteedBitRateUplink := omit,
186 guaranteedBitRateDownlink := omit,
187 sourceStatisticsDescriptor := omit,
188 signallingIndication := omit,
189 spare4 := omit,
190 maxBitrateDownlinkExt := omit,
191 guaranteedBitRateDownlinkExt := omit,
192 maxBitrateUplinkExt := omit,
193 guaranteedBitRateUplinkExt := omit
194 }
195 }
196
197 template IMSI_gtpc ts_Imsi(hexstring digits) := {
198 type_gtpc := '02'O,
199 digits := digits,
200 padding := 'F'H
201 }
202
203 template GTPC_PDUs ts_CreatePdpPDU(hexstring imsi, OCT1 restart_ctr, OCT4 teid_data, OCT4 teid_ctrl,
204 BIT4 nsapi, EndUserAddress eua, octetstring apn,
205 octetstring sgsn_ip_sign, octetstring sgsn_ip_data,
206 octetstring msisdn) := {
207 createPDPContextRequest := {
208 imsi := ts_Imsi(imsi),
209 rai := omit,
210 recovery := ts_Recovery(restart_ctr),
211 selectionMode := {
212 type_gtpc := '0F'O,
213 selectModeValue := '00'B,
214 spare := '111111'B
215 },
216 teidDataI := {
217 type_gtpc := '00'O,
218 teidDataI := teid_data
219 },
220 teidControlPlane := {
221 type_gtpc := '00'O,
222 teidControlPlane := teid_ctrl
223 },
224 nsapi := {
225 type_gtpc := '00'O,
226 nsapi := nsapi,
227 unused := '0000'B
228 },
229 linked_nsapi := omit,
230 charging_char := omit,
231 trace_ref := omit,
232 trace_type := omit,
233 endUserAddress := eua,
234 accessPointName := ts_APN(apn),
235 protConfigOptions := omit,
236 sgsn_addr_signalling := ts_GsnAddr(sgsn_ip_sign),
237 sgsn_addr_traffic := ts_GsnAddr(sgsn_ip_data),
238 msisdn := ts_Msisdn(msisdn),
239 qualityOfServiceProfile := ts_QosDefault,
240 tft := omit,
241 triggerId := omit,
242 omcId := omit,
243 commonFlags := omit,
244 aPN_Restriction := omit,
245 ratType := omit,
246 userLocationInformation := omit,
247 mS_TimeZone := omit,
248 imeisv := omit,
249 camelChargingInformationContainer := omit,
250 additionalTraceInfo := omit,
251 correlationID := omit,
252 evolvedAllocationRetentionPriorityI := omit,
253 extendedCommonFlags := omit,
254 userCSGInformation := omit,
255 aPN_AMBR := omit,
256 signallingPriorityIndication := omit,
257 cN_OperatorSelectionEntity := omit,
258 private_extension_gtpc := omit
259 }
260 }
261
262 template Gtp1cUnitdata ts_GTPC_CreatePDP(GtpPeer peer, hexstring imsi, OCT1 restart_ctr, OCT4 teid_data,
263 OCT4 teid_ctrl, BIT4 nsapi, EndUserAddress eua,
264 octetstring apn, octetstring sgsn_ip_sign,
265 octetstring sgsn_ip_data, octetstring msisdn) := {
266 peer := peer,
267 gtpc := ts_GTP1C_PDU(createPDPContextRequest, '00000000'O,
268 valueof(ts_CreatePdpPDU(imsi, restart_ctr, teid_data, teid_ctrl,
269 nsapi, eua, apn, sgsn_ip_sign,
270 sgsn_ip_data, msisdn)))
271 }
272
Harald Weltef1e0d5a2017-08-05 08:51:22 +0200273 function f_teardown_ind_IE(in template BIT1 ind) return template TearDownInd {
274 if (isvalue(ind)) {
275 return omit;
276 }
277 var TearDownInd ret := {
278 type_gtpc := '13'O,
279 tdInd := valueof(ind),
280 spare:= '0000000'B
281 }
282 return ret;
283 }
284
285 template GTPC_PDUs ts_DeletePdpPDU(BIT4 nsapi, template BIT1 teardown_ind) := {
286 deletePDPContextRequest := {
287 cause := omit,
288 tearDownIndicator := f_teardown_ind_IE(teardown_ind),
289 nsapi := {
290 type_gtpc := '14'O,
291 nsapi := nsapi,
292 unused := '0000'B
293 },
294 protConfigOptions := omit,
295 userLocationInformation := omit,
296 mS_TimeZone := omit,
297 extendedCommonFlags := omit,
298 uLI_Timestamp := omit,
299 private_extension_gtpc := omit
300 }
301 }
302
303 template Gtp1cUnitdata ts_GTPC_DeletePDP(GtpPeer peer, OCT4 teid, BIT4 nsapi,
304 template BIT1 teardown_ind) := {
305 peer := peer,
306 gtpc := ts_GTP1C_PDU(deletePDPContextRequest, teid,
307 valueof(ts_DeletePdpPDU(nsapi, teardown_ind)))
308 }
309
310
Harald Welte3af89482017-08-04 16:20:23 +0200311 /* GTP-U */
312
313 template PDU_GTPU tr_GTP1U_PDU(template OCT1 msg_type, template OCT4 teid) := {
314 pn_bit := ?,
315 s_bit := ?,
316 e_bit := ?,
317 spare := ?,
318 /* Protocol Type flag (PT) shall be set to '1' in GTP */
319 pt := '1'B,
320 /* Version shall be set to decimal 1 ('001'). */
321 version := '001'B,
322 messageType := msg_type,
323 lengthf := ?,
324 teid := teid,
325 opt_part := *,
326 gtpu_IEs := ?
327 }
328
329 /* generalized GTP-U send template */
330 template PDU_GTPU ts_GTP1U_PDU(OCT1 msg_type, OCT4 teid, GTPU_IEs ies,
331 template GTPU_Header_optional_part opt := omit) := {
332 /* N-PDU Number flag (PN): the GTP-U header contains a meaningful N-PDU Number field if the PN
333 * flag is set to 1. */
334 pn_bit := '0'B, /* we assume the encoder overwrites this if an optional part is given */
335 /* If the Sequence Number flag (S) is set to '1' the sequence number field is present and
336 * meaningful otherwise it is set to '0'. For GTP-U messages Echo Request, Echo Response,
337 * Error Indication and Supported Extension Headers Notification, the S flag shall be set to '1'. */
338 s_bit := '0'B, /* we assume the encoder overwrites this if an optional part is given */
339 /* Extension header presence */
340 e_bit := '0'B,
341 spare := '0'B,
342 /* Protocol Type flag (PT) shall be set to '1' in GTP */
343 pt := '1'B,
344 /* Version shall be set to decimal 1 ('001'). */
345 version := '001'B,
346 messageType := msg_type,
347 lengthf := 0, /* we assume encoder overwrites this */
348 teid := teid,
349 opt_part := opt,
350 gtpu_IEs := ies
351 }
352
353 template Gtp1uUnitdata tr_GTPU_MsgType(template GtpPeer peer, template OCT1 msg_type, template OCT4 teid) := {
354 peer := peer,
355 gtpu := tr_GTP1U_PDU(msg_type, teid)
356 }
357
358
359 /* template matching reception of GTP-C echo-request */
360 template Gtp1uUnitdata tr_GTPU_PING(template GtpPeer peer) := tr_GTPU_MsgType(peer, echoRequest, '00000000'O);
361
362 template GTPU_IEs ts_UEchoRespPDU(OCT1 restart_counter) := {
363 echoResponse_IEs := {
364 recovery_gtpu := {
365 type_gtpu := '00'O, /* we assume encoder fixes? */
366 restartCounter := restart_counter
367 },
368 private_extension_gtpu := omit
369 }
370 }
371
372 /* master template for sending a GTP-U echo response */
373 template Gtp1uUnitdata ts_GTPU_PONG(GtpPeer peer, OCT1 rest_ctr) := {
374 peer := peer,
375 gtpu := ts_GTP1U_PDU(echoResponse, '00000000'O, valueof(ts_UEchoRespPDU(rest_ctr)))
376 }
377
378 template PDU_GTPU ts_GTP1U_GPDU(OCT4 teid, octetstring data) :=
379 ts_GTP1U_PDU('FF'O, teid, { g_PDU_IEs := { data := data }});
380
Harald Welte94ade362017-08-04 00:36:55 +0200381 /* Altstep implementing responses to any incoming echo requests */
382 altstep pingpong() runs on GT_CT {
383 var Gtp1cUnitdata ud;
Harald Welte3af89482017-08-04 16:20:23 +0200384 var Gtp1uUnitdata udu;
Harald Welte94ade362017-08-04 00:36:55 +0200385 [] GTPC.receive(tr_GTPC_PING(?)) -> value ud {
386 GTPC.send(ts_GTPC_PONG(ud.peer, '00'O));
387 repeat;
388 };
Harald Welte3af89482017-08-04 16:20:23 +0200389 [] GTPU.receive(tr_GTPU_PING(?)) -> value udu {
390 GTPU.send(ts_GTPU_PONG(udu.peer, '00'O));
391 };
Harald Welte94ade362017-08-04 00:36:55 +0200392 [] T_default.timeout { setverdict(fail); };
393 }
394
395 template octetstring t_ApnInternet := '08696E7465726E6574'O;
396
397 function f_pdp_ctx_act(hexstring imsi, BIT4 nsapi, EndUserAddress eua, octetstring apn, octetstring msisdn) runs on GT_CT {
398 var Gtp1cUnitdata ud;
399 var octetstring teid := '01020304'O;
400 var default d;
401
402 log("sending CreatePDP");
Harald Welte876345e2017-08-04 16:19:59 +0200403 GTPC.send(ts_GTPC_CreatePDP(g_peer, imsi, g_restart_ctr, teid, teid, nsapi, eua, apn, g_sgsn_ip_c, g_sgsn_ip_u, msisdn));
Harald Welte94ade362017-08-04 00:36:55 +0200404 T_default.start;
405
406 d := activate(pingpong());
407 alt {
408 [] GTPC.receive(tr_GTPC_MsgType(g_peer, createPDPContextResponse, teid)) -> value ud {
409 if (ud.gtpc.gtpc_pdu.createPDPContextResponse.cause.causevalue == '80'O) {
410 setverdict(pass);
411 } else {
412 setverdict(fail);
413 }
414 }
415 }
416 deactivate(d);
417 }
418
Harald Weltef1e0d5a2017-08-05 08:51:22 +0200419 function f_pdp_ctx_del(OCT4 teid, BIT4 nsapi, template BIT1 teardown_ind) runs on GT_CT {
420 var Gtp1cUnitdata ud;
421 var default d;
422
423 GTPC.send(ts_GTPC_DeletePDP(g_peer, teid, nsapi, teardown_ind));
424 T_default.start;
425
426 d := activate(pingpong());
427 alt {
428 [] GTPC.receive(tr_GTPC_MsgType(g_peer, deletePDPContextResponse, teid)) -> value ud {
429 if (ud.gtpc.gtpc_pdu.deletePDPContextResponse.cause.causevalue == '80'O) {
430 setverdict(pass);
431 } else {
432 setverdict(fail);
433 }
434 }
435 }
436 deactivate(d);
437 }
438
Harald Welte94ade362017-08-04 00:36:55 +0200439 testcase TC_activate_pdp4() runs on GT_CT {
440 f_init();
441 var hexstring imsi := '262420123456789'H;
442 var octetstring msisdn := '1234'O;
443 f_pdp_ctx_act(imsi, '0010'B, valueof(t_EuaIPv4Dyn), valueof(t_ApnInternet), msisdn);
444 }
445
446 testcase TC_activate_pdp6() runs on GT_CT {
447 f_init();
448 var hexstring imsi := '262420123456789'H;
449 var octetstring msisdn := '1234'O;
450 f_pdp_ctx_act(imsi, '0010'B, valueof(t_EuaIPv6Dyn), valueof(t_ApnInternet), msisdn);
451 }
452
453
454 control {
455 execute(TC_activate_pdp4());
456 execute(TC_activate_pdp6());
457 }
Harald Welte379d45a2017-08-03 09:55:15 +0200458}