diff options
| -rw-r--r-- | include/osmocom/gsm/sysinfo.h | 5 | ||||
| -rw-r--r-- | src/gsm/libosmogsm.map | 1 | ||||
| -rw-r--r-- | src/gsm/sysinfo.c | 27 | 
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;  | 
