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:
Max 2016-03-17 11:51:09 +01:00 committed by Harald Welte
parent d4793212b5
commit 03309b57e8
3 changed files with 85 additions and 1 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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];