summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--include/osmocom/gsm/sysinfo.h5
-rw-r--r--src/gsm/libosmogsm.map1
-rw-r--r--src/gsm/sysinfo.c27
3 files changed, 26 insertions, 7 deletions
diff --git a/include/osmocom/gsm/sysinfo.h b/include/osmocom/gsm/sysinfo.h
index c7972f48..f3e0f22f 100644
--- a/include/osmocom/gsm/sysinfo.h
+++ b/include/osmocom/gsm/sysinfo.h
@@ -1,6 +1,8 @@
#pragma once
#include <stdbool.h>
+
+#include <osmocom/core/defs.h>
#include <osmocom/core/utils.h>
#include <osmocom/gsm/protocol/gsm_04_08.h>
@@ -66,7 +68,8 @@ typedef uint8_t sysinfo_buf_t[GSM_MACBLOCK_LEN];
extern const struct value_string osmo_sitype_strs[_MAX_SYSINFO_TYPE];
int osmo_earfcn_add(struct osmo_earfcn_si2q *e, uint16_t arfcn, uint8_t meas_bw);
int osmo_earfcn_del(struct osmo_earfcn_si2q *e, uint16_t arfcn);
-size_t osmo_earfcn_bit_size(const struct osmo_earfcn_si2q *e);
+size_t osmo_earfcn_bit_size(const struct osmo_earfcn_si2q *e) OSMO_DEPRECATED("Use osmo_earfcn_bit_size_ext()instead.");
+size_t osmo_earfcn_bit_size_ext(const struct osmo_earfcn_si2q *e, size_t offset);
void osmo_earfcn_init(struct osmo_earfcn_si2q *e);
uint8_t osmo_sitype2rsl(enum osmo_sysinfo_type si_type);
enum osmo_sysinfo_type osmo_rsl2sitype(uint8_t rsl_si);
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index 97fd2b45..8fb9878a 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -48,6 +48,7 @@ dbm2rxlev;
osmo_earfcn_add;
osmo_earfcn_del;
osmo_earfcn_bit_size;
+osmo_earfcn_bit_size_ext;
osmo_earfcn_init;
gprs_cipher_gen_input_i;
diff --git a/src/gsm/sysinfo.c b/src/gsm/sysinfo.c
index 3ec54448..b5ebd57d 100644
--- a/src/gsm/sysinfo.c
+++ b/src/gsm/sysinfo.c
@@ -151,15 +151,30 @@ int osmo_earfcn_add(struct osmo_earfcn_si2q *e, uint16_t arfcn, uint8_t meas_bw)
*/
size_t osmo_earfcn_bit_size(const struct osmo_earfcn_si2q *e)
{
+ return osmo_earfcn_bit_size_ext(e, 0);
+}
+
+/*! \brief Return number of bits necessary to represent earfcn struct as
+ * Repeated E-UTRAN Neighbour Cells IE from 3GPP TS 44.018 Table 10.5.2.33b.1
+ * \param[in,out] e earfcn struct
+ * \param[in] offset into earfcn struct: how many EARFCNs to skip while estimating size
+ * \returns number of bits
+ */
+size_t osmo_earfcn_bit_size_ext(const struct osmo_earfcn_si2q *e, size_t offset)
+{
/* 1 stop bit + 5 bits for THRESH_E-UTRAN_high */
- size_t i, bits = 6;
+ size_t i, bits = 6, skip = 0;
for (i = 0; i < e->length; i++) {
if (e->arfcn[i] != OSMO_EARFCN_INVALID) {
- bits += 17;
- if (OSMO_EARFCN_MEAS_INVALID == e->meas_bw[i])
- bits++;
- else
- bits += 4;
+ if (skip < offset)
+ skip++;
+ else {
+ bits += 17;
+ if (OSMO_EARFCN_MEAS_INVALID == e->meas_bw[i])
+ bits++;
+ else
+ bits += 4;
+ }
}
}
bits += (e->prio_valid) ? 4 : 1;