<p>Neels Hofmeyr has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/9481">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">dissolve libbsc: move all to src/osmo-bsc, link .o files<br><br>Move all of libbsc/ into osmo-bsc/, and separate/move some implementations to<br>allow linking from utils/* and ipaccess/* without pulling in unccessary<br>dependencies.<br><br>Some utilities use gsm_network and gsm_bts structs, which already include data<br>structures for fairly advanced uses. Move initialization that only osmo-bsc<br>needs into new bsc_network_init() and bsc_bts_alloc_register() functions, so<br>that the leaner tools can use the old gsm_* versions without the need to link<br>everything (e.g. handover and lchan alloc code).<br><br>In some instances, there need to be stubs if to cut off linking "just before<br>the RSL level" and prevent dependencies from creeping in.<br>- abis_rsl_rcvmsg(): the only program currently interpreting RSL messages is<br> osmo-bsc, the utils are merely concerned with OML, if at all.<br>- paging_flush_bts(): ip.access nanobts models call this when the RSL link is<br> dropped. Only osmo-bsc actually needs to do anything there.<br>- on_gsm_ts_init(): the mechanism to trigger timeslot initialization is related<br> to OML, while this action to take on init would pull in RSL dependencies.<br>utils/ and ipaccess/ each have a stubs.c file to implement these stubs. Tests<br>implement stubs inline where required.<br><br>From src/utils/, src/ipaccess/ and tests/*/, link in .o files from osmo-bsc/.<br>In order for this to work, the osmo-bsc subdir must be built before the other<br>source trees. (An alternative would be to include the .c files as sources, but<br>that would re-compile them in every source tree. Not a large burden really, but<br>unless linking .o files gives problems, let's have the quicker build.)<br><br>Minor obvious cleanups creep in with this patch, I will not bother to name them<br>individually now unless code review asks me to.<br><br>Rationale:<br><br>1) libbsc has been separate to use it for osmo-nitb and osmo-bsc in the old<br>openbsc.git. This is no longer required, and spreading over libbsc and osmo-bsc<br>is distracting.<br><br>2) Recently, ridiculous linking requirements have made adding new functions<br>cumbersome, because libbsc has started depending on osmo-bsc/*.c<br>implementations: on gscon FSM and bssap functions. For example, neither<br>bs11_config nor ipaccess-config nor bts_test need handover_cfg or BSSMAP<br>message composition. It makes no sense to link the entire osmo-bsc to it, nor<br>do we want to keep adding stubs to each linking realm.<br><br>Change-Id: I36a586726f5818121abe54d25654819fc451d3bf<br>---<br>M configure.ac<br>M include/osmocom/bsc/Makefile.am<br>M include/osmocom/bsc/bss.h<br>M include/osmocom/bsc/chan_alloc.h<br>D include/osmocom/bsc/common_bsc.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/Makefile.am<br>M src/ipaccess/Makefile.am<br>M src/ipaccess/ipaccess-config.c<br>A src/ipaccess/stubs.c<br>D src/libbsc/Makefile.am<br>D src/libbsc/bsc_init.c<br>D src/libbsc/net_init.c<br>M src/osmo-bsc/Makefile.am<br>R src/osmo-bsc/a_reset.c<br>A src/osmo-bsc/abis_bs11.c<br>R src/osmo-bsc/abis_nm.c<br>R src/osmo-bsc/abis_nm_ipaccess.c<br>R src/osmo-bsc/abis_nm_vty.c<br>R src/osmo-bsc/abis_om2000.c<br>R src/osmo-bsc/abis_om2000_vty.c<br>R src/osmo-bsc/abis_rsl.c<br>R src/osmo-bsc/acc_ramp.c<br>R src/osmo-bsc/arfcn_range_encode.c<br>R src/osmo-bsc/bsc_api.c<br>R src/osmo-bsc/bsc_ctrl_commands.c<br>R src/osmo-bsc/bsc_ctrl_lookup.c<br>R src/osmo-bsc/bsc_dyn_ts.c<br>A src/osmo-bsc/bsc_init.c<br>R src/osmo-bsc/bsc_rf_ctrl.c<br>R src/osmo-bsc/bsc_rll.c<br>R src/osmo-bsc/bsc_subscr_conn_fsm.c<br>R src/osmo-bsc/bsc_subscriber.c<br>R src/osmo-bsc/bsc_vty.c<br>R src/osmo-bsc/bts_ericsson_rbs2000.c<br>R src/osmo-bsc/bts_init.c<br>R src/osmo-bsc/bts_ipaccess_nanobts.c<br>R src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c<br>R src/osmo-bsc/bts_nokia_site.c<br>R src/osmo-bsc/bts_siemens_bs11.c<br>R src/osmo-bsc/bts_sysmobts.c<br>R src/osmo-bsc/bts_unknown.c<br>R src/osmo-bsc/chan_alloc.c<br>R src/osmo-bsc/e1_config.c<br>R src/osmo-bsc/gsm_04_08_utils.c<br>R src/osmo-bsc/gsm_04_80_utils.c<br>R src/osmo-bsc/gsm_data.c<br>R src/osmo-bsc/handover_cfg.c<br>R src/osmo-bsc/handover_decision.c<br>R src/osmo-bsc/handover_decision_2.c<br>R src/osmo-bsc/handover_logic.c<br>R src/osmo-bsc/handover_vty.c<br>R src/osmo-bsc/meas_feed.c<br>R src/osmo-bsc/meas_rep.c<br>A src/osmo-bsc/net_init.c<br>R src/osmo-bsc/osmo_bsc_lcls.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>R src/osmo-bsc/paging.c<br>R src/osmo-bsc/pcu_sock.c<br>R src/osmo-bsc/penalty_timers.c<br>R src/osmo-bsc/rest_octets.c<br>R src/osmo-bsc/system_information.c<br>M src/utils/Makefile.am<br>M src/utils/bs11_config.c<br>A src/utils/stubs.c<br>M tests/abis/Makefile.am<br>M tests/abis/abis_test.c<br>M tests/bsc/Makefile.am<br>M tests/bsc/bsc_test.c<br>M tests/bssap/Makefile.am<br>M tests/bssap/bssap_test.c<br>M tests/channel/Makefile.am<br>M tests/channel/channel_test.c<br>M tests/gsm0408/Makefile.am<br>M tests/gsm0408/gsm0408_test.c<br>M tests/handover/Makefile.am<br>M tests/handover/handover_test.c<br>M tests/nanobts_omlattr/Makefile.am<br>M tests/nanobts_omlattr/nanobts_omlattr_test.c<br>M tests/subscr/Makefile.am<br>80 files changed, 1,118 insertions(+), 935 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/81/9481/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index bcf890c..f07c756 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -168,7 +168,6 @@</span><br><span> include/osmocom/Makefile</span><br><span> include/osmocom/bsc/Makefile</span><br><span> src/Makefile</span><br><span style="color: hsl(0, 100%, 40%);">- src/libbsc/Makefile</span><br><span> src/libfilter/Makefile</span><br><span> src/osmo-bsc/Makefile</span><br><span> src/ipaccess/Makefile</span><br><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index 0987be9..5fa39eb 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -12,7 +12,6 @@</span><br><span> bss.h \</span><br><span> bts_ipaccess_nanobts_omlattr.h \</span><br><span> chan_alloc.h \</span><br><span style="color: hsl(0, 100%, 40%);">- common_bsc.h \</span><br><span> ctrl.h \</span><br><span> debug.h \</span><br><span> e1_config.h \</span><br><span>diff --git a/include/osmocom/bsc/bss.h b/include/osmocom/bsc/bss.h</span><br><span>index 9891f5f..ecb68d6 100644</span><br><span>--- a/include/osmocom/bsc/bss.h</span><br><span>+++ b/include/osmocom/bsc/bss.h</span><br><span>@@ -7,7 +7,6 @@</span><br><span> </span><br><span> /* start and stop network */</span><br><span> extern int bsc_network_alloc(void);</span><br><span style="color: hsl(0, 100%, 40%);">-extern int bsc_network_configure(const char *cfg_file);</span><br><span> extern int bsc_shutdown_net(struct gsm_network *net);</span><br><span> </span><br><span> /* register all supported BTS */</span><br><span>diff --git a/include/osmocom/bsc/chan_alloc.h b/include/osmocom/bsc/chan_alloc.h</span><br><span>index 98568a5..f3aec9d 100644</span><br><span>--- a/include/osmocom/bsc/chan_alloc.h</span><br><span>+++ b/include/osmocom/bsc/chan_alloc.h</span><br><span>@@ -45,7 +45,6 @@</span><br><span> void network_chan_load(struct pchan_load *pl, struct gsm_network *net);</span><br><span> void bts_update_t3122_chan_load(struct gsm_bts *bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool trx_is_usable(const struct gsm_bts_trx *trx);</span><br><span> bool ts_is_usable(const struct gsm_bts_trx_ts *ts);</span><br><span> </span><br><span> #endif /* _CHAN_ALLOC_H */</span><br><span>diff --git a/include/osmocom/bsc/common_bsc.h b/include/osmocom/bsc/common_bsc.h</span><br><span>deleted file mode 100644</span><br><span>index c23d20c..0000000</span><br><span>--- a/include/osmocom/bsc/common_bsc.h</span><br><span>+++ /dev/null</span><br><span>@@ -1,5 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-#pragma once</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdint.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_network *bsc_network_init(void *ctx);</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index b1fceb3..a8d1f92 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -997,6 +997,8 @@</span><br><span> };</span><br><span> </span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_network *gsm_network_init(void *ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num);</span><br><span> struct gsm_bts *gsm_bts_num(struct gsm_network *net, int num);</span><br><span> </span><br><span>@@ -1378,9 +1380,8 @@</span><br><span> struct gsm_subscriber_connection *msc_subscr_con_allocate(struct gsm_network *network);</span><br><span> void msc_subscr_con_free(struct gsm_subscriber_connection *conn);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net,</span><br><span style="color: hsl(0, 100%, 40%);">- enum gsm_bts_type type,</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t bsic);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *gsm_bts_alloc_register(struct gsm_network *net, enum gsm_bts_type type, uint8_t bsic);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *bsc_bts_alloc_register(struct gsm_network *net, enum gsm_bts_type type, uint8_t bsic);</span><br><span> </span><br><span> void set_ts_e1link(struct gsm_bts_trx_ts *ts, uint8_t e1_nr,</span><br><span> uint8_t e1_ts, uint8_t e1_ts_ss);</span><br><span>@@ -1418,4 +1419,8 @@</span><br><span> void gsm_trx_mark_all_ts_uninitialized(struct gsm_bts_trx *trx);</span><br><span> void gsm_bts_mark_all_ts_uninitialized(struct gsm_bts *bts);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+bool trx_is_usable(const struct gsm_bts_trx *trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #endif /* _GSM_DATA_H */</span><br><span>diff --git a/src/Makefile.am b/src/Makefile.am</span><br><span>index fc9bf8e..6c63eea 100644</span><br><span>--- a/src/Makefile.am</span><br><span>+++ b/src/Makefile.am</span><br><span>@@ -19,15 +19,9 @@</span><br><span> $(COVERAGE_LDFLAGS) \</span><br><span> $(NULL)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-# Libraries</span><br><span> SUBDIRS = \</span><br><span style="color: hsl(0, 100%, 40%);">- libbsc \</span><br><span> libfilter \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-# Programs</span><br><span style="color: hsl(0, 100%, 40%);">-SUBDIRS += \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo-bsc \</span><br><span> utils \</span><br><span> ipaccess \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo-bsc \</span><br><span> $(NULL)</span><br><span>diff --git a/src/ipaccess/Makefile.am b/src/ipaccess/Makefile.am</span><br><span>index 0f9045f..2c6282d 100644</span><br><span>--- a/src/ipaccess/Makefile.am</span><br><span>+++ b/src/ipaccess/Makefile.am</span><br><span>@@ -33,31 +33,37 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> abisip_find_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span> $(OSMO_LIBS) \</span><br><span> $(NULL)</span><br><span> </span><br><span> abisip_find_SOURCES = \</span><br><span> abisip-find.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ stubs.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> ipaccess_config_SOURCES = \</span><br><span> ipaccess-config.c \</span><br><span> ipaccess-firmware.c \</span><br><span> network_listen.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ stubs.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> # FIXME: resolve the bogus dependencies patched around here:</span><br><span> ipaccess_config_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span> $(OSMO_LIBS) \</span><br><span> $(NULL)</span><br><span> </span><br><span> ipaccess_proxy_SOURCES = \</span><br><span> ipaccess-proxy.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ stubs.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_srcdir)/src/osmo-bsc/gsm_data.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> ipaccess_proxy_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span> $(OSMO_LIBS) \</span><br><span> $(NULL)</span><br><span>diff --git a/src/ipaccess/ipaccess-config.c b/src/ipaccess/ipaccess-config.c</span><br><span>index 2236063..079bae2 100644</span><br><span>--- a/src/ipaccess/ipaccess-config.c</span><br><span>+++ b/src/ipaccess/ipaccess-config.c</span><br><span>@@ -39,7 +39,6 @@</span><br><span> #include <osmocom/core/select.h></span><br><span> #include <osmocom/core/timer.h></span><br><span> #include <osmocom/bsc/ipaccess.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> #include <osmocom/abis/e1_input.h></span><br><span> #include <osmocom/bsc/abis_nm.h></span><br><span> #include <osmocom/bsc/signal.h></span><br><span>@@ -54,6 +53,7 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/abis/abis.h></span><br><span> #include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bss.h></span><br><span> </span><br><span> struct gsm_network *bsc_gsmnet;</span><br><span> </span><br><span>@@ -873,8 +873,6 @@</span><br><span> print_value_string(&ipa_test_strs[0], ARRAY_SIZE(ipa_test_strs));</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-extern void bts_model_nanobts_init();</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static const struct log_info_cat log_categories[] = {</span><br><span> [DNM] = {</span><br><span> .name = "DNM",</span><br><span>@@ -898,6 +896,7 @@</span><br><span> int rc, option_index = 0, stream_id = 0xff;</span><br><span> </span><br><span> tall_ctx_config = talloc_named_const(NULL, 0, "ipaccess-config");</span><br><span style="color: hsl(120, 100%, 40%);">+ tall_bsc_ctx = tall_ctx_config;</span><br><span> msgb_talloc_ctx_init(tall_ctx_config, 0);</span><br><span> </span><br><span> osmo_init_logging2(tall_ctx_config, &log_info);</span><br><span>@@ -1034,7 +1033,7 @@</span><br><span> </span><br><span> libosmo_abis_init(tall_ctx_config);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bsc_gsmnet = bsc_network_init(tall_bsc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_gsmnet = gsm_network_init(tall_ctx_config);</span><br><span> if (!bsc_gsmnet)</span><br><span> exit(1);</span><br><span> </span><br><span>diff --git a/src/ipaccess/stubs.c b/src/ipaccess/stubs.c</span><br><span>new file mode 100644</span><br><span>index 0000000..c52d52b</span><br><span>--- /dev/null</span><br><span>+++ b/src/ipaccess/stubs.c</span><br><span>@@ -0,0 +1,43 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Stubs required for linking */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb;</span><br><span style="color: hsl(120, 100%, 40%);">+struct bsc_msc_data;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* No TS init required here. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_rsl_rcvmsg(struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* No RSL handling here */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void paging_flush_bts(struct gsm_bts *bts, struct bsc_msc_data *msc)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* No paging flushing */</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/libbsc/Makefile.am b/src/libbsc/Makefile.am</span><br><span>deleted file mode 100644</span><br><span>index 2e44729..0000000</span><br><span>--- a/src/libbsc/Makefile.am</span><br><span>+++ /dev/null</span><br><span>@@ -1,70 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CPPFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(all_includes) \</span><br><span style="color: hsl(0, 100%, 40%);">- -I$(top_srcdir)/include \</span><br><span style="color: hsl(0, 100%, 40%);">- -I$(top_builddir) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-AM_CFLAGS = \</span><br><span style="color: hsl(0, 100%, 40%);">- -Wall \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOCORE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOGSM_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOVTY_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOABIS_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOMGCP_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOSIGTRAN_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(COVERAGE_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOMGCPCLIENT_CFLAGS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-noinst_LIBRARIES = \</span><br><span style="color: hsl(0, 100%, 40%);">- libbsc.a \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-libbsc_a_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">- abis_nm.c \</span><br><span style="color: hsl(0, 100%, 40%);">- abis_nm_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">- abis_om2000.c \</span><br><span style="color: hsl(0, 100%, 40%);">- abis_om2000_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">- abis_rsl.c \</span><br><span style="color: hsl(0, 100%, 40%);">- a_reset.c \</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_rll.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscriber.c \</span><br><span style="color: hsl(0, 100%, 40%);">- paging.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_ericsson_rbs2000.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_ipaccess_nanobts.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_siemens_bs11.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_nokia_site.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_unknown.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_sysmobts.c \</span><br><span style="color: hsl(0, 100%, 40%);">- chan_alloc.c \</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_data.c \</span><br><span style="color: hsl(0, 100%, 40%);">- handover_decision.c \</span><br><span style="color: hsl(0, 100%, 40%);">- handover_logic.c \</span><br><span style="color: hsl(0, 100%, 40%);">- meas_rep.c \</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_sock.c \</span><br><span style="color: hsl(0, 100%, 40%);">- rest_octets.c \</span><br><span style="color: hsl(0, 100%, 40%);">- system_information.c \</span><br><span style="color: hsl(0, 100%, 40%);">- e1_config.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_api.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_04_08_utils.c \</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_04_80_utils.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_init.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_init.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_rf_ctrl.c \</span><br><span style="color: hsl(0, 100%, 40%);">- arfcn_range_encode.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_ctrl_commands.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_ctrl_lookup.c \</span><br><span style="color: hsl(0, 100%, 40%);">- net_init.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_dyn_ts.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bts_ipaccess_nanobts_omlattr.c \</span><br><span style="color: hsl(0, 100%, 40%);">- handover_vty.c \</span><br><span style="color: hsl(0, 100%, 40%);">- handover_cfg.c \</span><br><span style="color: hsl(0, 100%, 40%);">- penalty_timers.c \</span><br><span style="color: hsl(0, 100%, 40%);">- handover_decision_2.c \</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_subscr_conn_fsm.c \</span><br><span style="color: hsl(0, 100%, 40%);">- meas_feed.c \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_lcls.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(NULL)</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/libbsc/bsc_init.c b/src/libbsc/bsc_init.c</span><br><span>deleted file mode 100644</span><br><span>index 508a7f4..0000000</span><br><span>--- a/src/libbsc/bsc_init.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,591 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* A hackish minimal BSC (+MSC +HLR) implementation */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008-2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/abis_rsl.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/abis_nm.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/misdn.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/vty/ports.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/system_information.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/paging.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/signal.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/chan_alloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/core/talloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/ipaccess.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/gsm/sysinfo.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/e1_config.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/pcu_if.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <time.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <limits.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <stdbool.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Callback function for NACK on the OML NM */</span><br><span style="color: hsl(0, 100%, 40%);">-static int oml_msg_nack(struct nm_nack_signal_data *nack)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- if (nack->mt == NM_MT_GET_ATTR_NACK) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "BTS%u does not support Get Attributes "</span><br><span style="color: hsl(0, 100%, 40%);">- "OML message.\n", nack->bts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (nack->mt == NM_MT_SET_BTS_ATTR_NACK)</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "Failed to set BTS attributes. That is fatal. "</span><br><span style="color: hsl(0, 100%, 40%);">- "Was the bts type and frequency properly specified?\n");</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "Got %s NACK going to drop the OML links.\n",</span><br><span style="color: hsl(0, 100%, 40%);">- abis_nm_nack_name(nack->mt));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!nack->bts) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "Unknown bts. Can not drop it.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (is_ipaccess_bts(nack->bts))</span><br><span style="color: hsl(0, 100%, 40%);">- ipaccess_drop_oml(nack->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Callback function to be called every time we receive a signal from NM */</span><br><span style="color: hsl(0, 100%, 40%);">-static int nm_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span style="color: hsl(0, 100%, 40%);">- void *handler_data, void *signal_data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct nm_nack_signal_data *nack;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (signal) {</span><br><span style="color: hsl(0, 100%, 40%);">- case S_NM_NACK:</span><br><span style="color: hsl(0, 100%, 40%);">- nack = signal_data;</span><br><span style="color: hsl(0, 100%, 40%);">- return oml_msg_nack(nack);</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_shutdown_net(struct gsm_network *net)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(bts, &net->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_NOTICE, "shutting down OML for BTS %u\n", bts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_signal_dispatch(SS_L_GLOBAL, S_GLOBAL_BTS_CLOSE_OM, bts);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-unsigned long long bts_uptime(const struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct timespec tp;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!bts->uptime || !bts->oml_link) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "BTS %u OML link uptime unavailable\n", bts->nr);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "BTS %u uptime computation failure: %s\n", bts->nr, strerror(errno));</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* monotonic clock helps to ensure that the conversion is valid */</span><br><span style="color: hsl(0, 100%, 40%);">- return difftime(tp.tv_sec, bts->uptime);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i, int si_len)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc, j;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (si_len) {</span><br><span style="color: hsl(0, 100%, 40%);">- DEBUGP(DRR, "SI%s: %s\n", get_value_string(osmo_sitype_strs, i),</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_hexdump(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN));</span><br><span style="color: hsl(0, 100%, 40%);">- } else</span><br><span style="color: hsl(0, 100%, 40%);">- DEBUGP(DRR, "SI%s: OFF\n", get_value_string(osmo_sitype_strs, i));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (i) {</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_5:</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_5bis:</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_5ter:</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_6:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = rsl_sacch_filling(trx, osmo_sitype2rsl(i),</span><br><span style="color: hsl(0, 100%, 40%);">- si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case SYSINFO_TYPE_2quater:</span><br><span style="color: hsl(0, 100%, 40%);">- if (si_len == 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- rc = rsl_bcch_info(trx, i, NULL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- rc = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- for (j = 0; j <= bts->si2q_count; j++)</span><br><span style="color: hsl(0, 100%, 40%);">- rc = rsl_bcch_info(trx, i, (const uint8_t *)GSM_BTS_SI2Q(bts, j), GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- rc = rsl_bcch_info(trx, i, si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* set all system information types for a TRX */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int i, rc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t gen_si[_MAX_SYSINFO_TYPE], n_si = 0, n;</span><br><span style="color: hsl(0, 100%, 40%);">- int si_len[_MAX_SYSINFO_TYPE];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.cell_sel_par.ms_txpwr_max_ccch =</span><br><span style="color: hsl(0, 100%, 40%);">- ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.cell_sel_par.neci = bts->network->neci;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Zero/forget the state of the dynamically computed SIs, leeping the static ones */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_valid = bts->si_mode_static;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* First, we determine which of the SI messages we actually need */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (trx == bts->c0) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* 1...4 are always present on a C0 TRX */</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_1;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_2;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_2bis;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_2ter;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_2quater;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_3;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_4;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* 13 is always present on a C0 TRX of a GPRS BTS */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->gprs.mode != BTS_GPRS_NONE)</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_13;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* 5 and 6 are always present on every TRX */</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_5;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_5bis;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_5ter;</span><br><span style="color: hsl(0, 100%, 40%);">- gen_si[n_si++] = SYSINFO_TYPE_6;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Second, we generate the selected SI via RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(0, 100%, 40%);">- i = gen_si[n];</span><br><span style="color: hsl(0, 100%, 40%);">- /* Only generate SI if this SI is not in "static" (user-defined) mode */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!(bts->si_mode_static & (1 << i))) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* Set SI as being valid. gsm_generate_si() might unset</span><br><span style="color: hsl(0, 100%, 40%);">- * it, if SI is not required. */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_valid |= (1 << i);</span><br><span style="color: hsl(0, 100%, 40%);">- rc = gsm_generate_si(bts, i);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- goto err_out;</span><br><span style="color: hsl(0, 100%, 40%);">- si_len[i] = rc;</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- if (i == SYSINFO_TYPE_5 || i == SYSINFO_TYPE_5bis</span><br><span style="color: hsl(0, 100%, 40%);">- || i == SYSINFO_TYPE_5ter)</span><br><span style="color: hsl(0, 100%, 40%);">- si_len[i] = 18;</span><br><span style="color: hsl(0, 100%, 40%);">- else if (i == SYSINFO_TYPE_6)</span><br><span style="color: hsl(0, 100%, 40%);">- si_len[i] = 11;</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- si_len[i] = 23;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Third, we send the selected SI via RSL */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(0, 100%, 40%);">- i = gen_si[n];</span><br><span style="color: hsl(0, 100%, 40%);">- /* if we don't currently have this SI, we send a zero-length</span><br><span style="color: hsl(0, 100%, 40%);">- * RSL BCCH FILLING / SACCH FILLING * in order to deactivate</span><br><span style="color: hsl(0, 100%, 40%);">- * the SI, in case it might have previously been active */</span><br><span style="color: hsl(0, 100%, 40%);">- if (!GSM_BTS_HAS_SI(bts, i))</span><br><span style="color: hsl(0, 100%, 40%);">- rc = rsl_si(trx, i, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- rc = rsl_si(trx, i, si_len[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Make sure the PCU is aware (in case anything GPRS related has</span><br><span style="color: hsl(0, 100%, 40%);">- * changed in SI */</span><br><span style="color: hsl(0, 100%, 40%);">- pcu_info_update(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-err_out:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DRR, LOGL_ERROR, "Cannot generate SI%s for BTS %u: error <%s>, "</span><br><span style="color: hsl(0, 100%, 40%);">- "most likely a problem with neighbor cell list generation\n",</span><br><span style="color: hsl(0, 100%, 40%);">- get_value_string(osmo_sitype_strs, i), bts->nr, strerror(-rc));</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* set all system information types for a BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-int gsm_bts_set_system_infos(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Generate a new ID */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->bcch_change_mark += 1;</span><br><span style="color: hsl(0, 100%, 40%);">- bts->bcch_change_mark %= 0x7;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = gsm_bts_trx_set_system_infos(trx);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc != 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Produce a MA as specified in 10.5.2.21 */</span><br><span style="color: hsl(0, 100%, 40%);">-static int generate_ma_for_ts(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* we have three bitvecs: the per-timeslot ARFCNs, the cell chan ARFCNs</span><br><span style="color: hsl(0, 100%, 40%);">- * and the MA */</span><br><span style="color: hsl(0, 100%, 40%);">- struct bitvec *cell_chan = &ts->trx->bts->si_common.cell_alloc;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bitvec *ts_arfcn = &ts->hopping.arfcns;</span><br><span style="color: hsl(0, 100%, 40%);">- struct bitvec *ma = &ts->hopping.ma;</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int num_cell_arfcns, bitnum, n_chan;</span><br><span style="color: hsl(0, 100%, 40%);">- int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* re-set the MA to all-zero */</span><br><span style="color: hsl(0, 100%, 40%);">- ma->cur_bit = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- ts->hopping.ma_len = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- memset(ma->data, 0, ma->data_len);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!ts->hopping.enabled)</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* count the number of ARFCNs in the cell channel allocation */</span><br><span style="color: hsl(0, 100%, 40%);">- num_cell_arfcns = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < 1024; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (bitvec_get_bit_pos(cell_chan, i))</span><br><span style="color: hsl(0, 100%, 40%);">- num_cell_arfcns++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* pad it to octet-aligned number of bits */</span><br><span style="color: hsl(0, 100%, 40%);">- ts->hopping.ma_len = num_cell_arfcns / 8;</span><br><span style="color: hsl(0, 100%, 40%);">- if (num_cell_arfcns % 8)</span><br><span style="color: hsl(0, 100%, 40%);">- ts->hopping.ma_len++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- n_chan = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < 1024; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!bitvec_get_bit_pos(cell_chan, i))</span><br><span style="color: hsl(0, 100%, 40%);">- continue;</span><br><span style="color: hsl(0, 100%, 40%);">- /* set the corresponding bit in the MA */</span><br><span style="color: hsl(0, 100%, 40%);">- bitnum = (ts->hopping.ma_len * 8) - 1 - n_chan;</span><br><span style="color: hsl(0, 100%, 40%);">- if (bitvec_get_bit_pos(ts_arfcn, i))</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_set_bit_pos(ma, bitnum, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_set_bit_pos(ma, bitnum, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- n_chan++;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* ARFCN 0 is special: It is coded last in the bitmask */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bitvec_get_bit_pos(cell_chan, 0)) {</span><br><span style="color: hsl(0, 100%, 40%);">- n_chan++;</span><br><span style="color: hsl(0, 100%, 40%);">- /* set the corresponding bit in the MA */</span><br><span style="color: hsl(0, 100%, 40%);">- bitnum = (ts->hopping.ma_len * 8) - 1 - n_chan;</span><br><span style="color: hsl(0, 100%, 40%);">- if (bitvec_get_bit_pos(ts_arfcn, 0))</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_set_bit_pos(ma, bitnum, 1);</span><br><span style="color: hsl(0, 100%, 40%);">- else</span><br><span style="color: hsl(0, 100%, 40%);">- bitvec_set_bit_pos(ma, bitnum, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void bootstrap_rsl(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- unsigned int i;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DRSL, LOGL_NOTICE, "bootstrapping RSL for BTS/TRX (%u/%u) "</span><br><span style="color: hsl(0, 100%, 40%);">- "on ARFCN %u using MCC-MNC %s LAC=%u CID=%u BSIC=%u\n",</span><br><span style="color: hsl(0, 100%, 40%);">- trx->bts->nr, trx->nr, trx->arfcn,</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_plmn_name(&bsc_gsmnet->plmn),</span><br><span style="color: hsl(0, 100%, 40%);">- trx->bts->location_area_code,</span><br><span style="color: hsl(0, 100%, 40%);">- trx->bts->cell_identity, trx->bts->bsic);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (trx->bts->type == GSM_BTS_TYPE_NOKIA_SITE) {</span><br><span style="color: hsl(0, 100%, 40%);">- rsl_nokia_si_begin(trx);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * Trigger ACC ramping before sending system information to BTS.</span><br><span style="color: hsl(0, 100%, 40%);">- * This ensures that RACH control in system information is configured correctly.</span><br><span style="color: hsl(0, 100%, 40%);">- * TRX 0 should be usable and unlocked, otherwise starting ACC ramping is pointless.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- if (trx_is_usable(trx) && trx->mo.nm_state.administrative == NM_STATE_UNLOCKED)</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_trigger(&trx->bts->acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_trx_set_system_infos(trx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (trx->bts->type == GSM_BTS_TYPE_NOKIA_SITE) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* channel unspecific, power reduction in 2 dB steps */</span><br><span style="color: hsl(0, 100%, 40%);">- rsl_bs_power_control(trx, 0xFF, trx->max_power_red / 2);</span><br><span style="color: hsl(0, 100%, 40%);">- rsl_nokia_si_end(trx);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(0, 100%, 40%);">- generate_ma_for_ts(ts);</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_ts_check_init(ts);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Callback function to be called every time we receive a signal from INPUT */</span><br><span style="color: hsl(0, 100%, 40%);">-static int inp_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span style="color: hsl(0, 100%, 40%);">- void *handler_data, void *signal_data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct input_signal_data *isd = signal_data;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx *trx = isd->trx;</span><br><span style="color: hsl(0, 100%, 40%);">- int ts_no, lchan_no;</span><br><span style="color: hsl(0, 100%, 40%);">- /* N. B: we rely on attribute order when parsing response in abis_nm_rx_get_attr_resp() */</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t bts_attr[] = { NM_ATT_MANUF_ID, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(0, 100%, 40%);">- const uint8_t trx_attr[] = { NM_ATT_MANUF_STATE, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* we should not request more attributes than we're ready to handle */</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(sizeof(bts_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(sizeof(trx_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (subsys != SS_L_INPUT)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMI, LOGL_DEBUG, "%s(): Input signal '%s' received\n", __func__,</span><br><span style="color: hsl(0, 100%, 40%);">- get_value_string(e1inp_signal_names, signal));</span><br><span style="color: hsl(0, 100%, 40%);">- switch (signal) {</span><br><span style="color: hsl(0, 100%, 40%);">- case S_L_INP_TEI_UP:</span><br><span style="color: hsl(0, 100%, 40%);">- if (isd->link_type == E1INP_SIGN_OML) {</span><br><span style="color: hsl(0, 100%, 40%);">- /* TODO: this is required for the Nokia BTS, hopping is configured</span><br><span style="color: hsl(0, 100%, 40%);">- during OML, other MA is not set. */</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx *cur_trx;</span><br><span style="color: hsl(0, 100%, 40%);">- /* was static in system_information.c */</span><br><span style="color: hsl(0, 100%, 40%);">- extern int generate_cell_chan_list(uint8_t *chan_list, struct gsm_bts *bts);</span><br><span style="color: hsl(0, 100%, 40%);">- uint8_t ca[20];</span><br><span style="color: hsl(0, 100%, 40%);">- /* has to be called before generate_ma_for_ts to</span><br><span style="color: hsl(0, 100%, 40%);">- set bts->si_common.cell_alloc */</span><br><span style="color: hsl(0, 100%, 40%);">- generate_cell_chan_list(ca, trx->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Request generic BTS-level attributes */</span><br><span style="color: hsl(0, 100%, 40%);">- abis_nm_get_attr(trx->bts, NM_OC_BTS, 0xFF, 0xFF, 0xFF, bts_attr, sizeof(bts_attr));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(cur_trx, &trx->bts->trx_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- int i;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Request TRX-level attributes */</span><br><span style="color: hsl(0, 100%, 40%);">- abis_nm_get_attr(cur_trx->bts, NM_OC_BASEB_TRANSC, 0, cur_trx->nr, 0xFF,</span><br><span style="color: hsl(0, 100%, 40%);">- trx_attr, sizeof(trx_attr));</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < ARRAY_SIZE(cur_trx->ts); i++)</span><br><span style="color: hsl(0, 100%, 40%);">- generate_ma_for_ts(&cur_trx->ts[i]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- if (isd->link_type == E1INP_SIGN_RSL)</span><br><span style="color: hsl(0, 100%, 40%);">- bootstrap_rsl(trx);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case S_L_INP_TEI_DN:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DLMI, LOGL_ERROR, "Lost some E1 TEI link: %d %p\n", isd->link_type, trx);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (isd->link_type == E1INP_SIGN_OML)</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_OML_FAIL]);</span><br><span style="color: hsl(0, 100%, 40%);">- else if (isd->link_type == E1INP_SIGN_RSL) {</span><br><span style="color: hsl(0, 100%, 40%);">- rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_RSL_FAIL]);</span><br><span style="color: hsl(0, 100%, 40%);">- acc_ramp_abort(&trx->bts->acc_ramp);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * free all allocated channels. change the nm_state so the</span><br><span style="color: hsl(0, 100%, 40%);">- * trx and trx_ts becomes unusable and chan_alloc.c can not</span><br><span style="color: hsl(0, 100%, 40%);">- * allocate from it.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- for (ts_no = 0; ts_no < ARRAY_SIZE(trx->ts); ++ts_no) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx_ts *ts = &trx->ts[ts_no];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (lchan_no = 0; lchan_no < ARRAY_SIZE(ts->lchan); ++lchan_no) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (ts->lchan[lchan_no].state != LCHAN_S_NONE)</span><br><span style="color: hsl(0, 100%, 40%);">- lchan_free(&ts->lchan[lchan_no]);</span><br><span style="color: hsl(0, 100%, 40%);">- lchan_reset(&ts->lchan[lchan_no]);</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_mo_reset(trx->bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- abis_nm_clear_queue(trx->bts);</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static int bootstrap_bts(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int i, n;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (!bts->model)</span><br><span style="color: hsl(0, 100%, 40%);">- return -EFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->model->start && !bts->model->started) {</span><br><span style="color: hsl(0, 100%, 40%);">- int ret = bts->model->start(bts->network);</span><br><span style="color: hsl(0, 100%, 40%);">- if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return ret;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->model->started = true;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: What about secondary TRX of a BTS? What about a BTS that has TRX</span><br><span style="color: hsl(0, 100%, 40%);">- * in different bands? Why is 'band' a parameter of the BTS and not of the TRX? */</span><br><span style="color: hsl(0, 100%, 40%);">- switch (bts->band) {</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BAND_1800:</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->c0->arfcn < 512 || bts->c0->arfcn > 885) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "GSM1800 channel must be between 512-885.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BAND_1900:</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->c0->arfcn < 512 || bts->c0->arfcn > 810) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "GSM1900 channel must be between 512-810.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BAND_900:</span><br><span style="color: hsl(0, 100%, 40%);">- if ((bts->c0->arfcn > 124 && bts->c0->arfcn < 955) ||</span><br><span style="color: hsl(0, 100%, 40%);">- bts->c0->arfcn > 1023) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "GSM900 channel must be between 0-124, 955-1023.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case GSM_BAND_850:</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->c0->arfcn < 128 || bts->c0->arfcn > 251) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "GSM850 channel must be between 128-251.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "Unsupported frequency band.\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Control Channel Description is set from vty/config */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* T3212 is set from vty/config */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Set ccch config by looking at ts config */</span><br><span style="color: hsl(0, 100%, 40%);">- for (n=0, i=0; i<8; i++)</span><br><span style="color: hsl(0, 100%, 40%);">- n += bts->c0->ts[i].pchan == GSM_PCHAN_CCCH ? 1 : 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Indicate R99 MSC in SI3 */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.mscr = 1;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- switch (n) {</span><br><span style="color: hsl(0, 100%, 40%);">- case 0:</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;</span><br><span style="color: hsl(0, 100%, 40%);">- /* Limit reserved block to 2 on combined channel according to</span><br><span style="color: hsl(0, 100%, 40%);">- 3GPP TS 44.018 Table 10.5.2.11.1 */</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->si_common.chan_desc.bs_ag_blks_res > 2) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_NOTICE, "CCCH is combined with SDCCHs, "</span><br><span style="color: hsl(0, 100%, 40%);">- "reducing BS-AG-BLKS-RES value %d -> 2\n",</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.bs_ag_blks_res);</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.bs_ag_blks_res = 2;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 1:</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_NC;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 2:</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_2_NC;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 3:</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_3_NC;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- case 4:</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_4_NC;</span><br><span style="color: hsl(0, 100%, 40%);">- break;</span><br><span style="color: hsl(0, 100%, 40%);">- default:</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_ERROR, "Unsupported CCCH timeslot configuration\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.cell_options.pwrc = 0; /* PWRC not set */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.cell_sel_par.acs = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->si_common.ncc_permitted = 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- bts->chan_load_samples_idx = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* ACC ramping is initialized from vty/config */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Initialize the BTS state */</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_bts_mo_reset(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_network_alloc(void)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* initialize our data structures */</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_gsmnet = bsc_network_init(tall_bsc_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!bsc_gsmnet)</span><br><span style="color: hsl(0, 100%, 40%);">- return -ENOMEM;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-int bsc_network_configure(const char *config_file)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- rc = vty_read_config_file(config_file, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_FATAL, "Failed to parse the config file: '%s'\n", config_file);</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* start telnet after reading config for vty_get_bind_addr() */</span><br><span style="color: hsl(0, 100%, 40%);">- rc = telnet_init_dynif(tall_bsc_ctx, bsc_gsmnet, vty_get_bind_addr(),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VTY_PORT_NITB_BSC);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0)</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_signal_register_handler(SS_NM, nm_sig_cb, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span style="color: hsl(0, 100%, 40%);">- rc = bootstrap_bts(bts);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_FATAL, "Error bootstrapping BTS\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- rc = e1_reconfig_bts(bts);</span><br><span style="color: hsl(0, 100%, 40%);">- if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">- LOGP(DNM, LOGL_FATAL, "Error enabling E1 input driver\n");</span><br><span style="color: hsl(0, 100%, 40%);">- return rc;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libbsc/net_init.c b/src/libbsc/net_init.c</span><br><span>deleted file mode 100644</span><br><span>index f03a2e1..0000000</span><br><span>--- a/src/libbsc/net_init.c</span><br><span>+++ /dev/null</span><br><span>@@ -1,117 +0,0 @@</span><br><span style="color: hsl(0, 100%, 40%);">-/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * All Rights Reserved</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(0, 100%, 40%);">- * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(0, 100%, 40%);">- * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(0, 100%, 40%);">- * (at your option) any later version.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(0, 100%, 40%);">- * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(0, 100%, 40%);">- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(0, 100%, 40%);">- * GNU Affero General Public License for more details.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(0, 100%, 40%);">- * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(0, 100%, 40%);">- *</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/osmo_bsc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/bsc_msc_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/gsm_04_08_utils.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/handover_cfg.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/chan_alloc.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* XXX hard-coded for now */</span><br><span style="color: hsl(0, 100%, 40%);">-#define T3122_CHAN_LOAD_SAMPLE_INTERVAL 1 /* in seconds */</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void update_t3122_chan_load_timer(void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_network *net = data;</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(bts, &net->bts_list, list)</span><br><span style="color: hsl(0, 100%, 40%);">- bts_update_t3122_chan_load(bts);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Keep this timer ticking. */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&net->t3122_chan_load_timer, T3122_CHAN_LOAD_SAMPLE_INTERVAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_network *bsc_network_init(void *ctx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_network *net;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net = talloc_zero(ctx, struct gsm_network);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!net)</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net->plmn = (struct osmo_plmn_id){</span><br><span style="color: hsl(0, 100%, 40%);">- .mcc = 1,</span><br><span style="color: hsl(0, 100%, 40%);">- .mnc = 1,</span><br><span style="color: hsl(0, 100%, 40%);">- };</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net->dyn_ts_allow_tch_f = true;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Permit a compile-time default of A5/3 and A5/1 */</span><br><span style="color: hsl(0, 100%, 40%);">- net->a5_encryption_mask = (1 << 3) | (1 << 1);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Use 30 min periodic update interval as sane default */</span><br><span style="color: hsl(0, 100%, 40%);">- net->t3212 = 5;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(&net->subscr_conns);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net->bsc_subscribers = talloc_zero(net, struct llist_head);</span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(net->bsc_subscribers);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net->bsc_data = talloc_zero(net, struct osmo_bsc_data);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!net->bsc_data) {</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(net);</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Init back pointer */</span><br><span style="color: hsl(0, 100%, 40%);">- net->bsc_data->auto_off_timeout = -1;</span><br><span style="color: hsl(0, 100%, 40%);">- net->bsc_data->network = net;</span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(&net->bsc_data->mscs);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net->num_bts = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3101 = GSM_T3101_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3103 = GSM_T3103_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3105 = GSM_T3105_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3107 = GSM_T3107_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3109 = GSM_T3109_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3111 = GSM_T3111_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3113 = GSM_T3113_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3115 = GSM_T3115_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3117 = GSM_T3117_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3119 = GSM_T3119_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3122 = GSM_T3122_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">- net->T3141 = GSM_T3141_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- net->ho = ho_cfg_init(net, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- net->hodec2.congestion_check_interval_s = HO_CFG_CONGESTION_CHECK_DEFAULT;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- INIT_LLIST_HEAD(&net->bts_list);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /*</span><br><span style="color: hsl(0, 100%, 40%);">- * At present all BTS in the network share one channel load timeout.</span><br><span style="color: hsl(0, 100%, 40%);">- * If this becomes a problem for networks with a lot of BTS, this</span><br><span style="color: hsl(0, 100%, 40%);">- * code could be refactored to run the timeout individually per BTS.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_setup(&net->t3122_chan_load_timer, update_t3122_chan_load_timer, net);</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_timer_schedule(&net->t3122_chan_load_timer, T3122_CHAN_LOAD_SAMPLE_INTERVAL, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* init statistics */</span><br><span style="color: hsl(0, 100%, 40%);">- net->bsc_ctrs = rate_ctr_group_alloc(net, &bsc_ctrg_desc, 0);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!net->bsc_ctrs) {</span><br><span style="color: hsl(0, 100%, 40%);">- talloc_free(net);</span><br><span style="color: hsl(0, 100%, 40%);">- return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_net_update_ctype(net);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return net;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index cc96743..a459a92 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -26,21 +26,65 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> osmo_bsc_SOURCES = \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_main.c \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ a_reset.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_nm.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_nm_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_om2000.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_om2000_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_rsl.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ arfcn_range_encode.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_api.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_ctrl_commands.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_ctrl_lookup.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_dyn_ts.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_init.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_rf_ctrl.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_rll.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscr_conn_fsm.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_subscriber.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_ericsson_rbs2000.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_init.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_ipaccess_nanobts.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_ipaccess_nanobts_omlattr.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_nokia_site.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_siemens_bs11.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_sysmobts.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_unknown.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ chan_alloc.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ e1_config.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_04_08_utils.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_04_80_utils.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_data.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ handover_cfg.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ handover_decision.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ handover_decision_2.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ handover_logic.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ handover_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ meas_feed.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ meas_rep.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ net_init.c \</span><br><span> osmo_bsc_api.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_audio.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_bssap.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_ctrl.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_filter.c \</span><br><span> osmo_bsc_grace.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_lcls.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_main.c \</span><br><span> osmo_bsc_msc.c \</span><br><span> osmo_bsc_sigtran.c \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_filter.c \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_bssap.c \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_audio.c \</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_ctrl.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_bsc_vty.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ paging.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_sock.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ penalty_timers.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ rest_octets.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ system_information.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> osmo_bsc_LDADD = \</span><br><span> $(top_builddir)/src/libfilter/libfilter.a \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOVTY_LIBS) \</span><br><span>diff --git a/src/libbsc/a_reset.c b/src/osmo-bsc/a_reset.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/a_reset.c</span><br><span>rename to src/osmo-bsc/a_reset.c</span><br><span>diff --git a/src/osmo-bsc/abis_bs11.c b/src/osmo-bsc/abis_bs11.c</span><br><span>new file mode 100644</span><br><span>index 0000000..8b721fa</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/abis_bs11.c</span><br><span>@@ -0,0 +1,21 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Siemens BS11 specific Abis implementations */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2008-2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>diff --git a/src/libbsc/abis_nm.c b/src/osmo-bsc/abis_nm.c</span><br><span>similarity index 99%</span><br><span>rename from src/libbsc/abis_nm.c</span><br><span>rename to src/osmo-bsc/abis_nm.c</span><br><span>index ea94d37..9dc1f62 100644</span><br><span>--- a/src/libbsc/abis_nm.c</span><br><span>+++ b/src/osmo-bsc/abis_nm.c</span><br><span>@@ -164,13 +164,6 @@</span><br><span> </span><br><span> static int abis_nm_rcvmsg_sw(struct msgb *mb);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool nm_is_running(const struct gsm_nm_state *s) {</span><br><span style="color: hsl(0, 100%, 40%);">- return (s->operational == NM_OPSTATE_ENABLED) && (</span><br><span style="color: hsl(0, 100%, 40%);">- (s->availability == NM_AVSTATE_OK) ||</span><br><span style="color: hsl(0, 100%, 40%);">- (s->availability == 0xff)</span><br><span style="color: hsl(0, 100%, 40%);">- );</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Update the administrative state of a given object in our in-memory data</span><br><span> * structures and send an event to the higher layer */</span><br><span> static int update_admstate(struct gsm_bts *bts, uint8_t obj_class,</span><br><span>diff --git a/src/libbsc/abis_nm_ipaccess.c b/src/osmo-bsc/abis_nm_ipaccess.c</span><br><span>similarity index 98%</span><br><span>rename from src/libbsc/abis_nm_ipaccess.c</span><br><span>rename to src/osmo-bsc/abis_nm_ipaccess.c</span><br><span>index b822538..964b92e 100644</span><br><span>--- a/src/libbsc/abis_nm_ipaccess.c</span><br><span>+++ b/src/osmo-bsc/abis_nm_ipaccess.c</span><br><span>@@ -20,6 +20,8 @@</span><br><span> *</span><br><span> */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* A list of all the 'embedded' attributes of ip.access */</span><br><span> enum ipa_embedded_att {</span><br><span> IPA_ATT_ARFCN_WHITELIST = 0x01,</span><br><span>diff --git a/src/libbsc/abis_nm_vty.c b/src/osmo-bsc/abis_nm_vty.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/abis_nm_vty.c</span><br><span>rename to src/osmo-bsc/abis_nm_vty.c</span><br><span>diff --git a/src/libbsc/abis_om2000.c b/src/osmo-bsc/abis_om2000.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/abis_om2000.c</span><br><span>rename to src/osmo-bsc/abis_om2000.c</span><br><span>diff --git a/src/libbsc/abis_om2000_vty.c b/src/osmo-bsc/abis_om2000_vty.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/abis_om2000_vty.c</span><br><span>rename to src/osmo-bsc/abis_om2000_vty.c</span><br><span>diff --git a/src/libbsc/abis_rsl.c b/src/osmo-bsc/abis_rsl.c</span><br><span>similarity index 98%</span><br><span>rename from src/libbsc/abis_rsl.c</span><br><span>rename to src/osmo-bsc/abis_rsl.c</span><br><span>index 48cc39f..7bbde47 100644</span><br><span>--- a/src/libbsc/abis_rsl.c</span><br><span>+++ b/src/osmo-bsc/abis_rsl.c</span><br><span>@@ -3033,38 +3033,8 @@</span><br><span> }</span><br><span> </span><br><span> /* Initial timeslot actions when a timeslot first comes into operation. */</span><br><span style="color: hsl(0, 100%, 40%);">-static bool gsm_ts_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)</span><br><span> {</span><br><span> dyn_ts_init(ts);</span><br><span> return true;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Trigger initial timeslot actions iff both OML and RSL are setup. */</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_ts_check_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts *bts = ts->trx->bts;</span><br><span style="color: hsl(0, 100%, 40%);">- if (bts->model->oml_is_ts_ready</span><br><span style="color: hsl(0, 100%, 40%);">- && !bts->model->oml_is_ts_ready(ts))</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- if (!ts->trx->rsl_link)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- if (ts->initialized)</span><br><span style="color: hsl(0, 100%, 40%);">- return;</span><br><span style="color: hsl(0, 100%, 40%);">- ts->initialized = gsm_ts_init(ts);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_trx_mark_all_ts_uninitialized(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- int i;</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(0, 100%, 40%);">- ts->initialized = false;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm_bts_mark_all_ts_uninitialized(struct gsm_bts *bts)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">- llist_for_each_entry(trx, &bts->trx_list, list)</span><br><span style="color: hsl(0, 100%, 40%);">- gsm_trx_mark_all_ts_uninitialized(trx);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/libbsc/acc_ramp.c b/src/osmo-bsc/acc_ramp.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/acc_ramp.c</span><br><span>rename to src/osmo-bsc/acc_ramp.c</span><br><span>diff --git a/src/libbsc/arfcn_range_encode.c b/src/osmo-bsc/arfcn_range_encode.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/arfcn_range_encode.c</span><br><span>rename to src/osmo-bsc/arfcn_range_encode.c</span><br><span>diff --git a/src/libbsc/bsc_api.c b/src/osmo-bsc/bsc_api.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_api.c</span><br><span>rename to src/osmo-bsc/bsc_api.c</span><br><span>diff --git a/src/libbsc/bsc_ctrl_commands.c b/src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_ctrl_commands.c</span><br><span>rename to src/osmo-bsc/bsc_ctrl_commands.c</span><br><span>diff --git a/src/libbsc/bsc_ctrl_lookup.c b/src/osmo-bsc/bsc_ctrl_lookup.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_ctrl_lookup.c</span><br><span>rename to src/osmo-bsc/bsc_ctrl_lookup.c</span><br><span>diff --git a/src/libbsc/bsc_dyn_ts.c b/src/osmo-bsc/bsc_dyn_ts.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_dyn_ts.c</span><br><span>rename to src/osmo-bsc/bsc_dyn_ts.c</span><br><span>diff --git a/src/osmo-bsc/bsc_init.c b/src/osmo-bsc/bsc_init.c</span><br><span>new file mode 100644</span><br><span>index 0000000..b6bd410</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/bsc_init.c</span><br><span>@@ -0,0 +1,288 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* A hackish minimal BSC (+MSC +HLR) implementation */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2008-2018 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2009 by Holger Hans Peter Freyther <zecke@selfish.org></span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/gsm_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_rsl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/debug.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/misdn.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/system_information.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/paging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/signal.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/chan_alloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/talloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/ipaccess.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/sysinfo.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/pcu_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_msc_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/handover_cfg.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_04_08_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <time.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <limits.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_shutdown_net(struct gsm_network *net)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(bts, &net->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_NOTICE, "shutting down OML for BTS %u\n", bts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_signal_dispatch(SS_L_GLOBAL, S_GLOBAL_BTS_CLOSE_OM, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+unsigned long long bts_uptime(const struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct timespec tp;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bts->uptime || !bts->oml_link) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "BTS %u OML link uptime unavailable\n", bts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (clock_gettime(CLOCK_MONOTONIC, &tp) != 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "BTS %u uptime computation failure: %s\n", bts->nr, strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* monotonic clock helps to ensure that the conversion is valid */</span><br><span style="color: hsl(120, 100%, 40%);">+ return difftime(tp.tv_sec, bts->uptime);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int rsl_si(struct gsm_bts_trx *trx, enum osmo_sysinfo_type i, int si_len)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc, j;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (si_len) {</span><br><span style="color: hsl(120, 100%, 40%);">+ DEBUGP(DRR, "SI%s: %s\n", get_value_string(osmo_sitype_strs, i),</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_hexdump(GSM_BTS_SI(bts, i), GSM_MACBLOCK_LEN));</span><br><span style="color: hsl(120, 100%, 40%);">+ } else</span><br><span style="color: hsl(120, 100%, 40%);">+ DEBUGP(DRR, "SI%s: OFF\n", get_value_string(osmo_sitype_strs, i));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (i) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case SYSINFO_TYPE_5:</span><br><span style="color: hsl(120, 100%, 40%);">+ case SYSINFO_TYPE_5bis:</span><br><span style="color: hsl(120, 100%, 40%);">+ case SYSINFO_TYPE_5ter:</span><br><span style="color: hsl(120, 100%, 40%);">+ case SYSINFO_TYPE_6:</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = rsl_sacch_filling(trx, osmo_sitype2rsl(i),</span><br><span style="color: hsl(120, 100%, 40%);">+ si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case SYSINFO_TYPE_2quater:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (si_len == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = rsl_bcch_info(trx, i, NULL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (j = 0; j <= bts->si2q_count; j++)</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = rsl_bcch_info(trx, i, (const uint8_t *)GSM_BTS_SI2Q(bts, j), GSM_MACBLOCK_LEN);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = rsl_bcch_info(trx, i, si_len ? GSM_BTS_SI(bts, i) : NULL, si_len);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* set all system information types for a TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_trx_set_system_infos(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i, rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t gen_si[_MAX_SYSINFO_TYPE], n_si = 0, n;</span><br><span style="color: hsl(120, 100%, 40%);">+ int si_len[_MAX_SYSINFO_TYPE];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.cell_sel_par.ms_txpwr_max_ccch =</span><br><span style="color: hsl(120, 100%, 40%);">+ ms_pwr_ctl_lvl(bts->band, bts->ms_max_power);</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.cell_sel_par.neci = bts->network->neci;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Zero/forget the state of the dynamically computed SIs, leeping the static ones */</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_valid = bts->si_mode_static;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* First, we determine which of the SI messages we actually need */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx == bts->c0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 1...4 are always present on a C0 TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_1;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_2;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_2bis;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_2ter;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_2quater;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_3;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_4;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 13 is always present on a C0 TRX of a GPRS BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->gprs.mode != BTS_GPRS_NONE)</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_13;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* 5 and 6 are always present on every TRX */</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_5;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_5bis;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_5ter;</span><br><span style="color: hsl(120, 100%, 40%);">+ gen_si[n_si++] = SYSINFO_TYPE_6;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Second, we generate the selected SI via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ i = gen_si[n];</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Only generate SI if this SI is not in "static" (user-defined) mode */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!(bts->si_mode_static & (1 << i))) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set SI as being valid. gsm_generate_si() might unset</span><br><span style="color: hsl(120, 100%, 40%);">+ * it, if SI is not required. */</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_valid |= (1 << i);</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gsm_generate_si(bts, i);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ goto err_out;</span><br><span style="color: hsl(120, 100%, 40%);">+ si_len[i] = rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (i == SYSINFO_TYPE_5 || i == SYSINFO_TYPE_5bis</span><br><span style="color: hsl(120, 100%, 40%);">+ || i == SYSINFO_TYPE_5ter)</span><br><span style="color: hsl(120, 100%, 40%);">+ si_len[i] = 18;</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (i == SYSINFO_TYPE_6)</span><br><span style="color: hsl(120, 100%, 40%);">+ si_len[i] = 11;</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ si_len[i] = 23;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Third, we send the selected SI via RSL */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (n = 0; n < n_si; n++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ i = gen_si[n];</span><br><span style="color: hsl(120, 100%, 40%);">+ /* if we don't currently have this SI, we send a zero-length</span><br><span style="color: hsl(120, 100%, 40%);">+ * RSL BCCH FILLING / SACCH FILLING * in order to deactivate</span><br><span style="color: hsl(120, 100%, 40%);">+ * the SI, in case it might have previously been active */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!GSM_BTS_HAS_SI(bts, i))</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = rsl_si(trx, i, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = rsl_si(trx, i, si_len[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Make sure the PCU is aware (in case anything GPRS related has</span><br><span style="color: hsl(120, 100%, 40%);">+ * changed in SI */</span><br><span style="color: hsl(120, 100%, 40%);">+ pcu_info_update(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+err_out:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DRR, LOGL_ERROR, "Cannot generate SI%s for BTS %u: error <%s>, "</span><br><span style="color: hsl(120, 100%, 40%);">+ "most likely a problem with neighbor cell list generation\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ get_value_string(osmo_sitype_strs, i), bts->nr, strerror(-rc));</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* set all system information types for a BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+int gsm_bts_set_system_infos(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Generate a new ID */</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->bcch_change_mark += 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->bcch_change_mark %= 0x7;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = gsm_bts_trx_set_system_infos(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc != 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* XXX hard-coded for now */</span><br><span style="color: hsl(120, 100%, 40%);">+#define T3122_CHAN_LOAD_SAMPLE_INTERVAL 1 /* in seconds */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void update_t3122_chan_load_timer(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_network *net = data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(bts, &net->bts_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+ bts_update_t3122_chan_load(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Keep this timer ticking. */</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&net->t3122_chan_load_timer, T3122_CHAN_LOAD_SAMPLE_INTERVAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct gsm_network *bsc_network_init(void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_network *net = gsm_network_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ net->bsc_data = talloc_zero(net, struct osmo_bsc_data);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!net->bsc_data) {</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Init back pointer */</span><br><span style="color: hsl(120, 100%, 40%);">+ net->bsc_data->auto_off_timeout = -1;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->bsc_data->network = net;</span><br><span style="color: hsl(120, 100%, 40%);">+ INIT_LLIST_HEAD(&net->bsc_data->mscs);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ net->ho = ho_cfg_init(net, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ net->hodec2.congestion_check_interval_s = HO_CFG_CONGESTION_CHECK_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* init statistics */</span><br><span style="color: hsl(120, 100%, 40%);">+ net->bsc_ctrs = rate_ctr_group_alloc(net, &bsc_ctrg_desc, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!net->bsc_ctrs) {</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free(net);</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_net_update_ctype(net);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+ * At present all BTS in the network share one channel load timeout.</span><br><span style="color: hsl(120, 100%, 40%);">+ * If this becomes a problem for networks with a lot of BTS, this</span><br><span style="color: hsl(120, 100%, 40%);">+ * code could be refactored to run the timeout individually per BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_setup(&net->t3122_chan_load_timer, update_t3122_chan_load_timer, net);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_timer_schedule(&net->t3122_chan_load_timer, T3122_CHAN_LOAD_SAMPLE_INTERVAL, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return net;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_network_alloc(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* initialize our data structures */</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_gsmnet = bsc_network_init(tall_bsc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bsc_gsmnet)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -ENOMEM;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *bsc_bts_alloc_register(struct gsm_network *net, enum gsm_bts_type type, uint8_t bsic)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = gsm_bts_alloc_register(net, type, bsic);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->ho = ho_cfg_init(bts, net->ho);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return bts;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/libbsc/bsc_rf_ctrl.c b/src/osmo-bsc/bsc_rf_ctrl.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_rf_ctrl.c</span><br><span>rename to src/osmo-bsc/bsc_rf_ctrl.c</span><br><span>diff --git a/src/libbsc/bsc_rll.c b/src/osmo-bsc/bsc_rll.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_rll.c</span><br><span>rename to src/osmo-bsc/bsc_rll.c</span><br><span>diff --git a/src/libbsc/bsc_subscr_conn_fsm.c b/src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_subscr_conn_fsm.c</span><br><span>rename to src/osmo-bsc/bsc_subscr_conn_fsm.c</span><br><span>diff --git a/src/libbsc/bsc_subscriber.c b/src/osmo-bsc/bsc_subscriber.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bsc_subscriber.c</span><br><span>rename to src/osmo-bsc/bsc_subscriber.c</span><br><span>diff --git a/src/libbsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>similarity index 99%</span><br><span>rename from src/libbsc/bsc_vty.c</span><br><span>rename to src/osmo-bsc/bsc_vty.c</span><br><span>index 757a8a1..5d0feb6 100644</span><br><span>--- a/src/libbsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -1945,7 +1945,7 @@</span><br><span> return CMD_WARNING;</span><br><span> } else if (bts_nr == gsmnet->num_bts) {</span><br><span> /* allocate a new one */</span><br><span style="color: hsl(0, 100%, 40%);">- bts = gsm_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,</span><br><span style="color: hsl(120, 100%, 40%);">+ bts = bsc_bts_alloc_register(gsmnet, GSM_BTS_TYPE_UNKNOWN,</span><br><span> HARDCODED_BSIC);</span><br><span> /*</span><br><span> * Initalize bts->acc_ramp here. Else we could segfault while</span><br><span>diff --git a/src/libbsc/bts_ericsson_rbs2000.c b/src/osmo-bsc/bts_ericsson_rbs2000.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_ericsson_rbs2000.c</span><br><span>rename to src/osmo-bsc/bts_ericsson_rbs2000.c</span><br><span>diff --git a/src/libbsc/bts_init.c b/src/osmo-bsc/bts_init.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_init.c</span><br><span>rename to src/osmo-bsc/bts_init.c</span><br><span>diff --git a/src/libbsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_ipaccess_nanobts.c</span><br><span>rename to src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>diff --git a/src/libbsc/bts_ipaccess_nanobts_omlattr.c b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>rename to src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>diff --git a/src/libbsc/bts_nokia_site.c b/src/osmo-bsc/bts_nokia_site.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_nokia_site.c</span><br><span>rename to src/osmo-bsc/bts_nokia_site.c</span><br><span>diff --git a/src/libbsc/bts_siemens_bs11.c b/src/osmo-bsc/bts_siemens_bs11.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_siemens_bs11.c</span><br><span>rename to src/osmo-bsc/bts_siemens_bs11.c</span><br><span>diff --git a/src/libbsc/bts_sysmobts.c b/src/osmo-bsc/bts_sysmobts.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_sysmobts.c</span><br><span>rename to src/osmo-bsc/bts_sysmobts.c</span><br><span>diff --git a/src/libbsc/bts_unknown.c b/src/osmo-bsc/bts_unknown.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/bts_unknown.c</span><br><span>rename to src/osmo-bsc/bts_unknown.c</span><br><span>diff --git a/src/libbsc/chan_alloc.c b/src/osmo-bsc/chan_alloc.c</span><br><span>similarity index 98%</span><br><span>rename from src/libbsc/chan_alloc.c</span><br><span>rename to src/osmo-bsc/chan_alloc.c</span><br><span>index 4eccff0..a24fbea 100644</span><br><span>--- a/src/libbsc/chan_alloc.c</span><br><span>+++ b/src/osmo-bsc/chan_alloc.c</span><br><span>@@ -65,18 +65,6 @@</span><br><span> return true;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-bool trx_is_usable(const struct gsm_bts_trx *trx)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- /* FIXME: How does this behave for BS-11 ? */</span><br><span style="color: hsl(0, 100%, 40%);">- if (is_ipaccess_bts(trx->bts)) {</span><br><span style="color: hsl(0, 100%, 40%);">- if (!nm_is_running(&trx->mo.nm_state) ||</span><br><span style="color: hsl(0, 100%, 40%);">- !nm_is_running(&trx->bb_transc.mo.nm_state))</span><br><span style="color: hsl(0, 100%, 40%);">- return false;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return true;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int trx_count_free_ts(struct gsm_bts_trx *trx, enum gsm_phys_chan_config pchan)</span><br><span> {</span><br><span> struct gsm_bts_trx_ts *ts;</span><br><span>diff --git a/src/libbsc/e1_config.c b/src/osmo-bsc/e1_config.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/e1_config.c</span><br><span>rename to src/osmo-bsc/e1_config.c</span><br><span>diff --git a/src/libbsc/gsm_04_08_utils.c b/src/osmo-bsc/gsm_04_08_utils.c</span><br><span>similarity index 97%</span><br><span>rename from src/libbsc/gsm_04_08_utils.c</span><br><span>rename to src/osmo-bsc/gsm_04_08_utils.c</span><br><span>index f30640f..5bfdf97 100644</span><br><span>--- a/src/libbsc/gsm_04_08_utils.c</span><br><span>+++ b/src/osmo-bsc/gsm_04_08_utils.c</span><br><span>@@ -302,26 +302,6 @@</span><br><span> cd->arfcn_lo = bts->c0->arfcn & 0xff;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(0, 100%, 40%);">- const struct gsm_lchan *lchan)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t arfcn = lchan->ts->trx->arfcn & 0x3ff;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- cd->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(0, 100%, 40%);">- if (!lchan->ts->hopping.enabled) {</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h0.tsc = gsm_ts_tsc(lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h0.h = 0;</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h0.arfcn_high = arfcn >> 8;</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h0.arfcn_low = arfcn & 0xff;</span><br><span style="color: hsl(0, 100%, 40%);">- } else {</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h1.tsc = gsm_ts_tsc(lchan->ts);</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h1.h = 1;</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h1.maio_high = lchan->ts->hopping.maio >> 2;</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h1.maio_low = lchan->ts->hopping.maio & 0x03;</span><br><span style="color: hsl(0, 100%, 40%);">- cd->h1.hsn = lchan->ts->hopping.hsn;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! \brief Encode a TS 04.08 multirate config LV according to 10.5.2.21aa</span><br><span> * \param[out] lv caller-allocated buffer of 7 bytes. First octet is IS length</span><br><span> * \param[in] mr multi-rate configuration to encode</span><br><span>diff --git a/src/libbsc/gsm_04_80_utils.c b/src/osmo-bsc/gsm_04_80_utils.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/gsm_04_80_utils.c</span><br><span>rename to src/osmo-bsc/gsm_04_80_utils.c</span><br><span>diff --git a/src/libbsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>similarity index 93%</span><br><span>rename from src/libbsc/gsm_data.c</span><br><span>rename to src/osmo-bsc/gsm_data.c</span><br><span>index ea2aea0..0f062d2 100644</span><br><span>--- a/src/libbsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -648,6 +648,10 @@</span><br><span> .initial_mcs = 6,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Initialize those parts that don't require osmo-bsc specific dependencies.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This part is shared among the thin programs in osmo-bsc/src/utils/.</span><br><span style="color: hsl(120, 100%, 40%);">+ * osmo-bsc requires further initialization that pulls in more dependencies (see</span><br><span style="color: hsl(120, 100%, 40%);">+ * bsc_bts_alloc_register()). */</span><br><span> struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num)</span><br><span> {</span><br><span> struct gsm_bts *bts = talloc_zero(net, struct gsm_bts);</span><br><span>@@ -716,8 +720,6 @@</span><br><span> bts->bcch_change_mark = 1;</span><br><span> bts->chan_load_avg = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bts->ho = ho_cfg_init(bts, net->ho);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* timer overrides */</span><br><span> bts->T3122 = 0; /* not overriden by default */</span><br><span> </span><br><span>@@ -1232,3 +1234,72 @@</span><br><span> {</span><br><span> return pchan_is_tch(ts_pchan(ts));</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool trx_is_usable(const struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: How does this behave for BS-11 ? */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (is_ipaccess_bts(trx->bts)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nm_is_running(&trx->mo.nm_state) ||</span><br><span style="color: hsl(120, 100%, 40%);">+ !nm_is_running(&trx->bb_transc.mo.nm_state))</span><br><span style="color: hsl(120, 100%, 40%);">+ return false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_trx_mark_all_ts_uninitialized(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->initialized = false;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_bts_mark_all_ts_uninitialized(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx;</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(trx, &bts->trx_list, list)</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_trx_mark_all_ts_uninitialized(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Trigger initial timeslot actions iff both OML and RSL are setup. */</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_ts_check_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = ts->trx->bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->model->oml_is_ts_ready</span><br><span style="color: hsl(120, 100%, 40%);">+ && !bts->model->oml_is_ts_ready(ts))</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ts->trx->rsl_link)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ts->initialized)</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->initialized = on_gsm_ts_init(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm48_lchan2chan_desc(struct gsm48_chan_desc *cd,</span><br><span style="color: hsl(120, 100%, 40%);">+ const struct gsm_lchan *lchan)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t arfcn = lchan->ts->trx->arfcn & 0x3ff;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->chan_nr = gsm_lchan2chan_nr(lchan);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!lchan->ts->hopping.enabled) {</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h0.tsc = gsm_ts_tsc(lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h0.h = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h0.arfcn_high = arfcn >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h0.arfcn_low = arfcn & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+ } else {</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h1.tsc = gsm_ts_tsc(lchan->ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h1.h = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h1.maio_high = lchan->ts->hopping.maio >> 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h1.maio_low = lchan->ts->hopping.maio & 0x03;</span><br><span style="color: hsl(120, 100%, 40%);">+ cd->h1.hsn = lchan->ts->hopping.hsn;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool nm_is_running(const struct gsm_nm_state *s) {</span><br><span style="color: hsl(120, 100%, 40%);">+ return (s->operational == NM_OPSTATE_ENABLED) && (</span><br><span style="color: hsl(120, 100%, 40%);">+ (s->availability == NM_AVSTATE_OK) ||</span><br><span style="color: hsl(120, 100%, 40%);">+ (s->availability == 0xff)</span><br><span style="color: hsl(120, 100%, 40%);">+ );</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/libbsc/handover_cfg.c b/src/osmo-bsc/handover_cfg.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/handover_cfg.c</span><br><span>rename to src/osmo-bsc/handover_cfg.c</span><br><span>diff --git a/src/libbsc/handover_decision.c b/src/osmo-bsc/handover_decision.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/handover_decision.c</span><br><span>rename to src/osmo-bsc/handover_decision.c</span><br><span>diff --git a/src/libbsc/handover_decision_2.c b/src/osmo-bsc/handover_decision_2.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/handover_decision_2.c</span><br><span>rename to src/osmo-bsc/handover_decision_2.c</span><br><span>diff --git a/src/libbsc/handover_logic.c b/src/osmo-bsc/handover_logic.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/handover_logic.c</span><br><span>rename to src/osmo-bsc/handover_logic.c</span><br><span>diff --git a/src/libbsc/handover_vty.c b/src/osmo-bsc/handover_vty.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/handover_vty.c</span><br><span>rename to src/osmo-bsc/handover_vty.c</span><br><span>diff --git a/src/libbsc/meas_feed.c b/src/osmo-bsc/meas_feed.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/meas_feed.c</span><br><span>rename to src/osmo-bsc/meas_feed.c</span><br><span>diff --git a/src/libbsc/meas_rep.c b/src/osmo-bsc/meas_rep.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/meas_rep.c</span><br><span>rename to src/osmo-bsc/meas_rep.c</span><br><span>diff --git a/src/osmo-bsc/net_init.c b/src/osmo-bsc/net_init.c</span><br><span>new file mode 100644</span><br><span>index 0000000..db84e2a</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/net_init.c</span><br><span>@@ -0,0 +1,69 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2008-2010 by Harald Welte <laforge@gnumonks.org></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/osmo_bsc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bsc_msc_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/gsm_04_08_utils.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/handover_cfg.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/chan_alloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Initialize the bare minimum of struct gsm_network, minimizing required dependencies.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This part is shared among the thin programs in osmo-bsc/src/utils/.</span><br><span style="color: hsl(120, 100%, 40%);">+ * osmo-bsc requires further initialization that pulls in more dependencies (see bsc_network_init()). */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_network *gsm_network_init(void *ctx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_network *net = talloc_zero(ctx, struct gsm_network);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!net)</span><br><span style="color: hsl(120, 100%, 40%);">+ return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ net->plmn = (struct osmo_plmn_id){</span><br><span style="color: hsl(120, 100%, 40%);">+ .mcc = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ .mnc = 1,</span><br><span style="color: hsl(120, 100%, 40%);">+ };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ net->dyn_ts_allow_tch_f = true;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Permit a compile-time default of A5/3 and A5/1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ net->a5_encryption_mask = (1 << 3) | (1 << 1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Use 30 min periodic update interval as sane default */</span><br><span style="color: hsl(120, 100%, 40%);">+ net->t3212 = 5;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ INIT_LLIST_HEAD(&net->subscr_conns);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ net->bsc_subscribers = talloc_zero(net, struct llist_head);</span><br><span style="color: hsl(120, 100%, 40%);">+ INIT_LLIST_HEAD(net->bsc_subscribers);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ INIT_LLIST_HEAD(&net->bts_list);</span><br><span style="color: hsl(120, 100%, 40%);">+ net->num_bts = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3101 = GSM_T3101_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3103 = GSM_T3103_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3105 = GSM_T3105_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3107 = GSM_T3107_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3109 = GSM_T3109_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3111 = GSM_T3111_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3113 = GSM_T3113_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3115 = GSM_T3115_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3117 = GSM_T3117_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3119 = GSM_T3119_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3122 = GSM_T3122_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+ net->T3141 = GSM_T3141_DEFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return net;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/libbsc/osmo_bsc_lcls.c b/src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/osmo_bsc_lcls.c</span><br><span>rename to src/osmo-bsc/osmo_bsc_lcls.c</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_main.c b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>index fefc041..5c6a872 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_main.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_main.c</span><br><span>@@ -42,9 +42,15 @@</span><br><span> #include <osmocom/core/talloc.h></span><br><span> #include <osmocom/core/stats.h></span><br><span> #include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/telnet_interface.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/vty/ports.h></span><br><span> </span><br><span> #include <osmocom/abis/abis.h></span><br><span> #include <osmocom/bsc/abis_om2000.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_nm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/abis_rsl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/chan_alloc.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/e1_config.h></span><br><span> </span><br><span> #include <osmocom/mgcp_client/mgcp_client.h></span><br><span> </span><br><span>@@ -147,6 +153,369 @@</span><br><span> }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* Callback function for NACK on the OML NM */</span><br><span style="color: hsl(120, 100%, 40%);">+static int oml_msg_nack(struct nm_nack_signal_data *nack)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ if (nack->mt == NM_MT_GET_ATTR_NACK) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "BTS%u does not support Get Attributes "</span><br><span style="color: hsl(120, 100%, 40%);">+ "OML message.\n", nack->bts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (nack->mt == NM_MT_SET_BTS_ATTR_NACK)</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "Failed to set BTS attributes. That is fatal. "</span><br><span style="color: hsl(120, 100%, 40%);">+ "Was the bts type and frequency properly specified?\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "Got %s NACK going to drop the OML links.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_nm_nack_name(nack->mt));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nack->bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "Unknown bts. Can not drop it.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (is_ipaccess_bts(nack->bts))</span><br><span style="color: hsl(120, 100%, 40%);">+ ipaccess_drop_oml(nack->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Callback function to be called every time we receive a signal from NM */</span><br><span style="color: hsl(120, 100%, 40%);">+static int nm_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span style="color: hsl(120, 100%, 40%);">+ void *handler_data, void *signal_data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct nm_nack_signal_data *nack;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (signal) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case S_NM_NACK:</span><br><span style="color: hsl(120, 100%, 40%);">+ nack = signal_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ return oml_msg_nack(nack);</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Produce a MA as specified in 10.5.2.21 */</span><br><span style="color: hsl(120, 100%, 40%);">+static int generate_ma_for_ts(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we have three bitvecs: the per-timeslot ARFCNs, the cell chan ARFCNs</span><br><span style="color: hsl(120, 100%, 40%);">+ * and the MA */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bitvec *cell_chan = &ts->trx->bts->si_common.cell_alloc;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bitvec *ts_arfcn = &ts->hopping.arfcns;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bitvec *ma = &ts->hopping.ma;</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int num_cell_arfcns, bitnum, n_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* re-set the MA to all-zero */</span><br><span style="color: hsl(120, 100%, 40%);">+ ma->cur_bit = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->hopping.ma_len = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ memset(ma->data, 0, ma->data_len);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!ts->hopping.enabled)</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* count the number of ARFCNs in the cell channel allocation */</span><br><span style="color: hsl(120, 100%, 40%);">+ num_cell_arfcns = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 1024; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bitvec_get_bit_pos(cell_chan, i))</span><br><span style="color: hsl(120, 100%, 40%);">+ num_cell_arfcns++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* pad it to octet-aligned number of bits */</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->hopping.ma_len = num_cell_arfcns / 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (num_cell_arfcns % 8)</span><br><span style="color: hsl(120, 100%, 40%);">+ ts->hopping.ma_len++;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ n_chan = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < 1024; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bitvec_get_bit_pos(cell_chan, i))</span><br><span style="color: hsl(120, 100%, 40%);">+ continue;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* set the corresponding bit in the MA */</span><br><span style="color: hsl(120, 100%, 40%);">+ bitnum = (ts->hopping.ma_len * 8) - 1 - n_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bitvec_get_bit_pos(ts_arfcn, i))</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_set_bit_pos(ma, bitnum, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_set_bit_pos(ma, bitnum, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ n_chan++;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ARFCN 0 is special: It is coded last in the bitmask */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bitvec_get_bit_pos(cell_chan, 0)) {</span><br><span style="color: hsl(120, 100%, 40%);">+ n_chan++;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* set the corresponding bit in the MA */</span><br><span style="color: hsl(120, 100%, 40%);">+ bitnum = (ts->hopping.ma_len * 8) - 1 - n_chan;</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bitvec_get_bit_pos(ts_arfcn, 0))</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_set_bit_pos(ma, bitnum, 1);</span><br><span style="color: hsl(120, 100%, 40%);">+ else</span><br><span style="color: hsl(120, 100%, 40%);">+ bitvec_set_bit_pos(ma, bitnum, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void bootstrap_rsl(struct gsm_bts_trx *trx)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DRSL, LOGL_NOTICE, "bootstrapping RSL for BTS/TRX (%u/%u) "</span><br><span style="color: hsl(120, 100%, 40%);">+ "on ARFCN %u using MCC-MNC %s LAC=%u CID=%u BSIC=%u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ trx->bts->nr, trx->nr, trx->arfcn,</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_plmn_name(&bsc_gsmnet->plmn),</span><br><span style="color: hsl(120, 100%, 40%);">+ trx->bts->location_area_code,</span><br><span style="color: hsl(120, 100%, 40%);">+ trx->bts->cell_identity, trx->bts->bsic);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx->bts->type == GSM_BTS_TYPE_NOKIA_SITE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_nokia_si_begin(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+ * Trigger ACC ramping before sending system information to BTS.</span><br><span style="color: hsl(120, 100%, 40%);">+ * This ensures that RACH control in system information is configured correctly.</span><br><span style="color: hsl(120, 100%, 40%);">+ * TRX 0 should be usable and unlocked, otherwise starting ACC ramping is pointless.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx_is_usable(trx) && trx->mo.nm_state.administrative == NM_STATE_UNLOCKED)</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp_trigger(&trx->bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_trx_set_system_infos(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trx->bts->type == GSM_BTS_TYPE_NOKIA_SITE) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* channel unspecific, power reduction in 2 dB steps */</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_bs_power_control(trx, 0xFF, trx->max_power_red / 2);</span><br><span style="color: hsl(120, 100%, 40%);">+ rsl_nokia_si_end(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ARRAY_SIZE(trx->ts); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = &trx->ts[i];</span><br><span style="color: hsl(120, 100%, 40%);">+ generate_ma_for_ts(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_ts_check_init(ts);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* Callback function to be called every time we receive a signal from INPUT */</span><br><span style="color: hsl(120, 100%, 40%);">+static int inp_sig_cb(unsigned int subsys, unsigned int signal,</span><br><span style="color: hsl(120, 100%, 40%);">+ void *handler_data, void *signal_data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct input_signal_data *isd = signal_data;</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *trx = isd->trx;</span><br><span style="color: hsl(120, 100%, 40%);">+ int ts_no, lchan_no;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* N. B: we rely on attribute order when parsing response in abis_nm_rx_get_attr_resp() */</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t bts_attr[] = { NM_ATT_MANUF_ID, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(120, 100%, 40%);">+ const uint8_t trx_attr[] = { NM_ATT_MANUF_STATE, NM_ATT_SW_CONFIG, };</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* we should not request more attributes than we're ready to handle */</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(sizeof(bts_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(sizeof(trx_attr) < MAX_BTS_ATTR);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (subsys != SS_L_INPUT)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DLMI, LOGL_DEBUG, "%s(): Input signal '%s' received\n", __func__,</span><br><span style="color: hsl(120, 100%, 40%);">+ get_value_string(e1inp_signal_names, signal));</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (signal) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case S_L_INP_TEI_UP:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isd->link_type == E1INP_SIGN_OML) {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: this is required for the Nokia BTS, hopping is configured</span><br><span style="color: hsl(120, 100%, 40%);">+ during OML, other MA is not set. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx *cur_trx;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* was static in system_information.c */</span><br><span style="color: hsl(120, 100%, 40%);">+ extern int generate_cell_chan_list(uint8_t *chan_list, struct gsm_bts *bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t ca[20];</span><br><span style="color: hsl(120, 100%, 40%);">+ /* has to be called before generate_ma_for_ts to</span><br><span style="color: hsl(120, 100%, 40%);">+ set bts->si_common.cell_alloc */</span><br><span style="color: hsl(120, 100%, 40%);">+ generate_cell_chan_list(ca, trx->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Request generic BTS-level attributes */</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_nm_get_attr(trx->bts, NM_OC_BTS, 0xFF, 0xFF, 0xFF, bts_attr, sizeof(bts_attr));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(cur_trx, &trx->bts->trx_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ int i;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Request TRX-level attributes */</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_nm_get_attr(cur_trx->bts, NM_OC_BASEB_TRANSC, 0, cur_trx->nr, 0xFF,</span><br><span style="color: hsl(120, 100%, 40%);">+ trx_attr, sizeof(trx_attr));</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ARRAY_SIZE(cur_trx->ts); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ generate_ma_for_ts(&cur_trx->ts[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isd->link_type == E1INP_SIGN_RSL)</span><br><span style="color: hsl(120, 100%, 40%);">+ bootstrap_rsl(trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case S_L_INP_TEI_DN:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DLMI, LOGL_ERROR, "Lost some E1 TEI link: %d %p\n", isd->link_type, trx);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (isd->link_type == E1INP_SIGN_OML)</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_OML_FAIL]);</span><br><span style="color: hsl(120, 100%, 40%);">+ else if (isd->link_type == E1INP_SIGN_RSL) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rate_ctr_inc(&trx->bts->bts_ctrs->ctr[BTS_CTR_BTS_RSL_FAIL]);</span><br><span style="color: hsl(120, 100%, 40%);">+ acc_ramp_abort(&trx->bts->acc_ramp);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*</span><br><span style="color: hsl(120, 100%, 40%);">+ * free all allocated channels. change the nm_state so the</span><br><span style="color: hsl(120, 100%, 40%);">+ * trx and trx_ts becomes unusable and chan_alloc.c can not</span><br><span style="color: hsl(120, 100%, 40%);">+ * allocate from it.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (ts_no = 0; ts_no < ARRAY_SIZE(trx->ts); ++ts_no) {</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts_trx_ts *ts = &trx->ts[ts_no];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (lchan_no = 0; lchan_no < ARRAY_SIZE(ts->lchan); ++lchan_no) {</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ts->lchan[lchan_no].state != LCHAN_S_NONE)</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan_free(&ts->lchan[lchan_no]);</span><br><span style="color: hsl(120, 100%, 40%);">+ lchan_reset(&ts->lchan[lchan_no]);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_mo_reset(trx->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ abis_nm_clear_queue(trx->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int bootstrap_bts(struct gsm_bts *bts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i, n;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!bts->model)</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EFAULT;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->model->start && !bts->model->started) {</span><br><span style="color: hsl(120, 100%, 40%);">+ int ret = bts->model->start(bts->network);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (ret < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return ret;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->model->started = true;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FIXME: What about secondary TRX of a BTS? What about a BTS that has TRX</span><br><span style="color: hsl(120, 100%, 40%);">+ * in different bands? Why is 'band' a parameter of the BTS and not of the TRX? */</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (bts->band) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_BAND_1800:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->c0->arfcn < 512 || bts->c0->arfcn > 885) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "GSM1800 channel must be between 512-885.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_BAND_1900:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->c0->arfcn < 512 || bts->c0->arfcn > 810) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "GSM1900 channel must be between 512-810.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_BAND_900:</span><br><span style="color: hsl(120, 100%, 40%);">+ if ((bts->c0->arfcn > 124 && bts->c0->arfcn < 955) ||</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->c0->arfcn > 1023) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "GSM900 channel must be between 0-124, 955-1023.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case GSM_BAND_850:</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->c0->arfcn < 128 || bts->c0->arfcn > 251) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "GSM850 channel must be between 128-251.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "Unsupported frequency band.\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Control Channel Description is set from vty/config */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* T3212 is set from vty/config */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Set ccch config by looking at ts config */</span><br><span style="color: hsl(120, 100%, 40%);">+ for (n=0, i=0; i<8; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+ n += bts->c0->ts[i].pchan == GSM_PCHAN_CCCH ? 1 : 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Indicate R99 MSC in SI3 */</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.mscr = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (n) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_C;</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Limit reserved block to 2 on combined channel according to</span><br><span style="color: hsl(120, 100%, 40%);">+ 3GPP TS 44.018 Table 10.5.2.11.1 */</span><br><span style="color: hsl(120, 100%, 40%);">+ if (bts->si_common.chan_desc.bs_ag_blks_res > 2) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_NOTICE, "CCCH is combined with SDCCHs, "</span><br><span style="color: hsl(120, 100%, 40%);">+ "reducing BS-AG-BLKS-RES value %d -> 2\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.bs_ag_blks_res);</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.bs_ag_blks_res = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 1:</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_1_NC;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 2:</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_2_NC;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 3:</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_3_NC;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ case 4:</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.chan_desc.ccch_conf = RSL_BCCH_CCCH_CONF_4_NC;</span><br><span style="color: hsl(120, 100%, 40%);">+ break;</span><br><span style="color: hsl(120, 100%, 40%);">+ default:</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_ERROR, "Unsupported CCCH timeslot configuration\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.cell_options.pwrc = 0; /* PWRC not set */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.cell_sel_par.acs = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->si_common.ncc_permitted = 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->chan_load_samples_idx = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* ACC ramping is initialized from vty/config */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Initialize the BTS state */</span><br><span style="color: hsl(120, 100%, 40%);">+ gsm_bts_mo_reset(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static int bsc_network_configure(const char *config_file)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+ int rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = vty_read_config_file(config_file, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_FATAL, "Failed to parse the config file: '%s'\n", config_file);</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /* start telnet after reading config for vty_get_bind_addr() */</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = telnet_init_dynif(tall_bsc_ctx, bsc_gsmnet, vty_get_bind_addr(),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VTY_PORT_NITB_BSC);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_signal_register_handler(SS_NM, nm_sig_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_signal_register_handler(SS_L_INPUT, inp_sig_cb, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ llist_for_each_entry(bts, &bsc_gsmnet->bts_list, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = bootstrap_bts(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_FATAL, "Error bootstrapping BTS\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ rc = e1_reconfig_bts(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (rc < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+ LOGP(DNM, LOGL_FATAL, "Error enabling E1 input driver\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int bsc_vty_go_parent(struct vty *vty)</span><br><span> {</span><br><span> switch (vty->node) {</span><br><span>diff --git a/src/libbsc/paging.c b/src/osmo-bsc/paging.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/paging.c</span><br><span>rename to src/osmo-bsc/paging.c</span><br><span>diff --git a/src/libbsc/pcu_sock.c b/src/osmo-bsc/pcu_sock.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/pcu_sock.c</span><br><span>rename to src/osmo-bsc/pcu_sock.c</span><br><span>diff --git a/src/libbsc/penalty_timers.c b/src/osmo-bsc/penalty_timers.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/penalty_timers.c</span><br><span>rename to src/osmo-bsc/penalty_timers.c</span><br><span>diff --git a/src/libbsc/rest_octets.c b/src/osmo-bsc/rest_octets.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/rest_octets.c</span><br><span>rename to src/osmo-bsc/rest_octets.c</span><br><span>diff --git a/src/libbsc/system_information.c b/src/osmo-bsc/system_information.c</span><br><span>similarity index 100%</span><br><span>rename from src/libbsc/system_information.c</span><br><span>rename to src/osmo-bsc/system_information.c</span><br><span>diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am</span><br><span>index 6e21ccc..543344b 100644</span><br><span>--- a/src/utils/Makefile.am</span><br><span>+++ b/src/utils/Makefile.am</span><br><span>@@ -46,15 +46,18 @@</span><br><span> </span><br><span> bs11_config_SOURCES = \</span><br><span> bs11_config.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ stubs.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> bs11_config_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_siemens_bs11.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/e1_config.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOSIGTRAN_LIBS) \</span><br><span style="color: hsl(0, 100%, 40%);">- $(LIBOSMOMGCPCLIENT_LIBS) \</span><br><span> $(NULL)</span><br><span> </span><br><span> isdnsync_SOURCES = \</span><br><span>@@ -114,12 +117,14 @@</span><br><span> </span><br><span> meas_json_SOURCES = \</span><br><span> meas_json.c \</span><br><span style="color: hsl(120, 100%, 40%);">+ stubs.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> meas_json_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(LIBOSMOABIS_LIBS) \</span><br><span> $(NULL)</span><br><span> </span><br><span> meas_json_CFLAGS = \</span><br><span>diff --git a/src/utils/bs11_config.c b/src/utils/bs11_config.c</span><br><span>index 8d4de01..ae307c7 100644</span><br><span>--- a/src/utils/bs11_config.c</span><br><span>+++ b/src/utils/bs11_config.c</span><br><span>@@ -32,7 +32,6 @@</span><br><span> </span><br><span> #include <sys/stat.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> #include <osmocom/bsc/abis_nm.h></span><br><span> #include <osmocom/core/msgb.h></span><br><span> #include <osmocom/core/utils.h></span><br><span>@@ -915,7 +914,7 @@</span><br><span> handle_options(argc, argv);</span><br><span> bts_model_bs11_init();</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- gsmnet = bsc_network_init(tall_bs11cfg_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ gsmnet = gsm_network_init(tall_bs11cfg_ctx);</span><br><span> if (!gsmnet) {</span><br><span> fprintf(stderr, "Unable to allocate gsm network\n");</span><br><span> exit(1);</span><br><span>diff --git a/src/utils/stubs.c b/src/utils/stubs.c</span><br><span>new file mode 100644</span><br><span>index 0000000..624797f</span><br><span>--- /dev/null</span><br><span>+++ b/src/utils/stubs.c</span><br><span>@@ -0,0 +1,36 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* Stubs required for linking */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2018 by sysmocom s.f.m.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * All Rights Reserved</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is free software; you can redistribute it and/or modify</span><br><span style="color: hsl(120, 100%, 40%);">+ * it under the terms of the GNU Affero General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 3 of the License, or</span><br><span style="color: hsl(120, 100%, 40%);">+ * (at your option) any later version.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * This program is distributed in the hope that it will be useful,</span><br><span style="color: hsl(120, 100%, 40%);">+ * but WITHOUT ANY WARRANTY; without even the implied warranty of</span><br><span style="color: hsl(120, 100%, 40%);">+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the</span><br><span style="color: hsl(120, 100%, 40%);">+ * GNU Affero General Public License for more details.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * You should have received a copy of the GNU Affero General Public License</span><br><span style="color: hsl(120, 100%, 40%);">+ * along with this program. If not, see <http://www.gnu.org/licenses/>.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdbool.h></span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_trx_ts;</span><br><span style="color: hsl(120, 100%, 40%);">+struct msgb;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* No TS init required here. */</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int abis_rsl_rcvmsg(struct msgb *msg)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ /* No RSL handling here */</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/abis/Makefile.am b/tests/abis/Makefile.am</span><br><span>index 8dc829f..60054d9 100644</span><br><span>--- a/tests/abis/Makefile.am</span><br><span>+++ b/tests/abis/Makefile.am</span><br><span>@@ -25,7 +25,9 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> abis_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span>diff --git a/tests/abis/abis_test.c b/tests/abis/abis_test.c</span><br><span>index faf9ea5..c6f29f5 100644</span><br><span>--- a/tests/abis/abis_test.c</span><br><span>+++ b/tests/abis/abis_test.c</span><br><span>@@ -186,3 +186,5 @@</span><br><span> struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; }</span><br><span>diff --git a/tests/bsc/Makefile.am b/tests/bsc/Makefile.am</span><br><span>index a436c27..a930629 100644</span><br><span>--- a/tests/bsc/Makefile.am</span><br><span>+++ b/tests/bsc/Makefile.am</span><br><span>@@ -28,11 +28,28 @@</span><br><span> </span><br><span> bsc_test_SOURCES = \</span><br><span> bsc_test.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_srcdir)/src/osmo-bsc/osmo_bsc_filter.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> bsc_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_rsl.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_api.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_dyn_ts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_rll.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/chan_alloc.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_04_08_utils.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_04_80_utils.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_cfg.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_logic.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/paging.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/pcu_sock.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/rest_octets.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/system_information.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOVTY_LIBS) \</span><br><span>diff --git a/tests/bsc/bsc_test.c b/tests/bsc/bsc_test.c</span><br><span>index 106b08b..183fddf 100644</span><br><span>--- a/tests/bsc/bsc_test.c</span><br><span>+++ b/tests/bsc/bsc_test.c</span><br><span>@@ -30,7 +30,6 @@</span><br><span> #include <osmocom/bsc/osmo_bsc.h></span><br><span> #include <osmocom/bsc/bsc_msc_data.h></span><br><span> #include <osmocom/bsc/gsm_04_80.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> </span><br><span> #include <osmocom/core/application.h></span><br><span> #include <osmocom/core/backtrace.h></span><br><span>@@ -124,7 +123,7 @@</span><br><span> {</span><br><span> int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- struct gsm_network *net = bsc_network_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_network *net = gsm_network_init(ctx);</span><br><span> struct gsm_bts *bts = gsm_bts_alloc(net, 0);</span><br><span> struct bsc_msc_data *msc;</span><br><span> struct gsm_subscriber_connection *conn;</span><br><span>@@ -162,7 +161,7 @@</span><br><span> /* override timezone of msg coming from the BSC */</span><br><span> /* FIXME: no test for this case is defined in</span><br><span> * test_scan_defs[], so this is never used. */</span><br><span style="color: hsl(0, 100%, 40%);">- result = bsc_scan_bts_msg(conn, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+ //result = bsc_scan_bts_msg(conn, msg);</span><br><span> break;</span><br><span> default:</span><br><span> abort();</span><br><span>diff --git a/tests/bssap/Makefile.am b/tests/bssap/Makefile.am</span><br><span>index 30a9246..fad6318 100644</span><br><span>--- a/tests/bssap/Makefile.am</span><br><span>+++ b/tests/bssap/Makefile.am</span><br><span>@@ -25,14 +25,9 @@</span><br><span> </span><br><span> bssap_test_SOURCES = \</span><br><span> bssap_test.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_srcdir)/src/osmo-bsc/osmo_bsc_bssap.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_srcdir)/src/osmo-bsc/osmo_bsc_sigtran.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_srcdir)/src/osmo-bsc/osmo_bsc_filter.c \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_srcdir)/src/osmo-bsc/osmo_bsc_grace.c \</span><br><span> $(NULL)</span><br><span> </span><br><span> bssap_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span>@@ -41,6 +36,30 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> bssap_test_LDFLAGS = \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/a_reset.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_rsl.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_api.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_dyn_ts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_rll.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/chan_alloc.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_04_08_utils.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_04_80_utils.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_cfg.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_logic.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/osmo_bsc_api.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/osmo_bsc_bssap.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/osmo_bsc_grace.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/osmo_bsc_sigtran.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/paging.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/pcu_sock.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/rest_octets.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/system_information.o \</span><br><span> -Wl,--wrap=bsc_grace_paging_request \</span><br><span> $(NULL)</span><br><span> </span><br><span>diff --git a/tests/bssap/bssap_test.c b/tests/bssap/bssap_test.c</span><br><span>index c9e7075..bb23241 100644</span><br><span>--- a/tests/bssap/bssap_test.c</span><br><span>+++ b/tests/bssap/bssap_test.c</span><br><span>@@ -24,8 +24,8 @@</span><br><span> #include <osmocom/bsc/signal.h></span><br><span> #include <osmocom/bsc/bsc_subscriber.h></span><br><span> #include <osmocom/bsc/bsc_msc_data.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> #include <osmocom/bsc/osmo_bsc_rf.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bss.h></span><br><span> </span><br><span> struct msgb *msgb_from_hex(const char *label, uint16_t size, const char *hex)</span><br><span> {</span><br><span>@@ -80,7 +80,7 @@</span><br><span> },</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_network *bsc_gsmnet;</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_network *bsc_gsmnet = NULL;</span><br><span> </span><br><span> void test_cell_identifier()</span><br><span> {</span><br><span>@@ -89,7 +89,7 @@</span><br><span> struct bsc_msc_data *msc;</span><br><span> struct gsm_bts *bts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bsc_gsmnet = bsc_network_init(NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_network_alloc();</span><br><span> bsc_gsmnet->bsc_data->rf_ctrl = talloc_zero(NULL, struct osmo_bsc_rf);</span><br><span> bsc_gsmnet->bsc_data->rf_ctrl->policy = S_RF_ON;</span><br><span> </span><br><span>@@ -160,3 +160,26 @@</span><br><span> int bsc_sccplite_rx_ctrl(struct osmo_ss7_asp *asp, struct msgb *msg) {</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_sccplite_rx_mgcp(struct osmo_ss7_asp *asp, struct msgb *msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_sccplite_rx_mgcp(struct osmo_ss7_asp *asp, struct msgb *msg) {</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_msg_filter_initial(struct gsm48_hdr *hdr48, size_t hdr48_len,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_filter_request *req,</span><br><span style="color: hsl(120, 100%, 40%);">+ int *con_type,</span><br><span style="color: hsl(120, 100%, 40%);">+ char **imsi, struct bsc_filter_reject_cause *cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+int bsc_msg_filter_data(struct gsm48_hdr *hdr48, size_t len,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_filter_request *req,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_filter_state *state,</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bsc_filter_reject_cause *cause)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return 0; }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct llist_head *bsc_access_lists(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return NULL; }</span><br><span>diff --git a/tests/channel/Makefile.am b/tests/channel/Makefile.am</span><br><span>index f641f60..26c6cff 100644</span><br><span>--- a/tests/channel/Makefile.am</span><br><span>+++ b/tests/channel/Makefile.am</span><br><span>@@ -24,7 +24,8 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> channel_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span>diff --git a/tests/channel/channel_test.c b/tests/channel/channel_test.c</span><br><span>index e8f6cd9..4c2f9cd 100644</span><br><span>--- a/tests/channel/channel_test.c</span><br><span>+++ b/tests/channel/channel_test.c</span><br><span>@@ -25,10 +25,11 @@</span><br><span> #include <osmocom/core/application.h></span><br><span> #include <osmocom/core/select.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> #include <osmocom/bsc/abis_rsl.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void *ctx = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void test_bts_debug_print(void)</span><br><span> {</span><br><span> struct gsm_network *network;</span><br><span>@@ -38,7 +39,7 @@</span><br><span> printf("Testing the lchan printing:");</span><br><span> </span><br><span> /* Create a dummy network */</span><br><span style="color: hsl(0, 100%, 40%);">- network = bsc_network_init(tall_bsc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ network = gsm_network_init(ctx);</span><br><span> if (!network)</span><br><span> exit(1);</span><br><span> /* Add a BTS with some reasonanbly non-zero id */</span><br><span>@@ -98,7 +99,8 @@</span><br><span> </span><br><span> int main(int argc, char **argv)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_init_logging2(NULL, &log_info);</span><br><span style="color: hsl(120, 100%, 40%);">+ ctx = talloc_named_const(NULL, 0, "channel_test");</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_init_logging2(ctx, &log_info);</span><br><span> </span><br><span> test_dyn_ts_subslots();</span><br><span> test_bts_debug_print();</span><br><span>@@ -106,19 +108,4 @@</span><br><span> return EXIT_SUCCESS;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-void sms_alloc() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void sms_free() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void gsm48_secure_channel() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void vty_out() {}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_client_conn_clear_queue() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_client_conn_close() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_client_conn_create() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_client_conn_destroy() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_client_conn_open() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_client_conn_send() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipa_msg_push_header() {}</span><br><span style="color: hsl(0, 100%, 40%);">-void ipaccess_bts_handle_ccm() {}</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *network) { return NULL; }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-struct tlv_definition nm_att_tlvdef;</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts) { return true; }</span><br><span>diff --git a/tests/gsm0408/Makefile.am b/tests/gsm0408/Makefile.am</span><br><span>index 9a74d44..6d10b9f 100644</span><br><span>--- a/tests/gsm0408/Makefile.am</span><br><span>+++ b/tests/gsm0408/Makefile.am</span><br><span>@@ -23,7 +23,11 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> gsm0408_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/rest_octets.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/system_information.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index a934806..9552fb1 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -24,7 +24,6 @@</span><br><span> #include <stdbool.h></span><br><span> #include <arpa/inet.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> #include <osmocom/bsc/gsm_data.h></span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/arfcn_range_encode.h></span><br><span>@@ -817,7 +816,7 @@</span><br><span> osmo_init_logging2(tall_bsc_ctx, &log_info);</span><br><span> log_set_log_level(osmo_stderr_target, LOGL_INFO);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- net = bsc_network_init(tall_bsc_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ net = gsm_network_init(tall_bsc_ctx);</span><br><span> if (!net) {</span><br><span> printf("Network init failure.\n");</span><br><span> return EXIT_FAILURE;</span><br><span>@@ -848,3 +847,8 @@</span><br><span> struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ return true;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am</span><br><span>index 957bbee..9cb77ea 100644</span><br><span>--- a/tests/handover/Makefile.am</span><br><span>+++ b/tests/handover/Makefile.am</span><br><span>@@ -34,7 +34,34 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> handover_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/a_reset.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_rsl.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_api.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_dyn_ts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_rll.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_subscr_conn_fsm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_sysmobts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/chan_alloc.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_04_08_utils.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_04_80_utils.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_cfg.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_decision.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_decision_2.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/handover_logic.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/meas_rep.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/paging.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/pcu_sock.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/penalty_timers.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/rest_octets.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/system_information.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 82afbe5..26074a2 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -37,7 +37,6 @@</span><br><span> #include <osmocom/bsc/system_information.h></span><br><span> #include <osmocom/bsc/handover_cfg.h></span><br><span> #include <osmocom/bsc/handover_decision_2.h></span><br><span style="color: hsl(0, 100%, 40%);">-#include <osmocom/bsc/common_bsc.h></span><br><span> #include <osmocom/bsc/bss.h></span><br><span> #include <osmocom/bsc/bsc_api.h></span><br><span> #include <osmocom/bsc/osmo_bsc.h></span><br><span>@@ -202,7 +201,7 @@</span><br><span> struct e1inp_sign_link *rsl_link;</span><br><span> int i;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bts = gsm_bts_alloc_register(bsc_gsmnet, GSM_BTS_TYPE_OSMOBTS, 0x3f);</span><br><span style="color: hsl(120, 100%, 40%);">+ bts = bsc_bts_alloc_register(bsc_gsmnet, GSM_BTS_TYPE_OSMOBTS, 0x3f);</span><br><span> if (!bts) {</span><br><span> printf("No resource for bts1\n");</span><br><span> return NULL;</span><br><span>@@ -1347,8 +1346,8 @@</span><br><span> struct gsm_lchan *lchan[256];</span><br><span> int lchan_num = 0;</span><br><span> int i;</span><br><span style="color: hsl(0, 100%, 40%);">- int algorithm;</span><br><span> struct bsc_api bsc_api = {};</span><br><span style="color: hsl(120, 100%, 40%);">+ int algorithm;</span><br><span> int test_case_i;</span><br><span> int last_test_i;</span><br><span> </span><br><span>@@ -1373,8 +1372,7 @@</span><br><span> log_set_print_category_hex(osmo_stderr_target, 0);</span><br><span> log_set_print_filename2(osmo_stderr_target, LOG_FILENAME_BASENAME);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Create a dummy network */</span><br><span style="color: hsl(0, 100%, 40%);">- bsc_gsmnet = bsc_network_init(ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_network_alloc();</span><br><span> if (!bsc_gsmnet)</span><br><span> exit(1);</span><br><span> </span><br><span>diff --git a/tests/nanobts_omlattr/Makefile.am b/tests/nanobts_omlattr/Makefile.am</span><br><span>index c2b2c3b..aa7045e 100644</span><br><span>--- a/tests/nanobts_omlattr/Makefile.am</span><br><span>+++ b/tests/nanobts_omlattr/Makefile.am</span><br><span>@@ -23,7 +23,9 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> nanobts_omlattr_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span>diff --git a/tests/nanobts_omlattr/nanobts_omlattr_test.c b/tests/nanobts_omlattr/nanobts_omlattr_test.c</span><br><span>index 8e8626d..72dabe5 100644</span><br><span>--- a/tests/nanobts_omlattr/nanobts_omlattr_test.c</span><br><span>+++ b/tests/nanobts_omlattr/nanobts_omlattr_test.c</span><br><span>@@ -305,3 +305,6 @@</span><br><span> struct gsm_subscriber_connection *bsc_subscr_con_allocate(struct gsm_network *net) {</span><br><span> OSMO_ASSERT(0);</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+bool on_gsm_ts_init(struct gsm_bts_trx_ts *ts)</span><br><span style="color: hsl(120, 100%, 40%);">+{ return true; }</span><br><span>diff --git a/tests/subscr/Makefile.am b/tests/subscr/Makefile.am</span><br><span>index 8d14ebf..e56d142 100644</span><br><span>--- a/tests/subscr/Makefile.am</span><br><span>+++ b/tests/subscr/Makefile.am</span><br><span>@@ -31,7 +31,7 @@</span><br><span> $(NULL)</span><br><span> </span><br><span> bsc_subscr_test_LDADD = \</span><br><span style="color: hsl(0, 100%, 40%);">- $(top_builddir)/src/libbsc/libbsc.a \</span><br><span style="color: hsl(120, 100%, 40%);">+ $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span> $(LIBOSMOCORE_LIBS) \</span><br><span> $(LIBOSMOABIS_LIBS) \</span><br><span> $(LIBOSMOGSM_LIBS) \</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/9481">change 9481</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/9481"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I36a586726f5818121abe54d25654819fc451d3bf </div>
<div style="display:none"> Gerrit-Change-Number: 9481 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>