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