blob: 46169ea4601e9f05984bd099737ded9ae886b77b [file] [log] [blame]
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001/*
2 * (C) 2012 by Holger Hans Peter Freyther
3 * All Rights Reserved
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
9 *
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
14 *
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 */
20
21#include <osmocom/gsm/gsm0808.h>
Philipp Maier22401432017-03-24 17:59:26 +010022#include <osmocom/gsm/gsm0808_utils.h>
23#include <osmocom/gsm/protocol/gsm_08_08.h>
Philipp Maier3d48ec02017-03-29 17:37:55 +020024#include <osmocom/gsm/protocol/gsm_08_58.h>
Max969fb2e2018-12-10 11:01:10 +010025#include <osmocom/core/logging.h>
26#include <osmocom/core/application.h>
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +010027
28#include <stdio.h>
29#include <stdlib.h>
Philipp Maier22401432017-03-24 17:59:26 +010030#include <sys/socket.h>
31#include <netinet/in.h>
32#include <arpa/inet.h>
Neels Hofmeyr74663d92018-03-23 01:46:42 +010033#include <errno.h>
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +010034
Philipp Maier4f4905f2018-11-30 13:36:12 +010035#define EXPECT_ENCODED(hexstr) do { \
36 const char *enc_str = msgb_hexdump(msg); \
37 printf("%s: encoded: %s(rc = %u)\n", __func__, enc_str, rc_enc); \
38 OSMO_ASSERT(strcmp(enc_str, hexstr " ") == 0); \
39 OSMO_ASSERT(rc_enc == msg->len); \
40 } while(0)
41
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +010042#define VERIFY(msg, data, len) \
43 if (msgb_l3len(msg) != len) { \
44 printf("%s:%d Length don't match: %d vs. %d. %s\n", \
Holger Hans Peter Freytherfdb46672015-11-09 16:32:43 +000045 __func__, __LINE__, msgb_l3len(msg), (int) len, \
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +010046 osmo_hexdump(msg->l3h, msgb_l3len(msg))); \
47 abort(); \
48 } else if (memcmp(msg->l3h, data, len) != 0) { \
49 printf("%s:%d didn't match: got: %s\n", \
50 __func__, __LINE__, \
51 osmo_hexdump(msg->l3h, msgb_l3len(msg))); \
52 abort(); \
53 }
54
Philipp Maierfa896ab2017-03-27 16:55:32 +020055/* Setup a fake codec list for testing */
56static void setup_codec_list(struct gsm0808_speech_codec_list *scl)
57{
58 memset(scl, 0, sizeof(*scl));
59
60 scl->codec[0].pi = true;
61 scl->codec[0].tf = true;
Philipp Maierbb839662017-06-01 17:11:19 +020062 scl->codec[0].type = GSM0808_SCT_FR3;
Philipp Maierfa896ab2017-03-27 16:55:32 +020063 scl->codec[0].cfg = 0xcdef;
64
65 scl->codec[1].fi = true;
66 scl->codec[1].pt = true;
Philipp Maierbb839662017-06-01 17:11:19 +020067 scl->codec[1].type = GSM0808_SCT_FR2;
Philipp Maierfa896ab2017-03-27 16:55:32 +020068
69 scl->codec[2].fi = true;
70 scl->codec[2].tf = true;
Philipp Maierbb839662017-06-01 17:11:19 +020071 scl->codec[2].type = GSM0808_SCT_CSD;
72 scl->codec[2].cfg = 0xc0;
Philipp Maierfa896ab2017-03-27 16:55:32 +020073
74 scl->len = 3;
75}
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +010076
Philipp Maier4f4905f2018-11-30 13:36:12 +010077void test_gsm0808_enc_cause(void)
78{
79 /* NOTE: This must be tested early because many of the following tests
80 * rely on the generation of a proper cause code. */
81
82 uint8_t rc_enc;
83 struct msgb *msg;
84
85 /* Test with a single byte cause code */
86 msg = msgb_alloc(1024, "output buffer");
87 rc_enc = gsm0808_enc_cause(msg, 0x41);
88 EXPECT_ENCODED("04 01 41");
89 msgb_free(msg);
90
91 /* Test with an extended (two byte) cause code */
92 msg = msgb_alloc(1024, "output buffer");
93 rc_enc = gsm0808_enc_cause(msg, 0x8041);
94 EXPECT_ENCODED("04 02 80 41");
95 msgb_free(msg);
96}
97
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +010098static void test_create_layer3(void)
99{
100 static const uint8_t res[] = {
101 0x00, 0x0e, 0x57, 0x05, 0x08, 0x00, 0x77, 0x62,
102 0x83, 0x33, 0x66, 0x44, 0x88, 0x17, 0x01, 0x23 };
103 struct msgb *msg, *in_msg;
Neels Hofmeyr178bf7a2018-04-20 12:23:45 +0200104 struct osmo_cell_global_id cgi = {
105 .lai = {
106 .plmn = {
107 .mcc = 0x2244,
108 .mnc = 0x1122,
109 },
110 .lac = 0x3366,
111 },
112 .cell_identity = 0x4488,
113 };
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100114 printf("Testing creating Layer3\n");
115
116 in_msg = msgb_alloc_headroom(512, 128, "foo");
117 in_msg->l3h = in_msg->data;
118 msgb_v_put(in_msg, 0x23);
119
Neels Hofmeyr178bf7a2018-04-20 12:23:45 +0200120 msg = gsm0808_create_layer3_2(in_msg, &cgi, NULL);
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100121 VERIFY(msg, res, ARRAY_SIZE(res));
122 msgb_free(msg);
123 msgb_free(in_msg);
124}
125
Philipp Maierfa896ab2017-03-27 16:55:32 +0200126static void test_create_layer3_aoip()
127{
128 static const uint8_t res[] = {
129 0x00, 0x17, 0x57, 0x05, 0x08, 0x00, 0x77, 0x62,
130 0x83, 0x33, 0x66, 0x44, 0x88, 0x17, 0x01, 0x23,
Philipp Maierbb839662017-06-01 17:11:19 +0200131 GSM0808_IE_SPEECH_CODEC_LIST, 0x07, GSM0808_SCT_FR3 | 0x50,
Philipp Maier7e27b142018-03-22 17:26:46 +0100132 0xef, 0xcd, GSM0808_SCT_FR2 | 0xa0, 0x9f,
Philipp Maierbb839662017-06-01 17:11:19 +0200133 GSM0808_SCT_CSD | 0x90, 0xc0
Philipp Maierfa896ab2017-03-27 16:55:32 +0200134 };
Maxfa3b4822018-11-05 14:59:54 +0100135 struct osmo_cell_global_id cgi = {
136 .lai = {
137 .plmn = {
138 .mcc = 0x2244,
139 .mnc = 0x1122,
140 },
141 .lac = 0x3366,
142 },
143 .cell_identity = 0x4488,
144 };
Philipp Maierfa896ab2017-03-27 16:55:32 +0200145 struct msgb *msg, *in_msg;
146 struct gsm0808_speech_codec_list sc_list;
147 printf("Testing creating Layer3 (AoIP)\n");
148
149 setup_codec_list(&sc_list);
150
151 in_msg = msgb_alloc_headroom(512, 128, "foo");
152 in_msg->l3h = in_msg->data;
153 msgb_v_put(in_msg, 0x23);
154
Maxfa3b4822018-11-05 14:59:54 +0100155 msg = gsm0808_create_layer3_2(in_msg, &cgi, &sc_list);
156
Philipp Maierfa896ab2017-03-27 16:55:32 +0200157 VERIFY(msg, res, ARRAY_SIZE(res));
158
159 msgb_free(msg);
160 msgb_free(in_msg);
161}
162
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100163static void test_create_reset()
164{
165 static const uint8_t res[] = { 0x00, 0x04, 0x30, 0x04, 0x01, 0x20 };
166 struct msgb *msg;
167
168 printf("Testing creating Reset\n");
169 msg = gsm0808_create_reset();
170 VERIFY(msg, res, ARRAY_SIZE(res));
171 msgb_free(msg);
172}
173
Philipp Maier15596e22017-04-05 17:55:27 +0200174static void test_create_reset_ack()
175{
176 static const uint8_t res[] = { 0x00, 0x01, 0x31 };
177 struct msgb *msg;
178
179 printf("Testing creating Reset Ack\n");
180 msg = gsm0808_create_reset_ack();
181 VERIFY(msg, res, ARRAY_SIZE(res));
182 msgb_free(msg);
183}
184
185
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100186static void test_create_clear_command()
187{
188 static const uint8_t res[] = { 0x20, 0x04, 0x01, 0x23 };
189 struct msgb *msg;
190
191 printf("Testing creating Clear Command\n");
192 msg = gsm0808_create_clear_command(0x23);
193 VERIFY(msg, res, ARRAY_SIZE(res));
194 msgb_free(msg);
195}
196
197static void test_create_clear_complete()
198{
199 static const uint8_t res[] = { 0x00, 0x01, 0x21 };
200 struct msgb *msg;
201
202 printf("Testing creating Clear Complete\n");
203 msg = gsm0808_create_clear_complete();
204 VERIFY(msg, res, ARRAY_SIZE(res));
205 msgb_free(msg);
206}
207
Philipp Maierb478dd32017-03-29 15:50:05 +0200208static void test_create_cipher()
209{
210 static const uint8_t res[] =
211 { 0x00, 0x0c, 0x53, 0x0a, 0x09, 0x03, 0xaa,
212 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x23, 0x42 };
213 static const uint8_t res2[] =
214 { 0x00, 0x0e, 0x53, 0x0a, 0x09, 0x03, 0xaa,
215 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x23, 0x42,
216 GSM0808_IE_CIPHER_RESPONSE_MODE, 0x01 };
217 struct msgb *msg;
218 struct gsm0808_encrypt_info ei;
219 uint8_t include_imeisv;
220
221 memset(&ei, 0, sizeof(ei));
222 ei.perm_algo[0] = GSM0808_ALG_ID_A5_0;
223 ei.perm_algo[1] = GSM0808_ALG_ID_A5_1;
224 ei.perm_algo_len = 2;
225 ei.key[0] = 0xaa;
226 ei.key[1] = 0xbb;
227 ei.key[2] = 0xcc;
228 ei.key[3] = 0xdd;
229 ei.key[4] = 0xee;
230 ei.key[5] = 0xff;
231 ei.key[6] = 0x23;
232 ei.key[7] = 0x42;
233 ei.key_len = 8;
234 include_imeisv = 1;
235
236 printf("Testing creating Chipher Mode Command\n");
237 msg = gsm0808_create_cipher(&ei, NULL);
238 OSMO_ASSERT(msg);
239 VERIFY(msg, res, ARRAY_SIZE(res));
240 msgb_free(msg);
241
242 msg = gsm0808_create_cipher(&ei, &include_imeisv);
243 OSMO_ASSERT(msg);
244 VERIFY(msg, res2, ARRAY_SIZE(res2));
245 msgb_free(msg);
246}
247
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100248static void test_create_cipher_complete()
249{
250 static const uint8_t res1[] = {
251 0x00, 0x08, 0x55, 0x20, 0x03, 0x23, 0x42, 0x21, 0x2c, 0x04 };
252 static const uint8_t res2[] = { 0x00, 0x03, 0x55, 0x2c, 0x04};
253 struct msgb *l3, *msg;
254
255 printf("Testing creating Cipher Complete\n");
256 l3 = msgb_alloc_headroom(512, 128, "l3h");
257 l3->l3h = l3->data;
258 msgb_v_put(l3, 0x23);
259 msgb_v_put(l3, 0x42);
260 msgb_v_put(l3, 0x21);
261
262 /* with l3 data */
263 msg = gsm0808_create_cipher_complete(l3, 4);
264 VERIFY(msg, res1, ARRAY_SIZE(res1));
265 msgb_free(msg);
266
267 /* with l3 data but short */
268 l3->len -= 1;
269 l3->tail -= 1;
270 msg = gsm0808_create_cipher_complete(l3, 4);
271 VERIFY(msg, res2, ARRAY_SIZE(res2));
272 msgb_free(msg);
273
274 /* without l3 data */
275 msg = gsm0808_create_cipher_complete(NULL, 4);
276 VERIFY(msg, res2, ARRAY_SIZE(res2));
277 msgb_free(msg);
278
279
280 msgb_free(l3);
281}
282
Maxed651d22018-11-07 15:25:05 +0100283static inline void parse_cipher_reject(struct msgb *msg, uint8_t exp)
284{
285 struct tlv_parsed tp;
286 int rc;
287
288 /* skip header and message type so we can parse Cause IE directly */
289 msg->l2h = msgb_data(msg) + sizeof(struct bssmap_header) + 1;
290
291 rc = osmo_bssap_tlv_parse(&tp, msg->l2h, msgb_l2len(msg));
292 if (rc < 0)
293 printf("FIXME: failed (%d) to parse created message %s\n", rc, msgb_hexdump(msg));
294
295 rc = gsm0808_get_cipher_reject_cause(&tp);
296 if (rc < 0)
297 printf("FIXME: failed (%s) to extract Cause from created message %s\n",
298 strerror(-rc), msgb_hexdump(msg));
299
300 if (exp != (enum gsm0808_cause)rc)
301 printf("FIXME: wrong Cause %d != %u (" OSMO_BIN_SPEC ") extracted from created message %s\n",
302 rc, exp, OSMO_BIT_PRINT(exp), msgb_hexdump(msg));
303}
304
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100305static void test_create_cipher_reject()
306{
Harald Welte62e40852017-12-17 20:50:34 +0100307 static const uint8_t res[] = { 0x00, 0x04, 0x59, 0x04, 0x01, 0x23 };
Maxed651d22018-11-07 15:25:05 +0100308 enum gsm0808_cause cause = GSM0808_CAUSE_CCCH_OVERLOAD;
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100309 struct msgb *msg;
310
311 printf("Testing creating Cipher Reject\n");
Maxed651d22018-11-07 15:25:05 +0100312 msg = gsm0808_create_cipher_reject(cause);
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100313 VERIFY(msg, res, ARRAY_SIZE(res));
Maxed651d22018-11-07 15:25:05 +0100314
315 parse_cipher_reject(msg, cause);
316
317 msgb_free(msg);
318}
319
320static void test_create_cipher_reject_ext()
321{
322 static const uint8_t res[] = { 0x00, 0x05, 0x59, 0x04, 0x02, 0xd0, 0xFA };
323 uint8_t cause = 0xFA;
324 struct msgb *msg;
325
326 printf("Testing creating Cipher Reject (extended)\n");
327 msg = gsm0808_create_cipher_reject_ext(GSM0808_CAUSE_CLASS_INVAL, cause);
328 VERIFY(msg, res, ARRAY_SIZE(res));
329
330 parse_cipher_reject(msg, cause);
331
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100332 msgb_free(msg);
333}
334
335static void test_create_cm_u()
336{
Harald Welte07b625d2012-01-23 10:02:58 +0100337 static const uint8_t res[] = {
338 0x00, 0x07, 0x54, 0x12, 0x01, 0x23, 0x13, 0x01, 0x42 };
339 static const uint8_t res2o[] = {
340 0x00, 0x04, 0x54, 0x12, 0x01, 0x23 };
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100341 struct msgb *msg;
Harald Welte07b625d2012-01-23 10:02:58 +0100342 const uint8_t cm2 = 0x23;
343 const uint8_t cm3 = 0x42;
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100344
345 printf("Testing creating CM U\n");
Harald Welte07b625d2012-01-23 10:02:58 +0100346 msg = gsm0808_create_classmark_update(&cm2, 1, &cm3, 1);
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100347 VERIFY(msg, res, ARRAY_SIZE(res));
Harald Welte07b625d2012-01-23 10:02:58 +0100348
Neels Hofmeyr9a938ae2017-11-16 17:34:07 +0100349 msgb_free(msg);
350
Harald Welte07b625d2012-01-23 10:02:58 +0100351 msg = gsm0808_create_classmark_update(&cm2, 1, NULL, 0);
352 VERIFY(msg, res2o, ARRAY_SIZE(res2o));
353
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100354 msgb_free(msg);
355}
356
357static void test_create_sapi_reject()
358{
359 static const uint8_t res[] = { 0x00, 0x03, 0x25, 0x03, 0x25 };
360 struct msgb *msg;
361
362 printf("Testing creating SAPI Reject\n");
363 msg = gsm0808_create_sapi_reject(3);
364 VERIFY(msg, res, ARRAY_SIZE(res));
365 msgb_free(msg);
366}
367
Philipp Maierc6144a22017-03-29 17:53:43 +0200368static void test_create_ass()
369{
370 static const uint8_t res1[] =
371 { 0x00, 0x0a, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
372 0x04 };
373 static const uint8_t res2[] =
374 { 0x00, 0x20, 0x01, 0x0b, 0x04, 0x01, 0x0b, 0xa1, 0x25, 0x01, 0x00,
375 0x04, GSM0808_IE_AOIP_TRASP_ADDR, 0x06, 0xc0, 0xa8, 0x64, 0x17,
Philipp Maierbb839662017-06-01 17:11:19 +0200376 0x04, 0xd2, GSM0808_IE_SPEECH_CODEC_LIST, 0x07,
Philipp Maier7e27b142018-03-22 17:26:46 +0100377 GSM0808_SCT_FR3 | 0x50, 0xef, 0xcd, GSM0808_SCT_FR2 | 0xa0, 0x9f,
Philipp Maierbb839662017-06-01 17:11:19 +0200378 GSM0808_SCT_CSD | 0x90, 0xc0, GSM0808_IE_CALL_ID, 0xaa, 0xbb,
379 0xcc, 0xdd };
Philipp Maierc6144a22017-03-29 17:53:43 +0200380
381 struct msgb *msg;
382 struct gsm0808_channel_type ct;
383 uint16_t cic = 0004;
384 struct sockaddr_storage ss;
385 struct sockaddr_in sin;
386 struct gsm0808_speech_codec_list sc_list;
387 uint32_t call_id = 0xAABBCCDD;
388
389 memset(&ct, 0, sizeof(ct));
390 ct.ch_indctr = GSM0808_CHAN_SPEECH;
391 ct.ch_rate_type = GSM0808_SPEECH_HALF_PREF;
392 ct.perm_spch[0] = GSM0808_PERM_FR3;
393 ct.perm_spch[1] = GSM0808_PERM_HR3;
394 ct.perm_spch_len = 2;
395
396 memset(&sin, 0, sizeof(sin));
397 sin.sin_family = AF_INET;
398 sin.sin_port = htons(1234);
399 inet_aton("192.168.100.23", &sin.sin_addr);
400
401 memset(&ss, 0, sizeof(ss));
402 memcpy(&ss, &sin, sizeof(sin));
403
404 setup_codec_list(&sc_list);
405
406 printf("Testing creating Assignment Request\n");
407 msg = gsm0808_create_ass(&ct, &cic, NULL, NULL, NULL);
408 OSMO_ASSERT(msg);
409 VERIFY(msg, res1, ARRAY_SIZE(res1));
410 msgb_free(msg);
411
412 msg = gsm0808_create_ass(&ct, &cic, &ss, &sc_list, &call_id);
413 OSMO_ASSERT(msg);
414 VERIFY(msg, res2, ARRAY_SIZE(res2));
415 msgb_free(msg);
416}
417
Max52074322018-11-30 10:44:07 +0100418static void test_create_ass2()
419{
420 static const uint8_t res[] = {
421 BSSAP_MSG_BSS_MANAGEMENT,
422 0x45,
423 BSS_MAP_MSG_ASSIGMENT_RQST,
424 GSM0808_IE_CHANNEL_TYPE,
425 0x04, 0x01, 0x0b, 0x91, 0x15, 0x01, 0x00, 0x04,
426 GSM0808_IE_AOIP_TRASP_ADDR,
427 0x06,
428 0xac, 0x0c, 0x65, 0x0d, /* IPv4 */
429 0x02, 0x9a,
430 GSM0808_IE_SPEECH_CODEC_LIST,
431 0x07,
432 GSM0808_SCT_FR3 | 0x50,
433 0xef, 0xcd,
434 GSM0808_SCT_FR2 | 0xa0,
435 0x9f,
436 GSM0808_SCT_CSD | 0x90,
437 0xc0,
438 GSM0808_IE_CALL_ID,
439 0xde, 0xad, 0xfa, 0xce, /* CallID */
440 0x83, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, 0x45, /* Kc */
441 GSM0808_IE_GLOBAL_CALL_REF, 0x0d, /* GCR, length */
442 0x03, 0x44, 0x44, 0x44, /* GCR, Net ID */
443 0x02, 0xfe, 0xed, /* GCR, Node ID */
444 0x05, 0x41, 0x41, 0x41, 0x41, 0x41, /* GCR, Call ref. ID */
445 GSM0808_IE_LCLS_CONFIG, GSM0808_LCLS_CFG_BOTH_WAY,
446 GSM0808_IE_LCLS_CONN_STATUS_CTRL, GSM0808_LCLS_CSC_CONNECT,
447 GSM0808_IE_LCLS_CORR_NOT_NEEDED,
448 };
449 struct msgb *msg;
450 struct gsm0808_channel_type ct;
451 uint16_t cic = 4;
452 struct sockaddr_storage ss;
453 struct sockaddr_in sin;
454 struct gsm0808_speech_codec_list sc_list;
455 uint32_t call_id = 0xDEADFACE;
456 struct osmo_gcr_parsed gcr = { .net_len = 3, .node = 0xFEED };
457 uint8_t Kc[16];
458 struct osmo_lcls lcls = {
459 .config = GSM0808_LCLS_CFG_BOTH_WAY,
460 .control = GSM0808_LCLS_CSC_CONNECT,
461 .gcr = &gcr,
462 .corr_needed = false
463 };
464
465 memset(gcr.cr, 'A', 5);
466 memset(gcr.net, 'D', gcr.net_len);
467 memset(Kc, 'E', 16);
468
469 memset(&ct, 0, sizeof(ct));
470 ct.ch_indctr = GSM0808_CHAN_SPEECH;
471 ct.ch_rate_type = GSM0808_SPEECH_HALF_PREF;
472 ct.perm_spch[0] = GSM0808_PERM_FR2;
473 ct.perm_spch[1] = GSM0808_PERM_HR2;
474 ct.perm_spch_len = 2;
475
476 memset(&sin, 0, sizeof(sin));
477 sin.sin_family = AF_INET;
478 sin.sin_port = htons(666);
479 inet_aton("172.12.101.13", &sin.sin_addr); /* IPv4 */
480
481 memset(&ss, 0, sizeof(ss));
482 memcpy(&ss, &sin, sizeof(sin));
483
484 setup_codec_list(&sc_list);
485
486 printf("Testing creating Assignment Request with Kc and LCLS\n");
487
488 msg = gsm0808_create_ass2(&ct, &cic, &ss, &sc_list, &call_id, Kc, &lcls);
489 if (!msgb_eq_l3_data_print(msg, res, ARRAY_SIZE(res)))
490 abort();
491
492 msgb_free(msg);
493}
494
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100495static void test_create_ass_compl()
496{
497 static const uint8_t res1[] = {
498 0x00, 0x09, 0x02, 0x15, 0x23, 0x21, 0x42, 0x2c,
499 0x11, 0x40, 0x22 };
500 static const uint8_t res2[] = {
501 0x00, 0x07, 0x02, 0x15, 0x23, 0x21, 0x42, 0x2c, 0x11};
502 struct msgb *msg;
503
504 printf("Testing creating Assignment Complete\n");
505 msg = gsm0808_create_assignment_completed(0x23, 0x42, 0x11, 0x22);
506 VERIFY(msg, res1, ARRAY_SIZE(res1));
507 msgb_free(msg);
508
509 msg = gsm0808_create_assignment_completed(0x23, 0x42, 0x11, 0);
510 VERIFY(msg, res2, ARRAY_SIZE(res2));
511 msgb_free(msg);
512}
513
Philipp Maierfa896ab2017-03-27 16:55:32 +0200514static void test_create_ass_compl_aoip()
515{
516 struct sockaddr_storage ss;
517 struct sockaddr_in sin;
518 struct gsm0808_speech_codec sc;
519 struct gsm0808_speech_codec_list sc_list;
520 static const uint8_t res[] =
521 { 0x00, 0x1d, 0x02, 0x15, 0x23, 0x21, 0x42, 0x2c, 0x11, 0x40, 0x22,
522 GSM0808_IE_AOIP_TRASP_ADDR, 0x06, 0xc0, 0xa8, 0x64, 0x17, 0x04,
Philipp Maierbb839662017-06-01 17:11:19 +0200523 0xd2, GSM0808_IE_SPEECH_CODEC, 0x01, GSM0808_SCT_HR1 | 0x90,
Philipp Maier7e27b142018-03-22 17:26:46 +0100524 GSM0808_IE_SPEECH_CODEC_LIST, 0x07, GSM0808_SCT_FR3 | 0x50, 0xef,
525 0xcd, GSM0808_SCT_FR2 | 0xa0, 0x9f, GSM0808_SCT_CSD | 0x90, 0xc0 };
Philipp Maierfa896ab2017-03-27 16:55:32 +0200526 struct msgb *msg;
527
528 memset(&sin, 0, sizeof(sin));
529 sin.sin_family = AF_INET;
530 sin.sin_port = htons(1234);
531 inet_aton("192.168.100.23", &sin.sin_addr);
532
533 memset(&ss, 0, sizeof(ss));
534 memcpy(&ss, &sin, sizeof(sin));
535
536 memset(&sc, 0, sizeof(sc));
537 sc.fi = true;
538 sc.tf = true;
Philipp Maierbb839662017-06-01 17:11:19 +0200539 sc.type = GSM0808_SCT_HR1;
Philipp Maierfa896ab2017-03-27 16:55:32 +0200540
541 setup_codec_list(&sc_list);
542
543 printf("Testing creating Assignment Complete (AoIP)\n");
544 msg = gsm0808_create_ass_compl(0x23, 0x42, 0x11, 0x22,
545 &ss, &sc, &sc_list);
546 VERIFY(msg, res, ARRAY_SIZE(res));
547 msgb_free(msg);
548}
549
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100550static void test_create_ass_fail()
551{
552 static const uint8_t res1[] = { 0x00, 0x04, 0x03, 0x04, 0x01, 0x23 };
553 static const uint8_t res2[] = {
554 0x00, 0x06, 0x03, 0x04, 0x01, 0x23, 0x15, 0x02};
555 uint8_t rr_res = 2;
556 struct msgb *msg;
557
558 printf("Testing creating Assignment Failure\n");
559 msg = gsm0808_create_assignment_failure(0x23, NULL);
560 VERIFY(msg, res1, ARRAY_SIZE(res1));
561 msgb_free(msg);
562
563 msg = gsm0808_create_assignment_failure(0x23, &rr_res);
564 VERIFY(msg, res2, ARRAY_SIZE(res2));
565 msgb_free(msg);
566}
567
Philipp Maierfa896ab2017-03-27 16:55:32 +0200568static void test_create_ass_fail_aoip()
569{
570 static const uint8_t res1[] =
571 { 0x00, 0x0d, 0x03, 0x04, 0x01, 0x23, GSM0808_IE_SPEECH_CODEC_LIST,
Philipp Maier7e27b142018-03-22 17:26:46 +0100572 0x07, GSM0808_SCT_FR3 | 0x50, 0xef, 0xcd, GSM0808_SCT_FR2 | 0xa0,
Philipp Maierbb839662017-06-01 17:11:19 +0200573 0x9f, GSM0808_SCT_CSD | 0x90, 0xc0 };
Philipp Maierfa896ab2017-03-27 16:55:32 +0200574 static const uint8_t res2[] =
575 { 0x00, 0x0f, 0x03, 0x04, 0x01, 0x23, 0x15, 0x02,
Philipp Maier7e27b142018-03-22 17:26:46 +0100576 GSM0808_IE_SPEECH_CODEC_LIST, 0x07, GSM0808_SCT_FR3 | 0x50, 0xef,
577 0xcd, GSM0808_SCT_FR2 | 0xa0, 0x9f, GSM0808_SCT_CSD | 0x90, 0xc0 };
Philipp Maierfa896ab2017-03-27 16:55:32 +0200578 uint8_t rr_res = 2;
579 struct msgb *msg;
580 struct gsm0808_speech_codec_list sc_list;
581
582 setup_codec_list(&sc_list);
583
584 printf("Testing creating Assignment Failure (AoIP)\n");
585 msg = gsm0808_create_ass_fail(0x23, NULL, &sc_list);
586 VERIFY(msg, res1, ARRAY_SIZE(res1));
587 msgb_free(msg);
588
589 msg = gsm0808_create_ass_fail(0x23, &rr_res, &sc_list);
590 VERIFY(msg, res2, ARRAY_SIZE(res2));
591 msgb_free(msg);
592}
593
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100594static void test_create_clear_rqst()
595{
596 static const uint8_t res[] = { 0x00, 0x04, 0x22, 0x04, 0x01, 0x23 };
597 struct msgb *msg;
598
599 printf("Testing creating Clear Request\n");
600 msg = gsm0808_create_clear_rqst(0x23);
601 VERIFY(msg, res, ARRAY_SIZE(res));
602 msgb_free(msg);
603}
604
Philipp Maier3d48ec02017-03-29 17:37:55 +0200605static void test_create_paging()
606{
607 static const uint8_t res[] =
608 { 0x00, 0x10, 0x52, 0x08, 0x08, 0x09, 0x10, 0x10, 0x00, 0x00, 0x00,
609 0x21, 0x43, 0x1a, 0x03, 0x05, 0x23, 0x42 };
610 static const uint8_t res2[] =
611 { 0x00, 0x16, 0x52, 0x08, 0x08, 0x09, 0x10, 0x10, 0x00, 0x00, 0x00,
612 0x21, 0x43, GSM0808_IE_TMSI, 0x04, 0x12, 0x34, 0x56, 0x78, 0x1a,
613 0x03, 0x05, 0x23, 0x42 };
614 static const uint8_t res3[] =
615 { 0x00, 0x18, 0x52, 0x08, 0x08, 0x09, 0x10, 0x10, 0x00, 0x00, 0x00,
616 0x21, 0x43, GSM0808_IE_TMSI, 0x04, 0x12, 0x34, 0x56, 0x78, 0x1a,
617 0x03, 0x05, 0x23, 0x42, GSM0808_IE_CHANNEL_NEEDED,
618 RSL_CHANNEED_TCH_ForH };
619
620 struct msgb *msg;
Stefan Sperling11a4d9d2018-02-15 18:28:04 +0100621 struct gsm0808_cell_id_list2 cil;
Philipp Maier3d48ec02017-03-29 17:37:55 +0200622 uint32_t tmsi = 0x12345678;
623 uint8_t chan_needed = RSL_CHANNEED_TCH_ForH;
624
625 char imsi[] = "001010000001234";
626
627 cil.id_discr = CELL_IDENT_LAC;
Stefan Sperling11a4d9d2018-02-15 18:28:04 +0100628 cil.id_list[0].lac = 0x2342;
Philipp Maier3d48ec02017-03-29 17:37:55 +0200629 cil.id_list_len = 1;
630
631 printf("Testing creating Paging Request\n");
Stefan Sperling11a4d9d2018-02-15 18:28:04 +0100632 msg = gsm0808_create_paging2(imsi, NULL, &cil, NULL);
Philipp Maier3d48ec02017-03-29 17:37:55 +0200633 VERIFY(msg, res, ARRAY_SIZE(res));
634 msgb_free(msg);
635
Stefan Sperling11a4d9d2018-02-15 18:28:04 +0100636 msg = gsm0808_create_paging2(imsi, &tmsi, &cil, NULL);
Philipp Maier3d48ec02017-03-29 17:37:55 +0200637 VERIFY(msg, res2, ARRAY_SIZE(res2));
638 msgb_free(msg);
639
Stefan Sperling11a4d9d2018-02-15 18:28:04 +0100640 msg = gsm0808_create_paging2(imsi, &tmsi, &cil, &chan_needed);
Philipp Maier3d48ec02017-03-29 17:37:55 +0200641 VERIFY(msg, res3, ARRAY_SIZE(res3));
642 msgb_free(msg);
643}
644
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +0100645static void test_create_dtap()
646{
647 static const uint8_t res[] = { 0x01, 0x03, 0x02, 0x23, 0x42 };
648 struct msgb *msg, *l3;
649
650 printf("Testing creating DTAP\n");
651 l3 = msgb_alloc_headroom(512, 128, "test");
652 l3->l3h = l3->data;
653 msgb_v_put(l3, 0x23);
654 msgb_v_put(l3, 0x42);
655
656 msg = gsm0808_create_dtap(l3, 0x3);
657 VERIFY(msg, res, ARRAY_SIZE(res));
658 msgb_free(msg);
659 msgb_free(l3);
660}
661
662static void test_prepend_dtap()
663{
664 static const uint8_t res[] = { 0x01, 0x03, 0x02, 0x23, 0x42 };
665 struct msgb *in_msg;
666
667 printf("Testing prepend DTAP\n");
668
669 in_msg = msgb_alloc_headroom(512, 128, "test");
670 msgb_v_put(in_msg, 0x23);
671 msgb_v_put(in_msg, 0x42);
672
673 gsm0808_prepend_dtap_header(in_msg, 0x3);
674 in_msg->l3h = in_msg->data;
675 VERIFY(in_msg, res, ARRAY_SIZE(res));
676 msgb_free(in_msg);
677}
678
Max969fb2e2018-12-10 11:01:10 +0100679static void test_enc_dec_gcr()
680{
681 static const uint8_t res[] = {
682 GSM0808_IE_GLOBAL_CALL_REF,
683 0x0d, /* GCR length */
684 0x03, /* .net_len */
685 0xf1, 0xf2, 0xf3, /* .net */
686 0x02, /* .node length */
687 0xde, 0xad, /* .node */
688 0x05, /* length of Call. Ref. */
689 0x41, 0x42, 0x43, 0x44, 0x45 /* .cr - Call. Ref. */
690 };
691 uint8_t len;
692 struct msgb *msg;
693 struct osmo_gcr_parsed p = { 0 }, g = {
694 .net_len = 3,
695 .net = { 0xf1, 0xf2, 0xf3 },
696 .node = 0xDEAD,
697 .cr = { 0x41, 0x42, 0x43, 0x44, 0x45 },
698 };
699 int rc;
700 struct tlv_parsed tp;
701 msg = msgb_alloc_headroom(BSSMAP_MSG_SIZE, BSSMAP_MSG_HEADROOM, "global call reference");
702 if (!msg)
703 return;
704
705 len = gsm0808_enc_gcr(msg, &g);
706 printf("Testing Global Call Reference IE encoder...\n\t%d bytes added: %s\n",
707 len, len == ARRAY_SIZE(res) ? "OK" : "FAIL");
708
709 if (!msgb_eq_data_print(msg, res, ARRAY_SIZE(res)))
710 abort();
711
712 rc = osmo_bssap_tlv_parse(&tp, msgb_data(msg), msgb_length(msg));
713 if (rc < 0) {
714 printf("parsing failed: %s [%s]\n", strerror(-rc), msgb_hexdump(msg));
715 abort();
716 }
717
718 rc = gsm0808_dec_gcr(&p, &tp);
719 if (rc < 0) {
720 printf("decoding failed: %s [%s]\n", strerror(-rc), msgb_hexdump(msg));
721 abort();
722 }
723
724 if (p.net_len != g.net_len) {
725 printf("Network ID length parsed wrong: %u != %u\n", p.net_len, g.net_len);
726 abort();
727 }
728
729 if (p.node != g.node) {
730 printf("Node ID parsed wrong: 0x%X != 0x%X\n", p.node, g.node);
731 abort();
732 }
733
734 if (memcmp(p.net, g.net, g.net_len) != 0) {
735 printf("Network ID parsed wrong: %s\n", osmo_hexdump(p.net, p.net_len));
736 abort();
737 }
738
739 if (memcmp(p.cr, g.cr, 5) != 0) {
740 printf("Call ref. ID parsed wrong: %s\n", osmo_hexdump(p.cr, 5));
741 abort();
742 }
743
744 printf("\tdecoded %d bytes: %s\n", rc, rc == len ? "OK" : "FAIL");
745 msgb_free(msg);
746}
747
Philipp Maier22401432017-03-24 17:59:26 +0100748static void test_enc_dec_aoip_trasp_addr_v4()
749{
750 struct sockaddr_storage enc_addr;
751 struct sockaddr_storage dec_addr;
752 struct sockaddr_in enc_addr_in;
753 struct msgb *msg;
754 uint8_t rc_enc;
755 int rc_dec;
756
757 memset(&enc_addr_in, 0, sizeof(enc_addr_in));
758 enc_addr_in.sin_family = AF_INET;
759 enc_addr_in.sin_port = htons(1234);
760 inet_aton("255.0.255.255", &enc_addr_in.sin_addr);
761
762 memset(&enc_addr, 0, sizeof(enc_addr));
763 memcpy(&enc_addr, &enc_addr_in, sizeof(enc_addr_in));
764
765 msg = msgb_alloc(1024, "output buffer");
766 rc_enc = gsm0808_enc_aoip_trasp_addr(msg, &enc_addr);
767 OSMO_ASSERT(rc_enc == 8);
768 rc_dec =
769 gsm0808_dec_aoip_trasp_addr(&dec_addr, msg->data + 2, msg->len - 2);
770 OSMO_ASSERT(rc_dec == 6);
771 OSMO_ASSERT(memcmp(&enc_addr, &dec_addr, sizeof(enc_addr)) == 0);
772
773 msgb_free(msg);
774}
775
776static void test_enc_dec_aoip_trasp_addr_v6()
777{
778 struct sockaddr_storage enc_addr;
779 struct sockaddr_storage dec_addr;
780 struct sockaddr_in6 enc_addr_in;
781 struct msgb *msg;
782 uint8_t rc_enc;
783 int rc_dec;
784
785 memset(&enc_addr_in, 0, sizeof(enc_addr_in));
786 enc_addr_in.sin6_family = AF_INET6;
787 enc_addr_in.sin6_port = htons(4567);
788 inet_pton(AF_INET6, "2001:0db8:85a3:08d3:1319:8a2e:0370:7344",
789 &enc_addr_in.sin6_addr);
790
791 memset(&enc_addr, 0, sizeof(enc_addr));
792 memcpy(&enc_addr, &enc_addr_in, sizeof(enc_addr_in));
793
794 msg = msgb_alloc(1024, "output buffer");
795 rc_enc = gsm0808_enc_aoip_trasp_addr(msg, &enc_addr);
796 OSMO_ASSERT(rc_enc == 20);
797 rc_dec =
798 gsm0808_dec_aoip_trasp_addr(&dec_addr, msg->data + 2, msg->len - 2);
799 OSMO_ASSERT(rc_dec == 18);
800 OSMO_ASSERT(memcmp(&enc_addr, &dec_addr, sizeof(enc_addr)) == 0);
801
802 msgb_free(msg);
803}
804
Philipp Maier6f725d62017-03-24 18:03:17 +0100805static void test_gsm0808_enc_dec_speech_codec()
806{
Neels Hofmeyr9a4286b2018-04-20 12:27:52 +0200807 struct gsm0808_speech_codec enc_sc = {
808 .pi = true,
809 .tf = true,
810 .type = GSM0808_SCT_FR2,
811 };
812 struct gsm0808_speech_codec dec_sc = {};
Philipp Maier6f725d62017-03-24 18:03:17 +0100813 struct msgb *msg;
814 uint8_t rc_enc;
815 int rc_dec;
816
Philipp Maier6f725d62017-03-24 18:03:17 +0100817 msg = msgb_alloc(1024, "output buffer");
818 rc_enc = gsm0808_enc_speech_codec(msg, &enc_sc);
819 OSMO_ASSERT(rc_enc == 3);
820
821 rc_dec = gsm0808_dec_speech_codec(&dec_sc, msg->data + 2, msg->len - 2);
822 OSMO_ASSERT(rc_dec == 1);
823
824 OSMO_ASSERT(memcmp(&enc_sc, &dec_sc, sizeof(enc_sc)) == 0);
825
826 msgb_free(msg);
827}
828
829
Philipp Maierbb839662017-06-01 17:11:19 +0200830static void test_gsm0808_enc_dec_speech_codec_with_cfg()
831{
Neels Hofmeyrc62c9342018-04-15 23:31:47 +0200832 struct gsm0808_speech_codec enc_sc = {
833 .pi = true,
834 .tf = true,
835 .type = GSM0808_SCT_FR3,
836 .cfg = 0xabcd,
837 };
838 struct gsm0808_speech_codec dec_sc = {};
Philipp Maierbb839662017-06-01 17:11:19 +0200839 struct msgb *msg;
840 uint8_t rc_enc;
841 int rc_dec;
842
Philipp Maierbb839662017-06-01 17:11:19 +0200843 msg = msgb_alloc(1024, "output buffer");
844 rc_enc = gsm0808_enc_speech_codec(msg, &enc_sc);
845 OSMO_ASSERT(rc_enc == 5);
846
847 rc_dec = gsm0808_dec_speech_codec(&dec_sc, msg->data + 2, msg->len - 2);
848 OSMO_ASSERT(rc_dec == 3);
849
850 OSMO_ASSERT(memcmp(&enc_sc, &dec_sc, sizeof(enc_sc)) == 0);
851
852 msgb_free(msg);
853}
854
Philipp Maier6f725d62017-03-24 18:03:17 +0100855static void test_gsm0808_enc_dec_speech_codec_ext_with_cfg()
856{
Neels Hofmeyr9a4286b2018-04-20 12:27:52 +0200857 struct gsm0808_speech_codec enc_sc = {
858 .pi = true,
859 .tf = true,
860 .type = GSM0808_SCT_CSD,
861 .cfg = 0xc0,
862 };
863 struct gsm0808_speech_codec dec_sc = {};
Philipp Maier6f725d62017-03-24 18:03:17 +0100864 struct msgb *msg;
865 uint8_t rc_enc;
866 int rc_dec;
867
Philipp Maier6f725d62017-03-24 18:03:17 +0100868 msg = msgb_alloc(1024, "output buffer");
869 rc_enc = gsm0808_enc_speech_codec(msg, &enc_sc);
Philipp Maierbb839662017-06-01 17:11:19 +0200870 OSMO_ASSERT(rc_enc == 5);
Philipp Maier6f725d62017-03-24 18:03:17 +0100871
872 rc_dec = gsm0808_dec_speech_codec(&dec_sc, msg->data + 2, msg->len - 2);
Philipp Maierbb839662017-06-01 17:11:19 +0200873 OSMO_ASSERT(rc_dec == 3);
Philipp Maier6f725d62017-03-24 18:03:17 +0100874
875 OSMO_ASSERT(memcmp(&enc_sc, &dec_sc, sizeof(enc_sc)) == 0);
876
877 msgb_free(msg);
878}
879
880static void test_gsm0808_enc_dec_speech_codec_list()
881{
Neels Hofmeyr9a4286b2018-04-20 12:27:52 +0200882 struct gsm0808_speech_codec_list enc_scl = {
883 .codec = {
884 {
885 .pi = true,
886 .tf = true,
887 .type = GSM0808_SCT_FR3,
888 .cfg = 0xcdef,
889 },
890
891 {
892 .fi = true,
893 .pt = true,
894 .type = GSM0808_SCT_FR2,
895 },
896
897 {
898 .fi = true,
899 .tf = true,
900 .type = GSM0808_SCT_CSD,
901 .cfg = 0xc0,
902 },
903 },
904 .len = 3,
905 };
906 struct gsm0808_speech_codec_list dec_scl = {};
Philipp Maier6f725d62017-03-24 18:03:17 +0100907 struct msgb *msg;
908 uint8_t rc_enc;
909 int rc_dec;
910
Philipp Maier6f725d62017-03-24 18:03:17 +0100911 msg = msgb_alloc(1024, "output buffer");
912 rc_enc = gsm0808_enc_speech_codec_list(msg, &enc_scl);
913 OSMO_ASSERT(rc_enc == 9);
914
915 rc_dec = gsm0808_dec_speech_codec_list(&dec_scl, msg->data + 2, msg->len - 2);
916 OSMO_ASSERT(rc_dec == 7);
917
918 OSMO_ASSERT(memcmp(&enc_scl, &dec_scl, sizeof(enc_scl)) == 0);
919
920 msgb_free(msg);
921}
922
Philipp Maierf6c369f2018-10-16 15:24:47 +0200923static void test_gsm0808_enc_dec_empty_speech_codec_list()
924{
925 struct gsm0808_speech_codec_list enc_scl = {
926 .len = 0,
927 };
928 struct gsm0808_speech_codec_list dec_scl = {};
929 struct msgb *msg;
930 uint8_t rc_enc;
931 int rc_dec;
932
933 msg = msgb_alloc(1024, "output buffer");
934 rc_enc = gsm0808_enc_speech_codec_list(msg, &enc_scl);
935 OSMO_ASSERT(rc_enc == 2);
936
937 rc_dec = gsm0808_dec_speech_codec_list(&dec_scl, msg->data + 2, msg->len - 2);
938 OSMO_ASSERT(rc_dec == 0);
939
940 OSMO_ASSERT(memcmp(&enc_scl, &dec_scl, sizeof(enc_scl)) == 0);
941
942 msgb_free(msg);
943}
944
Philipp Maiere0c65302017-03-28 17:05:40 +0200945static void test_gsm0808_enc_dec_channel_type()
946{
Neels Hofmeyr9a4286b2018-04-20 12:27:52 +0200947 struct gsm0808_channel_type enc_ct = {
948 .ch_indctr = GSM0808_CHAN_SPEECH,
949 .ch_rate_type = GSM0808_SPEECH_HALF_PREF,
950 .perm_spch = { GSM0808_PERM_FR3, GSM0808_PERM_HR3 },
951 .perm_spch_len = 2,
952 };
953 struct gsm0808_channel_type dec_ct = {};
Philipp Maiere0c65302017-03-28 17:05:40 +0200954 struct msgb *msg;
955 uint8_t ct_enc_expected[] = { GSM0808_IE_CHANNEL_TYPE,
956 0x04, 0x01, 0x0b, 0xa1, 0x25
957 };
958 uint8_t rc_enc;
959 int rc_dec;
960
Philipp Maiere0c65302017-03-28 17:05:40 +0200961 msg = msgb_alloc(1024, "output buffer");
962 rc_enc = gsm0808_enc_channel_type(msg, &enc_ct);
963 OSMO_ASSERT(rc_enc == 6);
964 OSMO_ASSERT(memcmp(ct_enc_expected, msg->data, msg->len) == 0);
965
966 rc_dec = gsm0808_dec_channel_type(&dec_ct, msg->data + 2, msg->len - 2);
967 OSMO_ASSERT(rc_dec == 4);
968 OSMO_ASSERT(memcmp(&enc_ct, &dec_ct, sizeof(enc_ct)) == 0);
969
970 msgb_free(msg);
971}
972
Philipp Maier14e76b92017-03-28 18:36:52 +0200973static void test_gsm0808_enc_dec_encrypt_info()
974{
Neels Hofmeyr9a4286b2018-04-20 12:27:52 +0200975 struct gsm0808_encrypt_info enc_ei = {
976 .perm_algo = { GSM0808_ALG_ID_A5_0, GSM0808_ALG_ID_A5_1 },
977 .perm_algo_len = 2,
978 .key = { 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x23, 0x42, },
979 .key_len = 8,
980 };
981 struct gsm0808_encrypt_info dec_ei = {};
Philipp Maier14e76b92017-03-28 18:36:52 +0200982 struct msgb *msg;
983 uint8_t ei_enc_expected[] =
984 { GSM0808_IE_ENCRYPTION_INFORMATION, 0x09, 0x03, 0xaa, 0xbb,
985 0xcc, 0xdd, 0xee, 0xff, 0x23, 0x42
986 };
987 uint8_t rc_enc;
988 int rc_dec;
989
Philipp Maier14e76b92017-03-28 18:36:52 +0200990 msg = msgb_alloc(1024, "output buffer");
991 rc_enc = gsm0808_enc_encrypt_info(msg, &enc_ei);
992 OSMO_ASSERT(rc_enc == 11);
993 OSMO_ASSERT(memcmp(ei_enc_expected, msg->data, msg->len) == 0);
994
995 rc_dec = gsm0808_dec_encrypt_info(&dec_ei, msg->data + 2, msg->len - 2);
996 OSMO_ASSERT(rc_dec == 9);
997
998 OSMO_ASSERT(memcmp(&enc_ei, &dec_ei, sizeof(enc_ei)) == 0);
999
1000 msgb_free(msg);
1001}
1002
Philipp Maier783047e2017-03-29 11:35:50 +02001003static void test_gsm0808_enc_dec_cell_id_list_lac()
1004{
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001005 struct gsm0808_cell_id_list2 enc_cil;
1006 struct gsm0808_cell_id_list2 dec_cil;
Philipp Maier783047e2017-03-29 11:35:50 +02001007 struct msgb *msg;
1008 uint8_t rc_enc;
1009 int rc_dec;
1010
1011 memset(&enc_cil, 0, sizeof(enc_cil));
1012 enc_cil.id_discr = CELL_IDENT_LAC;
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001013 enc_cil.id_list[0].lac = 0x0124;
Neels Hofmeyrdb2fa4e2018-04-13 04:11:20 +02001014 enc_cil.id_list[1].lac = 0xABCD;
1015 enc_cil.id_list[2].lac = 0x5678;
Philipp Maier783047e2017-03-29 11:35:50 +02001016 enc_cil.id_list_len = 3;
1017
1018 msg = msgb_alloc(1024, "output buffer");
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001019 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
Neels Hofmeyrdb2fa4e2018-04-13 04:11:20 +02001020 EXPECT_ENCODED("1a 07 05 01 24 ab cd 56 78");
Philipp Maier783047e2017-03-29 11:35:50 +02001021
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001022 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
Philipp Maier783047e2017-03-29 11:35:50 +02001023 OSMO_ASSERT(rc_dec == 7);
1024
1025 OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
1026
1027 msgb_free(msg);
1028}
1029
1030static void test_gsm0808_enc_dec_cell_id_list_single_lac()
1031{
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001032 struct gsm0808_cell_id_list2 enc_cil;
1033 struct gsm0808_cell_id_list2 dec_cil;
Philipp Maier783047e2017-03-29 11:35:50 +02001034 struct msgb *msg;
1035 uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x03,
1036 0x05, 0x23, 0x42
1037 };
1038 uint8_t rc_enc;
1039 int rc_dec;
1040
1041 memset(&enc_cil, 0, sizeof(enc_cil));
1042 enc_cil.id_discr = CELL_IDENT_LAC;
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001043 enc_cil.id_list[0].lac = 0x2342;
Philipp Maier783047e2017-03-29 11:35:50 +02001044 enc_cil.id_list_len = 1;
1045
1046 msg = msgb_alloc(1024, "output buffer");
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001047 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
Philipp Maier783047e2017-03-29 11:35:50 +02001048 OSMO_ASSERT(rc_enc == 5);
1049 OSMO_ASSERT(memcmp(cil_enc_expected, msg->data, msg->len) == 0);
1050
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001051 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
Philipp Maier783047e2017-03-29 11:35:50 +02001052 OSMO_ASSERT(rc_dec == 3);
1053
1054 OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
1055
1056 msgb_free(msg);
1057}
1058
Stefan Sperlinge1a86742018-03-15 18:05:02 +01001059static void test_gsm0808_enc_dec_cell_id_list_multi_lac()
1060{
1061 struct gsm0808_cell_id_list2 enc_cil;
1062 struct gsm0808_cell_id_list2 dec_cil;
1063 struct msgb *msg;
1064 uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x0b, 0x05,
1065 0x23, 0x42,
1066 0x24, 0x43,
1067 0x25, 0x44,
1068 0x26, 0x45,
1069 0x27, 0x46
1070 };
1071 uint8_t rc_enc;
1072 int rc_dec;
1073
1074 memset(&enc_cil, 0, sizeof(enc_cil));
1075 enc_cil.id_discr = CELL_IDENT_LAC;
1076 enc_cil.id_list[0].lac = 0x2342;
1077 enc_cil.id_list[1].lac = 0x2443;
1078 enc_cil.id_list[2].lac = 0x2544;
1079 enc_cil.id_list[3].lac = 0x2645;
1080 enc_cil.id_list[4].lac = 0x2746;
1081 enc_cil.id_list_len = 5;
1082
1083 msg = msgb_alloc(1024, "output buffer");
1084 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
1085 OSMO_ASSERT(rc_enc == sizeof(cil_enc_expected));
1086 OSMO_ASSERT(memcmp(cil_enc_expected, msg->data, msg->len) == 0);
1087
1088 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
1089 OSMO_ASSERT(rc_dec == msg->len - 2);
1090 OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
1091
1092 msgb_free(msg);
1093}
1094
Philipp Maier783047e2017-03-29 11:35:50 +02001095static void test_gsm0808_enc_dec_cell_id_list_bss()
1096{
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001097 struct gsm0808_cell_id_list2 enc_cil;
1098 struct gsm0808_cell_id_list2 dec_cil;
Philipp Maier783047e2017-03-29 11:35:50 +02001099 struct msgb *msg;
1100 uint8_t rc_enc;
1101 int rc_dec;
1102
1103 memset(&enc_cil, 0, sizeof(enc_cil));
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001104 enc_cil.id_discr = CELL_IDENT_BSS;
Philipp Maier783047e2017-03-29 11:35:50 +02001105
1106 msg = msgb_alloc(1024, "output buffer");
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001107 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
Philipp Maier783047e2017-03-29 11:35:50 +02001108 OSMO_ASSERT(rc_enc == 3);
1109
Stefan Sperling11a4d9d2018-02-15 18:28:04 +01001110 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
Philipp Maier783047e2017-03-29 11:35:50 +02001111 OSMO_ASSERT(rc_dec == 1);
1112
1113 OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
1114
1115 msgb_free(msg);
1116}
1117
Stefan Sperling23381452018-03-15 19:38:15 +01001118static void test_gsm0808_enc_dec_cell_id_list_multi_lai_and_lac()
1119{
1120 struct gsm0808_cell_id_list2 enc_cil;
1121 struct gsm0808_cell_id_list2 dec_cil;
1122 struct osmo_location_area_id id;
1123 struct msgb *msg;
1124 uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x10, 0x04,
1125 0x92, 0x61, 0x54, 0x23, 0x42,
1126 0x92, 0x72, 0x54, 0x24, 0x43,
1127 0x92, 0x83, 0x54, 0x25, 0x44
1128 };
1129 uint8_t rc_enc;
1130 int rc_dec, i;
1131
1132 memset(&enc_cil, 0, sizeof(enc_cil));
1133 enc_cil.id_discr = CELL_IDENT_LAI_AND_LAC;
1134
1135 id.plmn.mcc = 0x123;
1136 osmo_mnc_from_str("456", &id.plmn.mnc, &id.plmn.mnc_3_digits);
1137 id.lac = 0x2342;
1138 memcpy(&enc_cil.id_list[0].lai_and_lac, &id, sizeof(id));
1139
1140 id.plmn.mcc = 0x124;
1141 osmo_mnc_from_str("457", &id.plmn.mnc, &id.plmn.mnc_3_digits);
1142 id.lac = 0x2443;
1143 memcpy(&enc_cil.id_list[1].lai_and_lac, &id, sizeof(id));
1144
1145 id.plmn.mcc = 0x125;
1146 osmo_mnc_from_str("458", &id.plmn.mnc, &id.plmn.mnc_3_digits);
1147 id.lac = 0x2544;
1148 memcpy(&enc_cil.id_list[2].lai_and_lac, &id, sizeof(id));
1149
1150 enc_cil.id_list_len = 3;
1151
1152 msg = msgb_alloc(1024, "output buffer");
1153 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
1154 OSMO_ASSERT(rc_enc == sizeof(cil_enc_expected));
1155 OSMO_ASSERT(memcmp(cil_enc_expected, msg->data, msg->len) == 0);
1156
1157 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
1158 OSMO_ASSERT(rc_dec == msg->len - 2);
1159
1160 OSMO_ASSERT(dec_cil.id_list_len == 3);
1161 /* Check MAXLEN elements to ensure everything has been initialized. */
1162 for (i = 0; i < GSM0808_CELL_ID_LIST2_MAXLEN; i++) {
1163 struct osmo_location_area_id *enc_id;
1164 struct osmo_location_area_id *dec_id;
1165 enc_id = &enc_cil.id_list[i].lai_and_lac;
1166 dec_id = &dec_cil.id_list[i].lai_and_lac;
1167 OSMO_ASSERT(osmo_plmn_cmp(&enc_id->plmn, &dec_id->plmn) == 0);
1168 OSMO_ASSERT(enc_id->lac == dec_id->lac);
1169 }
1170
1171 msgb_free(msg);
1172}
1173
Stefan Sperling9c62fc62018-03-16 10:23:34 +01001174static void test_gsm0808_enc_dec_cell_id_list_multi_ci()
1175{
1176 struct gsm0808_cell_id_list2 enc_cil;
1177 struct gsm0808_cell_id_list2 dec_cil;
1178 struct msgb *msg;
1179 uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x09, 0x02,
1180 0x00, 0x01,
1181 0x00, 0x02,
1182 0x00, 0x77,
1183 0x01, 0xff,
1184 };
1185 uint8_t rc_enc;
1186 int rc_dec;
1187
1188 memset(&enc_cil, 0, sizeof(enc_cil));
1189 enc_cil.id_discr = CELL_IDENT_CI;
1190 enc_cil.id_list[0].ci = 1;
1191 enc_cil.id_list[1].ci = 2;
1192 enc_cil.id_list[2].ci = 119;
1193 enc_cil.id_list[3].ci = 511;
1194 enc_cil.id_list_len = 4;
1195
1196 msg = msgb_alloc(1024, "output buffer");
1197 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
1198 OSMO_ASSERT(rc_enc == sizeof(cil_enc_expected));
1199 OSMO_ASSERT(memcmp(cil_enc_expected, msg->data, msg->len) == 0);
1200
1201 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
1202 OSMO_ASSERT(rc_dec == msg->len - 2);
1203 OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
1204
1205 msgb_free(msg);
1206}
1207
Stefan Sperlinged4327c2018-03-16 11:02:59 +01001208static void test_gsm0808_enc_dec_cell_id_list_multi_lac_and_ci()
1209{
1210 struct gsm0808_cell_id_list2 enc_cil;
1211 struct gsm0808_cell_id_list2 dec_cil;
1212 struct msgb *msg;
1213 uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x15, 0x01,
1214 0x23, 0x42, 0x00, 0x01,
1215 0x24, 0x43, 0x00, 0x02,
1216 0x25, 0x44, 0x00, 0x77,
1217 0x26, 0x45, 0x01, 0xff,
1218 0x27, 0x46, 0x02, 0xfe,
1219 };
1220 uint8_t rc_enc;
1221 int rc_dec;
1222
1223 memset(&enc_cil, 0, sizeof(enc_cil));
1224 enc_cil.id_discr = CELL_IDENT_LAC_AND_CI;
1225 enc_cil.id_list[0].lac_and_ci.lac = 0x2342;
1226 enc_cil.id_list[0].lac_and_ci.ci = 1;
1227 enc_cil.id_list[1].lac_and_ci.lac = 0x2443;
1228 enc_cil.id_list[1].lac_and_ci.ci = 2;
1229 enc_cil.id_list[2].lac_and_ci.lac = 0x2544;
1230 enc_cil.id_list[2].lac_and_ci.ci = 119;
1231 enc_cil.id_list[3].lac_and_ci.lac = 0x2645;
1232 enc_cil.id_list[3].lac_and_ci.ci = 511;
1233 enc_cil.id_list[4].lac_and_ci.lac = 0x2746;
1234 enc_cil.id_list[4].lac_and_ci.ci = 766;
1235 enc_cil.id_list_len = 5;
1236
1237 msg = msgb_alloc(1024, "output buffer");
1238 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
1239 OSMO_ASSERT(rc_enc == sizeof(cil_enc_expected));
1240 OSMO_ASSERT(memcmp(cil_enc_expected, msg->data, msg->len) == 0);
1241
1242 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
1243 OSMO_ASSERT(rc_dec == msg->len - 2);
1244 OSMO_ASSERT(memcmp(&enc_cil, &dec_cil, sizeof(enc_cil)) == 0);
1245
1246 msgb_free(msg);
1247}
1248
Stefan Sperling483f3862018-03-16 12:21:26 +01001249static void test_gsm0808_enc_dec_cell_id_list_multi_global()
1250{
1251 struct gsm0808_cell_id_list2 enc_cil;
1252 struct gsm0808_cell_id_list2 dec_cil;
1253 struct msgb *msg;
1254 uint8_t cil_enc_expected[] = { GSM0808_IE_CELL_IDENTIFIER_LIST, 0x16, 0x00,
Neels Hofmeyr473485c2018-03-23 02:04:18 +01001255 0x21, 0x63, 0x54, 0x23, 0x42, 0x00, 0x1,
Neels Hofmeyrc44fc232018-03-23 02:15:12 +01001256 0x21, 0xf4, 0x75, 0x24, 0x43, 0x00, 0x2,
Neels Hofmeyr8b8cd932018-03-23 01:47:37 +01001257 0x21, 0x75, 0x00, 0x25, 0x44, 0x00, 0x77
Stefan Sperling483f3862018-03-16 12:21:26 +01001258 };
Stefan Sperling483f3862018-03-16 12:21:26 +01001259 uint8_t rc_enc;
1260 int rc_dec, i;
1261
Neels Hofmeyrc1991df2018-03-23 02:00:00 +01001262 enc_cil = (struct gsm0808_cell_id_list2){
1263 .id_discr = CELL_IDENT_WHOLE_GLOBAL,
1264 .id_list_len = 3,
1265 .id_list = {
1266 {
1267 .global = {
Neels Hofmeyr473485c2018-03-23 02:04:18 +01001268 .lai = { .plmn = { .mcc = 123, .mnc = 456 },
Neels Hofmeyrc1991df2018-03-23 02:00:00 +01001269 .lac = 0x2342 },
1270 .cell_identity = 1,
1271 }
1272 },
1273 {
1274 .global = {
Neels Hofmeyrc44fc232018-03-23 02:15:12 +01001275 .lai = { .plmn = { .mcc = 124, .mnc = 57 },
Neels Hofmeyrc1991df2018-03-23 02:00:00 +01001276 .lac = 0x2443 },
1277 .cell_identity = 2,
1278 }
1279 },
1280 {
1281 .global = {
Neels Hofmeyrc44fc232018-03-23 02:15:12 +01001282 .lai = { .plmn = { .mcc = 125, .mnc = 7,
1283 .mnc_3_digits = true },
Neels Hofmeyrc1991df2018-03-23 02:00:00 +01001284 .lac = 0x2544 },
1285 .cell_identity = 119,
1286 }
1287 },
1288 }
1289 };
Stefan Sperling483f3862018-03-16 12:21:26 +01001290
1291 msg = msgb_alloc(1024, "output buffer");
1292 rc_enc = gsm0808_enc_cell_id_list2(msg, &enc_cil);
1293 OSMO_ASSERT(rc_enc == sizeof(cil_enc_expected));
Neels Hofmeyrc1991df2018-03-23 02:00:00 +01001294 if (memcmp(cil_enc_expected, msg->data, msg->len)) {
1295 printf(" got: %s\n", osmo_hexdump(msg->data, msg->len));
1296 printf("expect: %s\n", osmo_hexdump(cil_enc_expected, sizeof(cil_enc_expected)));
1297 OSMO_ASSERT(false);
1298 }
Stefan Sperling483f3862018-03-16 12:21:26 +01001299
1300 rc_dec = gsm0808_dec_cell_id_list2(&dec_cil, msg->data + 2, msg->len - 2);
1301 OSMO_ASSERT(rc_dec == msg->len - 2);
1302
1303 /* Check MAXLEN elements to ensure everything has been initialized. */
1304 for (i = 0; i < GSM0808_CELL_ID_LIST2_MAXLEN; i++) {
1305 struct osmo_cell_global_id *enc_id;
1306 struct osmo_cell_global_id *dec_id;
1307 enc_id = &enc_cil.id_list[i].global;
1308 dec_id = &dec_cil.id_list[i].global;
1309 OSMO_ASSERT(osmo_plmn_cmp(&enc_id->lai.plmn, &dec_id->lai.plmn) == 0);
1310 OSMO_ASSERT(enc_id->lai.lac == dec_id->lai.lac);
1311 OSMO_ASSERT(enc_id->cell_identity == dec_id->cell_identity);
1312 }
1313
1314 msgb_free(msg);
1315}
1316
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001317static void print_cil(const struct gsm0808_cell_id_list2 *cil)
1318{
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001319 printf(" cell_id_list == %s\n", gsm0808_cell_id_list_name(cil));
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001320}
1321
1322void test_cell_id_list_add() {
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001323 size_t zu;
1324
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001325 const struct gsm0808_cell_id_list2 cgi1 = {
1326 .id_discr = CELL_IDENT_WHOLE_GLOBAL,
1327 .id_list_len = 1,
1328 .id_list = {
1329 {
1330 .global = {
1331 .lai = {
1332 .plmn = { .mcc = 1, .mnc = 2, .mnc_3_digits = false },
1333 .lac = 3,
1334 },
1335 .cell_identity = 4,
1336 }
1337 },
1338 },
1339 };
1340
1341 const struct gsm0808_cell_id_list2 cgi2 = {
1342 .id_discr = CELL_IDENT_WHOLE_GLOBAL,
1343 .id_list_len = 2,
1344 .id_list = {
1345 {
1346 .global = {
1347 .lai = {
1348 .plmn = { .mcc = 1, .mnc = 2, .mnc_3_digits = true },
1349 .lac = 3,
1350 },
1351 .cell_identity = 4,
1352 }
1353 },
1354 {
1355 .global = {
1356 .lai = {
1357 .plmn = { .mcc = 5, .mnc = 6, .mnc_3_digits = true },
1358 .lac = 7,
1359 },
1360 .cell_identity = 8,
1361 }
1362 },
1363 },
1364 };
1365
1366 const struct gsm0808_cell_id_list2 cgi2a = {
1367 .id_discr = CELL_IDENT_WHOLE_GLOBAL,
1368 .id_list_len = 2,
1369 .id_list = {
1370 {
1371 .global = cgi2.id_list[0].global
1372 },
1373 {
1374 .global = {
1375 .lai = {
1376 .plmn = { .mcc = 9, .mnc = 10, .mnc_3_digits = true },
1377 .lac = 11,
1378 },
1379 .cell_identity = 12,
1380 }
1381 },
1382 },
1383 };
1384
1385 const struct gsm0808_cell_id_list2 cgi3 = {
1386 .id_discr = CELL_IDENT_WHOLE_GLOBAL,
1387 .id_list_len = 2,
1388 .id_list = {
1389 {
1390 .global = {
1391 .lai = {
1392 .plmn = { .mcc = 13, .mnc = 14, .mnc_3_digits = true },
1393 .lac = 15,
1394 },
1395 .cell_identity = 16,
1396 }
1397 },
1398 {
1399 .global = {
1400 .lai = {
1401 .plmn = { .mcc = 16, .mnc = 17, .mnc_3_digits = true },
1402 .lac = 18,
1403 },
1404 .cell_identity = 19,
1405 }
1406 },
1407 },
1408 };
1409
1410
1411 const struct gsm0808_cell_id_list2 lac1 = {
1412 .id_discr = CELL_IDENT_LAC,
1413 .id_list_len = 1,
1414 .id_list = {
1415 {
1416 .lac = 123
1417 },
1418 },
1419 };
1420
1421 const struct gsm0808_cell_id_list2 lac2 = {
1422 .id_discr = CELL_IDENT_LAC,
1423 .id_list_len = 2,
1424 .id_list = {
1425 {
1426 .lac = 456
1427 },
1428 {
1429 .lac = 789
1430 },
1431 },
1432 };
1433
1434 struct gsm0808_cell_id_list2 cil = {};
1435
1436 printf("------- %s\n", __func__);
1437
1438 print_cil(&cil);
1439
1440#define ADD_QUIET(other_cil, expect_rc) do { \
1441 int rc = gsm0808_cell_id_list_add(&cil, &other_cil); \
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001442 printf("gsm0808_cell_id_list_add(&cil, &" #other_cil ") --> rc = %d\n", rc); \
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001443 OSMO_ASSERT(rc == expect_rc); \
1444 } while(0)
1445
1446#define ADD(other_cil, expect_rc) ADD_QUIET(other_cil, expect_rc); print_cil(&cil)
1447
1448 ADD(lac1, 1);
1449 ADD(lac1, 0);
1450 ADD(lac2, 2);
1451 ADD(lac2, 0);
1452 ADD(cil, 0);
1453 ADD(cgi1, -EINVAL);
1454
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001455 printf("* can't add to BSS list\n");
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001456 cil.id_list_len = 0;
1457 cil.id_discr = CELL_IDENT_BSS;
1458 print_cil(&cil);
1459 ADD(lac1, -EINVAL);
1460
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001461 printf("* other types (including NO_CELL) take on new type iff empty\n");
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001462 cil.id_list_len = 0;
1463 cil.id_discr = CELL_IDENT_NO_CELL;
1464 print_cil(&cil);
1465 ADD(cgi1, 1);
1466 ADD(cgi1, 0);
1467 ADD(cgi2, 2);
1468 ADD(cgi2, 0);
1469
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001470 printf("* test gsm0808_cell_id_list_name_buf()'s return val\n");
1471 zu = strlen(gsm0808_cell_id_list_name(&cil));
1472 printf(" strlen(gsm0808_cell_id_list_name(cil)) == %zu\n", zu);
1473 zu ++;
1474 while (1) {
1475 char buf[128] = "?";
1476 int rc;
1477 OSMO_ASSERT(zu < sizeof(buf));
1478 buf[zu] = '#';
1479 rc = gsm0808_cell_id_list_name_buf(buf, zu, &cil);
1480 printf(" gsm0808_cell_id_list_name_buf(buf, %zu, cil)) == %d \"%s\"\n",
1481 zu, rc, buf);
1482 OSMO_ASSERT(buf[zu] == '#');
1483 if (!zu)
1484 break;
1485 zu /= 2;
1486 }
1487
1488 printf("* list-full behavior\n");
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001489 cil.id_list_len = GSM0808_CELL_ID_LIST2_MAXLEN - 1;
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001490 printf("cil.id_list_len = %u\n", cil.id_list_len);
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001491 ADD_QUIET(cgi2a, 1);
1492 printf("cil.id_list_len = %u\n", cil.id_list_len);
1493
1494 cil.id_list_len = GSM0808_CELL_ID_LIST2_MAXLEN - 1;
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001495 printf("cil.id_list_len = %u\n", cil.id_list_len);
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001496 ADD_QUIET(cgi3, -ENOSPC);
Neels Hofmeyra4399c82018-04-17 02:26:10 +02001497 printf("cil.id_list_len = %u\n", cil.id_list_len);
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001498 ADD_QUIET(cgi2a, -ENOSPC);
1499 printf("cil.id_list_len = %u\n", cil.id_list_len);
1500
1501 printf("------- %s done\n", __func__);
1502}
1503
Neels Hofmeyr250e7f72018-04-13 03:30:14 +02001504static void test_gsm0808_enc_dec_cell_id_lac()
1505{
1506 struct gsm0808_cell_id enc_ci = {
1507 .id_discr = CELL_IDENT_LAC,
1508 .id.lac = 0x0124,
1509 };
1510 struct gsm0808_cell_id dec_ci;
1511 struct msgb *msg;
1512 uint8_t rc_enc;
1513 int rc_dec;
1514
1515 memset(&dec_ci, 0xa5, sizeof(dec_ci));
1516
1517 msg = msgb_alloc(1024, "output buffer");
1518 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1519 EXPECT_ENCODED("05 03 05 01 24");
1520
1521 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1522 OSMO_ASSERT(rc_dec == 3);
1523
1524 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr
1525 && enc_ci.id.lac == dec_ci.id.lac);
1526
1527 msgb_free(msg);
1528}
1529
1530static void test_gsm0808_enc_dec_cell_id_bss()
1531{
1532 struct gsm0808_cell_id enc_ci = {
1533 .id_discr = CELL_IDENT_BSS,
1534 };
1535 struct gsm0808_cell_id dec_ci;
1536 struct msgb *msg;
1537 uint8_t rc_enc;
1538 int rc_dec;
1539
1540 msg = msgb_alloc(1024, "output buffer");
1541 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1542 EXPECT_ENCODED("05 01 06");
1543
1544 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1545 OSMO_ASSERT(rc_dec == 1);
1546
1547 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr);
1548
1549 msgb_free(msg);
1550}
1551
1552static void test_gsm0808_enc_dec_cell_id_no_cell()
1553{
1554 struct gsm0808_cell_id enc_ci = {
1555 .id_discr = CELL_IDENT_NO_CELL,
1556 };
1557 struct gsm0808_cell_id dec_ci;
1558 struct msgb *msg;
1559 uint8_t rc_enc;
1560 int rc_dec;
1561
1562 msg = msgb_alloc(1024, "output buffer");
1563 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1564 EXPECT_ENCODED("05 01 03");
1565
1566 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1567 OSMO_ASSERT(rc_dec == 1);
1568
1569 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr);
1570
1571 msgb_free(msg);
1572}
1573
1574static void test_gsm0808_enc_dec_cell_id_lai_and_lac()
1575{
1576 struct gsm0808_cell_id enc_ci = {
1577 .id_discr = CELL_IDENT_LAI_AND_LAC,
1578 .id.lai_and_lac = {
1579 .plmn = {
1580 .mcc = 123,
1581 .mnc = 456,
1582 },
1583 .lac = 0x2342,
1584 },
1585 };
1586 struct gsm0808_cell_id dec_ci;
1587 struct msgb *msg;
1588 uint8_t rc_enc;
1589 int rc_dec;
1590
1591 msg = msgb_alloc(1024, "output buffer");
1592 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1593 EXPECT_ENCODED("05 06 04 21 63 54 23 42");
1594
1595 memset(&dec_ci, 0xa5, sizeof(dec_ci));
1596 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1597 OSMO_ASSERT(rc_dec == msg->len - 2);
1598
1599 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr
1600 && osmo_plmn_cmp(&enc_ci.id.lai_and_lac.plmn, &dec_ci.id.lai_and_lac.plmn) == 0
1601 && enc_ci.id.lai_and_lac.lac == dec_ci.id.lai_and_lac.lac);
1602 msgb_free(msg);
1603}
1604
1605static void test_gsm0808_enc_dec_cell_id_ci()
1606{
1607 struct gsm0808_cell_id enc_ci = {
1608 .id_discr = CELL_IDENT_CI,
1609 .id.ci = 0x423,
1610 };
1611 struct gsm0808_cell_id dec_ci;
1612 struct msgb *msg;
1613 uint8_t rc_enc;
1614 int rc_dec;
1615
1616 msg = msgb_alloc(1024, "output buffer");
1617 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1618 EXPECT_ENCODED("05 03 02 04 23");
1619
1620 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1621 OSMO_ASSERT(rc_dec == msg->len - 2);
1622 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr
1623 && enc_ci.id.ci == dec_ci.id.ci);
1624
1625 msgb_free(msg);
1626}
1627
1628static void test_gsm0808_enc_dec_cell_id_lac_and_ci()
1629{
1630 struct gsm0808_cell_id enc_ci = {
1631 .id_discr = CELL_IDENT_LAC_AND_CI,
1632 .id.lac_and_ci = {
1633 .lac = 0x423,
1634 .ci = 0x235,
1635 },
1636 };
1637 struct gsm0808_cell_id dec_ci;
1638 struct msgb *msg;
1639 uint8_t rc_enc;
1640 int rc_dec;
1641
1642 msg = msgb_alloc(1024, "output buffer");
1643 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1644 EXPECT_ENCODED("05 05 01 04 23 02 35");
1645
1646 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1647 OSMO_ASSERT(rc_dec == msg->len - 2);
1648 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr
1649 && enc_ci.id.lac_and_ci.lac == dec_ci.id.lac_and_ci.lac
1650 && enc_ci.id.lac_and_ci.ci == dec_ci.id.lac_and_ci.ci);
1651
1652 msgb_free(msg);
1653}
1654
1655static void test_gsm0808_enc_dec_cell_id_global()
1656{
1657 struct gsm0808_cell_id enc_ci = {
1658 .id_discr = CELL_IDENT_WHOLE_GLOBAL,
1659 .id.global = {
1660 .lai = {
1661 .plmn = { .mcc = 123, .mnc = 456 },
1662 .lac = 0x2342
1663 },
1664 .cell_identity = 0x423,
1665 }
1666 };
1667 struct gsm0808_cell_id dec_ci;
1668 struct msgb *msg;
1669 uint8_t rc_enc;
1670 int rc_dec;
1671
1672 msg = msgb_alloc(1024, "output buffer");
1673 rc_enc = gsm0808_enc_cell_id(msg, &enc_ci);
1674 EXPECT_ENCODED("05 08 00 21 63 54 23 42 04 23");
1675
1676 rc_dec = gsm0808_dec_cell_id(&dec_ci, msg->data + 2, msg->len - 2);
1677 OSMO_ASSERT(rc_dec == msg->len - 2);
1678
1679 OSMO_ASSERT(enc_ci.id_discr == dec_ci.id_discr
1680 && osmo_plmn_cmp(&enc_ci.id.global.lai.plmn,
1681 &dec_ci.id.global.lai.plmn) == 0
1682 && enc_ci.id.global.lai.lac == dec_ci.id.global.lai.lac
1683 && enc_ci.id.global.cell_identity == dec_ci.id.global.cell_identity);
1684 msgb_free(msg);
1685}
1686
Philipp Maier5f2eb152018-09-19 13:40:21 +02001687static void test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(struct gsm48_multi_rate_conf *cfg)
1688{
1689 uint16_t s15_s0;
1690
1691 printf("Input:\n");
1692 printf(" m4_75= %u smod= %u\n", cfg->m4_75, cfg->smod);
1693 printf(" m5_15= %u spare= %u\n", cfg->m5_15, cfg->spare);
1694 printf(" m5_90= %u icmi= %u\n", cfg->m5_90, cfg->icmi);
1695 printf(" m6_70= %u nscb= %u\n", cfg->m6_70, cfg->nscb);
1696 printf(" m7_40= %u ver= %u\n", cfg->m7_40, cfg->ver);
1697 printf(" m7_95= %u\n", cfg->m7_95);
1698 printf(" m10_2= %u\n", cfg->m10_2);
1699 printf(" m12_2= %u\n", cfg->m12_2);
1700
1701 s15_s0 = gsm0808_sc_cfg_from_gsm48_mr_cfg(cfg, true);
1702 printf("Result (fr):\n");
1703 printf(" S15-S0 = %04x = 0b" OSMO_BIN_SPEC OSMO_BIN_SPEC "\n", s15_s0,
1704 OSMO_BIN_PRINT(s15_s0 >> 8), OSMO_BIN_PRINT(s15_s0));
1705
1706 s15_s0 = gsm0808_sc_cfg_from_gsm48_mr_cfg(cfg, false);
1707 printf("Result (hr):\n");
1708 printf(" S15-S0 = %04x = 0b" OSMO_BIN_SPEC OSMO_BIN_SPEC "\n", s15_s0,
1709 OSMO_BIN_PRINT(s15_s0 >> 8), OSMO_BIN_PRINT(s15_s0));
1710
1711 printf("\n");
1712}
1713
1714static void test_gsm0808_sc_cfg_from_gsm48_mr_cfg(void)
1715{
1716 struct gsm48_multi_rate_conf cfg;
1717
1718 printf("Testing gsm0808_sc_cfg_from_gsm48_mr_cfg():\n");
1719
1720 memset(&cfg, 0, sizeof(cfg));
1721
1722 cfg.m4_75 = 0;
1723 cfg.m5_15 = 0;
1724 cfg.m5_90 = 0;
1725 cfg.m6_70 = 0;
1726 cfg.m7_40 = 0;
1727 cfg.m7_95 = 0;
1728 cfg.m10_2 = 0;
1729 cfg.m12_2 = 0;
1730 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1731
1732 cfg.m4_75 = 1;
1733 cfg.m5_15 = 0;
1734 cfg.m5_90 = 0;
1735 cfg.m6_70 = 0;
1736 cfg.m7_40 = 0;
1737 cfg.m7_95 = 0;
1738 cfg.m10_2 = 0;
1739 cfg.m12_2 = 0;
1740 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1741
1742 cfg.m4_75 = 0;
1743 cfg.m5_15 = 1;
1744 cfg.m5_90 = 0;
1745 cfg.m6_70 = 0;
1746 cfg.m7_40 = 0;
1747 cfg.m7_95 = 0;
1748 cfg.m10_2 = 0;
1749 cfg.m12_2 = 0;
1750 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1751
1752 cfg.m4_75 = 0;
1753 cfg.m5_15 = 0;
1754 cfg.m5_90 = 1;
1755 cfg.m6_70 = 0;
1756 cfg.m7_40 = 0;
1757 cfg.m7_95 = 0;
1758 cfg.m10_2 = 0;
1759 cfg.m12_2 = 0;
1760 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1761
1762 cfg.m4_75 = 0;
1763 cfg.m5_15 = 0;
1764 cfg.m5_90 = 0;
1765 cfg.m6_70 = 1;
1766 cfg.m7_40 = 0;
1767 cfg.m7_95 = 0;
1768 cfg.m10_2 = 0;
1769 cfg.m12_2 = 0;
1770 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1771
1772 cfg.m4_75 = 0;
1773 cfg.m5_15 = 0;
1774 cfg.m5_90 = 0;
1775 cfg.m6_70 = 0;
1776 cfg.m7_40 = 1;
1777 cfg.m7_95 = 0;
1778 cfg.m10_2 = 0;
1779 cfg.m12_2 = 0;
1780 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1781
1782 cfg.m4_75 = 0;
1783 cfg.m5_15 = 0;
1784 cfg.m5_90 = 0;
1785 cfg.m6_70 = 0;
1786 cfg.m7_40 = 0;
1787 cfg.m7_95 = 1;
1788 cfg.m10_2 = 0;
1789 cfg.m12_2 = 0;
1790 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1791
1792 cfg.m4_75 = 0;
1793 cfg.m5_15 = 0;
1794 cfg.m5_90 = 0;
1795 cfg.m6_70 = 0;
1796 cfg.m7_40 = 0;
1797 cfg.m7_95 = 0;
1798 cfg.m10_2 = 1;
1799 cfg.m12_2 = 0;
1800 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1801
1802 cfg.m4_75 = 0;
1803 cfg.m5_15 = 0;
1804 cfg.m5_90 = 0;
1805 cfg.m6_70 = 0;
1806 cfg.m7_40 = 0;
1807 cfg.m7_95 = 0;
1808 cfg.m10_2 = 0;
1809 cfg.m12_2 = 1;
1810 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1811
1812 cfg.m4_75 = 1;
1813 cfg.m5_15 = 1;
1814 cfg.m5_90 = 1;
1815 cfg.m6_70 = 1;
1816 cfg.m7_40 = 0;
1817 cfg.m7_95 = 0;
1818 cfg.m10_2 = 0;
1819 cfg.m12_2 = 0;
1820 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1821
1822 cfg.m4_75 = 0;
1823 cfg.m5_15 = 0;
1824 cfg.m5_90 = 0;
1825 cfg.m6_70 = 0;
1826 cfg.m7_40 = 1;
1827 cfg.m7_95 = 1;
1828 cfg.m10_2 = 1;
1829 cfg.m12_2 = 1;
1830 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1831
1832 cfg.m4_75 = 0;
1833 cfg.m5_15 = 0;
1834 cfg.m5_90 = 1;
1835 cfg.m6_70 = 1;
1836 cfg.m7_40 = 0;
1837 cfg.m7_95 = 0;
1838 cfg.m10_2 = 1;
1839 cfg.m12_2 = 1;
1840 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1841
1842 cfg.m4_75 = 1;
1843 cfg.m5_15 = 1;
1844 cfg.m5_90 = 0;
1845 cfg.m6_70 = 0;
1846 cfg.m7_40 = 1;
1847 cfg.m7_95 = 1;
1848 cfg.m10_2 = 0;
1849 cfg.m12_2 = 0;
1850 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1851
1852 cfg.m4_75 = 0;
1853 cfg.m5_15 = 1;
1854 cfg.m5_90 = 0;
1855 cfg.m6_70 = 1;
1856 cfg.m7_40 = 0;
1857 cfg.m7_95 = 1;
1858 cfg.m10_2 = 0;
1859 cfg.m12_2 = 1;
1860 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1861
1862 cfg.m4_75 = 1;
1863 cfg.m5_15 = 0;
1864 cfg.m5_90 = 1;
1865 cfg.m6_70 = 0;
1866 cfg.m7_40 = 1;
1867 cfg.m7_95 = 0;
1868 cfg.m10_2 = 1;
1869 cfg.m12_2 = 0;
1870 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1871
1872 cfg.m4_75 = 1;
1873 cfg.m5_15 = 1;
1874 cfg.m5_90 = 1;
1875 cfg.m6_70 = 1;
1876 cfg.m7_40 = 1;
1877 cfg.m7_95 = 1;
1878 cfg.m10_2 = 1;
1879 cfg.m12_2 = 1;
1880 test_gsm0808_sc_cfg_from_gsm48_mr_cfg_single(&cfg);
1881}
1882
Philipp Maier8515d032018-09-25 15:57:49 +02001883static void test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single(uint16_t s15_s0)
1884{
1885 struct gsm48_multi_rate_conf cfg;
1886
1887 printf("Input:\n");
1888 printf(" S15-S0 = %04x = 0b" OSMO_BIN_SPEC OSMO_BIN_SPEC "\n", s15_s0,
1889 OSMO_BIN_PRINT(s15_s0 >> 8), OSMO_BIN_PRINT(s15_s0));
1890
1891 gsm48_mr_cfg_from_gsm0808_sc_cfg(&cfg, s15_s0);
1892
1893 printf("Output:\n");
1894 printf(" m4_75= %u smod= %u\n", cfg.m4_75, cfg.smod);
1895 printf(" m5_15= %u spare= %u\n", cfg.m5_15, cfg.spare);
1896 printf(" m5_90= %u icmi= %u\n", cfg.m5_90, cfg.icmi);
1897 printf(" m6_70= %u nscb= %u\n", cfg.m6_70, cfg.nscb);
1898 printf(" m7_40= %u ver= %u\n", cfg.m7_40, cfg.ver);
1899 printf(" m7_95= %u\n", cfg.m7_95);
1900 printf(" m10_2= %u\n", cfg.m10_2);
1901 printf(" m12_2= %u\n", cfg.m12_2);
1902
1903 printf("\n");
1904}
1905
1906void test_gsm48_mr_cfg_from_gsm0808_sc_cfg()
1907{
1908 printf("Testing gsm48_mr_cfg_from_gsm0808_sc_cfg():\n");
1909
1910 /* Only one codec per setting */
1911 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1912 (GSM0808_SC_CFG_DEFAULT_AMR_4_75);
1913 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1914 (GSM0808_SC_CFG_DEFAULT_AMR_5_15);
1915 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1916 (GSM0808_SC_CFG_DEFAULT_AMR_5_90);
1917 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1918 (GSM0808_SC_CFG_DEFAULT_AMR_6_70);
1919 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1920 (GSM0808_SC_CFG_DEFAULT_AMR_7_40);
1921 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1922 (GSM0808_SC_CFG_DEFAULT_AMR_7_95);
1923 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1924 (GSM0808_SC_CFG_DEFAULT_AMR_10_2);
1925 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1926 (GSM0808_SC_CFG_DEFAULT_AMR_12_2);
1927
1928 /* Combinations */
1929 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1930 (GSM0808_SC_CFG_DEFAULT_AMR_4_75 | GSM0808_SC_CFG_DEFAULT_AMR_6_70 |
1931 GSM0808_SC_CFG_DEFAULT_AMR_10_2);
1932 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1933 (GSM0808_SC_CFG_DEFAULT_AMR_10_2 | GSM0808_SC_CFG_DEFAULT_AMR_12_2 |
1934 GSM0808_SC_CFG_DEFAULT_AMR_7_40);
1935 test_gsm48_mr_cfg_from_gsm0808_sc_cfg_single
1936 (GSM0808_SC_CFG_DEFAULT_AMR_7_95 | GSM0808_SC_CFG_DEFAULT_AMR_12_2);
1937}
1938
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001939int main(int argc, char **argv)
1940{
Max969fb2e2018-12-10 11:01:10 +01001941 void *ctx = talloc_named_const(NULL, 0, "gsm0808 test");
1942 msgb_talloc_ctx_init(ctx, 0);
1943 osmo_init_logging2(ctx, NULL);
1944
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001945 printf("Testing generation of GSM0808 messages\n");
Philipp Maier4f4905f2018-11-30 13:36:12 +01001946 test_gsm0808_enc_cause();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001947 test_create_layer3();
Philipp Maierfa896ab2017-03-27 16:55:32 +02001948 test_create_layer3_aoip();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001949 test_create_reset();
Philipp Maier15596e22017-04-05 17:55:27 +02001950 test_create_reset_ack();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001951 test_create_clear_command();
1952 test_create_clear_complete();
Philipp Maierb478dd32017-03-29 15:50:05 +02001953 test_create_cipher();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001954 test_create_cipher_complete();
1955 test_create_cipher_reject();
Maxed651d22018-11-07 15:25:05 +01001956 test_create_cipher_reject_ext();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001957 test_create_cm_u();
1958 test_create_sapi_reject();
Philipp Maierc6144a22017-03-29 17:53:43 +02001959 test_create_ass();
Max52074322018-11-30 10:44:07 +01001960 test_create_ass2();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001961 test_create_ass_compl();
Philipp Maierfa896ab2017-03-27 16:55:32 +02001962 test_create_ass_compl_aoip();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001963 test_create_ass_fail();
Philipp Maierfa896ab2017-03-27 16:55:32 +02001964 test_create_ass_fail_aoip();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001965 test_create_clear_rqst();
Philipp Maier3d48ec02017-03-29 17:37:55 +02001966 test_create_paging();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001967 test_create_dtap();
1968 test_prepend_dtap();
Max969fb2e2018-12-10 11:01:10 +01001969
1970 test_enc_dec_gcr();
1971
Philipp Maier22401432017-03-24 17:59:26 +01001972 test_enc_dec_aoip_trasp_addr_v4();
1973 test_enc_dec_aoip_trasp_addr_v6();
Philipp Maier6f725d62017-03-24 18:03:17 +01001974 test_gsm0808_enc_dec_speech_codec();
Philipp Maier6f725d62017-03-24 18:03:17 +01001975 test_gsm0808_enc_dec_speech_codec_ext_with_cfg();
Philipp Maierbb839662017-06-01 17:11:19 +02001976 test_gsm0808_enc_dec_speech_codec_with_cfg();
Philipp Maier6f725d62017-03-24 18:03:17 +01001977 test_gsm0808_enc_dec_speech_codec_list();
Philipp Maierf6c369f2018-10-16 15:24:47 +02001978 test_gsm0808_enc_dec_empty_speech_codec_list();
Philipp Maiere0c65302017-03-28 17:05:40 +02001979 test_gsm0808_enc_dec_channel_type();
Philipp Maier14e76b92017-03-28 18:36:52 +02001980 test_gsm0808_enc_dec_encrypt_info();
Neels Hofmeyr250e7f72018-04-13 03:30:14 +02001981
Philipp Maier783047e2017-03-29 11:35:50 +02001982 test_gsm0808_enc_dec_cell_id_list_lac();
1983 test_gsm0808_enc_dec_cell_id_list_single_lac();
Stefan Sperlinge1a86742018-03-15 18:05:02 +01001984 test_gsm0808_enc_dec_cell_id_list_multi_lac();
Philipp Maier783047e2017-03-29 11:35:50 +02001985 test_gsm0808_enc_dec_cell_id_list_bss();
Stefan Sperling23381452018-03-15 19:38:15 +01001986 test_gsm0808_enc_dec_cell_id_list_multi_lai_and_lac();
Stefan Sperling9c62fc62018-03-16 10:23:34 +01001987 test_gsm0808_enc_dec_cell_id_list_multi_ci();
Stefan Sperlinged4327c2018-03-16 11:02:59 +01001988 test_gsm0808_enc_dec_cell_id_list_multi_lac_and_ci();
Stefan Sperling483f3862018-03-16 12:21:26 +01001989 test_gsm0808_enc_dec_cell_id_list_multi_global();
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01001990
Neels Hofmeyr74663d92018-03-23 01:46:42 +01001991 test_cell_id_list_add();
1992
Neels Hofmeyr250e7f72018-04-13 03:30:14 +02001993 test_gsm0808_enc_dec_cell_id_lac();
1994 test_gsm0808_enc_dec_cell_id_bss();
1995 test_gsm0808_enc_dec_cell_id_no_cell();
1996 test_gsm0808_enc_dec_cell_id_lai_and_lac();
1997 test_gsm0808_enc_dec_cell_id_ci();
1998 test_gsm0808_enc_dec_cell_id_lac_and_ci();
1999 test_gsm0808_enc_dec_cell_id_global();
2000
Philipp Maier5f2eb152018-09-19 13:40:21 +02002001 test_gsm0808_sc_cfg_from_gsm48_mr_cfg();
Philipp Maier8515d032018-09-25 15:57:49 +02002002 test_gsm48_mr_cfg_from_gsm0808_sc_cfg();
Philipp Maier5f2eb152018-09-19 13:40:21 +02002003
Holger Hans Peter Freyther97510812012-01-22 13:36:52 +01002004 printf("Done\n");
2005 return EXIT_SUCCESS;
2006}