blob: 981c6ba501619528855c3fd222b365cd18d90066 [file] [log] [blame]
Harald Welte34b5a952019-05-27 11:54:11 +02001/* Common L3 helper functions in TTCN-3
2 * (C) 2018 Harald Welte <laforge@gnumonks.org>
3 * contributions by sysmocom - s.f.m.c. GmbH
4 * All rights reserved.
5 *
6 * Released under the terms of GNU General Public License, Version 2 or
7 * (at your option) any later version.
8 *
9 * SPDX-License-Identifier: GPL-2.0-or-later
10 */
11
Harald Welte158a7ca2018-02-16 18:11:31 +010012module L3_Common {
13
14import from Osmocom_Types all;
15import from General_Types all;
Harald Welte5a4fa042018-02-16 20:59:21 +010016import from MobileL3_GMM_SM_Types all;
Harald Welte158a7ca2018-02-16 18:11:31 +010017
18type record AuthVector {
19 OCT16 rand,
20 OCT4 sres,
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020021 OCT8 kc,
22 OCT16 ik,
23 OCT16 ck,
24 OCT16 autn,
Alexander Couzens387f7f32018-09-04 18:10:59 +020025 OCT8 res,
26 /* auts is usally calculated from autn + rand on the MS.
27 * To simplify the test case, auts is generated instead calculated here.
28 */
29 OCT14 auts
Harald Welte158a7ca2018-02-16 18:11:31 +010030}
31
Harald Welte158a7ca2018-02-16 18:11:31 +010032function f_gen_auth_vec_2g() return AuthVector {
33 var AuthVector vec;
Vadim Yanitskiy6b295712020-11-04 11:15:55 +070034 vec.rand := f_rnd_octstring(16);
35 vec.sres := f_rnd_octstring(4);
36 vec.kc := f_rnd_octstring(8);
Harald Welte158a7ca2018-02-16 18:11:31 +010037 return vec;
38}
39
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020040function f_gen_auth_vec_3g() return AuthVector {
41 var AuthVector vec := f_gen_auth_vec_2g();
Vadim Yanitskiy6b295712020-11-04 11:15:55 +070042 vec.ik := f_rnd_octstring(16);
43 vec.ck := f_rnd_octstring(16);
44 vec.autn := f_rnd_octstring(16);
45 vec.res := f_rnd_octstring(8);
46 vec.auts := f_rnd_octstring(14);
Neels Hofmeyr0ecb2e32018-04-30 15:13:55 +020047 return vec;
48}
49
Harald Welte14a0f942018-02-16 20:42:23 +010050/* 3GPP TS 23.003 2.6 */
51type enumerated TlliType {
52 TLLI_LOCAL,
53 TLLI_FOREIGN,
54 TLLI_RANDOM,
55 TLLI_AUXILIARY,
56 TLLI_RESERVED,
57 TLLI_G_RNTI,
58 TLLI_RAND_G_RNTI
59}
60
61/* 3GPP TS 23.003 2.6 */
62function f_gprs_tlli_type(OCT4 tlli) return TlliType {
63 var bitstring tllib := oct2bit(tlli);
64 if (substr(tllib, 0, 2) == '11'B) {
65 return TLLI_LOCAL;
66 } else if (substr(tllib, 0, 2) == '10'B) {
67 return TLLI_FOREIGN;
68 } else if (substr(tllib, 0, 5) == '01111'B) {
69 return TLLI_RANDOM;
70 } else if (substr(tllib, 0, 4) == '0110'B) {
71 return TLLI_RESERVED;
72 } else if (substr(tllib, 0, 3) == '010'B) {
73 return TLLI_RESERVED;
74 } else if (substr(tllib, 0, 4) == '0000'B) {
75 return TLLI_G_RNTI;
76 } else if (substr(tllib, 0, 4) == '0001'B) {
77 return TLLI_RAND_G_RNTI;
78 } else {
79 setverdict(fail, "Unknonw TLLI Type ", tllib);
Daniel Willmanne4ff5372018-07-05 17:35:03 +020080 mtc.stop;
Harald Welte14a0f942018-02-16 20:42:23 +010081 }
82}
83
84function f_gprs_tlli_random() return OCT4 {
85 var OCT4 tlli := f_rnd_octstring(4);
86 return tlli or4b 'c0000000'O;
87}
88
Harald Welte5a4fa042018-02-16 20:59:21 +010089function f_RAI(HEX0_3n mcc, HEX0_3n mnc, OCT2 lac, OCT1 rac) return RoutingAreaIdentificationV {
90 if (lengthof(mnc) == 2) {
91 mnc := mnc & 'F'H;
92 }
93 var RoutingAreaIdentificationV ret := {
94 mccDigit1 := mcc[0],
95 mccDigit2 := mcc[1],
96 mccDigit3 := mcc[2],
97 mncDigit3 := mnc[2],
98 mncDigit1 := mnc[0],
99 mncDigit2 := mnc[1],
100 lac := lac,
101 rac := rac
102 }
103 return ret;
104}
Harald Welte158a7ca2018-02-16 18:11:31 +0100105
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100106function f_RAI_to_plmn_hexstr(RoutingAreaIdentificationV rai) return hexstring {
107 var hexstring plmn :=
108 rai.mccDigit1
109 & rai.mccDigit2
110 & rai.mccDigit3
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200111 & rai.mncDigit3
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100112 & rai.mncDigit1
Alexander Couzensc7dddbd2019-04-11 19:18:35 +0200113 & rai.mncDigit2;
Neels Hofmeyr8df7d152018-03-14 19:03:28 +0100114 return plmn;
115}
Harald Welte158a7ca2018-02-16 18:11:31 +0100116
117}