diff options
Diffstat (limited to 'include/osmocom/bsc/bts.h')
-rw-r--r-- | include/osmocom/bsc/bts.h | 455 |
1 files changed, 255 insertions, 200 deletions
diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h index 7f369042e..4faf5f291 100644 --- a/include/osmocom/bsc/bts.h +++ b/include/osmocom/bsc/bts.h @@ -12,14 +12,36 @@ #include <osmocom/abis/e1_input.h> +#include "osmocom/bsc/power_control.h" #include "osmocom/bsc/gsm_data.h" #include "osmocom/bsc/bts_trx.h" +#include "osmocom/bsc/bts_sm.h" +#include "osmocom/bsc/abis_om2000.h" +#include "osmocom/bsc/paging.h" +#include "osmocom/bsc/bts_setup_ramp.h" enum bts_counter_id { BTS_CTR_CHREQ_TOTAL, + BTS_CTR_CHREQ_ATTEMPTED_EMERG, + BTS_CTR_CHREQ_ATTEMPTED_CALL, + BTS_CTR_CHREQ_ATTEMPTED_LOCATION_UPD, + BTS_CTR_CHREQ_ATTEMPTED_PAG, + BTS_CTR_CHREQ_ATTEMPTED_PDCH, + BTS_CTR_CHREQ_ATTEMPTED_OTHER, + BTS_CTR_CHREQ_ATTEMPTED_UNKNOWN, BTS_CTR_CHREQ_SUCCESSFUL, + BTS_CTR_CHREQ_SUCCESSFUL_EMERG, + BTS_CTR_CHREQ_SUCCESSFUL_CALL, + BTS_CTR_CHREQ_SUCCESSFUL_LOCATION_UPD, + BTS_CTR_CHREQ_SUCCESSFUL_PAG, + BTS_CTR_CHREQ_SUCCESSFUL_PDCH, + BTS_CTR_CHREQ_SUCCESSFUL_OTHER, + BTS_CTR_CHREQ_SUCCESSFUL_UNKNOWN, BTS_CTR_CHREQ_NO_CHANNEL, + BTS_CTR_CHREQ_MAX_DELAY_EXCEEDED, BTS_CTR_CHAN_RF_FAIL, + BTS_CTR_CHAN_RF_FAIL_TCH, + BTS_CTR_CHAN_RF_FAIL_SDCCH, BTS_CTR_CHAN_RLL_ERR, BTS_CTR_BTS_OML_FAIL, BTS_CTR_BTS_RSL_FAIL, @@ -34,8 +56,15 @@ enum bts_counter_id { BTS_CTR_PAGING_EXPIRED, BTS_CTR_PAGING_NO_ACTIVE_PAGING, BTS_CTR_PAGING_MSC_FLUSH, + BTS_CTR_PAGING_OVERLOAD, BTS_CTR_CHAN_ACT_TOTAL, + BTS_CTR_CHAN_ACT_SDCCH, + BTS_CTR_CHAN_ACT_TCH, BTS_CTR_CHAN_ACT_NACK, + BTS_CTR_CHAN_TCH_ACTIVE_MILLISECONDS_TOTAL, + BTS_CTR_CHAN_SDCCH_ACTIVE_MILLISECONDS_TOTAL, + BTS_CTR_CHAN_TCH_FULLY_ESTABLISHED, + BTS_CTR_CHAN_SDCCH_FULLY_ESTABLISHED, BTS_CTR_RSL_UNKNOWN, BTS_CTR_RSL_IPA_NACK, BTS_CTR_RSL_DELETE_IND, @@ -50,6 +79,7 @@ enum bts_counter_id { BTS_CTR_LCHAN_BORKEN_EV_RF_CHAN_REL_ACK, BTS_CTR_LCHAN_BORKEN_EV_VTY, BTS_CTR_LCHAN_BORKEN_EV_TEARDOWN, + BTS_CTR_LCHAN_BORKEN_EV_TS_ERROR, BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RR_CHAN_MODE_MODIFY_ACK, BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RSL_CHAN_MODE_MODIFY_ACK, BTS_CTR_TS_BORKEN_FROM_NOT_INITIALIZED, @@ -64,12 +94,30 @@ enum bts_counter_id { BTS_CTR_TS_BORKEN_EV_PDCH_DEACT_ACK_NACK, BTS_CTR_TS_BORKEN_EV_TEARDOWN, BTS_CTR_ASSIGNMENT_ATTEMPTED, + BTS_CTR_ASSIGNMENT_ATTEMPTED_SIGN, + BTS_CTR_ASSIGNMENT_ATTEMPTED_SPEECH, BTS_CTR_ASSIGNMENT_COMPLETED, + BTS_CTR_ASSIGNMENT_COMPLETED_SIGN, + BTS_CTR_ASSIGNMENT_COMPLETED_SPEECH, BTS_CTR_ASSIGNMENT_STOPPED, + BTS_CTR_ASSIGNMENT_STOPPED_SIGN, + BTS_CTR_ASSIGNMENT_STOPPED_SPEECH, BTS_CTR_ASSIGNMENT_NO_CHANNEL, + BTS_CTR_ASSIGNMENT_NO_CHANNEL_SIGN, + BTS_CTR_ASSIGNMENT_NO_CHANNEL_SPEECH, BTS_CTR_ASSIGNMENT_TIMEOUT, + BTS_CTR_ASSIGNMENT_TIMEOUT_SIGN, + BTS_CTR_ASSIGNMENT_TIMEOUT_SPEECH, BTS_CTR_ASSIGNMENT_FAILED, + BTS_CTR_ASSIGNMENT_FAILED_SIGN, + BTS_CTR_ASSIGNMENT_FAILED_SPEECH, BTS_CTR_ASSIGNMENT_ERROR, + BTS_CTR_ASSIGNMENT_ERROR_SIGN, + BTS_CTR_ASSIGNMENT_ERROR_SPEECH, + BTS_CTR_LOCATION_UPDATE_ACCEPT, + BTS_CTR_LOCATION_UPDATE_REJECT, + BTS_CTR_LOCATION_UPDATE_DETACH, + BTS_CTR_LOCATION_UPDATE_UNKNOWN, BTS_CTR_HANDOVER_ATTEMPTED, BTS_CTR_HANDOVER_COMPLETED, BTS_CTR_HANDOVER_STOPPED, @@ -91,6 +139,13 @@ enum bts_counter_id { BTS_CTR_INTRA_BSC_HO_TIMEOUT, BTS_CTR_INTRA_BSC_HO_FAILED, BTS_CTR_INTRA_BSC_HO_ERROR, + BTS_CTR_INCOMING_INTRA_BSC_HO_ATTEMPTED, + BTS_CTR_INCOMING_INTRA_BSC_HO_COMPLETED, + BTS_CTR_INCOMING_INTRA_BSC_HO_STOPPED, + BTS_CTR_INCOMING_INTRA_BSC_HO_NO_CHANNEL, + BTS_CTR_INCOMING_INTRA_BSC_HO_TIMEOUT, + BTS_CTR_INCOMING_INTRA_BSC_HO_FAILED, + BTS_CTR_INCOMING_INTRA_BSC_HO_ERROR, BTS_CTR_INTER_BSC_HO_OUT_ATTEMPTED, BTS_CTR_INTER_BSC_HO_OUT_COMPLETED, BTS_CTR_INTER_BSC_HO_OUT_STOPPED, @@ -104,123 +159,49 @@ enum bts_counter_id { BTS_CTR_INTER_BSC_HO_IN_FAILED, BTS_CTR_INTER_BSC_HO_IN_TIMEOUT, BTS_CTR_INTER_BSC_HO_IN_ERROR, + BTS_CTR_SRVCC_ATTEMPTED, + BTS_CTR_SRVCC_COMPLETED, + BTS_CTR_SRVCC_STOPPED, + BTS_CTR_SRVCC_NO_CHANNEL, + BTS_CTR_SRVCC_TIMEOUT, + BTS_CTR_SRVCC_FAILED, + BTS_CTR_SRVCC_ERROR, + BTS_CTR_ALL_ALLOCATED_SDCCH, + BTS_CTR_ALL_ALLOCATED_STATIC_SDCCH, + BTS_CTR_ALL_ALLOCATED_TCH, + BTS_CTR_ALL_ALLOCATED_STATIC_TCH, + BTS_CTR_CM_SERV_REJ, + BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_HLR, + BTS_CTR_CM_SERV_REJ_ILLEGAL_MS, + BTS_CTR_CM_SERV_REJ_IMSI_UNKNOWN_IN_VLR, + BTS_CTR_CM_SERV_REJ_IMEI_NOT_ACCEPTED, + BTS_CTR_CM_SERV_REJ_ILLEGAL_ME, + BTS_CTR_CM_SERV_REJ_PLMN_NOT_ALLOWED, + BTS_CTR_CM_SERV_REJ_LOC_NOT_ALLOWED, + BTS_CTR_CM_SERV_REJ_ROAMING_NOT_ALLOWED, + BTS_CTR_CM_SERV_REJ_NETWORK_FAILURE, + BTS_CTR_CM_SERV_REJ_SYNCH_FAILURE, + BTS_CTR_CM_SERV_REJ_CONGESTION, + BTS_CTR_CM_SERV_REJ_SRV_OPT_NOT_SUPPORTED, + BTS_CTR_CM_SERV_REJ_RQD_SRV_OPT_NOT_SUPPORTED, + BTS_CTR_CM_SERV_REJ_SRV_OPT_TMP_OUT_OF_ORDER, + BTS_CTR_CM_SERV_REJ_CALL_CAN_NOT_BE_IDENTIFIED, + BTS_CTR_CM_SERV_REJ_INCORRECT_MESSAGE, + BTS_CTR_CM_SERV_REJ_INVALID_MANDANTORY_INF, + BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_IMPLEMENTED, + BTS_CTR_CM_SERV_REJ_MSG_TYPE_NOT_COMPATIBLE, + BTS_CTR_CM_SERV_REJ_INF_ELEME_NOT_IMPLEMENTED, + BTS_CTR_CM_SERV_REJ_CONDTIONAL_IE_ERROR, + BTS_CTR_CM_SERV_REJ_MSG_NOT_COMPATIBLE, + BTS_CTR_CM_SERV_REJ_PROTOCOL_ERROR, + BTS_CTR_CM_SERV_REJ_RETRY_IN_NEW_CELL, }; -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_WAIT_RR_CHAN_MODE_MODIFY_ACK] = {"lchan_borken:from_state:wait_rr_chan_mode_modify_ack", "Transitions from lchan WAIT_RR_CHAN_MODE_MODIFY_ACK state to BORKEN state"}, - [BTS_CTR_LCHAN_BORKEN_FROM_WAIT_RSL_CHAN_MODE_MODIFY_ACK] = {"lchan_borken:from_state:wait_rsl_chan_mode_modify_ack", "Transitions from lchan RSL_CHAN_MODE_MODIFY_ACK 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"}, - - [BTS_CTR_HANDOVER_ATTEMPTED] = {"handover:attempted", "Intra-BSC handover attempts"}, - [BTS_CTR_HANDOVER_COMPLETED] = {"handover:completed", "Intra-BSC handover completed"}, - [BTS_CTR_HANDOVER_STOPPED] = {"handover:stopped", "Connection ended during HO"}, - [BTS_CTR_HANDOVER_NO_CHANNEL] = {"handover:no_channel", "Failure to allocate lchan for HO"}, - [BTS_CTR_HANDOVER_TIMEOUT] = {"handover:timeout", "Handover timed out"}, - [BTS_CTR_HANDOVER_FAILED] = {"handover:failed", "Received Handover Fail messages"}, - [BTS_CTR_HANDOVER_ERROR] = {"handover:error", "Re-assignment failed for other reason"}, - - [BTS_CTR_INTRA_CELL_HO_ATTEMPTED] = {"intra_cell_ho:attempted", "Intra-Cell handover attempts"}, - [BTS_CTR_INTRA_CELL_HO_COMPLETED] = {"intra_cell_ho:completed", "Intra-Cell handover completed"}, - [BTS_CTR_INTRA_CELL_HO_STOPPED] = {"intra_cell_ho:stopped", "Connection ended during HO"}, - [BTS_CTR_INTRA_CELL_HO_NO_CHANNEL] = {"intra_cell_ho:no_channel", "Failure to allocate lchan for HO"}, - [BTS_CTR_INTRA_CELL_HO_TIMEOUT] = {"intra_cell_ho:timeout", "Handover timed out"}, - [BTS_CTR_INTRA_CELL_HO_FAILED] = {"intra_cell_ho:failed", "Received Handover Fail messages"}, - [BTS_CTR_INTRA_CELL_HO_ERROR] = {"intra_cell_ho:error", "Re-assignment failed for other reason"}, - - [BTS_CTR_INTRA_BSC_HO_ATTEMPTED] = {"intra_bsc_ho:attempted", "Intra-BSC handover attempts"}, - [BTS_CTR_INTRA_BSC_HO_COMPLETED] = {"intra_bsc_ho:completed", "Intra-BSC handover completed"}, - [BTS_CTR_INTRA_BSC_HO_STOPPED] = {"intra_bsc_ho:stopped", "Connection ended during HO"}, - [BTS_CTR_INTRA_BSC_HO_NO_CHANNEL] = {"intra_bsc_ho:no_channel", "Failure to allocate lchan for HO"}, - [BTS_CTR_INTRA_BSC_HO_TIMEOUT] = {"intra_bsc_ho:timeout", "Handover timed out"}, - [BTS_CTR_INTRA_BSC_HO_FAILED] = {"intra_bsc_ho:failed", "Received Handover Fail messages"}, - [BTS_CTR_INTRA_BSC_HO_ERROR] = {"intra_bsc_ho:error", "Re-assignment failed for other reason"}, - - [BTS_CTR_INTER_BSC_HO_OUT_ATTEMPTED] = {"interbsc_ho_out:attempted", - "Attempts to handover to remote BSS"}, - [BTS_CTR_INTER_BSC_HO_OUT_COMPLETED] = {"interbsc_ho_out:completed", - "Handover to remote BSS completed"}, - [BTS_CTR_INTER_BSC_HO_OUT_STOPPED] = {"interbsc_ho_out:stopped", "Connection ended during HO"}, - [BTS_CTR_INTER_BSC_HO_OUT_TIMEOUT] = {"interbsc_ho_out:timeout", "Handover timed out"}, - [BTS_CTR_INTER_BSC_HO_OUT_FAILED] = {"interbsc_ho_out:failed", "Received Handover Fail message"}, - [BTS_CTR_INTER_BSC_HO_OUT_ERROR] = {"interbsc_ho_out:error", - "Handover to remote BSS failed for other reason"}, - - [BTS_CTR_INTER_BSC_HO_IN_ATTEMPTED] = {"interbsc_ho_in:attempted", - "Attempts to handover from remote BSS"}, - [BTS_CTR_INTER_BSC_HO_IN_COMPLETED] = {"interbsc_ho_in:completed", - "Handover from remote BSS completed"}, - [BTS_CTR_INTER_BSC_HO_IN_STOPPED] = {"interbsc_ho_in:stopped", "Connection ended during HO"}, - [BTS_CTR_INTER_BSC_HO_IN_NO_CHANNEL] = {"interbsc_ho_in:no_channel", - "Failure to allocate lchan for HO"}, - [BTS_CTR_INTER_BSC_HO_IN_TIMEOUT] = {"interbsc_ho_in:timeout", "Handover from remote BSS timed out"}, - [BTS_CTR_INTER_BSC_HO_IN_FAILED] = {"interbsc_ho_in:failed", "Received Handover Fail message"}, - [BTS_CTR_INTER_BSC_HO_IN_ERROR] = {"interbsc_ho_in:error", - "Handover from remote BSS 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, -}; +extern const struct rate_ctr_desc bts_ctr_description[]; +extern const struct rate_ctr_group_desc bts_ctrg_desc; enum { + BTS_STAT_UPTIME_SECONDS, BTS_STAT_CHAN_LOAD_AVERAGE, BTS_STAT_CHAN_CCCH_SDCCH4_USED, BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL, @@ -236,8 +217,8 @@ enum { 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_CHAN_OSMO_DYN_USED, + BTS_STAT_CHAN_OSMO_DYN_TOTAL, BTS_STAT_T3122, BTS_STAT_RACH_BUSY, BTS_STAT_RACH_ACCESS, @@ -245,63 +226,15 @@ enum { BTS_STAT_RSL_CONNECTED, BTS_STAT_LCHAN_BORKEN, BTS_STAT_TS_BORKEN, + BTS_STAT_NUM_TRX_RSL_CONNECTED, + BTS_STAT_NUM_TRX_TOTAL, + BTS_STAT_PAGING_REQ_QUEUE_LENGTH, + BTS_STAT_PAGING_AVAILABLE_SLOTS, + BTS_STAT_PAGING_T3113, }; -static const struct osmo_stat_item_desc bts_stat_desc[] = { - [BTS_STAT_CHAN_LOAD_AVERAGE] = { "chanloadavg", "Channel load average", "%", 16, 0 }, - [BTS_STAT_CHAN_CCCH_SDCCH4_USED] = { "chan_ccch_sdcch4:used", - "Number of CCCH+SDCCH4 channels used", "", 16, 0 }, - [BTS_STAT_CHAN_CCCH_SDCCH4_TOTAL] = { "chan_ccch_sdcch4:total", - "Number of CCCH+SDCCH4 channels total", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_F_USED] = { "chan_tch_f:used", - "Number of TCH/F channels used", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_F_TOTAL] = { "chan_tch_f:total", - "Number of TCH/F channels total", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_H_USED] = { "chan_tch_h:used", - "Number of TCH/H channels used", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_H_TOTAL] = { "chan_tch_h:total", - "Number of TCH/H channels total", "", 16, 0 }, - [BTS_STAT_CHAN_SDCCH8_USED] = { "chan_sdcch8:used", - "Number of SDCCH8 channels used", "", 16, 0 }, - [BTS_STAT_CHAN_SDCCH8_TOTAL] = { "chan_sdcch8:total", - "Number of SDCCH8 channels total", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_F_PDCH_USED] = { "chan_tch_f_pdch:used", - "Number of TCH/F_PDCH channels used", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_F_PDCH_TOTAL] = { "chan_tch_f_pdch:total", - "Number of TCH/F_PDCH channels total", "", 16, 0 }, - [BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_USED] = { "chan_ccch_sdcch4_cbch:used", - "Number of CCCH+SDCCH4+CBCH channels used", "", 16, 0 }, - [BTS_STAT_CHAN_CCCH_SDCCH4_CBCH_TOTAL] = { "chan_ccch_sdcch4_cbch:total", - "Number of CCCH+SDCCH4+CBCH channels total", "", 16, 0 }, - [BTS_STAT_CHAN_SDCCH8_CBCH_USED] = { "chan_sdcch8_cbch:used", - "Number of SDCCH8+CBCH channels used", "", 16, 0 }, - [BTS_STAT_CHAN_SDCCH8_CBCH_TOTAL] = { "chan_sdcch8_cbch:total", - "Number of SDCCH8+CBCH channels total", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_USED] = { "chan_tch_f_tch_h_pdch:used", - "Number of TCH/F_TCH/H_PDCH channels used", "", 16, 0 }, - [BTS_STAT_CHAN_TCH_F_TCH_H_PDCH_TOTAL] = { "chan_tch_f_tch_h_pdch:total", - "Number of TCH/F_TCH/H_PDCH channels total", "", 16, 0 }, - [BTS_STAT_T3122] = { "T3122", "T3122 IMMEDIATE ASSIGNMENT REJECT wait indicator", - "s", 16, GSM_T3122_DEFAULT }, - [BTS_STAT_RACH_BUSY] = { "rach_busy", - "RACH slots with signal above threshold", "%", 16, 0 }, - [BTS_STAT_RACH_ACCESS] = { "rach_access", - "RACH slots with access bursts in them", "%", 16, 0 }, - [BTS_STAT_OML_CONNECTED] = { "oml_connected", "Number of OML links connected", "", 16, 0 }, - [BTS_STAT_RSL_CONNECTED] = { "rsl_connected", "Number of RSL links connected", "", 16, 0 }, - [BTS_STAT_LCHAN_BORKEN] = { "lchan_borken", - "Number of lchans in the BORKEN state", "", 16, 0 }, - [BTS_STAT_TS_BORKEN] = { "ts_borken", - "Number of timeslots in the BORKEN state", "", 16, 0 }, -}; - -static const struct osmo_stat_item_group_desc bts_statg_desc = { - .group_name_prefix = "bts", - .group_description = "base transceiver station", - .class_id = OSMO_STATS_CLASS_GLOBAL, - .num_items = ARRAY_SIZE(bts_stat_desc), - .item_desc = bts_stat_desc, -}; +extern const struct osmo_stat_item_desc bts_stat_desc[]; +extern const struct osmo_stat_item_group_desc bts_statg_desc; enum gsm_bts_type { GSM_BTS_TYPE_UNKNOWN, @@ -331,6 +264,13 @@ enum bts_attribute { TRX_PHY_VERSION, }; +enum bts_tch_signalling_policy { + BTS_TCH_SIGNALLING_NEVER, + BTS_TCH_SIGNALLING_EMERG, + BTS_TCH_SIGNALLING_VOICE, + BTS_TCH_SIGNALLING_ALWAYS, +}; + struct vty; struct gsm_bts_model { @@ -341,12 +281,27 @@ struct gsm_bts_model { const char *name; bool started; + /* start the model itself */ int (*start)(struct gsm_network *net); + + /* initialize a single BTS for this model */ + int (*bts_init)(struct gsm_bts *bts); + + /* initialize a single TRX for this model */ + int (*trx_init)(struct gsm_bts_trx *trx); + int (*oml_rcvmsg)(struct msgb *msg); char * (*oml_status)(const struct gsm_bts *bts); void (*e1line_bind_ops)(struct e1inp_line *line); + /* (Optional) function for encoding MS/BS Power Control paramaters */ + int (*power_ctrl_enc_rsl_params)(struct msgb *msg, const struct gsm_power_ctrl_params *cp); + /* (Optional) function for sending default MS/BS Power Control paramaters */ + int (*power_ctrl_send_def_params)(const struct gsm_bts_trx *trx); + /* (Optional) function for toggling BCCH carrier power reduction operation */ + int (*power_ctrl_set_c0_power_red)(const struct gsm_bts *bts, const uint8_t red); + 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); @@ -356,9 +311,19 @@ struct gsm_bts_model { struct tlv_definition nm_att_tlvdef; - /* features of a given BTS model set via gsm_bts_model_register() locally */ + /* features of a given BTS model set via gsm_bts_model_register() + * locally, see doc/bts-features.txt */ struct bitvec features; uint8_t _features_data[MAX_BTS_FEATURES/8]; + /* BTS reports features during OML bring up */ + bool features_get_reported; +}; + +struct gsm_gprs_cell { + struct gsm_abis_mo mo; + uint16_t bvci; + uint8_t timer[11]; + struct gprs_rlc_cfg rlc_cfg; }; /* One BTS */ @@ -388,12 +353,18 @@ struct gsm_bts { char version[MAX_VERSION_LENGTH]; char sub_model[MAX_VERSION_LENGTH]; - /* features of a given BTS set/reported via OML */ + /* features of a given BTS either hardcoded or set/reported via OML, + * see doc/bts-features.txt */ struct bitvec features; uint8_t _features_data[MAX_BTS_FEATURES/8]; + /* Features have been reported by the BTS or were copied from the BTS + * model */ + bool features_known; /* Connected PCU version (if any) */ char pcu_version[MAX_VERSION_LENGTH]; + /* PCU sign_link, over OML line: */ + struct e1inp_sign_link *osmo_link; /* maximum Tx power that the MS is permitted to use in this cell */ int ms_max_power; @@ -425,9 +396,7 @@ struct gsm_bts { /* CCCH is on C0 */ struct gsm_bts_trx *c0; - struct { - struct gsm_abis_mo mo; - } site_mgr; + struct gsm_bts_sm *site_mgr; /* backpointer */ /* bitmask of all SI that are present/valid in si_buf */ uint32_t si_valid; @@ -461,6 +430,7 @@ struct gsm_bts { struct gsm_envabtse envabtse[4]; } bs11; struct { + struct osmo_fsm_inst *bts_fi; struct { struct om2k_mo om2k_mo; struct gsm_abis_mo mo; @@ -493,6 +463,7 @@ struct gsm_bts { uint16_t limit; uint16_t active; } om2k_version[16]; + enum om2k_sync_src sync_src; } rbs2000; struct { uint8_t bts_type; @@ -509,26 +480,24 @@ struct gsm_bts { /* 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]; + struct gsm_gprs_cell cell; uint8_t rac; uint8_t net_ctrl_ord; bool ctrl_ack_type_use_block; bool egprs_pkt_chan_request; + struct { + bool active; /* CCN_ACTIVE */ + bool forced_vty; /* set by VTY ? */ + } ccn; /* TS 44.060 sec 8.8.2 */ + struct { + uint8_t alpha; /* ALPHA*10, units of 0.1, range <0-10> */ + } pwr_ctrl; /* TS 44.060 Table 12.9.1 */ } gprs; - /* threshold (in percent) when BTS shall send CCCH LOAD IND */ - int ccch_load_ind_thresh; + /* CCCH Load Threshold: threshold (in percent) when BTS shall send CCCH LOAD IND */ + uint8_t ccch_load_ind_thresh; + /* CCCH Load Indication Period: how often (secs) to send CCCH LOAD IND when over CCCH Load Threshold. */ + uint8_t ccch_load_ind_period; /* RACH NM values */ int rach_b_thresh; @@ -551,7 +520,26 @@ struct gsm_bts { /* should the channel allocator allocate channels from high TRX to TRX0, * rather than starting from TRX0 and go upwards? */ - int chan_alloc_reverse; + bool chan_alloc_chan_req_reverse; + bool chan_alloc_assignment_reverse; + bool chan_alloc_handover_reverse; + + /* Whether to use dynamic allocation mode for assignment */ + bool chan_alloc_assignment_dynamic; + /* Parameters used for dynamic mode of allocation */ + struct { + bool sort_by_trx_power; + uint8_t ul_rxlev_thresh; + uint8_t ul_rxlev_avg_num; + uint8_t c0_chan_load_thresh; + } chan_alloc_dyn_params; + + /* When true, interference measurements from the BTS are used in the channel allocator to favor lchans with less + * interference reported in RSL Resource Indication. */ + bool chan_alloc_avoid_interf; + + /* If SDCCHs are exhausted, when can we use TCH for signalling purposes. */ + enum bts_tch_signalling_policy chan_alloc_tch_signalling_policy; enum neigh_list_manual_mode neigh_list_manual_mode; /* parameters from which we build SYSTEM INFORMATION */ @@ -559,7 +547,7 @@ struct gsm_bts { 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 osmo_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; @@ -567,6 +555,7 @@ struct gsm_bts { struct bitvec si5_neigh_list; struct osmo_earfcn_si2q si2quater_neigh_list; size_t uarfcn_length; /* index for uarfcn and scramble lists */ + size_t cell_chan_num; /* number of channels in Cell Allocation */ struct { /* bitmask large enough for all possible ARFCN's */ uint8_t neigh_list[1024/8]; @@ -594,6 +583,10 @@ struct gsm_bts { /* exclude the BTS from the global RF Lock handling */ int excl_from_rf_lock; + /* MGW specificities for this BTS: */ + int mgw_pool_target; /* Pin to specific MGW. -1 = wildcard */ + bool mgw_pool_target_strict; /* Only allow pinned MGW */ + /* supported codecs beside FR */ struct bts_codec_conf codec; @@ -604,6 +597,9 @@ struct gsm_bts { struct amr_multirate_conf mr_full; struct amr_multirate_conf mr_half; + /* osmux config: */ + enum osmux_usage use_osmux; + /* PCU socket state */ char *pcu_sock_path; struct pcu_sock_state *pcu_state; @@ -613,10 +609,13 @@ struct gsm_bts { 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; + /* Local and remote neighbor configuration: a list of neighbors as written in the VTY config, not resolved to + * actual cells. Entries may point at non-existing BTS numbers, or yet unconfigured ARFCN+BSIC. The point of + * this list is to keep the config as the user entered it: a) to write it back exactly as entered, and b) to + * allow adding neighbor cells that will only be configured further down in the config file. + * An actual neighbor cell object (local or remote-BSS) is resolved "at runtime" whenever a neighbor is being + * looked up. */ + struct llist_head neighbors; /* BTS-specific overrides for timer values from struct gsm_network. */ uint8_t T3122; /* ASSIGNMENT REJECT wait indication */ @@ -631,10 +630,47 @@ struct gsm_bts { 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 bts_etws_state etws; struct llist_head oml_fail_rep; struct llist_head chan_rqd_queue; + + /* ACCH Repetition capabilities */ + struct abis_rsl_osmo_rep_acch_cap rep_acch_cap; + + /* ACCH Temporary overpower capabilities */ + struct abis_rsl_osmo_temp_ovp_acch_cap top_acch_cap; + /* Channel mode(s) for which to allow TOP */ + enum { + TOP_ACCH_CHAN_MODE_ANY = 0, /* Any kind of channel mode */ + TOP_ACCH_CHAN_MODE_SPEECH_V3, /* Speech channels using AMR codec */ + } top_acch_chan_mode; + + /* MS/BS Power Control parameters */ + struct gsm_power_ctrl_params ms_power_ctrl; + struct gsm_power_ctrl_params bs_power_ctrl; + + /* Maximum BCCH carrier power reduction */ + uint8_t c0_max_power_red_db; + + /* Interference Measurement Parameters, as read from VTY */ + struct gsm_interf_meas_params interf_meas_params_cfg; + /* Interference Measurement Parameters, as last sent via OML */ + struct gsm_interf_meas_params interf_meas_params_used; + + /* We will ignore CHAN RQD with access delay greater than rach_max_delay */ + uint8_t rach_max_delay; + + /* Is Fast return to LTE allowed during Chan Release in this BTS? */ + bool srvcc_fast_return_allowed; + + /* At what point in the channel allocation sequence to dispatch the Immediate Assignment (Abis optimization) */ + enum imm_ass_time imm_ass_time; + + struct chan_counts chan_counts; + struct all_allocated all_allocated; + + struct bts_setup_ramp bts_setup_ramp; }; #define GSM_BTS_SI2Q(bts, i) (struct gsm48_system_information_type_2quater *)((bts)->si_buf[SYSINFO_TYPE_2quater][i]) @@ -654,7 +690,7 @@ static inline int is_ipaccess_bts(const struct gsm_bts *bts) return 0; } -static inline int is_sysmobts_v2(const struct gsm_bts *bts) +static inline int is_osmobts(const struct gsm_bts *bts) { switch (bts->type) { case GSM_BTS_TYPE_OSMOBTS: @@ -725,12 +761,15 @@ static inline const struct osmo_location_area_id *bts_lai(struct gsm_bts *bts) return &lai; } -struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num); +struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, struct gsm_bts_sm *bts_sm, uint8_t bts_num); +int gsm_bts_check_cfg(struct gsm_bts *bts); char *gsm_bts_name(const struct gsm_bts *bts); 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); +void gsm_bts_cell_id(struct gsm0808_cell_id *cell_id, const struct gsm_bts *bts); +void gsm_bts_cell_id_list(struct gsm0808_cell_id_list2 *cell_id_list, const struct gsm_bts *bts); 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); @@ -738,18 +777,30 @@ int gsm_bts_local_neighbor_del(struct gsm_bts *bts, const struct gsm_bts *neighb /* return the gsm_lchan for the CBCH (if it exists at all) */ struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts); +int gsm_set_bts_model(struct gsm_bts *bts, struct gsm_bts_model *model); int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type); struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num); int bts_gprs_mode_is_compat(struct gsm_bts *bts, enum bts_gprs_mode mode); +#define BTS_STORE_UPTIME_INTERVAL 10 /* in seconds */ +void bts_store_uptime(struct gsm_bts *bts); + unsigned long long bts_uptime(const struct gsm_bts *bts); +#define BTS_STORE_LCHAN_DURATIONS_INTERVAL 1 /* in seconds */ +void bts_store_lchan_durations(struct gsm_bts *bts); + char *get_model_oml_status(const struct gsm_bts *bts); /* reset the state of all MO in the BTS */ void gsm_bts_mo_reset(struct gsm_bts *bts); +static inline bool gsm_bts_features_negotiated(struct gsm_bts *bts) +{ + return bts->mo.get_attr_rep_received || bts->mo.nm_state.operational == NM_OPSTATE_ENABLED; +} + /* dependency handling */ void bts_depend_mark(struct gsm_bts *bts, int dep); void bts_depend_clear(struct gsm_bts *bts, int dep); @@ -761,10 +812,12 @@ void gsm_bts_set_radio_link_timeout(struct gsm_bts *bts, int value); void gsm_bts_all_ts_dispatch(struct gsm_bts *bts, uint32_t ts_ev, void *data); -int bts_count_free_ts(struct gsm_bts *bts, enum gsm_phys_chan_config pchan); - int gsm_bts_set_system_infos(struct gsm_bts *bts); +int gsm_bts_set_c0_power_red(struct gsm_bts *bts, const uint8_t red); + +void gsm_bts_stats_reset(struct gsm_bts *bts); + int gsm_bts_model_register(struct gsm_bts_model *model); struct gsm_bts_model *bts_model_find(enum gsm_bts_type type); @@ -776,3 +829,5 @@ 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); + +bool gsm_bts_check_ny1(const struct gsm_bts *bts); |