bitvec2freq_list(): fix handling of E-GSM ARFCNs

According to 3GPP TS 44.018, section 10.5.2.1b.2, only ARFCN values
in range 1..124 can be encoded using the 'bit map 0' format.  Before
this patch, ARFCN values belonging to E-GSM band (0, 975..1023) were
ignored in bitvec2freq_list(), and thus not present in the resulting
Cell Channel Description IE.

Change-Id: I17739e6845cd84e2a81bc406dd532541f7c52cb6
Related: SYS#5854
This commit is contained in:
Vadim Yanitskiy 2022-03-02 01:58:00 +07:00
parent 44c8e83591
commit 20ae1be3f7
2 changed files with 19 additions and 10 deletions

View File

@ -504,20 +504,29 @@ static int bitvec2freq_list(uint8_t *chan_list, const struct bitvec *bv,
bool pgsm = false;
memset(chan_list, 0, 16);
if (bts->band == GSM_BAND_900
&& bts->c0->arfcn >= 1 && bts->c0->arfcn <= 124)
/* According to 3GPP TS 44.018, section 10.5.2.1b.2, only ARFCN values
* in range 1..124 can be encoded using the 'bit map 0' format. */
if (bts->band == GSM_BAND_900)
pgsm = true;
/* Check presence of E-GSM ARFCN 0 */
if (pgsm && bitvec_get_bit_pos(bv, 0) == ONE)
pgsm = false;
/* Check presence of E-GSM ARFCNs 975..1023 */
for (i = 975; pgsm && i <= 1023; i++) {
if (bitvec_get_bit_pos(bv, i) == ONE)
pgsm = false;
}
/* P-GSM-only handsets only support 'bit map 0 format' */
if (!bis && !ter && pgsm) {
chan_list[0] = 0;
for (i = 0; i < bv->data_len*8; i++) {
if (i >= 1 && i <= 124
&& bitvec_get_bit_pos(bv, i)) {
rc = freq_list_bm0_set_arfcn(chan_list, i);
if (rc < 0)
return rc;
}
for (i = 1; i <= 124; i++) {
if (!bitvec_get_bit_pos(bv, i))
continue;
rc = freq_list_bm0_set_arfcn(chan_list, i);
if (rc < 0)
return rc;
}
return 0;
}

View File

@ -191,6 +191,6 @@ BTS allocation OK in test_cell_chan_desc()
Testing generation of the Cell Channel Description IE:
Case a) only the BCCH carrier: 10
Case b) more carriers from P-GSM band: 1 3 10 64 99 124
Case c) more carriers from E-GSM band: 1 3 10 64 99 124
Case c) more carriers from E-GSM band: 0 3 10 64 99 124 975 1001 1023
BTS deallocated OK in test_cell_chan_desc()
Done.