From 5a45b156d4165fed159a290c46676d1383ffcc80 Mon Sep 17 00:00:00 2001 From: Jonathan Santos Date: Wed, 17 Aug 2011 15:33:57 -0400 Subject: New upstream version 0.9.14 --- include/Makefile.in | 4 +- include/openbsc/Makefile.am | 3 +- include/openbsc/Makefile.in | 7 +- include/openbsc/abis_nm.h | 138 ++++---- include/openbsc/abis_om2000.h | 24 +- include/openbsc/abis_rsl.h | 55 ++- include/openbsc/bsc_msc.h | 26 +- include/openbsc/bsc_nat.h | 123 +++++-- include/openbsc/bsc_nat_sccp.h | 5 +- include/openbsc/bsc_rll.h | 6 +- include/openbsc/bss.h | 17 + include/openbsc/crc24.h | 4 +- include/openbsc/db.h | 14 +- include/openbsc/debug.h | 4 +- include/openbsc/e1_input.h | 39 +-- include/openbsc/gb_proxy.h | 5 +- include/openbsc/gprs_bssgp.h | 2 +- include/openbsc/gprs_gmm.h | 2 +- include/openbsc/gprs_llc.h | 4 +- include/openbsc/gprs_ns.h | 14 +- include/openbsc/gprs_sgsn.h | 6 +- include/openbsc/gsm_04_08.h | 30 +- include/openbsc/gsm_04_08_gprs.h | 2 +- include/openbsc/gsm_04_11.h | 26 +- include/openbsc/gsm_04_80.h | 6 +- include/openbsc/gsm_data.h | 640 ++++------------------------------- include/openbsc/gsm_data_shared.h | 590 ++++++++++++++++++++++++++++++++ include/openbsc/gsm_subscriber.h | 19 +- include/openbsc/ipaccess.h | 104 ++---- include/openbsc/meas_rep.h | 22 +- include/openbsc/mgcp.h | 6 +- include/openbsc/mgcp_internal.h | 6 +- include/openbsc/mncc.h | 4 +- include/openbsc/osmo_bsc.h | 4 +- include/openbsc/osmo_bsc_rf.h | 14 +- include/openbsc/osmo_msc_data.h | 18 +- include/openbsc/paging.h | 14 +- include/openbsc/rest_octets.h | 85 +++-- include/openbsc/rtp_proxy.h | 22 +- include/openbsc/sgsn.h | 11 +- include/openbsc/signal.h | 22 +- include/openbsc/socket.h | 8 +- include/openbsc/subchan_demux.h | 20 +- include/openbsc/system_information.h | 37 +- include/openbsc/transaction.h | 25 +- include/openbsc/trau_frame.h | 18 +- include/openbsc/trau_mux.h | 10 +- include/openbsc/ussd.h | 2 +- include/openbsc/vty.h | 4 +- 49 files changed, 1199 insertions(+), 1072 deletions(-) create mode 100644 include/openbsc/bss.h create mode 100644 include/openbsc/gsm_data_shared.h (limited to 'include') diff --git a/include/Makefile.in b/include/Makefile.in index ecbeebe28..1d7fb81cb 100644 --- a/include/Makefile.in +++ b/include/Makefile.in @@ -36,7 +36,7 @@ subdir = include DIST_COMMON = $(noinst_HEADERS) $(srcdir)/Makefile.am \ $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -126,6 +126,8 @@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBOSMOCORE_CFLAGS = @LIBOSMOCORE_CFLAGS@ LIBOSMOCORE_LIBS = @LIBOSMOCORE_LIBS@ +LIBOSMOGSM_CFLAGS = @LIBOSMOGSM_CFLAGS@ +LIBOSMOGSM_LIBS = @LIBOSMOGSM_LIBS@ LIBOSMOSCCP_CFLAGS = @LIBOSMOSCCP_CFLAGS@ LIBOSMOSCCP_LIBS = @LIBOSMOSCCP_LIBS@ LIBOSMOVTY_CFLAGS = @LIBOSMOVTY_CFLAGS@ diff --git a/include/openbsc/Makefile.am b/include/openbsc/Makefile.am index 325d66d93..9ec92c1d7 100644 --- a/include/openbsc/Makefile.am +++ b/include/openbsc/Makefile.am @@ -11,7 +11,8 @@ noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \ gb_proxy.h gprs_sgsn.h gsm_04_08_gprs.h sgsn.h \ gprs_ns_frgre.h auth.h osmo_msc.h bsc_msc.h bsc_nat.h \ osmo_bsc_rf.h osmo_bsc.h network_listen.h bsc_nat_sccp.h \ - osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h + osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \ + bss.h gsm_data_shared.h openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h openbscdir = $(includedir)/openbsc diff --git a/include/openbsc/Makefile.in b/include/openbsc/Makefile.in index faca5a31e..8d61f4a70 100644 --- a/include/openbsc/Makefile.in +++ b/include/openbsc/Makefile.in @@ -36,7 +36,7 @@ subdir = include/openbsc DIST_COMMON = $(noinst_HEADERS) $(openbsc_HEADERS) \ $(srcdir)/Makefile.am $(srcdir)/Makefile.in ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/configure.in +am__aclocal_m4_deps = $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(install_sh) -d @@ -110,6 +110,8 @@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBOSMOCORE_CFLAGS = @LIBOSMOCORE_CFLAGS@ LIBOSMOCORE_LIBS = @LIBOSMOCORE_LIBS@ +LIBOSMOGSM_CFLAGS = @LIBOSMOGSM_CFLAGS@ +LIBOSMOGSM_LIBS = @LIBOSMOGSM_LIBS@ LIBOSMOSCCP_CFLAGS = @LIBOSMOSCCP_CFLAGS@ LIBOSMOSCCP_LIBS = @LIBOSMOSCCP_LIBS@ LIBOSMOVTY_CFLAGS = @LIBOSMOVTY_CFLAGS@ @@ -191,7 +193,8 @@ noinst_HEADERS = abis_nm.h abis_rsl.h db.h gsm_04_08.h gsm_data.h \ gb_proxy.h gprs_sgsn.h gsm_04_08_gprs.h sgsn.h \ gprs_ns_frgre.h auth.h osmo_msc.h bsc_msc.h bsc_nat.h \ osmo_bsc_rf.h osmo_bsc.h network_listen.h bsc_nat_sccp.h \ - osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h + osmo_msc_data.h osmo_bsc_grace.h sms_queue.h abis_om2000.h \ + bss.h gsm_data_shared.h openbsc_HEADERS = gsm_04_08.h meas_rep.h bsc_api.h openbscdir = $(includedir)/openbsc diff --git a/include/openbsc/abis_nm.h b/include/openbsc/abis_nm.h index c93db582c..ae4f62549 100644 --- a/include/openbsc/abis_nm.h +++ b/include/openbsc/abis_nm.h @@ -22,15 +22,15 @@ #ifndef _NM_H #define _NM_H -#include -#include -#include +#include +#include +#include struct cell_global_id { - u_int16_t mcc; - u_int16_t mnc; - u_int16_t lac; - u_int16_t ci; + uint16_t mcc; + uint16_t mnc; + uint16_t lac; + uint16_t ci; }; /* The BCCH info from an ip.access test, in host byte order @@ -38,26 +38,22 @@ struct cell_global_id { struct ipac_bcch_info { struct llist_head list; - u_int16_t info_type; - u_int8_t freq_qual; - u_int16_t arfcn; - u_int8_t rx_lev; - u_int8_t rx_qual; + uint16_t info_type; + uint8_t freq_qual; + uint16_t arfcn; + uint8_t rx_lev; + uint8_t rx_qual; int16_t freq_err; - u_int16_t frame_offset; - u_int32_t frame_nr_offset; - u_int8_t bsic; + uint16_t frame_offset; + uint32_t frame_nr_offset; + uint8_t bsic; struct cell_global_id cgi; - u_int8_t ba_list_si2[16]; - u_int8_t ba_list_si2bis[16]; - u_int8_t ba_list_si2ter[16]; - u_int8_t ca_list_si1[16]; + uint8_t ba_list_si2[16]; + uint8_t ba_list_si2bis[16]; + uint8_t ba_list_si2ter[16]; + uint8_t ca_list_si1[16]; }; -extern const struct value_string abis_nm_adm_state_names[]; -extern const struct value_string abis_nm_obj_class_names[]; -extern const struct tlv_definition nm_att_tlvdef; - /* PUBLIC */ struct msgb; @@ -72,60 +68,58 @@ struct abis_nm_cfg { extern int abis_nm_rcvmsg(struct msgb *msg); -int abis_nm_tlv_parse(struct tlv_parsed *tp, struct gsm_bts *bts, const u_int8_t *buf, int len); +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, u_int8_t obj_class, u_int8_t i0, u_int8_t i1, u_int8_t i2); -int abis_nm_chg_adm_state(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i0, - u_int8_t i1, u_int8_t i2, enum abis_nm_adm_state adm_state); -int abis_nm_establish_tei(struct gsm_bts *bts, u_int8_t trx_nr, - u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot, - u_int8_t tei); +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, - u_int8_t e1_port, u_int8_t e1_timeslot, u_int8_t e1_subslot); + uint8_t e1_port, uint8_t e1_timeslot, uint8_t e1_subslot); int abis_nm_conn_terr_traf(struct gsm_bts_trx_ts *ts, - u_int8_t e1_port, u_int8_t e1_timeslot, - u_int8_t e1_subslot); -int abis_nm_set_bts_attr(struct gsm_bts *bts, u_int8_t *attr, int attr_len); -int abis_nm_set_radio_attr(struct gsm_bts_trx *trx, u_int8_t *attr, int attr_len); -int abis_nm_set_channel_attr(struct gsm_bts_trx_ts *ts, u_int8_t chan_comb); -int abis_nm_sw_act_req_ack(struct gsm_bts *bts, u_int8_t obj_class, u_int8_t i1, - u_int8_t i2, u_int8_t i3, int nack, u_int8_t *attr, int att_len); -int abis_nm_raw_msg(struct gsm_bts *bts, int len, u_int8_t *msg); + uint8_t e1_port, uint8_t e1_timeslot, + uint8_t e1_subslot); +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, - u_int8_t win_size, int forced, + 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, u_int8_t e1_port0, u_int8_t ts0, - u_int8_t e1_port1, u_int8_t ts1); - -int abis_nm_perform_test(struct gsm_bts *bts, u_int8_t obj_class, - u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr, - u_int8_t test_nr, u_int8_t auton_report, struct msgb *msg); +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_chcomb4pchan(enum gsm_phys_chan_config pchan); +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, - u_int8_t idx, u_int8_t attr_len, const u_int8_t *attr); -int abis_nm_bs11_create_envaBTSE(struct gsm_bts *bts, u_int8_t idx); -int abis_nm_bs11_create_bport(struct gsm_bts *bts, u_int8_t idx); + 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, u_int8_t idx); -int abis_nm_bs11_delete_bport(struct gsm_bts *bts, u_int8_t idx); -int abis_nm_bs11_conn_oml_tei(struct gsm_bts *bts, u_int8_t e1_port, - u_int8_t e1_timeslot, u_int8_t e1_subslot, u_int8_t tei); + 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, u_int8_t level); +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, u_int8_t level, const char *name, int on); +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); @@ -135,33 +129,31 @@ 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, - u_int8_t win_size, int forced, gsm_cbfn *cbfn); + 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, u_int8_t bport); -int abis_nm_bs11_set_bport_line_cfg(struct gsm_bts *bts, u_int8_t bport, enum abis_bs11_line_cfg line_cfg); +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, u_int8_t msg_type, - u_int8_t obj_class, u_int8_t bts_nr, - u_int8_t trx_nr, u_int8_t ts_nr, - u_int8_t *attr, int attr_len); -int abis_nm_ipaccess_set_nvattr(struct gsm_bts_trx *trx, u_int8_t *attr, +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, u_int8_t obj_class, - u_int8_t bts_nr, u_int8_t trx_nr, u_int8_t ts_nr, - u_int8_t *attr, u_int8_t attr_len); +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, - u_int32_t ip, u_int16_t port, u_int8_t stream); -void abis_nm_ipaccess_cgi(u_int8_t *buf, struct gsm_bts *bts); -int ipac_parse_bcch_info(struct ipac_bcch_info *binf, u_int8_t *buf); -const char *ipacc_testres_name(u_int8_t res); + 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 */ -const char *nm_opstate_name(u_int8_t os); -const char *nm_avail_name(u_int8_t avail); int nm_is_running(struct gsm_nm_state *s); int abis_nm_vty_init(void); diff --git a/include/openbsc/abis_om2000.h b/include/openbsc/abis_om2000.h index e4f19cf9c..2ff72705b 100644 --- a/include/openbsc/abis_om2000.h +++ b/include/openbsc/abis_om2000.h @@ -34,6 +34,13 @@ enum abis_om2k_mo_cls { 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, +}; + struct abis_om2k_mo { uint8_t class; uint8_t bts; @@ -41,12 +48,26 @@ struct abis_om2k_mo { uint8_t inst; } __attribute__ ((packed)); +/* 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; +}; + +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); @@ -63,8 +84,7 @@ 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_is_conf_req(struct gsm_bts *bts, struct om2k_is_conn_grp *cg, - unsigned int num_cg); +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); diff --git a/include/openbsc/abis_rsl.h b/include/openbsc/abis_rsl.h index 295b01fd3..3b4df90c0 100644 --- a/include/openbsc/abis_rsl.h +++ b/include/openbsc/abis_rsl.h @@ -22,9 +22,9 @@ #ifndef _RSL_H #define _RSL_H -#include +#include -#include +#include struct gsm_bts; struct gsm_lchan; @@ -32,61 +32,56 @@ struct gsm_subscriber; struct gsm_bts_trx_ts; -int rsl_bcch_info(struct gsm_bts_trx *trx, u_int8_t type, - const u_int8_t *data, int len); -int rsl_sacch_filling(struct gsm_bts_trx *trx, u_int8_t type, - const u_int8_t *data, int len); -int rsl_chan_activate(struct gsm_bts_trx *trx, u_int8_t chan_nr, - u_int8_t act_type, +int rsl_bcch_info(struct gsm_bts_trx *trx, uint8_t 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, - u_int8_t bs_power, u_int8_t ms_power, - u_int8_t ta); -int rsl_chan_activate_lchan(struct gsm_lchan *lchan, u_int8_t act_type, - u_int8_t ta, u_int8_t ho_ref); + 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 ta, 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, u_int8_t paging_group, u_int8_t len, - u_int8_t *ms_ident, u_int8_t chan_needed); -int rsl_imm_assign_cmd(struct gsm_bts *bts, u_int8_t len, u_int8_t *val); +int rsl_paging_cmd(struct gsm_bts *bts, uint8_t paging_group, uint8_t len, + uint8_t *ms_ident, uint8_t chan_needed); +int rsl_imm_assign_cmd(struct gsm_bts *bts, uint8_t len, uint8_t *val); -int rsl_data_request(struct msgb *msg, u_int8_t link_id); -int rsl_establish_request(struct gsm_lchan *lchan, u_int8_t link_id); -int rsl_relase_request(struct gsm_lchan *lchan, u_int8_t link_id); +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); /* 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, u_int32_t ip, - u_int16_t port, u_int8_t rtp_payload2); +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); -unsigned int get_paging_group(u_int64_t imsi, unsigned int bs_cc_chans, - int n_pag_blocks); -unsigned int n_pag_blocks(int bs_ccch_sdcch_comb, unsigned int bs_ag_blks_res); -u_int64_t str_to_imsi(const char *imsi_str); -u_int8_t lchan2chan_nr(const struct gsm_lchan *lchan); -int rsl_release_request(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t reason); +uint64_t str_to_imsi(const char *imsi_str); +int rsl_release_request(struct gsm_lchan *lchan, uint8_t link_id, uint8_t reason); int rsl_lchan_set_state(struct gsm_lchan *lchan, int); /* to be provided by external code */ int abis_rsl_sendmsg(struct msgb *msg); int rsl_deact_sacch(struct gsm_lchan *lchan); -int rsl_lchan_rll_release(struct gsm_lchan *lchan, u_int8_t link_id); +int rsl_lchan_rll_release(struct gsm_lchan *lchan, uint8_t link_id); /* 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_number_of_paging_subchannels(struct gsm_bts *bts); -int rsl_sacch_info_modify(struct gsm_lchan *lchan, u_int8_t type, - const u_int8_t *data, int len); +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); diff --git a/include/openbsc/bsc_msc.h b/include/openbsc/bsc_msc.h index d06ae0511..9543002a7 100644 --- a/include/openbsc/bsc_msc.h +++ b/include/openbsc/bsc_msc.h @@ -22,25 +22,33 @@ #ifndef BSC_MSC_H #define BSC_MSC_H -#include -#include +#include +#include + +struct bsc_msc_dest { + struct llist_head list; + + char *ip; + int port; + int dscp; +}; + struct bsc_msc_connection { - struct write_queue write_queue; + struct osmo_wqueue write_queue; int is_connected; int is_authenticated; int first_contact; - const char *ip; - int port; - int prio; + + struct llist_head *dests; void (*connection_loss) (struct bsc_msc_connection *); void (*connected) (struct bsc_msc_connection *); - struct timer_list reconnect_timer; - struct timer_list timeout_timer; + struct osmo_timer_list reconnect_timer; + struct osmo_timer_list timeout_timer; }; -struct bsc_msc_connection *bsc_msc_create(const char *ip, int port, int prio); +struct bsc_msc_connection *bsc_msc_create(void *ctx, struct llist_head *dest); int bsc_msc_connect(struct bsc_msc_connection *); void bsc_msc_schedule_connect(struct bsc_msc_connection *); diff --git a/include/openbsc/bsc_nat.h b/include/openbsc/bsc_nat.h index f74cae2a8..97fa4fe2e 100644 --- a/include/openbsc/bsc_nat.h +++ b/include/openbsc/bsc_nat.h @@ -1,6 +1,6 @@ /* - * (C) 2010 by Holger Hans Peter Freyther - * (C) 2010 by On-Waves + * (C) 2010-2011 by Holger Hans Peter Freyther + * (C) 2010-2011 by On-Waves * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -23,22 +23,23 @@ #include "mgcp.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include +#include +#include +#include +#include +#include +#include #include #define DIR_BSC 1 #define DIR_MSC 2 +#define PAGIN_GROUP_UNASSIGNED -1 + struct sccp_source_reference; struct sccp_connections; struct bsc_nat_parsed; @@ -55,6 +56,16 @@ enum { NAT_CON_TYPE_OTHER, }; +/* + * Is this terminated to the MSC, to the local machine (release + * handling for IMSI filtering) or to a USSD provider? + */ +enum { + NAT_CON_END_MSC, + NAT_CON_END_LOCAL, + NAT_CON_END_USSD, +}; + /* * Per BSC data structure */ @@ -65,17 +76,17 @@ struct bsc_connection { int authenticated; /* the fd we use to communicate */ - struct write_queue write_queue; + struct osmo_wqueue write_queue; /* the BSS associated */ struct bsc_config *cfg; /* a timeout node */ - struct timer_list id_timeout; + struct osmo_timer_list id_timeout; /* pong timeout */ - struct timer_list ping_timeout; - struct timer_list pong_timeout; + struct osmo_timer_list ping_timeout; + struct osmo_timer_list pong_timeout; /* mgcp related code */ char *_endpoint_status; @@ -125,6 +136,7 @@ struct bsc_config { char *acc_lst_name; int forbid_paging; + int paging_group; /* audio handling */ int max_endpoints; @@ -142,6 +154,14 @@ struct bsc_lac_entry { uint16_t lac; }; +struct bsc_nat_paging_group { + struct llist_head entry; + + /* list of lac entries */ + struct llist_head lists; + int nr; +}; + /** * BSCs point of view of endpoints */ @@ -159,21 +179,21 @@ struct bsc_endpoint { */ struct bsc_nat_statistics { struct { - struct counter *conn; - struct counter *calls; + struct osmo_counter *conn; + struct osmo_counter *calls; } sccp; struct { - struct counter *reconn; - struct counter *auth_fail; + struct osmo_counter *reconn; + struct osmo_counter *auth_fail; } bsc; struct { - struct counter *reconn; + struct osmo_counter *reconn; } msc; struct { - struct counter *reconn; + struct osmo_counter *reconn; } ussd; }; @@ -216,6 +236,9 @@ struct bsc_nat { /* access lists */ struct llist_head access_lists; + /* paging groups */ + struct llist_head paging_groups; + /* known BSC's */ struct llist_head bsc_configs; int num_bsc; @@ -227,8 +250,8 @@ struct bsc_nat { int mgcp_length; /* msc things */ - char *msc_ip; - int msc_port; + struct llist_head dests; + struct bsc_msc_dest *main_dest; struct bsc_msc_connection *msc_con; char *token; @@ -244,20 +267,37 @@ struct bsc_nat { /* number rewriting */ char *num_rewr_name; - struct msg_entries *num_rewr; + struct llist_head num_rewr; + + char *smsc_rewr_name; + struct llist_head smsc_rewr; + char *tpdest_match_name; + struct llist_head tpdest_match; /* USSD messages we want to match */ char *ussd_lst_name; char *ussd_query; + regex_t ussd_query_re; char *ussd_token; char *ussd_local; - struct bsc_fd ussd_listen; + struct osmo_fd ussd_listen; struct bsc_nat_ussd_con *ussd_con; + /* for maintainenance */ + int blocked; + /* statistics */ struct bsc_nat_statistics stats; }; +struct bsc_nat_ussd_con { + struct osmo_wqueue queue; + struct bsc_nat *nat; + int authorized; + + struct osmo_timer_list auth_timeout; +}; + /* create and init the structures */ struct bsc_config *bsc_config_alloc(struct bsc_nat *nat, const char *token); struct bsc_config *bsc_config_num(struct bsc_nat *nat, int num); @@ -285,7 +325,7 @@ struct bsc_nat_parsed *bsc_nat_parse(struct msgb *msg); */ int bsc_nat_filter_ipa(int direction, struct msgb *msg, struct bsc_nat_parsed *parsed); int bsc_nat_vty_init(struct bsc_nat *nat); -struct bsc_connection *bsc_nat_find_bsc(struct bsc_nat *nat, struct msgb *msg, int *_lac); +int bsc_nat_find_paging(struct msgb *msg, const uint8_t **,int *len); /** * Content filtering. @@ -326,12 +366,12 @@ uint32_t bsc_mgcp_extract_ci(const char *resp); int bsc_write(struct bsc_connection *bsc, struct msgb *msg, int id); -int bsc_do_write(struct write_queue *queue, struct msgb *msg, int id); -int bsc_write_msg(struct write_queue *queue, struct msgb *msg); -int bsc_write_cb(struct bsc_fd *bfd, struct msgb *msg); +int bsc_do_write(struct osmo_wqueue *queue, struct msgb *msg, int id); +int bsc_write_msg(struct osmo_wqueue *queue, struct msgb *msg); +int bsc_write_cb(struct osmo_fd *bfd, struct msgb *msg); /* IMSI allow/deny handling */ -void bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv); +int bsc_parse_reg(void *ctx, regex_t *reg, char **imsi, int argc, const char **argv) __attribute__ ((warn_unused_result)); struct bsc_nat_acc_lst *bsc_nat_acc_lst_find(struct bsc_nat *nat, const char *name); struct bsc_nat_acc_lst *bsc_nat_acc_lst_get(struct bsc_nat *nat, const char *name); void bsc_nat_acc_lst_delete(struct bsc_nat_acc_lst *lst); @@ -350,6 +390,27 @@ int bsc_ussd_init(struct bsc_nat *nat); int bsc_check_ussd(struct sccp_connections *con, struct bsc_nat_parsed *parsed, struct msgb *msg); int bsc_close_ussd_connections(struct bsc_nat *nat); -struct msgb *bsc_nat_rewrite_setup(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi); +struct msgb *bsc_nat_rewrite_msg(struct bsc_nat *nat, struct msgb *msg, struct bsc_nat_parsed *, const char *imsi); + +/** paging group handling */ +struct bsc_nat_paging_group *bsc_nat_paging_group_num(struct bsc_nat *nat, int group); +struct bsc_nat_paging_group *bsc_nat_paging_group_create(struct bsc_nat *nat, int group); +void bsc_nat_paging_group_delete(struct bsc_nat_paging_group *); +void bsc_nat_paging_group_add_lac(struct bsc_nat_paging_group *grp, int lac); +void bsc_nat_paging_group_del_lac(struct bsc_nat_paging_group *grp, int lac); + +/** + * Number rewriting support below + */ +struct bsc_nat_num_rewr_entry { + struct llist_head list; + + regex_t msisdn_reg; + regex_t num_reg; + + char *replace; +}; + +void bsc_nat_num_rewr_entry_adapt(void *ctx, struct llist_head *head, const struct osmo_config_list *); #endif diff --git a/include/openbsc/bsc_nat_sccp.h b/include/openbsc/bsc_nat_sccp.h index 0ade668c4..20db2c12f 100644 --- a/include/openbsc/bsc_nat_sccp.h +++ b/include/openbsc/bsc_nat_sccp.h @@ -22,7 +22,6 @@ #ifndef BSC_NAT_SCCP_H #define BSC_NAT_SCCP_H -#include #include /* @@ -77,9 +76,13 @@ struct sccp_connections { /* status */ int con_type; int con_local; + int authorized; int imsi_checked; char *imsi; + /* remember which Transactions we run over the bypass */ + char ussd_ti[8]; + /* * audio handling. Remember if we have ever send a CRCX, * remember the endpoint used by the MSC and BSC. diff --git a/include/openbsc/bsc_rll.h b/include/openbsc/bsc_rll.h index b2898d1b0..729ba6037 100644 --- a/include/openbsc/bsc_rll.h +++ b/include/openbsc/bsc_rll.h @@ -10,10 +10,10 @@ enum bsc_rllr_ind { BSC_RLLR_IND_TIMEOUT, }; -int rll_establish(struct gsm_lchan *lchan, u_int8_t link_id, - void (*cb)(struct gsm_lchan *, u_int8_t, void *, +int rll_establish(struct gsm_lchan *lchan, uint8_t link_id, + void (*cb)(struct gsm_lchan *, uint8_t, void *, enum bsc_rllr_ind), void *data); -void rll_indication(struct gsm_lchan *lchan, u_int8_t link_id, u_int8_t type); +void rll_indication(struct gsm_lchan *lchan, uint8_t link_id, uint8_t type); #endif /* _BSC_RLL_H */ diff --git a/include/openbsc/bss.h b/include/openbsc/bss.h new file mode 100644 index 000000000..05495ddcb --- /dev/null +++ b/include/openbsc/bss.h @@ -0,0 +1,17 @@ +#ifndef _BSS_H_ +#define _BSS_H_ + +struct gsm_network; +struct msgb; + +/* start and stop network */ +extern int bsc_bootstrap_network(int (*mncc_recv)(struct gsm_network *, struct msgb *), const char *cfg_file); +extern int bsc_shutdown_net(struct gsm_network *net); + +/* register all supported BTS */ +extern int bts_init(void); +extern int bts_model_bs11_init(void); +extern int bts_model_rbs2k_init(void); +extern int bts_model_nanobts_init(void); +extern int bts_model_hslfemto_init(void); +#endif diff --git a/include/openbsc/crc24.h b/include/openbsc/crc24.h index 358fcb58f..756638c03 100644 --- a/include/openbsc/crc24.h +++ b/include/openbsc/crc24.h @@ -1,8 +1,10 @@ #ifndef _CRC24_H #define _CRC24_H +#include + #define INIT_CRC24 0xffffff -u_int32_t crc24_calc(u_int32_t fcs, u_int8_t *cp, unsigned int len); +uint32_t crc24_calc(uint32_t fcs, uint8_t *cp, unsigned int len); #endif diff --git a/include/openbsc/db.h b/include/openbsc/db.h index a939b0d63..37011a16e 100644 --- a/include/openbsc/db.h +++ b/include/openbsc/db.h @@ -20,7 +20,7 @@ #ifndef _DB_H #define _DB_H -#include +#include "gsm_subscriber.h" struct gsm_equipment; struct gsm_network; @@ -29,8 +29,6 @@ struct gsm_auth_tuple; struct gsm_sms; struct gsm_subscriber; -enum gsm_subscriber_field; - /* one time initialisation */ int db_init(const char *name); int db_prepare(); @@ -45,7 +43,7 @@ struct gsm_subscriber *db_get_subscriber(struct gsm_network *net, int db_sync_subscriber(struct gsm_subscriber *subscriber); int db_subscriber_alloc_tmsi(struct gsm_subscriber *subscriber); int db_subscriber_alloc_exten(struct gsm_subscriber *subscriber); -int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, u_int32_t* token); +int db_subscriber_alloc_token(struct gsm_subscriber *subscriber, uint32_t* token); int db_subscriber_assoc_imei(struct gsm_subscriber *subscriber, char *imei); int db_sync_equipment(struct gsm_equipment *equip); int db_subscriber_update(struct gsm_subscriber *subscriber); @@ -71,12 +69,12 @@ int db_sms_inc_deliver_attempts(struct gsm_sms *sms); /* APDU blob storage */ int db_apdu_blob_store(struct gsm_subscriber *subscr, - u_int8_t apdu_id_flags, u_int8_t len, - u_int8_t *apdu); + uint8_t apdu_id_flags, uint8_t len, + uint8_t *apdu); /* Statistics counter storage */ -struct counter; -int db_store_counter(struct counter *ctr); +struct osmo_counter; +int db_store_counter(struct osmo_counter *ctr); struct rate_ctr_group; int db_store_rate_ctr_group(struct rate_ctr_group *ctrg); diff --git a/include/openbsc/debug.h b/include/openbsc/debug.h index eb290e416..ff4aec1d5 100644 --- a/include/openbsc/debug.h +++ b/include/openbsc/debug.h @@ -2,10 +2,10 @@ #define _DEBUG_H #include -#include +#include #define DEBUG -#include +#include /* Debug Areas of the code */ enum { diff --git a/include/openbsc/e1_input.h b/include/openbsc/e1_input.h index 3c8af3877..0d79c7d1e 100644 --- a/include/openbsc/e1_input.h +++ b/include/openbsc/e1_input.h @@ -4,10 +4,10 @@ #include #include -#include +#include #include -#include -#include +#include +#include #include #define NUM_E1_TS 32 @@ -37,12 +37,12 @@ struct e1inp_sign_link { struct llist_head tx_list; /* SAPI and TEI on the E1 TS */ - u_int8_t sapi; - u_int8_t tei; + uint8_t sapi; + uint8_t tei; union { struct { - u_int8_t channel; + uint8_t channel; } misdn; } driver; }; @@ -69,7 +69,7 @@ struct e1inp_ts { /* delay for the queue */ int delay; /* timer when to dequeue next frame */ - struct timer_list tx_timer; + struct osmo_timer_list tx_timer; } sign; struct { /* subchannel demuxer for frames from E1 */ @@ -81,15 +81,15 @@ struct e1inp_ts { union { struct { /* mISDN driver has one fd for each ts */ - struct bsc_fd fd; + struct osmo_fd fd; } misdn; struct { /* ip.access driver has one fd for each ts */ - struct bsc_fd fd; + struct osmo_fd fd; } ipaccess; struct { /* DAHDI driver has one fd for each ts */ - struct bsc_fd fd; + struct osmo_fd fd; struct lapd_instance *lapd; } dahdi; } driver; @@ -125,21 +125,21 @@ struct e1inp_driver *e1inp_driver_find(const char *name); int e1inp_line_register(struct e1inp_line *line); /* get a line by its ID */ -struct e1inp_line *e1inp_line_get(u_int8_t e1_nr); +struct e1inp_line *e1inp_line_get(uint8_t e1_nr); /* create a line in the E1 input core */ -struct e1inp_line *e1inp_line_create(u_int8_t e1_nr, const char *driver_name); +struct e1inp_line *e1inp_line_create(uint8_t e1_nr, const char *driver_name); /* find a sign_link for given TEI and SAPI in a TS */ struct e1inp_sign_link * -e1inp_lookup_sign_link(struct e1inp_ts *ts, u_int8_t tei, - u_int8_t sapi); +e1inp_lookup_sign_link(struct e1inp_ts *ts, uint8_t tei, + uint8_t sapi); /* create a new signalling link in a E1 timeslot */ struct e1inp_sign_link * e1inp_sign_link_create(struct e1inp_ts *ts, enum e1inp_sign_type type, - struct gsm_bts_trx *trx, u_int8_t tei, - u_int8_t sapi); + struct gsm_bts_trx *trx, uint8_t tei, + uint8_t sapi); /* configure and initialize one e1inp_ts */ int e1inp_ts_config(struct e1inp_ts *ts, struct e1inp_line *line, @@ -150,20 +150,20 @@ int e1inp_update_ts(struct e1inp_ts *ts); /* Receive a packet from the E1 driver */ int e1inp_rx_ts(struct e1inp_ts *ts, struct msgb *msg, - u_int8_t tei, u_int8_t sapi); + uint8_t tei, uint8_t sapi); /* called by driver if it wants to transmit on a given TS */ struct msgb *e1inp_tx_ts(struct e1inp_ts *e1i_ts, struct e1inp_sign_link **sign_link); /* called by driver in case some kind of link state event */ -int e1inp_event(struct e1inp_ts *ts, int evt, u_int8_t tei, u_int8_t sapi); +int e1inp_event(struct e1inp_ts *ts, int evt, uint8_t tei, uint8_t sapi); /* Write LAPD frames to the fd. */ void e1_set_pcap_fd(int fd); /* called by TRAU muxer to obtain the destination mux entity */ -struct subch_mux *e1inp_get_mux(u_int8_t e1_nr, u_int8_t ts_nr); +struct subch_mux *e1inp_get_mux(uint8_t e1_nr, uint8_t ts_nr); void e1inp_sign_link_destroy(struct e1inp_sign_link *link); int e1inp_line_update(struct e1inp_line *line); @@ -175,6 +175,7 @@ int e1_reconfig_bts(struct gsm_bts *bts); int ia_config_connect(struct gsm_bts *bts, struct sockaddr_in *sin); int ipaccess_setup(struct gsm_network *gsmnet); +int hsl_setup(struct gsm_network *gsmnet); extern struct llist_head e1inp_driver_list; extern struct llist_head e1inp_line_list; diff --git a/include/openbsc/gb_proxy.h b/include/openbsc/gb_proxy.h index 18ded2295..c0cdcbf05 100644 --- a/include/openbsc/gb_proxy.h +++ b/include/openbsc/gb_proxy.h @@ -1,16 +1,15 @@ #ifndef _GB_PROXY_H #define _GB_PROXY_H -#include -#include +#include #include #include struct gbproxy_config { /* parsed from config file */ - u_int16_t nsip_sgsn_nsei; + uint16_t nsip_sgsn_nsei; /* misc */ struct gprs_ns_inst *nsi; diff --git a/include/openbsc/gprs_bssgp.h b/include/openbsc/gprs_bssgp.h index e432cf750..cef4c30e7 100644 --- a/include/openbsc/gprs_bssgp.h +++ b/include/openbsc/gprs_bssgp.h @@ -182,7 +182,7 @@ struct bssgp_bvc_ctx *btsctx_by_raid_cid(const struct gprs_ra_id *raid, uint16_t /* Find a BTS context based on BVCI+NSEI tuple */ struct bssgp_bvc_ctx *btsctx_by_bvci_nsei(uint16_t bvci, uint16_t nsei); -#include +#include /* BSSGP-UL-UNITDATA.ind */ int gprs_bssgp_rcvmsg(struct msgb *msg); diff --git a/include/openbsc/gprs_gmm.h b/include/openbsc/gprs_gmm.h index bd129ae4d..f6b3e5e7c 100644 --- a/include/openbsc/gprs_gmm.h +++ b/include/openbsc/gprs_gmm.h @@ -1,7 +1,7 @@ #ifndef _GPRS_GMM_H #define _GPRS_GMM_H -#include +#include #include int gsm48_tx_gsm_deact_pdp_req(struct sgsn_pdp_ctx *pdp, uint8_t sm_cause); diff --git a/include/openbsc/gprs_llc.h b/include/openbsc/gprs_llc.h index 02945e164..9f1760573 100644 --- a/include/openbsc/gprs_llc.h +++ b/include/openbsc/gprs_llc.h @@ -99,8 +99,8 @@ struct gprs_llc_lle { enum gprs_llc_lle_state state; - struct timer_list t200; - struct timer_list t201; /* wait for acknowledgement */ + struct osmo_timer_list t200; + struct osmo_timer_list t201; /* wait for acknowledgement */ uint16_t v_sent; uint16_t v_ack; diff --git a/include/openbsc/gprs_ns.h b/include/openbsc/gprs_ns.h index 953c364b8..8f28d4623 100644 --- a/include/openbsc/gprs_ns.h +++ b/include/openbsc/gprs_ns.h @@ -77,10 +77,10 @@ enum ns_cause { /* Our Implementation */ #include -#include -#include -#include -#include +#include +#include +#include +#include #define NS_TIMERS_COUNT 7 #define NS_TIMERS "(tns-block|tns-block-retries|tns-reset|tns-reset-retries|tns-test|tns-alive|tns-alive-retries)" @@ -133,13 +133,13 @@ struct gprs_ns_inst { /* NS-over-IP specific bits */ struct { - struct bsc_fd fd; + struct osmo_fd fd; uint32_t local_ip; uint16_t local_port; } nsip; /* NS-over-FR-over-GRE-over-IP specific bits */ struct { - struct bsc_fd fd; + struct osmo_fd fd; uint32_t local_ip; int enabled:1; } frgre; @@ -163,7 +163,7 @@ struct gprs_nsvc { uint32_t state; uint32_t remote_state; - struct timer_list timer; + struct osmo_timer_list timer; enum nsvc_timer_mode timer_mode; int alive_retries; diff --git a/include/openbsc/gprs_sgsn.h b/include/openbsc/gprs_sgsn.h index b470c536c..5023d0684 100644 --- a/include/openbsc/gprs_sgsn.h +++ b/include/openbsc/gprs_sgsn.h @@ -4,7 +4,7 @@ #include #include -#include +#include #include @@ -102,7 +102,7 @@ struct sgsn_mm_ctx { uint16_t nsei; uint16_t bvci; struct rate_ctr_group *ctrg; - struct timer_list timer; + struct osmo_timer_list timer; unsigned int T; /* Txxxx number */ unsigned int num_T_exp; /* number of consecutive T expirations */ @@ -168,7 +168,7 @@ struct sgsn_pdp_ctx { //uint32_t charging_id; int reordering_reqd; - struct timer_list timer; + struct osmo_timer_list timer; unsigned int T; /* Txxxx number */ unsigned int num_T_exp; /* number of consecutive T expirations */ }; diff --git a/include/openbsc/gsm_04_08.h b/include/openbsc/gsm_04_08.h index 1c879edce..b9b89e60c 100644 --- a/include/openbsc/gsm_04_08.h +++ b/include/openbsc/gsm_04_08.h @@ -3,8 +3,8 @@ #include -#include -#include +#include +#include struct msgb; struct gsm_bts; @@ -28,37 +28,37 @@ void gsm0408_clear_request(struct gsm_subscriber_connection *conn, uint32_t caus void gsm0408_clear_all_trans(struct gsm_network *net, int protocol); int gsm0408_dispatch(struct gsm_subscriber_connection *conn, struct msgb *msg); -int gsm0408_rcvmsg(struct msgb *msg, u_int8_t link_id); +int gsm0408_rcvmsg(struct msgb *msg, uint8_t link_id); int gsm0408_new_conn(struct gsm_subscriber_connection *conn); -enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, u_int8_t ra); -enum gsm_chreq_reason_t get_reason_by_chreq(u_int8_t ra, int neci); +enum gsm_chan_t get_ctype_by_chreq(struct gsm_network *bts, uint8_t ra); +enum gsm_chreq_reason_t get_reason_by_chreq(uint8_t ra, int neci); void gsm_net_update_ctype(struct gsm_network *net); int gsm48_tx_mm_info(struct gsm_subscriber_connection *conn); -int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, u_int8_t *rand, int key_seq); +int gsm48_tx_mm_auth_req(struct gsm_subscriber_connection *conn, uint8_t *rand, int key_seq); int gsm48_tx_mm_auth_rej(struct gsm_subscriber_connection *conn); int gsm48_send_rr_release(struct gsm_lchan *lchan); int gsm48_send_rr_ciph_mode(struct gsm_lchan *lchan, int want_imeisv); -int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, u_int8_t apdu_id, - u_int8_t apdu_len, const u_int8_t *apdu); -int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, u_int8_t power_class); +int gsm48_send_rr_app_info(struct gsm_subscriber_connection *conn, uint8_t apdu_id, + uint8_t apdu_len, const uint8_t *apdu); +int gsm48_send_rr_ass_cmd(struct gsm_lchan *dest_lchan, struct gsm_lchan *lchan, uint8_t power_class); int gsm48_send_ho_cmd(struct gsm_lchan *old_lchan, struct gsm_lchan *new_lchan, - u_int8_t power_command, u_int8_t ho_ref); + uint8_t power_command, uint8_t ho_ref); int mncc_tx_to_cc(struct gsm_network *net, int msg_type, void *arg); /* convert a ASCII phone number to call-control BCD */ -int encode_bcd_number(u_int8_t *bcd_lv, u_int8_t max_len, +int encode_bcd_number(uint8_t *bcd_lv, uint8_t max_len, int h_len, const char *input); -int decode_bcd_number(char *output, int output_len, const u_int8_t *bcd_lv, +int decode_bcd_number(char *output, int output_len, const uint8_t *bcd_lv, int h_len); -int send_siemens_mrpci(struct gsm_lchan *lchan, u_int8_t *classmark2_lv); +int send_siemens_mrpci(struct gsm_lchan *lchan, uint8_t *classmark2_lv); int gsm48_extract_mi(uint8_t *classmark2, int length, char *mi_string, uint8_t *mi_type); -int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, u_int8_t *mi_type); +int gsm48_paging_extract_mi(struct gsm48_pag_resp *pag, int length, char *mi_string, uint8_t *mi_type); int gsm48_handle_paging_resp(struct gsm_subscriber_connection *conn, struct msgb *msg, struct gsm_subscriber *subscr); -int gsm48_lchan_modify(struct gsm_lchan *lchan, u_int8_t lchan_mode); +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); diff --git a/include/openbsc/gsm_04_08_gprs.h b/include/openbsc/gsm_04_08_gprs.h index 8de636293..e5c3edd0c 100644 --- a/include/openbsc/gsm_04_08_gprs.h +++ b/include/openbsc/gsm_04_08_gprs.h @@ -2,7 +2,7 @@ #define _GSM48_GPRS_H #include -#include +#include /* Table 10.4 / 10.4a, GPRS Mobility Management (GMM) */ #define GSM48_MT_GMM_ATTACH_REQ 0x01 diff --git a/include/openbsc/gsm_04_11.h b/include/openbsc/gsm_04_11.h index 5969788d5..2abe3e202 100644 --- a/include/openbsc/gsm_04_11.h +++ b/include/openbsc/gsm_04_11.h @@ -1,26 +1,26 @@ #ifndef _GSM_04_11_H #define _GSM_04_11_H -#include +#include #define UM_SAPI_SMS 3 /* See GSM 04.05/04.06 */ /* SMS deliver PDU */ struct sms_deliver { - u_int8_t mti:2; /* message type indicator */ - u_int8_t mms:1; /* more messages to send */ - u_int8_t rp:1; /* reply path */ - u_int8_t udhi:1; /* user data header indicator */ - u_int8_t sri:1; /* status report indication */ - u_int8_t *orig_addr; /* originating address */ - u_int8_t pid; /* protocol identifier */ - u_int8_t dcs; /* data coding scheme */ + uint8_t mti:2; /* message type indicator */ + uint8_t mms:1; /* more messages to send */ + uint8_t rp:1; /* reply path */ + uint8_t udhi:1; /* user data header indicator */ + uint8_t sri:1; /* status report indication */ + uint8_t *orig_addr; /* originating address */ + uint8_t pid; /* protocol identifier */ + uint8_t dcs; /* data coding scheme */ /* service centre time stamp */ - u_int8_t ud_len; /* user data length */ - u_int8_t *user_data; /* user data */ + uint8_t ud_len; /* user data length */ + uint8_t *user_data; /* user data */ - u_int8_t msg_ref; /* message reference */ - u_int8_t *smsc; + uint8_t msg_ref; /* message reference */ + uint8_t *smsc; }; struct msgb; diff --git a/include/openbsc/gsm_04_80.h b/include/openbsc/gsm_04_80.h index 796a1c11e..0a6065234 100644 --- a/include/openbsc/gsm_04_80.h +++ b/include/openbsc/gsm_04_80.h @@ -1,9 +1,9 @@ #ifndef _GSM_04_80_H #define _GSM_04_80_H -#include -#include -#include +#include +#include +#include struct gsm_subscriber_connection; diff --git a/include/openbsc/gsm_data.h b/include/openbsc/gsm_data.h index ae448c4c1..715ff1bdd 100644 --- a/include/openbsc/gsm_data.h +++ b/include/openbsc/gsm_data.h @@ -1,97 +1,12 @@ #ifndef _GSM_DATA_H #define _GSM_DATA_H -#include - -struct osmo_msc_data; -struct osmo_bsc_sccp_con; -struct gsm_sms_queue; - -enum gsm_phys_chan_config { - GSM_PCHAN_NONE, - GSM_PCHAN_CCCH, - GSM_PCHAN_CCCH_SDCCH4, - GSM_PCHAN_TCH_F, - GSM_PCHAN_TCH_H, - GSM_PCHAN_SDCCH8_SACCH8C, - GSM_PCHAN_PDCH, /* GPRS PDCH */ - GSM_PCHAN_TCH_F_PDCH, /* TCH/F if used, PDCH otherwise */ - GSM_PCHAN_UNKNOWN, -}; - -enum gsm_chan_t { - GSM_LCHAN_NONE, - GSM_LCHAN_SDCCH, - GSM_LCHAN_TCH_F, - GSM_LCHAN_TCH_H, - GSM_LCHAN_UNKNOWN, -}; +#include -/* RRLP mode of operation */ -enum rrlp_mode { - RRLP_MODE_NONE, - RRLP_MODE_MS_BASED, - RRLP_MODE_MS_PREF, - 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, -}; +#include +#include -#include -#include #include -#include - -#include -#include -#include -#include -#include -#include - -#include - - -#define TRX_NR_TS 8 -#define TS_MAX_LCHAN 8 - -#define HARDCODED_ARFCN 123 -#define HARDCODED_TSC 7 -#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 - -/* reserved according to GSM 03.03 § 2.4 */ -#define GSM_RESERVED_TMSI 0xFFFFFFFF - -enum gsm_hooks { - GSM_HOOK_NM_SWLOAD, - GSM_HOOK_RR_PAGING, - GSM_HOOK_RR_SECURITY, -}; - -enum gsm_paging_event { - GSM_PAGING_SUCCEEDED, - GSM_PAGING_EXPIRED, - GSM_PAGING_OOM, - GSM_PAGING_BUSY, -}; - -enum bts_gprs_mode { - BTS_GPRS_NONE = 0, - BTS_GPRS_GPRS = 1, - BTS_GPRS_EGPRS = 2, -}; #define OBSC_NM_W_ACK_CB(__msgb) (__msgb)->cb[3] @@ -104,11 +19,11 @@ struct openbsc_msgb_cb { unsigned char *bssgp_cell_id; /* Identifiers of a BTS, equal to 'struct bssgp_bts_ctx' */ - u_int16_t nsei; - u_int16_t bvci; + uint16_t nsei; + uint16_t bvci; /* Identifier of a MS (inside BTS), equal to 'struct sgsn_mm_ctx' */ - u_int32_t tlli; + uint32_t tlli; } __attribute__((packed)); #define OBSC_MSGB_CB(__msgb) ((struct openbsc_msgb_cb *)&((__msgb)->cb[0])) #define msgb_tlli(__x) OBSC_MSGB_CB(__x)->tlli @@ -144,32 +59,18 @@ enum gsm_auth_algo { struct gsm_auth_info { enum gsm_auth_algo auth_algo; unsigned int a3a8_ki_len; - u_int8_t a3a8_ki[16]; + uint8_t a3a8_ki[16]; }; struct gsm_auth_tuple { int use_count; int key_seq; - u_int8_t rand[16]; - u_int8_t sres[4]; - u_int8_t kc[8]; + uint8_t rand[16]; + uint8_t sres[4]; + uint8_t kc[8]; }; #define GSM_KEY_SEQ_INVAL 7 /* GSM 04.08 - 10.5.1.2 */ - -struct gsm_lchan; -struct gsm_subscriber; -struct gsm_mncc; -struct rtp_socket; -struct bsc_api; - -/* Network Management State */ -struct gsm_nm_state { - u_int8_t operational; - u_int8_t administrative; - u_int8_t availability; -}; - /* * LOCATION UPDATING REQUEST state * @@ -178,7 +79,7 @@ struct gsm_nm_state { * - Accept/Reject according to global policy */ struct gsm_loc_updating_operation { - struct timer_list updating_timer; + struct osmo_timer_list updating_timer; unsigned int waiting_for_imsi : 1; unsigned int waiting_for_imei : 1; unsigned int key_seq : 4; @@ -198,7 +99,7 @@ struct gsm_security_operation { * a couple of seconds to work around MSC issues. */ struct gsm_anchor_operation { - struct timer_list timeout; + struct osmo_timer_list timeout; }; /* Maximum number of neighbor cells whose average we track */ @@ -208,32 +109,11 @@ struct gsm_anchor_operation { /* processed neighbor measurements for one cell */ struct neigh_meas_proc { - u_int16_t arfcn; - u_int8_t bsic; - u_int8_t rxlev[MAX_WIN_NEIGH_AVG]; + uint16_t arfcn; + uint8_t bsic; + uint8_t rxlev[MAX_WIN_NEIGH_AVG]; unsigned int rxlev_cnt; - u_int8_t last_seen_nr; -}; - -#define MAX_A5_KEY_LEN (128/8) -#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) - -/* is the data link established? who established it? */ -#define LCHAN_SAPI_UNUSED 0 -#define LCHAN_SAPI_MS 1 -#define LCHAN_SAPI_NET 2 - -/* state of a logical channel */ -enum gsm_lchan_state { - LCHAN_S_NONE, /* channel is not active */ - LCHAN_S_ACT_REQ, /* channel activatin 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_INACTIVE, /* channel is set inactive */ + uint8_t last_seen_nr; }; /* the per subscriber data for lchan */ @@ -264,427 +144,65 @@ struct gsm_subscriber_connection { struct gsm_bts *bts; /* for assignment handling */ - struct timer_list T10; + struct osmo_timer_list T10; struct gsm_lchan *secondary_lchan; }; -struct gsm_lchan { - /* The TS that we're part of */ - struct gsm_bts_trx_ts *ts; - /* The logical subslot number in the TS */ - u_int8_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; - /* State */ - enum gsm_lchan_state state; - /* Power levels for MS and BTS */ - u_int8_t bs_power; - u_int8_t ms_power; - /* Encryption information */ - struct { - u_int8_t alg_id; - u_int8_t key_len; - u_int8_t key[MAX_A5_KEY_LEN]; - } encr; - - struct timer_list T3101; - struct timer_list T3111; - struct timer_list error_timer; - - /* AMR bits */ - struct gsm48_multi_rate_conf mr_conf; - - /* Established data link layer services */ - u_int8_t sapis[8]; - int sach_deact; - int release_reason; - - /* GSM Random Access data */ - struct gsm48_req_ref *rqd_ref; - uint8_t rqd_ta; - - /* cache of last measurement reports on this lchan */ - struct gsm_meas_rep meas_rep[6]; - int meas_rep_idx; - - /* table of neighbor cell measurements */ - struct neigh_meas_proc neigh_meas[MAX_NEIGH_MEAS]; - - struct { - u_int32_t bound_ip; - u_int32_t connect_ip; - u_int16_t bound_port; - u_int16_t connect_port; - u_int16_t conn_id; - u_int8_t rtp_payload; - u_int8_t rtp_payload2; - u_int8_t speech_mode; - struct rtp_socket *rtp_socket; - } abis_ip; - - struct gsm_subscriber_connection *conn; -}; - -struct gsm_e1_subslot { - /* Number of E1 link */ - u_int8_t e1_nr; - /* Number of E1 TS inside E1 link */ - u_int8_t e1_ts; - /* Sub-slot within the E1 TS, 0xff if full TS */ - u_int8_t e1_ts_ss; -}; - -#define TS_F_PDCH_MODE 0x1000 -/* One Timeslot in a TRX */ -struct gsm_bts_trx_ts { - struct gsm_bts_trx *trx; - /* number of this timeslot at the TRX */ - u_int8_t nr; - - enum gsm_phys_chan_config pchan; - - unsigned int flags; - struct gsm_nm_state nm_state; - struct tlv_parsed nm_attr; - u_int8_t nm_chan_comb; - - struct { - /* Parameters below are configured by VTY */ - int enabled; - u_int8_t maio; - u_int8_t hsn; - struct bitvec arfcns; - u_int8_t arfcns_data[1024/8]; - /* This is the pre-computed MA for channel assignments */ - struct bitvec ma; - u_int8_t ma_len; /* part of ma_data that is used */ - u_int8_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; - - 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 */ - u_int8_t nr; - /* human readable name / description */ - char *description; - /* how do we talk RSL with this TRX? */ - struct gsm_e1_subslot rsl_e1_link; - u_int8_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_nm_state nm_state; - struct tlv_parsed nm_attr; - struct { - struct gsm_nm_state nm_state; - } bb_transc; - - u_int16_t arfcn; - int nominal_power; /* in dBm */ - unsigned int max_power_red; /* in actual dB */ - - union { - struct { - struct { - struct gsm_nm_state nm_state; - } bbsig; - struct { - struct gsm_nm_state nm_state; - } pa; - } bs11; - struct { - unsigned int test_state; - u_int8_t test_nr; - struct rxlev_stats rxlev_stat; - } ipaccess; - }; - struct gsm_bts_trx_ts ts[TRX_NR_TS]; -}; - -#define GSM_BTS_SI(bts, i) (void *)(bts->si_buf[i]) - -enum gsm_bts_type { - GSM_BTS_TYPE_UNKNOWN, - GSM_BTS_TYPE_BS11, - GSM_BTS_TYPE_NANOBTS, - GSM_BTS_TYPE_RBS2000, - GSM_BTS_TYPE_HSL_FEMTO, -}; - -struct vty; - -struct gsm_bts_model { - struct llist_head list; - - enum gsm_bts_type type; - const char *name; - - int (*oml_rcvmsg)(struct msgb *msg); - - void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts); - void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx); - void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts); - - struct tlv_definition nm_att_tlvdef; - - struct bitvec features; - uint8_t _features_data[128/8]; -}; - -enum gsm_bts_features { - BTS_FEAT_HSCSD, - BTS_FEAT_GPRS, - BTS_FEAT_EGPRS, - BTS_FEAT_ECSD, - BTS_FEAT_HOPPING, -}; - -/* - * 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 timer_list work_timer; - struct timer_list credit_timer; - - /* free chans needed */ - int free_chans_need; - - /* load */ - u_int16_t available_slots; -}; - -struct gsm_envabtse { - struct gsm_nm_state nm_state; -}; - -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; - u_int16_t nsvci; - u_int16_t local_port; /* on the BTS */ - u_int16_t remote_port; /* on the SGSN */ - u_int32_t remote_ip; /* on the SGSN */ - - struct gsm_nm_state nm_state; -}; - -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 */ -}; -/* One BTS */ -struct gsm_bts { - /* list header in net->bts_list */ - struct llist_head list; - - struct gsm_network *network; - /* number of ths BTS in network */ - u_int8_t nr; - /* human readable name / description */ - char *description; - /* Cell Identity */ - u_int16_t cell_identity; - /* location area code of this BTS */ - u_int16_t location_area_code; - /* Training Sequence Code */ - u_int8_t tsc; - /* Base Station Identification Code (BSIC) */ - u_int8_t bsic; - /* type of BTS */ - enum gsm_bts_type type; - struct gsm_bts_model *model; - enum gsm_band band; - /* should the channel allocator allocate channels from high TRX to TRX0, - * rather than starting from TRX0 and go upwards? */ - int chan_alloc_reverse; - /* 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; - u_int8_t oml_tei; - struct e1inp_sign_link *oml_link; - - /* Abis network management O&M handle */ - struct abis_nm_h *nmh; - struct gsm_nm_state nm_state; - struct tlv_parsed nm_attr; - - /* number of this BTS on given E1 link */ - u_int8_t bts_nr; - - /* paging state and control */ - struct gsm_bts_paging_state paging; - - /* CCCH is on C0 */ - struct gsm_bts_trx *c0; +#define ROLE_BSC +#include "gsm_data_shared.h" - struct { - struct gsm_nm_state nm_state; - } site_mgr; - - enum neigh_list_manual_mode neigh_list_manual_mode; - /* parameters from which we build SYSTEM INFORMATION */ - struct { - struct gsm48_rach_control rach_control; - u_int8_t ncc_permitted; - struct gsm48_cell_sel_par cell_sel_par; - struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */ - struct gsm48_cell_options cell_options; - struct gsm48_control_channel_descr chan_desc; - struct bitvec neigh_list; - struct bitvec cell_alloc; - struct bitvec si5_neigh_list; - struct { - /* bitmask large enough for all possible ARFCN's */ - u_int8_t neigh_list[1024/8]; - u_int8_t cell_alloc[1024/8]; - /* If the user wants a different neighbor list in SI5 than in SI2 */ - u_int8_t si5_neigh_list[1024/8]; - } data; - } si_common; - - /* do we use static (user-defined) system information messages? (bitmask) */ - uint32_t si_mode_static; - /* bitmask of all SI that are present/valid in si_buf */ - uint32_t si_valid; - /* buffers where we put the pre-computed SI */ - sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE]; - - /* ip.accesss Unit ID's have Site/BTS/TRX layout */ - union { - struct { - u_int16_t site_id; - u_int16_t bts_id; - u_int32_t flags; - } ip_access; - struct { - struct { - struct gsm_nm_state nm_state; - } cclk; - struct { - struct gsm_nm_state nm_state; - } rack; - struct gsm_envabtse envabtse[4]; - } bs11; - struct { - struct { - struct llist_head conn_groups; - } is; - struct { - struct llist_head conn_groups; - } con; - } rbs2000; - struct { - unsigned long serno; - } hsl; - }; - - /* Not entirely sure how ip.access specific this is */ - struct { - enum bts_gprs_mode mode; - struct { - struct gsm_nm_state nm_state; - u_int16_t nsei; - uint8_t timer[7]; - } nse; - struct { - struct gsm_nm_state nm_state; - u_int16_t bvci; - uint8_t timer[11]; - } cell; - struct gsm_bts_gprs_nsvc nsvc[2]; - u_int8_t rac; - } gprs; - - /* RACH NM values */ - int rach_b_thresh; - int rach_ldavg_slots; - - /* transceivers */ - int num_trx; - struct llist_head trx_list; - - /* Abis NM queue */ - struct llist_head abis_queue; - int abis_nm_pend; -}; /* Some statistics of our network */ struct gsmnet_stats { struct { - struct counter *total; - struct counter *no_channel; + struct osmo_counter *total; + struct osmo_counter *no_channel; } chreq; struct { - struct counter *attempted; - struct counter *no_channel; /* no channel available */ - struct counter *timeout; /* T3103 timeout */ - struct counter *completed; /* HO COMPL received */ - struct counter *failed; /* HO FAIL received */ + struct osmo_counter *attempted; + struct osmo_counter *no_channel; /* no channel available */ + struct osmo_counter *timeout; /* T3103 timeout */ + struct osmo_counter *completed; /* HO COMPL received */ + struct osmo_counter *failed; /* HO FAIL received */ } handover; struct { - struct counter *attach; - struct counter *normal; - struct counter *periodic; - struct counter *detach; + struct osmo_counter *attach; + struct osmo_counter *normal; + struct osmo_counter *periodic; + struct osmo_counter *detach; } loc_upd_type; struct { - struct counter *reject; - struct counter *accept; + struct osmo_counter *reject; + struct osmo_counter *accept; } loc_upd_resp; struct { - struct counter *attempted; - struct counter *detached; - struct counter *completed; - struct counter *expired; + struct osmo_counter *attempted; + struct osmo_counter *detached; + struct osmo_counter *completed; + struct osmo_counter *expired; } paging; struct { - struct counter *submitted; /* MO SMS submissions */ - struct counter *no_receiver; - struct counter *delivered; /* MT SMS deliveries */ - struct counter *rp_err_mem; - struct counter *rp_err_other; + struct osmo_counter *submitted; /* MO SMS submissions */ + struct osmo_counter *no_receiver; + struct osmo_counter *delivered; /* MT SMS deliveries */ + struct osmo_counter *rp_err_mem; + struct osmo_counter *rp_err_other; } sms; struct { - struct counter *mo_setup; - struct counter *mo_connect_ack; - struct counter *mt_setup; - struct counter *mt_connect; + struct osmo_counter *mo_setup; + struct osmo_counter *mo_connect_ack; + struct osmo_counter *mt_setup; + struct osmo_counter *mt_connect; } call; struct { - struct counter *rf_fail; - struct counter *rll_err; + struct osmo_counter *rf_fail; + struct osmo_counter *rll_err; } chan; struct { - struct counter *oml_fail; - struct counter *rsl_fail; + struct osmo_counter *oml_fail; + struct osmo_counter *rsl_fail; } bts; }; @@ -699,8 +217,8 @@ enum gsm_auth_policy { struct gsm_network { /* global parameters */ - u_int16_t country_code; - u_int16_t network_code; + uint16_t country_code; + uint16_t network_code; char *name_long; char *name_short; enum gsm_auth_policy auth_policy; @@ -780,50 +298,32 @@ struct gsm_sms { struct gsm_subscriber *receiver; unsigned long validity_minutes; - u_int8_t reply_path_req; - u_int8_t status_rep_req; - u_int8_t ud_hdr_ind; - u_int8_t protocol_id; - u_int8_t data_coding_scheme; - u_int8_t msg_ref; + uint8_t reply_path_req; + uint8_t status_rep_req; + uint8_t ud_hdr_ind; + uint8_t protocol_id; + uint8_t data_coding_scheme; + uint8_t msg_ref; char dest_addr[20+1]; /* DA LV is 12 bytes max, i.e. 10 bytes * BCD == 20 bytes string */ - u_int8_t user_data_len; - u_int8_t user_data[SMS_TEXT_SIZE]; + uint8_t user_data_len; + uint8_t user_data[SMS_TEXT_SIZE]; char text[SMS_TEXT_SIZE]; }; - -struct gsm_network *gsm_network_init(u_int16_t country_code, u_int16_t network_code, +struct gsm_network *gsm_network_init(uint16_t country_code, uint16_t network_code, int (*mncc_recv)(struct gsm_network *, struct msgb *)); -struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, enum gsm_bts_type type, - u_int8_t tsc, u_int8_t bsic); -struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts); int gsm_set_bts_type(struct gsm_bts *bts, enum gsm_bts_type type); struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num); /* Get reference to a neighbor cell on a given BCCH ARFCN */ struct gsm_bts *gsm_bts_neighbor(const struct gsm_bts *bts, - u_int16_t arfcn, u_int8_t bsic); - -struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num); + uint16_t arfcn, uint8_t bsic); -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(struct gsm_bts_trx *trx); -char *gsm_ts_name(struct gsm_bts_trx_ts *ts); -char *gsm_lchan_name(struct gsm_lchan *lchan); -const char *gsm_lchans_name(enum gsm_lchan_state s); - -void set_ts_e1link(struct gsm_bts_trx_ts *ts, u_int8_t e1_nr, - u_int8_t e1_ts, u_int8_t e1_ts_ss); enum gsm_bts_type parse_btstype(const char *arg); const char *btstype2str(enum gsm_bts_type type); -struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr); struct gsm_bts *gsm_bts_by_lac(struct gsm_network *net, unsigned int lac, struct gsm_bts *start_bts); @@ -853,7 +353,6 @@ static inline int is_siemens_bts(struct gsm_bts *bts) return 0; } - enum gsm_auth_policy gsm_auth_policy_parse(const char *arg); const char *gsm_auth_policy_name(enum gsm_auth_policy policy); @@ -863,17 +362,24 @@ const char *rrlp_mode_name(enum rrlp_mode mode); enum bts_gprs_mode bts_gprs_mode_parse(const char *arg); const char *bts_gprs_mode_name(enum bts_gprs_mode mode); -void gsm_trx_lock_rf(struct gsm_bts_trx *trx, int locked); - -int gsm48_ra_id_by_bts(u_int8_t *buf, struct gsm_bts *bts); +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_meas_rep *lchan_next_meas_rep(struct gsm_lchan *lchan); int gsm_btsmodel_set_feature(struct gsm_bts_model *model, enum gsm_bts_features feat); -int gsm_bts_has_feature(struct gsm_bts *bts, enum gsm_bts_features feat); int gsm_bts_model_register(struct gsm_bts_model *model); struct gsm_subscriber_connection *subscr_con_allocate(struct gsm_lchan *lchan); void subscr_con_free(struct gsm_subscriber_connection *conn); -#endif +struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, + enum gsm_bts_type type, + uint8_t tsc, uint8_t bsic); +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); +int gsm_bts_has_feature(struct gsm_bts *bts, enum gsm_bts_features feat); +struct gsm_bts_trx *gsm_bts_trx_by_nr(struct gsm_bts *bts, int nr); + +#endif /* _GSM_DATA_H */ diff --git a/include/openbsc/gsm_data_shared.h b/include/openbsc/gsm_data_shared.h new file mode 100644 index 000000000..011e0aa96 --- /dev/null +++ b/include/openbsc/gsm_data_shared.h @@ -0,0 +1,590 @@ +#ifndef _GSM_DATA_SHAREDH +#define _GSM_DATA_SHAREDH + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +struct osmo_msc_data; +struct osmo_bsc_sccp_con; +struct gsm_sms_queue; + +/* RRLP mode of operation */ +enum rrlp_mode { + RRLP_MODE_NONE, + RRLP_MODE_MS_BASED, + RRLP_MODE_MS_PREF, + 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, +}; + +#define TRX_NR_TS 8 +#define TS_MAX_LCHAN 8 + +#define HARDCODED_ARFCN 123 +#define HARDCODED_TSC 7 +#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 + +/* reserved according to GSM 03.03 § 2.4 */ +#define GSM_RESERVED_TMSI 0xFFFFFFFF + +enum gsm_hooks { + GSM_HOOK_NM_SWLOAD, + GSM_HOOK_RR_PAGING, + GSM_HOOK_RR_SECURITY, +}; + +enum gsm_paging_event { + GSM_PAGING_SUCCEEDED, + GSM_PAGING_EXPIRED, + GSM_PAGING_OOM, + GSM_PAGING_BUSY, +}; + +enum bts_gprs_mode { + BTS_GPRS_NONE = 0, + BTS_GPRS_GPRS = 1, + BTS_GPRS_EGPRS = 2, +}; + +struct gsm_lchan; +struct gsm_subscriber; +struct gsm_mncc; +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; + 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; +}; + +#define MAX_A5_KEY_LEN (128/8) +#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) + +/* is the data link established? who established it? */ +#define LCHAN_SAPI_UNUSED 0 +#define LCHAN_SAPI_MS 1 +#define LCHAN_SAPI_NET 2 + +/* state of a logical channel */ +enum gsm_lchan_state { + LCHAN_S_NONE, /* channel is not active */ + LCHAN_S_ACT_REQ, /* channel activatin 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_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; +}; +/* /BTS ONLY */ + +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; + /* State */ + enum gsm_lchan_state state; + /* Power levels for MS and BTS */ + uint8_t bs_power; + uint8_t ms_power; + /* Encryption information */ + struct { + uint8_t alg_id; + uint8_t key_len; + uint8_t key[MAX_A5_KEY_LEN]; + } encr; + + /* AMR bits */ + struct gsm48_multi_rate_conf mr_conf; + + /* Established data link layer services */ + uint8_t sapis[8]; + int sach_deact; + int release_reason; + + 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; + struct rtp_socket *rtp_socket; + } abis_ip; + + uint8_t rqd_ta; + +#ifdef ROLE_BSC + struct osmo_timer_list T3101; + struct osmo_timer_list T3111; + struct osmo_timer_list error_timer; + + /* 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; +#else + struct lapdm_channel lapdm_ch; + 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 */ + sysinfo_buf_t buf[_MAX_SYSINFO_TYPE]; + } 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 { + uint8_t rxlev_full; + uint8_t rxlev_sub; + uint8_t rxqual_full; + uint8_t rxqual_sub; + } res; + } meas; +#endif +}; + + +struct gsm_e1_subslot { + /* Number of E1 link */ + uint8_t e1_nr; + /* Number of E1 TS inside E1 link */ + uint8_t e1_ts; + /* Sub-slot within the E1 TS, 0xff if full TS */ + uint8_t e1_ts_ss; +}; + +#define TS_F_PDCH_MODE 0x1000 +/* 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; + + 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; + + 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 */ + + struct { + void *l1h; + } role_bts; + + 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 gsm_bts_trx_ts ts[TRX_NR_TS]; +}; + +#define GSM_BTS_SI(bts, i) (void *)(bts->si_buf[i]) + +enum gsm_bts_type { + GSM_BTS_TYPE_UNKNOWN, + GSM_BTS_TYPE_BS11, + GSM_BTS_TYPE_NANOBTS, + GSM_BTS_TYPE_RBS2000, + GSM_BTS_TYPE_HSL_FEMTO, +}; + +struct vty; + +struct gsm_bts_model { + struct llist_head list; + + enum gsm_bts_type type; + const char *name; + + bool started; + int (*start)(struct gsm_network *net); + int (*oml_rcvmsg)(struct msgb *msg); + + void (*config_write_bts)(struct vty *vty, struct gsm_bts *bts); + void (*config_write_trx)(struct vty *vty, struct gsm_bts_trx *trx); + void (*config_write_ts)(struct vty *vty, struct gsm_bts_trx_ts *ts); + + struct tlv_definition nm_att_tlvdef; + + struct bitvec features; + uint8_t _features_data[128/8]; +}; + +enum gsm_bts_features { + BTS_FEAT_HSCSD, + BTS_FEAT_GPRS, + BTS_FEAT_EGPRS, + BTS_FEAT_ECSD, + BTS_FEAT_HOPPING, +}; + +/* + * 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 neigh_list_manual_mode { + NL_MODE_AUTOMATIC = 0, + NL_MODE_MANUAL = 1, + NL_MODE_MANUAL_SI5SEP = 2, /* SI2 and SI5 have separate neighbor lists */ +}; + +/* One BTS */ +struct gsm_bts { + /* list header in net->bts_list */ + struct llist_head 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; + /* Training Sequence Code */ + uint8_t tsc; + /* Base Station Identification Code (BSIC) */ + uint8_t bsic; + /* type of BTS */ + enum gsm_bts_type type; + struct gsm_bts_model *model; + enum gsm_band band; + /* 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; + + /* paging state and control */ + struct gsm_bts_paging_state paging; + + /* CCCH is on C0 */ + struct gsm_bts_trx *c0; + + struct { + struct gsm_abis_mo mo; + } site_mgr; + + /* bitmask of all SI that are present/valid in si_buf */ + uint32_t si_valid; + /* buffers where we put the pre-computed SI */ + sysinfo_buf_t si_buf[_MAX_SYSINFO_TYPE]; + + /* ip.accesss Unit ID's have Site/BTS/TRX layout */ + union { + struct { + uint16_t site_id; + uint16_t bts_id; + uint32_t flags; + } 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 gsm_abis_mo mo; + struct llist_head conn_groups; + } is; + struct { + struct gsm_abis_mo mo; + struct llist_head conn_groups; + } con; + struct { + struct gsm_abis_mo mo; + } dp; + struct { + struct gsm_abis_mo mo; + } tf; + } rbs2000; + struct { + unsigned long serno; + } hsl; + }; + + /* Not entirely sure how ip.access specific this is */ + struct { + enum bts_gprs_mode mode; + struct { + struct gsm_abis_mo mo; + uint16_t nsei; + uint8_t timer[7]; + } nse; + struct { + struct gsm_abis_mo mo; + uint16_t bvci; + uint8_t timer[11]; + } cell; + struct gsm_bts_gprs_nsvc nsvc[2]; + uint8_t rac; + } gprs; + + /* RACH NM values */ + int rach_b_thresh; + int rach_ldavg_slots; + + /* transceivers */ + int num_trx; + struct llist_head trx_list; + +#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; + /* parameters from which we build SYSTEM INFORMATION */ + struct { + struct gsm48_rach_control rach_control; + uint8_t ncc_permitted; + struct gsm48_cell_sel_par cell_sel_par; + struct gsm48_si_selection_params cell_ro_sel_par; /* rest octet */ + struct gsm48_cell_options cell_options; + struct gsm48_control_channel_descr chan_desc; + struct bitvec neigh_list; + struct bitvec cell_alloc; + struct bitvec si5_neigh_list; + struct { + /* bitmask large enough for all possible ARFCN's */ + uint8_t neigh_list[1024/8]; + uint8_t cell_alloc[1024/8]; + /* If the user wants a different neighbor list in SI5 than in SI2 */ + uint8_t si5_neigh_list[1024/8]; + } data; + } si_common; + + /* do we use static (user-defined) system information messages? (bitmask) */ + uint32_t si_mode_static; +#endif /* ROLE_BSC */ + void *role; +}; + + +struct gsm_bts *gsm_bts_alloc(void *talloc_ctx); +struct gsm_bts_trx *gsm_bts_trx_alloc(struct gsm_bts *bts); + +struct gsm_bts_trx *gsm_bts_trx_num(struct gsm_bts *bts, int num); + +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(struct gsm_bts_trx *trx); +char *gsm_ts_name(struct gsm_bts_trx_ts *ts); +char *gsm_lchan_name(struct gsm_lchan *lchan); +const char *gsm_lchans_name(enum gsm_lchan_state s); + + +void gsm_abis_mo_reset(struct gsm_abis_mo *mo); + +struct gsm_abis_mo * +gsm_objclass2mo(struct gsm_bts *bts, uint8_t obj_class, + struct abis_om_obj_inst *obj_inst); + +struct gsm_nm_state * +gsm_objclass2nmstate(struct gsm_bts *bts, uint8_t obj_class, + struct abis_om_obj_inst *obj_inst); +void * +gsm_objclass2obj(struct gsm_bts *bts, uint8_t obj_class, + 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_ts2chan_nr(const struct gsm_bts_trx_ts *ts, uint8_t lchan_nr); +uint8_t gsm_lchan2chan_nr(const struct gsm_lchan *lchan); + +#endif diff --git a/include/openbsc/gsm_subscriber.h b/include/openbsc/gsm_subscriber.h index c365bc7d7..6cf85731b 100644 --- a/include/openbsc/gsm_subscriber.h +++ b/include/openbsc/gsm_subscriber.h @@ -1,9 +1,8 @@ #ifndef _GSM_SUBSCR_H #define _GSM_SUBSCR_H -#include #include "gsm_data.h" -#include +#include #define GSM_IMEI_LENGTH 17 #define GSM_IMSI_LENGTH 17 @@ -24,24 +23,24 @@ struct gsm_equipment { char name[GSM_NAME_LENGTH]; struct gsm48_classmark1 classmark1; - u_int8_t classmark2_len; - u_int8_t classmark2[3]; - u_int8_t classmark3_len; - u_int8_t classmark3[14]; + uint8_t classmark2_len; + uint8_t classmark2[3]; + uint8_t classmark3_len; + uint8_t classmark3[14]; }; struct gsm_subscriber { struct gsm_network *net; long long unsigned int id; char imsi[GSM_IMSI_LENGTH]; - u_int32_t tmsi; - u_int16_t lac; + uint32_t tmsi; + uint16_t lac; char name[GSM_NAME_LENGTH]; char extension[GSM_EXTENSION_LENGTH]; int authorized; /* Temporary field which is not stored in the DB/HLR */ - u_int32_t flags; + uint32_t flags; /* Every user can only have one equipment in use at any given * point in time */ @@ -72,7 +71,7 @@ enum gsm_subscriber_update_reason { struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr); struct gsm_subscriber *subscr_get_by_tmsi(struct gsm_network *net, - u_int32_t tmsi); + uint32_t tmsi); struct gsm_subscriber *subscr_get_by_imsi(struct gsm_network *net, const char *imsi); struct gsm_subscriber *subscr_get_by_extension(struct gsm_network *net, diff --git a/include/openbsc/ipaccess.h b/include/openbsc/ipaccess.h index 1d00d9792..c2ca2a530 100644 --- a/include/openbsc/ipaccess.h +++ b/include/openbsc/ipaccess.h @@ -3,56 +3,8 @@ #include "e1_input.h" #include "gsm_subscriber.h" -#include - -#define IPA_TCP_PORT_OML 3002 -#define IPA_TCP_PORT_RSL 3003 - -struct ipaccess_head { - u_int16_t len; /* network byte order */ - u_int8_t proto; - u_int8_t data[0]; -} __attribute__ ((packed)); - -struct ipaccess_head_ext { - uint8_t proto; - uint8_t data[0]; -} __attribute__ ((packed)); - -enum ipaccess_proto { - IPAC_PROTO_RSL = 0x00, - IPAC_PROTO_IPACCESS = 0xfe, - IPAC_PROTO_SCCP = 0xfd, - IPAC_PROTO_OML = 0xff, - - - /* OpenBSC extensions */ - IPAC_PROTO_OSMO = 0xee, - IPAC_PROTO_MGCP_OLD = 0xfc, -}; - -enum ipaccess_msgtype { - IPAC_MSGT_PING = 0x00, - IPAC_MSGT_PONG = 0x01, - IPAC_MSGT_ID_GET = 0x04, - IPAC_MSGT_ID_RESP = 0x05, - IPAC_MSGT_ID_ACK = 0x06, - - /* OpenBSC extension */ - IPAC_MSGT_SCCP_OLD = 0xff, -}; - -enum ipaccess_id_tags { - IPAC_IDTAG_SERNR = 0x00, - IPAC_IDTAG_UNITNAME = 0x01, - IPAC_IDTAG_LOCATION1 = 0x02, - IPAC_IDTAG_LOCATION2 = 0x03, - IPAC_IDTAG_EQUIPVERS = 0x04, - IPAC_IDTAG_SWVERSION = 0x05, - IPAC_IDTAG_IPADDR = 0x06, - IPAC_IDTAG_MACADDR = 0x07, - IPAC_IDTAG_UNIT = 0x08, -}; +#include +#include struct ipac_msgt_sccp_state { uint8_t src_ref[3]; @@ -62,54 +14,38 @@ struct ipac_msgt_sccp_state { char imsi[GSM_IMSI_LENGTH]; } __attribute__((packed)); +/* + * @add_remove 0 for remove, 1 for add, 3 to asK + * @nr_lacs Number of extra lacs inside this package + * @lac One lac entry + */ +struct ipac_ext_lac_cmd { + uint8_t add_remove; + uint8_t nr_extra_lacs; + uint16_t lac; + uint8_t data[0]; +} __attribute__((packed)); + int ipaccess_connect(struct e1inp_line *line, struct sockaddr_in *sa); /* * methods for parsing and sending a message */ -int ipaccess_rcvmsg_base(struct msgb *msg, struct bsc_fd *bfd); -struct msgb *ipaccess_read_msg(struct bsc_fd *bfd, int *error); +int ipaccess_rcvmsg_base(struct msgb *msg, struct osmo_fd *bfd); +struct msgb *ipaccess_read_msg(struct osmo_fd *bfd, int *error); void ipaccess_prepend_header(struct msgb *msg, int proto); +void ipaccess_prepend_header_ext(struct msgb *msg, int proto); +int ipaccess_send_pong(int fd); int ipaccess_send_id_ack(int fd); int ipaccess_send_id_req(int fd); +const char *ipaccess_idtag_name(uint8_t tag); int ipaccess_idtag_parse(struct tlv_parsed *dec, unsigned char *buf, int len); +int ipaccess_parse_unitid(const char *str, uint16_t *site_id, uint16_t *bts_id, uint16_t *trx_id); int ipaccess_drop_oml(struct gsm_bts *bts); int ipaccess_drop_rsl(struct gsm_bts_trx *trx); -/* - * Firmware specific header - */ -struct sdp_firmware { - char magic[4]; - char more_magic[2]; - u_int16_t more_more_magic; - u_int32_t header_length; - u_int32_t file_length; - char sw_part[20]; - char text1[64]; - char time[12]; - char date[14]; - char text2[10]; - char version[20]; - u_int16_t table_offset; - /* stuff i don't know */ -} __attribute__((packed)); - -struct sdp_header_entry { - u_int16_t something1; - char text1[64]; - char time[12]; - char date[14]; - char text2[10]; - char version[20]; - u_int32_t length; - u_int32_t addr1; - u_int32_t addr2; - u_int32_t start; -} __attribute__((packed)); - struct sdp_header_item { struct sdp_header_entry header_entry; struct llist_head entry; diff --git a/include/openbsc/meas_rep.h b/include/openbsc/meas_rep.h index 3c2c8d1c1..f235df6aa 100644 --- a/include/openbsc/meas_rep.h +++ b/include/openbsc/meas_rep.h @@ -1,21 +1,23 @@ #ifndef _MEAS_REP_H #define _MEAS_REP_H +#include + #define MRC_F_PROCESSED 0x0001 /* extracted from a L3 measurement report IE */ struct gsm_meas_rep_cell { - u_int8_t rxlev; - u_int8_t bsic; - u_int8_t neigh_idx; - u_int16_t arfcn; + uint8_t rxlev; + uint8_t bsic; + uint8_t neigh_idx; + uint16_t arfcn; unsigned int flags; }; /* RX Level and RX Quality */ struct gsm_rx_lev_qual { - u_int8_t rx_lev; - u_int8_t rx_qual; + uint8_t rx_lev; + uint8_t rx_qual; }; /* unidirectional measumrement report */ @@ -38,7 +40,7 @@ struct gsm_meas_rep { struct gsm_lchan *lchan; /* number of the measurement report */ - u_int8_t nr; + uint8_t nr; /* flags, see MEAS_REP_F_* */ unsigned int flags; @@ -46,11 +48,11 @@ struct gsm_meas_rep { struct gsm_meas_rep_unidir ul; struct gsm_meas_rep_unidir dl; - u_int8_t bs_power; - u_int8_t ms_timing_offset; + uint8_t bs_power; + uint8_t ms_timing_offset; struct { int8_t pwr; /* MS power in dBm */ - u_int8_t ta; /* MS timing advance */ + uint8_t ta; /* MS timing advance */ } ms_l1; /* neighbor measurement reports for up to 6 cells */ diff --git a/include/openbsc/mgcp.h b/include/openbsc/mgcp.h index 516b76edf..b9f81161f 100644 --- a/include/openbsc/mgcp.h +++ b/include/openbsc/mgcp.h @@ -23,8 +23,8 @@ #ifndef OPENBSC_MGCP_H #define OPENBSC_MGCP_H -#include -#include +#include +#include #include "debug.h" @@ -135,7 +135,7 @@ struct mgcp_config { struct in_addr transcoder_in; int transcoder_remote_base; - struct write_queue gw_fd; + struct osmo_wqueue gw_fd; struct mgcp_port_range bts_ports; struct mgcp_port_range net_ports; diff --git a/include/openbsc/mgcp_internal.h b/include/openbsc/mgcp_internal.h index 7c6bb5425..a9d51494b 100644 --- a/include/openbsc/mgcp_internal.h +++ b/include/openbsc/mgcp_internal.h @@ -23,7 +23,7 @@ #ifndef OPENBSC_MGCP_DATA_H #define OPENBSC_MGCP_DATA_H -#include +#include #define CI_UNUSED 0 @@ -66,8 +66,8 @@ struct mgcp_rtp_end { /* * Each end has a socket... */ - struct bsc_fd rtp; - struct bsc_fd rtcp; + struct osmo_fd rtp; + struct osmo_fd rtcp; int local_port; int local_alloc; diff --git a/include/openbsc/mncc.h b/include/openbsc/mncc.h index e514c19ae..ed1bfd652 100644 --- a/include/openbsc/mncc.h +++ b/include/openbsc/mncc.h @@ -24,8 +24,8 @@ #ifndef _MNCC_H #define _MNCC_H -#include -#include +#include +#include #include diff --git a/include/openbsc/osmo_bsc.h b/include/openbsc/osmo_bsc.h index ef0f11a3b..262014759 100644 --- a/include/openbsc/osmo_bsc.h +++ b/include/openbsc/osmo_bsc.h @@ -16,8 +16,8 @@ struct osmo_bsc_sccp_con { /* SCCP connection realted */ struct sccp_connection *sccp; struct bsc_msc_connection *msc_con; - struct timer_list sccp_it_timeout; - struct timer_list sccp_cc_timeout; + struct osmo_timer_list sccp_it_timeout; + struct osmo_timer_list sccp_cc_timeout; struct llist_head sccp_queue; unsigned int sccp_queue_size; diff --git a/include/openbsc/osmo_bsc_rf.h b/include/openbsc/osmo_bsc_rf.h index e43ae2e3f..6db28cd64 100644 --- a/include/openbsc/osmo_bsc_rf.h +++ b/include/openbsc/osmo_bsc_rf.h @@ -1,32 +1,32 @@ #ifndef OSMO_BSC_RF #define OSMO_BSC_RF -#include -#include +#include +#include struct gsm_network; struct osmo_bsc_rf { /* the value of signal.h */ int policy; - struct bsc_fd listen; + struct osmo_fd listen; struct gsm_network *gsm_network; const char *last_state_command; /* delay the command */ char last_request; - struct timer_list delay_cmd; + struct osmo_timer_list delay_cmd; /* verify that RF is up as it should be */ - struct timer_list rf_check; + struct osmo_timer_list rf_check; /* some handling for the automatic grace switch */ - struct timer_list grace_timeout; + struct osmo_timer_list grace_timeout; }; struct osmo_bsc_rf_conn { - struct write_queue queue; + struct osmo_wqueue queue; struct osmo_bsc_rf *rf; }; diff --git a/include/openbsc/osmo_msc_data.h b/include/openbsc/osmo_msc_data.h index 8f9ca6856..3212b3657 100644 --- a/include/openbsc/osmo_msc_data.h +++ b/include/openbsc/osmo_msc_data.h @@ -25,7 +25,7 @@ #include "bsc_msc.h" -#include +#include struct osmo_bsc_rf; struct gsm_network; @@ -36,15 +36,15 @@ struct gsm_audio_support { }; struct osmo_msc_data { + /* Back pointer */ + struct gsm_network *network; + /* Connection data */ char *bsc_token; - int msc_port; - int msc_ip_dscp; - char *msc_ip; int ping_timeout; int pong_timeout; - struct timer_list ping_timer; - struct timer_list pong_timer; + struct osmo_timer_list ping_timer; + struct osmo_timer_list pong_timer; struct bsc_msc_connection *msc_con; int core_ncc; int core_mcc; @@ -54,13 +54,17 @@ struct osmo_msc_data { struct gsm_audio_support **audio_support; int audio_length; + /* destinations */ + struct llist_head dests; + /* mgcp agent */ - struct write_queue mgcp_agent; + struct osmo_wqueue mgcp_agent; /* rf ctl related bits */ char *mid_call_txt; int mid_call_timeout; + char *rf_ctrl_name; struct osmo_bsc_rf *rf_ctl; /* ussd welcome text */ diff --git a/include/openbsc/paging.h b/include/openbsc/paging.h index f71919916..0872eb866 100644 --- a/include/openbsc/paging.h +++ b/include/openbsc/paging.h @@ -23,10 +23,10 @@ #include #include -#include +#include #include "gsm_data.h" #include "gsm_subscriber.h" -#include +#include /** * A pending paging request @@ -43,7 +43,7 @@ struct gsm_paging_request { int chan_type; /* Timer 3113: how long do we try to page? */ - struct timer_list T3113; + struct osmo_timer_list T3113; /* How often did we ask the BTS to page? */ int attempts; @@ -53,9 +53,6 @@ struct gsm_paging_request { void *cbfn_param; }; -/* call once for every gsm_bts... */ -void paging_init(struct gsm_bts *bts); - /* schedule paging request */ int paging_request(struct gsm_network *network, struct gsm_subscriber *subscr, int type, gsm_cbfn *cbfn, void *data); @@ -66,6 +63,9 @@ void paging_request_stop(struct gsm_bts *bts, struct gsm_subscriber *subscr, struct msgb *msg); /* update paging load */ -void paging_update_buffer_space(struct gsm_bts *bts, u_int16_t); +void paging_update_buffer_space(struct gsm_bts *bts, uint16_t); + +/* pending paging requests */ +unsigned int paging_pending_requests_nr(struct gsm_bts *bts); #endif diff --git a/include/openbsc/rest_octets.h b/include/openbsc/rest_octets.h index 6d9011963..2d16a1f4f 100644 --- a/include/openbsc/rest_octets.h +++ b/include/openbsc/rest_octets.h @@ -1,14 +1,13 @@ #ifndef _REST_OCTETS_H #define _REST_OCTETS_H -#include #include /* generate SI1 rest octets */ -int rest_octets_si1(u_int8_t *data, u_int8_t *nch_pos); +int rest_octets_si1(uint8_t *data, uint8_t *nch_pos); struct gsm48_si_selection_params { - u_int16_t penalty_time:5, + uint16_t penalty_time:5, temp_offs:3, cell_resel_off:6, cbq:1, @@ -16,18 +15,18 @@ struct gsm48_si_selection_params { }; struct gsm48_si_power_offset { - u_int8_t power_offset:2, + uint8_t power_offset:2, present:1; }; struct gsm48_si3_gprs_ind { - u_int8_t si13_position:1, + uint8_t si13_position:1, ra_colour:3, present:1; }; struct gsm48_lsa_params { - u_int32_t prio_thr:3, + uint32_t prio_thr:3, lsa_offset:3, mcc:12, mnc:12; @@ -37,26 +36,26 @@ struct gsm48_lsa_params { struct gsm48_si_ro_info { struct gsm48_si_selection_params selection_params; struct gsm48_si_power_offset power_offset; - u_int8_t si2ter_indicator; - u_int8_t early_cm_ctrl; + uint8_t si2ter_indicator; + uint8_t early_cm_ctrl; struct { - u_int8_t where:3, + uint8_t where:3, present:1; } scheduling; struct gsm48_si3_gprs_ind gprs_ind; /* SI 4 specific */ struct gsm48_lsa_params lsa_params; - u_int16_t cell_id; - u_int8_t break_ind; /* do we have SI7 + SI8 ? */ + uint16_t cell_id; + uint8_t break_ind; /* do we have SI7 + SI8 ? */ }; /* Generate SI3 Rest Octests (Chapter 10.5.2.34 / Table 10.4.72) */ -int rest_octets_si3(u_int8_t *data, const struct gsm48_si_ro_info *si3); +int rest_octets_si3(uint8_t *data, const struct gsm48_si_ro_info *si3); /* Generate SI4 Rest Octets (Chapter 10.5.2.35) */ -int rest_octets_si4(u_int8_t *data, const struct gsm48_si_ro_info *si4); +int rest_octets_si4(uint8_t *data, const struct gsm48_si_ro_info *si4); enum pbcch_carrier_type { PBCCH_BCCH, @@ -75,59 +74,59 @@ enum gprs_nmo { struct gprs_cell_options { enum gprs_nmo nmo; /* T3168: wait for packet uplink assignment message */ - u_int32_t t3168; /* in milliseconds */ + uint32_t t3168; /* in milliseconds */ /* T3192: wait for release of the TBF after reception of the final block */ - u_int32_t t3192; /* in milliseconds */ - u_int32_t drx_timer_max;/* in seconds */ - u_int32_t bs_cv_max; + uint32_t t3192; /* in milliseconds */ + uint32_t drx_timer_max;/* in seconds */ + uint32_t bs_cv_max; - u_int8_t ext_info_present; + uint8_t ext_info_present; struct { - u_int8_t egprs_supported; - u_int8_t use_egprs_p_ch_req; - u_int8_t bep_period; - u_int8_t pfc_supported; - u_int8_t dtm_supported; - u_int8_t bss_paging_coordination; + uint8_t egprs_supported; + uint8_t use_egprs_p_ch_req; + uint8_t bep_period; + uint8_t pfc_supported; + uint8_t dtm_supported; + uint8_t bss_paging_coordination; } ext_info; }; /* TS 04.60 Table 12.9.2 */ struct gprs_power_ctrl_pars { - u_int8_t alpha; - u_int8_t t_avg_w; - u_int8_t t_avg_t; - u_int8_t pc_meas_chan; - u_int8_t n_avg_i; + uint8_t alpha; + uint8_t t_avg_w; + uint8_t t_avg_t; + uint8_t pc_meas_chan; + uint8_t n_avg_i; }; struct gsm48_si13_info { struct gprs_cell_options cell_opts; struct gprs_power_ctrl_pars pwr_ctrl_pars; - u_int8_t bcch_change_mark; - u_int8_t si_change_field; - u_int8_t pbcch_present; + uint8_t bcch_change_mark; + uint8_t si_change_field; + uint8_t pbcch_present; union { struct { - u_int8_t rac; - u_int8_t spgc_ccch_sup; - u_int8_t net_ctrl_ord; - u_int8_t prio_acc_thr; + uint8_t rac; + uint8_t spgc_ccch_sup; + uint8_t net_ctrl_ord; + uint8_t prio_acc_thr; } no_pbcch; struct { - u_int8_t psi1_rep_per; - u_int8_t pb; - u_int8_t tsc; - u_int8_t tn; + uint8_t psi1_rep_per; + uint8_t pb; + uint8_t tsc; + uint8_t tn; enum pbcch_carrier_type carrier_type; - u_int16_t arfcn; - u_int8_t maio; + uint16_t arfcn; + uint8_t maio; } pbcch; }; }; /* Generate SI13 Rest Octests (Chapter 10.5.2.37b) */ -int rest_octets_si13(u_int8_t *data, const struct gsm48_si13_info *si13); +int rest_octets_si13(uint8_t *data, const struct gsm48_si13_info *si13); #endif /* _REST_OCTETS_H */ diff --git a/include/openbsc/rtp_proxy.h b/include/openbsc/rtp_proxy.h index 53b58b4b5..94d2579ff 100644 --- a/include/openbsc/rtp_proxy.h +++ b/include/openbsc/rtp_proxy.h @@ -24,8 +24,10 @@ #include -#include -#include +#include +#include + +#include #define RTP_PT_GSM_FULL 3 #define RTP_PT_GSM_HALF 96 @@ -48,7 +50,7 @@ struct rtp_sub_socket { struct sockaddr_in sin_local; struct sockaddr_in sin_remote; - struct bsc_fd bfd; + struct osmo_fd bfd; /* linked list of to-be-transmitted msgb's */ struct llist_head tx_queue; }; @@ -67,23 +69,23 @@ struct rtp_socket { } proxy; struct { struct gsm_network *net; - u_int32_t callref; + uint32_t callref; } receive; }; enum rtp_tx_action tx_action; struct { - u_int16_t sequence; - u_int32_t timestamp; - u_int32_t ssrc; + 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, u_int32_t ip); -int rtp_socket_connect(struct rtp_socket *rs, u_int32_t ip, u_int16_t port); +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, u_int32_t callref); +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); diff --git a/include/openbsc/sgsn.h b/include/openbsc/sgsn.h index 84db87e91..745661472 100644 --- a/include/openbsc/sgsn.h +++ b/include/openbsc/sgsn.h @@ -1,9 +1,8 @@ #ifndef _SGSN_H #define _SGSN_H -#include -#include +#include #include #include @@ -22,11 +21,11 @@ struct sgsn_instance { char *config_file; struct sgsn_config cfg; /* File descriptor wrappers for LibGTP */ - struct bsc_fd gtp_fd0; - struct bsc_fd gtp_fd1c; - struct bsc_fd gtp_fd1u; + struct osmo_fd gtp_fd0; + struct osmo_fd gtp_fd1c; + struct osmo_fd gtp_fd1u; /* Timer for libGTP */ - struct timer_list gtp_timer; + struct osmo_timer_list gtp_timer; /* GSN instance for libgtp */ struct gsn_t *gsn; }; diff --git a/include/openbsc/signal.h b/include/openbsc/signal.h index a2257db73..2991cfac1 100644 --- a/include/openbsc/signal.h +++ b/include/openbsc/signal.h @@ -27,7 +27,7 @@ #include -#include +#include /* * Signalling subsystems @@ -84,6 +84,7 @@ enum signal_nm { 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 */ @@ -169,15 +170,30 @@ struct scall_signal_data { struct ipacc_ack_signal_data { struct gsm_bts_trx *trx; - u_int8_t msg_type; + uint8_t msg_type; }; +struct abis_om2k_mo; + struct nm_statechg_signal_data { - u_int8_t obj_class; + 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 { diff --git a/include/openbsc/socket.h b/include/openbsc/socket.h index 4d3161146..0fd85f104 100644 --- a/include/openbsc/socket.h +++ b/include/openbsc/socket.h @@ -1,14 +1,14 @@ #ifndef _BSC_SOCKET_H #define _BSC_SOCKET_H -#include -#include +#include #ifndef IPPROTO_GRE #define IPPROTO_GRE 47 #endif -int make_sock(struct bsc_fd *bfd, int proto, u_int32_t ip, u_int16_t port, - int (*cb)(struct bsc_fd *fd, unsigned int what)); +int make_sock(struct osmo_fd *bfd, int proto, + uint32_t ip, uint16_t port, int priv_nr, + int (*cb)(struct osmo_fd *fd, unsigned int what), void *data); #endif /* _BSC_SOCKET_H */ diff --git a/include/openbsc/subchan_demux.h b/include/openbsc/subchan_demux.h index da2a7f325..b71c856d9 100644 --- a/include/openbsc/subchan_demux.h +++ b/include/openbsc/subchan_demux.h @@ -20,8 +20,8 @@ * */ -#include -#include +#include +#include #define NR_SUBCH 4 #define TRAU_FRAME_SIZE 40 @@ -32,8 +32,8 @@ /***********************************************************************/ struct demux_subch { - u_int8_t out_bitbuf[TRAU_FRAME_BITS]; - u_int16_t out_idx; /* next bit to be written in out_bitbuf */ + uint8_t out_bitbuf[TRAU_FRAME_BITS]; + uint16_t out_idx; /* next bit to be written in out_bitbuf */ /* number of consecutive zeros that we have received (for sync) */ unsigned int consecutive_zeros; /* are we in TRAU frame sync or not? */ @@ -42,12 +42,12 @@ struct demux_subch { struct subch_demux { /* bitmask of currently active subchannels */ - u_int8_t chan_activ; + uint8_t chan_activ; /* one demux_subch struct for every subchannel */ struct demux_subch subch[NR_SUBCH]; /* callback to be called once we have received a complete * frame on a given subchannel */ - int (*out_cb)(struct subch_demux *dmx, int ch, u_int8_t *data, int len, + int (*out_cb)(struct subch_demux *dmx, int ch, uint8_t *data, int len, void *); /* user-provided data, transparently passed to out_cb() */ void *data; @@ -57,7 +57,7 @@ struct subch_demux { int subch_demux_init(struct subch_demux *dmx); /* feed 'len' number of muxed bytes into the demultiplexer */ -int subch_demux_in(struct subch_demux *dmx, u_int8_t *data, int len); +int subch_demux_in(struct subch_demux *dmx, uint8_t *data, int len); /* activate decoding/processing for one subchannel */ int subch_demux_activate(struct subch_demux *dmx, int subch); @@ -76,7 +76,7 @@ struct subch_txq_entry { unsigned int bit_len; /* total number of bits in 'bits' */ unsigned int next_bit; /* next bit to be transmitted */ - u_int8_t bits[0]; /* one bit per byte */ + uint8_t bits[0]; /* one bit per byte */ }; struct mux_subch { @@ -92,10 +92,10 @@ struct subch_mux { int subchan_mux_init(struct subch_mux *mx); /* request the output of 'len' multiplexed bytes */ -int subchan_mux_out(struct subch_mux *mx, u_int8_t *data, int len); +int subchan_mux_out(struct subch_mux *mx, uint8_t *data, int len); /* enqueue some data into one sub-channel of the muxer */ -int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const u_int8_t *data, +int subchan_mux_enqueue(struct subch_mux *mx, int s_nr, const uint8_t *data, int len); #endif /* _SUBCH_DEMUX_H */ diff --git a/include/openbsc/system_information.h b/include/openbsc/system_information.h index da662e912..6a5684821 100644 --- a/include/openbsc/system_information.h +++ b/include/openbsc/system_information.h @@ -1,45 +1,10 @@ #ifndef _SYSTEM_INFO_H #define _SYSTEM_INFO_H -#include - -#define GSM_MACBLOCK_LEN 23 +#include struct gsm_bts; - -enum osmo_sysinfo_type { - SYSINFO_TYPE_NONE, - SYSINFO_TYPE_1, - SYSINFO_TYPE_2, - SYSINFO_TYPE_3, - SYSINFO_TYPE_4, - SYSINFO_TYPE_5, - SYSINFO_TYPE_6, - SYSINFO_TYPE_7, - SYSINFO_TYPE_8, - SYSINFO_TYPE_9, - SYSINFO_TYPE_10, - SYSINFO_TYPE_13, - SYSINFO_TYPE_16, - SYSINFO_TYPE_17, - SYSINFO_TYPE_18, - SYSINFO_TYPE_19, - SYSINFO_TYPE_20, - SYSINFO_TYPE_2bis, - SYSINFO_TYPE_2ter, - SYSINFO_TYPE_2quater, - SYSINFO_TYPE_5bis, - SYSINFO_TYPE_5ter, - /* FIXME all the various bis and ter */ - _MAX_SYSINFO_TYPE -}; - -typedef u_int8_t sysinfo_buf_t[GSM_MACBLOCK_LEN]; - -extern const struct value_string osmo_sitype_strs[_MAX_SYSINFO_TYPE]; -uint8_t gsm_sitype2rsl(enum osmo_sysinfo_type si_type); -const char *gsm_sitype_name(enum osmo_sysinfo_type si_type); int gsm_generate_si(struct gsm_bts *bts, enum osmo_sysinfo_type type); #endif diff --git a/include/openbsc/transaction.h b/include/openbsc/transaction.h index e41d8ef91..acb2e6c8b 100644 --- a/include/openbsc/transaction.h +++ b/include/openbsc/transaction.h @@ -3,8 +3,9 @@ #include #include -#include +#include #include +#include /* One transaction */ struct gsm_trans { @@ -12,10 +13,10 @@ struct gsm_trans { struct llist_head entry; /* The protocol within which we live */ - u_int8_t protocol; + uint8_t protocol; /* The current transaction ID */ - u_int8_t transaction_id; + uint8_t transaction_id; /* To whom we belong, unique identifier of remote MM entity */ struct gsm_subscriber *subscr; @@ -24,7 +25,7 @@ struct gsm_trans { struct gsm_subscriber_connection *conn; /* reference from MNCC or other application */ - u_int32_t callref; + uint32_t callref; /* if traffic channel receive was requested */ int tch_recv; @@ -41,14 +42,14 @@ struct gsm_trans { /* current timer and message queue */ int Tcurrent; /* current CC timer */ int T308_second; /* used to send release again */ - struct timer_list timer; + struct osmo_timer_list timer; struct gsm_mncc msg; /* stores setup/disconnect/release message */ } cc; struct { - u_int8_t link_id; /* RSL Link ID to be used for this trans */ + uint8_t link_id; /* RSL Link ID to be used for this trans */ int is_mt; /* is this a MO (0) or MT (1) transfer */ enum gsm411_cp_state cp_state; - struct timer_list cp_timer; + struct osmo_timer_list cp_timer; enum gsm411_rp_state rp_state; @@ -60,16 +61,16 @@ struct gsm_trans { struct gsm_trans *trans_find_by_id(struct gsm_subscriber *subscr, - u_int8_t proto, u_int8_t trans_id); + uint8_t proto, uint8_t trans_id); struct gsm_trans *trans_find_by_callref(struct gsm_network *net, - u_int32_t callref); + uint32_t callref); struct gsm_trans *trans_alloc(struct gsm_subscriber *subscr, - u_int8_t protocol, u_int8_t trans_id, - u_int32_t callref); + uint8_t protocol, uint8_t trans_id, + uint32_t callref); void trans_free(struct gsm_trans *trans); int trans_assign_trans_id(struct gsm_subscriber *subscr, - u_int8_t protocol, u_int8_t ti_flag); + uint8_t protocol, uint8_t ti_flag); #endif diff --git a/include/openbsc/trau_frame.h b/include/openbsc/trau_frame.h index c594c38cb..c15e24b7f 100644 --- a/include/openbsc/trau_frame.h +++ b/include/openbsc/trau_frame.h @@ -20,7 +20,7 @@ * */ -#include +#include /* 21 for FR/EFR, 25 for AMR, 15 for OM, 15 for data, 13 for E-data, 21 idle */ #define MAX_C_BITS 25 @@ -34,11 +34,11 @@ #define MAX_M_BITS 2 struct decoded_trau_frame { - u_int8_t c_bits[MAX_C_BITS]; - u_int8_t d_bits[MAX_D_BITS]; - u_int8_t t_bits[MAX_T_BITS]; - u_int8_t s_bits[MAX_S_BITS]; - u_int8_t m_bits[MAX_M_BITS]; + uint8_t c_bits[MAX_C_BITS]; + uint8_t d_bits[MAX_D_BITS]; + uint8_t t_bits[MAX_T_BITS]; + uint8_t s_bits[MAX_S_BITS]; + uint8_t m_bits[MAX_M_BITS]; }; #define TRAU_FT_FR_UP 0x02 /* 0 0 0 1 0 - 3.5.1.1.1 */ @@ -55,10 +55,10 @@ struct decoded_trau_frame { #define TRAU_FT_IDLE_DOWN 0x0e /* 0 1 1 1 0 - 3.5.5 */ -int decode_trau_frame(struct decoded_trau_frame *fr, const u_int8_t *trau_bits); -int encode_trau_frame(u_int8_t *trau_bits, const struct decoded_trau_frame *fr); +int decode_trau_frame(struct decoded_trau_frame *fr, const uint8_t *trau_bits); +int encode_trau_frame(uint8_t *trau_bits, const struct decoded_trau_frame *fr); int trau_frame_up2down(struct decoded_trau_frame *fr); -u_int8_t *trau_idle_frame(void); +uint8_t *trau_idle_frame(void); #endif /* _TRAU_FRAME_H */ diff --git a/include/openbsc/trau_mux.h b/include/openbsc/trau_mux.h index dcf33ee8f..9936ba184 100644 --- a/include/openbsc/trau_mux.h +++ b/include/openbsc/trau_mux.h @@ -28,6 +28,10 @@ * optimization to routing them externally. */ +#include +#include +#include + /* map a TRAU mux map entry */ int trau_mux_map(const struct gsm_e1_subslot *src, const struct gsm_e1_subslot *dst); @@ -35,14 +39,14 @@ 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, u_int32_t callref); +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 u_int8_t *trau_bits, int num_bits); + const uint8_t *trau_bits, int num_bits); /* add a trau receiver */ -int trau_recv_lchan(struct gsm_lchan *lchan, u_int32_t callref); +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); diff --git a/include/openbsc/ussd.h b/include/openbsc/ussd.h index 6f80d23d8..266546811 100644 --- a/include/openbsc/ussd.h +++ b/include/openbsc/ussd.h @@ -3,7 +3,7 @@ /* Handler function for mobile-originated USSD messages */ -#include +#include int handle_rcv_ussd(struct gsm_subscriber_connection *conn, struct msgb *msg); diff --git a/include/openbsc/vty.h b/include/openbsc/vty.h index 516c8c2a0..663589671 100644 --- a/include/openbsc/vty.h +++ b/include/openbsc/vty.h @@ -35,12 +35,14 @@ enum bsc_vty_node { MSC_NODE, OM2K_NODE, TRUNK_NODE, + PGROUP_NODE, }; extern int bsc_vty_is_config_node(struct vty *vty, int node); extern void bsc_replace_string(void *ctx, char **dst, const char *newstr); -int bsc_vty_init(void); +struct log_info; +int bsc_vty_init(const struct log_info *cat); int bsc_vty_init_extra(void); #endif -- cgit v1.2.3