blob: 6d36f347fb741d5e376feabea1f37ac4f0428ab7 [file] [log] [blame]
Harald Welte3c7dc6e2009-11-29 19:07:28 +01001#ifndef _MEAS_REP_H
2#define _MEAS_REP_H
3
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +02004#include <stdint.h>
5
Harald Welte7ff4f0e2013-03-07 18:38:09 +00006#include <osmocom/gsm/meas_rep.h>
7
Harald Welte38fe2a62009-12-21 09:26:17 +01008#define MRC_F_PROCESSED 0x0001
9
Harald Welte3c7dc6e2009-11-29 19:07:28 +010010/* extracted from a L3 measurement report IE */
11struct gsm_meas_rep_cell {
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020012 uint8_t rxlev;
13 uint8_t bsic;
14 uint8_t neigh_idx;
15 uint16_t arfcn;
Harald Welte38fe2a62009-12-21 09:26:17 +010016 unsigned int flags;
Harald Welte3c7dc6e2009-11-29 19:07:28 +010017};
18
Harald Welte3c7dc6e2009-11-29 19:07:28 +010019#define MEAS_REP_F_UL_DTX 0x01
20#define MEAS_REP_F_DL_VALID 0x02
21#define MEAS_REP_F_BA1 0x04
22#define MEAS_REP_F_DL_DTX 0x08
23#define MEAS_REP_F_MS_TO 0x10
24#define MEAS_REP_F_MS_L1 0x20
25#define MEAS_REP_F_FPC 0x40
26
27/* parsed uplink and downlink measurement result */
28struct gsm_meas_rep {
Harald Welte7f2d25b2009-12-15 21:36:59 +010029 /* back-pointer to the logical channel */
Harald Weltedbb1d882009-11-30 19:16:47 +010030 struct gsm_lchan *lchan;
31
Harald Welte7f2d25b2009-12-15 21:36:59 +010032 /* number of the measurement report */
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020033 uint8_t nr;
Harald Welte7f2d25b2009-12-15 21:36:59 +010034 /* flags, see MEAS_REP_F_* */
Harald Welte3c7dc6e2009-11-29 19:07:28 +010035 unsigned int flags;
36
Harald Welte7f2d25b2009-12-15 21:36:59 +010037 /* uplink and downlink rxlev, rxqual; full and sub */
Harald Welte3c7dc6e2009-11-29 19:07:28 +010038 struct gsm_meas_rep_unidir ul;
39 struct gsm_meas_rep_unidir dl;
40
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020041 uint8_t bs_power;
42 uint8_t ms_timing_offset;
Harald Welte3c7dc6e2009-11-29 19:07:28 +010043 struct {
44 int8_t pwr; /* MS power in dBm */
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020045 uint8_t ta; /* MS timing advance */
Harald Welte3c7dc6e2009-11-29 19:07:28 +010046 } ms_l1;
47
Harald Welte7f2d25b2009-12-15 21:36:59 +010048 /* neighbor measurement reports for up to 6 cells */
Harald Welte3c7dc6e2009-11-29 19:07:28 +010049 int num_cell;
50 struct gsm_meas_rep_cell cell[6];
51};
52
Harald Welte38fe2a62009-12-21 09:26:17 +010053/* obtain an average over the last 'num' fields in the meas reps */
54int get_meas_rep_avg(const struct gsm_lchan *lchan,
55 enum meas_rep_field field, unsigned int num);
56
57/* Check if N out of M last values for FIELD are >= bd */
58int meas_rep_n_out_of_m_be(const struct gsm_lchan *lchan,
59 enum meas_rep_field field,
60 unsigned int n, unsigned int m, int be);
61
62unsigned int calc_initial_idx(unsigned int array_size,
63 unsigned int meas_rep_idx,
64 unsigned int num_values);
65
Harald Welte3c7dc6e2009-11-29 19:07:28 +010066#endif /* _MEAS_REP_H */