<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>