blob: 3029ac504fb10ffacbf3833dbb3a6e4a18f817ff [file] [log] [blame]
Stefan Sperlingbd6e7a92018-07-27 15:17:09 +02001#pragma once
2
3#include <stdbool.h>
4#include <osmocom/gsm/sysinfo.h>
5#include <osmocom/gprs/protocol/gsm_04_60.h>
6
7/* 16 is the max. number of SI2quater messages according to 3GPP TS 44.018 Table 10.5.2.33b.1:
8 4-bit index is used (2#1111 = 10#15) */
9#define SI2Q_MAX_NUM 16
10/* length in bits (for single SI2quater message) */
11#define SI2Q_MAX_LEN 160
12#define SI2Q_MIN_LEN 18
13
14/* generate SI1 rest octets */
Harald Welte428d03b2019-05-28 18:46:20 +020015int osmo_gsm48_rest_octets_si1_encode(uint8_t *data, uint8_t *nch_pos, int is1800_net);
16int osmo_gsm48_rest_octets_si2quater_encode(uint8_t *data, uint8_t si2q_index, uint8_t si2q_count,
17 const uint16_t *uarfcn_list, size_t *u_offset,
18 size_t uarfcn_length, uint16_t *scramble_list,
19 struct osmo_earfcn_si2q *si2quater_neigh_list,
20 size_t *e_offset);
21int osmo_gsm48_rest_octets_si2ter_encode(uint8_t *data);
22int osmo_gsm48_rest_octets_si2bis_encode(uint8_t *data);
23int osmo_gsm48_rest_octets_si6_encode(uint8_t *data, bool is1800_net);
Stefan Sperlingbd6e7a92018-07-27 15:17:09 +020024
25struct osmo_gsm48_si_selection_params {
26 uint16_t penalty_time:5,
27 temp_offs:3,
28 cell_resel_off:6,
29 cbq:1,
30 present:1;
31};
32
33struct osmo_gsm48_si_power_offset {
34 uint8_t power_offset:2,
35 present:1;
36};
37
38struct osmo_gsm48_si3_gprs_ind {
39 uint8_t si13_position:1,
40 ra_colour:3,
41 present:1;
42};
43
44struct osmo_gsm48_lsa_params {
45 uint32_t prio_thr:3,
46 lsa_offset:3,
47 mcc:12,
48 mnc:12;
49 unsigned int present;
50};
51
52struct osmo_gsm48_si_ro_info {
53 struct osmo_gsm48_si_selection_params selection_params;
54 struct osmo_gsm48_si_power_offset power_offset;
55 bool si2ter_indicator;
56 bool early_cm_ctrl;
57 struct {
58 uint8_t where:3,
59 present:1;
60 } scheduling;
61 struct osmo_gsm48_si3_gprs_ind gprs_ind;
62 /* SI 3 specific */
63 bool early_cm_restrict_3g;
64 bool si2quater_indicator;
65 /* SI 4 specific */
66 struct osmo_gsm48_lsa_params lsa_params;
67 uint16_t cell_id;
68 uint8_t break_ind; /* do we have SI7 + SI8 ? */
69};
70
71/* Generate SI3 Rest Octests (Chapter 10.5.2.34 / Table 10.4.72) */
Harald Welte428d03b2019-05-28 18:46:20 +020072int osmo_gsm48_rest_octets_si3_encode(uint8_t *data, const struct osmo_gsm48_si_ro_info *si3);
Stefan Sperlingbd6e7a92018-07-27 15:17:09 +020073
74/* Generate SI4 Rest Octets (Chapter 10.5.2.35) */
Harald Welte428d03b2019-05-28 18:46:20 +020075int osmo_gsm48_rest_octets_si4_encode(uint8_t *data, const struct osmo_gsm48_si_ro_info *si4, int len);
Stefan Sperlingbd6e7a92018-07-27 15:17:09 +020076
77struct osmo_gsm48_si13_info {
78 struct osmo_gprs_cell_options cell_opts;
79 struct osmo_gprs_power_ctrl_pars pwr_ctrl_pars;
80 uint8_t bcch_change_mark;
81 uint8_t si_change_field;
82 uint8_t rac;
83 uint8_t spgc_ccch_sup;
84 uint8_t net_ctrl_ord;
85 uint8_t prio_acc_thr;
86};
87
88/* Generate SI13 Rest Octests (Chapter 10.5.2.37b) */
Harald Welte428d03b2019-05-28 18:46:20 +020089int osmo_gsm48_rest_octets_si13_encode(uint8_t *data, const struct osmo_gsm48_si13_info *si13);