summaryrefslogtreecommitdiffstats
path: root/include/openbsc
diff options
context:
space:
mode:
Diffstat (limited to 'include/openbsc')
-rw-r--r--include/openbsc/Makefile.am3
-rw-r--r--include/openbsc/Makefile.in7
-rw-r--r--include/openbsc/abis_nm.h138
-rw-r--r--include/openbsc/abis_om2000.h24
-rw-r--r--include/openbsc/abis_rsl.h55
-rw-r--r--include/openbsc/bsc_msc.h26
-rw-r--r--include/openbsc/bsc_nat.h123
-rw-r--r--include/openbsc/bsc_nat_sccp.h5
-rw-r--r--include/openbsc/bsc_rll.h6
-rw-r--r--include/openbsc/bss.h17
-rw-r--r--include/openbsc/crc24.h4
-rw-r--r--include/openbsc/db.h14
-rw-r--r--include/openbsc/debug.h4
-rw-r--r--include/openbsc/e1_input.h39
-rw-r--r--include/openbsc/gb_proxy.h5
-rw-r--r--include/openbsc/gprs_bssgp.h2
-rw-r--r--include/openbsc/gprs_gmm.h2
-rw-r--r--include/openbsc/gprs_llc.h4
-rw-r--r--include/openbsc/gprs_ns.h14
-rw-r--r--include/openbsc/gprs_sgsn.h6
-rw-r--r--include/openbsc/gsm_04_08.h30
-rw-r--r--include/openbsc/gsm_04_08_gprs.h2
-rw-r--r--include/openbsc/gsm_04_11.h26
-rw-r--r--include/openbsc/gsm_04_80.h6
-rw-r--r--include/openbsc/gsm_data.h640
-rw-r--r--include/openbsc/gsm_data_shared.h590
-rw-r--r--include/openbsc/gsm_subscriber.h19
-rw-r--r--include/openbsc/ipaccess.h104
-rw-r--r--include/openbsc/meas_rep.h22
-rw-r--r--include/openbsc/mgcp.h6
-rw-r--r--include/openbsc/mgcp_internal.h6
-rw-r--r--include/openbsc/mncc.h4
-rw-r--r--include/openbsc/osmo_bsc.h4
-rw-r--r--include/openbsc/osmo_bsc_rf.h14
-rw-r--r--include/openbsc/osmo_msc_data.h18
-rw-r--r--include/openbsc/paging.h14
-rw-r--r--include/openbsc/rest_octets.h85
-rw-r--r--include/openbsc/rtp_proxy.h22
-rw-r--r--include/openbsc/sgsn.h11
-rw-r--r--include/openbsc/signal.h22
-rw-r--r--include/openbsc/socket.h8
-rw-r--r--include/openbsc/subchan_demux.h20
-rw-r--r--include/openbsc/system_information.h37
-rw-r--r--include/openbsc/transaction.h25
-rw-r--r--include/openbsc/trau_frame.h18
-rw-r--r--include/openbsc/trau_mux.h10
-rw-r--r--include/openbsc/ussd.h2
-rw-r--r--include/openbsc/vty.h4
48 files changed, 1196 insertions, 1071 deletions
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 <sys/types.h>
-#include <osmocore/tlv.h>
-#include <osmocore/protocol/gsm_12_21.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gsm/abis_nm.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
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 <osmocore/protocol/gsm_08_58.h>
+#include <osmocom/gsm/protocol/gsm_08_58.h>
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
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 <osmocore/write_queue.h>
-#include <osmocore/timer.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/timer.h>
+
+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 <zecke@selfish.org>
- * (C) 2010 by On-Waves
+ * (C) 2010-2011 by Holger Hans Peter Freyther <zecke@selfish.org>
+ * (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 <sys/types.h>
-#include <osmocore/select.h>
-#include <osmocore/msgb.h>
-#include <osmocore/msgfile.h>
-#include <osmocore/timer.h>
-#include <osmocore/write_queue.h>
-#include <osmocore/rate_ctr.h>
-#include <osmocore/statistics.h>
-#include <osmocore/protocol/gsm_04_08.h>
+#include <osmocom/core/select.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/msgfile.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/rate_ctr.h>
+#include <osmocom/core/statistics.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
#include <regex.h>
#define DIR_BSC 1
#define DIR_MSC 2
+#define PAGIN_GROUP_UNASSIGNED -1
+
struct sccp_source_reference;
struct sccp_connections;
struct bsc_nat_parsed;
@@ -56,6 +57,16 @@ enum {
};
/*
+ * 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
*/
struct bsc_connection {
@@ -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 <sys/types.h>
#include <osmocom/sccp/sccp_types.h>
/*
@@ -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 <stdint.h>
+
#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 <sys/types.h>
+#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 <stdio.h>
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
#define DEBUG
-#include <osmocore/logging.h>
+#include <osmocom/core/logging.h>
/* 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 <stdlib.h>
#include <netinet/in.h>
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
#include <openbsc/gsm_data.h>
-#include <osmocore/msgb.h>
-#include <osmocore/select.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/select.h>
#include <openbsc/subchan_demux.h>
#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 <sys/types.h>
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
#include <openbsc/gprs_ns.h>
#include <osmocom/vty/command.h>
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 <osmocore/tlv.h>
+#include <osmocom/gsm/tlv.h>
/* 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 <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
#include <openbsc/gprs_sgsn.h>
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 <netinet/in.h>
-#include <osmocore/linuxlist.h>
-#include <osmocore/msgb.h>
-#include <osmocore/timer.h>
-#include <osmocore/select.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
#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 <stdint.h>
#include <netinet/in.h>
-#include <osmocore/gsm48.h>
+#include <osmocom/gsm/gsm48.h>
#include <osmocom/crypt/gprs_cipher.h>
@@ -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 <openbsc/meas_rep.h>
-#include <osmocore/protocol/gsm_04_08.h>
-#include <osmocore/gsm48.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/gsm48.h>
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 <stdint.h>
-#include <osmocore/protocol/gsm_04_08.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
/* 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 <osmocore/protocol/gsm_04_11.h>
+#include <osmocom/gsm/protocol/gsm_04_11.h>
#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 <osmocore/msgb.h>
-#include <osmocore/protocol/gsm_04_80.h>
-#include <osmocore/gsm0480.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/gsm/protocol/gsm_04_80.h>
+#include <osmocom/gsm/gsm0480.h>
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 <sys/types.h>
-
-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 <stdint.h>
-/* 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 <osmocom/core/timer.h>
+#include <osmocom/core/select.h>
-#include <osmocore/timer.h>
-#include <openbsc/system_information.h>
#include <openbsc/rest_octets.h>
-#include <openbsc/mncc.h>
-
-#include <osmocore/tlv.h>
-#include <osmocore/bitvec.h>
-#include <osmocore/statistics.h>
-#include <osmocore/gsm_utils.h>
-#include <osmocore/utils.h>
-#include <osmocore/rxlev_stat.h>
-
-#include <osmocore/protocol/gsm_08_58.h>
-
-
-#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 <stdbool.h>
+#include <stdint.h>
+
+#include <osmocom/core/timer.h>
+#include <osmocom/core/bitvec.h>
+#include <osmocom/core/statistics.h>
+#include <osmocom/core/utils.h>
+#include <osmocom/gsm/gsm_utils.h>
+#include <osmocom/gsm/tlv.h>
+#include <osmocom/gsm/rxlev_stat.h>
+#include <osmocom/gsm/sysinfo.h>
+
+#include <osmocom/gsm/protocol/gsm_08_58.h>
+#include <osmocom/gsm/protocol/gsm_12_21.h>
+
+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 <sys/types.h>
#include "gsm_data.h"
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
#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 <osmocore/linuxlist.h>
-
-#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 <osmocom/core/linuxlist.h>
+#include <osmocom/gsm/protocol/ipaccess.h>
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 <stdint.h>
+
#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 <osmocore/msgb.h>
-#include <osmocore/write_queue.h>
+#include <osmocom/core/msgb.h>
+#include <osmocom/core/write_queue.h>
#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 <osmocore/select.h>
+#include <osmocom/core/select.h>
#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 <osmocore/linuxlist.h>
-#include <osmocore/mncc.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/gsm/mncc.h>
#include <stdint.h>
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 <osmocore/write_queue.h>
-#include <osmocore/timer.h>
+#include <osmocom/core/write_queue.h>
+#include <osmocom/core/timer.h>
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 <osmocore/timer.h>
+#include <osmocom/core/timer.h>
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 <stdlib.h>
#include <string.h>
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
#include "gsm_data.h"
#include "gsm_subscriber.h"
-#include <osmocore/timer.h>
+#include <osmocom/core/timer.h>
/**
* 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 <sys/types.h>
#include <openbsc/gsm_04_08.h>
/* 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 <netinet/in.h>
-#include <osmocore/linuxlist.h>
-#include <osmocore/select.h>
+#include <osmocom/core/linuxlist.h>
+#include <osmocom/core/select.h>
+
+#include <openbsc/mncc.h>
#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 <sys/types.h>
-#include <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
#include <openbsc/gprs_ns.h>
#include <openbsc/gprs_sgsn.h>
@@ -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 <openbsc/gsm_data.h>
-#include <osmocore/signal.h>
+#include <osmocom/core/signal.h>
/*
* 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 <sys/types.h>
-#include <osmocore/select.h>
+#include <osmocom/core/select.h>
#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 <sys/types.h>
-#include <osmocore/linuxlist.h>
+#include <stdint.h>
+#include <osmocom/core/linuxlist.h>
#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 <osmocore/utils.h>
-
-#define GSM_MACBLOCK_LEN 23
+#include <osmocom/gsm/sysinfo.h>
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 <openbsc/gsm_data.h>
#include <openbsc/gsm_subscriber.h>
-#include <osmocore/linuxlist.h>
+#include <osmocom/core/linuxlist.h>
#include <openbsc/gsm_04_11.h>
+#include <openbsc/mncc.h>
/* 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 <sys/types.h>
+#include <stdint.h>
/* 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 <stdint.h>
+#include <openbsc/gsm_data.h>
+#include <openbsc/mncc.h>
+
/* 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 <osmocore/msgb.h>
+#include <osmocom/core/msgb.h>
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