From 845a3a4c594f56fc754eae3b261675b460aec2ac Mon Sep 17 00:00:00 2001 From: Max Date: Mon, 15 May 2017 12:02:29 +0200 Subject: [PATCH] SI2quater: fix EARFCN inclusion check Previously only the existance of bts->si_common.si2quater_neigh_list was checked but not the actual number of EARFCNs in it. Fix it by using si2q_earfcn_count() and adjust tests accordingly. While at it - reformat tests to include extra information. The correctness was checked manually by inspecting GSMTAP output. Change-Id: Ic4fb2a9e870db66cac58b1e8d113587b30d64ce2 Related: RT#8792 --- openbsc/src/libbsc/rest_octets.c | 3 +- openbsc/src/libbsc/system_information.c | 7 +- openbsc/tests/gsm0408/gsm0408_test.c | 33 ++++++++-- openbsc/tests/gsm0408/gsm0408_test.ok | 85 +++++++++++++++++-------- 4 files changed, 93 insertions(+), 35 deletions(-) diff --git a/openbsc/src/libbsc/rest_octets.c b/openbsc/src/libbsc/rest_octets.c index 950e57006..a6fdf46fe 100644 --- a/openbsc/src/libbsc/rest_octets.c +++ b/openbsc/src/libbsc/rest_octets.c @@ -379,14 +379,13 @@ int rest_octets_si2quater(uint8_t *data, struct gsm_bts *bts) /* No GPRS_3G_MEASUREMENT Parameters Descr. */ bitvec_set_bit(&bv, 0); - if (&bts->si_common.si2quater_neigh_list) { /* FIXME: use si2q_earfcn_count() in if */ + if (si2q_earfcn_count(&bts->si_common.si2quater_neigh_list)) { append_earfcn(&bv, bts, SI2Q_MAX_LEN - bv.cur_bit); /* FIXME: remove following check once multiple SI2q are properly supported */ if ((bts->e_offset != si2q_earfcn_count(&bts->si_common.si2quater_neigh_list)) || si2q_earfcn_count(&bts->si_common.si2quater_neigh_list) > 5) return -ENOMEM; - } else { /* No Additions in Rel-5: */ bitvec_set_bit(&bv, L); diff --git a/openbsc/src/libbsc/system_information.c b/openbsc/src/libbsc/system_information.c index 0496506b6..644bebdf4 100644 --- a/openbsc/src/libbsc/system_information.c +++ b/openbsc/src/libbsc/system_information.c @@ -692,6 +692,10 @@ static inline bool si2quater_not_needed(struct gsm_bts *bts) size_t si2q_earfcn_count(const struct osmo_earfcn_si2q *e) { unsigned i, ret = 0; + + if (!e) + return 0; + for (i = 0; i < e->length; i++) if (e->arfcn[i] != OSMO_EARFCN_INVALID) ret++; @@ -777,7 +781,8 @@ static int generate_si3(enum osmo_sysinfo_type t, struct gsm_bts *bts) si_info.si2ter_indicator = 0; } if ((bts->si_valid & (1 << SYSINFO_TYPE_2quater))) { - LOGP(DRR, LOGL_INFO, "SI 2quater is included.\n"); + LOGP(DRR, LOGL_INFO, "SI 2quater is included, based on %zu EARFCNs and %zu UARFCNs.\n", + si2q_earfcn_count(&bts->si_common.si2quater_neigh_list), bts->si_common.uarfcn_length); si_info.si2quater_indicator = 1; } else { si_info.si2quater_indicator = 0; diff --git a/openbsc/tests/gsm0408/gsm0408_test.c b/openbsc/tests/gsm0408/gsm0408_test.c index 265e4b20c..36f6993be 100644 --- a/openbsc/tests/gsm0408/gsm0408_test.c +++ b/openbsc/tests/gsm0408/gsm0408_test.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -86,23 +87,43 @@ static void test_location_area_identifier(void) static inline void gen(struct gsm_bts *bts, const char *s) { + int r; + bts->u_offset = 0; bts->e_offset = 0; bts->si2q_index = 0; bts->si2q_count = 0; bts->si_valid = 0; bts->si_valid |= (1 << SYSINFO_TYPE_2quater); + /* should be no-op as entire buffer is filled with padding: */ memset(GSM_BTS_SI(bts, SYSINFO_TYPE_2quater), 0xAE, GSM_MACBLOCK_LEN); - int r = gsm_generate_si(bts, SYSINFO_TYPE_2quater); - bool v = bts->si_valid & (1 << SYSINFO_TYPE_2quater); + + printf("generating SI2quater for %zu EARFCNs and %zu UARFCNs...\n", + si2q_earfcn_count(&bts->si_common.si2quater_neigh_list), bts->si_common.uarfcn_length); + + r = gsm_generate_si(bts, SYSINFO_TYPE_2quater); if (r > 0) - printf("generated %s SI2quater: [%d] %s\n", - v ? "valid" : "invalid", r, osmo_hexdump(GSM_BTS_SI(bts, SYSINFO_TYPE_2quater), r)); + printf("generated %s SI2quater [%02u/%02u]: [%d] %s\n", + (bts->si_valid & (1 << SYSINFO_TYPE_2quater)) ? "valid" : "invalid", + bts->si2q_index, bts->si2q_count, r, + osmo_hexdump((void *)GSM_BTS_SI2Q(bts), GSM_MACBLOCK_LEN)); else printf("%s() failed to generate SI2quater: %s\n", s, strerror(-r)); } +static inline void del_earfcn_b(struct gsm_bts *bts, uint16_t earfcn) +{ + struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list; + int r = osmo_earfcn_del(e, earfcn); + if (r) + printf("failed to remove EARFCN %u: %s\n", earfcn, strerror(-r)); + else + printf("removed EARFCN %u - ", earfcn); + + gen(bts, __func__); +} + static inline void add_earfcn_b(struct gsm_bts *bts, uint16_t earfcn, uint8_t bw) { struct osmo_earfcn_si2q *e = &bts->si_common.si2quater_neigh_list; @@ -208,7 +229,9 @@ static inline void test_si2q_e(void) osmo_earfcn_init(&bts->si_common.si2quater_neigh_list); /* first generate invalid SI as no EARFCN added */ gen(bts, __func__); - /* subsequent calls should produce valid SI if there's enough memory */ + /* subsequent calls should produce valid SI if there's enough memory and EARFCNs */ + add_earfcn_b(bts, 1917, 5); + del_earfcn_b(bts, 1917); add_earfcn_b(bts, 1917, 1); add_earfcn_b(bts, 1932, OSMO_EARFCN_MEAS_INVALID); add_earfcn_b(bts, 1937, 2); diff --git a/openbsc/tests/gsm0408/gsm0408_test.ok b/openbsc/tests/gsm0408/gsm0408_test.ok index 5f9398b35..5e0b9d50e 100644 --- a/openbsc/tests/gsm0408/gsm0408_test.ok +++ b/openbsc/tests/gsm0408/gsm0408_test.ok @@ -63,39 +63,70 @@ Allocated reference: 255 Allocated reference: 0 Allocated reference: 1 Test SI2quater UARFCN (same scrambling code and diversity): -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 88 0a 7e 10 99 64 00 0b 2b 2b 2b 2b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 e8 0a 7f 52 88 0a 7e 10 99 64 00 0b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 e8 0a 7f 52 88 0a 7e 10 99 64 00 0b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 1 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 88 0a 7e 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 2 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 e8 0a 7f 52 88 0a 7e 0b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 2 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 e8 0a 7f 52 88 0a 7e 0b 2b 2b 2b 2b 2b 2b 2b 2b Testing SYSINFO_TYPE_2quater EARFCN generation: -generated invalid SI2quater: [23] ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae -added EARFCN 1917 - generated valid SI2quater: [23] 59 06 07 c0 00 04 86 59 83 be c8 50 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b -added EARFCN 1932 - generated valid SI2quater: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 30 14 03 2b 2b 2b 2b 2b 2b 2b 2b -added EARFCN 1937 - generated valid SI2quater: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 31 07 91 a0 a0 2b 2b 2b 2b 2b 2b -added EARFCN 1945 - generated valid SI2quater: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 31 07 91 a8 3c c8 28 0b 2b 2b 2b -added EARFCN 1965 - generated valid SI2quater: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 31 07 91 a8 3c ca 0f 5a 0a 03 2b -added EARFCN 1967 - add_earfcn_b() failed to generate SI2quater: Cannot allocate memory -added EARFCN 1982 - add_earfcn_b() failed to generate SI2quater: Cannot allocate memory +generating SI2quater for 0 EARFCNs and 0 UARFCNs... +generated invalid SI2quater [00/00]: [23] ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae +added EARFCN 1917 - generating SI2quater for 1 EARFCNs and 0 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 04 86 59 83 be e8 50 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +removed EARFCN 1917 - generating SI2quater for 0 EARFCNs and 0 UARFCNs... +generated invalid SI2quater [00/00]: [23] ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae +added EARFCN 1917 - generating SI2quater for 1 EARFCNs and 0 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 04 86 59 83 be c8 50 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +added EARFCN 1932 - generating SI2quater for 2 EARFCNs and 0 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 30 14 03 2b 2b 2b 2b 2b 2b 2b 2b +added EARFCN 1937 - generating SI2quater for 3 EARFCNs and 0 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 31 07 91 a0 a0 2b 2b 2b 2b 2b 2b +added EARFCN 1945 - generating SI2quater for 4 EARFCNs and 0 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 31 07 91 a8 3c c8 28 0b 2b 2b 2b +added EARFCN 1965 - generating SI2quater for 5 EARFCNs and 0 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 04 86 59 83 be cc 1e 31 07 91 a8 3c ca 0f 5a 0a 03 2b +added EARFCN 1967 - generating SI2quater for 6 EARFCNs and 0 UARFCNs... +add_earfcn_b() failed to generate SI2quater: Cannot allocate memory +added EARFCN 1982 - generating SI2quater for 7 EARFCNs and 0 UARFCNs... +add_earfcn_b() failed to generate SI2quater: Cannot allocate memory Testing SYSINFO_TYPE_2quater UARFCN generation: -generated invalid SI2quater: [23] ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 0c 1a 10 99 64 00 0b 2b 2b 2b 2b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 14 1a 1f 00 44 b2 00 03 2b 2b 2b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 18 58 12 f0 84 86 59 00 03 2b 2b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 20 58 2e f0 f2 04 86 59 00 03 2b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 28 58 2e 22 f2 4e 84 86 59 00 03 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 34 1a 64 26 5d f2 05 04 86 59 00 03 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 38 58 12 22 fd ce 8e 05 04 86 59 00 03 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 40 58 1d 22 fa ce 88 85 7b 00 44 b2 00 03 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 4c 7a 34 0e 64 77 85 43 55 c8 10 99 64 00 0b +generating SI2quater for 0 EARFCNs and 0 UARFCNs... +generated invalid SI2quater [00/00]: [23] ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae ae +generating SI2quater for 0 EARFCNs and 1 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 0c 1a 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 2 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 14 1a 1f 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 3 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 18 58 12 f0 83 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 4 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 20 58 2e f0 f2 03 2b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 5 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 28 58 2e 22 f2 4e 83 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 6 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 34 1a 64 26 5d f2 05 03 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 7 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 38 58 12 22 fd ce 8e 05 03 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 8 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 40 58 1d 22 fa ce 88 85 7b 0b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 9 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 4c 7a 34 0e 64 77 85 43 55 c8 0b 2b 2b 2b 2b failed to add UARFCN to SI2quater: No space left on device failed to add UARFCN to SI2quater: No space left on device -generated valid SI2quater: [23] 59 06 07 c0 00 25 0f 7c 4c 7a 34 0e 64 77 85 43 55 c8 10 99 64 00 0b +generating SI2quater for 0 EARFCNs and 9 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 0f 7c 4c 7a 34 0e 64 77 85 43 55 c8 0b 2b 2b 2b 2b Test SI2quater multiple UARFCNs: -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 88 0a 7c 10 99 64 00 0b 2b 2b 2b 2b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 e8 0a 7f 52 88 0a 7c 10 99 64 00 0b 2b 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 e8 12 7e e0 a9 44 05 3e 00 44 b2 00 03 2b 2b 2b -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 e8 18 3f f4 90 54 a2 02 9f 04 86 59 00 03 2b 2b +generating SI2quater for 0 EARFCNs and 1 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 88 0a 7c 0b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 2 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 e8 0a 7f 52 88 0a 7c 0b 2b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 3 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 e8 12 7e e0 a9 44 05 3e 0b 2b 2b 2b 2b 2b 2b 2b +generating SI2quater for 0 EARFCNs and 4 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 e8 18 3f f4 90 54 a2 02 9f 03 2b 2b 2b 2b 2b 2b failed to add UARFCN to SI2quater: No space left on device failed to add UARFCN to SI2quater: No space left on device failed to add UARFCN to SI2quater: No space left on device -generated valid SI2quater: [23] 59 06 07 c0 00 25 52 e8 18 3f f4 90 54 a2 02 9f 04 86 59 00 03 2b 2b +generating SI2quater for 0 EARFCNs and 4 UARFCNs... +generated valid SI2quater [00/00]: [23] 59 06 07 c0 00 25 52 e8 18 3f f4 90 54 a2 02 9f 03 2b 2b 2b 2b 2b 2b Done.