Massive removal of unused code/structs/headers
osmo-msc still had large amounts of dead code that came along from openbsc.git. This commit removes a lot of it, mostly stuff relevant only to the BSC side of things (or even GPRS). Change-Id: I247def85da2dc3ec461389fb74414a0d964e7e3c Related: OS#2528
This commit is contained in:
parent
8b1cba8421
commit
d35038d229
|
@ -1,24 +1,15 @@
|
|||
noinst_HEADERS = \
|
||||
abis_nm.h \
|
||||
abis_om2000.h \
|
||||
abis_rsl.h \
|
||||
a_iface.h \
|
||||
a_iface_bssap.h \
|
||||
arfcn_range_encode.h \
|
||||
auth.h \
|
||||
bsc_api.h \
|
||||
bsc_msc.h \
|
||||
bsc_msg_filter.h \
|
||||
bsc_rll.h \
|
||||
chan_alloc.h \
|
||||
common.h \
|
||||
common_bsc.h \
|
||||
common_cs.h \
|
||||
crc24.h \
|
||||
ctrl.h \
|
||||
db.h \
|
||||
debug.h \
|
||||
e1_config.h \
|
||||
gsm_04_08.h \
|
||||
gsm_04_11.h \
|
||||
gsm_04_14.h \
|
||||
|
@ -27,39 +18,25 @@ noinst_HEADERS = \
|
|||
gsm_data_shared.h \
|
||||
gsm_subscriber.h \
|
||||
gsup_client.h \
|
||||
handover.h \
|
||||
handover_decision.h \
|
||||
ipaccess.h \
|
||||
iucs.h \
|
||||
iucs_ranap.h \
|
||||
iu_dummy.h \
|
||||
meas_rep.h \
|
||||
misdn.h \
|
||||
mncc.h \
|
||||
mncc_int.h \
|
||||
msc_ifaces.h \
|
||||
network_listen.h \
|
||||
oap_client.h \
|
||||
openbscdefines.h \
|
||||
osmo_bsc.h \
|
||||
a_reset.h \
|
||||
osmo_msc.h \
|
||||
osmo_bsc_sigtran.h \
|
||||
bsc_msc_data.h \
|
||||
osmux.h \
|
||||
rrlp.h \
|
||||
rs232.h \
|
||||
rtp_proxy.h \
|
||||
signal.h \
|
||||
silent_call.h \
|
||||
slhc.h \
|
||||
smpp.h \
|
||||
sms_queue.h \
|
||||
socket.h \
|
||||
system_information.h \
|
||||
transaction.h \
|
||||
trau_mux.h \
|
||||
trau_upqueue.h \
|
||||
ussd.h \
|
||||
vlr.h \
|
||||
vty.h \
|
||||
|
|
|
@ -1,180 +0,0 @@
|
|||
/* GSM Network Management messages on the A-bis interface
|
||||
* 3GPP TS 12.21 version 8.0.0 Release 1999 / ETSI TS 100 623 V8.0.0 */
|
||||
|
||||
/* (C) 2008-2009 by Harald Welte <laforge@gnumonks.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _NM_H
|
||||
#define _NM_H
|
||||
|
||||
#include <osmocom/gsm/tlv.h>
|
||||
#include <osmocom/gsm/abis_nm.h>
|
||||
#include <osmocom/gsm/protocol/gsm_12_21.h>
|
||||
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
|
||||
/* max number of attributes represented as 3GPP TS 52.021 §9.4.62 SW Description array */
|
||||
#define MAX_BTS_ATTR 5
|
||||
|
||||
struct cell_global_id {
|
||||
uint16_t mcc;
|
||||
uint16_t mnc;
|
||||
uint16_t lac;
|
||||
uint16_t ci;
|
||||
};
|
||||
|
||||
/* The BCCH info from an ip.access test, in host byte order
|
||||
* and already parsed... */
|
||||
struct ipac_bcch_info {
|
||||
struct llist_head list;
|
||||
|
||||
uint16_t info_type;
|
||||
uint8_t freq_qual;
|
||||
uint16_t arfcn;
|
||||
uint8_t rx_lev;
|
||||
uint8_t rx_qual;
|
||||
int16_t freq_err;
|
||||
uint16_t frame_offset;
|
||||
uint32_t frame_nr_offset;
|
||||
uint8_t bsic;
|
||||
struct cell_global_id cgi;
|
||||
uint8_t ba_list_si2[16];
|
||||
uint8_t ba_list_si2bis[16];
|
||||
uint8_t ba_list_si2ter[16];
|
||||
uint8_t ca_list_si1[16];
|
||||
};
|
||||
|
||||
/* PUBLIC */
|
||||
|
||||
struct msgb;
|
||||
|
||||
struct abis_nm_cfg {
|
||||
/* callback for unidirectional reports */
|
||||
int (*report_cb)(struct msgb *,
|
||||
struct abis_om_fom_hdr *);
|
||||
/* callback for software activate requests from BTS */
|
||||
int (*sw_act_req)(struct msgb *);
|
||||
};
|
||||
|
||||
extern int abis_nm_rcvmsg(struct msgb *msg);
|
||||
|
||||
int abis_nm_tlv_parse(struct tlv_parsed *tp, struct gsm_bts *bts, const uint8_t *buf, int len);
|
||||
int abis_nm_rx(struct msgb *msg);
|
||||
int abis_nm_opstart(struct gsm_bts *bts, uint8_t obj_class, uint8_t i0, uint8_t i1, uint8_t i2);
|
||||
int abis_nm_chg_adm_state(struct gsm_bts *bts, uint8_t obj_class, uint8_t i0,
|
||||
uint8_t i1, uint8_t i2, enum abis_nm_adm_state adm_state);
|
||||
int abis_nm_establish_tei(struct gsm_bts *bts, uint8_t trx_nr,
|
||||
uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot,
|
||||
uint8_t tei);
|
||||
int abis_nm_conn_terr_sign(struct gsm_bts_trx *trx,
|
||||
uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot);
|
||||
int abis_nm_conn_terr_traf(struct gsm_bts_trx_ts *ts,
|
||||
uint8_t e1_port, uint8_t e1_timeslot,
|
||||
uint8_t e1_subslot);
|
||||
int abis_nm_get_attr(struct gsm_bts *bts, uint8_t obj_class,
|
||||
uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
|
||||
const uint8_t *attr, uint8_t attr_len);
|
||||
int abis_nm_set_bts_attr(struct gsm_bts *bts, uint8_t *attr, int attr_len);
|
||||
int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, uint8_t *attr, int attr_len);
|
||||
int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, uint8_t chan_comb);
|
||||
int abis_nm_sw_act_req_ack(struct gsm_bts *bts, uint8_t obj_class, uint8_t i1,
|
||||
uint8_t i2, uint8_t i3, int nack, uint8_t *attr, int att_len);
|
||||
int abis_nm_raw_msg(struct gsm_bts *bts, int len, uint8_t *msg);
|
||||
int abis_nm_event_reports(struct gsm_bts *bts, int on);
|
||||
int abis_nm_reset_resource(struct gsm_bts *bts);
|
||||
int abis_nm_software_load(struct gsm_bts *bts, int trx_nr, const char *fname,
|
||||
uint8_t win_size, int forced,
|
||||
gsm_cbfn *cbfn, void *cb_data);
|
||||
int abis_nm_software_load_status(struct gsm_bts *bts);
|
||||
int abis_nm_software_activate(struct gsm_bts *bts, const char *fname,
|
||||
gsm_cbfn *cbfn, void *cb_data);
|
||||
|
||||
int abis_nm_conn_mdrop_link(struct gsm_bts *bts, uint8_t e1_port0, uint8_t ts0,
|
||||
uint8_t e1_port1, uint8_t ts1);
|
||||
|
||||
int abis_nm_perform_test(struct gsm_bts *bts, uint8_t obj_class,
|
||||
uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
|
||||
uint8_t test_nr, uint8_t auton_report, struct msgb *msg);
|
||||
|
||||
/* Siemens / BS-11 specific */
|
||||
int abis_nm_bs11_reset_resource(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_db_transmission(struct gsm_bts *bts, int begin);
|
||||
int abis_nm_bs11_create_object(struct gsm_bts *bts, enum abis_bs11_objtype type,
|
||||
uint8_t idx, uint8_t attr_len, const uint8_t *attr);
|
||||
int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, uint8_t idx);
|
||||
int abis_nm_bs11_create_bport(struct gsm_bts *bts, uint8_t idx);
|
||||
int abis_nm_bs11_delete_object(struct gsm_bts *bts,
|
||||
enum abis_bs11_objtype type, uint8_t idx);
|
||||
int abis_nm_bs11_delete_bport(struct gsm_bts *bts, uint8_t idx);
|
||||
int abis_nm_bs11_conn_oml_tei(struct gsm_bts *bts, uint8_t e1_port,
|
||||
uint8_t e1_timeslot, uint8_t e1_subslot, uint8_t tei);
|
||||
int abis_nm_bs11_get_oml_tei_ts(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_get_serno(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_set_trx_power(struct gsm_bts_trx *trx, uint8_t level);
|
||||
int abis_nm_bs11_get_trx_power(struct gsm_bts_trx *trx);
|
||||
int abis_nm_bs11_logon(struct gsm_bts *bts, uint8_t level, const char *name, int on);
|
||||
int abis_nm_bs11_factory_logon(struct gsm_bts *bts, int on);
|
||||
int abis_nm_bs11_infield_logon(struct gsm_bts *bts, int on);
|
||||
int abis_nm_bs11_set_trx1_pw(struct gsm_bts *bts, const char *password);
|
||||
int abis_nm_bs11_set_pll_locked(struct gsm_bts *bts, int locked);
|
||||
int abis_nm_bs11_get_pll_mode(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_set_pll(struct gsm_bts *bts, int value);
|
||||
int abis_nm_bs11_get_cclk(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_get_state(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_load_swl(struct gsm_bts *bts, const char *fname,
|
||||
uint8_t win_size, int forced, gsm_cbfn *cbfn);
|
||||
int abis_nm_bs11_set_ext_time(struct gsm_bts *bts);
|
||||
int abis_nm_bs11_get_bport_line_cfg(struct gsm_bts *bts, uint8_t bport);
|
||||
int abis_nm_bs11_set_bport_line_cfg(struct gsm_bts *bts, uint8_t bport, enum abis_bs11_line_cfg line_cfg);
|
||||
int abis_nm_bs11_bsc_disconnect(struct gsm_bts *bts, int reconnect);
|
||||
int abis_nm_bs11_restart(struct gsm_bts *bts);
|
||||
|
||||
/* ip.access nanoBTS specific commands */
|
||||
int abis_nm_ipaccess_msg(struct gsm_bts *bts, uint8_t msg_type,
|
||||
uint8_t obj_class, uint8_t bts_nr,
|
||||
uint8_t trx_nr, uint8_t ts_nr,
|
||||
uint8_t *attr, int attr_len);
|
||||
int abis_nm_ipaccess_set_nvattr(struct gsm_bts_trx *trx, uint8_t *attr,
|
||||
int attr_len);
|
||||
int abis_nm_ipaccess_restart(struct gsm_bts_trx *trx);
|
||||
int abis_nm_ipaccess_set_attr(struct gsm_bts *bts, uint8_t obj_class,
|
||||
uint8_t bts_nr, uint8_t trx_nr, uint8_t ts_nr,
|
||||
uint8_t *attr, uint8_t attr_len);
|
||||
int abis_nm_ipaccess_rsl_connect(struct gsm_bts_trx *trx,
|
||||
uint32_t ip, uint16_t port, uint8_t stream);
|
||||
void abis_nm_ipaccess_cgi(uint8_t *buf, struct gsm_bts *bts);
|
||||
int ipac_parse_bcch_info(struct ipac_bcch_info *binf, uint8_t *buf);
|
||||
const char *ipacc_testres_name(uint8_t res);
|
||||
|
||||
/* Functions calling into other code parts */
|
||||
int nm_is_running(struct gsm_nm_state *s);
|
||||
|
||||
int abis_nm_vty_init(void);
|
||||
|
||||
void abis_nm_clear_queue(struct gsm_bts *bts);
|
||||
|
||||
int _abis_nm_sendmsg(struct msgb *msg);
|
||||
|
||||
void abis_nm_queue_send_next(struct gsm_bts *bts); /* for bs11_config. */
|
||||
|
||||
int abis_nm_select_newest_sw(const struct abis_nm_sw_desc *sw, const size_t len);
|
||||
|
||||
/* Helper functions for updating attributes */
|
||||
int abis_nm_update_max_power_red(struct gsm_bts_trx *trx);
|
||||
|
||||
#endif /* _NM_H */
|
|
@ -1,129 +0,0 @@
|
|||
#ifndef OPENBSC_ABIS_OM2K_H
|
||||
#define OPENBSC_ABIS_OM2K_H
|
||||
/* Ericsson RBS 2xxx GSM O&M (OM2000) messages on the A-bis interface
|
||||
* implemented based on protocol trace analysis, no formal documentation */
|
||||
|
||||
/* (C) 2010-2011 by Harald Welte <laforge@gnumonks.org>
|
||||
*
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
enum abis_om2k_mo_cls {
|
||||
OM2K_MO_CLS_TRXC = 0x01,
|
||||
OM2K_MO_CLS_TS = 0x03,
|
||||
OM2K_MO_CLS_TF = 0x04,
|
||||
OM2K_MO_CLS_IS = 0x05,
|
||||
OM2K_MO_CLS_CON = 0x06,
|
||||
OM2K_MO_CLS_DP = 0x07,
|
||||
OM2K_MO_CLS_CF = 0x0a,
|
||||
OM2K_MO_CLS_TX = 0x0b,
|
||||
OM2K_MO_CLS_RX = 0x0c,
|
||||
};
|
||||
|
||||
enum om2k_mo_state {
|
||||
OM2K_MO_S_RESET = 0,
|
||||
OM2K_MO_S_STARTED,
|
||||
OM2K_MO_S_ENABLED,
|
||||
OM2K_MO_S_DISABLED,
|
||||
};
|
||||
|
||||
/* on-wire format for IS conn group */
|
||||
struct om2k_is_conn_grp {
|
||||
uint16_t icp1;
|
||||
uint16_t icp2;
|
||||
uint8_t cont_idx;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* internal data formant for IS conn group */
|
||||
struct is_conn_group {
|
||||
struct llist_head list;
|
||||
uint16_t icp1;
|
||||
uint16_t icp2;
|
||||
uint8_t ci;
|
||||
};
|
||||
|
||||
/* on-wire format for CON Path */
|
||||
struct om2k_con_path {
|
||||
uint16_t ccp;
|
||||
uint8_t ci;
|
||||
uint8_t tag;
|
||||
uint8_t tei;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
/* internal data format for CON group */
|
||||
struct con_group {
|
||||
/* links list of CON groups in BTS */
|
||||
struct llist_head list;
|
||||
struct gsm_bts *bts;
|
||||
/* CON Group ID */
|
||||
uint8_t cg;
|
||||
/* list of CON paths in this group */
|
||||
struct llist_head paths;
|
||||
};
|
||||
|
||||
/* internal data format for CON path */
|
||||
struct con_path {
|
||||
/* links with con_group.paths */
|
||||
struct llist_head list;
|
||||
/* CON Connection Point */
|
||||
uint16_t ccp;
|
||||
/* Contiguity Index */
|
||||
uint8_t ci;
|
||||
/* Tag */
|
||||
uint8_t tag;
|
||||
/* TEI */
|
||||
uint8_t tei;
|
||||
};
|
||||
|
||||
extern const struct abis_om2k_mo om2k_mo_cf;
|
||||
extern const struct abis_om2k_mo om2k_mo_is;
|
||||
extern const struct abis_om2k_mo om2k_mo_con;
|
||||
extern const struct abis_om2k_mo om2k_mo_tf;
|
||||
|
||||
extern const struct value_string om2k_mo_class_short_vals[];
|
||||
|
||||
int abis_om2k_rcvmsg(struct msgb *msg);
|
||||
|
||||
extern const struct abis_om2k_mo om2k_mo_cf;
|
||||
|
||||
int abis_om2k_tx_reset_cmd(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_start_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_status_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_connect_cmd(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_disconnect_cmd(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_enable_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_disable_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_test_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_op_info(struct gsm_bts *bts, const struct abis_om2k_mo *mo,
|
||||
uint8_t operational);
|
||||
int abis_om2k_tx_cap_req(struct gsm_bts *bts, const struct abis_om2k_mo *mo);
|
||||
int abis_om2k_tx_is_conf_req(struct gsm_bts *bts);
|
||||
int abis_om2k_tx_tf_conf_req(struct gsm_bts *bts);
|
||||
int abis_om2k_tx_rx_conf_req(struct gsm_bts_trx *trx);
|
||||
int abis_om2k_tx_tx_conf_req(struct gsm_bts_trx *trx);
|
||||
int abis_om2k_tx_ts_conf_req(struct gsm_bts_trx_ts *ts);
|
||||
|
||||
struct osmo_fsm_inst *om2k_bts_fsm_start(struct gsm_bts *bts);
|
||||
void abis_om2k_bts_init(struct gsm_bts *bts);
|
||||
void abis_om2k_trx_init(struct gsm_bts_trx *trx);
|
||||
|
||||
int abis_om2k_vty_init(void);
|
||||
|
||||
struct vty;
|
||||
void abis_om2k_config_write_bts(struct vty *vty, struct gsm_bts *bts);
|
||||
|
||||
#endif /* OPENBCS_ABIS_OM2K_H */
|
|
@ -1,117 +0,0 @@
|
|||
/* GSM Radio Signalling Link messages on the A-bis interface
|
||||
* 3GPP TS 08.58 version 8.6.0 Release 1999 / ETSI TS 100 596 V8.6.0 */
|
||||
|
||||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _RSL_H
|
||||
#define _RSL_H
|
||||
|
||||
#include <stdbool.h>
|
||||
#include <osmocom/gsm/protocol/gsm_08_58.h>
|
||||
#include <osmocom/gsm/gsm_utils.h>
|
||||
#include <osmocom/gsm/sysinfo.h>
|
||||
#include <osmocom/core/msgb.h>
|
||||
|
||||
struct gsm_bts;
|
||||
struct gsm_lchan;
|
||||
struct gsm_bts_trx_ts;
|
||||
|
||||
#define GSM48_LEN2PLEN(a) (((a) << 2) | 1)
|
||||
|
||||
int rsl_bcch_info(const struct gsm_bts_trx *trx, enum osmo_sysinfo_type si_type, const uint8_t *data, int len);
|
||||
int rsl_sacch_filling(struct gsm_bts_trx *trx, uint8_t type,
|
||||
const uint8_t *data, int len);
|
||||
int rsl_chan_activate(struct gsm_bts_trx *trx, uint8_t chan_nr,
|
||||
uint8_t act_type,
|
||||
struct rsl_ie_chan_mode *chan_mode,
|
||||
struct rsl_ie_chan_ident *chan_ident,
|
||||
uint8_t bs_power, uint8_t ms_power,
|
||||
uint8_t ta);
|
||||
int rsl_chan_activate_lchan(struct gsm_lchan *lchan, uint8_t act_type,
|
||||
uint8_t ho_ref);
|
||||
int rsl_chan_mode_modify_req(struct gsm_lchan *ts);
|
||||
int rsl_encryption_cmd(struct msgb *msg);
|
||||
int rsl_paging_cmd(struct gsm_bts *bts, uint8_t paging_group, uint8_t len,
|
||||
uint8_t *ms_ident, uint8_t chan_needed, bool is_gprs);
|
||||
int rsl_imm_assign_cmd(struct gsm_bts *bts, uint8_t len, uint8_t *val);
|
||||
|
||||
int rsl_data_request(struct msgb *msg, uint8_t link_id);
|
||||
int rsl_establish_request(struct gsm_lchan *lchan, uint8_t link_id);
|
||||
int rsl_relase_request(struct gsm_lchan *lchan, uint8_t link_id);
|
||||
|
||||
/* Ericcson vendor specific RSL extensions */
|
||||
int rsl_ericsson_imm_assign_cmd(struct gsm_bts *bts, uint32_t tlli, uint8_t len, uint8_t *val);
|
||||
|
||||
/* Siemens vendor-specific RSL extensions */
|
||||
int rsl_siemens_mrpci(struct gsm_lchan *lchan, struct rsl_mrpci *mrpci);
|
||||
|
||||
/* ip.access specfic RSL extensions */
|
||||
int rsl_ipacc_crcx(struct gsm_lchan *lchan);
|
||||
int rsl_ipacc_mdcx(struct gsm_lchan *lchan, uint32_t ip,
|
||||
uint16_t port, uint8_t rtp_payload2);
|
||||
int rsl_ipacc_mdcx_to_rtpsock(struct gsm_lchan *lchan);
|
||||
int rsl_ipacc_pdch_activate(struct gsm_bts_trx_ts *ts, int act);
|
||||
|
||||
int abis_rsl_rcvmsg(struct msgb *msg);
|
||||
|
||||
uint64_t str_to_imsi(const char *imsi_str);
|
||||
int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id,
|
||||
enum rsl_rel_mode release_mode);
|
||||
|
||||
int rsl_lchan_set_state(struct gsm_lchan *lchan, int);
|
||||
int rsl_lchan_mark_broken(struct gsm_lchan *lchan, const char *broken);
|
||||
|
||||
/* to be provided by external code */
|
||||
int rsl_deact_sacch(struct gsm_lchan *lchan);
|
||||
|
||||
/* BCCH related code */
|
||||
int rsl_ccch_conf_to_bs_cc_chans(int ccch_conf);
|
||||
int rsl_ccch_conf_to_bs_ccch_sdcch_comb(int ccch_conf);
|
||||
|
||||
int rsl_sacch_info_modify(struct gsm_lchan *lchan, uint8_t type,
|
||||
const uint8_t *data, int len);
|
||||
|
||||
int rsl_chan_bs_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int db);
|
||||
int rsl_chan_ms_power_ctrl(struct gsm_lchan *lchan, unsigned int fpc, int dbm);
|
||||
|
||||
/* SMSCB functionality */
|
||||
int rsl_sms_cb_command(struct gsm_bts *bts, uint8_t chan_number,
|
||||
struct rsl_ie_cb_cmd_type cb_command,
|
||||
const uint8_t *data, int len);
|
||||
|
||||
/* some Nokia specific stuff */
|
||||
int rsl_nokia_si_begin(struct gsm_bts_trx *trx);
|
||||
int rsl_nokia_si_end(struct gsm_bts_trx *trx);
|
||||
|
||||
/* required for Nokia BTS power control */
|
||||
int rsl_bs_power_control(struct gsm_bts_trx *trx, uint8_t channel, uint8_t reduction);
|
||||
|
||||
|
||||
int rsl_release_sapis_from(struct gsm_lchan *lchan, int start,
|
||||
enum rsl_rel_mode release_mode);
|
||||
int rsl_start_t3109(struct gsm_lchan *lchan);
|
||||
|
||||
int rsl_direct_rf_release(struct gsm_lchan *lchan);
|
||||
|
||||
void dyn_ts_init(struct gsm_bts_trx_ts *ts);
|
||||
int dyn_ts_switchover_start(struct gsm_bts_trx_ts *ts,
|
||||
enum gsm_phys_chan_config to_pchan);
|
||||
|
||||
#endif /* RSL_MT_H */
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
#ifndef ARFCN_RANGE_ENCODE_H
|
||||
#define ARFCN_RANGE_ENCODE_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum gsm48_range {
|
||||
ARFCN_RANGE_INVALID = -1,
|
||||
ARFCN_RANGE_128 = 127,
|
||||
ARFCN_RANGE_256 = 255,
|
||||
ARFCN_RANGE_512 = 511,
|
||||
ARFCN_RANGE_1024 = 1023,
|
||||
};
|
||||
|
||||
#define RANGE_ENC_MAX_ARFCNS 29
|
||||
|
||||
int range_enc_determine_range(const int *arfcns, int size, int *f0_out);
|
||||
int range_enc_arfcns(enum gsm48_range rng, const int *arfcns, int sze, int *out, int idx);
|
||||
int range_enc_find_index(enum gsm48_range rng, const int *arfcns, int size);
|
||||
int range_enc_filter_arfcns(int *arfcns, const int sze, const int f0, int *f0_included);
|
||||
|
||||
int range_enc_range128(uint8_t *chan_list, int f0, int *w);
|
||||
int range_enc_range256(uint8_t *chan_list, int f0, int *w);
|
||||
int range_enc_range512(uint8_t *chan_list, int f0, int *w);
|
||||
int range_enc_range1024(uint8_t *chan_list, int f0, int f0_incl, int *w);
|
||||
|
||||
#endif
|
|
@ -46,13 +46,4 @@ struct bsc_api {
|
|||
void (*conn_cleanup)(struct gsm_subscriber_connection *conn);
|
||||
};
|
||||
|
||||
int bsc_api_init(struct gsm_network *network, struct bsc_api *api);
|
||||
int gsm0808_submit_dtap(struct gsm_subscriber_connection *conn, struct msgb *msg, int link_id, int allow_sacch);
|
||||
int gsm0808_assign_req(struct gsm_subscriber_connection *conn, int chan_mode, int full_rate);
|
||||
int gsm0808_cipher_mode(struct gsm_subscriber_connection *conn, int cipher,
|
||||
const uint8_t *key, int len, int include_imeisv);
|
||||
int gsm0808_page(struct gsm_bts *bts, unsigned int page_group,
|
||||
unsigned int mi_len, uint8_t *mi, int chan_type);
|
||||
int gsm0808_clear(struct gsm_subscriber_connection *conn);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,107 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include <osmocom/core/msgb.h>
|
||||
#include <osmocom/core/msgfile.h>
|
||||
#include <osmocom/core/linuxrbtree.h>
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
|
||||
#include <regex.h>
|
||||
|
||||
struct vty;
|
||||
struct gsm48_hdr;
|
||||
|
||||
struct bsc_filter_reject_cause {
|
||||
int lu_reject_cause;
|
||||
int cm_reject_cause;
|
||||
};
|
||||
|
||||
struct bsc_filter_barr_entry {
|
||||
struct rb_node node;
|
||||
|
||||
char *imsi;
|
||||
int cm_reject_cause;
|
||||
int lu_reject_cause;
|
||||
};
|
||||
|
||||
enum bsc_filter_acc_ctr {
|
||||
ACC_LIST_LOCAL_FILTER,
|
||||
ACC_LIST_GLOBAL_FILTER,
|
||||
};
|
||||
|
||||
struct bsc_msg_acc_lst {
|
||||
struct llist_head list;
|
||||
|
||||
/* counter */
|
||||
struct rate_ctr_group *stats;
|
||||
|
||||
/* the name of the list */
|
||||
const char *name;
|
||||
struct llist_head fltr_list;
|
||||
};
|
||||
|
||||
struct bsc_msg_acc_lst_entry {
|
||||
struct llist_head list;
|
||||
|
||||
/* the filter */
|
||||
char *imsi_allow;
|
||||
regex_t imsi_allow_re;
|
||||
char *imsi_deny;
|
||||
regex_t imsi_deny_re;
|
||||
|
||||
/* reject reasons for the access lists */
|
||||
int cm_reject_cause;
|
||||
int lu_reject_cause;
|
||||
};
|
||||
|
||||
enum {
|
||||
FLT_CON_TYPE_NONE,
|
||||
FLT_CON_TYPE_LU,
|
||||
FLT_CON_TYPE_CM_SERV_REQ,
|
||||
FLT_CON_TYPE_PAG_RESP,
|
||||
FLT_CON_TYPE_SSA,
|
||||
FLT_CON_TYPE_LOCAL_REJECT,
|
||||
FLT_CON_TYPE_OTHER,
|
||||
};
|
||||
|
||||
|
||||
struct bsc_filter_state {
|
||||
char *imsi;
|
||||
int imsi_checked;
|
||||
int con_type;
|
||||
};
|
||||
|
||||
struct bsc_filter_request {
|
||||
void *ctx;
|
||||
struct rb_root *black_list;
|
||||
struct llist_head *access_lists;
|
||||
const char *local_lst_name;
|
||||
const char *global_lst_name;
|
||||
int bsc_nr;
|
||||
};
|
||||
|
||||
|
||||
int bsc_filter_barr_adapt(void *ctx, struct rb_root *rbtree, const struct osmo_config_list *);
|
||||
int bsc_filter_barr_find(struct rb_root *root, const char *imsi, int *cm, int *lu);
|
||||
|
||||
/**
|
||||
* Content filtering.
|
||||
*/
|
||||
int bsc_msg_filter_initial(struct gsm48_hdr *hdr, size_t size,
|
||||
struct bsc_filter_request *req,
|
||||
int *con_type, char **imsi,
|
||||
struct bsc_filter_reject_cause *cause);
|
||||
int bsc_msg_filter_data(struct gsm48_hdr *hdr, size_t size,
|
||||
struct bsc_filter_request *req,
|
||||
struct bsc_filter_state *state,
|
||||
struct bsc_filter_reject_cause *cause);
|
||||
|
||||
/* IMSI allow/deny handling */
|
||||
struct bsc_msg_acc_lst *bsc_msg_acc_lst_find(struct llist_head *lst, const char *name);
|
||||
struct bsc_msg_acc_lst *bsc_msg_acc_lst_get(void *ctx, struct llist_head *lst, const char *name);
|
||||
void bsc_msg_acc_lst_delete(struct bsc_msg_acc_lst *lst);
|
||||
|
||||
struct bsc_msg_acc_lst_entry *bsc_msg_acc_lst_entry_create(struct bsc_msg_acc_lst *);
|
||||
int bsc_msg_acc_lst_check_allow(struct bsc_msg_acc_lst *lst, const char *imsi);
|
||||
|
||||
void bsc_msg_lst_vty_init(void *ctx, struct llist_head *lst, int node);
|
||||
void bsc_msg_acc_lst_write(struct vty *vty, struct bsc_msg_acc_lst *lst);
|
|
@ -1,54 +0,0 @@
|
|||
/* Management functions to allocate/release struct gsm_lchan */
|
||||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
|
||||
* (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
#ifndef _CHAN_ALLOC_H
|
||||
#define _CHAN_ALLOC_H
|
||||
|
||||
#include "gsm_data.h"
|
||||
|
||||
struct gsm_subscriber_connection;
|
||||
|
||||
/* Find an allocated channel for a specified subscriber */
|
||||
struct gsm_subscriber_connection *connection_for_subscr(struct vlr_subscr *vsub);
|
||||
|
||||
/* Allocate a logical channel (SDCCH, TCH, ...) */
|
||||
struct gsm_lchan *lchan_alloc(struct gsm_bts *bts, enum gsm_chan_t type, int allow_bigger);
|
||||
|
||||
/* Free a logical channel (SDCCH, TCH, ...) */
|
||||
void lchan_free(struct gsm_lchan *lchan);
|
||||
void lchan_reset(struct gsm_lchan *lchan);
|
||||
|
||||
/* Release the given lchan */
|
||||
int lchan_release(struct gsm_lchan *lchan, int sacch_deact, enum rsl_rel_mode release_mode);
|
||||
|
||||
struct load_counter {
|
||||
unsigned int total;
|
||||
unsigned int used;
|
||||
};
|
||||
|
||||
struct pchan_load {
|
||||
struct load_counter pchan[_GSM_PCHAN_MAX];
|
||||
};
|
||||
|
||||
void bts_chan_load(struct pchan_load *cl, const struct gsm_bts *bts);
|
||||
void network_chan_load(struct pchan_load *pl, struct gsm_network *net);
|
||||
|
||||
int trx_is_usable(struct gsm_bts_trx *trx);
|
||||
|
||||
#endif /* _CHAN_ALLOC_H */
|
|
@ -1,9 +0,0 @@
|
|||
#pragma once
|
||||
|
||||
#include <stdint.h>
|
||||
#include <osmocom/msc/common_cs.h>
|
||||
|
||||
struct gsm_network *bsc_network_init(void *ctx,
|
||||
uint16_t country_code,
|
||||
uint16_t network_code,
|
||||
mncc_recv_cb_t mncc_recv);
|
|
@ -1,10 +0,0 @@
|
|||
#ifndef _CRC24_H
|
||||
#define _CRC24_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#define INIT_CRC24 0xffffff
|
||||
|
||||
uint32_t crc24_calc(uint32_t fcs, uint8_t *cp, unsigned int len);
|
||||
|
||||
#endif
|
|
@ -1,11 +0,0 @@
|
|||
#ifndef _E1_CONFIG_H
|
||||
#define _E1_CONFIG_H
|
||||
|
||||
#include <osmocom/msc/gsm_data_shared.h>
|
||||
|
||||
int e1_reconfig_ts(struct gsm_bts_trx_ts *ts);
|
||||
int e1_reconfig_trx(struct gsm_bts_trx *trx);
|
||||
int e1_reconfig_bts(struct gsm_bts *bts);
|
||||
|
||||
#endif /* _E1_CONFIG_H */
|
||||
|
|
@ -5,8 +5,6 @@
|
|||
#include <osmocom/gsm/gsm_utils.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
|
||||
#include <osmocom/msc/meas_rep.h>
|
||||
|
||||
struct msgb;
|
||||
struct gsm_bts;
|
||||
struct gsm_network;
|
||||
|
@ -67,7 +65,6 @@ int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_str
|
|||
|
||||
int gsm48_lchan_modify(struct gsm_lchan *lchan, uint8_t lchan_mode);
|
||||
int gsm48_rx_rr_modif_ack(struct msgb *msg);
|
||||
int gsm48_parse_meas_rep(struct gsm_meas_rep *rep, struct msgb *msg);
|
||||
|
||||
struct msgb *gsm48_create_mm_serv_rej(enum gsm48_reject_value value);
|
||||
struct msgb *gsm48_create_loc_upd_rej(uint8_t cause);
|
||||
|
|
|
@ -18,6 +18,9 @@
|
|||
#include <osmocom/msc/common_cs.h>
|
||||
#include <osmocom/mgcp_client/mgcp_client.h>
|
||||
|
||||
#include "gsm_data_shared.h"
|
||||
|
||||
|
||||
|
||||
/** annotations for msgb ownership */
|
||||
#define __uses
|
||||
|
@ -168,20 +171,10 @@ struct gsm_subscriber_connection {
|
|||
int mncc_rtp_create_pending;
|
||||
int mncc_rtp_connect_pending;
|
||||
|
||||
/* bsc structures */
|
||||
struct osmo_bsc_sccp_con *sccp_con; /* BSC */
|
||||
|
||||
/* back pointers */
|
||||
struct gsm_network *network;
|
||||
|
||||
bool in_release;
|
||||
struct gsm_lchan *lchan; /* BSC */
|
||||
struct gsm_lchan *ho_lchan; /* BSC */
|
||||
struct gsm_bts *bts; /* BSC */
|
||||
|
||||
/* for assignment handling */
|
||||
struct osmo_timer_list T10; /* BSC */
|
||||
struct gsm_lchan *secondary_lchan; /* BSC */
|
||||
|
||||
/* connected via 2G or 3G? */
|
||||
enum ran_type via_ran;
|
||||
|
@ -221,56 +214,6 @@ struct gsm_subscriber_connection {
|
|||
};
|
||||
|
||||
|
||||
#define ROLE_BSC
|
||||
#include "gsm_data_shared.h"
|
||||
|
||||
|
||||
enum {
|
||||
BSC_CTR_CHREQ_TOTAL,
|
||||
BSC_CTR_CHREQ_NO_CHANNEL,
|
||||
BSC_CTR_HANDOVER_ATTEMPTED,
|
||||
BSC_CTR_HANDOVER_NO_CHANNEL,
|
||||
BSC_CTR_HANDOVER_TIMEOUT,
|
||||
BSC_CTR_HANDOVER_COMPLETED,
|
||||
BSC_CTR_HANDOVER_FAILED,
|
||||
BSC_CTR_PAGING_ATTEMPTED,
|
||||
BSC_CTR_PAGING_DETACHED,
|
||||
BSC_CTR_PAGING_COMPLETED,
|
||||
BSC_CTR_PAGING_EXPIRED,
|
||||
BSC_CTR_CHAN_RF_FAIL,
|
||||
BSC_CTR_CHAN_RLL_ERR,
|
||||
BSC_CTR_BTS_OML_FAIL,
|
||||
BSC_CTR_BTS_RSL_FAIL,
|
||||
BSC_CTR_CODEC_AMR_F,
|
||||
BSC_CTR_CODEC_AMR_H,
|
||||
BSC_CTR_CODEC_EFR,
|
||||
BSC_CTR_CODEC_V1_FR,
|
||||
BSC_CTR_CODEC_V1_HR,
|
||||
};
|
||||
|
||||
static const struct rate_ctr_desc bsc_ctr_description[] = {
|
||||
[BSC_CTR_CHREQ_TOTAL] = {"chreq.total", "Received channel requests."},
|
||||
[BSC_CTR_CHREQ_NO_CHANNEL] = {"chreq.no_channel", "Sent to MS no channel available."},
|
||||
[BSC_CTR_HANDOVER_ATTEMPTED] = {"handover.attempted", "Received handover attempts."},
|
||||
[BSC_CTR_HANDOVER_NO_CHANNEL] = {"handover.no_channel", "Sent no channel available responses."},
|
||||
[BSC_CTR_HANDOVER_TIMEOUT] = {"handover.timeout", "Count the amount of timeouts of timer T3103."},
|
||||
[BSC_CTR_HANDOVER_COMPLETED] = {"handover.completed", "Received handover completed."},
|
||||
[BSC_CTR_HANDOVER_FAILED] = {"handover.failed", "Receive HO FAIL messages."},
|
||||
[BSC_CTR_PAGING_ATTEMPTED] = {"paging.attempted", "Paging attempts for a MS."},
|
||||
[BSC_CTR_PAGING_DETACHED] = {"paging.detached", "Counts the amount of paging attempts which couldn't sent out any paging request because no responsible bts found."},
|
||||
[BSC_CTR_PAGING_COMPLETED] = {"paging.completed", "Paging successful completed."},
|
||||
[BSC_CTR_PAGING_EXPIRED] = {"paging.expired", "Paging Request expired because of timeout T3113."},
|
||||
[BSC_CTR_CHAN_RF_FAIL] = {"chan.rf_fail", "Received a RF failure indication from BTS."},
|
||||
[BSC_CTR_CHAN_RLL_ERR] = {"chan.rll_err", "Received a RLL failure with T200 cause from BTS."},
|
||||
[BSC_CTR_BTS_OML_FAIL] = {"bts.oml_fail", "Received a TEI down on a OML link."},
|
||||
[BSC_CTR_BTS_RSL_FAIL] = {"bts.rsl_fail", "Received a TEI down on a OML link."},
|
||||
[BSC_CTR_CODEC_AMR_F] = {"bts.codec_amr_f", "Count the usage of AMR/F codec by channel mode requested."},
|
||||
[BSC_CTR_CODEC_AMR_H] = {"bts.codec_amr_h", "Count the usage of AMR/H codec by channel mode requested."},
|
||||
[BSC_CTR_CODEC_EFR] = {"bts.codec_efr", "Count the usage of EFR codec by channel mode requested."},
|
||||
[BSC_CTR_CODEC_V1_FR] = {"bts.codec_fr", "Count the usage of FR codec by channel mode requested."},
|
||||
[BSC_CTR_CODEC_V1_HR] = {"bts.codec_hr", "Count the usage of HR codec by channel mode requested."},
|
||||
};
|
||||
|
||||
enum {
|
||||
MSC_CTR_LOC_UPDATE_TYPE_ATTACH,
|
||||
MSC_CTR_LOC_UPDATE_TYPE_NORMAL,
|
||||
|
@ -316,15 +259,6 @@ static const struct rate_ctr_desc msc_ctr_description[] = {
|
|||
[MSC_CTR_CALL_INCOMPLETE] = {"call:incomplete", "Count total amount of call which got terminated by any other reason after reaching active state."},
|
||||
};
|
||||
|
||||
|
||||
static const struct rate_ctr_group_desc bsc_ctrg_desc = {
|
||||
"bsc",
|
||||
"base station controller",
|
||||
OSMO_STATS_CLASS_GLOBAL,
|
||||
ARRAY_SIZE(bsc_ctr_description),
|
||||
bsc_ctr_description,
|
||||
};
|
||||
|
||||
static const struct rate_ctr_group_desc msc_ctrg_desc = {
|
||||
"msc",
|
||||
"mobile switching center",
|
||||
|
@ -402,9 +336,6 @@ struct gsm_network {
|
|||
struct llist_head trans_list;
|
||||
struct bsc_api *bsc_api;
|
||||
|
||||
unsigned int num_bts;
|
||||
struct llist_head bts_list;
|
||||
|
||||
unsigned int paging_response_timer;
|
||||
|
||||
/* timer to expire old location updates */
|
||||
|
@ -525,11 +456,6 @@ struct gsm_sms {
|
|||
|
||||
extern void talloc_ctx_init(void *ctx_root);
|
||||
|
||||
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,
|
||||
struct gsm_bts *start_bts);
|
||||
|
||||
extern void *tall_bsc_ctx;
|
||||
extern int ipacc_rtp_direct;
|
||||
|
||||
|
@ -539,30 +465,9 @@ const char *gsm_auth_policy_name(enum gsm_auth_policy policy);
|
|||
enum rrlp_mode rrlp_mode_parse(const char *arg);
|
||||
const char *rrlp_mode_name(enum rrlp_mode mode);
|
||||
|
||||
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 gsm48_ra_id_by_bts(uint8_t *buf, struct gsm_bts *bts);
|
||||
void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts);
|
||||
|
||||
struct gsm_subscriber_connection *msc_subscr_con_allocate(struct gsm_network *network);
|
||||
void msc_subscr_con_free(struct gsm_subscriber_connection *conn);
|
||||
|
||||
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, int locked);
|
||||
|
||||
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];
|
||||
|
||||
/* control interface handling */
|
||||
int bsc_base_ctrl_cmds_install(void);
|
||||
int msc_ctrl_cmds_install(struct gsm_network *net);
|
||||
|
|
|
@ -11,18 +11,7 @@
|
|||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/gsm/gsm_utils.h>
|
||||
#include <osmocom/gsm/tlv.h>
|
||||
#include <osmocom/gsm/rxlev_stat.h>
|
||||
#include <osmocom/gsm/sysinfo.h>
|
||||
#include <osmocom/gsm/meas_rep.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
#include <osmocom/gsm/protocol/gsm_08_58.h>
|
||||
#include <osmocom/gsm/protocol/gsm_12_21.h>
|
||||
#include <osmocom/msc/meas_rep.h>
|
||||
#include <osmocom/abis/e1_input.h>
|
||||
|
||||
#ifndef ROLE_BSC
|
||||
#include <osmocom/gsm/lapdm.h>
|
||||
#endif
|
||||
|
||||
#include <osmocom/msc/common_cs.h>
|
||||
|
||||
|
@ -39,35 +28,6 @@ enum rrlp_mode {
|
|||
RRLP_MODE_ASS_PREF,
|
||||
};
|
||||
|
||||
/* Channel Request reason */
|
||||
enum gsm_chreq_reason_t {
|
||||
GSM_CHREQ_REASON_EMERG,
|
||||
GSM_CHREQ_REASON_PAG,
|
||||
GSM_CHREQ_REASON_CALL,
|
||||
GSM_CHREQ_REASON_LOCATION_UPD,
|
||||
GSM_CHREQ_REASON_OTHER,
|
||||
GSM_CHREQ_REASON_PDCH,
|
||||
};
|
||||
|
||||
/* lchans 0..3 are SDCCH in combined channel configuration,
|
||||
use 4 as magic number for BCCH hack - see osmo-bts-../oml.c:opstart_compl() */
|
||||
#define CCCH_LCHAN 4
|
||||
|
||||
#define TRX_NR_TS 8
|
||||
#define TS_MAX_LCHAN 8
|
||||
|
||||
#define HARDCODED_ARFCN 123
|
||||
#define HARDCODED_BSIC 0x3f /* NCC = 7 / BCC = 7 */
|
||||
|
||||
/* for multi-drop config */
|
||||
#define HARDCODED_BTS0_TS 1
|
||||
#define HARDCODED_BTS1_TS 6
|
||||
#define HARDCODED_BTS2_TS 11
|
||||
|
||||
#define MAX_VERSION_LENGTH 64
|
||||
|
||||
#define MAX_BTS_FEATURES 128
|
||||
|
||||
enum gsm_hooks {
|
||||
GSM_HOOK_NM_SWLOAD,
|
||||
GSM_HOOK_RR_PAGING,
|
||||
|
@ -81,852 +41,15 @@ enum gsm_paging_event {
|
|||
GSM_PAGING_BUSY,
|
||||
};
|
||||
|
||||
enum bts_gprs_mode {
|
||||
BTS_GPRS_NONE = 0,
|
||||
BTS_GPRS_GPRS = 1,
|
||||
BTS_GPRS_EGPRS = 2,
|
||||
};
|
||||
|
||||
struct gsm_lchan;
|
||||
struct gsm_mncc;
|
||||
struct osmo_rtp_socket;
|
||||
struct rtp_socket;
|
||||
struct bsc_api;
|
||||
|
||||
/* Network Management State */
|
||||
struct gsm_nm_state {
|
||||
uint8_t operational;
|
||||
uint8_t administrative;
|
||||
uint8_t availability;
|
||||
};
|
||||
|
||||
struct gsm_abis_mo {
|
||||
uint8_t obj_class;
|
||||
uint8_t procedure_pending;
|
||||
struct abis_om_obj_inst obj_inst;
|
||||
const char *name;
|
||||
struct gsm_nm_state nm_state;
|
||||
struct tlv_parsed *nm_attr;
|
||||
struct gsm_bts *bts;
|
||||
};
|
||||
|
||||
/* Ericsson OM2000 Managed Object */
|
||||
struct abis_om2k_mo {
|
||||
uint8_t class;
|
||||
uint8_t bts;
|
||||
uint8_t assoc_so;
|
||||
uint8_t inst;
|
||||
} __attribute__ ((packed));
|
||||
|
||||
struct om2k_mo {
|
||||
struct abis_om2k_mo addr;
|
||||
struct osmo_fsm_inst *fsm;
|
||||
};
|
||||
|
||||
#define A38_XOR_MIN_KEY_LEN 12
|
||||
#define A38_XOR_MAX_KEY_LEN 16
|
||||
#define A38_COMP128_KEY_LEN 16
|
||||
#define RSL_ENC_ALG_A5(x) (x+1)
|
||||
#define MAX_EARFCN_LIST 32
|
||||
|
||||
/* is the data link established? who established it? */
|
||||
#define LCHAN_SAPI_UNUSED 0
|
||||
#define LCHAN_SAPI_MS 1
|
||||
#define LCHAN_SAPI_NET 2
|
||||
#define LCHAN_SAPI_REL 3
|
||||
|
||||
/* state of a logical channel */
|
||||
enum gsm_lchan_state {
|
||||
LCHAN_S_NONE, /* channel is not active */
|
||||
LCHAN_S_ACT_REQ, /* channel activation requested */
|
||||
LCHAN_S_ACTIVE, /* channel is active and operational */
|
||||
LCHAN_S_REL_REQ, /* channel release has been requested */
|
||||
LCHAN_S_REL_ERR, /* channel is in an error state */
|
||||
LCHAN_S_BROKEN, /* channel is somehow unusable */
|
||||
LCHAN_S_INACTIVE, /* channel is set inactive */
|
||||
};
|
||||
|
||||
/* BTS ONLY */
|
||||
#define MAX_NUM_UL_MEAS 104
|
||||
#define LC_UL_M_F_L1_VALID (1 << 0)
|
||||
#define LC_UL_M_F_RES_VALID (1 << 1)
|
||||
|
||||
struct bts_ul_meas {
|
||||
/* BER in units of 0.01%: 10.000 == 100% ber, 0 == 0% ber */
|
||||
uint16_t ber10k;
|
||||
/* timing advance offset (in quarter bits) */
|
||||
int16_t ta_offs_qbits;
|
||||
/* C/I ratio in dB */
|
||||
float c_i;
|
||||
/* flags */
|
||||
uint8_t is_sub:1;
|
||||
/* RSSI in dBm * -1 */
|
||||
uint8_t inv_rssi;
|
||||
};
|
||||
|
||||
struct bts_codec_conf {
|
||||
uint8_t hr;
|
||||
uint8_t efr;
|
||||
uint8_t amr;
|
||||
};
|
||||
|
||||
struct amr_mode {
|
||||
uint8_t mode;
|
||||
uint8_t threshold;
|
||||
uint8_t hysteresis;
|
||||
};
|
||||
|
||||
struct amr_multirate_conf {
|
||||
uint8_t gsm48_ie[2];
|
||||
struct amr_mode ms_mode[4];
|
||||
struct amr_mode bts_mode[4];
|
||||
uint8_t num_modes;
|
||||
};
|
||||
/* /BTS ONLY */
|
||||
|
||||
enum lchan_csd_mode {
|
||||
LCHAN_CSD_M_NT,
|
||||
LCHAN_CSD_M_T_1200_75,
|
||||
LCHAN_CSD_M_T_600,
|
||||
LCHAN_CSD_M_T_1200,
|
||||
LCHAN_CSD_M_T_2400,
|
||||
LCHAN_CSD_M_T_9600,
|
||||
LCHAN_CSD_M_T_14400,
|
||||
LCHAN_CSD_M_T_29000,
|
||||
LCHAN_CSD_M_T_32000,
|
||||
};
|
||||
|
||||
/* State of the SAPIs in the lchan */
|
||||
enum lchan_sapi_state {
|
||||
LCHAN_SAPI_S_NONE,
|
||||
LCHAN_SAPI_S_REQ,
|
||||
LCHAN_SAPI_S_ASSIGNED,
|
||||
LCHAN_SAPI_S_REL,
|
||||
LCHAN_SAPI_S_ERROR,
|
||||
};
|
||||
|
||||
struct gsm_lchan {
|
||||
/* The TS that we're part of */
|
||||
struct gsm_bts_trx_ts *ts;
|
||||
/* The logical subslot number in the TS */
|
||||
uint8_t nr;
|
||||
/* The logical channel type */
|
||||
enum gsm_chan_t type;
|
||||
/* RSL channel mode */
|
||||
enum rsl_cmod_spd rsl_cmode;
|
||||
/* If TCH, traffic channel mode */
|
||||
enum gsm48_chan_mode tch_mode;
|
||||
enum lchan_csd_mode csd_mode;
|
||||
/* State */
|
||||
enum gsm_lchan_state state;
|
||||
const char *broken_reason;
|
||||
/* Power levels for MS and BTS */
|
||||
uint8_t bs_power;
|
||||
uint8_t ms_power;
|
||||
/* Encryption information */
|
||||
struct gsm_encr encr;
|
||||
|
||||
/* AMR bits */
|
||||
uint8_t mr_ms_lv[7];
|
||||
uint8_t mr_bts_lv[7];
|
||||
|
||||
/* Established data link layer services */
|
||||
uint8_t sapis[8];
|
||||
int sacch_deact;
|
||||
|
||||
struct {
|
||||
uint32_t bound_ip;
|
||||
uint32_t connect_ip;
|
||||
uint16_t bound_port;
|
||||
uint16_t connect_port;
|
||||
uint16_t conn_id;
|
||||
uint8_t rtp_payload;
|
||||
uint8_t rtp_payload2;
|
||||
uint8_t speech_mode;
|
||||
#ifdef ROLE_BSC
|
||||
struct rtp_socket *rtp_socket;
|
||||
|
||||
/* info we need to postpone the AoIP
|
||||
* assignment completed message */
|
||||
struct {
|
||||
uint8_t rr_cause;
|
||||
uint8_t chosen_channel;
|
||||
uint8_t encr_alg_id;
|
||||
uint8_t speech_mode;
|
||||
bool valid;
|
||||
} ass_compl;
|
||||
#else
|
||||
struct osmo_rtp_socket *rtp_socket;
|
||||
#endif
|
||||
} abis_ip;
|
||||
|
||||
uint8_t rqd_ta;
|
||||
|
||||
char *name;
|
||||
|
||||
#ifdef ROLE_BSC
|
||||
struct osmo_timer_list T3101;
|
||||
struct osmo_timer_list T3109;
|
||||
struct osmo_timer_list T3111;
|
||||
struct osmo_timer_list error_timer;
|
||||
struct osmo_timer_list act_timer;
|
||||
struct osmo_timer_list rel_work;
|
||||
uint8_t error_cause;
|
||||
|
||||
/* table of neighbor cell measurements */
|
||||
struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS];
|
||||
|
||||
/* cache of last measurement reports on this lchan */
|
||||
struct gsm_meas_rep meas_rep[6];
|
||||
int meas_rep_idx;
|
||||
|
||||
/* GSM Random Access data */
|
||||
struct gsm48_req_ref *rqd_ref;
|
||||
|
||||
struct gsm_subscriber_connection *conn;
|
||||
|
||||
struct {
|
||||
/* channel activation type and handover ref */
|
||||
uint8_t act_type;
|
||||
uint8_t ho_ref;
|
||||
struct gsm48_req_ref *rqd_ref;
|
||||
uint8_t rqd_ta;
|
||||
} dyn;
|
||||
#else
|
||||
/* Number of different GsmL1_Sapi_t used in osmo_bts_sysmo is 23.
|
||||
* Currently we don't share these headers so this is a magic number. */
|
||||
struct llist_head sapi_cmds;
|
||||
uint8_t sapis_dl[23];
|
||||
uint8_t sapis_ul[23];
|
||||
struct lapdm_channel lapdm_ch;
|
||||
struct llist_head dl_tch_queue;
|
||||
struct {
|
||||
/* bitmask of all SI that are present/valid in si_buf */
|
||||
uint32_t valid;
|
||||
uint32_t last;
|
||||
/* buffers where we put the pre-computed SI:
|
||||
SI2Q_MAX_NUM is the max number of SI2quater messages (see 3GPP TS 44.018) */
|
||||
sysinfo_buf_t buf[_MAX_SYSINFO_TYPE][SI2Q_MAX_NUM];
|
||||
} si;
|
||||
struct {
|
||||
uint8_t flags;
|
||||
/* RSL measurment result number, 0 at lchan_act */
|
||||
uint8_t res_nr;
|
||||
/* current Tx power level of the BTS */
|
||||
uint8_t bts_tx_pwr;
|
||||
/* number of measurements stored in array below */
|
||||
uint8_t num_ul_meas;
|
||||
struct bts_ul_meas uplink[MAX_NUM_UL_MEAS];
|
||||
/* last L1 header from the MS */
|
||||
uint8_t l1_info[2];
|
||||
struct gsm_meas_rep_unidir ul_res;
|
||||
} meas;
|
||||
struct {
|
||||
struct amr_multirate_conf amr_mr;
|
||||
struct {
|
||||
struct osmo_fsm_inst *dl_amr_fsm;
|
||||
/* TCH cache */
|
||||
uint8_t cache[20];
|
||||
/* FACCH cache */
|
||||
uint8_t facch[GSM_MACBLOCK_LEN];
|
||||
uint8_t len;
|
||||
uint32_t fn;
|
||||
bool is_update;
|
||||
/* set for each SID frame to detect talkspurt for codecs
|
||||
without explicit ONSET event */
|
||||
bool ul_sid;
|
||||
/* indicates if DTXd was active during DL measurement
|
||||
period */
|
||||
bool dl_active;
|
||||
} dtx;
|
||||
uint8_t last_cmr;
|
||||
uint32_t last_fn;
|
||||
} tch;
|
||||
|
||||
/* 3GPP TS 48.058 § 9.3.37: [0; 255] ok, -1 means invalid*/
|
||||
int16_t ms_t_offs;
|
||||
/* 3GPP TS 45.010 § 1.2 round trip propagation delay (in symbols) or -1 */
|
||||
int16_t p_offs;
|
||||
|
||||
/* BTS-side ciphering state (rx only, bi-directional, ...) */
|
||||
uint8_t ciph_state;
|
||||
uint8_t ciph_ns;
|
||||
uint8_t loopback;
|
||||
struct {
|
||||
uint8_t active;
|
||||
uint8_t ref;
|
||||
/* T3105: PHYS INF retransmission */
|
||||
struct osmo_timer_list t3105;
|
||||
/* counts up to Ny1 */
|
||||
unsigned int phys_info_count;
|
||||
} ho;
|
||||
/* S counter for link loss */
|
||||
int s;
|
||||
/* Kind of the release/activation. E.g. RSL or PCU */
|
||||
int rel_act_kind;
|
||||
/* RTP header Marker bit to indicate beginning of speech after pause */
|
||||
bool rtp_tx_marker;
|
||||
/* power handling */
|
||||
struct {
|
||||
uint8_t current;
|
||||
uint8_t fixed;
|
||||
} ms_power_ctrl;
|
||||
|
||||
struct msgb *pending_rel_ind_msg;
|
||||
#endif
|
||||
};
|
||||
|
||||
enum {
|
||||
TS_F_PDCH_ACTIVE = 0x1000,
|
||||
TS_F_PDCH_ACT_PENDING = 0x2000,
|
||||
TS_F_PDCH_DEACT_PENDING = 0x4000,
|
||||
TS_F_PDCH_PENDING_MASK = 0x6000 /*<
|
||||
TS_F_PDCH_ACT_PENDING | TS_F_PDCH_DEACT_PENDING */
|
||||
} gsm_bts_trx_ts_flags;
|
||||
|
||||
/* One Timeslot in a TRX */
|
||||
struct gsm_bts_trx_ts {
|
||||
struct gsm_bts_trx *trx;
|
||||
/* number of this timeslot at the TRX */
|
||||
uint8_t nr;
|
||||
|
||||
enum gsm_phys_chan_config pchan;
|
||||
|
||||
struct {
|
||||
enum gsm_phys_chan_config pchan_is;
|
||||
enum gsm_phys_chan_config pchan_want;
|
||||
struct msgb *pending_chan_activ;
|
||||
} dyn;
|
||||
|
||||
unsigned int flags;
|
||||
struct gsm_abis_mo mo;
|
||||
struct tlv_parsed nm_attr;
|
||||
uint8_t nm_chan_comb;
|
||||
int tsc; /* -1 == use BTS TSC */
|
||||
|
||||
struct {
|
||||
/* Parameters below are configured by VTY */
|
||||
int enabled;
|
||||
uint8_t maio;
|
||||
uint8_t hsn;
|
||||
struct bitvec arfcns;
|
||||
uint8_t arfcns_data[1024/8];
|
||||
/* This is the pre-computed MA for channel assignments */
|
||||
struct bitvec ma;
|
||||
uint8_t ma_len; /* part of ma_data that is used */
|
||||
uint8_t ma_data[8]; /* 10.5.2.21: max 8 bytes value part */
|
||||
} hopping;
|
||||
|
||||
/* To which E1 subslot are we connected */
|
||||
struct gsm_e1_subslot e1_link;
|
||||
|
||||
union {
|
||||
struct {
|
||||
struct om2k_mo om2k_mo;
|
||||
} rbs2000;
|
||||
};
|
||||
|
||||
struct gsm_lchan lchan[TS_MAX_LCHAN];
|
||||
};
|
||||
|
||||
/* One TRX in a BTS */
|
||||
struct gsm_bts_trx {
|
||||
/* list header in bts->trx_list */
|
||||
struct llist_head list;
|
||||
|
||||
struct gsm_bts *bts;
|
||||
/* number of this TRX in the BTS */
|
||||
uint8_t nr;
|
||||
/* human readable name / description */
|
||||
char *description;
|
||||
/* how do we talk RSL with this TRX? */
|
||||
struct gsm_e1_subslot rsl_e1_link;
|
||||
uint8_t rsl_tei;
|
||||
struct e1inp_sign_link *rsl_link;
|
||||
|
||||
/* Some BTS (specifically Ericsson RBS) have a per-TRX OML Link */
|
||||
struct e1inp_sign_link *oml_link;
|
||||
|
||||
struct gsm_abis_mo mo;
|
||||
struct tlv_parsed nm_attr;
|
||||
struct {
|
||||
struct gsm_abis_mo mo;
|
||||
} bb_transc;
|
||||
|
||||
uint16_t arfcn;
|
||||
int nominal_power; /* in dBm */
|
||||
unsigned int max_power_red; /* in actual dB */
|
||||
|
||||
#ifndef ROLE_BSC
|
||||
struct trx_power_params power_params;
|
||||
int ms_power_control;
|
||||
|
||||
struct {
|
||||
void *l1h;
|
||||
} role_bts;
|
||||
#endif
|
||||
|
||||
union {
|
||||
struct {
|
||||
struct {
|
||||
struct gsm_abis_mo mo;
|
||||
} bbsig;
|
||||
struct {
|
||||
struct gsm_abis_mo mo;
|
||||
} pa;
|
||||
} bs11;
|
||||
struct {
|
||||
unsigned int test_state;
|
||||
uint8_t test_nr;
|
||||
struct rxlev_stats rxlev_stat;
|
||||
} ipaccess;
|
||||
struct {
|
||||
struct {
|
||||
struct om2k_mo om2k_mo;
|
||||
} trxc;
|
||||
struct {
|
||||
struct om2k_mo om2k_mo;
|
||||
} rx;
|
||||
struct {
|
||||
struct om2k_mo om2k_mo;
|
||||
} tx;
|
||||
} rbs2000;
|
||||
};
|
||||
struct gsm_bts_trx_ts ts[TRX_NR_TS];
|
||||
};
|
||||
|
||||
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;
|
||||
|
||||
/* N. B: always add new features to the end of the list (right before _NUM_BTS_FEAT) to avoid breaking compatibility
|
||||
with BTS compiled against earlier version of this header */
|
||||
enum gsm_bts_features {
|
||||
BTS_FEAT_HSCSD,
|
||||
BTS_FEAT_GPRS,
|
||||
BTS_FEAT_EGPRS,
|
||||
BTS_FEAT_ECSD,
|
||||
BTS_FEAT_HOPPING,
|
||||
BTS_FEAT_MULTI_TSC,
|
||||
BTS_FEAT_OML_ALERTS,
|
||||
BTS_FEAT_AGCH_PCH_PROP,
|
||||
BTS_FEAT_CBCH,
|
||||
_NUM_BTS_FEAT
|
||||
};
|
||||
|
||||
extern const struct value_string gsm_bts_features_descs[];
|
||||
|
||||
/*
|
||||
* This keeps track of the paging status of one BTS. It
|
||||
* includes a number of pending requests, a back pointer
|
||||
* to the gsm_bts, a timer and some more state.
|
||||
*/
|
||||
struct gsm_bts_paging_state {
|
||||
/* pending requests */
|
||||
struct llist_head pending_requests;
|
||||
struct gsm_bts *bts;
|
||||
|
||||
struct osmo_timer_list work_timer;
|
||||
struct osmo_timer_list credit_timer;
|
||||
|
||||
/* free chans needed */
|
||||
int free_chans_need;
|
||||
|
||||
/* load */
|
||||
uint16_t available_slots;
|
||||
};
|
||||
|
||||
struct gsm_envabtse {
|
||||
struct gsm_abis_mo mo;
|
||||
};
|
||||
|
||||
struct gsm_bts_gprs_nsvc {
|
||||
struct gsm_bts *bts;
|
||||
/* data read via VTY config file, to configure the BTS
|
||||
* via OML from BSC */
|
||||
int id;
|
||||
uint16_t nsvci;
|
||||
uint16_t local_port; /* on the BTS */
|
||||
uint16_t remote_port; /* on the SGSN */
|
||||
uint32_t remote_ip; /* on the SGSN */
|
||||
|
||||
struct gsm_abis_mo mo;
|
||||
};
|
||||
|
||||
enum gprs_rlc_par {
|
||||
RLC_T3142,
|
||||
RLC_T3169,
|
||||
RLC_T3191,
|
||||
RLC_T3193,
|
||||
RLC_T3195,
|
||||
RLC_N3101,
|
||||
RLC_N3103,
|
||||
RLC_N3105,
|
||||
CV_COUNTDOWN,
|
||||
T_DL_TBF_EXT, /* ms */
|
||||
T_UL_TBF_EXT, /* ms */
|
||||
_NUM_RLC_PAR
|
||||
};
|
||||
|
||||
enum gprs_cs {
|
||||
GPRS_CS1,
|
||||
GPRS_CS2,
|
||||
GPRS_CS3,
|
||||
GPRS_CS4,
|
||||
GPRS_MCS1,
|
||||
GPRS_MCS2,
|
||||
GPRS_MCS3,
|
||||
GPRS_MCS4,
|
||||
GPRS_MCS5,
|
||||
GPRS_MCS6,
|
||||
GPRS_MCS7,
|
||||
GPRS_MCS8,
|
||||
GPRS_MCS9,
|
||||
_NUM_GRPS_CS
|
||||
};
|
||||
|
||||
struct gprs_rlc_cfg {
|
||||
uint16_t parameter[_NUM_RLC_PAR];
|
||||
struct {
|
||||
uint16_t repeat_time; /* ms */
|
||||
uint8_t repeat_count;
|
||||
} paging;
|
||||
uint32_t cs_mask; /* bitmask of gprs_cs */
|
||||
uint8_t initial_cs;
|
||||
uint8_t initial_mcs;
|
||||
};
|
||||
|
||||
|
||||
enum neigh_list_manual_mode {
|
||||
NL_MODE_AUTOMATIC = 0,
|
||||
NL_MODE_MANUAL = 1,
|
||||
NL_MODE_MANUAL_SI5SEP = 2, /* SI2 and SI5 have separate neighbor lists */
|
||||
};
|
||||
|
||||
enum bts_loc_fix {
|
||||
BTS_LOC_FIX_INVALID = 0,
|
||||
BTS_LOC_FIX_2D = 1,
|
||||
BTS_LOC_FIX_3D = 2,
|
||||
};
|
||||
|
||||
extern const struct value_string bts_loc_fix_names[];
|
||||
|
||||
struct bts_location {
|
||||
struct llist_head list;
|
||||
time_t tstamp;
|
||||
enum bts_loc_fix valid;
|
||||
double lat;
|
||||
double lon;
|
||||
double height;
|
||||
};
|
||||
|
||||
/* 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 ths 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;
|
||||
|
||||
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;
|
||||
|
||||
/* 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;
|
||||
|
||||
/* ip.accesss 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;
|
||||
uint32_t use_superchannel:1;
|
||||
} rbs2000;
|
||||
struct {
|
||||
uint8_t bts_type;
|
||||
unsigned int configured:1,
|
||||
skip_reset:1,
|
||||
no_loc_rel_cnf:1,
|
||||
bts_reset_timer_cnf,
|
||||
did_reset:1,
|
||||
wait_reset:1;
|
||||
struct osmo_timer_list reset_timer;
|
||||
} nokia;
|
||||
};
|
||||
|
||||
/* Not entirely sure how ip.access specific this is */
|
||||
struct {
|
||||
uint8_t supports_egprs_11bit_rach;
|
||||
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;
|
||||
} gprs;
|
||||
|
||||
/* 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;
|
||||
int bcch_change_mark;
|
||||
|
||||
#ifdef ROLE_BSC
|
||||
/* 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;
|
||||
|
||||
bool early_classmark_allowed;
|
||||
/* 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;
|
||||
|
||||
/* 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;
|
||||
|
||||
#endif /* ROLE_BSC */
|
||||
void *role;
|
||||
};
|
||||
|
||||
|
||||
struct gsm_bts *gsm_bts_alloc(void *talloc_ctx, uint8_t bts_num);
|
||||
struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);
|
||||
|
||||
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[];
|
||||
const struct value_string gsm_pchant_names[13];
|
||||
const struct value_string gsm_pchant_descs[13];
|
||||
const char *gsm_pchan_name(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_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);
|
||||
char *gsm_lchan_name_compute(const struct gsm_lchan *lchan);
|
||||
const char *gsm_lchans_name(enum gsm_lchan_state s);
|
||||
|
||||
static inline char *gsm_lchan_name(const struct gsm_lchan *lchan)
|
||||
{
|
||||
return lchan->name;
|
||||
}
|
||||
|
||||
static inline int gsm_bts_set_feature(struct gsm_bts *bts, enum gsm_bts_features feat)
|
||||
{
|
||||
OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
|
||||
return bitvec_set_bit_pos(&bts->features, feat, 1);
|
||||
}
|
||||
|
||||
static inline bool gsm_bts_has_feature(const struct gsm_bts *bts, enum gsm_bts_features feat)
|
||||
{
|
||||
OSMO_ASSERT(_NUM_BTS_FEAT < MAX_BTS_FEATURES);
|
||||
return bitvec_get_bit_pos(&bts->features, feat);
|
||||
}
|
||||
|
||||
void gsm_abis_mo_reset(struct gsm_abis_mo *mo);
|
||||
|
||||
struct gsm_abis_mo *
|
||||
gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
|
||||
const struct abis_om_obj_inst *obj_inst);
|
||||
|
||||
struct gsm_nm_state *
|
||||
gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,
|
||||
const struct abis_om_obj_inst *obj_inst);
|
||||
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);
|
||||
uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,
|
||||
enum gsm_phys_chan_config as_pchan);
|
||||
|
||||
/* return the gsm_lchan for the CBCH (if it exists at all) */
|
||||
struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts);
|
||||
|
||||
/*
|
||||
* help with parsing regexps
|
||||
*/
|
||||
int gsm_parse_reg(void *ctx, regex_t *reg, char **str,
|
||||
int argc, const char **argv) __attribute__ ((warn_unused_result));
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,
|
||||
int *rc);
|
||||
|
||||
enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts);
|
||||
uint8_t ts_subslots(struct gsm_bts_trx_ts *ts);
|
||||
bool ts_is_tch(struct gsm_bts_trx_ts *ts);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -66,4 +66,7 @@ void subscr_paging_cancel(struct vlr_subscr *vsub, enum gsm_paging_event event);
|
|||
int subscr_paging_dispatch(unsigned int hooknum, unsigned int event,
|
||||
struct msgb *msg, void *data, void *param);
|
||||
|
||||
/* Find an allocated channel for a specified subscriber */
|
||||
struct gsm_subscriber_connection *connection_for_subscr(struct vlr_subscr *vsub);
|
||||
|
||||
#endif /* _GSM_SUBSCR_H */
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
#ifndef _HANDOVER_H
|
||||
#define _HANDOVER_H
|
||||
|
||||
struct gsm_subscriber_connection;
|
||||
|
||||
int bsc_handover_start(struct gsm_lchan *old_lchan, struct gsm_bts *bts);
|
||||
|
||||
/* clear any operation for this connection */
|
||||
void bsc_clear_handover(struct gsm_subscriber_connection *conn, int free_lchan);
|
||||
|
||||
/* Return the old lchan or NULL. This is meant for audio handling */
|
||||
struct gsm_lchan *bsc_handover_pending(struct gsm_lchan *new_lchan);
|
||||
|
||||
#endif /* _HANDOVER_H */
|
|
@ -1,7 +0,0 @@
|
|||
#ifndef _HANDOVER_DECISION_H
|
||||
#define _HANDOVER_DECISION_H
|
||||
|
||||
void on_dso_load_ho_dec(void);
|
||||
|
||||
#endif /* _HANDOVER_DECISION_H */
|
||||
|
|
@ -1,67 +0,0 @@
|
|||
#ifndef _MEAS_REP_H
|
||||
#define _MEAS_REP_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
#include <osmocom/gsm/meas_rep.h>
|
||||
|
||||
#define MRC_F_PROCESSED 0x0001
|
||||
|
||||
/* extracted from a L3 measurement report IE */
|
||||
struct gsm_meas_rep_cell {
|
||||
uint8_t rxlev;
|
||||
uint8_t bsic;
|
||||
uint8_t neigh_idx;
|
||||
uint16_t arfcn;
|
||||
unsigned int flags;
|
||||
};
|
||||
|
||||
#define MEAS_REP_F_UL_DTX 0x01
|
||||
#define MEAS_REP_F_DL_VALID 0x02
|
||||
#define MEAS_REP_F_BA1 0x04
|
||||
#define MEAS_REP_F_DL_DTX 0x08
|
||||
#define MEAS_REP_F_MS_TO 0x10
|
||||
#define MEAS_REP_F_MS_L1 0x20
|
||||
#define MEAS_REP_F_FPC 0x40
|
||||
|
||||
/* parsed uplink and downlink measurement result */
|
||||
struct gsm_meas_rep {
|
||||
/* back-pointer to the logical channel */
|
||||
struct gsm_lchan *lchan;
|
||||
|
||||
/* number of the measurement report */
|
||||
uint8_t nr;
|
||||
/* flags, see MEAS_REP_F_* */
|
||||
unsigned int flags;
|
||||
|
||||
/* uplink and downlink rxlev, rxqual; full and sub */
|
||||
struct gsm_meas_rep_unidir ul;
|
||||
struct gsm_meas_rep_unidir dl;
|
||||
|
||||
uint8_t bs_power;
|
||||
/* according to 3GPP TS 48.058 § MS Timing Offset [-63; 192] */
|
||||
int16_t ms_timing_offset;
|
||||
struct {
|
||||
int8_t pwr; /* MS power in dBm */
|
||||
uint8_t ta; /* MS timing advance */
|
||||
} ms_l1;
|
||||
|
||||
/* neighbor measurement reports for up to 6 cells */
|
||||
int num_cell;
|
||||
struct gsm_meas_rep_cell cell[6];
|
||||
};
|
||||
|
||||
/* obtain an average over the last 'num' fields in the meas reps */
|
||||
int get_meas_rep_avg(const struct gsm_lchan *lchan,
|
||||
enum meas_rep_field field, unsigned int num);
|
||||
|
||||
/* Check if N out of M last values for FIELD are >= bd */
|
||||
int meas_rep_n_out_of_m_be(const struct gsm_lchan *lchan,
|
||||
enum meas_rep_field field,
|
||||
unsigned int n, unsigned int m, int be);
|
||||
|
||||
unsigned int calc_initial_idx(unsigned int array_size,
|
||||
unsigned int meas_rep_idx,
|
||||
unsigned int num_values);
|
||||
|
||||
#endif /* _MEAS_REP_H */
|
|
@ -1,27 +0,0 @@
|
|||
/* (C) 2008 by Harald Welte <laforge@gnumonks.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef MISDN_H
|
||||
#define MISDN_H
|
||||
|
||||
#include <osmocom/abis/e1_input.h>
|
||||
|
||||
int mi_setup(int cardnr, struct e1inp_line *line, int release_l2);
|
||||
int mi_e1_line_update(struct e1inp_line *line);
|
||||
|
||||
#endif
|
|
@ -1,16 +0,0 @@
|
|||
#ifndef _OPENBSC_NWL_H
|
||||
#define _OPENBSC_NWL_H
|
||||
|
||||
#include <stdint.h>
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
|
||||
void ipac_nwl_init(void);
|
||||
|
||||
/* Start a NWL test. It will raise the S_IPAC_TEST_COMPLETE signal. */
|
||||
int ipac_nwl_test_start(struct gsm_bts_trx *trx, uint8_t testnr,
|
||||
const uint8_t *phys_conf, unsigned int phys_conf_len);
|
||||
|
||||
int ipac_rxlevstat2whitelist(uint16_t *buf, const struct rxlev_stats *st, uint8_t min_rxlev,
|
||||
uint16_t max_num_arfcns);
|
||||
|
||||
#endif /* _OPENBSC_NWL_H */
|
|
@ -1,75 +0,0 @@
|
|||
/* OpenBSC BSC code */
|
||||
|
||||
#ifndef OSMO_BSC_H
|
||||
#define OSMO_BSC_H
|
||||
|
||||
#include "bsc_api.h"
|
||||
#include "bsc_msg_filter.h"
|
||||
|
||||
#define BSS_SEND_USSD 1
|
||||
|
||||
enum bsc_con {
|
||||
BSC_CON_SUCCESS,
|
||||
BSC_CON_REJECT_NO_LINK,
|
||||
BSC_CON_REJECT_RF_GRACE,
|
||||
BSC_CON_NO_MEM,
|
||||
};
|
||||
|
||||
struct sccp_connection;
|
||||
struct bsc_msc_data;
|
||||
struct bsc_msc_connection;
|
||||
|
||||
struct osmo_bsc_sccp_con {
|
||||
struct llist_head entry;
|
||||
|
||||
int ciphering_handled;
|
||||
|
||||
/* for audio handling */
|
||||
uint16_t cic;
|
||||
uint32_t rtp_ip;
|
||||
int rtp_port;
|
||||
|
||||
/* for advanced ping/pong */
|
||||
int send_ping;
|
||||
|
||||
/* SCCP connection realted */
|
||||
struct sccp_connection *sccp;
|
||||
struct bsc_msc_data *msc;
|
||||
struct osmo_timer_list sccp_it_timeout;
|
||||
struct osmo_timer_list sccp_cc_timeout;
|
||||
|
||||
struct llist_head sccp_queue;
|
||||
unsigned int sccp_queue_size;
|
||||
|
||||
struct gsm_subscriber_connection *conn;
|
||||
uint8_t new_subscriber;
|
||||
|
||||
struct bsc_filter_state filter_state;
|
||||
|
||||
/* Sigtran connection ID */
|
||||
int conn_id;
|
||||
};
|
||||
|
||||
struct bsc_api *osmo_bsc_api();
|
||||
|
||||
int bsc_queue_for_msc(struct osmo_bsc_sccp_con *conn, struct msgb *msg);
|
||||
int bsc_open_connection(struct osmo_bsc_sccp_con *sccp, struct msgb *msg);
|
||||
enum bsc_con bsc_create_new_connection(struct gsm_subscriber_connection *conn,
|
||||
struct bsc_msc_data *msc, int send_ping);
|
||||
int bsc_delete_connection(struct osmo_bsc_sccp_con *sccp);
|
||||
|
||||
struct bsc_msc_data *bsc_find_msc(struct gsm_subscriber_connection *conn, struct msgb *);
|
||||
int bsc_scan_bts_msg(struct gsm_subscriber_connection *conn, struct msgb *msg);
|
||||
int bsc_scan_msc_msg(struct gsm_subscriber_connection *conn, struct msgb *msg);
|
||||
int bsc_send_welcome_ussd(struct gsm_subscriber_connection *conn);
|
||||
|
||||
int bsc_handle_udt(struct bsc_msc_data *msc, struct msgb *msg, unsigned int length);
|
||||
int bsc_handle_dt(struct osmo_bsc_sccp_con *conn, struct msgb *msg, unsigned int len);
|
||||
|
||||
int bsc_ctrl_cmds_install();
|
||||
|
||||
void bsc_gen_location_state_trap(struct gsm_bts *bts);
|
||||
|
||||
struct llist_head *bsc_access_lists(void);
|
||||
|
||||
#endif
|
|
@ -1,34 +0,0 @@
|
|||
/* (C) 2017 by sysmocom s.f.m.c. GmbH
|
||||
* All Rights Reserved
|
||||
*
|
||||
* Author: Philipp Maier
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Create and start state machine which handles the reset/reset-ack procedure */
|
||||
void start_reset_fsm(struct bsc_msc_data *msc);
|
||||
|
||||
/* Confirm that we sucessfully received a reset acknowlege message */
|
||||
void reset_ack_confirm(struct bsc_msc_data *msc);
|
||||
|
||||
/* Report a failed connection */
|
||||
void report_conn_fail(struct bsc_msc_data *msc);
|
||||
|
||||
/* Report a successful connection */
|
||||
void report_conn_success(struct bsc_msc_data *msc);
|
||||
|
||||
/* Check if we have a connection to a specified msc */
|
||||
bool sccp_conn_ready(struct bsc_msc_data *msc);
|
|
@ -1,48 +0,0 @@
|
|||
/* (C) 2017 by Sysmocom s.f.m.c. GmbH
|
||||
* All Rights Reserved
|
||||
*
|
||||
* Author: Philipp Maier
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
#include <osmocom/msc/bsc_msc_data.h>
|
||||
|
||||
/* Allocate resources to make a new connection oriented sigtran connection
|
||||
* (not the connection ittself!) */
|
||||
enum bsc_con osmo_bsc_sigtran_new_conn(struct gsm_subscriber_connection *conn, struct bsc_msc_data *msc);
|
||||
|
||||
/* Open a new connection oriented sigtran connection */
|
||||
int osmo_bsc_sigtran_open_conn(const struct osmo_bsc_sccp_con *conn, struct msgb *msg);
|
||||
|
||||
/* Send data to MSC */
|
||||
int osmo_bsc_sigtran_send(const struct osmo_bsc_sccp_con *conn, struct msgb *msg);
|
||||
|
||||
/* Delete a connection from the list with open connections
|
||||
* (called by osmo_bsc_api.c on failing open connections and
|
||||
* locally, when a connection is closed by the MSC */
|
||||
int osmo_bsc_sigtran_del_conn(struct osmo_bsc_sccp_con *sccp);
|
||||
|
||||
/* Initalize osmo sigtran backhaul */
|
||||
int osmo_bsc_sigtran_init(struct llist_head *mscs);
|
||||
|
||||
/* Close all open sigtran connections and channels */
|
||||
void osmo_bsc_sigtran_reset(const struct bsc_msc_data *msc);
|
||||
|
||||
/* Send reset-ack to MSC */
|
||||
void osmo_bsc_sigtran_tx_reset_ack(const struct bsc_msc_data *msc);
|
|
@ -1,41 +0,0 @@
|
|||
#ifndef _OPENBSC_OSMUX_H_
|
||||
#define _OPENBSC_OSMUX_H_
|
||||
|
||||
#include <osmocom/netif/osmux.h>
|
||||
|
||||
#define OSMUX_PORT 1984
|
||||
|
||||
enum {
|
||||
OSMUX_ROLE_BSC = 0,
|
||||
OSMUX_ROLE_BSC_NAT,
|
||||
};
|
||||
|
||||
int osmux_init(int role, struct mgcp_config *cfg);
|
||||
int osmux_enable_endpoint(struct mgcp_endpoint *endp, struct in_addr *addr, uint16_t port);
|
||||
void osmux_disable_endpoint(struct mgcp_endpoint *endp);
|
||||
void osmux_allocate_cid(struct mgcp_endpoint *endp);
|
||||
void osmux_release_cid(struct mgcp_endpoint *endp);
|
||||
|
||||
int osmux_xfrm_to_rtp(struct mgcp_endpoint *endp, int type, char *buf, int rc);
|
||||
int osmux_xfrm_to_osmux(int type, char *buf, int rc, struct mgcp_endpoint *endp);
|
||||
|
||||
int osmux_send_dummy(struct mgcp_endpoint *endp);
|
||||
|
||||
int osmux_get_cid(void);
|
||||
void osmux_put_cid(uint8_t osmux_cid);
|
||||
int osmux_used_cid(void);
|
||||
|
||||
enum osmux_state {
|
||||
OSMUX_STATE_DISABLED = 0,
|
||||
OSMUX_STATE_NEGOTIATING,
|
||||
OSMUX_STATE_ACTIVATING,
|
||||
OSMUX_STATE_ENABLED,
|
||||
};
|
||||
|
||||
enum osmux_usage {
|
||||
OSMUX_USAGE_OFF = 0,
|
||||
OSMUX_USAGE_ON = 1,
|
||||
OSMUX_USAGE_ONLY = 2,
|
||||
};
|
||||
|
||||
#endif
|
|
@ -1,9 +0,0 @@
|
|||
#ifndef _RS232_H
|
||||
#define _RS232_H
|
||||
|
||||
int rs232_setup(const char *serial_port, unsigned int delay_ms,
|
||||
struct gsm_bts *bts);
|
||||
|
||||
int handle_serial_msg(struct msgb *msg);
|
||||
|
||||
#endif /* _RS232_H */
|
|
@ -1,95 +0,0 @@
|
|||
#ifndef _RTP_PROXY_H
|
||||
#define _RTP_PROXY_H
|
||||
|
||||
/* RTP proxy handling for ip.access nanoBTS */
|
||||
|
||||
/* (C) 2009 by Harald Welte <laforge@gnumonks.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/core/select.h>
|
||||
|
||||
#include <osmocom/msc/mncc.h>
|
||||
|
||||
#define RTP_PT_GSM_FULL 3
|
||||
#define RTP_PT_GSM_HALF 96
|
||||
#define RTP_PT_GSM_EFR 97
|
||||
#define RTP_PT_AMR 98
|
||||
#define RTP_LEN_GSM_FULL 33
|
||||
#define RTP_LEN_GSM_HALF 15
|
||||
#define RTP_LEN_GSM_EFR 31
|
||||
#define RTP_GSM_DURATION 160
|
||||
|
||||
enum rtp_rx_action {
|
||||
RTP_NONE,
|
||||
RTP_PROXY,
|
||||
RTP_RECV_UPSTREAM,
|
||||
};
|
||||
|
||||
enum rtp_tx_action {
|
||||
RTP_SEND_NONE,
|
||||
RTP_SEND_DOWNSTREAM,
|
||||
};
|
||||
|
||||
struct rtp_sub_socket {
|
||||
struct sockaddr_in sin_local;
|
||||
struct sockaddr_in sin_remote;
|
||||
|
||||
struct osmo_fd bfd;
|
||||
/* linked list of to-be-transmitted msgb's */
|
||||
struct llist_head tx_queue;
|
||||
};
|
||||
|
||||
struct rtp_socket {
|
||||
struct llist_head list;
|
||||
|
||||
struct rtp_sub_socket rtp;
|
||||
struct rtp_sub_socket rtcp;
|
||||
|
||||
/* what should we do on receive? */
|
||||
enum rtp_rx_action rx_action;
|
||||
union {
|
||||
struct {
|
||||
struct rtp_socket *other_sock;
|
||||
} proxy;
|
||||
struct {
|
||||
struct gsm_network *net;
|
||||
uint32_t callref;
|
||||
} receive;
|
||||
};
|
||||
enum rtp_tx_action tx_action;
|
||||
struct {
|
||||
uint16_t sequence;
|
||||
uint32_t timestamp;
|
||||
uint32_t ssrc;
|
||||
struct timeval last_tv;
|
||||
} transmit;
|
||||
};
|
||||
|
||||
struct rtp_socket *rtp_socket_create(void);
|
||||
int rtp_socket_bind(struct rtp_socket *rs, uint32_t ip);
|
||||
int rtp_socket_connect(struct rtp_socket *rs, uint32_t ip, uint16_t port);
|
||||
int rtp_socket_proxy(struct rtp_socket *this, struct rtp_socket *other);
|
||||
int rtp_socket_upstream(struct rtp_socket *this, struct gsm_network *net, uint32_t callref);
|
||||
int rtp_socket_free(struct rtp_socket *rs);
|
||||
int rtp_send_frame(struct rtp_socket *rs, struct gsm_data_frame *frame);
|
||||
|
||||
#endif /* _RTP_PROXY_H */
|
|
@ -35,18 +35,10 @@
|
|||
enum signal_subsystems {
|
||||
SS_PAGING,
|
||||
SS_SMS,
|
||||
SS_ABISIP,
|
||||
SS_NM,
|
||||
SS_LCHAN,
|
||||
SS_SUBSCR,
|
||||
SS_SCALL,
|
||||
SS_CHALLOC,
|
||||
SS_IPAC_NWL,
|
||||
SS_RF,
|
||||
SS_MSC,
|
||||
SS_HO,
|
||||
SS_CCCH,
|
||||
SS_SGSN,
|
||||
};
|
||||
|
||||
/* SS_PAGING signals */
|
||||
|
@ -64,50 +56,6 @@ enum signal_sms {
|
|||
S_SMS_UNKNOWN_ERROR, /* A MS tells us it has an error */
|
||||
};
|
||||
|
||||
/* SS_ABISIP signals */
|
||||
enum signal_abisip {
|
||||
S_ABISIP_CRCX_ACK,
|
||||
S_ABISIP_MDCX_ACK,
|
||||
S_ABISIP_DLCX_IND,
|
||||
};
|
||||
|
||||
/* SS_NM signals */
|
||||
enum signal_nm {
|
||||
S_NM_SW_ACTIV_REP, /* GSM 12.21 software activated report */
|
||||
S_NM_FAIL_REP, /* GSM 12.21 failure event report */
|
||||
S_NM_NACK, /* GSM 12.21 various NM_MT_*_NACK happened */
|
||||
S_NM_IPACC_NACK, /* GSM 12.21 nanoBTS extensions NM_MT_IPACC_*_*_NACK happened */
|
||||
S_NM_IPACC_ACK, /* GSM 12.21 nanoBTS extensions NM_MT_IPACC_*_*_ACK happened */
|
||||
S_NM_IPACC_RESTART_ACK, /* nanoBTS has send a restart ack */
|
||||
S_NM_IPACC_RESTART_NACK,/* nanoBTS has send a restart ack */
|
||||
S_NM_TEST_REP, /* GSM 12.21 Test Report */
|
||||
S_NM_STATECHG_OPER, /* Operational State changed*/
|
||||
S_NM_STATECHG_ADM, /* Administrative State changed */
|
||||
S_NM_OM2K_CONF_RES, /* OM2K Configuration Result */
|
||||
};
|
||||
|
||||
/* SS_LCHAN signals */
|
||||
enum signal_lchan {
|
||||
/*
|
||||
* The lchan got freed with an use_count != 0 and error
|
||||
* recovery needs to be carried out from within the
|
||||
* signal handler.
|
||||
*/
|
||||
S_LCHAN_UNEXPECTED_RELEASE,
|
||||
S_LCHAN_ACTIVATE_ACK, /* 08.58 Channel Activate ACK */
|
||||
S_LCHAN_ACTIVATE_NACK, /* 08.58 Channel Activate NACK */
|
||||
S_LCHAN_HANDOVER_COMPL, /* 04.08 Handover Completed */
|
||||
S_LCHAN_HANDOVER_FAIL, /* 04.08 Handover Failed */
|
||||
S_LCHAN_HANDOVER_DETECT, /* 08.58 Handover Detect */
|
||||
S_LCHAN_MEAS_REP, /* 08.58 Measurement Report */
|
||||
};
|
||||
|
||||
/* SS_CHALLOC signals */
|
||||
enum signal_challoc {
|
||||
S_CHALLOC_ALLOC_FAIL, /* allocation of lchan has failed */
|
||||
S_CHALLOC_FREED, /* lchan has been successfully freed */
|
||||
};
|
||||
|
||||
/* SS_SUBSCR signals */
|
||||
enum signal_subscr {
|
||||
S_SUBSCR_ATTACHED,
|
||||
|
@ -131,13 +79,6 @@ enum signal_global {
|
|||
S_GLOBAL_BTS_CLOSE_OM,
|
||||
};
|
||||
|
||||
/* SS_RF signals */
|
||||
enum signal_rf {
|
||||
S_RF_OFF,
|
||||
S_RF_ON,
|
||||
S_RF_GRACE,
|
||||
};
|
||||
|
||||
struct paging_signal_data {
|
||||
struct vlr_subscr *vsub;
|
||||
struct gsm_bts *bts;
|
||||
|
@ -152,51 +93,6 @@ struct scall_signal_data {
|
|||
struct gsm_subscriber_connection *conn;
|
||||
void *data;
|
||||
};
|
||||
|
||||
struct ipacc_ack_signal_data {
|
||||
struct gsm_bts_trx *trx;
|
||||
uint8_t msg_type;
|
||||
};
|
||||
|
||||
struct abis_om2k_mo;
|
||||
|
||||
struct nm_statechg_signal_data {
|
||||
struct gsm_bts *bts;
|
||||
uint8_t obj_class;
|
||||
void *obj;
|
||||
struct gsm_nm_state *old_state;
|
||||
struct gsm_nm_state *new_state;
|
||||
|
||||
/* This pointer is vaold for TS 12.21 MO */
|
||||
struct abis_om_obj_inst *obj_inst;
|
||||
/* This pointer is vaold for RBS2000 MO */
|
||||
struct abis_om2k_mo *om2k_mo;
|
||||
};
|
||||
|
||||
struct nm_om2k_signal_data {
|
||||
struct gsm_bts *bts;
|
||||
void *obj;
|
||||
struct abis_om2k_mo *om2k_mo;
|
||||
|
||||
uint8_t accordance_ind;
|
||||
};
|
||||
|
||||
struct nm_nack_signal_data {
|
||||
struct msgb *msg;
|
||||
struct gsm_bts *bts;
|
||||
uint8_t mt;
|
||||
};
|
||||
|
||||
struct challoc_signal_data {
|
||||
struct gsm_bts *bts;
|
||||
struct gsm_lchan *lchan;
|
||||
enum gsm_chan_t type;
|
||||
};
|
||||
|
||||
struct rf_signal_data {
|
||||
struct gsm_network *net;
|
||||
};
|
||||
|
||||
struct sms_signal_data {
|
||||
/* The transaction where this occured */
|
||||
struct gsm_trans *trans;
|
||||
|
@ -206,13 +102,6 @@ struct sms_signal_data {
|
|||
int paging_result;
|
||||
};
|
||||
|
||||
struct lchan_signal_data {
|
||||
/* The lchan the signal happened on */
|
||||
struct gsm_lchan *lchan;
|
||||
/* Measurement reports on this lchan */
|
||||
struct gsm_meas_rep *mr;
|
||||
};
|
||||
|
||||
/* MSC signals */
|
||||
enum signal_msc {
|
||||
S_MSC_LOST,
|
||||
|
@ -225,36 +114,4 @@ struct msc_signal_data {
|
|||
struct bsc_msc_data *data;
|
||||
};
|
||||
|
||||
/* SS_CCCH signals */
|
||||
enum signal_ccch {
|
||||
S_CCCH_PAGING_LOAD,
|
||||
S_CCCH_RACH_LOAD,
|
||||
};
|
||||
|
||||
struct ccch_signal_data {
|
||||
struct gsm_bts *bts;
|
||||
uint16_t pg_buf_space;
|
||||
uint16_t rach_slot_count;
|
||||
uint16_t rach_busy_count;
|
||||
uint16_t rach_access_count;
|
||||
};
|
||||
|
||||
/* GPRS SGSN signals SS_SGSN */
|
||||
enum signal_sgsn {
|
||||
S_SGSN_ATTACH,
|
||||
S_SGSN_DETACH,
|
||||
S_SGSN_UPDATE,
|
||||
S_SGSN_PDP_ACT,
|
||||
S_SGSN_PDP_DEACT,
|
||||
S_SGSN_PDP_TERMINATE,
|
||||
S_SGSN_PDP_FREE,
|
||||
S_SGSN_MM_FREE,
|
||||
};
|
||||
|
||||
struct sgsn_mm_ctx;
|
||||
struct sgsn_signal_data {
|
||||
struct sgsn_mm_ctx *mm;
|
||||
struct sgsn_pdp_ctx *pdp; /* non-NULL for PDP_ACT, PDP_DEACT, PDP_FREE */
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -1,187 +0,0 @@
|
|||
#ifndef _SLHC_H
|
||||
#define _SLHC_H
|
||||
/*
|
||||
* Definitions for tcp compression routines.
|
||||
*
|
||||
* $Header: slcompress.h,v 1.10 89/12/31 08:53:02 van Exp $
|
||||
*
|
||||
* Copyright (c) 1989 Regents of the University of California.
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms are permitted
|
||||
* provided that the above copyright notice and this paragraph are
|
||||
* duplicated in all such forms and that any documentation,
|
||||
* advertising materials, and other materials related to such
|
||||
* distribution and use acknowledge that the software was developed
|
||||
* by the University of California, Berkeley. The name of the
|
||||
* University may not be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
|
||||
* IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
||||
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* Van Jacobson (van@helios.ee.lbl.gov), Dec 31, 1989:
|
||||
* - Initial distribution.
|
||||
*
|
||||
*
|
||||
* modified for KA9Q Internet Software Package by
|
||||
* Katie Stevens (dkstevens@ucdavis.edu)
|
||||
* University of California, Davis
|
||||
* Computing Services
|
||||
* - 01-31-90 initial adaptation
|
||||
*
|
||||
* - Feb 1991 Bill_Simpson@um.cc.umich.edu
|
||||
* variable number of conversation slots
|
||||
* allow zero or one slots
|
||||
* separate routines
|
||||
* status display
|
||||
*/
|
||||
|
||||
/*
|
||||
* Compressed packet format:
|
||||
*
|
||||
* The first octet contains the packet type (top 3 bits), TCP
|
||||
* 'push' bit, and flags that indicate which of the 4 TCP sequence
|
||||
* numbers have changed (bottom 5 bits). The next octet is a
|
||||
* conversation number that associates a saved IP/TCP header with
|
||||
* the compressed packet. The next two octets are the TCP checksum
|
||||
* from the original datagram. The next 0 to 15 octets are
|
||||
* sequence number changes, one change per bit set in the header
|
||||
* (there may be no changes and there are two special cases where
|
||||
* the receiver implicitly knows what changed -- see below).
|
||||
*
|
||||
* There are 5 numbers which can change (they are always inserted
|
||||
* in the following order): TCP urgent pointer, window,
|
||||
* acknowledgment, sequence number and IP ID. (The urgent pointer
|
||||
* is different from the others in that its value is sent, not the
|
||||
* change in value.) Since typical use of SLIP links is biased
|
||||
* toward small packets (see comments on MTU/MSS below), changes
|
||||
* use a variable length coding with one octet for numbers in the
|
||||
* range 1 - 255 and 3 octets (0, MSB, LSB) for numbers in the
|
||||
* range 256 - 65535 or 0. (If the change in sequence number or
|
||||
* ack is more than 65535, an uncompressed packet is sent.)
|
||||
*/
|
||||
|
||||
/*
|
||||
* Packet types (must not conflict with IP protocol version)
|
||||
*
|
||||
* The top nibble of the first octet is the packet type. There are
|
||||
* three possible types: IP (not proto TCP or tcp with one of the
|
||||
* control flags set); uncompressed TCP (a normal IP/TCP packet but
|
||||
* with the 8-bit protocol field replaced by an 8-bit connection id --
|
||||
* this type of packet syncs the sender & receiver); and compressed
|
||||
* TCP (described above).
|
||||
*
|
||||
* LSB of 4-bit field is TCP "PUSH" bit (a worthless anachronism) and
|
||||
* is logically part of the 4-bit "changes" field that follows. Top
|
||||
* three bits are actual packet type. For backward compatibility
|
||||
* and in the interest of conserving bits, numbers are chosen so the
|
||||
* IP protocol version number (4) which normally appears in this nibble
|
||||
* means "IP packet".
|
||||
*/
|
||||
|
||||
|
||||
#include <linux/ip.h>
|
||||
#include <linux/tcp.h>
|
||||
|
||||
/* SLIP compression masks for len/vers byte */
|
||||
#define SL_TYPE_IP 0x40
|
||||
#define SL_TYPE_UNCOMPRESSED_TCP 0x70
|
||||
#define SL_TYPE_COMPRESSED_TCP 0x80
|
||||
#define SL_TYPE_ERROR 0x00
|
||||
|
||||
/* Bits in first octet of compressed packet */
|
||||
#define NEW_C 0x40 /* flag bits for what changed in a packet */
|
||||
#define NEW_I 0x20
|
||||
#define NEW_S 0x08
|
||||
#define NEW_A 0x04
|
||||
#define NEW_W 0x02
|
||||
#define NEW_U 0x01
|
||||
|
||||
/* reserved, special-case values of above */
|
||||
#define SPECIAL_I (NEW_S|NEW_W|NEW_U) /* echoed interactive traffic */
|
||||
#define SPECIAL_D (NEW_S|NEW_A|NEW_W|NEW_U) /* unidirectional data */
|
||||
#define SPECIALS_MASK (NEW_S|NEW_A|NEW_W|NEW_U)
|
||||
|
||||
#define TCP_PUSH_BIT 0x10
|
||||
|
||||
/*
|
||||
* data type and sizes conversion assumptions:
|
||||
*
|
||||
* VJ code KA9Q style generic
|
||||
* u_char byte_t unsigned char 8 bits
|
||||
* u_short int16 unsigned short 16 bits
|
||||
* u_int int16 unsigned short 16 bits
|
||||
* u_long unsigned long unsigned long 32 bits
|
||||
* int int32 long 32 bits
|
||||
*/
|
||||
|
||||
typedef __u8 byte_t;
|
||||
typedef __u32 int32;
|
||||
|
||||
/*
|
||||
* "state" data for each active tcp conversation on the wire. This is
|
||||
* basically a copy of the entire IP/TCP header from the last packet
|
||||
* we saw from the conversation together with a small identifier
|
||||
* the transmit & receive ends of the line use to locate saved header.
|
||||
*/
|
||||
struct cstate {
|
||||
byte_t cs_this; /* connection id number (xmit) */
|
||||
struct cstate *next; /* next in ring (xmit) */
|
||||
struct iphdr cs_ip; /* ip/tcp hdr from most recent packet */
|
||||
struct tcphdr cs_tcp;
|
||||
unsigned char cs_ipopt[64];
|
||||
unsigned char cs_tcpopt[64];
|
||||
int cs_hsize;
|
||||
};
|
||||
#define NULLSLSTATE (struct cstate *)0
|
||||
|
||||
/*
|
||||
* all the state data for one serial line (we need one of these per line).
|
||||
*/
|
||||
struct slcompress {
|
||||
struct cstate *tstate; /* transmit connection states (array)*/
|
||||
struct cstate *rstate; /* receive connection states (array)*/
|
||||
|
||||
byte_t tslot_limit; /* highest transmit slot id (0-l)*/
|
||||
byte_t rslot_limit; /* highest receive slot id (0-l)*/
|
||||
|
||||
byte_t xmit_oldest; /* oldest xmit in ring */
|
||||
byte_t xmit_current; /* most recent xmit id */
|
||||
byte_t recv_current; /* most recent rcvd id */
|
||||
|
||||
byte_t flags;
|
||||
#define SLF_TOSS 0x01 /* tossing rcvd frames until id received */
|
||||
|
||||
int32 sls_o_nontcp; /* outbound non-TCP packets */
|
||||
int32 sls_o_tcp; /* outbound TCP packets */
|
||||
int32 sls_o_uncompressed; /* outbound uncompressed packets */
|
||||
int32 sls_o_compressed; /* outbound compressed packets */
|
||||
int32 sls_o_searches; /* searches for connection state */
|
||||
int32 sls_o_misses; /* times couldn't find conn. state */
|
||||
|
||||
int32 sls_i_uncompressed; /* inbound uncompressed packets */
|
||||
int32 sls_i_compressed; /* inbound compressed packets */
|
||||
int32 sls_i_error; /* inbound error packets */
|
||||
int32 sls_i_tossed; /* inbound packets tossed because of error */
|
||||
|
||||
int32 sls_i_runt;
|
||||
int32 sls_i_badcheck;
|
||||
};
|
||||
#define NULLSLCOMPR (struct slcompress *)0
|
||||
|
||||
/* In slhc.c: */
|
||||
struct slcompress *slhc_init(const void *ctx, int rslots, int tslots);
|
||||
|
||||
void slhc_free(struct slcompress *comp);
|
||||
|
||||
int slhc_compress(struct slcompress *comp, unsigned char *icp, int isize,
|
||||
unsigned char *ocp, unsigned char **cpp, int compress_cid);
|
||||
int slhc_uncompress(struct slcompress *comp, unsigned char *icp, int isize);
|
||||
int slhc_remember(struct slcompress *comp, unsigned char *icp, int isize);
|
||||
int slhc_toss(struct slcompress *comp);
|
||||
|
||||
void slhc_i_status(struct slcompress *comp);
|
||||
void slhc_o_status(struct slcompress *comp);
|
||||
|
||||
#endif /* _SLHC_H */
|
|
@ -1,22 +0,0 @@
|
|||
#ifndef _SYSTEM_INFO_H
|
||||
#define _SYSTEM_INFO_H
|
||||
|
||||
#include <osmocom/gsm/sysinfo.h>
|
||||
|
||||
#include <osmocom/msc/arfcn_range_encode.h>
|
||||
|
||||
struct gsm_bts;
|
||||
|
||||
int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type type);
|
||||
size_t si2q_earfcn_count(const struct osmo_earfcn_si2q *e);
|
||||
unsigned range1024_p(unsigned n);
|
||||
unsigned range512_q(unsigned m);
|
||||
int range_encode(enum gsm48_range r, int *arfcns, int arfcns_used, int *w,
|
||||
int f0, uint8_t *chan_list);
|
||||
uint8_t si2q_num(struct gsm_bts *bts);
|
||||
int bts_earfcn_add(struct gsm_bts *bts, uint16_t earfcn, uint8_t thresh_hi, uint8_t thresh_lo, uint8_t prio,
|
||||
uint8_t qrx, uint8_t meas_bw);
|
||||
int bts_uarfcn_del(struct gsm_bts *bts, uint16_t arfcn, uint16_t scramble);
|
||||
int bts_uarfcn_add(struct gsm_bts *bts, uint16_t arfcn, uint16_t scramble,
|
||||
bool diversity);
|
||||
#endif
|
|
@ -1,70 +0,0 @@
|
|||
/* Simple TRAU frame reflector to route voice calls */
|
||||
|
||||
/* (C) 2009 by Harald Welte <laforge@gnumonks.org>
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
/* The "TRAU mux map" defines which particular 16kbit sub-slot (in which E1
|
||||
* timeslot on which E1 interface) should be directly muxed to which other
|
||||
* sub-slot. Entries in the mux map are always bi-directional.
|
||||
*
|
||||
* The idea of all this is to directly switch voice channels in the BSC
|
||||
* from one phone to another. We do this right now since we don't support
|
||||
* any external interface for voice channels, and in the future as an
|
||||
* optimization to routing them externally.
|
||||
*/
|
||||
|
||||
#include <stdint.h>
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
#include <osmocom/msc/mncc.h>
|
||||
|
||||
struct decoded_trau_frame;
|
||||
|
||||
/* map a TRAU mux map entry */
|
||||
int trau_mux_map(const struct gsm_e1_subslot *src,
|
||||
const struct gsm_e1_subslot *dst);
|
||||
int trau_mux_map_lchan(const struct gsm_lchan *src,
|
||||
const struct gsm_lchan *dst);
|
||||
|
||||
/* unmap a TRAU mux map entry */
|
||||
int trau_mux_unmap(const struct gsm_e1_subslot *ss, uint32_t callref);
|
||||
|
||||
/* we get called by subchan_demux */
|
||||
int trau_mux_input(struct gsm_e1_subslot *src_e1_ss,
|
||||
const uint8_t *trau_bits, int num_bits);
|
||||
|
||||
/* add a trau receiver */
|
||||
int trau_recv_lchan(struct gsm_lchan *lchan, uint32_t callref);
|
||||
|
||||
/* send trau from application */
|
||||
int trau_send_frame(struct gsm_lchan *lchan, struct gsm_data_frame *frame);
|
||||
|
||||
/* switch trau muxer to new lchan */
|
||||
int switch_trau_mux(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan);
|
||||
|
||||
/* callback invoked if we receive TRAU frames */
|
||||
int subch_cb(struct subch_demux *dmx, int ch, uint8_t *data, int len, void *_priv);
|
||||
|
||||
/* TRAU frame transcoding */
|
||||
struct msgb *trau_decode_fr(uint32_t callref,
|
||||
const struct decoded_trau_frame *tf);
|
||||
struct msgb *trau_decode_efr(uint32_t callref,
|
||||
const struct decoded_trau_frame *tf);
|
||||
void trau_encode_fr(struct decoded_trau_frame *tf,
|
||||
const unsigned char *data);
|
||||
void trau_encode_efr(struct decoded_trau_frame *tf,
|
||||
const unsigned char *data);
|
|
@ -1,7 +0,0 @@
|
|||
#ifndef _TRAU_UPQUEUE_H
|
||||
#define _TRAU_UPQUEUE_H
|
||||
|
||||
void trau_tx_to_mncc(struct gsm_network *net, struct msgb *msg);
|
||||
|
||||
#endif /* _TRAU_UPQUEUE_H */
|
||||
|
|
@ -17,27 +17,11 @@ extern struct cmd_element cfg_no_description_cmd;
|
|||
|
||||
enum bsc_vty_node {
|
||||
GSMNET_NODE = _LAST_OSMOVTY_NODE + 1,
|
||||
BTS_NODE,
|
||||
TRX_NODE,
|
||||
TS_NODE,
|
||||
SUBSCR_NODE,
|
||||
MGCP_NODE,
|
||||
GBPROXY_NODE,
|
||||
SGSN_NODE,
|
||||
OML_NODE,
|
||||
NAT_NODE,
|
||||
NAT_BSC_NODE,
|
||||
MSC_NODE,
|
||||
OM2K_NODE,
|
||||
OM2K_CON_GROUP_NODE,
|
||||
TRUNK_NODE,
|
||||
PGROUP_NODE,
|
||||
MNCC_INT_NODE,
|
||||
NITB_NODE,
|
||||
BSC_NODE,
|
||||
SMPP_NODE,
|
||||
SMPP_ESME_NODE,
|
||||
GTPHUB_NODE,
|
||||
HLR_NODE,
|
||||
};
|
||||
|
||||
|
|
|
@ -27,7 +27,6 @@
|
|||
#include <string.h>
|
||||
#include <osmocom/msc/debug.h>
|
||||
#include <osmocom/msc/bsc_msc_data.h>
|
||||
#include <osmocom/msc/osmo_bsc_sigtran.h>
|
||||
|
||||
#define RESET_RESEND_INTERVAL 2 /* sec */
|
||||
#define RESET_RESEND_TIMER_NO 1234 /* FIXME: dig out the real timer number */
|
||||
|
|
|
@ -24,7 +24,6 @@ libcommon_a_SOURCES = \
|
|||
common_vty.c \
|
||||
debug.c \
|
||||
gsm_data.c \
|
||||
gsm_data_shared.c \
|
||||
gsup_client.c \
|
||||
oap_client.c \
|
||||
socket.c \
|
||||
|
|
|
@ -42,25 +42,11 @@ int bsc_vty_go_parent(struct vty *vty)
|
|||
vty->node = CONFIG_NODE;
|
||||
vty->index = NULL;
|
||||
break;
|
||||
case TS_NODE:
|
||||
vty->node = TRX_NODE;
|
||||
{
|
||||
/* set vty->index correctly ! */
|
||||
struct gsm_bts_trx_ts *ts = vty->index;
|
||||
vty->index = ts->trx;
|
||||
vty->index_sub = &ts->trx->description;
|
||||
}
|
||||
break;
|
||||
case TRUNK_NODE:
|
||||
vty->node = MGCP_NODE;
|
||||
vty->index = NULL;
|
||||
break;
|
||||
case SMPP_ESME_NODE:
|
||||
vty->node = SMPP_NODE;
|
||||
vty->index = NULL;
|
||||
break;
|
||||
case SMPP_NODE:
|
||||
case MGCP_NODE:
|
||||
case MSC_NODE:
|
||||
case MNCC_INT_NODE:
|
||||
vty->node = CONFIG_NODE;
|
||||
|
|
|
@ -29,74 +29,14 @@
|
|||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/gsm/gsm_utils.h>
|
||||
#include <osmocom/gsm/abis_nm.h>
|
||||
#include <osmocom/core/statistics.h>
|
||||
#include <osmocom/gsm/protocol/gsm_04_08.h>
|
||||
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
#include <osmocom/msc/bsc_msc_data.h>
|
||||
#include <osmocom/msc/abis_nm.h>
|
||||
|
||||
void *tall_bsc_ctx;
|
||||
|
||||
static LLIST_HEAD(bts_models);
|
||||
|
||||
void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr,
|
||||
uint8_t e1_ts, uint8_t e1_ts_ss)
|
||||
{
|
||||
ts->e1_link.e1_nr = e1_nr;
|
||||
ts->e1_link.e1_ts = e1_ts;
|
||||
ts->e1_link.e1_ts_ss = e1_ts_ss;
|
||||
}
|
||||
|
||||
const struct value_string bts_type_descs[_NUM_GSM_BTS_TYPE+1] = {
|
||||
{ GSM_BTS_TYPE_UNKNOWN, "Unknown BTS Type" },
|
||||
{ GSM_BTS_TYPE_BS11, "Siemens BTS (BS-11 or compatible)" },
|
||||
{ GSM_BTS_TYPE_NANOBTS, "ip.access nanoBTS or compatible" },
|
||||
{ GSM_BTS_TYPE_RBS2000, "Ericsson RBS2000 Series" },
|
||||
{ GSM_BTS_TYPE_NOKIA_SITE, "Nokia {Metro,Ultra,In}Site" },
|
||||
{ GSM_BTS_TYPE_OSMOBTS, "sysmocom sysmoBTS" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr)
|
||||
{
|
||||
struct gsm_bts_trx *trx;
|
||||
|
||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||
if (trx->nr == nr)
|
||||
return trx;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* Search for a BTS in the given Location Area; optionally start searching
|
||||
* with start_bts (for continuing to search after the first result) */
|
||||
struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac,
|
||||
struct gsm_bts *start_bts)
|
||||
{
|
||||
int i;
|
||||
struct gsm_bts *bts;
|
||||
int skip = 0;
|
||||
|
||||
if (start_bts)
|
||||
skip = 1;
|
||||
|
||||
for (i = 0; i < net->num_bts; i++) {
|
||||
bts = gsm_bts_num(net, i);
|
||||
|
||||
if (skip) {
|
||||
if (start_bts == bts)
|
||||
skip = 0;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lac == GSM_LAC_RESERVED_ALL_BTS || bts->location_area_code == lac)
|
||||
return bts;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const struct value_string auth_policy_names[] = {
|
||||
{ GSM_AUTH_POLICY_CLOSED, "closed" },
|
||||
{ GSM_AUTH_POLICY_ACCEPT_ALL, "accept-all" },
|
||||
|
@ -133,45 +73,6 @@ const char *rrlp_mode_name(enum rrlp_mode mode)
|
|||
return get_value_string(rrlp_mode_names, mode);
|
||||
}
|
||||
|
||||
static const struct value_string bts_gprs_mode_names[] = {
|
||||
{ BTS_GPRS_NONE, "none" },
|
||||
{ BTS_GPRS_GPRS, "gprs" },
|
||||
{ BTS_GPRS_EGPRS, "egprs" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
enum bts_gprs_mode bts_gprs_mode_parse(const char *arg, int *valid)
|
||||
{
|
||||
int rc;
|
||||
|
||||
rc = get_string_value(bts_gprs_mode_names, arg);
|
||||
if (valid)
|
||||
*valid = rc != -EINVAL;
|
||||
return rc;
|
||||
}
|
||||
|
||||
const char *bts_gprs_mode_name(enum bts_gprs_mode mode)
|
||||
{
|
||||
return get_value_string(bts_gprs_mode_names, mode);
|
||||
}
|
||||
|
||||
void gprs_ra_id_by_bts(struct gprs_ra_id *raid, struct gsm_bts *bts)
|
||||
{
|
||||
raid->mcc = bts->network->country_code;
|
||||
raid->mnc = bts->network->network_code;
|
||||
raid->lac = bts->location_area_code;
|
||||
raid->rac = bts->gprs.rac;
|
||||
}
|
||||
|
||||
int gsm48_ra_id_by_bts(uint8_t *buf, struct gsm_bts *bts)
|
||||
{
|
||||
struct gprs_ra_id raid;
|
||||
|
||||
gprs_ra_id_by_bts(&raid, bts);
|
||||
|
||||
return gsm48_construct_ra(buf, &raid);
|
||||
}
|
||||
|
||||
int gsm_parse_reg(void *ctx, regex_t *reg, char **str, int argc, const char **argv)
|
||||
{
|
||||
int ret;
|
||||
|
@ -197,9 +98,6 @@ int gsm_parse_reg(void *ctx, regex_t *reg, char **str, int argc, const char **ar
|
|||
return ret;
|
||||
}
|
||||
|
||||
/* Assume there are only 256 possible bts */
|
||||
osmo_static_assert(sizeof(((struct gsm_bts *) 0)->nr) == 1, _bts_nr_is_256);
|
||||
|
||||
bool classmark_is_r99(struct gsm_classmark *cm)
|
||||
{
|
||||
int rev_lev = 0;
|
||||
|
|
|
@ -1,853 +0,0 @@
|
|||
/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org>
|
||||
*
|
||||
* All Rights Reserved
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation; either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
|
||||
#include <osmocom/core/linuxlist.h>
|
||||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/gsm/gsm_utils.h>
|
||||
#include <osmocom/gsm/abis_nm.h>
|
||||
#include <osmocom/core/statistics.h>
|
||||
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
|
||||
void gsm_abis_mo_reset(struct gsm_abis_mo *mo)
|
||||
{
|
||||
mo->nm_state.operational = NM_OPSTATE_NULL;
|
||||
mo->nm_state.availability = NM_AVSTATE_POWER_OFF;
|
||||
}
|
||||
|
||||
static 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)
|
||||
{
|
||||
mo->bts = bts;
|
||||
mo->obj_class = obj_class;
|
||||
mo->obj_inst.bts_nr = p1;
|
||||
mo->obj_inst.trx_nr = p2;
|
||||
mo->obj_inst.ts_nr = p3;
|
||||
gsm_abis_mo_reset(mo);
|
||||
}
|
||||
|
||||
const struct value_string bts_attribute_names[] = {
|
||||
OSMO_VALUE_STRING(BTS_TYPE_VARIANT),
|
||||
OSMO_VALUE_STRING(BTS_SUB_MODEL),
|
||||
OSMO_VALUE_STRING(TRX_PHY_VERSION),
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
enum bts_attribute str2btsattr(const char *s)
|
||||
{
|
||||
return get_string_value(bts_attribute_names, s);
|
||||
}
|
||||
|
||||
const char *btsatttr2str(enum bts_attribute v)
|
||||
{
|
||||
return get_value_string(bts_attribute_names, v);
|
||||
}
|
||||
|
||||
const struct value_string osmo_bts_variant_names[_NUM_BTS_VARIANT + 1] = {
|
||||
{ BTS_UNKNOWN, "unknown" },
|
||||
{ BTS_OSMO_LITECELL15, "osmo-bts-lc15" },
|
||||
{ BTS_OSMO_OCTPHY, "osmo-bts-octphy" },
|
||||
{ BTS_OSMO_SYSMO, "osmo-bts-sysmo" },
|
||||
{ BTS_OSMO_TRX, "omso-bts-trx" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
enum gsm_bts_type_variant str2btsvariant(const char *arg)
|
||||
{
|
||||
return get_string_value(osmo_bts_variant_names, arg);
|
||||
}
|
||||
|
||||
const char *btsvariant2str(enum gsm_bts_type_variant v)
|
||||
{
|
||||
return get_value_string(osmo_bts_variant_names, v);
|
||||
}
|
||||
|
||||
const struct value_string bts_type_names[_NUM_GSM_BTS_TYPE + 1] = {
|
||||
{ GSM_BTS_TYPE_UNKNOWN, "unknown" },
|
||||
{ GSM_BTS_TYPE_BS11, "bs11" },
|
||||
{ GSM_BTS_TYPE_NANOBTS, "nanobts" },
|
||||
{ GSM_BTS_TYPE_RBS2000, "rbs2000" },
|
||||
{ GSM_BTS_TYPE_NOKIA_SITE, "nokia_site" },
|
||||
{ GSM_BTS_TYPE_OSMOBTS, "sysmobts" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
enum gsm_bts_type str2btstype(const char *arg)
|
||||
{
|
||||
return get_string_value(bts_type_names, arg);
|
||||
}
|
||||
|
||||
const char *btstype2str(enum gsm_bts_type type)
|
||||
{
|
||||
return get_value_string(bts_type_names, type);
|
||||
}
|
||||
|
||||
const struct value_string gsm_bts_features_descs[] = {
|
||||
{ BTS_FEAT_HSCSD, "HSCSD" },
|
||||
{ BTS_FEAT_GPRS, "GPRS" },
|
||||
{ BTS_FEAT_EGPRS, "EGPRS" },
|
||||
{ BTS_FEAT_ECSD, "ECSD" },
|
||||
{ BTS_FEAT_HOPPING, "Frequency Hopping" },
|
||||
{ BTS_FEAT_MULTI_TSC, "Multi-TSC" },
|
||||
{ BTS_FEAT_OML_ALERTS, "OML Alerts" },
|
||||
{ BTS_FEAT_AGCH_PCH_PROP, "AGCH/PCH proportional allocation" },
|
||||
{ BTS_FEAT_CBCH, "CBCH" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
const struct value_string gsm_chreq_descs[] = {
|
||||
{ GSM_CHREQ_REASON_EMERG, "emergency call" },
|
||||
{ GSM_CHREQ_REASON_PAG, "answer to paging" },
|
||||
{ GSM_CHREQ_REASON_CALL, "call re-establishment" },
|
||||
{ GSM_CHREQ_REASON_LOCATION_UPD,"Location updating" },
|
||||
{ GSM_CHREQ_REASON_PDCH, "one phase packet access" },
|
||||
{ GSM_CHREQ_REASON_OTHER, "other" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
const struct value_string gsm_pchant_names[13] = {
|
||||
{ GSM_PCHAN_NONE, "NONE" },
|
||||
{ GSM_PCHAN_CCCH, "CCCH" },
|
||||
{ GSM_PCHAN_CCCH_SDCCH4,"CCCH+SDCCH4" },
|
||||
{ GSM_PCHAN_TCH_F, "TCH/F" },
|
||||
{ GSM_PCHAN_TCH_H, "TCH/H" },
|
||||
{ GSM_PCHAN_SDCCH8_SACCH8C, "SDCCH8" },
|
||||
{ GSM_PCHAN_PDCH, "PDCH" },
|
||||
{ GSM_PCHAN_TCH_F_PDCH, "TCH/F_PDCH" },
|
||||
{ GSM_PCHAN_UNKNOWN, "UNKNOWN" },
|
||||
{ GSM_PCHAN_CCCH_SDCCH4_CBCH, "CCCH+SDCCH4+CBCH" },
|
||||
{ GSM_PCHAN_SDCCH8_SACCH8C_CBCH, "SDCCH8+CBCH" },
|
||||
{ GSM_PCHAN_TCH_F_TCH_H_PDCH, "TCH/F_TCH/H_PDCH" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
const struct value_string gsm_pchant_descs[13] = {
|
||||
{ GSM_PCHAN_NONE, "Physical Channel not configured" },
|
||||
{ GSM_PCHAN_CCCH, "FCCH + SCH + BCCH + CCCH (Comb. IV)" },
|
||||
{ GSM_PCHAN_CCCH_SDCCH4,
|
||||
"FCCH + SCH + BCCH + CCCH + 4 SDCCH + 2 SACCH (Comb. V)" },
|
||||
{ GSM_PCHAN_TCH_F, "TCH/F + FACCH/F + SACCH (Comb. I)" },
|
||||
{ GSM_PCHAN_TCH_H, "2 TCH/H + 2 FACCH/H + 2 SACCH (Comb. II)" },
|
||||
{ GSM_PCHAN_SDCCH8_SACCH8C, "8 SDCCH + 4 SACCH (Comb. VII)" },
|
||||
{ GSM_PCHAN_PDCH, "Packet Data Channel for GPRS/EDGE" },
|
||||
{ GSM_PCHAN_TCH_F_PDCH, "Dynamic TCH/F or GPRS PDCH" },
|
||||
{ GSM_PCHAN_UNKNOWN, "Unknown / Unsupported channel combination" },
|
||||
{ GSM_PCHAN_CCCH_SDCCH4_CBCH, "FCCH + SCH + BCCH + CCCH + CBCH + 3 SDCCH + 2 SACCH (Comb. V)" },
|
||||
{ GSM_PCHAN_SDCCH8_SACCH8C_CBCH, "7 SDCCH + 4 SACCH + CBCH (Comb. VII)" },
|
||||
{ GSM_PCHAN_TCH_F_TCH_H_PDCH, "Dynamic TCH/F or TCH/H or GPRS PDCH" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
const char *gsm_pchan_name(enum gsm_phys_chan_config c)
|
||||
{
|
||||
return get_value_string(gsm_pchant_names, c);
|
||||
}
|
||||
|
||||
enum gsm_phys_chan_config gsm_pchan_parse(const char *name)
|
||||
{
|
||||
return get_string_value(gsm_pchant_names, name);
|
||||
}
|
||||
|
||||
/* TODO: move to libosmocore, next to gsm_chan_t_names? */
|
||||
const char *gsm_lchant_name(enum gsm_chan_t c)
|
||||
{
|
||||
return get_value_string(gsm_chan_t_names, c);
|
||||
}
|
||||
|
||||
static const struct value_string lchan_s_names[] = {
|
||||
{ LCHAN_S_NONE, "NONE" },
|
||||
{ LCHAN_S_ACT_REQ, "ACTIVATION REQUESTED" },
|
||||
{ LCHAN_S_ACTIVE, "ACTIVE" },
|
||||
{ LCHAN_S_INACTIVE, "INACTIVE" },
|
||||
{ LCHAN_S_REL_REQ, "RELEASE REQUESTED" },
|
||||
{ LCHAN_S_REL_ERR, "RELEASE DUE ERROR" },
|
||||
{ LCHAN_S_BROKEN, "BROKEN UNUSABLE" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
const char *gsm_lchans_name(enum gsm_lchan_state s)
|
||||
{
|
||||
return get_value_string(lchan_s_names, s);
|
||||
}
|
||||
|
||||
static const struct value_string chreq_names[] = {
|
||||
{ GSM_CHREQ_REASON_EMERG, "EMERGENCY" },
|
||||
{ GSM_CHREQ_REASON_PAG, "PAGING" },
|
||||
{ GSM_CHREQ_REASON_CALL, "CALL" },
|
||||
{ GSM_CHREQ_REASON_LOCATION_UPD,"LOCATION_UPDATE" },
|
||||
{ GSM_CHREQ_REASON_OTHER, "OTHER" },
|
||||
{ 0, NULL }
|
||||
};
|
||||
|
||||
const char *gsm_chreq_name(enum gsm_chreq_reason_t c)
|
||||
{
|
||||
return get_value_string(chreq_names, c);
|
||||
}
|
||||
|
||||
struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num)
|
||||
{
|
||||
struct gsm_bts *bts;
|
||||
|
||||
if (num >= net->num_bts)
|
||||
return NULL;
|
||||
|
||||
llist_for_each_entry(bts, &net->bts_list, list) {
|
||||
if (bts->nr == num)
|
||||
return bts;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts)
|
||||
{
|
||||
struct gsm_bts_trx *trx = talloc_zero(bts, struct gsm_bts_trx);
|
||||
int k;
|
||||
|
||||
if (!trx)
|
||||
return NULL;
|
||||
|
||||
trx->bts = bts;
|
||||
trx->nr = bts->num_trx++;
|
||||
trx->mo.nm_state.administrative = NM_STATE_UNLOCKED;
|
||||
|
||||
gsm_mo_init(&trx->mo, bts, NM_OC_RADIO_CARRIER,
|
||||
bts->nr, trx->nr, 0xff);
|
||||
gsm_mo_init(&trx->bb_transc.mo, bts, NM_OC_BASEB_TRANSC,
|
||||
bts->nr, trx->nr, 0xff);
|
||||
|
||||
for (k = 0; k < TRX_NR_TS; k++) {
|
||||
struct gsm_bts_trx_ts *ts = &trx->ts[k];
|
||||
int l;
|
||||
|
||||
ts->trx = trx;
|
||||
ts->nr = k;
|
||||
ts->pchan = GSM_PCHAN_NONE;
|
||||
ts->dyn.pchan_is = GSM_PCHAN_NONE;
|
||||
ts->dyn.pchan_want = GSM_PCHAN_NONE;
|
||||
ts->tsc = -1;
|
||||
|
||||
gsm_mo_init(&ts->mo, bts, NM_OC_CHANNEL,
|
||||
bts->nr, trx->nr, ts->nr);
|
||||
|
||||
ts->hopping.arfcns.data_len = sizeof(ts->hopping.arfcns_data);
|
||||
ts->hopping.arfcns.data = ts->hopping.arfcns_data;
|
||||
ts->hopping.ma.data_len = sizeof(ts->hopping.ma_data);
|
||||
ts->hopping.ma.data = ts->hopping.ma_data;
|
||||
|
||||
for (l = 0; l < TS_MAX_LCHAN; l++) {
|
||||
struct gsm_lchan *lchan;
|
||||
char *name;
|
||||
lchan = &ts->lchan[l];
|
||||
|
||||
lchan->ts = ts;
|
||||
lchan->nr = l;
|
||||
lchan->type = GSM_LCHAN_NONE;
|
||||
|
||||
name = gsm_lchan_name_compute(lchan);
|
||||
lchan->name = talloc_strdup(trx, name);
|
||||
#ifndef ROLE_BSC
|
||||
INIT_LLIST_HEAD(&lchan->sapi_cmds);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (trx->nr != 0)
|
||||
trx->nominal_power = bts->c0->nominal_power;
|
||||
|
||||
llist_add_tail(&trx->list, &bts->trx_list);
|
||||
|
||||
return trx;
|
||||
}
|
||||
|
||||
|
||||
static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };
|
||||
static const uint8_t bts_cell_timer_default[] =
|
||||
{ 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };
|
||||
static const struct gprs_rlc_cfg rlc_cfg_default = {
|
||||
.parameter = {
|
||||
[RLC_T3142] = 20,
|
||||
[RLC_T3169] = 5,
|
||||
[RLC_T3191] = 5,
|
||||
[RLC_T3193] = 160, /* 10ms */
|
||||
[RLC_T3195] = 5,
|
||||
[RLC_N3101] = 10,
|
||||
[RLC_N3103] = 4,
|
||||
[RLC_N3105] = 8,
|
||||
[CV_COUNTDOWN] = 15,
|
||||
[T_DL_TBF_EXT] = 250 * 10, /* ms */
|
||||
[T_UL_TBF_EXT] = 250 * 10, /* ms */
|
||||
},
|
||||
.paging = {
|
||||
.repeat_time = 5 * 50, /* ms */
|
||||
.repeat_count = 3,
|
||||
},
|
||||
.cs_mask = 0x1fff,
|
||||
.initial_cs = 2,
|
||||
.initial_mcs = 6,
|
||||
};
|
||||
|
||||
struct gsm_bts *gsm_bts_alloc(void *ctx, uint8_t bts_num)
|
||||
{
|
||||
struct gsm_bts *bts = talloc_zero(ctx, struct gsm_bts);
|
||||
int i;
|
||||
|
||||
if (!bts)
|
||||
return NULL;
|
||||
|
||||
bts->nr = bts_num;
|
||||
bts->num_trx = 0;
|
||||
INIT_LLIST_HEAD(&bts->trx_list);
|
||||
bts->ms_max_power = 15; /* dBm */
|
||||
|
||||
gsm_mo_init(&bts->mo, bts, NM_OC_BTS,
|
||||
bts->nr, 0xff, 0xff);
|
||||
gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER,
|
||||
0xff, 0xff, 0xff);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {
|
||||
bts->gprs.nsvc[i].bts = bts;
|
||||
bts->gprs.nsvc[i].id = i;
|
||||
gsm_mo_init(&bts->gprs.nsvc[i].mo, bts, NM_OC_GPRS_NSVC,
|
||||
bts->nr, i, 0xff);
|
||||
}
|
||||
memcpy(&bts->gprs.nse.timer, bts_nse_timer_default,
|
||||
sizeof(bts->gprs.nse.timer));
|
||||
gsm_mo_init(&bts->gprs.nse.mo, bts, NM_OC_GPRS_NSE,
|
||||
bts->nr, 0xff, 0xff);
|
||||
memcpy(&bts->gprs.cell.timer, bts_cell_timer_default,
|
||||
sizeof(bts->gprs.cell.timer));
|
||||
gsm_mo_init(&bts->gprs.cell.mo, bts, NM_OC_GPRS_CELL,
|
||||
bts->nr, 0xff, 0xff);
|
||||
memcpy(&bts->gprs.cell.rlc_cfg, &rlc_cfg_default,
|
||||
sizeof(bts->gprs.cell.rlc_cfg));
|
||||
|
||||
/* create our primary TRX */
|
||||
bts->c0 = gsm_bts_trx_alloc(bts);
|
||||
if (!bts->c0) {
|
||||
talloc_free(bts);
|
||||
return NULL;
|
||||
}
|
||||
bts->c0->ts[0].pchan = GSM_PCHAN_CCCH_SDCCH4;
|
||||
|
||||
bts->rach_b_thresh = -1;
|
||||
bts->rach_ldavg_slots = -1;
|
||||
bts->paging.free_chans_need = -1;
|
||||
bts->features.data = &bts->_features_data[0];
|
||||
bts->features.data_len = sizeof(bts->_features_data);
|
||||
|
||||
/* si handling */
|
||||
bts->bcch_change_mark = 1;
|
||||
|
||||
return bts;
|
||||
}
|
||||
|
||||
/* reset the state of all MO in the BTS */
|
||||
void gsm_bts_mo_reset(struct gsm_bts *bts)
|
||||
{
|
||||
struct gsm_bts_trx *trx;
|
||||
unsigned int i;
|
||||
|
||||
gsm_abis_mo_reset(&bts->mo);
|
||||
gsm_abis_mo_reset(&bts->site_mgr.mo);
|
||||
for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++)
|
||||
gsm_abis_mo_reset(&bts->gprs.nsvc[i].mo);
|
||||
gsm_abis_mo_reset(&bts->gprs.nse.mo);
|
||||
gsm_abis_mo_reset(&bts->gprs.cell.mo);
|
||||
|
||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||
gsm_abis_mo_reset(&trx->mo);
|
||||
gsm_abis_mo_reset(&trx->bb_transc.mo);
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {
|
||||
struct gsm_bts_trx_ts *ts = &trx->ts[i];
|
||||
gsm_abis_mo_reset(&ts->mo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
struct gsm_bts_trx *gsm_bts_trx_num(const struct gsm_bts *bts, int num)
|
||||
{
|
||||
struct gsm_bts_trx *trx;
|
||||
|
||||
if (num >= bts->num_trx)
|
||||
return NULL;
|
||||
|
||||
llist_for_each_entry(trx, &bts->trx_list, list) {
|
||||
if (trx->nr == num)
|
||||
return trx;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static char ts2str[255];
|
||||
|
||||
char *gsm_trx_name(const struct gsm_bts_trx *trx)
|
||||
{
|
||||
if (!trx)
|
||||
snprintf(ts2str, sizeof(ts2str), "(trx=NULL)");
|
||||
else
|
||||
snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d)",
|
||||
trx->bts->nr, trx->nr);
|
||||
|
||||
return ts2str;
|
||||
}
|
||||
|
||||
|
||||
char *gsm_ts_name(const struct gsm_bts_trx_ts *ts)
|
||||
{
|
||||
snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr);
|
||||
|
||||
return ts2str;
|
||||
}
|
||||
|
||||
/*! Log timeslot number with full pchan information */
|
||||
char *gsm_ts_and_pchan_name(const struct gsm_bts_trx_ts *ts)
|
||||
{
|
||||
switch (ts->pchan) {
|
||||
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
|
||||
if (ts->dyn.pchan_is == ts->dyn.pchan_want)
|
||||
snprintf(ts2str, sizeof(ts2str),
|
||||
"(bts=%d,trx=%d,ts=%d,pchan=%s as %s)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr,
|
||||
gsm_pchan_name(ts->pchan),
|
||||
gsm_pchan_name(ts->dyn.pchan_is));
|
||||
else
|
||||
snprintf(ts2str, sizeof(ts2str),
|
||||
"(bts=%d,trx=%d,ts=%d,pchan=%s"
|
||||
" switching %s -> %s)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr,
|
||||
gsm_pchan_name(ts->pchan),
|
||||
gsm_pchan_name(ts->dyn.pchan_is),
|
||||
gsm_pchan_name(ts->dyn.pchan_want));
|
||||
break;
|
||||
case GSM_PCHAN_TCH_F_PDCH:
|
||||
if ((ts->flags & TS_F_PDCH_PENDING_MASK) == 0)
|
||||
snprintf(ts2str, sizeof(ts2str),
|
||||
"(bts=%d,trx=%d,ts=%d,pchan=%s as %s)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr,
|
||||
gsm_pchan_name(ts->pchan),
|
||||
(ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
|
||||
: "TCH/F");
|
||||
else
|
||||
snprintf(ts2str, sizeof(ts2str),
|
||||
"(bts=%d,trx=%d,ts=%d,pchan=%s"
|
||||
" switching %s -> %s)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr,
|
||||
gsm_pchan_name(ts->pchan),
|
||||
(ts->flags & TS_F_PDCH_ACTIVE)? "PDCH"
|
||||
: "TCH/F",
|
||||
(ts->flags & TS_F_PDCH_ACT_PENDING)? "PDCH"
|
||||
: "TCH/F");
|
||||
break;
|
||||
default:
|
||||
snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d,pchan=%s)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr,
|
||||
gsm_pchan_name(ts->pchan));
|
||||
break;
|
||||
}
|
||||
|
||||
return ts2str;
|
||||
}
|
||||
|
||||
char *gsm_lchan_name_compute(const struct gsm_lchan *lchan)
|
||||
{
|
||||
struct gsm_bts_trx_ts *ts = lchan->ts;
|
||||
|
||||
snprintf(ts2str, sizeof(ts2str), "(bts=%d,trx=%d,ts=%d,ss=%d)",
|
||||
ts->trx->bts->nr, ts->trx->nr, ts->nr, lchan->nr);
|
||||
|
||||
return ts2str;
|
||||
}
|
||||
|
||||
/* obtain the MO structure for a given object instance */
|
||||
struct gsm_abis_mo *
|
||||
gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class,
|
||||
const struct abis_om_obj_inst *obj_inst)
|
||||
{
|
||||
struct gsm_bts_trx *trx;
|
||||
struct gsm_abis_mo *mo = NULL;
|
||||
|
||||
switch (obj_class) {
|
||||
case NM_OC_BTS:
|
||||
mo = &bts->mo;
|
||||
break;
|
||||
case NM_OC_RADIO_CARRIER:
|
||||
if (obj_inst->trx_nr >= bts->num_trx) {
|
||||
return NULL;
|
||||
}
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
mo = &trx->mo;
|
||||
break;
|
||||
case NM_OC_BASEB_TRANSC:
|
||||
if (obj_inst->trx_nr >= bts->num_trx) {
|
||||
return NULL;
|
||||
}
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
mo = &trx->bb_transc.mo;
|
||||
break;
|
||||
case NM_OC_CHANNEL:
|
||||
if (obj_inst->trx_nr >= bts->num_trx) {
|
||||
return NULL;
|
||||
}
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
if (obj_inst->ts_nr >= TRX_NR_TS)
|
||||
return NULL;
|
||||
mo = &trx->ts[obj_inst->ts_nr].mo;
|
||||
break;
|
||||
case NM_OC_SITE_MANAGER:
|
||||
mo = &bts->site_mgr.mo;
|
||||
break;
|
||||
case NM_OC_BS11:
|
||||
switch (obj_inst->bts_nr) {
|
||||
case BS11_OBJ_CCLK:
|
||||
mo = &bts->bs11.cclk.mo;
|
||||
break;
|
||||
case BS11_OBJ_BBSIG:
|
||||
if (obj_inst->ts_nr > bts->num_trx)
|
||||
return NULL;
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
mo = &trx->bs11.bbsig.mo;
|
||||
break;
|
||||
case BS11_OBJ_PA:
|
||||
if (obj_inst->ts_nr > bts->num_trx)
|
||||
return NULL;
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
mo = &trx->bs11.pa.mo;
|
||||
break;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
break;
|
||||
case NM_OC_BS11_RACK:
|
||||
mo = &bts->bs11.rack.mo;
|
||||
break;
|
||||
case NM_OC_BS11_ENVABTSE:
|
||||
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->bs11.envabtse))
|
||||
return NULL;
|
||||
mo = &bts->bs11.envabtse[obj_inst->trx_nr].mo;
|
||||
break;
|
||||
case NM_OC_GPRS_NSE:
|
||||
mo = &bts->gprs.nse.mo;
|
||||
break;
|
||||
case NM_OC_GPRS_CELL:
|
||||
mo = &bts->gprs.cell.mo;
|
||||
break;
|
||||
case NM_OC_GPRS_NSVC:
|
||||
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))
|
||||
return NULL;
|
||||
mo = &bts->gprs.nsvc[obj_inst->trx_nr].mo;
|
||||
break;
|
||||
}
|
||||
return mo;
|
||||
}
|
||||
|
||||
/* obtain the gsm_nm_state data structure for a given object instance */
|
||||
struct gsm_nm_state *
|
||||
gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class,
|
||||
const struct abis_om_obj_inst *obj_inst)
|
||||
{
|
||||
struct gsm_abis_mo *mo;
|
||||
|
||||
mo = gsm_objclass2mo(bts, obj_class, obj_inst);
|
||||
if (!mo)
|
||||
return NULL;
|
||||
|
||||
return &mo->nm_state;
|
||||
}
|
||||
|
||||
/* obtain the in-memory data structure of a given object instance */
|
||||
void *
|
||||
gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class,
|
||||
const struct abis_om_obj_inst *obj_inst)
|
||||
{
|
||||
struct gsm_bts_trx *trx;
|
||||
void *obj = NULL;
|
||||
|
||||
switch (obj_class) {
|
||||
case NM_OC_BTS:
|
||||
obj = bts;
|
||||
break;
|
||||
case NM_OC_RADIO_CARRIER:
|
||||
if (obj_inst->trx_nr >= bts->num_trx) {
|
||||
return NULL;
|
||||
}
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
obj = trx;
|
||||
break;
|
||||
case NM_OC_BASEB_TRANSC:
|
||||
if (obj_inst->trx_nr >= bts->num_trx) {
|
||||
return NULL;
|
||||
}
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
obj = &trx->bb_transc;
|
||||
break;
|
||||
case NM_OC_CHANNEL:
|
||||
if (obj_inst->trx_nr >= bts->num_trx) {
|
||||
return NULL;
|
||||
}
|
||||
trx = gsm_bts_trx_num(bts, obj_inst->trx_nr);
|
||||
if (obj_inst->ts_nr >= TRX_NR_TS)
|
||||
return NULL;
|
||||
obj = &trx->ts[obj_inst->ts_nr];
|
||||
break;
|
||||
case NM_OC_SITE_MANAGER:
|
||||
obj = &bts->site_mgr;
|
||||
break;
|
||||
case NM_OC_GPRS_NSE:
|
||||
obj = &bts->gprs.nse;
|
||||
break;
|
||||
case NM_OC_GPRS_CELL:
|
||||
obj = &bts->gprs.cell;
|
||||
break;
|
||||
case NM_OC_GPRS_NSVC:
|
||||
if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))
|
||||
return NULL;
|
||||
obj = &bts->gprs.nsvc[obj_inst->trx_nr];
|
||||
break;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
/* See Table 10.5.25 of GSM04.08 */
|
||||
uint8_t gsm_pchan2chan_nr(enum gsm_phys_chan_config pchan,
|
||||
uint8_t ts_nr, uint8_t lchan_nr)
|
||||
{
|
||||
uint8_t cbits, chan_nr;
|
||||
|
||||
switch (pchan) {
|
||||
case GSM_PCHAN_TCH_F:
|
||||
case GSM_PCHAN_TCH_F_PDCH:
|
||||
OSMO_ASSERT(lchan_nr == 0);
|
||||
cbits = 0x01;
|
||||
break;
|
||||
case GSM_PCHAN_PDCH:
|
||||
OSMO_ASSERT(lchan_nr == 0);
|
||||
cbits = RSL_CHAN_OSMO_PDCH >> 3;
|
||||
break;
|
||||
case GSM_PCHAN_TCH_H:
|
||||
OSMO_ASSERT(lchan_nr < 2);
|
||||
cbits = 0x02;
|
||||
cbits += lchan_nr;
|
||||
break;
|
||||
case GSM_PCHAN_CCCH_SDCCH4:
|
||||
case GSM_PCHAN_CCCH_SDCCH4_CBCH:
|
||||
/*
|
||||
* As a special hack for BCCH, lchan_nr == 4 may be passed
|
||||
* here. This should never be sent in an RSL message.
|
||||
* See osmo-bts-xxx/oml.c:opstart_compl().
|
||||
*/
|
||||
if (lchan_nr == CCCH_LCHAN)
|
||||
chan_nr = 0;
|
||||
else
|
||||
OSMO_ASSERT(lchan_nr < 4);
|
||||
cbits = 0x04;
|
||||
cbits += lchan_nr;
|
||||
break;
|
||||
case GSM_PCHAN_SDCCH8_SACCH8C:
|
||||
case GSM_PCHAN_SDCCH8_SACCH8C_CBCH:
|
||||
OSMO_ASSERT(lchan_nr < 8);
|
||||
cbits = 0x08;
|
||||
cbits += lchan_nr;
|
||||
break;
|
||||
default:
|
||||
case GSM_PCHAN_CCCH:
|
||||
#ifdef ROLE_BSC
|
||||
OSMO_ASSERT(lchan_nr == 0);
|
||||
#else
|
||||
/*
|
||||
* FIXME: On octphy and litecell, we hit above assertion (see
|
||||
* Max's comment at https://gerrit.osmocom.org/589 ); disabled
|
||||
* for BTS until this is clarified; remove the #ifdef when it
|
||||
* is fixed.
|
||||
*/
|
||||
#warning "fix caller that passes lchan_nr != 0"
|
||||
#endif
|
||||
cbits = 0x10;
|
||||
break;
|
||||
}
|
||||
|
||||
chan_nr = (cbits << 3) | (ts_nr & 0x7);
|
||||
|
||||
return chan_nr;
|
||||
}
|
||||
|
||||
uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan)
|
||||
{
|
||||
enum gsm_phys_chan_config pchan = lchan->ts->pchan;
|
||||
if (pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH)
|
||||
return gsm_lchan_as_pchan2chan_nr(lchan,
|
||||
lchan->ts->dyn.pchan_is);
|
||||
return gsm_pchan2chan_nr(lchan->ts->pchan, lchan->ts->nr, lchan->nr);
|
||||
}
|
||||
|
||||
uint8_t gsm_lchan_as_pchan2chan_nr(const struct gsm_lchan *lchan,
|
||||
enum gsm_phys_chan_config as_pchan)
|
||||
{
|
||||
if (lchan->ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH
|
||||
&& as_pchan == GSM_PCHAN_PDCH)
|
||||
return RSL_CHAN_OSMO_PDCH | (lchan->ts->nr & ~RSL_CHAN_NR_MASK);
|
||||
return gsm_pchan2chan_nr(as_pchan, lchan->ts->nr, lchan->nr);
|
||||
}
|
||||
|
||||
/* return the gsm_lchan for the CBCH (if it exists at all) */
|
||||
struct gsm_lchan *gsm_bts_get_cbch(struct gsm_bts *bts)
|
||||
{
|
||||
struct gsm_lchan *lchan = NULL;
|
||||
struct gsm_bts_trx *trx = bts->c0;
|
||||
|
||||
if (trx->ts[0].pchan == GSM_PCHAN_CCCH_SDCCH4_CBCH)
|
||||
lchan = &trx->ts[0].lchan[2];
|
||||
else {
|
||||
int i;
|
||||
for (i = 0; i < 8; i++) {
|
||||
if (trx->ts[i].pchan == GSM_PCHAN_SDCCH8_SACCH8C_CBCH) {
|
||||
lchan = &trx->ts[i].lchan[2];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return lchan;
|
||||
}
|
||||
|
||||
/* determine logical channel based on TRX and channel number IE */
|
||||
struct gsm_lchan *rsl_lchan_lookup(struct gsm_bts_trx *trx, uint8_t chan_nr,
|
||||
int *rc)
|
||||
{
|
||||
uint8_t ts_nr = chan_nr & 0x07;
|
||||
uint8_t cbits = chan_nr >> 3;
|
||||
uint8_t lch_idx;
|
||||
struct gsm_bts_trx_ts *ts = &trx->ts[ts_nr];
|
||||
bool ok = true;
|
||||
|
||||
if (rc)
|
||||
*rc = -EINVAL;
|
||||
|
||||
if (cbits == 0x01) {
|
||||
lch_idx = 0; /* TCH/F */
|
||||
if (ts->pchan != GSM_PCHAN_TCH_F &&
|
||||
ts->pchan != GSM_PCHAN_PDCH &&
|
||||
ts->pchan != GSM_PCHAN_TCH_F_PDCH
|
||||
&& !(ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH
|
||||
&& (ts->dyn.pchan_is == GSM_PCHAN_TCH_F
|
||||
|| ts->dyn.pchan_want == GSM_PCHAN_TCH_F)))
|
||||
ok = false;
|
||||
} else if ((cbits & 0x1e) == 0x02) {
|
||||
lch_idx = cbits & 0x1; /* TCH/H */
|
||||
if (ts->pchan != GSM_PCHAN_TCH_H
|
||||
&& !(ts->pchan == GSM_PCHAN_TCH_F_TCH_H_PDCH
|
||||
&& (ts->dyn.pchan_is == GSM_PCHAN_TCH_H
|
||||
|| ts->dyn.pchan_want == GSM_PCHAN_TCH_H)))
|
||||
ok = false;
|
||||
} else if ((cbits & 0x1c) == 0x04) {
|
||||
lch_idx = cbits & 0x3; /* SDCCH/4 */
|
||||
if (ts->pchan != GSM_PCHAN_CCCH_SDCCH4 &&
|
||||
ts->pchan != GSM_PCHAN_CCCH_SDCCH4_CBCH)
|
||||
ok = false;
|
||||
} else if ((cbits & 0x18) == 0x08) {
|
||||
lch_idx = cbits & 0x7; /* SDCCH/8 */
|
||||
if (ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C &&
|
||||
ts->pchan != GSM_PCHAN_SDCCH8_SACCH8C_CBCH)
|
||||
ok = false;
|
||||
} else if (cbits == 0x10 || cbits == 0x11 || cbits == 0x12) {
|
||||
lch_idx = 0;
|
||||
if (ts->pchan != GSM_PCHAN_CCCH &&
|
||||
ts->pchan != GSM_PCHAN_CCCH_SDCCH4 &&
|
||||
ts->pchan != GSM_PCHAN_CCCH_SDCCH4_CBCH)
|
||||
ok = false;
|
||||
/* FIXME: we should not return first sdcch4 !!! */
|
||||
} else if ((chan_nr & RSL_CHAN_NR_MASK) == RSL_CHAN_OSMO_PDCH) {
|
||||
lch_idx = 0;
|
||||
if (ts->pchan != GSM_PCHAN_TCH_F_TCH_H_PDCH)
|
||||
ok = false;
|
||||
} else
|
||||
return NULL;
|
||||
|
||||
if (rc && ok)
|
||||
*rc = 0;
|
||||
|
||||
return &ts->lchan[lch_idx];
|
||||
}
|
||||
|
||||
static const uint8_t subslots_per_pchan[] = {
|
||||
[GSM_PCHAN_NONE] = 0,
|
||||
[GSM_PCHAN_CCCH] = 0,
|
||||
[GSM_PCHAN_PDCH] = 0,
|
||||
[GSM_PCHAN_CCCH_SDCCH4] = 4,
|
||||
[GSM_PCHAN_TCH_F] = 1,
|
||||
[GSM_PCHAN_TCH_H] = 2,
|
||||
[GSM_PCHAN_SDCCH8_SACCH8C] = 8,
|
||||
[GSM_PCHAN_CCCH_SDCCH4_CBCH] = 4,
|
||||
[GSM_PCHAN_SDCCH8_SACCH8C_CBCH] = 8,
|
||||
/*
|
||||
* GSM_PCHAN_TCH_F_PDCH and GSM_PCHAN_TCH_F_TCH_H_PDCH should not be
|
||||
* part of this, those TS are handled according to their dynamic state.
|
||||
*/
|
||||
};
|
||||
|
||||
/*! Return the actual pchan type, also heeding dynamic TS. */
|
||||
enum gsm_phys_chan_config ts_pchan(struct gsm_bts_trx_ts *ts)
|
||||
{
|
||||
switch (ts->pchan) {
|
||||
case GSM_PCHAN_TCH_F_TCH_H_PDCH:
|
||||
return ts->dyn.pchan_is;
|
||||
case GSM_PCHAN_TCH_F_PDCH:
|
||||
if (ts->flags & TS_F_PDCH_ACTIVE)
|
||||
return GSM_PCHAN_PDCH;
|
||||
else
|
||||
return GSM_PCHAN_TCH_F;
|
||||
default:
|
||||
return ts->pchan;
|
||||
}
|
||||
}
|
||||
|
||||
/*! According to ts->pchan and possibly ts->dyn_pchan, return the number of
|
||||
* logical channels available in the timeslot. */
|
||||
uint8_t ts_subslots(struct gsm_bts_trx_ts *ts)
|
||||
{
|
||||
return subslots_per_pchan[ts_pchan(ts)];
|
||||
}
|
||||
|
||||
static bool pchan_is_tch(enum gsm_phys_chan_config pchan)
|
||||
{
|
||||
switch (pchan) {
|
||||
case GSM_PCHAN_TCH_F:
|
||||
case GSM_PCHAN_TCH_H:
|
||||
return true;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bool ts_is_tch(struct gsm_bts_trx_ts *ts)
|
||||
{
|
||||
return pchan_is_tch(ts_pchan(ts));
|
||||
}
|
|
@ -21,35 +21,18 @@
|
|||
#include <osmocom/core/msgb.h>
|
||||
|
||||
extern void *tall_bsc_ctx;
|
||||
extern void *tall_fle_ctx;
|
||||
extern void *tall_locop_ctx;
|
||||
extern void *tall_authciphop_ctx;
|
||||
extern void *tall_gsms_ctx;
|
||||
extern void *tall_subscr_ctx;
|
||||
extern void *tall_sub_req_ctx;
|
||||
extern void *tall_call_ctx;
|
||||
extern void *tall_paging_ctx;
|
||||
extern void *tall_sigh_ctx;
|
||||
extern void *tall_tqe_ctx;
|
||||
extern void *tall_trans_ctx;
|
||||
extern void *tall_map_ctx;
|
||||
extern void *tall_upq_ctx;
|
||||
extern void *tall_ctr_ctx;
|
||||
|
||||
void talloc_ctx_init(void *ctx_root)
|
||||
{
|
||||
msgb_talloc_ctx_init(ctx_root, 0);
|
||||
tall_fle_ctx = talloc_named_const(ctx_root, 0, "bs11_file_list_entry");
|
||||
tall_locop_ctx = talloc_named_const(ctx_root, 0, "loc_updating_oper");
|
||||
tall_authciphop_ctx = talloc_named_const(ctx_root, 0, "auth_ciph_oper");
|
||||
tall_gsms_ctx = talloc_named_const(ctx_root, 0, "sms");
|
||||
tall_subscr_ctx = talloc_named_const(ctx_root, 0, "subscriber");
|
||||
tall_call_ctx = talloc_named_const(ctx_root, 0, "gsm_call");
|
||||
tall_paging_ctx = talloc_named_const(ctx_root, 0, "paging_request");
|
||||
tall_sigh_ctx = talloc_named_const(ctx_root, 0, "signal_handler");
|
||||
tall_tqe_ctx = talloc_named_const(ctx_root, 0, "subch_txq_entry");
|
||||
tall_trans_ctx = talloc_named_const(ctx_root, 0, "transaction");
|
||||
tall_map_ctx = talloc_named_const(ctx_root, 0, "trau_map_entry");
|
||||
tall_upq_ctx = talloc_named_const(ctx_root, 0, "trau_upq_entry");
|
||||
tall_ctr_ctx = talloc_named_const(ctx_root, 0, "counter");
|
||||
}
|
||||
|
|
|
@ -43,18 +43,12 @@
|
|||
#include <osmocom/msc/gsm_04_08.h>
|
||||
#include <osmocom/msc/gsm_04_80.h>
|
||||
#include <osmocom/msc/gsm_04_14.h>
|
||||
#include <osmocom/msc/abis_rsl.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/msc/signal.h>
|
||||
#include <osmocom/abis/trau_frame.h>
|
||||
#include <osmocom/msc/trau_mux.h>
|
||||
#include <osmocom/msc/rtp_proxy.h>
|
||||
#include <osmocom/msc/transaction.h>
|
||||
#include <osmocom/msc/ussd.h>
|
||||
#include <osmocom/msc/silent_call.h>
|
||||
#include <osmocom/msc/bsc_api.h>
|
||||
#include <osmocom/msc/osmo_msc.h>
|
||||
#include <osmocom/msc/handover.h>
|
||||
#include <osmocom/msc/mncc_int.h>
|
||||
#include <osmocom/abis/e1_input.h>
|
||||
#include <osmocom/core/bitvec.h>
|
||||
|
|
|
@ -48,12 +48,10 @@
|
|||
#include <osmocom/msc/db.h>
|
||||
#include <osmocom/msc/gsm_subscriber.h>
|
||||
#include <osmocom/msc/gsm_04_08.h>
|
||||
#include <osmocom/msc/abis_rsl.h>
|
||||
#include <osmocom/msc/signal.h>
|
||||
#include <osmocom/msc/db.h>
|
||||
#include <osmocom/msc/transaction.h>
|
||||
#include <osmocom/msc/bsc_rll.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/msc/msc_ifaces.h>
|
||||
#include <osmocom/msc/osmo_msc.h>
|
||||
#include <osmocom/msc/vlr.h>
|
||||
|
@ -352,7 +350,7 @@ static int sms_route_mt_sms(struct gsm_subscriber_connection *conn,
|
|||
vlr_subscr_name(conn->vsub), rc);
|
||||
rc = GSM411_RP_CAUSE_MO_TEMP_FAIL;
|
||||
/* rc will be logged by gsm411_send_rp_error() */
|
||||
rate_ctr_inc(&conn->bts->network->msc_ctrs->ctr[
|
||||
rate_ctr_inc(&conn->network->msc_ctrs->ctr[
|
||||
MSC_CTR_SMS_DELIVER_UNKNOWN_ERROR]);
|
||||
}
|
||||
return rc;
|
||||
|
@ -380,7 +378,7 @@ try_local:
|
|||
vlr_subscr_name(conn->vsub), rc);
|
||||
rc = GSM411_RP_CAUSE_MO_TEMP_FAIL;
|
||||
/* rc will be logged by gsm411_send_rp_error() */
|
||||
rate_ctr_inc(&conn->bts->network->msc_ctrs->ctr[
|
||||
rate_ctr_inc(&conn->network->msc_ctrs->ctr[
|
||||
MSC_CTR_SMS_DELIVER_UNKNOWN_ERROR]);
|
||||
}
|
||||
#else
|
||||
|
|
|
@ -75,7 +75,6 @@ int gsm0414_tx_close_tch_loop_cmd(struct gsm_subscriber_connection *conn,
|
|||
subch = (loop_mode << 1);
|
||||
msgb_put_u8(msg, subch);
|
||||
|
||||
msg->lchan = conn->lchan;
|
||||
return gsm0414_conn_sendmsg(conn, msg);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
#include <osmocom/msc/debug.h>
|
||||
#include <osmocom/msc/signal.h>
|
||||
#include <osmocom/msc/db.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/msc/vlr.h>
|
||||
#include <osmocom/msc/osmo_msc.h>
|
||||
#include <osmocom/msc/msc_ifaces.h>
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <osmocom/msc/mncc.h>
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
#include <osmocom/msc/transaction.h>
|
||||
#include <osmocom/msc/rtp_proxy.h>
|
||||
|
||||
|
||||
static const struct value_string mncc_names[] = {
|
||||
|
|
|
@ -34,7 +34,6 @@
|
|||
#include <osmocom/core/talloc.h>
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
#include <osmocom/msc/transaction.h>
|
||||
#include <osmocom/msc/rtp_proxy.h>
|
||||
|
||||
void *tall_call_ctx;
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@
|
|||
#include <osmocom/msc/gsm_04_08.h>
|
||||
#include <osmocom/msc/signal.h>
|
||||
#include <osmocom/msc/gsm_subscriber.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
|
||||
/* RRLP msPositionReq, nsBased,
|
||||
* Accuracy=60, Method=gps, ResponseTime=2, oneSet */
|
||||
|
|
|
@ -29,8 +29,6 @@
|
|||
#include <osmocom/msc/debug.h>
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
#include <osmocom/msc/gsm_subscriber.h>
|
||||
#include <osmocom/msc/abis_rsl.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/msc/osmo_msc.h>
|
||||
|
||||
/* paging of the requested subscriber has completed */
|
||||
|
|
|
@ -44,7 +44,6 @@
|
|||
#include <osmocom/msc/signal.h>
|
||||
#include <osmocom/msc/transaction.h>
|
||||
#include <osmocom/msc/gsm_subscriber.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/msc/vlr.h>
|
||||
|
||||
#include "smpp_smsc.h"
|
||||
|
|
|
@ -31,7 +31,6 @@
|
|||
#include <limits.h>
|
||||
|
||||
#include <osmocom/msc/sms_queue.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/msc/db.h>
|
||||
#include <osmocom/msc/debug.h>
|
||||
#include <osmocom/msc/gsm_data.h>
|
||||
|
|
|
@ -35,8 +35,6 @@
|
|||
#include <osmocom/msc/gsm_subscriber.h>
|
||||
#include <osmocom/msc/silent_call.h>
|
||||
#include <osmocom/msc/gsm_04_11.h>
|
||||
#include <osmocom/abis/e1_input.h>
|
||||
#include <osmocom/msc/abis_nm.h>
|
||||
#include <osmocom/gsm/gsm_utils.h>
|
||||
#include <osmocom/core/utils.h>
|
||||
#include <osmocom/msc/db.h>
|
||||
|
@ -46,10 +44,9 @@
|
|||
#include <osmocom/msc/vty.h>
|
||||
#include <osmocom/msc/gsm_04_80.h>
|
||||
#include <osmocom/msc/gsm_04_14.h>
|
||||
#include <osmocom/msc/chan_alloc.h>
|
||||
#include <osmocom/gsm/protocol/gsm_08_58.h>
|
||||
#include <osmocom/msc/sms_queue.h>
|
||||
#include <osmocom/msc/mncc_int.h>
|
||||
#include <osmocom/msc/handover.h>
|
||||
#include <osmocom/msc/vlr.h>
|
||||
|
||||
#include <osmocom/vty/logging.h>
|
||||
|
|
|
@ -54,7 +54,6 @@
|
|||
#include <osmocom/vty/logging.h>
|
||||
#include <osmocom/msc/vty.h>
|
||||
#include <osmocom/msc/mncc.h>
|
||||
#include <osmocom/msc/handover_decision.h>
|
||||
#include <osmocom/msc/rrlp.h>
|
||||
#include <osmocom/ctrl/control_if.h>
|
||||
#include <osmocom/ctrl/control_vty.h>
|
||||
|
@ -89,10 +88,7 @@ void *tall_msc_ctx = NULL;
|
|||
|
||||
/* satisfy deps from libbsc legacy.
|
||||
TODO double check these */
|
||||
void *tall_fle_ctx = NULL;
|
||||
void *tall_paging_ctx = NULL;
|
||||
void *tall_map_ctx = NULL;
|
||||
void *tall_upq_ctx = NULL;
|
||||
/* end deps from libbsc legacy. */
|
||||
|
||||
static struct {
|
||||
|
|
|
@ -32,7 +32,6 @@ void test_early_stage()
|
|||
|
||||
btw("freshly allocated conn");
|
||||
g_conn = msc_subscr_con_allocate(net);
|
||||
g_conn->bts = the_bts;
|
||||
EXPECT_ACCEPTED(false);
|
||||
|
||||
btw("conn_fsm present, in state NEW");
|
||||
|
|
|
@ -49,8 +49,6 @@ bool _log_lines = false;
|
|||
|
||||
struct gsm_network *net = NULL;
|
||||
|
||||
struct gsm_bts *the_bts;
|
||||
|
||||
const char *gsup_tx_expected = NULL;
|
||||
bool gsup_tx_confirmed;
|
||||
|
||||
|
@ -160,7 +158,6 @@ struct gsm_subscriber_connection *conn_new(void)
|
|||
{
|
||||
struct gsm_subscriber_connection *conn;
|
||||
conn = msc_subscr_con_allocate(net);
|
||||
conn->bts = the_bts;
|
||||
conn->via_ran = rx_from_ran;
|
||||
conn->lac = 23;
|
||||
if (conn->via_ran == RAN_UTRAN_IU) {
|
||||
|
@ -867,8 +864,6 @@ int main(int argc, char **argv)
|
|||
|
||||
printf("Done\n");
|
||||
|
||||
talloc_free(the_bts);
|
||||
|
||||
check_talloc(msgb_ctx, tall_bsc_ctx, 8);
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue