aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/libbsc/rest_octets.c2
-rw-r--r--src/libbsc/system_information.c22
2 files changed, 11 insertions, 13 deletions
diff --git a/src/libbsc/rest_octets.c b/src/libbsc/rest_octets.c
index b1516ecc4..a22b8e674 100644
--- a/src/libbsc/rest_octets.c
+++ b/src/libbsc/rest_octets.c
@@ -303,7 +303,7 @@ static inline int try_adding_uarfcn(struct bitvec *bv, struct gsm_bts *bts, uint
static inline void append_uarfcns(struct bitvec *bv, struct gsm_bts *bts, uint8_t budget)
{
const uint16_t *u = bts->si_common.data.uarfcn_list;
- int i, rem = budget - 7, st = 0; /* account for constant bits right away */
+ int i, rem = budget - 7, st = bts->u_offset; /* account for constant bits right away */
uint16_t cu = u[bts->u_offset]; /* caller ensures that length is positive */
OSMO_ASSERT(budget <= SI2Q_MAX_LEN);
diff --git a/src/libbsc/system_information.c b/src/libbsc/system_information.c
index 761e8482b..91e993de7 100644
--- a/src/libbsc/system_information.c
+++ b/src/libbsc/system_information.c
@@ -280,7 +280,7 @@ int bts_uarfcn_del(struct gsm_bts *bts, uint16_t arfcn, uint16_t scramble)
int bts_uarfcn_add(struct gsm_bts *bts, uint16_t arfcn, uint16_t scramble, bool diversity)
{
- size_t len = bts->si_common.uarfcn_length, i, k = 0;
+ size_t len = bts->si_common.uarfcn_length, i;
uint8_t si2q;
int pos = uarfcn_sc_pos(bts, arfcn, scramble);
uint16_t scr = diversity ? encode_fdd(scramble, true) : encode_fdd(scramble, false),
@@ -297,20 +297,17 @@ int bts_uarfcn_add(struct gsm_bts *bts, uint16_t arfcn, uint16_t scramble, bool
pos = uarfcn_sc_pos(bts, arfcn, SC_BOUND);
i = (pos < 0) ? len : pos;
- for (k = 0; i < len; i++)
- if (scr > scl[i])
- k = i + 1;
-
- /* we keep lists sorted by scramble code of a given UARFCN:
- insert into appropriate position and move the tail */
- if (len - k) {
- memmove(ual + k + 1, ual + k, (len - k) * 2);
- memmove(scl + k + 1, scl + k, (len - k) * 2);
+ /* move the tail to make space for inserting if necessary */
+ if (i < len) {
+ memmove(ual + i + 1, ual + i, (len - i) * 2);
+ memmove(scl + i + 1, scl + i, (len - i) * 2);
}
- ual[k] = arfcn;
- scl[k] = scr;
+ /* insert into appropriate position */
+ ual[i] = arfcn;
+ scl[i] = scr;
bts->si_common.uarfcn_length++;
+ /* try to generate SI2q */
si2q = si2q_num(bts);
if (si2q <= SI2Q_MAX_NUM) {
@@ -318,6 +315,7 @@ int bts_uarfcn_add(struct gsm_bts *bts, uint16_t arfcn, uint16_t scramble, bool
return 0;
}
+ /* rollback after unsuccessful generation */
bts_uarfcn_del(bts, arfcn, scramble);
return -ENOSPC;
}