From patchwork Wed Mar 16 16:34:58 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Max X-Patchwork-Id: 598520 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.osmocom.org (lists.osmocom.org [IPv6:2a01:4f8:191:444b::2:7]) by ozlabs.org (Postfix) with ESMTP id 3qQHCF6zk7z9t5T for ; Thu, 17 Mar 2016 03:35:05 +1100 (AEDT) Received: from lists.osmocom.org (lists.osmocom.org [144.76.43.76]) by lists.osmocom.org (Postfix) with ESMTP id 8B2EF1B77E; Wed, 16 Mar 2016 16:35:03 +0000 (UTC) X-Original-To: openbsc@lists.osmocom.org Delivered-To: openbsc@lists.osmocom.org Received: from mail.sysmocom.de (mail.sysmocom.de [IPv6:2a01:4f8:191:444c::2:4]) by lists.osmocom.org (Postfix) with ESMTP id 91B0E1B777 for ; Wed, 16 Mar 2016 16:35:01 +0000 (UTC) Received: from mail.sysmocom.de (mail.sysmocom.de [144.76.43.93]) by mail.sysmocom.de (Postfix) with ESMTP id 30E3D15AEC3; Wed, 16 Mar 2016 16:35:01 +0000 (UTC) Received: from pbell.local (ip5b418565.dynamic.kabel-deutschland.de [91.65.133.101]) by mail.sysmocom.de (Postfix) with ESMTPSA id EC38815AEC2; Wed, 16 Mar 2016 16:35:00 +0000 (UTC) From: msuraev@sysmocom.de To: openbsc@lists.osmocom.org Subject: [PATCH 2/2] Add basic EARFCN support Date: Wed, 16 Mar 2016 17:34:58 +0100 Message-Id: <1458146098-26896-2-git-send-email-msuraev@sysmocom.de> X-Mailer: git-send-email 2.7.3 In-Reply-To: <1458146098-26896-1-git-send-email-msuraev@sysmocom.de> References: <1458146098-26896-1-git-send-email-msuraev@sysmocom.de> X-Virus-Scanned: ClamAV using ClamSMTP X-BeenThere: openbsc@lists.osmocom.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: "Development of OpenBSC, OsmoBSC, OsmoNITB, OsmoCSCN" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Max Errors-To: openbsc-bounces@lists.osmocom.org Sender: "OpenBSC" From: Max 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(-) 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 #include +#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];