diff options
author | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-02-22 01:49:36 +0100 |
---|---|---|
committer | Neels Hofmeyr <nhofmeyr@sysmocom.de> | 2017-02-22 03:25:30 +0100 |
commit | 4436dececdd2180c7148be113f0841d0a4bcb5fb (patch) | |
tree | 27ff15aa63893cb4ae3e7e8f94913f312d1153ab /tests/auc/auc_3g_test.c | |
parent | 21380ae55ec5b673847288fd54cc6dcf01350964 (diff) |
cosmetic: rename auc_3g_test.c to auc_test.c
The test includes 2G-only tests so the name is misleading. Splitting up makes
no sense.
Change-Id: I1a5a40413bf6636ead9370fb827aa0338c049e7f
Diffstat (limited to 'tests/auc/auc_3g_test.c')
-rw-r--r-- | tests/auc/auc_3g_test.c | 627 |
1 files changed, 0 insertions, 627 deletions
diff --git a/tests/auc/auc_3g_test.c b/tests/auc/auc_3g_test.c deleted file mode 100644 index 16c87f7..0000000 --- a/tests/auc/auc_3g_test.c +++ /dev/null @@ -1,627 +0,0 @@ -/* (C) 2016 by sysmocom s.f.m.c. GmbH <info@sysmocom.de> - * All Rights Reserved - * - * Author: Neels Hofmeyr <nhofmeyr@sysmocom.de> - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation; either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * - */ - -#include <stdio.h> -#include <string.h> -#include <inttypes.h> -#include <getopt.h> - -#include <osmocom/core/application.h> -#include <osmocom/core/utils.h> -#include <osmocom/core/logging.h> - -#include <osmocom/crypt/auth.h> - -#include "logging.h" -#include "auc.h" - -#define comment_start() fprintf(stderr, "\n===== %s\n", __func__); -#define comment_end() fprintf(stderr, "===== %s: SUCCESS\n\n", __func__); - -#define VERBOSE_ASSERT(val, expect_op, fmt) \ - do { \ - fprintf(stderr, #val " == " fmt "\n", (val)); \ - OSMO_ASSERT((val) expect_op); \ - } while (0); - -char *vec_str(const struct osmo_auth_vector *vec) -{ - static char buf[1024]; - char *pos = buf; - char *end = buf + sizeof(buf); - -#define append(what) \ - if (pos >= end) \ - return buf; \ - pos += snprintf(pos, sizeof(buf) - (pos - buf), \ - " " #what ": %s\n", \ - osmo_hexdump_nospc((void*)&vec->what, sizeof(vec->what))) - - append(rand); - append(autn); - append(ck); - append(ik); - append(res); - append(res_len); - append(kc); - append(sres); - append(auth_types); -#undef append - - return buf; -} - -#define VEC_IS(vec, expect) do { \ - char *_is = vec_str(vec); \ - if (strcmp(_is, expect)) { \ - fprintf(stderr, "MISMATCH! expected ==\n%s\n", \ - expect); \ - char *a = _is; \ - char *b = expect; \ - for (; *a && *b; a++, b++) { \ - if (*a != *b) { \ - fprintf(stderr, "mismatch at %d:\n", \ - (int)(a - _is)); \ - while (a > _is && *(a-1) != '\n') { \ - fprintf(stderr, " "); \ - a--; \ - } \ - fprintf(stderr, "v\n%s", a); \ - break; \ - } \ - } \ - OSMO_ASSERT(false); \ - } else \ - fprintf(stderr, "vector matches expectations\n"); \ - } while (0) - -uint8_t fake_rand[16] = { 0 }; -bool fake_rand_fixed = true; - -void next_rand(const char *hexstr, bool fixed) -{ - osmo_hexparse(hexstr, fake_rand, sizeof(fake_rand)); - fake_rand_fixed = fixed; -} - -int rand_get(uint8_t *rand, unsigned int len) -{ - int i; - OSMO_ASSERT(len <= sizeof(fake_rand)); - memcpy(rand, fake_rand, len); - if (!fake_rand_fixed) { - for (i = 0; i < len; i++) - fake_rand[i] += 0x11; - } - return len; -} - -static void test_gen_vectors_2g_only(void) -{ - struct osmo_sub_auth_data aud2g; - struct osmo_sub_auth_data aud3g; - struct osmo_auth_vector vec; - int rc; - - comment_start(); - - aud2g = (struct osmo_sub_auth_data){ - .type = OSMO_AUTH_TYPE_GSM, - .algo = OSMO_AUTH_ALG_COMP128v1, - }; - - osmo_hexparse("EB215756028D60E3275E613320AEC880", - aud2g.u.gsm.ki, sizeof(aud2g.u.gsm.ki)); - - aud3g = (struct osmo_sub_auth_data){ 0 }; - - next_rand("39fa2f4e3d523d8619a73b4f65c3e14d", true); - - vec = (struct osmo_auth_vector){ {0} }; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 1, "%d"); - - VEC_IS(&vec, - " rand: 39fa2f4e3d523d8619a73b4f65c3e14d\n" - " autn: 00000000000000000000000000000000\n" - " ck: 00000000000000000000000000000000\n" - " ik: 00000000000000000000000000000000\n" - " res: 00000000000000000000000000000000\n" - " res_len: 00\n" - " kc: 241a5b16aeb8e400\n" - " sres: 429d5b27\n" - " auth_types: 01000000\n" - ); - - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - - /* even though vec is not zero-initialized, it should produce the same - * result (regardless of the umts sequence nr) */ - aud3g.u.umts.sqn = 123; - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 1, "%d"); - - VEC_IS(&vec, - " rand: 39fa2f4e3d523d8619a73b4f65c3e14d\n" - " autn: 00000000000000000000000000000000\n" - " ck: 00000000000000000000000000000000\n" - " ik: 00000000000000000000000000000000\n" - " res: 00000000000000000000000000000000\n" - " res_len: 00\n" - " kc: 241a5b16aeb8e400\n" - " sres: 429d5b27\n" - " auth_types: 01000000\n" - ); - - comment_end(); -} - -static void test_gen_vectors_2g_plus_3g(void) -{ - struct osmo_sub_auth_data aud2g; - struct osmo_sub_auth_data aud3g; - struct osmo_auth_vector vec; - int rc; - - comment_start(); - - aud2g = (struct osmo_sub_auth_data){ - .type = OSMO_AUTH_TYPE_GSM, - .algo = OSMO_AUTH_ALG_COMP128v1, - }; - - osmo_hexparse("EB215756028D60E3275E613320AEC880", - aud2g.u.gsm.ki, sizeof(aud2g.u.gsm.ki)); - - aud3g = (struct osmo_sub_auth_data){ - .type = OSMO_AUTH_TYPE_UMTS, - .algo = OSMO_AUTH_ALG_MILENAGE, - }; - - osmo_hexparse("EB215756028D60E3275E613320AEC880", - aud3g.u.umts.k, sizeof(aud3g.u.umts.k)); - osmo_hexparse("FB2A3D1B360F599ABAB99DB8669F8308", - aud3g.u.umts.opc, sizeof(aud3g.u.umts.opc)); - next_rand("39fa2f4e3d523d8619a73b4f65c3e14d", true); - - vec = (struct osmo_auth_vector){ {0} }; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 1, "%d"); - - VEC_IS(&vec, - " rand: 39fa2f4e3d523d8619a73b4f65c3e14d\n" - " autn: 8704f5ba55f30000d2ee44b22c8ea919\n" - " ck: f64735036e5871319c679f4742a75ea1\n" - " ik: 27497388b6cb044648f396aa155b95ef\n" - " res: e229c19e791f2e410000000000000000\n" - " res_len: 08\n" - " kc: 241a5b16aeb8e400\n" - " sres: 429d5b27\n" - " auth_types: 03000000\n" - ); - - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 1, "%"PRIu64); - - /* even though vec is not zero-initialized, it should produce the same - * result with the same sequence nr */ - aud3g.u.umts.sqn = 0; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 1, "%d"); - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 1, "%"PRIu64); - - VEC_IS(&vec, - " rand: 39fa2f4e3d523d8619a73b4f65c3e14d\n" - " autn: 8704f5ba55f30000d2ee44b22c8ea919\n" - " ck: f64735036e5871319c679f4742a75ea1\n" - " ik: 27497388b6cb044648f396aa155b95ef\n" - " res: e229c19e791f2e410000000000000000\n" - " res_len: 08\n" - " kc: 241a5b16aeb8e400\n" - " sres: 429d5b27\n" - " auth_types: 03000000\n" - ); - - comment_end(); -} - -void _test_gen_vectors_3g_only__expect_vecs(struct osmo_auth_vector vecs[3]) -{ - fprintf(stderr, "[0]: "); - VEC_IS(&vecs[0], - " rand: 897210a0f7de278f0b8213098e098a3f\n" - " autn: c6b9790dad4b00000cf322869ea6a481\n" - " ck: e9922bd036718ed9e40bd1d02c3b81a5\n" - " ik: f19c20ca863137f8892326d959ec5e01\n" - " res: 9af5a557902d2db80000000000000000\n" - " res_len: 08\n" - " kc: 7526fc13c5976685\n" - " sres: 0ad888ef\n" - " auth_types: 03000000\n" - ); - fprintf(stderr, "[1]: "); - VEC_IS(&vecs[1], - " rand: 9a8321b108ef38a01c93241a9f1a9b50\n" - " autn: 79a5113eb0910000be6020540503ffc5\n" - " ck: 3686f05df057d1899c66ae4eb18cf941\n" - " ik: 79f21ed53bcb47787de57d136ff803a5\n" - " res: 43023475cb29292c0000000000000000\n" - " res_len: 08\n" - " kc: aef73dd515e86c15\n" - " sres: 882b1d59\n" - " auth_types: 03000000\n" - ); - fprintf(stderr, "[2]: "); - VEC_IS(&vecs[2], - " rand: ab9432c2190049b12da4352bb02bac61\n" - " autn: 24b018d46c3b00009c7e1b47f3a19b2b\n" - " ck: d86c3191a36fc0602e48202ef2080964\n" - " ik: 648dab72016181406243420649e63dc9\n" - " res: 010cab11cc63a6e40000000000000000\n" - " res_len: 08\n" - " kc: f0eaf8cb19e0758d\n" - " sres: cd6f0df5\n" - " auth_types: 03000000\n" - ); -} - -static void test_gen_vectors_3g_only(void) -{ - struct osmo_sub_auth_data aud2g; - struct osmo_sub_auth_data aud3g; - struct osmo_auth_vector vec; - struct osmo_auth_vector vecs[3]; - uint8_t auts[14]; - uint8_t rand_auts[16]; - int rc; - - comment_start(); - - aud2g = (struct osmo_sub_auth_data){ 0 }; - - aud3g = (struct osmo_sub_auth_data){ - .type = OSMO_AUTH_TYPE_UMTS, - .algo = OSMO_AUTH_ALG_MILENAGE, - }; - - osmo_hexparse("EB215756028D60E3275E613320AEC880", - aud3g.u.umts.k, sizeof(aud3g.u.umts.k)); - osmo_hexparse("FB2A3D1B360F599ABAB99DB8669F8308", - aud3g.u.umts.opc, sizeof(aud3g.u.umts.opc)); - next_rand("39fa2f4e3d523d8619a73b4f65c3e14d", true); - - vec = (struct osmo_auth_vector){ {0} }; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 1, "%d"); - - VEC_IS(&vec, - " rand: 39fa2f4e3d523d8619a73b4f65c3e14d\n" - " autn: 8704f5ba55f30000d2ee44b22c8ea919\n" - " ck: f64735036e5871319c679f4742a75ea1\n" - " ik: 27497388b6cb044648f396aa155b95ef\n" - " res: e229c19e791f2e410000000000000000\n" - " res_len: 08\n" - " kc: 059a4f668f6fbe39\n" - " sres: 9b36efdf\n" - " auth_types: 03000000\n" - ); - - /* Note: 3GPP TS 33.102 6.8.1.2: c3 function to get GSM auth is - * KC[0..7] == CK[0..7] ^ CK[8..15] ^ IK[0..7] ^ IK[8..15] - * In [16]: hex( 0xf64735036e587131 - * ^ 0x9c679f4742a75ea1 - * ^ 0x27497388b6cb0446 - * ^ 0x48f396aa155b95ef) - * Out[16]: '0x59a4f668f6fbe39L' - * hence expecting kc: 059a4f668f6fbe39 - */ - - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 1, "%"PRIu64); - - /* even though vec is not zero-initialized, it should produce the same - * result with the same sequence nr */ - aud3g.u.umts.sqn = 0; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 1, "%d"); - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 1, "%"PRIu64); - - VEC_IS(&vec, - " rand: 39fa2f4e3d523d8619a73b4f65c3e14d\n" - " autn: 8704f5ba55f30000d2ee44b22c8ea919\n" - " ck: f64735036e5871319c679f4742a75ea1\n" - " ik: 27497388b6cb044648f396aa155b95ef\n" - " res: e229c19e791f2e410000000000000000\n" - " res_len: 08\n" - " kc: 059a4f668f6fbe39\n" - " sres: 9b36efdf\n" - " auth_types: 03000000\n" - ); - - - fprintf(stderr, "- test AUTS resync\n"); - vec = (struct osmo_auth_vector){}; - aud3g.u.umts.sqn = 0; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 0, "%"PRIu64); - - /* The AUTN sent was 8704f5ba55f30000d2ee44b22c8ea919 - * with the first 6 bytes being SQN ^ AK. - * K = EB215756028D60E3275E613320AEC880 - * OPC = FB2A3D1B360F599ABAB99DB8669F8308 - * RAND = 39fa2f4e3d523d8619a73b4f65c3e14d - * --milenage-f5--> - * AK = 8704f5ba55f3 - * - * The first six bytes are 8704f5ba55f3, - * and 8704f5ba55f3 ^ AK = 0. - * --> SQN = 0. - * - * Say the USIM doesn't like that, let's say it is at SQN 23. - * SQN_MS = 000000000017 - * - * AUTS = Conc(SQN_MS) || MAC-S - * Conc(SQN_MS) = SQN_MS ⊕ f5*[K](RAND) - * MAC-S = f1*[K] (SQN MS || RAND || AMF) - * - * f5*--> Conc(SQN_MS) = 000000000017 ^ 979498b1f73a - * = 979498b1f72d - * AMF = 0000 (TS 33.102 v7.0.0, 6.3.3) - * - * MAC-S = f1*[K] (000000000017 || 39fa2f4e3d523d8619a73b4f65c3e14d || 0000) - * = 3e28c59fa2e72f9c - * - * AUTS = 979498b1f72d || 3e28c59fa2e72f9c - * - * verify valid AUTS resulting in SQN 23 with: - * osmo-auc-gen -3 -a milenage -k EB215756028D60E3275E613320AEC880 \ - * -o FB2A3D1B360F599ABAB99DB8669F8308 \ - * -r 39fa2f4e3d523d8619a73b4f65c3e14d \ - * -A 979498b1f72d3e28c59fa2e72f9c - */ - - /* AUTS response by USIM */ - osmo_hexparse("979498b1f72d3e28c59fa2e72f9c", - auts, sizeof(auts)); - /* RAND sent to USIM, which AUTS was generated from */ - osmo_hexparse("39fa2f4e3d523d8619a73b4f65c3e14d", - rand_auts, sizeof(rand_auts)); - /* new RAND token for the next key */ - next_rand("897210a0f7de278f0b8213098e098a3f", true); - rc = auc_compute_vectors(&vec, 1, &aud2g, &aud3g, rand_auts, auts); - VERBOSE_ASSERT(rc, == 1, "%d"); - /* The USIM's last sqn was 23, the calculated vector was 24, hence the - * next one stored should be 25. */ - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 25, "%"PRIu64); - - VEC_IS(&vec, - " rand: 897210a0f7de278f0b8213098e098a3f\n" - " autn: c6b9790dad4b00000cf322869ea6a481\n" - " ck: e9922bd036718ed9e40bd1d02c3b81a5\n" - " ik: f19c20ca863137f8892326d959ec5e01\n" - " res: 9af5a557902d2db80000000000000000\n" - " res_len: 08\n" - " kc: 7526fc13c5976685\n" - " sres: 0ad888ef\n" - " auth_types: 03000000\n" - ); - - - fprintf(stderr, "- verify N vectors with AUTS resync" - " == N vectors without AUTS\n" - "First just set rand and sqn = 24, and compute 3 vectors\n"); - next_rand("897210a0f7de278f0b8213098e098a3f", false); - aud3g.u.umts.sqn = 24; - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 24, "%"PRIu64); - - memset(vecs, 0, sizeof(vecs)); - rc = auc_compute_vectors(vecs, 3, &aud2g, &aud3g, NULL, NULL); - VERBOSE_ASSERT(rc, == 3, "%d"); - VERBOSE_ASSERT(aud3g.u.umts.sqn, == 27, "%"PRIu64); - - _test_gen_vectors_3g_only__expect_vecs(vecs); - - fprintf(stderr, "Now reach sqn = 24 with AUTS and expect the same\n"); - /* AUTS response by USIM */ - osmo_hexparse("979498b1f72d3e28c59fa2e72f9c", - auts, sizeof(auts)); - /* RAND sent to USIM, which AUTS was generated from */ - osmo_hexparse("39fa2f4e3d523d8619a73b4f65c3e14d", - rand_auts, sizeof(rand_auts)); - next_rand("897210a0f7de278f0b8213098e098a3f", false); - rc = auc_compute_vectors(vecs, 3, &aud2g, &aud3g, rand_auts, auts); - - _test_gen_vectors_3g_only__expect_vecs(vecs); - - comment_end(); -} - -void test_gen_vectors_bad_args() -{ - struct osmo_auth_vector vec; - uint8_t auts[14]; - uint8_t rand_auts[16]; - int rc; - int i; - - struct osmo_sub_auth_data aud2g = { - .type = OSMO_AUTH_TYPE_GSM, - .algo = OSMO_AUTH_ALG_COMP128v1, - }; - - struct osmo_sub_auth_data aud3g = { - .type = OSMO_AUTH_TYPE_UMTS, - .algo = OSMO_AUTH_ALG_MILENAGE, - }; - - struct osmo_sub_auth_data aud2g_noalg = { - .type = OSMO_AUTH_TYPE_GSM, - .algo = OSMO_AUTH_ALG_NONE, - }; - - struct osmo_sub_auth_data aud3g_noalg = { - .type = OSMO_AUTH_TYPE_UMTS, - .algo = OSMO_AUTH_ALG_NONE, - }; - - struct osmo_sub_auth_data aud_notype = { - .type = OSMO_AUTH_TYPE_NONE, - .algo = OSMO_AUTH_ALG_MILENAGE, - }; - - struct osmo_sub_auth_data no_aud = { - .type = OSMO_AUTH_TYPE_NONE, - .algo = OSMO_AUTH_ALG_NONE, - }; - - struct { - struct osmo_sub_auth_data *aud2g; - struct osmo_sub_auth_data *aud3g; - uint8_t *rand_auts; - uint8_t *auts; - const char *label; - } tests[] = { - { NULL, NULL, NULL, NULL, "no auth data (a)"}, - { NULL, &aud3g_noalg, NULL, NULL, "no auth data (b)"}, - { NULL, &aud_notype, NULL, NULL, "no auth data (c)"}, - { NULL, &no_aud, NULL, NULL, "no auth data (d)"}, - { &aud2g_noalg, NULL, NULL, NULL, "no auth data (e)"}, - { &aud2g_noalg, &aud3g_noalg, NULL, NULL, "no auth data (f)"}, - { &aud2g_noalg, &aud_notype, NULL, NULL, "no auth data (g)"}, - { &aud2g_noalg, &no_aud, NULL, NULL, "no auth data (h)"}, - { &aud_notype, NULL, NULL, NULL, "no auth data (i)"}, - { &aud_notype, &aud3g_noalg, NULL, NULL, "no auth data (j)"}, - { &aud_notype, &aud_notype, NULL, NULL, "no auth data (k)"}, - { &aud_notype, &no_aud, NULL, NULL, "no auth data (l)"}, - { &no_aud, NULL, NULL, NULL, "no auth data (m)"}, - { &no_aud, &aud3g_noalg, NULL, NULL, "no auth data (n)"}, - { &no_aud, &aud_notype, NULL, NULL, "no auth data (o)"}, - { &no_aud, &no_aud, NULL, NULL, "no auth data (p)"}, - { &aud3g, NULL, NULL, NULL, "wrong auth data type (a)"}, - { &aud3g, &aud3g_noalg, NULL, NULL, "wrong auth data type (b)"}, - { &aud3g, &aud_notype, NULL, NULL, "wrong auth data type (c)"}, - { &aud3g, &no_aud, NULL, NULL, "wrong auth data type (d)"}, - { NULL, &aud2g, NULL, NULL, "wrong auth data type (e)"}, - { &aud3g_noalg, &aud2g, NULL, NULL, "wrong auth data type (f)"}, - { &aud_notype, &aud2g, NULL, NULL, "wrong auth data type (g)"}, - { &no_aud, &aud2g, NULL, NULL, "wrong auth data type (h)"}, - { &aud3g, &aud2g, NULL, NULL, "wrong auth data type (i)"}, - { &aud3g, &aud3g, NULL, NULL, "wrong auth data type (j)"}, - { &aud2g, &aud2g, NULL, NULL, "wrong auth data type (k)"}, - { &aud2g, NULL, rand_auts, auts, "AUTS for 2G-only (a)"}, - { &aud2g, &aud3g_noalg, rand_auts, auts, "AUTS for 2G-only (b)"}, - { &aud2g, &aud_notype, rand_auts, auts, "AUTS for 2G-only (c)"}, - { &aud2g, &no_aud, rand_auts, auts, "AUTS for 2G-only (d)"}, - { NULL, &aud3g, NULL, auts, "incomplete AUTS (a)"}, - { NULL, &aud3g, rand_auts, NULL, "incomplete AUTS (b)"}, - { &aud2g, &aud3g, NULL, auts, "incomplete AUTS (c)"}, - { &aud2g, &aud3g, rand_auts, NULL, "incomplete AUTS (d)"}, - }; - - comment_start(); - - for (i = 0; i < ARRAY_SIZE(tests); i++) { - fprintf(stderr, "\n- %s\n", tests[i].label); - rc = auc_compute_vectors(&vec, 1, - tests[i].aud2g, - tests[i].aud3g, - tests[i].rand_auts, - tests[i].auts); - VERBOSE_ASSERT(rc, < 0, "%d"); - } - - comment_end(); -} - -static struct { - bool verbose; -} cmdline_opts = { - .verbose = false, -}; - -static void print_help(const char *program) -{ - printf("Usage:\n" - " %s [-v] [N [N...]]\n" - "Options:\n" - " -h --help show this text.\n" - " -v --verbose print source file and line numbers\n", - program - ); -} - -static void handle_options(int argc, char **argv) -{ - while (1) { - int option_index = 0, c; - static struct option long_options[] = { - {"help", 0, 0, 'h'}, - {"verbose", 1, 0, 'v'}, - {0, 0, 0, 0} - }; - - c = getopt_long(argc, argv, "hv", - long_options, &option_index); - if (c == -1) - break; - - switch (c) { - case 'h': - print_help(argv[0]); - exit(0); - case 'v': - cmdline_opts.verbose = true; - break; - default: - /* catch unknown options *as well as* missing arguments. */ - fprintf(stderr, "Error in command line options. Exiting.\n"); - exit(-1); - break; - } - } - - if (optind < argc) { - fprintf(stderr, "too many args\n"); - exit(-1); - } -} - -int main(int argc, char **argv) -{ - printf("auc_3g_test.c\n"); - - handle_options(argc, argv); - - osmo_init_logging(&hlr_log_info); - log_set_print_filename(osmo_stderr_target, cmdline_opts.verbose); - log_set_print_timestamp(osmo_stderr_target, 0); - log_set_use_color(osmo_stderr_target, 0); - log_set_print_category(osmo_stderr_target, 1); - - test_gen_vectors_2g_only(); - test_gen_vectors_2g_plus_3g(); - test_gen_vectors_3g_only(); - test_gen_vectors_bad_args(); - - printf("Done\n"); - return 0; -} |