blob: b0c03f0bb522c1b8a4dddb17c5bffa8f0e484060 [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;
Max11e4e412017-04-20 13:07:58 +020042 /* according to 3GPP TS 48.058 ยง MS Timing Offset [-63; 192] */
43 int16_t ms_timing_offset;
Harald Welte3c7dc6e2009-11-29 19:07:28 +010044 struct {
45 int8_t pwr; /* MS power in dBm */
Holger Hans Peter Freytherc42ad8b2011-04-18 17:04:00 +020046 uint8_t ta; /* MS timing advance */
Harald Welte3c7dc6e2009-11-29 19:07:28 +010047 } ms_l1;
48
Harald Welte7f2d25b2009-12-15 21:36:59 +010049 /* neighbor measurement reports for up to 6 cells */
Harald Welte3c7dc6e2009-11-29 19:07:28 +010050 int num_cell;
51 struct gsm_meas_rep_cell cell[6];
52};
53
Harald Welte38fe2a62009-12-21 09:26:17 +010054/* obtain an average over the last 'num' fields in the meas reps */
55int get_meas_rep_avg(const struct gsm_lchan *lchan,
56 enum meas_rep_field field, unsigned int num);
57
58/* Check if N out of M last values for FIELD are >= bd */
59int meas_rep_n_out_of_m_be(const struct gsm_lchan *lchan,
60 enum meas_rep_field field,
61 unsigned int n, unsigned int m, int be);
62
63unsigned int calc_initial_idx(unsigned int array_size,
64 unsigned int meas_rep_idx,
65 unsigned int num_values);
66
Harald Welte3c7dc6e2009-11-29 19:07:28 +010067#endif /* _MEAS_REP_H */