<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21423">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Store GPRS MOs directly under BTS SiteMgr object<br><br>The only real 1-1 relationship between BTS NM objects is the one between<br>GPRS Cell and BTS (which is actually a BTS cell).<br>In our current osmo-bts implementation we don't care much since we only<br>handle 1-cell BTSses, but let's make the data structure organization<br>more generic.<br><br>Implementation notes:<br>The gsm_bts_sm is moved to its own file, APIs to allocate are added and<br>the new public object is hooked correctly in the allocation process of<br>osmo-bsc.<br><br>Change-Id: I06461b7784fa2a78de37383406e35beae85fbad8<br>---<br>M include/osmocom/bsc/Makefile.am<br>M include/osmocom/bsc/bts.h<br>A include/osmocom/bsc/bts_sm.h<br>M include/osmocom/bsc/gsm_data.h<br>M src/ipaccess/Makefile.am<br>M src/osmo-bsc/Makefile.am<br>M src/osmo-bsc/abis_nm.c<br>M src/osmo-bsc/bsc_vty.c<br>M src/osmo-bsc/bts.c<br>M src/osmo-bsc/bts_ipaccess_nanobts.c<br>M src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c<br>M src/osmo-bsc/bts_nokia_site.c<br>A src/osmo-bsc/bts_sm.c<br>M src/osmo-bsc/gsm_data.c<br>M src/osmo-bsc/nm_bb_transc_fsm.c<br>M src/osmo-bsc/nm_bts_fsm.c<br>M src/osmo-bsc/nm_bts_sm_fsm.c<br>M src/osmo-bsc/nm_channel_fsm.c<br>M src/osmo-bsc/osmo_bsc_main.c<br>M src/osmo-bsc/pcu_sock.c<br>M src/utils/Makefile.am<br>M tests/abis/Makefile.am<br>M tests/acc/Makefile.am<br>M tests/acc/acc_test.c<br>M tests/bsc/Makefile.am<br>M tests/gsm0408/Makefile.am<br>M tests/gsm0408/gsm0408_test.c<br>M tests/handover/Makefile.am<br>M tests/nanobts_omlattr/Makefile.am<br>M tests/nanobts_omlattr/nanobts_omlattr_test.c<br>30 files changed, 328 insertions(+), 196 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/23/21423/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/Makefile.am b/include/osmocom/bsc/Makefile.am</span><br><span>index 1f066b6..e2d5db8 100644</span><br><span>--- a/include/osmocom/bsc/Makefile.am</span><br><span>+++ b/include/osmocom/bsc/Makefile.am</span><br><span>@@ -11,6 +11,7 @@</span><br><span>        bsc_subscr_conn_fsm.h \</span><br><span>      bss.h \</span><br><span>      bts.h \</span><br><span style="color: hsl(120, 100%, 40%);">+       bts_sm.h \</span><br><span>   bts_trx.h \</span><br><span>  bts_ipaccess_nanobts_omlattr.h \</span><br><span>     chan_alloc.h \</span><br><span>diff --git a/include/osmocom/bsc/bts.h b/include/osmocom/bsc/bts.h</span><br><span>index 22839d6..365b473 100644</span><br><span>--- a/include/osmocom/bsc/bts.h</span><br><span>+++ b/include/osmocom/bsc/bts.h</span><br><span>@@ -14,6 +14,7 @@</span><br><span> </span><br><span> #include "osmocom/bsc/gsm_data.h"</span><br><span> #include "osmocom/bsc/bts_trx.h"</span><br><span style="color: hsl(120, 100%, 40%);">+#include "osmocom/bsc/bts_sm.h"</span><br><span> </span><br><span> enum bts_counter_id {</span><br><span>         BTS_CTR_CHREQ_TOTAL,</span><br><span>@@ -197,17 +198,6 @@</span><br><span>  uint8_t _features_data[MAX_BTS_FEATURES/8];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* BTS Site Manager */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_sm {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* nanoBTS and old versions of osmo-bts behaves this way due to</span><br><span style="color: hsl(0, 100%, 40%);">-    broken FSMs not following TS 12.21: they never do</span><br><span style="color: hsl(0, 100%, 40%);">-       Dependency->Offline transition, but they should be OPSTARTed</span><br><span style="color: hsl(0, 100%, 40%);">-         nevertheless during Dependnecy state to work. This field is</span><br><span style="color: hsl(0, 100%, 40%);">-     used by all dependent NM objects. */</span><br><span style="color: hsl(0, 100%, 40%);">- bool peer_has_no_avstate_offline;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* One BTS */</span><br><span> struct gsm_bts {</span><br><span>     /* list header in net->bts_list */</span><br><span>@@ -272,7 +262,7 @@</span><br><span>  /* CCCH is on C0 */</span><br><span>  struct gsm_bts_trx *c0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     struct gsm_bts_sm site_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_sm *site_mgr; /* backpointer */</span><br><span> </span><br><span>   /* bitmask of all SI that are present/valid in si_buf */</span><br><span>     uint32_t si_valid;</span><br><span>@@ -354,18 +344,6 @@</span><br><span>    /* Not entirely sure how ip.access specific this is */</span><br><span>       struct {</span><br><span>             enum bts_gprs_mode mode;</span><br><span style="color: hsl(0, 100%, 40%);">-                struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint16_t nsei;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint8_t timer[7];</span><br><span style="color: hsl(0, 100%, 40%);">-               } nse;</span><br><span style="color: hsl(0, 100%, 40%);">-          struct {</span><br><span style="color: hsl(0, 100%, 40%);">-                        struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint16_t bvci;</span><br><span style="color: hsl(0, 100%, 40%);">-                  uint8_t timer[11];</span><br><span style="color: hsl(0, 100%, 40%);">-                      struct gprs_rlc_cfg rlc_cfg;</span><br><span style="color: hsl(0, 100%, 40%);">-            } cell;</span><br><span style="color: hsl(0, 100%, 40%);">-         struct gsm_bts_gprs_nsvc nsvc[2];</span><br><span>            uint8_t rac;</span><br><span>                 uint8_t net_ctrl_ord;</span><br><span>                bool ctrl_ack_type_use_block;</span><br><span>@@ -574,11 +552,7 @@</span><br><span>         return &lai;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static inline struct gsm_bts *gsm_bts_sm_get_bts(struct gsm_bts_sm *site_mgr) {</span><br><span style="color: hsl(0, 100%, 40%);">-        return (struct gsm_bts *)container_of(site_mgr, struct gsm_bts, site_mgr);</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_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, struct gsm_bts_sm *bts_sm, uint8_t bts_num);</span><br><span> </span><br><span> char *gsm_bts_name(const struct gsm_bts *bts);</span><br><span> </span><br><span>diff --git a/include/osmocom/bsc/bts_sm.h b/include/osmocom/bsc/bts_sm.h</span><br><span>new file mode 100644</span><br><span>index 0000000..32c7c34</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmocom/bsc/bts_sm.h</span><br><span>@@ -0,0 +1,80 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* BTS Site Manager */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/* (C) 2020 by sysmocom - s.m.f.c. GmbH <info@sysmocom.de></span><br><span style="color: hsl(120, 100%, 40%);">+ * Author: Pau Espin Pedrol <pespin@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 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%);">+#pragma once</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <stdint.h></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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_gprs_nse {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t timer[7];</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_gprs_cell {</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint16_t bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+        uint8_t timer[11];</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_rlc_cfg rlc_cfg;</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_gprs_nsvc {</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  /* data read via VTY config file, to configure the BTS</span><br><span style="color: hsl(120, 100%, 40%);">+         * via OML from BSC */</span><br><span style="color: hsl(120, 100%, 40%);">+        int id;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t nsvci;</span><br><span style="color: hsl(120, 100%, 40%);">+       uint16_t local_port;    /* on the BTS */</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_sockaddr remote;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_abis_mo mo;</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%);">+/* BTS Site Manager */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts_sm {</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts[1]; /* only one bts supported so far */</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* nanoBTS and old versions of osmo-bts behaves this way due to</span><br><span style="color: hsl(120, 100%, 40%);">+          broken FSMs not following TS 12.21: they never do</span><br><span style="color: hsl(120, 100%, 40%);">+     Dependency->Offline transition, but they should be OPSTARTed</span><br><span style="color: hsl(120, 100%, 40%);">+       nevertheless during Dependnecy state to work. This field is</span><br><span style="color: hsl(120, 100%, 40%);">+           used by all dependent NM objects. */</span><br><span style="color: hsl(120, 100%, 40%);">+       bool peer_has_no_avstate_offline;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_gprs_nse nse;</span><br><span style="color: hsl(120, 100%, 40%);">+              struct gsm_gprs_cell cell;</span><br><span style="color: hsl(120, 100%, 40%);">+            struct gsm_gprs_nsvc nsvc[2];</span><br><span style="color: hsl(120, 100%, 40%);">+ } gprs;</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 inline struct gsm_bts *gsm_bts_sm_get_bts(struct gsm_bts_sm *site_mgr) {</span><br><span style="color: hsl(120, 100%, 40%);">+        return site_mgr->bts[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_sm *gsm_bts_sm_alloc(struct gsm_network *net, uint8_t bts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void gsm_bts_sm_mo_reset(struct gsm_bts_sm *bts_sm);</span><br><span>diff --git a/include/osmocom/bsc/gsm_data.h b/include/osmocom/bsc/gsm_data.h</span><br><span>index a5b5a50..d8f8be2 100644</span><br><span>--- a/include/osmocom/bsc/gsm_data.h</span><br><span>+++ b/include/osmocom/bsc/gsm_data.h</span><br><span>@@ -767,17 +767,6 @@</span><br><span>         struct gsm_abis_mo mo;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts_gprs_nsvc {</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts *bts;</span><br><span style="color: hsl(0, 100%, 40%);">-    /* data read via VTY config file, to configure the BTS</span><br><span style="color: hsl(0, 100%, 40%);">-   * via OML from BSC */</span><br><span style="color: hsl(0, 100%, 40%);">-  int id;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t nsvci;</span><br><span style="color: hsl(0, 100%, 40%);">- uint16_t local_port;    /* on the BTS */</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_sockaddr remote;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_abis_mo mo;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> enum gprs_rlc_par {</span><br><span>      RLC_T3142,</span><br><span>   RLC_T3169,</span><br><span>diff --git a/src/ipaccess/Makefile.am b/src/ipaccess/Makefile.am</span><br><span>index 1574a8b..c489e0a 100644</span><br><span>--- a/src/ipaccess/Makefile.am</span><br><span>+++ b/src/ipaccess/Makefile.am</span><br><span>@@ -47,6 +47,7 @@</span><br><span> # FIXME: resolve the bogus dependencies patched around here:</span><br><span> ipaccess_config_LDADD = \</span><br><span>     $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>@@ -72,6 +73,7 @@</span><br><span>     $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>diff --git a/src/osmo-bsc/Makefile.am b/src/osmo-bsc/Makefile.am</span><br><span>index 5739885..89f869d 100644</span><br><span>--- a/src/osmo-bsc/Makefile.am</span><br><span>+++ b/src/osmo-bsc/Makefile.am</span><br><span>@@ -52,6 +52,7 @@</span><br><span>   bts_ipaccess_nanobts_omlattr.c \</span><br><span>     bts_nokia_site.c \</span><br><span>   bts_siemens_bs11.c \</span><br><span style="color: hsl(120, 100%, 40%);">+  bts_sm.c \</span><br><span>   bts_sysmobts.c \</span><br><span>     bts_unknown.c \</span><br><span>      chan_alloc.c \</span><br><span>diff --git a/src/osmo-bsc/abis_nm.c b/src/osmo-bsc/abis_nm.c</span><br><span>index 73dc2d0..4d245e5 100644</span><br><span>--- a/src/osmo-bsc/abis_nm.c</span><br><span>+++ b/src/osmo-bsc/abis_nm.c</span><br><span>@@ -863,14 +863,14 @@</span><br><span>          return false;</span><br><span> </span><br><span>    if (bts->gprs.mode != BTS_GPRS_NONE) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (bts->gprs.cell.mo.nm_state.administrative == NM_STATE_LOCKED)</span><br><span style="color: hsl(120, 100%, 40%);">+          if (bts->site_mgr->gprs.cell.mo.nm_state.administrative == NM_STATE_LOCKED)</span><br><span>                    return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               if (bts->gprs.nse.mo.nm_state.administrative == NM_STATE_LOCKED)</span><br><span style="color: hsl(120, 100%, 40%);">+           if (bts->site_mgr->gprs.nse.mo.nm_state.administrative == NM_STATE_LOCKED)</span><br><span>                     return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-               if (bts->gprs.nsvc[0].mo.nm_state.administrative == NM_STATE_LOCKED &&</span><br><span style="color: hsl(0, 100%, 40%);">-                   bts->gprs.nsvc[1].mo.nm_state.administrative == NM_STATE_LOCKED)</span><br><span style="color: hsl(120, 100%, 40%);">+               if (bts->site_mgr->gprs.nsvc[0].mo.nm_state.administrative == NM_STATE_LOCKED &&</span><br><span style="color: hsl(120, 100%, 40%);">+                    bts->site_mgr->gprs.nsvc[1].mo.nm_state.administrative == NM_STATE_LOCKED)</span><br><span>                         return false;</span><br><span>        }</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bsc_vty.c b/src/osmo-bsc/bsc_vty.c</span><br><span>index 846339d..3ee4c49 100644</span><br><span>--- a/src/osmo-bsc/bsc_vty.c</span><br><span>+++ b/src/osmo-bsc/bsc_vty.c</span><br><span>@@ -463,17 +463,17 @@</span><br><span>   vty_out(vty, "  NM State: ");</span><br><span>      net_dump_nmstate(vty, &bts->mo.nm_state);</span><br><span>     vty_out(vty, "  Site Mgr NM State: ");</span><br><span style="color: hsl(0, 100%, 40%);">-        net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+     net_dump_nmstate(vty, &bts->site_mgr->mo.nm_state);</span><br><span> </span><br><span>    if (bts->gprs.mode != BTS_GPRS_NONE) {</span><br><span>            vty_out(vty, "  GPRS NSE: ");</span><br><span style="color: hsl(0, 100%, 40%);">-         net_dump_nmstate(vty, &bts->gprs.nse.mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+             net_dump_nmstate(vty, &bts->site_mgr->gprs.nse.mo.nm_state);</span><br><span>               vty_out(vty, "  GPRS CELL: ");</span><br><span style="color: hsl(0, 100%, 40%);">-                net_dump_nmstate(vty, &bts->gprs.cell.mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+            net_dump_nmstate(vty, &bts->site_mgr->gprs.cell.mo.nm_state);</span><br><span>              vty_out(vty, "  GPRS NSVC0: ");</span><br><span style="color: hsl(0, 100%, 40%);">-               net_dump_nmstate(vty, &bts->gprs.nsvc[0].mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+         net_dump_nmstate(vty, &bts->site_mgr->gprs.nsvc[0].mo.nm_state);</span><br><span>           vty_out(vty, "  GPRS NSVC1: ");</span><br><span style="color: hsl(0, 100%, 40%);">-               net_dump_nmstate(vty, &bts->gprs.nsvc[1].mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+         net_dump_nmstate(vty, &bts->site_mgr->gprs.nsvc[1].mo.nm_state);</span><br><span>   } else</span><br><span>               vty_out(vty, "  GPRS: not configured%s", VTY_NEWLINE);</span><br><span> </span><br><span>@@ -740,6 +740,7 @@</span><br><span> static void config_write_bts_gprs(struct vty *vty, struct gsm_bts *bts)</span><br><span> {</span><br><span>   unsigned int i;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_sm *bts_sm = bts->site_mgr;</span><br><span>        vty_out(vty, "  gprs mode %s%s", bts_gprs_mode_name(bts->gprs.mode),</span><br><span>            VTY_NEWLINE);</span><br><span>        if (bts->gprs.mode == BTS_GPRS_NONE)</span><br><span>@@ -751,21 +752,21 @@</span><br><span>              bts->gprs.net_ctrl_ord, VTY_NEWLINE);</span><br><span>     if (!bts->gprs.ctrl_ack_type_use_block)</span><br><span>           vty_out(vty, "  gprs control-ack-type-rach%s", VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-  vty_out(vty, "  gprs cell bvci %u%s", bts->gprs.cell.bvci,</span><br><span style="color: hsl(120, 100%, 40%);">+       vty_out(vty, "  gprs cell bvci %u%s", bts_sm->gprs.cell.bvci,</span><br><span>           VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < ARRAY_SIZE(bts->gprs.cell.timer); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+  for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.cell.timer); i++)</span><br><span>              vty_out(vty, "  gprs cell timer %s %u%s",</span><br><span>                  get_value_string(gprs_bssgp_cfg_strs, i),</span><br><span style="color: hsl(0, 100%, 40%);">-                       bts->gprs.cell.timer[i], VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-       vty_out(vty, "  gprs nsei %u%s", bts->gprs.nse.nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                     bts_sm->gprs.cell.timer[i], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+  vty_out(vty, "  gprs nsei %u%s", bts_sm->gprs.nse.nsei,</span><br><span>                 VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-   for (i = 0; i < ARRAY_SIZE(bts->gprs.nse.timer); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nse.timer); i++)</span><br><span>               vty_out(vty, "  gprs ns timer %s %u%s",</span><br><span>                    get_value_string(gprs_ns_timer_strs, i),</span><br><span style="color: hsl(0, 100%, 40%);">-                        bts->gprs.nse.timer[i], VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-        for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                struct gsm_bts_gprs_nsvc *nsvc =</span><br><span style="color: hsl(0, 100%, 40%);">-                                        &bts->gprs.nsvc[i];</span><br><span style="color: hsl(120, 100%, 40%);">+                    bts_sm->gprs.nse.timer[i], VTY_NEWLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+   for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nsvc); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           struct gsm_gprs_nsvc *nsvc =</span><br><span style="color: hsl(120, 100%, 40%);">+                                  &bts_sm->gprs.nsvc[i];</span><br><span>                struct osmo_sockaddr_str remote = {};</span><br><span>                uint16_t port;</span><br><span> </span><br><span>@@ -3173,7 +3174,7 @@</span><br><span> </span><br><span>       GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    bts->gprs.cell.bvci = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->site_mgr->gprs.cell.bvci = atoi(argv[0]);</span><br><span> </span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -3190,7 +3191,7 @@</span><br><span> </span><br><span>         GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    bts->gprs.nse.nsei = atoi(argv[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+        bts->site_mgr->gprs.nse.nsei = atoi(argv[0]);</span><br><span> </span><br><span>      return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -3211,7 +3212,7 @@</span><br><span> </span><br><span>         GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    bts->gprs.nsvc[idx].nsvci = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+ bts->site_mgr->gprs.nsvc[idx].nsvci = atoi(argv[1]);</span><br><span> </span><br><span>       return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -3231,7 +3232,7 @@</span><br><span> </span><br><span>         GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    bts->gprs.nsvc[idx].local_port = atoi(argv[1]);</span><br><span style="color: hsl(120, 100%, 40%);">+    bts->site_mgr->gprs.nsvc[idx].local_port = atoi(argv[1]);</span><br><span> </span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -3252,7 +3253,7 @@</span><br><span>     GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span>         /* sockaddr_in and sockaddr_in6 have the port at the same position */</span><br><span style="color: hsl(0, 100%, 40%);">-   bts->gprs.nsvc[idx].remote.u.sin.sin_port = htons(atoi(argv[1]));</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->site_mgr->gprs.nsvc[idx].remote.u.sin.sin_port = htons(atoi(argv[1]));</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -3281,13 +3282,13 @@</span><br><span>   }</span><br><span> </span><br><span>        /* Can't use osmo_sockaddr_str_to_sockaddr() because the port would be overriden */</span><br><span style="color: hsl(0, 100%, 40%);">- bts->gprs.nsvc[idx].remote.u.sas.ss_family = remote.af;</span><br><span style="color: hsl(120, 100%, 40%);">+    bts->site_mgr->gprs.nsvc[idx].remote.u.sas.ss_family = remote.af;</span><br><span>      switch (remote.af) {</span><br><span>         case AF_INET:</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_sockaddr_str_to_in_addr(&remote, &bts->gprs.nsvc[idx].remote.u.sin.sin_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_sockaddr_str_to_in_addr(&remote, &bts->site_mgr->gprs.nsvc[idx].remote.u.sin.sin_addr);</span><br><span>           break;</span><br><span>       case AF_INET6:</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_sockaddr_str_to_in6_addr(&remote, &bts->gprs.nsvc[idx].remote.u.sin6.sin6_addr);</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_sockaddr_str_to_in6_addr(&remote, &bts->site_mgr->gprs.nsvc[idx].remote.u.sin6.sin6_addr);</span><br><span>                break;</span><br><span>       }</span><br><span> </span><br><span>@@ -3321,10 +3322,10 @@</span><br><span> </span><br><span>  GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.nse.timer))</span><br><span style="color: hsl(120, 100%, 40%);">+       if (idx < 0 || idx >= ARRAY_SIZE(bts->site_mgr->gprs.nse.timer))</span><br><span>                 return CMD_WARNING;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bts->gprs.nse.timer[idx] = val;</span><br><span style="color: hsl(120, 100%, 40%);">+    bts->site_mgr->gprs.nse.timer[idx] = val;</span><br><span> </span><br><span>  return CMD_SUCCESS;</span><br><span> }</span><br><span>@@ -3357,10 +3358,10 @@</span><br><span> </span><br><span>       GPRS_CHECK_ENABLED(bts);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (idx < 0 || idx >= ARRAY_SIZE(bts->gprs.cell.timer))</span><br><span style="color: hsl(120, 100%, 40%);">+      if (idx < 0 || idx >= ARRAY_SIZE(bts->site_mgr->gprs.cell.timer))</span><br><span>                return CMD_WARNING;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- bts->gprs.cell.timer[idx] = val;</span><br><span style="color: hsl(120, 100%, 40%);">+   bts->site_mgr->gprs.cell.timer[idx] = val;</span><br><span> </span><br><span>         return CMD_SUCCESS;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/bts.c b/src/osmo-bsc/bts.c</span><br><span>index 065b8ab..b7d64c6 100644</span><br><span>--- a/src/osmo-bsc/bts.c</span><br><span>+++ b/src/osmo-bsc/bts.c</span><br><span>@@ -121,38 +121,9 @@</span><br><span>         return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };</span><br><span style="color: hsl(0, 100%, 40%);">-static const uint8_t bts_cell_timer_default[] =</span><br><span style="color: hsl(0, 100%, 40%);">-                              { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct gprs_rlc_cfg rlc_cfg_default = {</span><br><span style="color: hsl(0, 100%, 40%);">-     .parameter = {</span><br><span style="color: hsl(0, 100%, 40%);">-          [RLC_T3142] = 20,</span><br><span style="color: hsl(0, 100%, 40%);">-               [RLC_T3169] = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_T3191] = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_T3193] = 160, /* 10ms */</span><br><span style="color: hsl(0, 100%, 40%);">-           [RLC_T3195] = 5,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_N3101] = 10,</span><br><span style="color: hsl(0, 100%, 40%);">-               [RLC_N3103] = 4,</span><br><span style="color: hsl(0, 100%, 40%);">-                [RLC_N3105] = 8,</span><br><span style="color: hsl(0, 100%, 40%);">-                [CV_COUNTDOWN] = 15,</span><br><span style="color: hsl(0, 100%, 40%);">-            [T_DL_TBF_EXT] = 250 * 10, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-             [T_UL_TBF_EXT] = 250 * 10, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-     },</span><br><span style="color: hsl(0, 100%, 40%);">-      .paging = {</span><br><span style="color: hsl(0, 100%, 40%);">-             .repeat_time = 5 * 50, /* ms */</span><br><span style="color: hsl(0, 100%, 40%);">-         .repeat_count = 3,</span><br><span style="color: hsl(0, 100%, 40%);">-      },</span><br><span style="color: hsl(0, 100%, 40%);">-      .cs_mask = 0x1fff,</span><br><span style="color: hsl(0, 100%, 40%);">-      .initial_cs = 2,</span><br><span style="color: hsl(0, 100%, 40%);">-        .initial_mcs = 6,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int gsm_bts_talloc_destructor(struct gsm_bts *bts)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   if (bts->site_mgr.mo.fi) {</span><br><span style="color: hsl(0, 100%, 40%);">-           osmo_fsm_inst_free(bts->site_mgr.mo.fi);</span><br><span style="color: hsl(0, 100%, 40%);">-             bts->site_mgr.mo.fi = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->site_mgr->bts[0] = NULL;</span><br><span>  if (bts->mo.fi) {</span><br><span>                 osmo_fsm_inst_free(bts->mo.fi);</span><br><span>           bts->mo.fi = NULL;</span><br><span>@@ -164,9 +135,9 @@</span><br><span>  * This part is shared among the thin programs in osmo-bsc/src/utils/.</span><br><span>  * osmo-bsc requires further initialization that pulls in more dependencies (see</span><br><span>  * bsc_bts_alloc_register()). */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, uint8_t bts_num)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gsm_bts *gsm_bts_alloc(struct gsm_network *net, struct gsm_bts_sm *bts_sm, uint8_t bts_num)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct gsm_bts *bts = talloc_zero(net, struct gsm_bts);</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts *bts = talloc_zero(bts_sm, struct gsm_bts);</span><br><span>   struct gsm48_multi_rate_conf mr_cfg;</span><br><span>         int i;</span><br><span> </span><br><span>@@ -182,36 +153,13 @@</span><br><span> </span><br><span>       bts->ms_max_power = 15;      /* dBm */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   bts->site_mgr.mo.fi = osmo_fsm_inst_alloc(&nm_bts_sm_fsm, bts, &bts->site_mgr,</span><br><span style="color: hsl(0, 100%, 40%);">-                                              LOGL_INFO, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_update_id_f(bts->site_mgr.mo.fi, "bts_sm");</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+     bts->site_mgr = bts_sm;</span><br><span> </span><br><span>       bts->mo.fi = osmo_fsm_inst_alloc(&nm_bts_fsm, bts, bts,</span><br><span>                                             LOGL_INFO, NULL);</span><br><span>      osmo_fsm_inst_update_id_f(bts->mo.fi, "bts%d", bts->nr);</span><br><span>     gsm_mo_init(&bts->mo, bts, NM_OC_BTS, bts->nr, 0xff, 0xff);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                bts->gprs.nsvc[i].bts = bts;</span><br><span style="color: hsl(0, 100%, 40%);">-         bts->gprs.nsvc[i].id = i;</span><br><span style="color: hsl(0, 100%, 40%);">-            gsm_mo_init(&bts->gprs.nsvc[i].mo, bts, NM_OC_GPRS_NSVC,</span><br><span style="color: hsl(0, 100%, 40%);">-                         bts->nr, i, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-   }</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(&bts->gprs.nse.timer, bts_nse_timer_default,</span><br><span style="color: hsl(0, 100%, 40%);">-              sizeof(bts->gprs.nse.timer));</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_mo_init(&bts->gprs.nse.mo, bts, NM_OC_GPRS_NSE,</span><br><span style="color: hsl(0, 100%, 40%);">-                      bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(&bts->gprs.cell.timer, bts_cell_timer_default,</span><br><span style="color: hsl(0, 100%, 40%);">-            sizeof(bts->gprs.cell.timer));</span><br><span style="color: hsl(0, 100%, 40%);">-       gsm_mo_init(&bts->gprs.cell.mo, bts, NM_OC_GPRS_CELL,</span><br><span style="color: hsl(0, 100%, 40%);">-                    bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-        memcpy(&bts->gprs.cell.rlc_cfg, &rlc_cfg_default,</span><br><span style="color: hsl(0, 100%, 40%);">-            sizeof(bts->gprs.cell.rlc_cfg));</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     /* 3GPP TS 08.18, chapter 5.4.1: 0 is reserved for signalling */</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->gprs.cell.bvci = 2;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>  /* init statistics */</span><br><span>        bts->bts_ctrs = rate_ctr_group_alloc(bts, &bts_ctrg_desc, bts->nr);</span><br><span>        if (!bts->bts_ctrs) {</span><br><span>@@ -589,11 +537,6 @@</span><br><span>      unsigned int i;</span><br><span> </span><br><span>  gsm_abis_mo_reset(&bts->mo);</span><br><span style="color: hsl(0, 100%, 40%);">-     gsm_abis_mo_reset(&bts->site_mgr.mo);</span><br><span style="color: hsl(0, 100%, 40%);">-    for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++)</span><br><span style="color: hsl(0, 100%, 40%);">-          gsm_abis_mo_reset(&bts->gprs.nsvc[i].mo);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_abis_mo_reset(&bts->gprs.nse.mo);</span><br><span style="color: hsl(0, 100%, 40%);">-    gsm_abis_mo_reset(&bts->gprs.cell.mo);</span><br><span> </span><br><span>    llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span>             gsm_abis_mo_reset(&trx->mo);</span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts.c b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>index f9dc8b3..49ae5db 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts.c</span><br><span>@@ -133,7 +133,7 @@</span><br><span>   struct gsm_bts_trx *trx;</span><br><span>     struct gsm_bts_bb_trx *bb_transc;</span><br><span>    struct gsm_bts_trx_ts *ts;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts_gprs_nsvc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_gprs_nsvc *nsvc;</span><br><span> </span><br><span>      struct msgb *msgb;</span><br><span> </span><br><span>@@ -174,7 +174,8 @@</span><br><span>                 osmo_fsm_inst_dispatch(trx->mo.fi, NM_EV_STATE_CHG_REP, nsd);</span><br><span>             break;</span><br><span>       case NM_OC_GPRS_NSE:</span><br><span style="color: hsl(0, 100%, 40%);">-            bts = container_of(obj, struct gsm_bts, gprs.nse);</span><br><span style="color: hsl(120, 100%, 40%);">+            bts_sm = container_of(obj, struct gsm_bts_sm, gprs.nse);</span><br><span style="color: hsl(120, 100%, 40%);">+              bts = bts_sm->bts[0];</span><br><span>             if (bts->gprs.mode == BTS_GPRS_NONE)</span><br><span>                      break;</span><br><span>               if (new_state->availability == NM_AVSTATE_DEPENDENCY) {</span><br><span>@@ -190,7 +191,8 @@</span><br><span>             }</span><br><span>            break;</span><br><span>       case NM_OC_GPRS_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-           bts = container_of(obj, struct gsm_bts, gprs.cell);</span><br><span style="color: hsl(120, 100%, 40%);">+           bts_sm = container_of(obj, struct gsm_bts_sm, gprs.cell);</span><br><span style="color: hsl(120, 100%, 40%);">+             bts = bts_sm->bts[0];</span><br><span>             if (bts->gprs.mode == BTS_GPRS_NONE)</span><br><span>                      break;</span><br><span>               if (new_state->availability == NM_AVSTATE_DEPENDENCY) {</span><br><span>@@ -258,7 +260,7 @@</span><br><span> </span><br><span>         switch (foh->obj_class) {</span><br><span>         case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_SW_ACT_REP, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_SW_ACT_REP, NULL);</span><br><span>          break;</span><br><span>       case NM_OC_BTS:</span><br><span>              osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_SW_ACT_REP, NULL);</span><br><span>@@ -306,7 +308,7 @@</span><br><span> </span><br><span>     switch (foh->obj_class) {</span><br><span>         case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OPSTART_ACK, NULL);</span><br><span>                 break;</span><br><span>       case NM_OC_BTS:</span><br><span>              osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OPSTART_ACK, NULL);</span><br><span>@@ -339,7 +341,7 @@</span><br><span> </span><br><span>    switch (foh->obj_class) {</span><br><span>         case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_OPSTART_NACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OPSTART_NACK, NULL);</span><br><span>                break;</span><br><span>       case NM_OC_BTS:</span><br><span>              osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OPSTART_ACK, NULL);</span><br><span>@@ -522,7 +524,7 @@</span><br><span>                }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_fsm_inst_dispatch(bts->site_mgr.mo.fi, NM_EV_OML_DOWN, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(bts->site_mgr->mo.fi, NM_EV_OML_DOWN, NULL);</span><br><span>    osmo_fsm_inst_dispatch(bts->mo.fi, NM_EV_OML_DOWN, NULL);</span><br><span>         gsm_bts_all_ts_dispatch(bts, TS_EV_OML_DOWN, NULL);</span><br><span> </span><br><span>diff --git a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>index 6d64a4b..6a7de53 100644</span><br><span>--- a/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>+++ b/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.c</span><br><span>@@ -105,18 +105,19 @@</span><br><span> {</span><br><span>        struct msgb *msgb;</span><br><span>   uint8_t buf[256];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_sm *bts_sm = bts->site_mgr;</span><br><span>        msgb = msgb_alloc(1024, "nanobts_attr_bts");</span><br><span>       if (!msgb)</span><br><span>           return NULL;</span><br><span> </span><br><span>     /* NSEI 925 */</span><br><span style="color: hsl(0, 100%, 40%);">-  buf[0] = bts->gprs.nse.nsei >> 8;</span><br><span style="color: hsl(0, 100%, 40%);">-      buf[1] = bts->gprs.nse.nsei & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[0] = bts_sm->gprs.nse.nsei >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+ buf[1] = bts_sm->gprs.nse.nsei & 0xff;</span><br><span>        msgb_tl16v_put(msgb, NM_ATT_IPACC_NSEI, 2, buf);</span><br><span> </span><br><span>         /* all timers in seconds */</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(ARRAY_SIZE(bts->gprs.nse.timer) < sizeof(buf));</span><br><span style="color: hsl(0, 100%, 40%);">-       memcpy(buf, bts->gprs.nse.timer, ARRAY_SIZE(bts->gprs.nse.timer));</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_ASSERT(ARRAY_SIZE(bts_sm->gprs.nse.timer) < sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+  memcpy(buf, bts_sm->gprs.nse.timer, ARRAY_SIZE(bts_sm->gprs.nse.timer));</span><br><span>       msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_CFG, 7, buf);</span><br><span> </span><br><span>       /* all timers in seconds */</span><br><span>@@ -132,8 +133,8 @@</span><br><span>    buf[9] = 10;    /* capability update timer (T5) */</span><br><span>   buf[10] = 3;    /* capability update retries */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(ARRAY_SIZE(bts->gprs.cell.timer) < sizeof(buf));</span><br><span style="color: hsl(0, 100%, 40%);">-      memcpy(buf, bts->gprs.cell.timer, ARRAY_SIZE(bts->gprs.cell.timer));</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_ASSERT(ARRAY_SIZE(bts_sm->gprs.cell.timer) < sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(buf, bts_sm->gprs.cell.timer, ARRAY_SIZE(bts_sm->gprs.cell.timer));</span><br><span>     msgb_tl16v_put(msgb, NM_ATT_IPACC_BSSGP_CFG, 11, buf);</span><br><span> </span><br><span>   return msgb;</span><br><span>@@ -143,6 +144,7 @@</span><br><span> {</span><br><span>      struct msgb *msgb;</span><br><span>   uint8_t buf[256];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_sm *bts_sm = bts->site_mgr;</span><br><span>        msgb = msgb_alloc(1024, "nanobts_attr_bts");</span><br><span>       if (!msgb)</span><br><span>           return NULL;</span><br><span>@@ -156,8 +158,8 @@</span><br><span>   msgb_tl16v_put(msgb, NM_ATT_IPACC_GPRS_PAGING_CFG, 2, buf);</span><br><span> </span><br><span>      /* BVCI 925 */</span><br><span style="color: hsl(0, 100%, 40%);">-  buf[0] = bts->gprs.cell.bvci >> 8;</span><br><span style="color: hsl(0, 100%, 40%);">-     buf[1] = bts->gprs.cell.bvci & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+   buf[0] = bts_sm->gprs.cell.bvci >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+        buf[1] = bts_sm->gprs.cell.bvci & 0xff;</span><br><span>       msgb_tl16v_put(msgb, NM_ATT_IPACC_BVCI, 2, buf);</span><br><span> </span><br><span>         /* all timers in seconds, unless otherwise stated */</span><br><span>@@ -202,16 +204,17 @@</span><br><span> {</span><br><span>    struct msgb *msgb;</span><br><span>   uint8_t buf[256];</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts_sm *bts_sm = bts->site_mgr;</span><br><span>        msgb = msgb_alloc(1024, "nanobts_attr_bts");</span><br><span>       if (!msgb)</span><br><span>           return NULL;</span><br><span> </span><br><span>     /* 925 */</span><br><span style="color: hsl(0, 100%, 40%);">-       buf[0] = bts->gprs.nsvc[0].nsvci >> 8;</span><br><span style="color: hsl(0, 100%, 40%);">- buf[1] = bts->gprs.nsvc[0].nsvci & 0xff;</span><br><span style="color: hsl(120, 100%, 40%);">+       buf[0] = bts_sm->gprs.nsvc[0].nsvci >> 8;</span><br><span style="color: hsl(120, 100%, 40%);">+    buf[1] = bts_sm->gprs.nsvc[0].nsvci & 0xff;</span><br><span>   msgb_tl16v_put(msgb, NM_ATT_IPACC_NSVCI, 2, buf);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   switch (bts->gprs.nsvc->remote.u.sa.sa_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (bts_sm->gprs.nsvc->remote.u.sa.sa_family) {</span><br><span>    case AF_INET6:</span><br><span>               /* all fields are encoded in network byte order */</span><br><span>           /* protocol family */</span><br><span>@@ -219,20 +222,20 @@</span><br><span>                /* padding */</span><br><span>                buf[1] = 0x00;</span><br><span>               /* local udp port */</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_store16be(bts->gprs.nsvc[0].local_port, &buf[2]);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_store16be(bts_sm->gprs.nsvc[0].local_port, &buf[2]);</span><br><span>             /* remote udp port */</span><br><span style="color: hsl(0, 100%, 40%);">-           memcpy(&buf[4], &bts->gprs.nsvc[0].remote.u.sin6.sin6_port, sizeof(uint16_t));</span><br><span style="color: hsl(120, 100%, 40%);">+             memcpy(&buf[4], &bts_sm->gprs.nsvc[0].remote.u.sin6.sin6_port, sizeof(uint16_t));</span><br><span>                 /* remote ip address */</span><br><span style="color: hsl(0, 100%, 40%);">-         memcpy(&buf[6], &bts->gprs.nsvc[0].remote.u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+              memcpy(&buf[6], &bts_sm->gprs.nsvc[0].remote.u.sin6.sin6_addr, sizeof(struct in6_addr));</span><br><span>          msgb_tl16v_put(msgb, NM_ATT_OSMO_NS_LINK_CFG, 6 + sizeof(struct in6_addr), buf);</span><br><span>             break;</span><br><span>       case AF_INET:</span><br><span>                /* remote udp port */</span><br><span style="color: hsl(0, 100%, 40%);">-           memcpy(&buf[0], &bts->gprs.nsvc[0].remote.u.sin.sin_port, sizeof(uint16_t));</span><br><span style="color: hsl(120, 100%, 40%);">+               memcpy(&buf[0], &bts_sm->gprs.nsvc[0].remote.u.sin.sin_port, sizeof(uint16_t));</span><br><span>           /* remote ip address */</span><br><span style="color: hsl(0, 100%, 40%);">-         memcpy(&buf[2], &bts->gprs.nsvc[0].remote.u.sin.sin_addr, sizeof(struct in_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+         memcpy(&buf[2], &bts_sm->gprs.nsvc[0].remote.u.sin.sin_addr, sizeof(struct in_addr));</span><br><span>             /* local udp port */</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_store16be(bts->gprs.nsvc[0].local_port, &buf[6]);</span><br><span style="color: hsl(120, 100%, 40%);">+         osmo_store16be(bts_sm->gprs.nsvc[0].local_port, &buf[6]);</span><br><span>             msgb_tl16v_put(msgb, NM_ATT_IPACC_NS_LINK_CFG, 8, buf);</span><br><span>              break;</span><br><span>       default:</span><br><span>diff --git a/src/osmo-bsc/bts_nokia_site.c b/src/osmo-bsc/bts_nokia_site.c</span><br><span>index 2b6f918..3820ead 100644</span><br><span>--- a/src/osmo-bsc/bts_nokia_site.c</span><br><span>+++ b/src/osmo-bsc/bts_nokia_site.c</span><br><span>@@ -1452,7 +1452,7 @@</span><br><span>    struct gsm_bts_trx *trx;</span><br><span> </span><br><span>         mo_ok(&bts->mo);</span><br><span style="color: hsl(0, 100%, 40%);">- mo_ok(&bts->site_mgr.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+      mo_ok(&bts->site_mgr->mo);</span><br><span> </span><br><span>     llist_for_each_entry(trx, &bts->trx_list, list) {</span><br><span>             int i;</span><br><span>diff --git a/src/osmo-bsc/bts_sm.c b/src/osmo-bsc/bts_sm.c</span><br><span>new file mode 100644</span><br><span>index 0000000..96acff8</span><br><span>--- /dev/null</span><br><span>+++ b/src/osmo-bsc/bts_sm.c</span><br><span>@@ -0,0 +1,119 @@</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) 2020 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 <osmocom/gsm/abis_nm.h></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/bsc/bts.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/nm_common_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const uint8_t bts_nse_timer_default[] = { 3, 3, 3, 3, 30, 3, 10 };</span><br><span style="color: hsl(120, 100%, 40%);">+static const uint8_t bts_cell_timer_default[] =</span><br><span style="color: hsl(120, 100%, 40%);">+                         { 3, 3, 3, 3, 3, 10, 3, 10, 3, 10, 3 };</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct gprs_rlc_cfg rlc_cfg_default = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .parameter = {</span><br><span style="color: hsl(120, 100%, 40%);">+                [RLC_T3142] = 20,</span><br><span style="color: hsl(120, 100%, 40%);">+             [RLC_T3169] = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              [RLC_T3191] = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              [RLC_T3193] = 160, /* 10ms */</span><br><span style="color: hsl(120, 100%, 40%);">+         [RLC_T3195] = 5,</span><br><span style="color: hsl(120, 100%, 40%);">+              [RLC_N3101] = 10,</span><br><span style="color: hsl(120, 100%, 40%);">+             [RLC_N3103] = 4,</span><br><span style="color: hsl(120, 100%, 40%);">+              [RLC_N3105] = 8,</span><br><span style="color: hsl(120, 100%, 40%);">+              [CV_COUNTDOWN] = 15,</span><br><span style="color: hsl(120, 100%, 40%);">+          [T_DL_TBF_EXT] = 250 * 10, /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+           [T_UL_TBF_EXT] = 250 * 10, /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+   },</span><br><span style="color: hsl(120, 100%, 40%);">+    .paging = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .repeat_time = 5 * 50, /* ms */</span><br><span style="color: hsl(120, 100%, 40%);">+               .repeat_count = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+    },</span><br><span style="color: hsl(120, 100%, 40%);">+    .cs_mask = 0x1fff,</span><br><span style="color: hsl(120, 100%, 40%);">+    .initial_cs = 2,</span><br><span style="color: hsl(120, 100%, 40%);">+      .initial_mcs = 6,</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 gsm_bts_sm_talloc_destructor(struct gsm_bts_sm *bts_sm)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bts_sm->mo.fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_free(bts_sm->mo.fi);</span><br><span style="color: hsl(120, 100%, 40%);">+         bts_sm->mo.fi = NULL;</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_sm *gsm_bts_sm_alloc(struct gsm_network *net, uint8_t bts_num)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts_sm *bts_sm = talloc_zero(net, struct gsm_bts_sm);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_bts *bts;</span><br><span style="color: hsl(120, 100%, 40%);">+  int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!bts_sm)</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%);">+        talloc_set_destructor(bts_sm, gsm_bts_sm_talloc_destructor);</span><br><span style="color: hsl(120, 100%, 40%);">+  bts_sm->mo.fi = osmo_fsm_inst_alloc(&nm_bts_sm_fsm, bts_sm, bts_sm,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        LOGL_INFO, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_update_id_f(bts_sm->mo.fi, "bts_sm");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    bts = gsm_bts_alloc(net, bts_sm, bts_num);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bts) {</span><br><span style="color: hsl(120, 100%, 40%);">+           talloc_free(bts_sm);</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%);">+     bts_sm->bts[0] = bts;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    gsm_mo_init(&bts_sm->mo, bts, NM_OC_SITE_MANAGER, 0xff, 0xff, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nsvc); i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+           bts_sm->gprs.nsvc[i].bts = bts;</span><br><span style="color: hsl(120, 100%, 40%);">+            bts_sm->gprs.nsvc[i].id = i;</span><br><span style="color: hsl(120, 100%, 40%);">+               gsm_mo_init(&bts_sm->gprs.nsvc[i].mo, bts, NM_OC_GPRS_NSVC,</span><br><span style="color: hsl(120, 100%, 40%);">+                            bts->nr, i, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+     memcpy(&bts_sm->gprs.nse.timer, bts_nse_timer_default,</span><br><span style="color: hsl(120, 100%, 40%);">+         sizeof(bts_sm->gprs.nse.timer));</span><br><span style="color: hsl(120, 100%, 40%);">+   gsm_mo_init(&bts_sm->gprs.nse.mo, bts, NM_OC_GPRS_NSE,</span><br><span style="color: hsl(120, 100%, 40%);">+                 bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(&bts_sm->gprs.cell.timer, bts_cell_timer_default,</span><br><span style="color: hsl(120, 100%, 40%);">+               sizeof(bts_sm->gprs.cell.timer));</span><br><span style="color: hsl(120, 100%, 40%);">+  gsm_mo_init(&bts_sm->gprs.cell.mo, bts, NM_OC_GPRS_CELL,</span><br><span style="color: hsl(120, 100%, 40%);">+                       bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+      memcpy(&bts_sm->gprs.cell.rlc_cfg, &rlc_cfg_default,</span><br><span style="color: hsl(120, 100%, 40%);">+               sizeof(bts_sm->gprs.cell.rlc_cfg));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      /* 3GPP TS 08.18, chapter 5.4.1: 0 is reserved for signalling */</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_sm->gprs.cell.bvci = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      return bts_sm;</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_sm_mo_reset(struct gsm_bts_sm *bts_sm)</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%);">+        gsm_abis_mo_reset(&bts_sm->mo);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      for (i = 0; i < ARRAY_SIZE(bts_sm->gprs.nsvc); i++)</span><br><span style="color: hsl(120, 100%, 40%);">+             gsm_abis_mo_reset(&bts_sm->gprs.nsvc[i].mo);</span><br><span style="color: hsl(120, 100%, 40%);">+   gsm_abis_mo_reset(&bts_sm->gprs.nse.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+       gsm_abis_mo_reset(&bts_sm->gprs.cell.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    gsm_bts_mo_reset(bts_sm->bts[0]);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/osmo-bsc/gsm_data.c b/src/osmo-bsc/gsm_data.c</span><br><span>index 22616f3..3087c0c 100644</span><br><span>--- a/src/osmo-bsc/gsm_data.c</span><br><span>+++ b/src/osmo-bsc/gsm_data.c</span><br><span>@@ -110,14 +110,16 @@</span><br><span>                                     uint8_t bsic)</span><br><span> {</span><br><span>   struct gsm_bts_model *model = bts_model_find(type);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts_sm *bts_sm;</span><br><span>   struct gsm_bts *bts;</span><br><span> </span><br><span>     if (!model && type != GSM_BTS_TYPE_UNKNOWN)</span><br><span>          return NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        bts = gsm_bts_alloc(net, net->num_bts);</span><br><span style="color: hsl(0, 100%, 40%);">-      if (!bts)</span><br><span style="color: hsl(120, 100%, 40%);">+     bts_sm = gsm_bts_sm_alloc(net, net->num_bts);</span><br><span style="color: hsl(120, 100%, 40%);">+      if (!bts_sm)</span><br><span>                 return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  bts = bts_sm->bts[0];</span><br><span> </span><br><span>         net->num_bts++;</span><br><span> </span><br><span>@@ -378,7 +380,7 @@</span><br><span>                 mo = &trx->ts[obj_inst->ts_nr].mo;</span><br><span>                 break;</span><br><span>       case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                mo = &bts->site_mgr.mo;</span><br><span style="color: hsl(120, 100%, 40%);">+                mo = &bts->site_mgr->mo;</span><br><span>           break;</span><br><span>       case NM_OC_BS11:</span><br><span>             switch (obj_inst->bts_nr) {</span><br><span>@@ -410,15 +412,15 @@</span><br><span>               mo = &bts->bs11.envabtse[obj_inst->trx_nr].mo;</span><br><span>             break;</span><br><span>       case NM_OC_GPRS_NSE:</span><br><span style="color: hsl(0, 100%, 40%);">-            mo = &bts->gprs.nse.mo;</span><br><span style="color: hsl(120, 100%, 40%);">+                mo = &bts->site_mgr->gprs.nse.mo;</span><br><span>          break;</span><br><span>       case NM_OC_GPRS_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-           mo = &bts->gprs.cell.mo;</span><br><span style="color: hsl(120, 100%, 40%);">+               mo = &bts->site_mgr->gprs.cell.mo;</span><br><span>                 break;</span><br><span>       case NM_OC_GPRS_NSVC:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))</span><br><span style="color: hsl(120, 100%, 40%);">+          if (obj_inst->trx_nr >= ARRAY_SIZE(bts->site_mgr->gprs.nsvc))</span><br><span>                    return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            mo = &bts->gprs.nsvc[obj_inst->trx_nr].mo;</span><br><span style="color: hsl(120, 100%, 40%);">+          mo = &bts->site_mgr->gprs.nsvc[obj_inst->trx_nr].mo;</span><br><span>            break;</span><br><span>       }</span><br><span>    return mo;</span><br><span>@@ -474,18 +476,18 @@</span><br><span>           obj = &trx->ts[obj_inst->ts_nr];</span><br><span>           break;</span><br><span>       case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(0, 100%, 40%);">-                obj = &bts->site_mgr;</span><br><span style="color: hsl(120, 100%, 40%);">+          obj = bts->site_mgr;</span><br><span>              break;</span><br><span>       case NM_OC_GPRS_NSE:</span><br><span style="color: hsl(0, 100%, 40%);">-            obj = &bts->gprs.nse;</span><br><span style="color: hsl(120, 100%, 40%);">+          obj = &bts->site_mgr->gprs.nse;</span><br><span>            break;</span><br><span>       case NM_OC_GPRS_CELL:</span><br><span style="color: hsl(0, 100%, 40%);">-           obj = &bts->gprs.cell;</span><br><span style="color: hsl(120, 100%, 40%);">+         obj = &bts->site_mgr->gprs.cell;</span><br><span>           break;</span><br><span>       case NM_OC_GPRS_NSVC:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (obj_inst->trx_nr >= ARRAY_SIZE(bts->gprs.nsvc))</span><br><span style="color: hsl(120, 100%, 40%);">+          if (obj_inst->trx_nr >= ARRAY_SIZE(bts->site_mgr->gprs.nsvc))</span><br><span>                    return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            obj = &bts->gprs.nsvc[obj_inst->trx_nr];</span><br><span style="color: hsl(120, 100%, 40%);">+            obj = &bts->site_mgr->gprs.nsvc[obj_inst->trx_nr];</span><br><span>              break;</span><br><span>       }</span><br><span>    return obj;</span><br><span>diff --git a/src/osmo-bsc/nm_bb_transc_fsm.c b/src/osmo-bsc/nm_bb_transc_fsm.c</span><br><span>index c29f53d..e7132e8 100644</span><br><span>--- a/src/osmo-bsc/nm_bb_transc_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_bb_transc_fsm.c</span><br><span>@@ -113,7 +113,7 @@</span><br><span>   struct gsm_bts_bb_trx *bb_transc = (struct gsm_bts_bb_trx *)fi->priv;</span><br><span>     struct gsm_bts_trx *trx = gsm_bts_bb_trx_get_trx(bb_transc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (trx->bts->site_mgr.peer_has_no_avstate_offline) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (trx->bts->site_mgr->peer_has_no_avstate_offline) {</span><br><span>              nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_OFFLINE);</span><br><span>                 return;</span><br><span>      }</span><br><span>@@ -187,7 +187,7 @@</span><br><span>              case NM_AVSTATE_DEPENDENCY:</span><br><span>                  /* There's no point in moving back to Dependency, since it's broken</span><br><span>                     and it acts actually as if it was in Offline state */</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (!trx->bts->site_mgr.peer_has_no_avstate_offline) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (!trx->bts->site_mgr->peer_has_no_avstate_offline) {</span><br><span>                             nm_bb_transc_fsm_state_chg(fi, NM_BB_TRANSC_ST_OP_DISABLED_DEPENDENCY);</span><br><span>                      } else {</span><br><span>                             /* Moreover, in nanoBTS we need to check here for tx</span><br><span>diff --git a/src/osmo-bsc/nm_bts_fsm.c b/src/osmo-bsc/nm_bts_fsm.c</span><br><span>index 5f47fdc..6c577bd 100644</span><br><span>--- a/src/osmo-bsc/nm_bts_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_bts_fsm.c</span><br><span>@@ -119,7 +119,7 @@</span><br><span>  /* nanoBTS is broken, doesn't follow TS 12.21. Opstart MUST be sent</span><br><span>         during Dependency, so we simply move to OFFLINE state here to avoid</span><br><span>          duplicating code */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (bts->site_mgr.peer_has_no_avstate_offline) {</span><br><span style="color: hsl(120, 100%, 40%);">+   if (bts->site_mgr->peer_has_no_avstate_offline) {</span><br><span>              nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_OFFLINE);</span><br><span>             return;</span><br><span>      }</span><br><span>@@ -202,7 +202,7 @@</span><br><span>              case NM_AVSTATE_DEPENDENCY:</span><br><span>                  /* There's no point in moving back to Dependency, since it's broken</span><br><span>                     and it acts actually as if it was in Offline state */</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (!bts->site_mgr.peer_has_no_avstate_offline) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  if (!bts->site_mgr->peer_has_no_avstate_offline) {</span><br><span>                             nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_DEPENDENCY);</span><br><span>                  } else {</span><br><span>                             /* Moreover, in nanoBTS we need to check here for tx</span><br><span>diff --git a/src/osmo-bsc/nm_bts_sm_fsm.c b/src/osmo-bsc/nm_bts_sm_fsm.c</span><br><span>index ce9e15b..e5b5a3c 100644</span><br><span>--- a/src/osmo-bsc/nm_bts_sm_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_bts_sm_fsm.c</span><br><span>@@ -78,7 +78,7 @@</span><br><span>                                         "have your .cfg with 'type nanobts'. Otherwise, you probably "</span><br><span>                                     "are using an old osmo-bts; automatically adjusting OML "</span><br><span>                                          "behavior to be backward-compatible.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                            bts->site_mgr.peer_has_no_avstate_offline = true;</span><br><span style="color: hsl(120, 100%, 40%);">+                          site_mgr->peer_has_no_avstate_offline = true;</span><br><span>                     }</span><br><span>                    nm_bts_sm_fsm_state_chg(fi, NM_BTS_SM_ST_OP_ENABLED);</span><br><span>                        return;</span><br><span>diff --git a/src/osmo-bsc/nm_channel_fsm.c b/src/osmo-bsc/nm_channel_fsm.c</span><br><span>index 676c471..620051a 100644</span><br><span>--- a/src/osmo-bsc/nm_channel_fsm.c</span><br><span>+++ b/src/osmo-bsc/nm_channel_fsm.c</span><br><span>@@ -125,7 +125,7 @@</span><br><span> {</span><br><span>  struct gsm_bts_trx_ts *ts = (struct gsm_bts_trx_ts *)fi->priv;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (ts->trx->bts->site_mgr.peer_has_no_avstate_offline) {</span><br><span style="color: hsl(120, 100%, 40%);">+    if (ts->trx->bts->site_mgr->peer_has_no_avstate_offline) {</span><br><span>               nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_OFFLINE);</span><br><span>           return;</span><br><span>      }</span><br><span>@@ -208,7 +208,7 @@</span><br><span>              case NM_AVSTATE_DEPENDENCY:</span><br><span>                  /* There's no point in moving back to Dependency, since it's broken</span><br><span>                     and it acts actually as if it was in Offline state */</span><br><span style="color: hsl(0, 100%, 40%);">-                        if (!ts->trx->bts->site_mgr.peer_has_no_avstate_offline) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   if (!ts->trx->bts->site_mgr->peer_has_no_avstate_offline) {</span><br><span>                              nm_chan_fsm_state_chg(fi, NM_CHAN_ST_OP_DISABLED_DEPENDENCY);</span><br><span>                        } else {</span><br><span>                             /* Moreover, in nanoBTS we need to check here for tx</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 cc02c71..3be8593 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>@@ -424,7 +424,7 @@</span><br><span>                              osmo_timer_del(&trx->bts->cbch_timer);</span><br><span>             }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           gsm_bts_mo_reset(trx->bts);</span><br><span style="color: hsl(120, 100%, 40%);">+                gsm_bts_sm_mo_reset(trx->bts->site_mgr);</span><br><span> </span><br><span>           abis_nm_clear_queue(trx->bts);</span><br><span>            break;</span><br><span>@@ -529,7 +529,7 @@</span><br><span>         /* ACC ramping is initialized from vty/config */</span><br><span> </span><br><span>         /* Initialize the BTS state */</span><br><span style="color: hsl(0, 100%, 40%);">-  gsm_bts_mo_reset(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+        gsm_bts_sm_mo_reset(bts->site_mgr);</span><br><span> </span><br><span>   return 0;</span><br><span> }</span><br><span>diff --git a/src/osmo-bsc/pcu_sock.c b/src/osmo-bsc/pcu_sock.c</span><br><span>index 541fc84..3ffee3c 100644</span><br><span>--- a/src/osmo-bsc/pcu_sock.c</span><br><span>+++ b/src/osmo-bsc/pcu_sock.c</span><br><span>@@ -46,6 +46,7 @@</span><br><span> #include <osmocom/bsc/abis_rsl.h></span><br><span> #include <osmocom/bsc/gsm_04_08_rr.h></span><br><span> #include <osmocom/bsc/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bts_sm.h></span><br><span> </span><br><span> static int pcu_sock_send(struct gsm_bts *bts, struct msgb *msg);</span><br><span> uint32_t trx_get_hlayer1(struct gsm_bts_trx *trx);</span><br><span>@@ -115,17 +116,21 @@</span><br><span>     struct gsm_pcu_if *pcu_prim;</span><br><span>         struct gsm_pcu_if_info_ind *info_ind;</span><br><span>        struct gprs_rlc_cfg *rlcc;</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_bts_gprs_nsvc *nsvc;</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gsm_bts_sm *bts_sm;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gsm_gprs_nsvc *nsvc;</span><br><span>  struct gsm_bts_trx *trx;</span><br><span>     struct gsm_bts_trx_ts *ts;</span><br><span>   int i, tn;</span><br><span> </span><br><span>       OSMO_ASSERT(bts);</span><br><span>    OSMO_ASSERT(bts->network);</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_ASSERT(bts->site_mgr);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      bts_sm = bts->site_mgr;</span><br><span> </span><br><span>       LOGP(DPCU, LOGL_INFO, "Sending info for BTS %d\n",bts->nr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    rlcc = &bts->gprs.cell.rlc_cfg;</span><br><span style="color: hsl(120, 100%, 40%);">+        rlcc = &bts_sm->gprs.cell.rlc_cfg;</span><br><span> </span><br><span>        msg = pcu_msgb_alloc(PCU_IF_MSG_INFO_IND, bts->nr);</span><br><span>       if (!msg)</span><br><span>@@ -147,15 +152,15 @@</span><br><span>    info_ind->rac = bts->gprs.rac;</span><br><span> </span><br><span>     /* NSE */</span><br><span style="color: hsl(0, 100%, 40%);">-       info_ind->nsei = bts->gprs.nse.nsei;</span><br><span style="color: hsl(0, 100%, 40%);">-      memcpy(info_ind->nse_timer, bts->gprs.nse.timer, 7);</span><br><span style="color: hsl(0, 100%, 40%);">-      memcpy(info_ind->cell_timer, bts->gprs.cell.timer, 11);</span><br><span style="color: hsl(120, 100%, 40%);">+ info_ind->nsei = bts_sm->gprs.nse.nsei;</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(info_ind->nse_timer, bts_sm->gprs.nse.timer, 7);</span><br><span style="color: hsl(120, 100%, 40%);">+ memcpy(info_ind->cell_timer, bts_sm->gprs.cell.timer, 11);</span><br><span> </span><br><span>         /* cell attributes */</span><br><span>        info_ind->cell_id = bts->cell_identity;</span><br><span>        info_ind->repeat_time = rlcc->paging.repeat_time;</span><br><span>      info_ind->repeat_count = rlcc->paging.repeat_count;</span><br><span style="color: hsl(0, 100%, 40%);">-       info_ind->bvci = bts->gprs.cell.bvci;</span><br><span style="color: hsl(120, 100%, 40%);">+   info_ind->bvci = bts_sm->gprs.cell.bvci;</span><br><span>       info_ind->t3142 = rlcc->parameter[RLC_T3142];</span><br><span>  info_ind->t3169 = rlcc->parameter[RLC_T3169];</span><br><span>  info_ind->t3191 = rlcc->parameter[RLC_T3191];</span><br><span>@@ -202,7 +207,7 @@</span><br><span> </span><br><span>        /* NSVC */</span><br><span>   for (i = 0; i < ARRAY_SIZE(info_ind->nsvci); i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-               nsvc = &bts->gprs.nsvc[i];</span><br><span style="color: hsl(120, 100%, 40%);">+             nsvc = &bts->site_mgr->gprs.nsvc[i];</span><br><span> </span><br><span>           info_ind->nsvci[i] = nsvc->nsvci;</span><br><span>              info_ind->local_port[i] = nsvc->local_port;</span><br><span>diff --git a/src/utils/Makefile.am b/src/utils/Makefile.am</span><br><span>index 65fd8fa..dfc68c5 100644</span><br><span>--- a/src/utils/Makefile.am</span><br><span>+++ b/src/utils/Makefile.am</span><br><span>@@ -50,6 +50,7 @@</span><br><span>       $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/bts_siemens_bs11.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>@@ -130,6 +131,7 @@</span><br><span>  $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>diff --git a/tests/abis/Makefile.am b/tests/abis/Makefile.am</span><br><span>index d7d53b7..681e35a 100644</span><br><span>--- a/tests/abis/Makefile.am</span><br><span>+++ b/tests/abis/Makefile.am</span><br><span>@@ -29,6 +29,7 @@</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(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_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span>diff --git a/tests/acc/Makefile.am b/tests/acc/Makefile.am</span><br><span>index b1315e3..1536365 100644</span><br><span>--- a/tests/acc/Makefile.am</span><br><span>+++ b/tests/acc/Makefile.am</span><br><span>@@ -28,6 +28,7 @@</span><br><span>       $(top_builddir)/src/osmo-bsc/abis_nm.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>diff --git a/tests/acc/acc_test.c b/tests/acc/acc_test.c</span><br><span>index 81b9e8d..73757c7 100644</span><br><span>--- a/tests/acc/acc_test.c</span><br><span>+++ b/tests/acc/acc_test.c</span><br><span>@@ -44,7 +44,8 @@</span><br><span> #define bts_init(net) _bts_init(net, __func__)</span><br><span> static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gsm_bts *bts = gsm_bts_alloc(net, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_sm *bts_sm = gsm_bts_sm_alloc(net, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = bts_sm->bts[0];</span><br><span>     if (!bts) {</span><br><span>          fprintf(stderr, "BTS allocation failure in %s()\n", msg);</span><br><span>          exit(1);</span><br><span>@@ -66,7 +67,7 @@</span><br><span>         if (osmo_timer_pending(&bts->acc_ramp.step_timer))</span><br><span>            osmo_timer_del(&bts->acc_ramp.step_timer);</span><br><span>    /* no need to llist_del(&bts->list), we never registered the bts there. */</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_free(bts->site_mgr);</span><br><span>       fprintf(stderr, "BTS deallocated OK in %s()\n", msg);</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/bsc/Makefile.am b/tests/bsc/Makefile.am</span><br><span>index f040cbc..02842eb 100644</span><br><span>--- a/tests/bsc/Makefile.am</span><br><span>+++ b/tests/bsc/Makefile.am</span><br><span>@@ -39,6 +39,7 @@</span><br><span>        $(top_builddir)/src/osmo-bsc/osmo_bsc_filter.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>diff --git a/tests/gsm0408/Makefile.am b/tests/gsm0408/Makefile.am</span><br><span>index de38747..c04a5ae 100644</span><br><span>--- a/tests/gsm0408/Makefile.am</span><br><span>+++ b/tests/gsm0408/Makefile.am</span><br><span>@@ -29,6 +29,7 @@</span><br><span>       $(top_builddir)/src/osmo-bsc/arfcn_range_encode.o \</span><br><span>  $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span>         $(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_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/net_init.o \</span><br><span>diff --git a/tests/gsm0408/gsm0408_test.c b/tests/gsm0408/gsm0408_test.c</span><br><span>index 8ee29f7..c23b262 100644</span><br><span>--- a/tests/gsm0408/gsm0408_test.c</span><br><span>+++ b/tests/gsm0408/gsm0408_test.c</span><br><span>@@ -123,7 +123,8 @@</span><br><span> #define bts_init(net) _bts_init(net, __func__)</span><br><span> static inline struct gsm_bts *_bts_init(struct gsm_network *net, const char *msg)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        struct gsm_bts *bts = gsm_bts_alloc(net, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts_sm *bts_sm = gsm_bts_sm_alloc(net, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = bts_sm->bts[0];</span><br><span>     if (!bts) {</span><br><span>          printf("BTS allocation failure in %s()\n", msg);</span><br><span>           exit(1);</span><br><span>@@ -143,7 +144,7 @@</span><br><span>       if (osmo_timer_pending(&bts->acc_mgr.rotate_timer))</span><br><span>           osmo_timer_del(&bts->acc_mgr.rotate_timer);</span><br><span>   /* no need to llist_del(&bts->list), we never registered the bts there. */</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(bts);</span><br><span style="color: hsl(120, 100%, 40%);">+     talloc_free(bts->site_mgr);</span><br><span>       printf("BTS deallocated OK in %s()\n", msg);</span><br><span> }</span><br><span> </span><br><span>diff --git a/tests/handover/Makefile.am b/tests/handover/Makefile.am</span><br><span>index 42bb937..02fcdc1 100644</span><br><span>--- a/tests/handover/Makefile.am</span><br><span>+++ b/tests/handover/Makefile.am</span><br><span>@@ -58,6 +58,7 @@</span><br><span>     $(top_builddir)/src/osmo-bsc/bsc_subscriber.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bsc_vty.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>diff --git a/tests/nanobts_omlattr/Makefile.am b/tests/nanobts_omlattr/Makefile.am</span><br><span>index 3dd7f2f..29097b8 100644</span><br><span>--- a/tests/nanobts_omlattr/Makefile.am</span><br><span>+++ b/tests/nanobts_omlattr/Makefile.am</span><br><span>@@ -27,6 +27,7 @@</span><br><span>   $(top_builddir)/src/osmo-bsc/acc.o \</span><br><span>         $(top_builddir)/src/osmo-bsc/bts_ipaccess_nanobts_omlattr.o \</span><br><span>        $(top_builddir)/src/osmo-bsc/bts.o \</span><br><span style="color: hsl(120, 100%, 40%);">+  $(top_builddir)/src/osmo-bsc/bts_sm.o \</span><br><span>      $(top_builddir)/src/osmo-bsc/bts_trx.o \</span><br><span>     $(top_builddir)/src/osmo-bsc/gsm_data.o \</span><br><span>    $(top_builddir)/src/osmo-bsc/nm_common_fsm.o \</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 da220c1..eb74832 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>@@ -243,7 +243,7 @@</span><br><span>    };</span><br><span> </span><br><span>       /* Parameters needed to test nanobts_attr_nse_get() */</span><br><span style="color: hsl(0, 100%, 40%);">-  bts->gprs.nse.nsei = 101;</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->site_mgr->gprs.nse.nsei = 101;</span><br><span>    uint8_t attr_nse_expected[] =</span><br><span>            { 0x9d, 0x00, 0x02, 0x00, 0x65, 0xa0, 0x00, 0x07, 0x03, 0x03, 0x03,</span><br><span>              0x03, 0x1e, 0x03, 0x0a, 0xa1, 0x00, 0x0b, 0x03, 0x03, 0x03,</span><br><span>@@ -253,7 +253,7 @@</span><br><span> </span><br><span>        /* Parameters needed to test nanobts_attr_cell_get() */</span><br><span>      bts->gprs.rac = 0x00;</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->gprs.cell.bvci = 2;</span><br><span style="color: hsl(120, 100%, 40%);">+   bts->site_mgr->gprs.cell.bvci = 2;</span><br><span>     bts->gprs.mode = BTS_GPRS_GPRS;</span><br><span>   uint8_t attr_cell_expected[] =</span><br><span>           { 0x9a, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x02, 0x05, 0x03, 0x9e, 0x00,</span><br><span>@@ -266,9 +266,9 @@</span><br><span>        /* Parameters needed to test nanobts_attr_nscv_get() */</span><br><span>      struct osmo_sockaddr_str addr;</span><br><span>       osmo_sockaddr_str_from_str(&addr, "10.9.1.101", 23000);</span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_sockaddr_str_to_sockaddr(&addr, &bts->gprs.nsvc[0].remote.u.sas);</span><br><span style="color: hsl(0, 100%, 40%);">-       bts->gprs.nsvc[0].nsvci = 0x65;</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->gprs.nsvc[0].local_port = 0x5a3c;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_sockaddr_str_to_sockaddr(&addr, &bts->site_mgr->gprs.nsvc[0].remote.u.sas);</span><br><span style="color: hsl(120, 100%, 40%);">+        bts->site_mgr->gprs.nsvc[0].nsvci = 0x65;</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->site_mgr->gprs.nsvc[0].local_port = 0x5a3c;</span><br><span>       uint8_t attr_nscv_expected[] =</span><br><span>           { 0x9f, 0x00, 0x02, 0x00, 0x65, 0xa2, 0x00, 0x08, 0x59, 0xd8, 0x0a,</span><br><span>              0x09, 0x01, 0x65, 0x5a, 0x3c</span><br><span>@@ -291,9 +291,9 @@</span><br><span>   /* NSVC IPv6 test */</span><br><span>         struct osmo_sockaddr_str addr6;</span><br><span>      osmo_sockaddr_str_from_str(&addr6, "fd00:5678:9012:3456:7890:1234:5678:9012", 23010);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_sockaddr_str_to_sockaddr(&addr6, &bts->gprs.nsvc[0].remote.u.sas);</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->gprs.nsvc[0].nsvci = 0x65;</span><br><span style="color: hsl(0, 100%, 40%);">-      bts->gprs.nsvc[0].local_port = 0x5a3c;</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_sockaddr_str_to_sockaddr(&addr6, &bts->site_mgr->gprs.nsvc[0].remote.u.sas);</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->site_mgr->gprs.nsvc[0].nsvci = 0x65;</span><br><span style="color: hsl(120, 100%, 40%);">+       bts->site_mgr->gprs.nsvc[0].local_port = 0x5a3c;</span><br><span>       uint8_t attr_nscv6_expected[] =</span><br><span>            /*                             |- oml attr  |-16bit length */</span><br><span>      { 0x9f, 0x00, 0x02, 0x00, 0x65, 0xfd, 0x00, 0x16,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/21423">change 21423</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/c/osmo-bsc/+/21423"/><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-Change-Id: I06461b7784fa2a78de37383406e35beae85fbad8 </div>
<div style="display:none"> Gerrit-Change-Number: 21423 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>