blob: 07d279333e674975e56e9899f96258b8e07d48d0 [file] [log] [blame]
Pau Espin Pedrol388ed582020-07-15 20:53:16 +02001#pragma once
2
3#include <stdint.h>
4#include <sys/types.h>
5#include <stdbool.h>
6
7#include <osmocom/core/linuxlist.h>
8#include <osmocom/core/msgb.h>
9#include <osmocom/core/bitvec.h>
10#include <osmocom/gsm/tlv.h>
11#include <osmocom/gsm/bts_features.h>
12
13#include <osmocom/abis/e1_input.h>
14
15#include "osmocom/bsc/gsm_data.h"
16
17enum bts_counter_id {
18 BTS_CTR_CHREQ_TOTAL,
19 BTS_CTR_CHREQ_SUCCESSFUL,
20 BTS_CTR_CHREQ_NO_CHANNEL,
21 BTS_CTR_CHAN_RF_FAIL,
22 BTS_CTR_CHAN_RLL_ERR,
23 BTS_CTR_BTS_OML_FAIL,
24 BTS_CTR_BTS_RSL_FAIL,
25 BTS_CTR_CODEC_AMR_F,
26 BTS_CTR_CODEC_AMR_H,
27 BTS_CTR_CODEC_EFR,
28 BTS_CTR_CODEC_V1_FR,
29 BTS_CTR_CODEC_V1_HR,
30 BTS_CTR_PAGING_ATTEMPTED,
31 BTS_CTR_PAGING_ALREADY,
32 BTS_CTR_PAGING_RESPONDED,
33 BTS_CTR_PAGING_EXPIRED,
34 BTS_CTR_PAGING_NO_ACTIVE_PAGING,
35 BTS_CTR_PAGING_MSC_FLUSH,
36 BTS_CTR_CHAN_ACT_TOTAL,
37 BTS_CTR_CHAN_ACT_NACK,
38 BTS_CTR_RSL_UNKNOWN,
39 BTS_CTR_RSL_IPA_NACK,
40 BTS_CTR_RSL_DELETE_IND,
41 BTS_CTR_MODE_MODIFY_NACK,
42 BTS_CTR_LCHAN_BORKEN_FROM_UNUSED,
43 BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK,
44 BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK,
45 BTS_CTR_LCHAN_BORKEN_FROM_BORKEN,
46 BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN,
47 BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK,
48 BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK,
49 BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK,
50 BTS_CTR_LCHAN_BORKEN_EV_VTY,
51 BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN,
52 BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED,
53 BTS_CTR_TS_BORKEN_FROM_UNUSED,
54 BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT,
55 BTS_CTR_TS_BORKEN_FROM_PDCH,
56 BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT,
57 BTS_CTR_TS_BORKEN_FROM_IN_USE,
58 BTS_CTR_TS_BORKEN_FROM_BORKEN,
59 BTS_CTR_TS_BORKEN_FROM_UNKNOWN,
60 BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK,
61 BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK,
62 BTS_CTR_TS_BORKEN_EV_TEARDOWN,
63 BTS_CTR_ASSIGNMENT_ATTEMPTED,
64 BTS_CTR_ASSIGNMENT_COMPLETED,
65 BTS_CTR_ASSIGNMENT_STOPPED,
66 BTS_CTR_ASSIGNMENT_NO_CHANNEL,
67 BTS_CTR_ASSIGNMENT_TIMEOUT,
68 BTS_CTR_ASSIGNMENT_FAILED,
69 BTS_CTR_ASSIGNMENT_ERROR,
70};
71
72static const struct rate_ctr_desc bts_ctr_description[] = {
73 [BTS_CTR_CHREQ_TOTAL] = {"chreq:total", "Received channel requests"},
74 [BTS_CTR_CHREQ_SUCCESSFUL] = {"chreq:successful", "Successful channel requests (immediate assign sent)"},
75 [BTS_CTR_CHREQ_NO_CHANNEL] = {"chreq:no_channel", "Sent to MS no channel available"},
76 [BTS_CTR_CHAN_RF_FAIL] = {"chan:rf_fail", "Received a RF failure indication from BTS"},
77 [BTS_CTR_CHAN_RLL_ERR] = {"chan:rll_err", "Received a RLL failure with T200 cause from BTS"},
78 [BTS_CTR_BTS_OML_FAIL] = {"oml_fail", "Received a TEI down on a OML link"},
79 [BTS_CTR_BTS_RSL_FAIL] = {"rsl_fail", "Received a TEI down on a OML link"},
80 [BTS_CTR_CODEC_AMR_F] = {"codec:amr_f", "Count the usage of AMR/F codec by channel mode requested"},
81 [BTS_CTR_CODEC_AMR_H] = {"codec:amr_h", "Count the usage of AMR/H codec by channel mode requested"},
82 [BTS_CTR_CODEC_EFR] = {"codec:efr", "Count the usage of EFR codec by channel mode requested"},
83 [BTS_CTR_CODEC_V1_FR] = {"codec:fr", "Count the usage of FR codec by channel mode requested"},
84 [BTS_CTR_CODEC_V1_HR] = {"codec:hr", "Count the usage of HR codec by channel mode requested"},
85
86 [BTS_CTR_PAGING_ATTEMPTED] = {"paging:attempted", "Paging attempts for a subscriber"},
87 [BTS_CTR_PAGING_ALREADY] = {"paging:already", "Paging attempts ignored as subscriber was already being paged"},
88 [BTS_CTR_PAGING_RESPONDED] = {"paging:responded", "Paging attempts with successful paging response"},
89 [BTS_CTR_PAGING_EXPIRED] = {"paging:expired", "Paging Request expired because of timeout T3113"},
90 [BTS_CTR_PAGING_NO_ACTIVE_PAGING] = {"paging:no_active_paging", "Paging response without an active paging request (arrived after paging expiration?)"},
91 [BTS_CTR_PAGING_MSC_FLUSH] = {"paging:msc_flush", "Paging flushed due to MSC Reset BSSMAP message"},
92 [BTS_CTR_CHAN_ACT_TOTAL] = {"chan_act:total", "Total number of Channel Activations"},
93 [BTS_CTR_CHAN_ACT_NACK] = {"chan_act:nack", "Number of Channel Activations that the BTS NACKed"},
94 [BTS_CTR_RSL_UNKNOWN] = {"rsl:unknown", "Number of unknown/unsupported RSL messages received from BTS"},
95 [BTS_CTR_RSL_IPA_NACK] = {"rsl:ipa_nack", "Number of IPA (RTP/dyn-PDCH) related NACKs received from BTS"},
96 [BTS_CTR_RSL_DELETE_IND] = {"rsl:delete_ind", "Number of RSL DELETE INDICATION (DL CCCH overload)"},
97 [BTS_CTR_MODE_MODIFY_NACK] = {"chan:mode_modify_nack", "Number of Channel Mode Modify NACKs received from BTS"},
98
99 /* lchan/TS BORKEN state counters */
100 [BTS_CTR_LCHAN_BORKEN_FROM_UNUSED] = {"lchan_borken:from_state:unused", "Transitions from lchan UNUSED state to BORKEN state"},
101 [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK] = {"lchan_borken:from_state:wait_activ_ack", "Transitions from lchan WAIT_ACTIV_ACK state to BORKEN state"},
102 [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK] = {"lchan_borken:from_state:wait_rf_release_ack", "Transitions from lchan WAIT_RF_RELEASE_ACK state to BORKEN state"},
103 [BTS_CTR_LCHAN_BORKEN_FROM_BORKEN] = {"lchan_borken:from_state:borken", "Transitions from lchan BORKEN state to BORKEN state"},
104 [BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN] = {"lchan_borken:from_state:unknown", "Transitions from an unknown lchan state to BORKEN state"},
105 [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK] = {"lchan_borken:event:chan_activ_ack", "CHAN_ACTIV_ACK received in the lchan BORKEN state"},
106 [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK] = {"lchan_borken:event:chan_activ_nack", "CHAN_ACTIV_NACK received in the lchan BORKEN state"},
107 [BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK] = {"lchan_borken:event:rf_chan_rel_ack", "RF_CHAN_REL_ACK received in the lchan BORKEN state"},
108 [BTS_CTR_LCHAN_BORKEN_EV_VTY] = {"lchan_borken:event:vty", "VTY commands received in the lchan BORKEN state"},
109 [BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN] = {"lchan_borken:event:teardown", "lchan in a BORKEN state is shutting down (BTS disconnected?)"},
110 [BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED] = {"ts_borken:from_state:not_initialized", "Transitions from TS NOT_INITIALIZED state to BORKEN state"},
111 [BTS_CTR_TS_BORKEN_FROM_UNUSED] = {"ts_borken:from_state:unused", "Transitions from TS UNUSED state to BORKEN state"},
112 [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT] = {"ts_borken:from_state:wait_pdch_act", "Transitions from TS WAIT_PDCH_ACT state to BORKEN state"},
113 [BTS_CTR_TS_BORKEN_FROM_PDCH] = {"ts_borken:from_state:pdch", "Transitions from TS PDCH state to BORKEN state"},
114 [BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT] = {"ts_borken:from_state:wait_pdch_deact", "Transitions from TS WAIT_PDCH_DEACT state to BORKEN state"},
115 [BTS_CTR_TS_BORKEN_FROM_IN_USE] = {"ts_borken:from_state:in_use", "Transitions from TS IN_USE state to BORKEN state"},
116 [BTS_CTR_TS_BORKEN_FROM_BORKEN] = {"ts_borken:from_state:borken", "Transitions from TS BORKEN state to BORKEN state"},
117 [BTS_CTR_TS_BORKEN_FROM_UNKNOWN] = {"ts_borken:from_state:unknown", "Transitions from an unknown TS state to BORKEN state"},
118 [BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK] = {"ts_borken:event:pdch_act_ack_nack", "PDCH_ACT_ACK/NACK received in the TS BORKEN state"},
119 [BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK] = {"ts_borken:event:pdch_deact_ack_nack", "PDCH_DEACT_ACK/NACK received in the TS BORKEN state"},
120 [BTS_CTR_TS_BORKEN_EV_TEARDOWN] = {"ts_borken:event:teardown", "TS in a BORKEN state is shutting down (BTS disconnected?)"},
121 [BTS_CTR_ASSIGNMENT_ATTEMPTED] = {"assignment:attempted", "Assignment attempts"},
122 [BTS_CTR_ASSIGNMENT_COMPLETED] = {"assignment:completed", "Assignment completed"},
123 [BTS_CTR_ASSIGNMENT_STOPPED] = {"assignment:stopped", "Connection ended during Assignment"},
124 [BTS_CTR_ASSIGNMENT_NO_CHANNEL] = {"assignment:no_channel", "Failure to allocate lchan for Assignment"},
125 [BTS_CTR_ASSIGNMENT_TIMEOUT] = {"assignment:timeout", "Assignment timed out"},
126 [BTS_CTR_ASSIGNMENT_FAILED] = {"assignment:failed", "Received Assignment Failure message"},
127 [BTS_CTR_ASSIGNMENT_ERROR] = {"assignment:error", "Assignment failed for other reason"},
128
129};
130
131static const struct rate_ctr_group_desc bts_ctrg_desc = {
132 "bts",
133 "base transceiver station",
134 OSMO_STATS_CLASS_GLOBAL,
135 ARRAY_SIZE(bts_ctr_description),
136 bts_ctr_description,
137};
138
139enum {
140 BTS_STAT_CHAN_LOAD_AVERAGE,
141 BTS_STAT_CHAN_CCCH_SDCCH4_USED,
142 BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL,
143 BTS_STAT_CHAN_TCH_F_USED,
144 BTS_STAT_CHAN_TCH_F_TOTAL,
145 BTS_STAT_CHAN_TCH_H_USED,
146 BTS_STAT_CHAN_TCH_H_TOTAL,
147 BTS_STAT_CHAN_SDCCH8_USED,
148 BTS_STAT_CHAN_SDCCH8_TOTAL,
149 BTS_STAT_CHAN_TCH_F_PDCH_USED,
150 BTS_STAT_CHAN_TCH_F_PDCH_TOTAL,
151 BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED,
152 BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL,
153 BTS_STAT_CHAN_SDCCH8_CBCH_USED,
154 BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL,
155 BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED,
156 BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL,
157 BTS_STAT_T3122,
158 BTS_STAT_RACH_BUSY,
159 BTS_STAT_RACH_ACCESS,
160 BTS_STAT_OML_CONNECTED,
161 BTS_STAT_RSL_CONNECTED,
162 BTS_STAT_LCHAN_BORKEN,
163 BTS_STAT_TS_BORKEN,
164};
165
166enum gsm_bts_type {
167 GSM_BTS_TYPE_UNKNOWN,
168 GSM_BTS_TYPE_BS11,
169 GSM_BTS_TYPE_NANOBTS,
170 GSM_BTS_TYPE_RBS2000,
171 GSM_BTS_TYPE_NOKIA_SITE,
172 GSM_BTS_TYPE_OSMOBTS,
173 _NUM_GSM_BTS_TYPE
174};
175extern const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE+1];
176extern const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1];
177
178enum gsm_bts_type_variant {
179 BTS_UNKNOWN,
180 BTS_OSMO_LITECELL15,
181 BTS_OSMO_OCTPHY,
182 BTS_OSMO_SYSMO,
183 BTS_OSMO_TRX,
184 _NUM_BTS_VARIANT
185};
186
187/* Used by OML layer for BTS Attribute reporting */
188enum bts_attribute {
189 BTS_TYPE_VARIANT,
190 BTS_SUB_MODEL,
191 TRX_PHY_VERSION,
192};
193
194struct vty;
195
196struct gsm_bts_model {
197 struct llist_head list;
198
199 enum gsm_bts_type type;
200 enum gsm_bts_type_variant variant;
201 const char *name;
202
203 bool started;
204 int (*start)(struct gsm_network *net);
205 int (*oml_rcvmsg)(struct msgb *msg);
206 char * (*oml_status)(const struct gsm_bts *bts);
207
208 void (*e1line_bind_ops)(struct e1inp_line *line);
209
210 void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts);
211 void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx);
212 void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts);
213
214 /* Should SI2bis and SI2ter be disabled by default on this BTS model? */
215 bool force_combined_si;
216
217 struct tlv_definition nm_att_tlvdef;
218
219 /* features of a given BTS model set via gsm_bts_model_register() locally */
220 struct bitvec features;
221 uint8_t _features_data[MAX_BTS_FEATURES/8];
222};
223
224/* One BTS */
225struct gsm_bts {
226 /* list header in net->bts_list */
227 struct llist_head list;
228
229 /* Geographical location of the BTS */
230 struct llist_head loc_list;
231
232 /* number of this BTS in network */
233 uint8_t nr;
234 /* human readable name / description */
235 char *description;
236 /* Cell Identity */
237 uint16_t cell_identity;
238 /* location area code of this BTS */
239 uint16_t location_area_code;
240 /* Base Station Identification Code (BSIC), lower 3 bits is BCC,
241 * which is used as TSC for the CCCH */
242 uint8_t bsic;
243 /* type of BTS */
244 enum gsm_bts_type type;
245 enum gsm_bts_type_variant variant;
246 struct gsm_bts_model *model;
247 enum gsm_band band;
248 char version[MAX_VERSION_LENGTH];
249 char sub_model[MAX_VERSION_LENGTH];
250
251 /* features of a given BTS set/reported via OML */
252 struct bitvec features;
253 uint8_t _features_data[MAX_BTS_FEATURES/8];
254
255 /* Connected PCU version (if any) */
256 char pcu_version[MAX_VERSION_LENGTH];
257
258 /* maximum Tx power that the MS is permitted to use in this cell */
259 int ms_max_power;
260
261 /* how do we talk OML with this TRX? */
262 struct gsm_e1_subslot oml_e1_link;
263 uint8_t oml_tei;
264 struct e1inp_sign_link *oml_link;
265 /* Timer to use for deferred drop of OML link, see \ref ipaccess_drop_oml_deferred */
266 struct osmo_timer_list oml_drop_link_timer;
267 /* when OML link was established */
268 time_t uptime;
269
270 /* Abis network management O&M handle */
271 struct abis_nm_h *nmh;
272
273 struct gsm_abis_mo mo;
274
275 /* number of this BTS on given E1 link */
276 uint8_t bts_nr;
277
278 /* DTX features of this BTS */
279 enum gsm48_dtx_mode dtxu;
280 bool dtxd;
281
282 /* paging state and control */
283 struct gsm_bts_paging_state paging;
284
285 /* CCCH is on C0 */
286 struct gsm_bts_trx *c0;
287
288 struct {
289 struct gsm_abis_mo mo;
290 } site_mgr;
291
292 /* bitmask of all SI that are present/valid in si_buf */
293 uint32_t si_valid;
294 /* 3GPP TS 44.018 Table 10.5.2.33b.1 INDEX and COUNT for SI2quater */
295 uint8_t si2q_index; /* distinguish individual SI2quater messages */
296 uint8_t si2q_count; /* si2q_index for the last (highest indexed) individual SI2quater message */
297 /* buffers where we put the pre-computed SI */
298 sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];
299 /* offsets used while generating SI2quater */
300 size_t e_offset;
301 size_t u_offset;
302 /* 3GPP TS 08.58 §8.5.1 BCCH INFORMATION. Some nanoBTS fail upon
303 * receival of empty SI disabling unsupported SI. see OS#3707. */
304 bool si_unused_send_empty;
305
306 /* ip.access Unit ID's have Site/BTS/TRX layout */
307 union {
308 struct {
309 uint16_t site_id;
310 uint16_t bts_id;
311 uint32_t flags;
312 uint32_t rsl_ip;
313 } ip_access;
314 struct {
315 struct {
316 struct gsm_abis_mo mo;
317 } cclk;
318 struct {
319 struct gsm_abis_mo mo;
320 } rack;
321 struct gsm_envabtse envabtse[4];
322 } bs11;
323 struct {
324 struct {
325 struct om2k_mo om2k_mo;
326 struct gsm_abis_mo mo;
327 struct llist_head conn_groups;
328 } cf;
329 struct {
330 struct om2k_mo om2k_mo;
331 struct gsm_abis_mo mo;
332 struct llist_head conn_groups;
333 } is;
334 struct {
335 struct om2k_mo om2k_mo;
336 struct gsm_abis_mo mo;
337 struct llist_head conn_groups;
338 } con;
339 struct {
340 struct om2k_mo om2k_mo;
341 struct gsm_abis_mo mo;
342 } dp;
343 struct {
344 struct om2k_mo om2k_mo;
345 struct gsm_abis_mo mo;
346 } tf;
347 struct {
348 struct om2k_mo om2k_mo;
349 struct gsm_abis_mo mo;
350 } mctr;
351 uint32_t use_superchannel:1;
352 struct {
353 uint16_t limit;
354 uint16_t active;
355 } om2k_version[16];
356 } rbs2000;
357 struct {
358 uint8_t bts_type;
359 unsigned int configured:1, /* we sent the config data request */
360 skip_reset:1, /* skip reset at bootstrap */
361 no_loc_rel_cnf:1, /* don't wait for RSL REL CONF */
362 bts_reset_timer_cnf, /* timer for BTS RESET */
363 did_reset:1, /* we received a RESET ACK */
364 wait_reset:2; /* we are waiting for reset to complete */
365 struct osmo_timer_list reset_timer;
366 } nokia;
367 };
368
369 /* Not entirely sure how ip.access specific this is */
370 struct {
371 enum bts_gprs_mode mode;
372 struct {
373 struct gsm_abis_mo mo;
374 uint16_t nsei;
375 uint8_t timer[7];
376 } nse;
377 struct {
378 struct gsm_abis_mo mo;
379 uint16_t bvci;
380 uint8_t timer[11];
381 struct gprs_rlc_cfg rlc_cfg;
382 } cell;
383 struct gsm_bts_gprs_nsvc nsvc[2];
384 uint8_t rac;
385 uint8_t net_ctrl_ord;
386 bool ctrl_ack_type_use_block;
387 bool egprs_pkt_chan_request;
388 } gprs;
389
390 /* threshold (in percent) when BTS shall send CCCH LOAD IND */
391 int ccch_load_ind_thresh;
392
393 /* RACH NM values */
394 int rach_b_thresh;
395 int rach_ldavg_slots;
396
397 /* transceivers */
398 int num_trx;
399 struct llist_head trx_list;
400
401 /* SI related items */
402 int force_combined_si;
403 bool force_combined_si_set;
404 int bcch_change_mark;
405
406 /* Abis NM queue */
407 struct llist_head abis_queue;
408 int abis_nm_pend;
409
410 struct gsm_network *network;
411
412 /* should the channel allocator allocate channels from high TRX to TRX0,
413 * rather than starting from TRX0 and go upwards? */
414 int chan_alloc_reverse;
415
416 enum neigh_list_manual_mode neigh_list_manual_mode;
417 /* parameters from which we build SYSTEM INFORMATION */
418 struct {
419 struct gsm48_rach_control rach_control;
420 uint8_t ncc_permitted;
421 struct gsm48_cell_sel_par cell_sel_par;
422 struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */
423 struct gsm48_cell_options cell_options;
424 struct gsm48_control_channel_descr chan_desc;
425 struct bitvec neigh_list;
426 struct bitvec cell_alloc;
427 struct bitvec si5_neigh_list;
428 struct osmo_earfcn_si2q si2quater_neigh_list;
429 size_t uarfcn_length; /* index for uarfcn and scramble lists */
430 struct {
431 /* bitmask large enough for all possible ARFCN's */
432 uint8_t neigh_list[1024/8];
433 uint8_t cell_alloc[1024/8];
434 /* If the user wants a different neighbor list in SI5 than in SI2 */
435 uint8_t si5_neigh_list[1024/8];
436 uint8_t meas_bw_list[MAX_EARFCN_LIST];
437 uint16_t earfcn_list[MAX_EARFCN_LIST];
438 uint16_t uarfcn_list[MAX_EARFCN_LIST];
439 uint16_t scramble_list[MAX_EARFCN_LIST];
440 } data;
441 } si_common;
442 bool early_classmark_allowed;
443 bool early_classmark_allowed_3g;
444 /* for testing only: Have an infinitely long radio link timeout */
445 bool infinite_radio_link_timeout;
446
447 /* do we use static (user-defined) system information messages? (bitmask) */
448 uint32_t si_mode_static;
449
450 /* access control class ramping */
451 struct acc_ramp acc_ramp;
452
453 /* exclude the BTS from the global RF Lock handling */
454 int excl_from_rf_lock;
455
456 /* supported codecs beside FR */
457 struct bts_codec_conf codec;
458
459 /* BTS dependencies bit field */
460 uint32_t depends_on[256/(8*4)];
461
462 /* full and half rate multirate config */
463 struct amr_multirate_conf mr_full;
464 struct amr_multirate_conf mr_half;
465
466 /* PCU socket state */
467 char *pcu_sock_path;
468 struct pcu_sock_state *pcu_state;
469
470 struct rate_ctr_group *bts_ctrs;
471 struct osmo_stat_item_group *bts_statg;
472
473 struct handover_cfg *ho;
474
475 /* A list of struct gsm_bts_ref, indicating neighbors of this BTS.
476 * When the si_common neigh_list is in automatic mode, it is populated from this list as well as
477 * gsm_network->neighbor_bss_cells. */
478 struct llist_head local_neighbors;
479
480 /* BTS-specific overrides for timer values from struct gsm_network. */
481 uint8_t T3122; /* ASSIGNMENT REJECT wait indication */
482 bool T3113_dynamic; /* Calculate T3113 timeout dynamically based on BTS channel config and load */
483
484 /* Periodic channel load measurements are used to maintain T3122. */
485 struct load_counter chan_load_samples[7];
486 int chan_load_samples_idx;
487 uint8_t chan_load_avg; /* current channel load average in percent (0 - 100). */
488
489 /* cell broadcast system */
490 struct osmo_timer_list cbch_timer;
491 struct bts_smscb_chan_state cbch_basic;
492 struct bts_smscb_chan_state cbch_extended;
493 struct osmo_timer_list etws_timer; /* when to stop ETWS PN */
494
495 struct llist_head oml_fail_rep;
496};
497
498#define GSM_BTS_SI2Q(bts, i) (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i])
499#define GSM_BTS_HAS_SI(bts, i) ((bts)->si_valid & (1 << i))
500#define GSM_BTS_SI(bts, i) (void *)((bts)->si_buf[i][0])
501
502/* this actually refers to the IPA transport, not the BTS model */
503static inline int is_ipaccess_bts(const struct gsm_bts *bts)
504{
505 switch (bts->type) {
506 case GSM_BTS_TYPE_NANOBTS:
507 case GSM_BTS_TYPE_OSMOBTS:
508 return 1;
509 default:
510 break;
511 }
512 return 0;
513}
514
515static inline int is_sysmobts_v2(const struct gsm_bts *bts)
516{
517 switch (bts->type) {
518 case GSM_BTS_TYPE_OSMOBTS:
519 return 1;
520 default:
521 break;
522 }
523 return 0;
524}
525
526static inline int is_siemens_bts(const struct gsm_bts *bts)
527{
528 switch (bts->type) {
529 case GSM_BTS_TYPE_BS11:
530 return 1;
531 default:
532 break;
533 }
534
535 return 0;
536}
537
538static inline int is_nokia_bts(const struct gsm_bts *bts)
539{
540 switch (bts->type) {
541 case GSM_BTS_TYPE_NOKIA_SITE:
542 return 1;
543 default:
544 break;
545 }
546
547 return 0;
548}
549
550static inline int is_ericsson_bts(const struct gsm_bts *bts)
551{
552 switch (bts->type) {
553 case GSM_BTS_TYPE_RBS2000:
554 return 1;
555 default:
556 break;
557 }
558
559 return 0;
560}
561
562static inline int is_e1_bts(const struct gsm_bts *bts)
563{
564 switch (bts->type) {
565 case GSM_BTS_TYPE_BS11:
566 case GSM_BTS_TYPE_RBS2000:
567 case GSM_BTS_TYPE_NOKIA_SITE:
568 return 1;
569 default:
570 break;
571 }
572
573 return 0;
574}
575
576static inline const struct osmo_location_area_id *bts_lai(struct gsm_bts *bts)
577{
578 static struct osmo_location_area_id lai;
579 lai = (struct osmo_location_area_id){
580 .plmn = bts->network->plmn,
581 .lac = bts->location_area_code,
582 };
583 return &lai;
584}
585
586struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num);
587
588char *gsm_bts_name(const struct gsm_bts *bts);
589
590bool gsm_bts_matches_lai(const struct gsm_bts *bts, const struct osmo_location_area_id *lai);
591bool gsm_bts_matches_cell_id(const struct gsm_bts *bts, const struct gsm0808_cell_id *cell_id);
592
593int gsm_bts_local_neighbor_add(struct gsm_bts *bts, struct gsm_bts *neighbor);
594int gsm_bts_local_neighbor_del(struct gsm_bts *bts, const struct gsm_bts *neighbor);
595
596/* return the gsm_lchan for the CBCH (if it exists at all) */
597struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts);
598
599int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
600
601struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr);
602
603int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode);
604
605unsigned long long bts_uptime(const struct gsm_bts *bts);
606
607char *get_model_oml_status(const struct gsm_bts *bts);
608/* reset the state of all MO in the BTS */
609void gsm_bts_mo_reset(struct gsm_bts *bts);
610
611/* dependency handling */
612void bts_depend_mark(struct gsm_bts *bts, int dep);
613void bts_depend_clear(struct gsm_bts *bts, int dep);
614int bts_depend_check(struct gsm_bts *bts);
615int bts_depend_is_depedency(struct gsm_bts *base, struct gsm_bts *other);
616
617int gsm_bts_get_radio_link_timeout(const struct gsm_bts *bts);
618void gsm_bts_set_radio_link_timeout(struct gsm_bts *bts, int value);
619
620void gsm_bts_all_ts_dispatch(struct gsm_bts *bts, uint32_t ts_ev, void *data);
621
622int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan);
623
624int gsm_bts_model_register(struct gsm_bts_model *model);
625struct gsm_bts_model *bts_model_find(enum gsm_bts_type type);
626
627enum gsm_bts_type str2btstype(const char *arg);
628const char *btstype2str(enum gsm_bts_type type);
629
630enum bts_attribute str2btsattr(const char *s);
631const char *btsatttr2str(enum bts_attribute v);
632
633enum gsm_bts_type_variant str2btsvariant(const char *arg);
634const char *btsvariant2str(enum gsm_bts_type_variant v);