diff mbox

[2/2] Add basic EARFCN support

Message ID 1458146098-26896-2-git-send-email-msuraev@sysmocom.de
State Superseded
Headers show

Commit Message

Max March 16, 2016, 4:34 p.m. UTC
From: Max <msuraev@sysmocom.de>

Add structure representing group of EARFCNs with common priority,
threshold etc.
Add functions to populate this structure.
---
 include/osmocom/gsm/sysinfo.h | 32 ++++++++++++++++++++++++++++-
 src/gsm/libosmogsm.map        |  4 ++++
 src/gsm/sysinfo.c             | 47 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 82 insertions(+), 1 deletion(-)

Comments

Harald Welte March 16, 2016, 6:48 p.m. UTC | #1
Hi Max,

On Wed, Mar 16, 2016 at 05:34:58PM +0100, msuraev@sysmocom.de wrote:
> +/* EARFCN (16 bits) array */
> +	uint16_t *arfcn;

comment should have same indent as the struct member

> +	for (i = 0; i < e->length; i++)
> +		if (OSMO_EARFCN_INVALID == e->arfcn[i]) {

missing {} around the indented if block.  The rule is (please check
Linux kernel coding style) that only if there is a single line inside
the block, we dont use curly braces.

> +	return ENOMEM;

generally we return negative values for errors, so it should be -ENOMEM.
diff mbox

Patch

diff --git a/include/osmocom/gsm/sysinfo.h b/include/osmocom/gsm/sysinfo.h
index 7d1fe2b..dcac08f 100644
--- a/include/osmocom/gsm/sysinfo.h
+++ b/include/osmocom/gsm/sysinfo.h
@@ -3,6 +3,9 @@ 
 #include <osmocom/core/utils.h>
 #include <osmocom/gsm/protocol/gsm_04_08.h>
 
+#define OSMO_EARFCN_INVALID 666
+#define OSMO_EARFCN_MEAS_INVALID 0xff
+
 enum osmo_sysinfo_type {
 	SYSINFO_TYPE_NONE,
 	SYSINFO_TYPE_1,
@@ -32,9 +35,36 @@  enum osmo_sysinfo_type {
 	_MAX_SYSINFO_TYPE
 };
 
+struct earfcn {
+/* EARFCN (16 bits) array */
+	uint16_t *arfcn;
+/* Measurement Bandwidth (3 bits), might be absent
+(OSMO_EARFCN_MEAS_INVALID is stored in this case) */
+	uint8_t *meas_bw;
+/* length of arfcn and meas_bw arrays (got to be the same) */
+	size_t length;
+/* THRESH_E-UTRAN_high (5 bits) */
+	uint8_t thresh_hi;
+/* THRESH_E-UTRAN_low (5 bits) */
+	uint8_t thresh_lo;
+/* E-UTRAN_PRIORITY (3 bits) */
+	uint8_t prio;
+/* E-UTRAN_QRXLEVMIN */
+	uint8_t qrxlm;
+/* indicates whether thresh_lo value is valid
+thresh_hi is mandatory and hence always considered valid */
+	bool thresh_lo_valid;
+/* indicates whether prio value is valid */
+	bool prio_valid;
+/* indicates whether qrxlm value is valid */
+	bool qrxlm_valid;
+};
+
 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 earfcn *e, uint16_t arfcn, uint8_t meas_bw);
+int osmo_earfcn_del(struct earfcn *e, uint16_t arfcn);
+void osmo_earfcn_init(struct earfcn *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 7eebe7f..9b6e8ea 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -29,6 +29,10 @@  osmo_sitype_strs;
 comp128;
 dbm2rxlev;
 
+osmo_earfcn_add;
+osmo_earfcn_del;
+osmo_earfcn_init;
+
 gprs_cipher_gen_input_i;
 gprs_cipher_gen_input_ui;
 gprs_cipher_load;
diff --git a/src/gsm/sysinfo.c b/src/gsm/sysinfo.c
index 1408f6b..d56282f 100644
--- a/src/gsm/sysinfo.c
+++ b/src/gsm/sysinfo.c
@@ -125,6 +125,53 @@  const struct value_string osmo_sitype_strs[_MAX_SYSINFO_TYPE] = {
 	{ 0, NULL }
 };
 
+/*! \brief Add pair of arfcn and measurement bandwith value to earfcn struct
+ *  \param[in,out] e earfcn struct
+ *  \param[in] arfcn EARFCN value, 16 bits
+ *  \param[in] meas_bw measurement bandwith value
+ *  \returns 0 on success, error otherwise
+ */
+int osmo_earfcn_add(struct earfcn *e, uint16_t arfcn, uint8_t meas_bw)
+{
+	size_t i;
+	for (i = 0; i < e->length; i++)
+		if (OSMO_EARFCN_INVALID == e->arfcn[i]) {
+			e->arfcn[i] = arfcn;
+			e->meas_bw[i] = meas_bw;
+			return 0;
+		}
+	return ENOMEM;
+}
+
+/*! \brief Delete arfcn (and corresponding measurement bandwith) from earfcn
+ *  struct
+ *  \param[in,out] e earfcn struct
+ *  \param[in] arfcn EARFCN value, 16 bits
+ *  \returns 0 on success, error otherwise
+ */
+int osmo_earfcn_del(struct earfcn *e, uint16_t arfcn)
+{
+	size_t i;
+	for (i = 0; i < e->length; i++)
+		if (arfcn == e->arfcn[i]) {
+		e->arfcn[i] = OSMO_EARFCN_INVALID;
+		e->meas_bw[i] = OSMO_EARFCN_MEAS_INVALID;
+	}
+	return ENOENT;
+}
+
+/*! \brief Initialize earfcn struct
+ *  \param[in,out] e earfcn struct
+ */
+void osmo_earfcn_init(struct earfcn *e)
+{
+	size_t i;
+	for (i = 0; i < e->length; i++) {
+		e->arfcn[i] = OSMO_EARFCN_INVALID;
+		e->meas_bw[i] = OSMO_EARFCN_MEAS_INVALID;
+	}
+}
+
 uint8_t osmo_sitype2rsl(enum osmo_sysinfo_type si_type)
 {
 	return sitype2rsl[si_type];