diff options
Diffstat (limited to 'include/osmocom/bsc/gsm_data.h')
-rw-r--r-- | include/osmocom/bsc/gsm_data.h | 632 |
1 files changed, 6 insertions, 626 deletions
diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h index c35798192..a74e6d982 100644 --- a/include/osmocom/bsc/gsm_data.h +++ b/include/osmocom/bsc/gsm_data.h @@ -39,6 +39,7 @@ struct mgcp_client_conf; struct mgcp_client; struct gsm0808_cell_id; struct osmo_mgcpc_ep; +struct gsm_bts; /** annotations for msgb ownership */ #define __uses @@ -772,69 +773,8 @@ struct gsm_bts_trx { struct gsm_bts_trx_ts ts[TRX_NR_TS]; }; -#define GSM_BTS_SI2Q(bts, i) (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i]) -#define GSM_BTS_HAS_SI(bts, i) ((bts)->si_valid & (1 << i)) -#define GSM_BTS_SI(bts, i) (void *)((bts)->si_buf[i][0]) #define GSM_LCHAN_SI(lchan, i) (void *)((lchan)->si.buf[i][0]) -enum gsm_bts_type { - GSM_BTS_TYPE_UNKNOWN, - GSM_BTS_TYPE_BS11, - GSM_BTS_TYPE_NANOBTS, - GSM_BTS_TYPE_RBS2000, - GSM_BTS_TYPE_NOKIA_SITE, - GSM_BTS_TYPE_OSMOBTS, - _NUM_GSM_BTS_TYPE -}; - -enum gsm_bts_type_variant { - BTS_UNKNOWN, - BTS_OSMO_LITECELL15, - BTS_OSMO_OCTPHY, - BTS_OSMO_SYSMO, - BTS_OSMO_TRX, - _NUM_BTS_VARIANT -}; - -/* Used by OML layer for BTS Attribute reporting */ -enum bts_attribute { - BTS_TYPE_VARIANT, - BTS_SUB_MODEL, - TRX_PHY_VERSION, -}; - -struct vty; - -struct gsm_bts_model { - struct llist_head list; - - enum gsm_bts_type type; - enum gsm_bts_type_variant variant; - const char *name; - - bool started; - int (*start)(struct gsm_network *net); - int (*oml_rcvmsg)(struct msgb *msg); - char * (*oml_status)(const struct gsm_bts *bts); - - void (*e1line_bind_ops)(struct e1inp_line *line); - - void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts); - void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx); - void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts); - - /* Should SI2bis and SI2ter be disabled by default on this BTS model? */ - bool force_combined_si; - - struct tlv_definition nm_att_tlvdef; - - /* features of a given BTS model set via gsm_bts_model_register() locally */ - struct bitvec features; - uint8_t _features_data[MAX_BTS_FEATURES/8]; -}; - - - /* * This keeps track of the paging status of one BTS. It * includes a number of pending requests, a back pointer @@ -1004,280 +944,6 @@ struct bts_oml_fail_rep { struct msgb *mb; }; -/* One BTS */ -struct gsm_bts { - /* list header in net->bts_list */ - struct llist_head list; - - /* Geographical location of the BTS */ - struct llist_head loc_list; - - /* number of this BTS in network */ - uint8_t nr; - /* human readable name / description */ - char *description; - /* Cell Identity */ - uint16_t cell_identity; - /* location area code of this BTS */ - uint16_t location_area_code; - /* Base Station Identification Code (BSIC), lower 3 bits is BCC, - * which is used as TSC for the CCCH */ - uint8_t bsic; - /* type of BTS */ - enum gsm_bts_type type; - enum gsm_bts_type_variant variant; - struct gsm_bts_model *model; - enum gsm_band band; - char version[MAX_VERSION_LENGTH]; - char sub_model[MAX_VERSION_LENGTH]; - - /* features of a given BTS set/reported via OML */ - struct bitvec features; - uint8_t _features_data[MAX_BTS_FEATURES/8]; - - /* Connected PCU version (if any) */ - char pcu_version[MAX_VERSION_LENGTH]; - - /* maximum Tx power that the MS is permitted to use in this cell */ - int ms_max_power; - - /* how do we talk OML with this TRX? */ - struct gsm_e1_subslot oml_e1_link; - uint8_t oml_tei; - struct e1inp_sign_link *oml_link; - /* Timer to use for deferred drop of OML link, see \ref ipaccess_drop_oml_deferred */ - struct osmo_timer_list oml_drop_link_timer; - /* when OML link was established */ - time_t uptime; - - /* Abis network management O&M handle */ - struct abis_nm_h *nmh; - - struct gsm_abis_mo mo; - - /* number of this BTS on given E1 link */ - uint8_t bts_nr; - - /* DTX features of this BTS */ - enum gsm48_dtx_mode dtxu; - bool dtxd; - - /* paging state and control */ - struct gsm_bts_paging_state paging; - - /* CCCH is on C0 */ - struct gsm_bts_trx *c0; - - struct { - struct gsm_abis_mo mo; - } site_mgr; - - /* bitmask of all SI that are present/valid in si_buf */ - uint32_t si_valid; - /* 3GPP TS 44.018 Table 10.5.2.33b.1 INDEX and COUNT for SI2quater */ - uint8_t si2q_index; /* distinguish individual SI2quater messages */ - uint8_t si2q_count; /* si2q_index for the last (highest indexed) individual SI2quater message */ - /* buffers where we put the pre-computed SI */ - sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM]; - /* offsets used while generating SI2quater */ - size_t e_offset; - size_t u_offset; - /* 3GPP TS 08.58 ยง8.5.1 BCCH INFORMATION. Some nanoBTS fail upon - * receival of empty SI disabling unsupported SI. see OS#3707. */ - bool si_unused_send_empty; - - /* ip.access Unit ID's have Site/BTS/TRX layout */ - union { - struct { - uint16_t site_id; - uint16_t bts_id; - uint32_t flags; - uint32_t rsl_ip; - } ip_access; - struct { - struct { - struct gsm_abis_mo mo; - } cclk; - struct { - struct gsm_abis_mo mo; - } rack; - struct gsm_envabtse envabtse[4]; - } bs11; - struct { - struct { - struct om2k_mo om2k_mo; - struct gsm_abis_mo mo; - struct llist_head conn_groups; - } cf; - struct { - struct om2k_mo om2k_mo; - struct gsm_abis_mo mo; - struct llist_head conn_groups; - } is; - struct { - struct om2k_mo om2k_mo; - struct gsm_abis_mo mo; - struct llist_head conn_groups; - } con; - struct { - struct om2k_mo om2k_mo; - struct gsm_abis_mo mo; - } dp; - struct { - struct om2k_mo om2k_mo; - struct gsm_abis_mo mo; - } tf; - struct { - struct om2k_mo om2k_mo; - struct gsm_abis_mo mo; - } mctr; - uint32_t use_superchannel:1; - struct { - uint16_t limit; - uint16_t active; - } om2k_version[16]; - } rbs2000; - struct { - uint8_t bts_type; - unsigned int configured:1, /* we sent the config data request */ - skip_reset:1, /* skip reset at bootstrap */ - no_loc_rel_cnf:1, /* don't wait for RSL REL CONF */ - bts_reset_timer_cnf, /* timer for BTS RESET */ - did_reset:1, /* we received a RESET ACK */ - wait_reset:2; /* we are waiting for reset to complete */ - struct osmo_timer_list reset_timer; - } nokia; - }; - - /* Not entirely sure how ip.access specific this is */ - struct { - enum bts_gprs_mode mode; - struct { - struct gsm_abis_mo mo; - uint16_t nsei; - uint8_t timer[7]; - } nse; - struct { - struct gsm_abis_mo mo; - uint16_t bvci; - uint8_t timer[11]; - struct gprs_rlc_cfg rlc_cfg; - } cell; - struct gsm_bts_gprs_nsvc nsvc[2]; - uint8_t rac; - uint8_t net_ctrl_ord; - bool ctrl_ack_type_use_block; - bool egprs_pkt_chan_request; - } gprs; - - /* threshold (in percent) when BTS shall send CCCH LOAD IND */ - int ccch_load_ind_thresh; - - /* RACH NM values */ - int rach_b_thresh; - int rach_ldavg_slots; - - /* transceivers */ - int num_trx; - struct llist_head trx_list; - - /* SI related items */ - int force_combined_si; - bool force_combined_si_set; - int bcch_change_mark; - - /* Abis NM queue */ - struct llist_head abis_queue; - int abis_nm_pend; - - struct gsm_network *network; - - /* should the channel allocator allocate channels from high TRX to TRX0, - * rather than starting from TRX0 and go upwards? */ - int chan_alloc_reverse; - - enum neigh_list_manual_mode neigh_list_manual_mode; - /* parameters from which we build SYSTEM INFORMATION */ - struct { - struct gsm48_rach_control rach_control; - uint8_t ncc_permitted; - struct gsm48_cell_sel_par cell_sel_par; - struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */ - struct gsm48_cell_options cell_options; - struct gsm48_control_channel_descr chan_desc; - struct bitvec neigh_list; - struct bitvec cell_alloc; - struct bitvec si5_neigh_list; - struct osmo_earfcn_si2q si2quater_neigh_list; - size_t uarfcn_length; /* index for uarfcn and scramble lists */ - struct { - /* bitmask large enough for all possible ARFCN's */ - uint8_t neigh_list[1024/8]; - uint8_t cell_alloc[1024/8]; - /* If the user wants a different neighbor list in SI5 than in SI2 */ - uint8_t si5_neigh_list[1024/8]; - uint8_t meas_bw_list[MAX_EARFCN_LIST]; - uint16_t earfcn_list[MAX_EARFCN_LIST]; - uint16_t uarfcn_list[MAX_EARFCN_LIST]; - uint16_t scramble_list[MAX_EARFCN_LIST]; - } data; - } si_common; - bool early_classmark_allowed; - bool early_classmark_allowed_3g; - /* for testing only: Have an infinitely long radio link timeout */ - bool infinite_radio_link_timeout; - - /* do we use static (user-defined) system information messages? (bitmask) */ - uint32_t si_mode_static; - - /* access control class ramping */ - struct acc_ramp acc_ramp; - - /* exclude the BTS from the global RF Lock handling */ - int excl_from_rf_lock; - - /* supported codecs beside FR */ - struct bts_codec_conf codec; - - /* BTS dependencies bit field */ - uint32_t depends_on[256/(8*4)]; - - /* full and half rate multirate config */ - struct amr_multirate_conf mr_full; - struct amr_multirate_conf mr_half; - - /* PCU socket state */ - char *pcu_sock_path; - struct pcu_sock_state *pcu_state; - - struct rate_ctr_group *bts_ctrs; - struct osmo_stat_item_group *bts_statg; - - struct handover_cfg *ho; - - /* A list of struct gsm_bts_ref, indicating neighbors of this BTS. - * When the si_common neigh_list is in automatic mode, it is populated from this list as well as - * gsm_network->neighbor_bss_cells. */ - struct llist_head local_neighbors; - - /* BTS-specific overrides for timer values from struct gsm_network. */ - uint8_t T3122; /* ASSIGNMENT REJECT wait indication */ - bool T3113_dynamic; /* Calculate T3113 timeout dynamically based on BTS channel config and load */ - - /* Periodic channel load measurements are used to maintain T3122. */ - struct load_counter chan_load_samples[7]; - int chan_load_samples_idx; - uint8_t chan_load_avg; /* current channel load average in percent (0 - 100). */ - - /* cell broadcast system */ - struct osmo_timer_list cbch_timer; - struct bts_smscb_chan_state cbch_basic; - struct bts_smscb_chan_state cbch_extended; - struct osmo_timer_list etws_timer; /* when to stop ETWS PN */ - - struct llist_head oml_fail_rep; -}; - /* One rejected BTS */ struct gsm_bts_rejected { /* list header in net->bts_rejected */ @@ -1291,28 +957,14 @@ struct gsm_bts_rejected { struct gsm_network *gsm_network_init(void *ctx); -struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num); struct gsm_bts *gsm_bts_num(const struct gsm_network *net, int num); -bool gsm_bts_matches_lai(const struct gsm_bts *bts, const struct osmo_location_area_id *lai); -bool gsm_bts_matches_cell_id(const struct gsm_bts *bts, const struct gsm0808_cell_id *cell_id); struct gsm_bts *gsm_bts_by_cell_id(const struct gsm_network *net, const struct gsm0808_cell_id *cell_id, int match_idx); -int gsm_bts_local_neighbor_add(struct gsm_bts *bts, struct gsm_bts *neighbor); -int gsm_bts_local_neighbor_del(struct gsm_bts *bts, const struct gsm_bts *neighbor); struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts); struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num); -enum gsm_bts_type str2btstype(const char *arg); -const char *btstype2str(enum gsm_bts_type type); - -enum bts_attribute str2btsattr(const char *s); -const char *btsatttr2str(enum bts_attribute v); - -enum gsm_bts_type_variant str2btsvariant(const char *arg); -const char *btsvariant2str(enum gsm_bts_type_variant v); - extern const struct value_string gsm_chreq_descs[]; extern const struct value_string gsm_pchant_names[]; extern const struct value_string gsm_pchant_descs[]; @@ -1323,7 +975,6 @@ static inline const char *gsm_pchan_id(enum gsm_phys_chan_config c) enum gsm_phys_chan_config gsm_pchan_parse(const char *name); const char *gsm_lchant_name(enum gsm_chan_t c); const char *gsm_chreq_name(enum gsm_chreq_reason_t c); -char *gsm_bts_name(const struct gsm_bts *bts); char *gsm_trx_name(const struct gsm_bts_trx *trx); char *gsm_ts_name(const struct gsm_bts_trx_ts *ts); char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts); @@ -1335,6 +986,8 @@ static inline char *gsm_lchan_name(const struct gsm_lchan *lchan) } void gsm_abis_mo_reset(struct gsm_abis_mo *mo); +void gsm_mo_init(struct gsm_abis_mo *mo, struct gsm_bts *bts, + uint8_t obj_class, uint8_t p1, uint8_t p2, uint8_t p3); struct gsm_nm_state * gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class, @@ -1343,9 +996,6 @@ void * gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, const struct abis_om_obj_inst *obj_inst); -/* reset the state of all MO in the BTS */ -void gsm_bts_mo_reset(struct gsm_bts *bts); - uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan, uint8_t ts_nr, uint8_t lchan_nr); uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan); @@ -1356,16 +1006,7 @@ void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd, const struct gsm_lchan *lchan); void gsm48_lchan2chan_desc_as_configured(struct gsm48_chan_desc *cd, const struct gsm_lchan *lchan); -/* return the gsm_lchan for the CBCH (if it exists at all) */ -struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts); - -static inline uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts) -{ - if (ts->tsc != -1) - return ts->tsc; - else - return ts->trx->bts->bsic & 7; -} +uint8_t gsm_ts_tsc(const struct gsm_bts_trx_ts *ts); struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr, int *rc); @@ -1375,164 +1016,11 @@ uint8_t pchan_subslots(enum gsm_phys_chan_config pchan); bool ts_is_tch(struct gsm_bts_trx_ts *ts); -static inline struct gsm_bts *conn_get_bts(struct gsm_subscriber_connection *conn) { - if (!conn || !conn->lchan) - return NULL; - return conn->lchan->ts->trx->bts; -} +struct gsm_bts *conn_get_bts(struct gsm_subscriber_connection *conn); void conn_update_ms_power_class(struct gsm_subscriber_connection *conn, uint8_t power_class); void lchan_update_ms_power_ctrl_level(struct gsm_lchan *lchan, int ms_power_dbm); -enum bts_counter_id { - BTS_CTR_CHREQ_TOTAL, - BTS_CTR_CHREQ_SUCCESSFUL, - BTS_CTR_CHREQ_NO_CHANNEL, - BTS_CTR_CHAN_RF_FAIL, - BTS_CTR_CHAN_RLL_ERR, - BTS_CTR_BTS_OML_FAIL, - BTS_CTR_BTS_RSL_FAIL, - BTS_CTR_CODEC_AMR_F, - BTS_CTR_CODEC_AMR_H, - BTS_CTR_CODEC_EFR, - BTS_CTR_CODEC_V1_FR, - BTS_CTR_CODEC_V1_HR, - BTS_CTR_PAGING_ATTEMPTED, - BTS_CTR_PAGING_ALREADY, - BTS_CTR_PAGING_RESPONDED, - BTS_CTR_PAGING_EXPIRED, - BTS_CTR_PAGING_NO_ACTIVE_PAGING, - BTS_CTR_PAGING_MSC_FLUSH, - BTS_CTR_CHAN_ACT_TOTAL, - BTS_CTR_CHAN_ACT_NACK, - BTS_CTR_RSL_UNKNOWN, - BTS_CTR_RSL_IPA_NACK, - BTS_CTR_RSL_DELETE_IND, - BTS_CTR_MODE_MODIFY_NACK, - BTS_CTR_LCHAN_BORKEN_FROM_UNUSED, - BTS_CTR_LCHAN_BORKEN_FROM_WAIT_ACTIV_ACK, - BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RF_RELEASE_ACK, - BTS_CTR_LCHAN_BORKEN_FROM_BORKEN, - BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN, - BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK, - BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK, - BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK, - BTS_CTR_LCHAN_BORKEN_EV_VTY, - BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN, - BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED, - BTS_CTR_TS_BORKEN_FROM_UNUSED, - BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_ACT, - BTS_CTR_TS_BORKEN_FROM_PDCH, - BTS_CTR_TS_BORKEN_FROM_WAIT_PDCH_DEACT, - BTS_CTR_TS_BORKEN_FROM_IN_USE, - BTS_CTR_TS_BORKEN_FROM_BORKEN, - BTS_CTR_TS_BORKEN_FROM_UNKNOWN, - BTS_CTR_TS_BORKEN_EV_PDCH_ACT_ACK_NACK, - BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK, - BTS_CTR_TS_BORKEN_EV_TEARDOWN, - BTS_CTR_ASSIGNMENT_ATTEMPTED, - BTS_CTR_ASSIGNMENT_COMPLETED, - BTS_CTR_ASSIGNMENT_STOPPED, - BTS_CTR_ASSIGNMENT_NO_CHANNEL, - BTS_CTR_ASSIGNMENT_TIMEOUT, - BTS_CTR_ASSIGNMENT_FAILED, - BTS_CTR_ASSIGNMENT_ERROR, -}; - -static const struct rate_ctr_desc bts_ctr_description[] = { - [BTS_CTR_CHREQ_TOTAL] = {"chreq:total", "Received channel requests"}, - [BTS_CTR_CHREQ_SUCCESSFUL] = {"chreq:successful", "Successful channel requests (immediate assign sent)"}, - [BTS_CTR_CHREQ_NO_CHANNEL] = {"chreq:no_channel", "Sent to MS no channel available"}, - [BTS_CTR_CHAN_RF_FAIL] = {"chan:rf_fail", "Received a RF failure indication from BTS"}, - [BTS_CTR_CHAN_RLL_ERR] = {"chan:rll_err", "Received a RLL failure with T200 cause from BTS"}, - [BTS_CTR_BTS_OML_FAIL] = {"oml_fail", "Received a TEI down on a OML link"}, - [BTS_CTR_BTS_RSL_FAIL] = {"rsl_fail", "Received a TEI down on a OML link"}, - [BTS_CTR_CODEC_AMR_F] = {"codec:amr_f", "Count the usage of AMR/F codec by channel mode requested"}, - [BTS_CTR_CODEC_AMR_H] = {"codec:amr_h", "Count the usage of AMR/H codec by channel mode requested"}, - [BTS_CTR_CODEC_EFR] = {"codec:efr", "Count the usage of EFR codec by channel mode requested"}, - [BTS_CTR_CODEC_V1_FR] = {"codec:fr", "Count the usage of FR codec by channel mode requested"}, - [BTS_CTR_CODEC_V1_HR] = {"codec:hr", "Count the usage of HR codec by channel mode requested"}, - - [BTS_CTR_PAGING_ATTEMPTED] = {"paging:attempted", "Paging attempts for a subscriber"}, - [BTS_CTR_PAGING_ALREADY] = {"paging:already", "Paging attempts ignored as subscriber was already being paged"}, - [BTS_CTR_PAGING_RESPONDED] = {"paging:responded", "Paging attempts with successful paging response"}, - [BTS_CTR_PAGING_EXPIRED] = {"paging:expired", "Paging Request expired because of timeout T3113"}, - [BTS_CTR_PAGING_NO_ACTIVE_PAGING] = {"paging:no_active_paging", "Paging response without an active paging request (arrived after paging expiration?)"}, - [BTS_CTR_PAGING_MSC_FLUSH] = {"paging:msc_flush", "Paging flushed due to MSC Reset BSSMAP message"}, - [BTS_CTR_CHAN_ACT_TOTAL] = {"chan_act:total", "Total number of Channel Activations"}, - [BTS_CTR_CHAN_ACT_NACK] = {"chan_act:nack", "Number of Channel Activations that the BTS NACKed"}, - [BTS_CTR_RSL_UNKNOWN] = {"rsl:unknown", "Number of unknown/unsupported RSL messages received from BTS"}, - [BTS_CTR_RSL_IPA_NACK] = {"rsl:ipa_nack", "Number of IPA (RTP/dyn-PDCH) related NACKs received from BTS"}, - [BTS_CTR_RSL_DELETE_IND] = {"rsl:delete_ind", "Number of RSL DELETE INDICATION (DL CCCH overload)"}, - [BTS_CTR_MODE_MODIFY_NACK] = {"chan:mode_modify_nack", "Number of Channel Mode Modify NACKs received from BTS"}, - - /* lchan/TS BORKEN state counters */ - [BTS_CTR_LCHAN_BORKEN_FROM_UNUSED] = {"lchan_borken:from_state:unused", "Transitions from lchan UNUSED state to BORKEN state"}, - [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"}, - [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"}, - [BTS_CTR_LCHAN_BORKEN_FROM_BORKEN] = {"lchan_borken:from_state:borken", "Transitions from lchan BORKEN state to BORKEN state"}, - [BTS_CTR_LCHAN_BORKEN_FROM_UNKNOWN] = {"lchan_borken:from_state:unknown", "Transitions from an unknown lchan state to BORKEN state"}, - [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_ACK] = {"lchan_borken:event:chan_activ_ack", "CHAN_ACTIV_ACK received in the lchan BORKEN state"}, - [BTS_CTR_LCHAN_BORKEN_EV_CHAN_ACTIV_NACK] = {"lchan_borken:event:chan_activ_nack", "CHAN_ACTIV_NACK received in the lchan BORKEN state"}, - [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"}, - [BTS_CTR_LCHAN_BORKEN_EV_VTY] = {"lchan_borken:event:vty", "VTY commands received in the lchan BORKEN state"}, - [BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN] = {"lchan_borken:event:teardown", "lchan in a BORKEN state is shutting down (BTS disconnected?)"}, - [BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED] = {"ts_borken:from_state:not_initialized", "Transitions from TS NOT_INITIALIZED state to BORKEN state"}, - [BTS_CTR_TS_BORKEN_FROM_UNUSED] = {"ts_borken:from_state:unused", "Transitions from TS UNUSED state to BORKEN state"}, - [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"}, - [BTS_CTR_TS_BORKEN_FROM_PDCH] = {"ts_borken:from_state:pdch", "Transitions from TS PDCH state to BORKEN state"}, - [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"}, - [BTS_CTR_TS_BORKEN_FROM_IN_USE] = {"ts_borken:from_state:in_use", "Transitions from TS IN_USE state to BORKEN state"}, - [BTS_CTR_TS_BORKEN_FROM_BORKEN] = {"ts_borken:from_state:borken", "Transitions from TS BORKEN state to BORKEN state"}, - [BTS_CTR_TS_BORKEN_FROM_UNKNOWN] = {"ts_borken:from_state:unknown", "Transitions from an unknown TS state to BORKEN state"}, - [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"}, - [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"}, - [BTS_CTR_TS_BORKEN_EV_TEARDOWN] = {"ts_borken:event:teardown", "TS in a BORKEN state is shutting down (BTS disconnected?)"}, - [BTS_CTR_ASSIGNMENT_ATTEMPTED] = {"assignment:attempted", "Assignment attempts"}, - [BTS_CTR_ASSIGNMENT_COMPLETED] = {"assignment:completed", "Assignment completed"}, - [BTS_CTR_ASSIGNMENT_STOPPED] = {"assignment:stopped", "Connection ended during Assignment"}, - [BTS_CTR_ASSIGNMENT_NO_CHANNEL] = {"assignment:no_channel", "Failure to allocate lchan for Assignment"}, - [BTS_CTR_ASSIGNMENT_TIMEOUT] = {"assignment:timeout", "Assignment timed out"}, - [BTS_CTR_ASSIGNMENT_FAILED] = {"assignment:failed", "Received Assignment Failure message"}, - [BTS_CTR_ASSIGNMENT_ERROR] = {"assignment:error", "Assignment failed for other reason"}, - -}; - -static const struct rate_ctr_group_desc bts_ctrg_desc = { - "bts", - "base transceiver station", - OSMO_STATS_CLASS_GLOBAL, - ARRAY_SIZE(bts_ctr_description), - bts_ctr_description, -}; - -enum { - BTS_STAT_CHAN_LOAD_AVERAGE, - BTS_STAT_CHAN_CCCH_SDCCH4_USED, - BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL, - BTS_STAT_CHAN_TCH_F_USED, - BTS_STAT_CHAN_TCH_F_TOTAL, - BTS_STAT_CHAN_TCH_H_USED, - BTS_STAT_CHAN_TCH_H_TOTAL, - BTS_STAT_CHAN_SDCCH8_USED, - BTS_STAT_CHAN_SDCCH8_TOTAL, - BTS_STAT_CHAN_TCH_F_PDCH_USED, - BTS_STAT_CHAN_TCH_F_PDCH_TOTAL, - BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED, - BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL, - BTS_STAT_CHAN_SDCCH8_CBCH_USED, - BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL, - BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED, - BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL, - BTS_STAT_T3122, - BTS_STAT_RACH_BUSY, - BTS_STAT_RACH_ACCESS, - BTS_STAT_OML_CONNECTED, - BTS_STAT_RSL_CONNECTED, - BTS_STAT_LCHAN_BORKEN, - BTS_STAT_TS_BORKEN, -}; - enum { BSC_CTR_ASSIGNMENT_ATTEMPTED, BSC_CTR_ASSIGNMENT_COMPLETED, @@ -1743,20 +1231,8 @@ struct gsm_audio_support { ver : 7; }; -static inline const struct osmo_location_area_id *bts_lai(struct gsm_bts *bts) -{ - static struct osmo_location_area_id lai; - lai = (struct osmo_location_area_id){ - .plmn = bts->network->plmn, - .lac = bts->location_area_code, - }; - return &lai; -} - extern void talloc_ctx_init(void *ctx_root); -int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type); - enum gsm_bts_type parse_btstype(const char *arg); const char *btstype2str(enum gsm_bts_type type); struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac, @@ -1764,91 +1240,14 @@ struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac, extern void *tall_bsc_ctx; -/* this actually refers to the IPA transport, not the BTS model */ -static inline int is_ipaccess_bts(const struct gsm_bts *bts) -{ - switch (bts->type) { - case GSM_BTS_TYPE_NANOBTS: - case GSM_BTS_TYPE_OSMOBTS: - return 1; - default: - break; - } - return 0; -} - -static inline int is_sysmobts_v2(const struct gsm_bts *bts) -{ - switch (bts->type) { - case GSM_BTS_TYPE_OSMOBTS: - return 1; - default: - break; - } - return 0; -} - -static inline int is_siemens_bts(const struct gsm_bts *bts) -{ - switch (bts->type) { - case GSM_BTS_TYPE_BS11: - return 1; - default: - break; - } - - return 0; -} - -static inline int is_nokia_bts(const struct gsm_bts *bts) -{ - switch (bts->type) { - case GSM_BTS_TYPE_NOKIA_SITE: - return 1; - default: - break; - } - - return 0; -} - -static inline int is_ericsson_bts(const struct gsm_bts *bts) -{ - switch (bts->type) { - case GSM_BTS_TYPE_RBS2000: - return 1; - default: - break; - } - - return 0; -} - -static inline int is_e1_bts(const struct gsm_bts *bts) -{ - switch (bts->type) { - case GSM_BTS_TYPE_BS11: - case GSM_BTS_TYPE_RBS2000: - case GSM_BTS_TYPE_NOKIA_SITE: - return 1; - default: - break; - } - - return 0; -} - extern struct gsm_network *bsc_gsmnet; enum bts_gprs_mode bts_gprs_mode_parse(const char *arg, int *valid); const char *bts_gprs_mode_name(enum bts_gprs_mode mode); -int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode); void gsm48_ra_id_by_bts(struct gsm48_ra_id *buf, struct gsm_bts *bts); void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts); -int gsm_bts_model_register(struct gsm_bts_model *model); - struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *network); struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, enum gsm_bts_type type, uint8_t bsic); @@ -1858,42 +1257,23 @@ void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr, uint8_t e1_ts, uint8_t e1_ts_ss); void gsm_trx_lock_rf(struct gsm_bts_trx *trx, bool locked, const char *reason); -struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr); int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx); int gsm_bts_set_system_infos(struct gsm_bts *bts); /* generic E1 line operations for all ISDN-based BTS. */ extern struct e1inp_line_ops bts_isdn_e1inp_line_ops; -extern const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE+1]; -extern const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1]; - -char *get_model_oml_status(const struct gsm_bts *bts); - -unsigned long long bts_uptime(const struct gsm_bts *bts); - /* control interface handling */ int bsc_base_ctrl_cmds_install(void); -/* dependency handling */ -void bts_depend_mark(struct gsm_bts *bts, int dep); -void bts_depend_clear(struct gsm_bts *bts, int dep); -int bts_depend_check(struct gsm_bts *bts); -int bts_depend_is_depedency(struct gsm_bts *base, struct gsm_bts *other); - -int gsm_bts_get_radio_link_timeout(const struct gsm_bts *bts); -void gsm_bts_set_radio_link_timeout(struct gsm_bts *bts, int value); - bool trx_is_usable(const struct gsm_bts_trx *trx); bool ts_is_usable(const struct gsm_bts_trx_ts *ts); int gsm_lchan_type_by_pchan(enum gsm_phys_chan_config pchan); enum gsm_phys_chan_config gsm_pchan_by_lchan_type(enum gsm_chan_t type); -void gsm_bts_all_ts_dispatch(struct gsm_bts *bts, uint32_t ts_ev, void *data); void gsm_trx_all_ts_dispatch(struct gsm_bts_trx *trx, uint32_t ts_ev, void *data); - -int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan); +int trx_count_free_ts(struct gsm_bts_trx *trx, enum gsm_phys_chan_config pchan); bool trx_has_valid_pchan_config(const struct gsm_bts_trx *trx); |