blob: fd2ac320b55854771bff49ab971f586702e0306e [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,
Philipp Maier92eed412020-08-21 20:47:49 +020053 BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RR_CHAN_MODE_MODIFY_ACK,
54 BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RSL_CHAN_MODE_MODIFY_ACK,
Pau Espin Pedrol388ed582020-07-15 20:53:16 +020055 BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED,
56 BTS_CTR_TS_BORKEN_FROM_UNUSED,
57 BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT,
58 BTS_CTR_TS_BORKEN_FROM_PDCH,
59 BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT,
60 BTS_CTR_TS_BORKEN_FROM_IN_USE,
61 BTS_CTR_TS_BORKEN_FROM_BORKEN,
62 BTS_CTR_TS_BORKEN_FROM_UNKNOWN,
63 BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK,
64 BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK,
65 BTS_CTR_TS_BORKEN_EV_TEARDOWN,
66 BTS_CTR_ASSIGNMENT_ATTEMPTED,
67 BTS_CTR_ASSIGNMENT_COMPLETED,
68 BTS_CTR_ASSIGNMENT_STOPPED,
69 BTS_CTR_ASSIGNMENT_NO_CHANNEL,
70 BTS_CTR_ASSIGNMENT_TIMEOUT,
71 BTS_CTR_ASSIGNMENT_FAILED,
72 BTS_CTR_ASSIGNMENT_ERROR,
Daniel Willmann02f0b302020-08-17 17:09:41 +020073 BTS_CTR_HANDOVER_ATTEMPTED,
74 BTS_CTR_HANDOVER_COMPLETED,
75 BTS_CTR_HANDOVER_STOPPED,
76 BTS_CTR_HANDOVER_NO_CHANNEL,
77 BTS_CTR_HANDOVER_TIMEOUT,
78 BTS_CTR_HANDOVER_FAILED,
79 BTS_CTR_HANDOVER_ERROR,
Daniel Willmannbf2a4b62020-08-20 15:25:37 +020080 BTS_CTR_INTRA_CELL_HO_ATTEMPTED,
81 BTS_CTR_INTRA_CELL_HO_COMPLETED,
82 BTS_CTR_INTRA_CELL_HO_STOPPED,
83 BTS_CTR_INTRA_CELL_HO_NO_CHANNEL,
84 BTS_CTR_INTRA_CELL_HO_TIMEOUT,
85 BTS_CTR_INTRA_CELL_HO_FAILED,
86 BTS_CTR_INTRA_CELL_HO_ERROR,
87 BTS_CTR_INTRA_BSC_HO_ATTEMPTED,
88 BTS_CTR_INTRA_BSC_HO_COMPLETED,
89 BTS_CTR_INTRA_BSC_HO_STOPPED,
90 BTS_CTR_INTRA_BSC_HO_NO_CHANNEL,
91 BTS_CTR_INTRA_BSC_HO_TIMEOUT,
92 BTS_CTR_INTRA_BSC_HO_FAILED,
93 BTS_CTR_INTRA_BSC_HO_ERROR,
Daniel Willmann02f0b302020-08-17 17:09:41 +020094 BTS_CTR_INTER_BSC_HO_OUT_ATTEMPTED,
95 BTS_CTR_INTER_BSC_HO_OUT_COMPLETED,
96 BTS_CTR_INTER_BSC_HO_OUT_STOPPED,
97 BTS_CTR_INTER_BSC_HO_OUT_TIMEOUT,
Neels Hofmeyrdbe59f62020-08-29 03:23:31 +000098 BTS_CTR_INTER_BSC_HO_OUT_FAILED,
Daniel Willmann02f0b302020-08-17 17:09:41 +020099 BTS_CTR_INTER_BSC_HO_OUT_ERROR,
100 BTS_CTR_INTER_BSC_HO_IN_ATTEMPTED,
101 BTS_CTR_INTER_BSC_HO_IN_COMPLETED,
102 BTS_CTR_INTER_BSC_HO_IN_STOPPED,
103 BTS_CTR_INTER_BSC_HO_IN_NO_CHANNEL,
104 BTS_CTR_INTER_BSC_HO_IN_FAILED,
105 BTS_CTR_INTER_BSC_HO_IN_TIMEOUT,
106 BTS_CTR_INTER_BSC_HO_IN_ERROR,
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200107};
108
Vadim Yanitskiy218b3752020-10-19 00:54:35 +0700109extern const struct rate_ctr_desc bts_ctr_description[];
110extern const struct rate_ctr_group_desc bts_ctrg_desc;
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200111
112enum {
113 BTS_STAT_CHAN_LOAD_AVERAGE,
114 BTS_STAT_CHAN_CCCH_SDCCH4_USED,
115 BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL,
116 BTS_STAT_CHAN_TCH_F_USED,
117 BTS_STAT_CHAN_TCH_F_TOTAL,
118 BTS_STAT_CHAN_TCH_H_USED,
119 BTS_STAT_CHAN_TCH_H_TOTAL,
120 BTS_STAT_CHAN_SDCCH8_USED,
121 BTS_STAT_CHAN_SDCCH8_TOTAL,
122 BTS_STAT_CHAN_TCH_F_PDCH_USED,
123 BTS_STAT_CHAN_TCH_F_PDCH_TOTAL,
124 BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED,
125 BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL,
126 BTS_STAT_CHAN_SDCCH8_CBCH_USED,
127 BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL,
128 BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED,
129 BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL,
130 BTS_STAT_T3122,
131 BTS_STAT_RACH_BUSY,
132 BTS_STAT_RACH_ACCESS,
133 BTS_STAT_OML_CONNECTED,
134 BTS_STAT_RSL_CONNECTED,
135 BTS_STAT_LCHAN_BORKEN,
136 BTS_STAT_TS_BORKEN,
137};
138
Vadim Yanitskiy218b3752020-10-19 00:54:35 +0700139extern const struct osmo_stat_item_desc bts_stat_desc[];
140extern const struct osmo_stat_item_group_desc bts_statg_desc;
Daniel Willmannbf2a4b62020-08-20 15:25:37 +0200141
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200142enum gsm_bts_type {
143 GSM_BTS_TYPE_UNKNOWN,
144 GSM_BTS_TYPE_BS11,
145 GSM_BTS_TYPE_NANOBTS,
146 GSM_BTS_TYPE_RBS2000,
147 GSM_BTS_TYPE_NOKIA_SITE,
148 GSM_BTS_TYPE_OSMOBTS,
149 _NUM_GSM_BTS_TYPE
150};
151extern const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE+1];
152extern const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1];
153
154enum gsm_bts_type_variant {
155 BTS_UNKNOWN,
156 BTS_OSMO_LITECELL15,
157 BTS_OSMO_OCTPHY,
158 BTS_OSMO_SYSMO,
159 BTS_OSMO_TRX,
160 _NUM_BTS_VARIANT
161};
162
163/* Used by OML layer for BTS Attribute reporting */
164enum bts_attribute {
165 BTS_TYPE_VARIANT,
166 BTS_SUB_MODEL,
167 TRX_PHY_VERSION,
168};
169
170struct vty;
171
172struct gsm_bts_model {
173 struct llist_head list;
174
175 enum gsm_bts_type type;
176 enum gsm_bts_type_variant variant;
177 const char *name;
178
179 bool started;
180 int (*start)(struct gsm_network *net);
181 int (*oml_rcvmsg)(struct msgb *msg);
182 char * (*oml_status)(const struct gsm_bts *bts);
183
184 void (*e1line_bind_ops)(struct e1inp_line *line);
185
186 void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts);
187 void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx);
188 void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts);
189
190 /* Should SI2bis and SI2ter be disabled by default on this BTS model? */
191 bool force_combined_si;
192
193 struct tlv_definition nm_att_tlvdef;
194
195 /* features of a given BTS model set via gsm_bts_model_register() locally */
196 struct bitvec features;
197 uint8_t _features_data[MAX_BTS_FEATURES/8];
198};
199
Pau Espin Pedrol4338de52020-09-30 12:52:04 +0200200/* BTS Site Manager */
201struct gsm_bts_sm {
202 struct gsm_abis_mo mo;
Pau Espin Pedrol558183f2020-10-02 16:20:00 +0200203 /* nanoBTS and old versions of osmo-bts behaves this way due to
204 broken FSMs not following TS 12.21: they never do
205 Dependency->Offline transition, but they should be OPSTARTed
206 nevertheless during Dependnecy state to work. This field is
207 used by all dependent NM objects. */
208 bool peer_has_no_avstate_offline;
Pau Espin Pedrol4338de52020-09-30 12:52:04 +0200209};
210
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200211/* One BTS */
212struct gsm_bts {
213 /* list header in net->bts_list */
214 struct llist_head list;
215
216 /* Geographical location of the BTS */
217 struct llist_head loc_list;
218
219 /* number of this BTS in network */
220 uint8_t nr;
221 /* human readable name / description */
222 char *description;
223 /* Cell Identity */
224 uint16_t cell_identity;
225 /* location area code of this BTS */
226 uint16_t location_area_code;
227 /* Base Station Identification Code (BSIC), lower 3 bits is BCC,
228 * which is used as TSC for the CCCH */
229 uint8_t bsic;
230 /* type of BTS */
231 enum gsm_bts_type type;
232 enum gsm_bts_type_variant variant;
233 struct gsm_bts_model *model;
234 enum gsm_band band;
235 char version[MAX_VERSION_LENGTH];
236 char sub_model[MAX_VERSION_LENGTH];
237
238 /* features of a given BTS set/reported via OML */
239 struct bitvec features;
240 uint8_t _features_data[MAX_BTS_FEATURES/8];
241
242 /* Connected PCU version (if any) */
243 char pcu_version[MAX_VERSION_LENGTH];
244
245 /* maximum Tx power that the MS is permitted to use in this cell */
246 int ms_max_power;
247
248 /* how do we talk OML with this TRX? */
249 struct gsm_e1_subslot oml_e1_link;
250 uint8_t oml_tei;
251 struct e1inp_sign_link *oml_link;
252 /* Timer to use for deferred drop of OML link, see \ref ipaccess_drop_oml_deferred */
253 struct osmo_timer_list oml_drop_link_timer;
254 /* when OML link was established */
255 time_t uptime;
256
257 /* Abis network management O&M handle */
258 struct abis_nm_h *nmh;
259
260 struct gsm_abis_mo mo;
261
262 /* number of this BTS on given E1 link */
263 uint8_t bts_nr;
264
265 /* DTX features of this BTS */
266 enum gsm48_dtx_mode dtxu;
267 bool dtxd;
268
269 /* paging state and control */
270 struct gsm_bts_paging_state paging;
271
272 /* CCCH is on C0 */
273 struct gsm_bts_trx *c0;
274
Pau Espin Pedrol4338de52020-09-30 12:52:04 +0200275 struct gsm_bts_sm site_mgr;
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200276
277 /* bitmask of all SI that are present/valid in si_buf */
278 uint32_t si_valid;
279 /* 3GPP TS 44.018 Table 10.5.2.33b.1 INDEX and COUNT for SI2quater */
280 uint8_t si2q_index; /* distinguish individual SI2quater messages */
281 uint8_t si2q_count; /* si2q_index for the last (highest indexed) individual SI2quater message */
282 /* buffers where we put the pre-computed SI */
283 sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];
284 /* offsets used while generating SI2quater */
285 size_t e_offset;
286 size_t u_offset;
287 /* 3GPP TS 08.58 §8.5.1 BCCH INFORMATION. Some nanoBTS fail upon
288 * receival of empty SI disabling unsupported SI. see OS#3707. */
289 bool si_unused_send_empty;
290
291 /* ip.access Unit ID's have Site/BTS/TRX layout */
292 union {
293 struct {
294 uint16_t site_id;
295 uint16_t bts_id;
296 uint32_t flags;
297 uint32_t rsl_ip;
298 } ip_access;
299 struct {
300 struct {
301 struct gsm_abis_mo mo;
302 } cclk;
303 struct {
304 struct gsm_abis_mo mo;
305 } rack;
306 struct gsm_envabtse envabtse[4];
307 } bs11;
308 struct {
309 struct {
310 struct om2k_mo om2k_mo;
311 struct gsm_abis_mo mo;
312 struct llist_head conn_groups;
313 } cf;
314 struct {
315 struct om2k_mo om2k_mo;
316 struct gsm_abis_mo mo;
317 struct llist_head conn_groups;
318 } is;
319 struct {
320 struct om2k_mo om2k_mo;
321 struct gsm_abis_mo mo;
322 struct llist_head conn_groups;
323 } con;
324 struct {
325 struct om2k_mo om2k_mo;
326 struct gsm_abis_mo mo;
327 } dp;
328 struct {
329 struct om2k_mo om2k_mo;
330 struct gsm_abis_mo mo;
331 } tf;
332 struct {
333 struct om2k_mo om2k_mo;
334 struct gsm_abis_mo mo;
335 } mctr;
336 uint32_t use_superchannel:1;
337 struct {
338 uint16_t limit;
339 uint16_t active;
340 } om2k_version[16];
341 } rbs2000;
342 struct {
343 uint8_t bts_type;
344 unsigned int configured:1, /* we sent the config data request */
345 skip_reset:1, /* skip reset at bootstrap */
346 no_loc_rel_cnf:1, /* don't wait for RSL REL CONF */
347 bts_reset_timer_cnf, /* timer for BTS RESET */
348 did_reset:1, /* we received a RESET ACK */
349 wait_reset:2; /* we are waiting for reset to complete */
350 struct osmo_timer_list reset_timer;
351 } nokia;
352 };
353
354 /* Not entirely sure how ip.access specific this is */
355 struct {
356 enum bts_gprs_mode mode;
357 struct {
358 struct gsm_abis_mo mo;
359 uint16_t nsei;
360 uint8_t timer[7];
361 } nse;
362 struct {
363 struct gsm_abis_mo mo;
364 uint16_t bvci;
365 uint8_t timer[11];
366 struct gprs_rlc_cfg rlc_cfg;
367 } cell;
368 struct gsm_bts_gprs_nsvc nsvc[2];
369 uint8_t rac;
370 uint8_t net_ctrl_ord;
371 bool ctrl_ack_type_use_block;
372 bool egprs_pkt_chan_request;
373 } gprs;
374
375 /* threshold (in percent) when BTS shall send CCCH LOAD IND */
376 int ccch_load_ind_thresh;
377
378 /* RACH NM values */
379 int rach_b_thresh;
380 int rach_ldavg_slots;
381
382 /* transceivers */
383 int num_trx;
384 struct llist_head trx_list;
385
386 /* SI related items */
387 int force_combined_si;
388 bool force_combined_si_set;
389 int bcch_change_mark;
390
391 /* Abis NM queue */
392 struct llist_head abis_queue;
393 int abis_nm_pend;
394
395 struct gsm_network *network;
396
397 /* should the channel allocator allocate channels from high TRX to TRX0,
398 * rather than starting from TRX0 and go upwards? */
399 int chan_alloc_reverse;
400
401 enum neigh_list_manual_mode neigh_list_manual_mode;
402 /* parameters from which we build SYSTEM INFORMATION */
403 struct {
404 struct gsm48_rach_control rach_control;
405 uint8_t ncc_permitted;
406 struct gsm48_cell_sel_par cell_sel_par;
407 struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */
408 struct gsm48_cell_options cell_options;
409 struct gsm48_control_channel_descr chan_desc;
410 struct bitvec neigh_list;
411 struct bitvec cell_alloc;
412 struct bitvec si5_neigh_list;
413 struct osmo_earfcn_si2q si2quater_neigh_list;
414 size_t uarfcn_length; /* index for uarfcn and scramble lists */
415 struct {
416 /* bitmask large enough for all possible ARFCN's */
417 uint8_t neigh_list[1024/8];
418 uint8_t cell_alloc[1024/8];
419 /* If the user wants a different neighbor list in SI5 than in SI2 */
420 uint8_t si5_neigh_list[1024/8];
421 uint8_t meas_bw_list[MAX_EARFCN_LIST];
422 uint16_t earfcn_list[MAX_EARFCN_LIST];
423 uint16_t uarfcn_list[MAX_EARFCN_LIST];
424 uint16_t scramble_list[MAX_EARFCN_LIST];
425 } data;
426 } si_common;
427 bool early_classmark_allowed;
428 bool early_classmark_allowed_3g;
429 /* for testing only: Have an infinitely long radio link timeout */
430 bool infinite_radio_link_timeout;
431
432 /* do we use static (user-defined) system information messages? (bitmask) */
433 uint32_t si_mode_static;
434
435 /* access control class ramping */
Pau Espin Pedroldeaa6fd2020-07-16 20:53:21 +0200436 struct acc_mgr acc_mgr;
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200437 struct acc_ramp acc_ramp;
438
439 /* exclude the BTS from the global RF Lock handling */
440 int excl_from_rf_lock;
441
442 /* supported codecs beside FR */
443 struct bts_codec_conf codec;
444
445 /* BTS dependencies bit field */
446 uint32_t depends_on[256/(8*4)];
447
448 /* full and half rate multirate config */
449 struct amr_multirate_conf mr_full;
450 struct amr_multirate_conf mr_half;
451
452 /* PCU socket state */
453 char *pcu_sock_path;
454 struct pcu_sock_state *pcu_state;
455
456 struct rate_ctr_group *bts_ctrs;
457 struct osmo_stat_item_group *bts_statg;
458
459 struct handover_cfg *ho;
460
461 /* A list of struct gsm_bts_ref, indicating neighbors of this BTS.
462 * When the si_common neigh_list is in automatic mode, it is populated from this list as well as
463 * gsm_network->neighbor_bss_cells. */
464 struct llist_head local_neighbors;
465
466 /* BTS-specific overrides for timer values from struct gsm_network. */
467 uint8_t T3122; /* ASSIGNMENT REJECT wait indication */
468 bool T3113_dynamic; /* Calculate T3113 timeout dynamically based on BTS channel config and load */
469
470 /* Periodic channel load measurements are used to maintain T3122. */
471 struct load_counter chan_load_samples[7];
472 int chan_load_samples_idx;
473 uint8_t chan_load_avg; /* current channel load average in percent (0 - 100). */
474
475 /* cell broadcast system */
476 struct osmo_timer_list cbch_timer;
477 struct bts_smscb_chan_state cbch_basic;
478 struct bts_smscb_chan_state cbch_extended;
479 struct osmo_timer_list etws_timer; /* when to stop ETWS PN */
480
481 struct llist_head oml_fail_rep;
Philipp Maiercc6d35d2020-08-21 22:40:23 +0200482 struct llist_head chan_rqd_queue;
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200483};
484
485#define GSM_BTS_SI2Q(bts, i) (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i])
486#define GSM_BTS_HAS_SI(bts, i) ((bts)->si_valid & (1 << i))
487#define GSM_BTS_SI(bts, i) (void *)((bts)->si_buf[i][0])
488
489/* this actually refers to the IPA transport, not the BTS model */
490static inline int is_ipaccess_bts(const struct gsm_bts *bts)
491{
492 switch (bts->type) {
493 case GSM_BTS_TYPE_NANOBTS:
494 case GSM_BTS_TYPE_OSMOBTS:
495 return 1;
496 default:
497 break;
498 }
499 return 0;
500}
501
502static inline int is_sysmobts_v2(const struct gsm_bts *bts)
503{
504 switch (bts->type) {
505 case GSM_BTS_TYPE_OSMOBTS:
506 return 1;
507 default:
508 break;
509 }
510 return 0;
511}
512
513static inline int is_siemens_bts(const struct gsm_bts *bts)
514{
515 switch (bts->type) {
516 case GSM_BTS_TYPE_BS11:
517 return 1;
518 default:
519 break;
520 }
521
522 return 0;
523}
524
525static inline int is_nokia_bts(const struct gsm_bts *bts)
526{
527 switch (bts->type) {
528 case GSM_BTS_TYPE_NOKIA_SITE:
529 return 1;
530 default:
531 break;
532 }
533
534 return 0;
535}
536
537static inline int is_ericsson_bts(const struct gsm_bts *bts)
538{
539 switch (bts->type) {
540 case GSM_BTS_TYPE_RBS2000:
541 return 1;
542 default:
543 break;
544 }
545
546 return 0;
547}
548
549static inline int is_e1_bts(const struct gsm_bts *bts)
550{
551 switch (bts->type) {
552 case GSM_BTS_TYPE_BS11:
553 case GSM_BTS_TYPE_RBS2000:
554 case GSM_BTS_TYPE_NOKIA_SITE:
555 return 1;
556 default:
557 break;
558 }
559
560 return 0;
561}
562
563static inline const struct osmo_location_area_id *bts_lai(struct gsm_bts *bts)
564{
565 static struct osmo_location_area_id lai;
566 lai = (struct osmo_location_area_id){
567 .plmn = bts->network->plmn,
568 .lac = bts->location_area_code,
569 };
570 return &lai;
571}
572
Pau Espin Pedrol4338de52020-09-30 12:52:04 +0200573static inline struct gsm_bts *gsm_bts_sm_get_bts(struct gsm_bts_sm *site_mgr) {
574 return (struct gsm_bts *)container_of(site_mgr, struct gsm_bts, site_mgr);
575}
576
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200577struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num);
578
579char *gsm_bts_name(const struct gsm_bts *bts);
580
581bool gsm_bts_matches_lai(const struct gsm_bts *bts, const struct osmo_location_area_id *lai);
582bool gsm_bts_matches_cell_id(const struct gsm_bts *bts, const struct gsm0808_cell_id *cell_id);
583
584int gsm_bts_local_neighbor_add(struct gsm_bts *bts, struct gsm_bts *neighbor);
585int gsm_bts_local_neighbor_del(struct gsm_bts *bts, const struct gsm_bts *neighbor);
586
587/* return the gsm_lchan for the CBCH (if it exists at all) */
588struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts);
589
590int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type);
591
Pau Espin Pedrole2f1c952020-07-16 14:20:32 +0200592struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num);
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200593
594int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode);
595
596unsigned long long bts_uptime(const struct gsm_bts *bts);
597
598char *get_model_oml_status(const struct gsm_bts *bts);
599/* reset the state of all MO in the BTS */
600void gsm_bts_mo_reset(struct gsm_bts *bts);
601
602/* dependency handling */
603void bts_depend_mark(struct gsm_bts *bts, int dep);
604void bts_depend_clear(struct gsm_bts *bts, int dep);
605int bts_depend_check(struct gsm_bts *bts);
606int bts_depend_is_depedency(struct gsm_bts *base, struct gsm_bts *other);
607
608int gsm_bts_get_radio_link_timeout(const struct gsm_bts *bts);
609void gsm_bts_set_radio_link_timeout(struct gsm_bts *bts, int value);
610
611void gsm_bts_all_ts_dispatch(struct gsm_bts *bts, uint32_t ts_ev, void *data);
612
613int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan);
614
Pau Espin Pedrol8d4f94a2020-07-16 15:17:20 +0200615int gsm_bts_set_system_infos(struct gsm_bts *bts);
616
Pau Espin Pedrol388ed582020-07-15 20:53:16 +0200617int gsm_bts_model_register(struct gsm_bts_model *model);
618struct gsm_bts_model *bts_model_find(enum gsm_bts_type type);
619
620enum gsm_bts_type str2btstype(const char *arg);
621const char *btstype2str(enum gsm_bts_type type);
622
623enum bts_attribute str2btsattr(const char *s);
624const char *btsatttr2str(enum bts_attribute v);
625
626enum gsm_bts_type_variant str2btsvariant(const char *arg);
627const char *btsvariant2str(enum gsm_bts_type_variant v);