mirror of https://gerrit.osmocom.org/libosmocore
Add basic EARFCN support
Add structure representing group of EARFCNs with common priority, threshold etc. Add functions to populate this structure.
This commit is contained in:
parent
d4793212b5
commit
03309b57e8
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -125,6 +125,56 @@ 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 0;
|
||||
}
|
||||
}
|
||||
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];
|
||||
|
|
Loading…
Reference in New Issue