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