<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/20409">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce NM BTS FSM<br><br>Change-Id: Iae631bcc7acdf955296b124707e42d5e565af186<br>---<br>M include/osmo-bts/Makefile.am<br>M include/osmo-bts/bts.h<br>A include/osmo-bts/nm_bts_fsm.h<br>M include/osmo-bts/oml.h<br>M src/common/Makefile.am<br>M src/common/abis.c<br>M src/common/bts.c<br>M src/common/bts_ctrl_commands.c<br>M src/common/main.c<br>A src/common/nm_bts_fsm.c<br>M src/common/oml.c<br>M src/common/rsl.c<br>M src/common/vty.c<br>M src/osmo-bts-litecell15/oml.c<br>M src/osmo-bts-oc2g/oml.c<br>M src/osmo-bts-octphy/l1_oml.c<br>M src/osmo-bts-omldummy/bts_model.c<br>M src/osmo-bts-sysmo/oml.c<br>M src/osmo-bts-trx/l1_if.c<br>M src/osmo-bts-virtual/bts_model.c<br>20 files changed, 273 insertions(+), 54 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bts refs/changes/09/20409/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmo-bts/Makefile.am b/include/osmo-bts/Makefile.am</span><br><span>index c03cf3c..8179f1a 100644</span><br><span>--- a/include/osmo-bts/Makefile.am</span><br><span>+++ b/include/osmo-bts/Makefile.am</span><br><span>@@ -28,4 +28,5 @@</span><br><span>        dtx_dl_amr_fsm.h \</span><br><span>   ta_control.h \</span><br><span>       nm_bts_sm_fsm.h \</span><br><span style="color: hsl(120, 100%, 40%);">+     nm_bts_fsm.h \</span><br><span>       $(NULL)</span><br><span>diff --git a/include/osmo-bts/bts.h b/include/osmo-bts/bts.h</span><br><span>index 191feb9..e4f4099 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -133,7 +133,12 @@</span><br><span>  struct timespec oml_conn_established_timestamp;</span><br><span> </span><br><span>  /* Abis network management O&M handle */</span><br><span style="color: hsl(0, 100%, 40%);">-    struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* NM BTS FSM */</span><br><span style="color: hsl(120, 100%, 40%);">+              struct osmo_fsm_inst *fi;</span><br><span style="color: hsl(120, 100%, 40%);">+             bool opstart_success;</span><br><span style="color: hsl(120, 100%, 40%);">+         struct gsm_abis_mo mo;</span><br><span style="color: hsl(120, 100%, 40%);">+        } nm;</span><br><span> </span><br><span>    /* number of this BTS on given E1 link */</span><br><span>    uint8_t bts_nr;</span><br><span>diff --git a/include/osmo-bts/nm_bts_fsm.h b/include/osmo-bts/nm_bts_fsm.h</span><br><span>new file mode 100644</span><br><span>index 0000000..9ee7427</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmo-bts/nm_bts_fsm.h</span><br><span>@@ -0,0 +1,40 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* NM BTS FSM. Following 3GPP TS 12.21 Figure 2/GSM 12.21:</span><br><span style="color: hsl(120, 100%, 40%);">+  GSM 12.21 Objects' Operational state and availability status behaviour during initialization */</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 <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum nm_bts_op_fsm_states {</span><br><span style="color: hsl(120, 100%, 40%);">+     NM_BTS_ST_OP_DISABLED_NOTINSTALLED,</span><br><span style="color: hsl(120, 100%, 40%);">+   NM_BTS_ST_OP_DISABLED_OFFLINE,</span><br><span style="color: hsl(120, 100%, 40%);">+        NM_BTS_ST_OP_ENABLED,</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%);">+enum nm_bts_op_fsm_events {</span><br><span style="color: hsl(120, 100%, 40%);">+      NM_BTS_EV_SW_ACT,</span><br><span style="color: hsl(120, 100%, 40%);">+     NM_BTS_EV_OPSTART_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+        NM_BTS_EV_OPSTART_NACK,</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%);">+extern struct osmo_fsm nm_bts_fsm;</span><br><span>diff --git a/include/osmo-bts/oml.h b/include/osmo-bts/oml.h</span><br><span>index 484e210..0689bb0 100644</span><br><span>--- a/include/osmo-bts/oml.h</span><br><span>+++ b/include/osmo-bts/oml.h</span><br><span>@@ -32,7 +32,7 @@</span><br><span>   struct gsm_bts *bts;</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int oml_init(struct gsm_abis_mo *mo);</span><br><span style="color: hsl(120, 100%, 40%);">+int oml_init(void);</span><br><span> int down_oml(struct gsm_bts *bts, struct msgb *msg);</span><br><span> </span><br><span> struct msgb *oml_msgb_alloc(void);</span><br><span>diff --git a/src/common/Makefile.am b/src/common/Makefile.am</span><br><span>index 6724374..546e02a 100644</span><br><span>--- a/src/common/Makefile.am</span><br><span>+++ b/src/common/Makefile.am</span><br><span>@@ -38,6 +38,7 @@</span><br><span>  scheduler_mframe.c \</span><br><span>         ta_control.c \</span><br><span>       nm_bts_sm_fsm.c \</span><br><span style="color: hsl(120, 100%, 40%);">+     nm_bts_fsm.c \</span><br><span>       $(NULL)</span><br><span> </span><br><span> libl1sched_a_SOURCES = scheduler.c</span><br><span>diff --git a/src/common/abis.c b/src/common/abis.c</span><br><span>index 4c62e8f..5b914c7 100644</span><br><span>--- a/src/common/abis.c</span><br><span>+++ b/src/common/abis.c</span><br><span>@@ -259,7 +259,7 @@</span><br><span> {</span><br><span>        g_bts = bts;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        oml_init(&bts->mo);</span><br><span style="color: hsl(120, 100%, 40%);">+    oml_init();</span><br><span>  libosmo_abis_init(tall_bts_ctx);</span><br><span> </span><br><span>         osmo_signal_register_handler(SS_L_INPUT, &inp_s_cbfn, bts);</span><br><span>diff --git a/src/common/bts.c b/src/common/bts.c</span><br><span>index 34a6be2..38ec553 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -53,6 +53,7 @@</span><br><span> #include <osmo-bts/cbch.h></span><br><span> #include <osmo-bts/bts_shutdown_fsm.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #define MIN_QUAL_RACH   50 /* minimum link quality (in centiBels) for Access Bursts */</span><br><span> #define MIN_QUAL_NORM         -5 /* minimum link quality (in centiBels) for Normal Bursts */</span><br><span>@@ -226,8 +227,10 @@</span><br><span>       gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER,</span><br><span>                   0xff, 0xff, 0xff);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      gsm_mo_init(&bts->mo, bts, NM_OC_BTS,</span><br><span style="color: hsl(0, 100%, 40%);">-                    bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+      bts->nm.fi = osmo_fsm_inst_alloc(&nm_bts_fsm, bts, bts,</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->nm.fi, "bts%d", bts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+      gsm_mo_init(&bts->nm.mo, bts, NM_OC_BTS, bts->nr, 0xff, 0xff);</span><br><span> </span><br><span>         for (i = 0; i < ARRAY_SIZE(bts->gprs.nsvc); i++) {</span><br><span>             bts->gprs.nsvc[i].bts = bts;</span><br><span>@@ -333,9 +336,9 @@</span><br><span> </span><br><span>    /* Start with the site manager */</span><br><span>    oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span style="color: hsl(120, 100%, 40%);">+   oml_mo_state_init(&bts->nm.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /* set BTS to dependency */</span><br><span style="color: hsl(0, 100%, 40%);">-     oml_mo_state_init(&bts->mo, -1, NM_AVSTATE_DEPENDENCY);</span><br><span style="color: hsl(120, 100%, 40%);">+        /* set BTS attr to dependency */</span><br><span>     oml_mo_state_init(&bts->gprs.nse.mo, -1, NM_AVSTATE_DEPENDENCY);</span><br><span>      oml_mo_state_init(&bts->gprs.cell.mo, -1, NM_AVSTATE_DEPENDENCY);</span><br><span>     oml_mo_state_init(&bts->gprs.nsvc[0].mo, -1, NM_AVSTATE_DEPENDENCY);</span><br><span>@@ -395,9 +398,9 @@</span><br><span> </span><br><span>        LOGP(DSUM, LOGL_INFO, "Main link established, sending NM Status.\n");</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* BTS SITE MGR becomes Offline (tx SW ACT Report), BTS is DEPENDENCY */</span><br><span style="color: hsl(120, 100%, 40%);">+      /* BTS SITE MGR and BTS become Offline (tx SW ACT Report) */</span><br><span>         osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_SW_ACT, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">- oml_tx_state_changed(&bts->mo);</span><br><span style="color: hsl(120, 100%, 40%);">+        osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_SM_EV_SW_ACT, NULL);</span><br><span> </span><br><span>        /* those should all be in DEPENDENCY */</span><br><span>      oml_tx_state_changed(&bts->gprs.nse.mo);</span><br><span>diff --git a/src/common/bts_ctrl_commands.c b/src/common/bts_ctrl_commands.c</span><br><span>index faaba6a..971a587 100644</span><br><span>--- a/src/common/bts_ctrl_commands.c</span><br><span>+++ b/src/common/bts_ctrl_commands.c</span><br><span>@@ -77,7 +77,7 @@</span><br><span> static int set_oml_alert(struct ctrl_cmd *cmd, void *data)</span><br><span> {</span><br><span>  /* Note: we expect signal dispatch to be synchronous */</span><br><span style="color: hsl(0, 100%, 40%);">- oml_tx_failure_event_rep(&g_bts->mo, NM_SEVER_INDETERMINATE, OSMO_EVT_EXT_ALARM, cmd->value);</span><br><span style="color: hsl(120, 100%, 40%);">+       oml_tx_failure_event_rep(&g_bts->nm.mo, NM_SEVER_INDETERMINATE, OSMO_EVT_EXT_ALARM, cmd->value);</span><br><span> </span><br><span>       cmd->reply = "OK";</span><br><span> </span><br><span>diff --git a/src/common/main.c b/src/common/main.c</span><br><span>index dfdc2a7..79ae43d 100644</span><br><span>--- a/src/common/main.c</span><br><span>+++ b/src/common/main.c</span><br><span>@@ -186,7 +186,7 @@</span><br><span>   case SIGINT:</span><br><span>         case SIGTERM:</span><br><span>                if (!quit) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    oml_tx_failure_event_rep(&bts->mo,</span><br><span style="color: hsl(120, 100%, 40%);">+                     oml_tx_failure_event_rep(&bts->nm.mo,</span><br><span>                                                  NM_SEVER_CRITICAL, OSMO_EVT_CRIT_PROC_STOP,</span><br><span>                                                  "BTS: SIGINT received -> shutdown");</span><br><span>                   bts_shutdown(bts, "SIGINT");</span><br><span>diff --git a/src/common/nm_bts_fsm.c b/src/common/nm_bts_fsm.c</span><br><span>new file mode 100644</span><br><span>index 0000000..1343fb3</span><br><span>--- /dev/null</span><br><span>+++ b/src/common/nm_bts_fsm.c</span><br><span>@@ -0,0 +1,152 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* NM BTS FSM */</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%);">+#include <errno.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <unistd.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <inttypes.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/tdef.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/gsm/protocol/gsm_12_21.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/gsm_data.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/bts_model.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/bts.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/rsl.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/phy_link.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define X(s) (1 << (s))</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define nm_bts_fsm_state_chg(fi, NEXT_STATE) \</span><br><span style="color: hsl(120, 100%, 40%);">+   osmo_fsm_inst_state_chg(fi, NEXT_STATE, 0, 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%);">+// FSM STATE ACTIONS</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 st_op_disabled_notinstalled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->nm.opstart_success = false;</span><br><span style="color: hsl(120, 100%, 40%);">+   oml_mo_state_chg(&bts->nm.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</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 st_op_disabled_notinstalled(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_BTS_EV_SW_ACT:</span><br><span style="color: hsl(120, 100%, 40%);">+                oml_mo_tx_sw_act_rep(&bts->nm.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+             nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_DISABLED_OFFLINE);</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_op_disabled_offline_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+  bts->nm.opstart_success = false;</span><br><span style="color: hsl(120, 100%, 40%);">+   oml_mo_state_chg(&bts->nm.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_OFF_LINE);</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 st_op_disabled_offline(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case NM_BTS_EV_OPSTART_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+           bts->nm.opstart_success = true;</span><br><span style="color: hsl(120, 100%, 40%);">+            oml_mo_opstart_ack(&bts->nm.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+               nm_bts_fsm_state_chg(fi, NM_BTS_ST_OP_ENABLED);</span><br><span style="color: hsl(120, 100%, 40%);">+               break; /* check statechg below */</span><br><span style="color: hsl(120, 100%, 40%);">+     case NM_BTS_EV_OPSTART_NACK:</span><br><span style="color: hsl(120, 100%, 40%);">+          bts->nm.opstart_success = false;</span><br><span style="color: hsl(120, 100%, 40%);">+           oml_mo_opstart_nack(&bts->nm.mo, (int)(intptr_t)data);</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+       default:</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%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void st_op_enabled_on_enter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  struct gsm_bts *bts = (struct gsm_bts *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+  oml_mo_state_chg(&bts->nm.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</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 st_op_enabled(struct osmo_fsm_inst *fi, uint32_t event, void *data)</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%);">+static struct osmo_fsm_state nm_bts_fsm_states[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+  [NM_BTS_ST_OP_DISABLED_NOTINSTALLED] = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .in_event_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NM_BTS_EV_SW_ACT),</span><br><span style="color: hsl(120, 100%, 40%);">+          .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(NM_BTS_ST_OP_DISABLED_OFFLINE),</span><br><span style="color: hsl(120, 100%, 40%);">+             .name = "DISABLED_NOTINSTALLED",</span><br><span style="color: hsl(120, 100%, 40%);">+            .onenter = st_op_disabled_notinstalled_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+              .action = st_op_disabled_notinstalled,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+    [NM_BTS_ST_OP_DISABLED_OFFLINE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+           .in_event_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                      X(NM_BTS_EV_OPSTART_ACK) |</span><br><span style="color: hsl(120, 100%, 40%);">+                    X(NM_BTS_EV_OPSTART_NACK),</span><br><span style="color: hsl(120, 100%, 40%);">+            .out_state_mask =</span><br><span style="color: hsl(120, 100%, 40%);">+                     X(NM_BTS_ST_OP_ENABLED),</span><br><span style="color: hsl(120, 100%, 40%);">+              .name = "DISABLED_OFFLINE",</span><br><span style="color: hsl(120, 100%, 40%);">+         .onenter = st_op_disabled_offline_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+           .action = st_op_disabled_offline,</span><br><span style="color: hsl(120, 100%, 40%);">+     },</span><br><span style="color: hsl(120, 100%, 40%);">+    [NM_BTS_ST_OP_ENABLED] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .in_event_mask = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+           .out_state_mask = 0,</span><br><span style="color: hsl(120, 100%, 40%);">+          .name = "ENABLED",</span><br><span style="color: hsl(120, 100%, 40%);">+          .onenter = st_op_enabled_on_enter,</span><br><span style="color: hsl(120, 100%, 40%);">+            .action = st_op_enabled,</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%);">+const struct value_string nm_bts_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      { NM_BTS_EV_SW_ACT, "SW_ACT" },</span><br><span style="color: hsl(120, 100%, 40%);">+     { NM_BTS_EV_OPSTART_ACK, "OPSTART_ACK" },</span><br><span style="color: hsl(120, 100%, 40%);">+   { NM_BTS_EV_OPSTART_NACK, "OPSTART_NACK" },</span><br><span style="color: hsl(120, 100%, 40%);">+ { 0, 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%);">+struct osmo_fsm nm_bts_fsm = {</span><br><span style="color: hsl(120, 100%, 40%);">+     .name = "NM_BTS_OP",</span><br><span style="color: hsl(120, 100%, 40%);">+        .states = nm_bts_fsm_states,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_states = ARRAY_SIZE(nm_bts_fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+  .event_names = nm_bts_fsm_event_names,</span><br><span style="color: hsl(120, 100%, 40%);">+        .log_subsys = DOML,</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 __attribute__((constructor)) void nm_bts_fsm_init(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(osmo_fsm_register(&nm_bts_fsm) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/src/common/oml.c b/src/common/oml.c</span><br><span>index fd4aed8..0dd7ecb 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -544,7 +544,7 @@</span><br><span> </span><br><span>      rc = oml_tlv_parse(&tp, foh->data, msgb_l3len(msg) - sizeof(*foh));</span><br><span>   if (rc < 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-                oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,</span><br><span style="color: hsl(120, 100%, 40%);">+            oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,</span><br><span>                                         "New value for Attribute not supported");</span><br><span>                 return oml_fom_ack_nack(msg, NM_NACK_INCORR_STRUCT);</span><br><span>         }</span><br><span>@@ -553,7 +553,7 @@</span><br><span>      if (TLVP_PRES_LEN(&tp, NM_ATT_BCCH_ARFCN, 2)) {</span><br><span>          uint16_t arfcn = ntohs(tlvp_val16_unal(&tp, NM_ATT_BCCH_ARFCN));</span><br><span>                 if (arfcn >= 1024) { /* 0 .. 1023 (1024 channels total) */</span><br><span style="color: hsl(0, 100%, 40%);">-                   oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,</span><br><span style="color: hsl(120, 100%, 40%);">+                      oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,</span><br><span>                                           "Given ARFCN %u is not supported",</span><br><span>                                                 arfcn);</span><br><span>                     LOGPFOH(DOML, LOGL_ERROR, foh, "Given ARFCN %u is not supported.\n", arfcn);</span><br><span>@@ -562,26 +562,26 @@</span><br><span>       }</span><br><span>    /* 9.4.52 Starting Time */</span><br><span>   if (TLVP_PRESENT(&tp, NM_ATT_START_TIME)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,</span><br><span style="color: hsl(120, 100%, 40%);">+            oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UNSUP_ATTR,</span><br><span>                                         "NM_ATT_START_TIME Attribute not "</span><br><span>                                         "supported");</span><br><span>             return oml_fom_ack_nack(msg, NM_NACK_SPEC_IMPL_NOTSUPP);</span><br><span>     }</span><br><span> </span><br><span>        /* merge existing BTS attributes with new attributes */</span><br><span style="color: hsl(0, 100%, 40%);">- tp_merged = osmo_tlvp_copy(bts->mo.nm_attr, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+  tp_merged = osmo_tlvp_copy(bts->nm.mo.nm_attr, bts);</span><br><span>      osmo_tlvp_merge(tp_merged, &tp);</span><br><span> </span><br><span>     /* Ask BTS driver to validate new merged attributes */</span><br><span style="color: hsl(0, 100%, 40%);">-  rc = bts_model_check_oml(bts, foh->msg_type, bts->mo.nm_attr, tp_merged, bts);</span><br><span style="color: hsl(120, 100%, 40%);">+  rc = bts_model_check_oml(bts, foh->msg_type, bts->nm.mo.nm_attr, tp_merged, bts);</span><br><span>      if (rc < 0) {</span><br><span>             talloc_free(tp_merged);</span><br><span>              return oml_fom_ack_nack(msg, -rc);</span><br><span>   }</span><br><span> </span><br><span>        /* Success: replace old BTS attributes with new */</span><br><span style="color: hsl(0, 100%, 40%);">-      talloc_free(bts->mo.nm_attr);</span><br><span style="color: hsl(0, 100%, 40%);">-        bts->mo.nm_attr = tp_merged;</span><br><span style="color: hsl(120, 100%, 40%);">+       talloc_free(bts->nm.mo.nm_attr);</span><br><span style="color: hsl(120, 100%, 40%);">+   bts->nm.mo.nm_attr = tp_merged;</span><br><span> </span><br><span>       /* ... and actually still parse them */</span><br><span> </span><br><span>@@ -776,7 +776,7 @@</span><br><span>            arfcn = ntohs(_value);</span><br><span>               value += 2;</span><br><span>          if (arfcn >= 1024) { /* 0 .. 1023 (1024 channels total) */</span><br><span style="color: hsl(0, 100%, 40%);">-                   oml_tx_failure_event_rep(&trx->bts->mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,</span><br><span style="color: hsl(120, 100%, 40%);">+                      oml_tx_failure_event_rep(&trx->bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_WARN_SW_WARN,</span><br><span>                                           "Given ARFCN %u is unsupported", arfcn);</span><br><span>                  LOGPFOH(DOML, LOGL_NOTICE, foh, "Given ARFCN %u is unsupported.\n", arfcn);</span><br><span>                        return oml_fom_ack_nack(msg, NM_NACK_FREQ_NOTAVAIL);</span><br><span>@@ -1052,7 +1052,7 @@</span><br><span> static inline bool report_bts_number_incorrect(struct gsm_bts *bts, const struct abis_om_fom_hdr *foh, bool is_formatted)</span><br><span> {</span><br><span>       struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct gsm_abis_mo *mo = &bts->mo;</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct gsm_abis_mo *mo = &bts->nm.mo;</span><br><span>   const char *form = is_formatted ?</span><br><span>            "Unexpected BTS %d in formatted O&M %s (exp. 0 or 0xFF)" :</span><br><span>             "Unexpected BTS %d in manufacturer O&M %s (exp. 0 or 0xFF)";</span><br><span>@@ -1076,7 +1076,7 @@</span><br><span>   struct abis_om_hdr *oh = msgb_l2(msg);</span><br><span>       struct abis_om_fom_hdr *foh = msgb_l3(msg);</span><br><span>  struct gsm_bts_trx *trx;</span><br><span style="color: hsl(0, 100%, 40%);">-        const struct gsm_abis_mo *mo = &bts->mo;</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct gsm_abis_mo *mo = &bts->nm.mo;</span><br><span>   int ret;</span><br><span> </span><br><span>         if (msgb_l2len(msg) < sizeof(*foh)) {</span><br><span>@@ -1375,7 +1375,7 @@</span><br><span> static int down_mom(struct gsm_bts *bts, struct msgb *msg)</span><br><span> {</span><br><span>  struct abis_om_hdr *oh = msgb_l2(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-  const struct gsm_abis_mo *mo = &bts->mo;</span><br><span style="color: hsl(120, 100%, 40%);">+       const struct gsm_abis_mo *mo = &bts->nm.mo;</span><br><span>   struct abis_om_fom_hdr *foh;</span><br><span>         struct gsm_bts_trx *trx;</span><br><span>     uint8_t idstrlen = oh->data[0];</span><br><span>@@ -1383,13 +1383,13 @@</span><br><span>         int ret;</span><br><span> </span><br><span>         if (msgb_l2len(msg) < sizeof(*foh)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                   "Manufacturer O&M message too short\n");</span><br><span>              return -EIO;</span><br><span>         }</span><br><span> </span><br><span>        if (strncmp((char *)&oh->data[1], abis_nm_ipa_magic, idstrlen)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                   "Manufacturer OML message != ipaccess not supported\n");</span><br><span>          return -EINVAL;</span><br><span>      }</span><br><span>@@ -1443,7 +1443,7 @@</span><br><span>    int ret = 0;</span><br><span> </span><br><span>     if (msgb_l2len(msg) < sizeof(*oh)) {</span><br><span style="color: hsl(0, 100%, 40%);">-         oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                   "OML message too short\n");</span><br><span>               msgb_free(msg);</span><br><span>              return -EIO;</span><br><span>@@ -1452,14 +1452,14 @@</span><br><span> </span><br><span>   /* We don't implement de-segmentation of segmented OML messages */</span><br><span>       if (oh->placement != ABIS_OM_PLACEMENT_ONLY || oh->sequence != 0) {</span><br><span style="color: hsl(0, 100%, 40%);">-               oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                   "Unsupported segmented O&M message\n");</span><br><span>               msgb_free(msg);</span><br><span>              return -EIO;</span><br><span>         }</span><br><span> </span><br><span>        if (msgb_l3len(msg) < oh->length) {</span><br><span style="color: hsl(0, 100%, 40%);">-               oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                   "Short OML message: %u < %u\n",</span><br><span>                                         msgb_l3len(msg), oh->length);</span><br><span>            msgb_free(msg);</span><br><span>@@ -1469,7 +1469,7 @@</span><br><span>      switch (oh->mdisc) {</span><br><span>      case ABIS_OM_MDISC_FOM:</span><br><span>              if (msgb_l2len(msg) < sizeof(*oh)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+                      oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                          "Formatted O&M message too short\n");</span><br><span>                  ret = -EIO;</span><br><span>                  break;</span><br><span>@@ -1478,7 +1478,7 @@</span><br><span>               break;</span><br><span>       case ABIS_OM_MDISC_MANUF:</span><br><span>            if (msgb_l2len(msg) < sizeof(*oh)) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+                      oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MAJOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                          "Manufacturer O&M message too short\n");</span><br><span>                       ret = -EIO;</span><br><span>                  break;</span><br><span>@@ -1486,7 +1486,7 @@</span><br><span>               ret = down_mom(bts, msg);</span><br><span>            break;</span><br><span>       default:</span><br><span style="color: hsl(0, 100%, 40%);">-                oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MINOR, OSMO_EVT_MAJ_UKWN_MSG,</span><br><span>                                   "unknown O&M msg_disc 0x%02x\n", oh->mdisc);</span><br><span>               ret = -EINVAL;</span><br><span>       }</span><br><span>@@ -1496,7 +1496,7 @@</span><br><span>    return ret;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-int oml_init(struct gsm_abis_mo *mo)</span><br><span style="color: hsl(120, 100%, 40%);">+int oml_init()</span><br><span> {</span><br><span>        DEBUGP(DOML, "Initializing OML attribute definitions\n");</span><br><span>  tlv_def_patch(&abis_nm_att_tlvdef_ipa_local, &abis_nm_att_tlvdef_ipa);</span><br><span>@@ -1528,7 +1528,7 @@</span><br><span> </span><br><span>   switch (obj_class) {</span><br><span>         case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">-         mo = &bts->mo;</span><br><span style="color: hsl(120, 100%, 40%);">+         mo = &bts->nm.mo;</span><br><span>             break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            if (obj_inst->trx_nr >= bts->num_trx) {</span><br><span>diff --git a/src/common/rsl.c b/src/common/rsl.c</span><br><span>index 919981d..91e9f75 100644</span><br><span>--- a/src/common/rsl.c</span><br><span>+++ b/src/common/rsl.c</span><br><span>@@ -485,7 +485,7 @@</span><br><span>  if (rc < 0) {</span><br><span>             /* FIXME: notfiy the BSC on other errors? */</span><br><span>                 if (rc == -ENOSPC) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    oml_tx_failure_event_rep(&trx->bts->mo, NM_SEVER_WARNING,</span><br><span style="color: hsl(120, 100%, 40%);">+                   oml_tx_failure_event_rep(&trx->bts->nm.mo, NM_SEVER_WARNING,</span><br><span>                                                OSMO_EVT_MIN_PAG_TAB_FULL, "BTS paging table is full");</span><br><span>           }</span><br><span>    }</span><br><span>diff --git a/src/common/vty.c b/src/common/vty.c</span><br><span>index b662320..c390979 100644</span><br><span>--- a/src/common/vty.c</span><br><span>+++ b/src/common/vty.c</span><br><span>@@ -872,7 +872,7 @@</span><br><span>                         bts->oml_link ? bts->oml_link->tei : 0x00,</span><br><span>                  VTY_NEWLINE);</span><br><span>        vty_out(vty, "  NM State: ");</span><br><span style="color: hsl(0, 100%, 40%);">- net_dump_nmstate(vty, &bts->mo.nm_state);</span><br><span style="color: hsl(120, 100%, 40%);">+      net_dump_nmstate(vty, &bts->nm.mo.nm_state);</span><br><span>  vty_out(vty, "  Site Mgr NM State: ");</span><br><span>     net_dump_nmstate(vty, &bts->site_mgr.mo.nm_state);</span><br><span>    if (strnlen(bts->pcu_version, MAX_VERSION_LENGTH))</span><br><span>@@ -958,7 +958,7 @@</span><br><span>  }</span><br><span> </span><br><span>        bts = gsm_bts_num(net, bts_nr);</span><br><span style="color: hsl(0, 100%, 40%);">- oml_tx_failure_event_rep(&bts->mo, NM_SEVER_MINOR, OSMO_EVT_WARN_SW_WARN, "test message sent from VTY");</span><br><span style="color: hsl(120, 100%, 40%);">+     oml_tx_failure_event_rep(&bts->nm.mo, NM_SEVER_MINOR, OSMO_EVT_WARN_SW_WARN, "test message sent from VTY");</span><br><span> </span><br><span>     return CMD_SUCCESS;</span><br><span> }</span><br><span>diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c</span><br><span>index 366e8da..11182cc 100644</span><br><span>--- a/src/osmo-bts-litecell15/oml.c</span><br><span>+++ b/src/osmo-bts-litecell15/oml.c</span><br><span>@@ -43,6 +43,7 @@</span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "lc15bts.h"</span><br><span>@@ -1891,13 +1892,15 @@</span><br><span>      case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            rc = trx_init(obj);</span><br><span>          break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>          rc = ts_opstart(obj);</span><br><span>                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BTS:</span><br><span>      case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>diff --git a/src/osmo-bts-oc2g/oml.c b/src/osmo-bts-oc2g/oml.c</span><br><span>index 798be8f..1ebb8b9 100644</span><br><span>--- a/src/osmo-bts-oc2g/oml.c</span><br><span>+++ b/src/osmo-bts-oc2g/oml.c</span><br><span>@@ -43,6 +43,7 @@</span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "oc2gbts.h"</span><br><span>@@ -1900,25 +1901,25 @@</span><br><span>         case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_mo_state_chg(&bts->mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+         oml_mo_state_chg(&bts->gprs.nse.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+                oml_mo_state_chg(&bts->gprs.cell.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+               oml_mo_state_chg(&bts->gprs.nsvc[0].mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            rc = trx_init(obj);</span><br><span>          break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>          rc = ts_opstart(obj);</span><br><span>                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BTS:</span><br><span>      case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>        case NM_OC_GPRS_NSVC:</span><br><span>                oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, -1);</span><br><span>                rc = oml_mo_opstart_ack(mo);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (mo->obj_class == NM_OC_BTS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    oml_mo_state_chg(&bts->mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-                   oml_mo_state_chg(&bts->gprs.nse.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-                  oml_mo_state_chg(&bts->gprs.cell.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-                 oml_mo_state_chg(&bts->gprs.nsvc[0].mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span>            break;</span><br><span>       default:</span><br><span>             rc = oml_mo_opstart_nack(mo, NM_NACK_OBJCLASS_NOTSUPP);</span><br><span>diff --git a/src/osmo-bts-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c</span><br><span>index 1d34378..8156c49 100644</span><br><span>--- a/src/osmo-bts-octphy/l1_oml.c</span><br><span>+++ b/src/osmo-bts-octphy/l1_oml.c</span><br><span>@@ -39,6 +39,7 @@</span><br><span> #include <osmo-bts/bts_model.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "l1_oml.h"</span><br><span>@@ -1770,6 +1771,9 @@</span><br><span>     case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            rc = trx_init(obj);</span><br><span>          break;</span><br><span>@@ -1777,7 +1781,6 @@</span><br><span>               ts = (struct gsm_bts_trx_ts*) obj;</span><br><span>           rc = ts_connect_as(ts, ts->pchan, pchan_act_compl_cb, NULL);</span><br><span>              break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BTS:</span><br><span>      case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>diff --git a/src/osmo-bts-omldummy/bts_model.c b/src/osmo-bts-omldummy/bts_model.c</span><br><span>index 7ac9391..dee671b 100644</span><br><span>--- a/src/osmo-bts-omldummy/bts_model.c</span><br><span>+++ b/src/osmo-bts-omldummy/bts_model.c</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> /* TODO: check if dummy method is sufficient, else implement */</span><br><span> int bts_model_lchan_deactivate(struct gsm_lchan *lchan)</span><br><span>@@ -133,6 +134,9 @@</span><br><span>         case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            trx = (struct gsm_bts_trx*) obj;</span><br><span>             /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span>@@ -147,7 +151,6 @@</span><br><span>            break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>  case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(0, 100%, 40%);">-        case NM_OC_BTS:</span><br><span>      case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>        case NM_OC_GPRS_NSVC:</span><br><span>diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c</span><br><span>index f58a0e6..9bbf02f 100644</span><br><span>--- a/src/osmo-bts-sysmo/oml.c</span><br><span>+++ b/src/osmo-bts-sysmo/oml.c</span><br><span>@@ -40,6 +40,7 @@</span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "femtobts.h"</span><br><span>@@ -1777,25 +1778,25 @@</span><br><span>    case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_mo_state_chg(&bts->nm.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_mo_state_chg(&bts->gprs.nse.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+                oml_mo_state_chg(&bts->gprs.cell.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+               oml_mo_state_chg(&bts->gprs.nsvc[0].mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            rc = trx_init(obj);</span><br><span>          break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>          rc = ts_opstart(obj);</span><br><span>                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case NM_OC_BTS:</span><br><span>      case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>        case NM_OC_GPRS_NSVC:</span><br><span>                oml_mo_state_chg(mo, NM_OPSTATE_ENABLED, -1);</span><br><span>                rc = oml_mo_opstart_ack(mo);</span><br><span style="color: hsl(0, 100%, 40%);">-            if (mo->obj_class == NM_OC_BTS) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    oml_mo_state_chg(&bts->mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-                   oml_mo_state_chg(&bts->gprs.nse.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-                  oml_mo_state_chg(&bts->gprs.cell.mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-                 oml_mo_state_chg(&bts->gprs.nsvc[0].mo, -1, NM_AVSTATE_OK);</span><br><span style="color: hsl(0, 100%, 40%);">-              }</span><br><span>            break;</span><br><span>       default:</span><br><span>             rc = oml_mo_opstart_nack(mo, NM_NACK_OBJCLASS_NOTSUPP);</span><br><span>diff --git a/src/osmo-bts-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index c19a1a6..03835a0 100644</span><br><span>--- a/src/osmo-bts-trx/l1_if.c</span><br><span>+++ b/src/osmo-bts-trx/l1_if.c</span><br><span>@@ -45,6 +45,7 @@</span><br><span> #include <osmo-bts/scheduler.h></span><br><span> #include <osmo-bts/pcu_if.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "trx_if.h"</span><br><span>@@ -620,12 +621,14 @@</span><br><span>    case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            /* activate transceiver */</span><br><span>           rc = trx_init(obj);</span><br><span>          break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span style="color: hsl(0, 100%, 40%);">-     case NM_OC_BTS:</span><br><span>      case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>diff --git a/src/osmo-bts-virtual/bts_model.c b/src/osmo-bts-virtual/bts_model.c</span><br><span>index 47f0ba2..66240e2 100644</span><br><span>--- a/src/osmo-bts-virtual/bts_model.c</span><br><span>+++ b/src/osmo-bts-virtual/bts_model.c</span><br><span>@@ -35,6 +35,7 @@</span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span> #include <osmo-bts/nm_bts_sm_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_fsm.h></span><br><span> </span><br><span> #include "virtual_um.h"</span><br><span> </span><br><span>@@ -147,6 +148,9 @@</span><br><span>  case NM_OC_SITE_MANAGER:</span><br><span>             rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_OPSTART_ACK, NULL);</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NM_OC_BTS:</span><br><span style="color: hsl(120, 100%, 40%);">+               rc = osmo_fsm_inst_dispatch(bts->nm.fi, NM_BTS_EV_OPSTART_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+              break;</span><br><span>       case NM_OC_RADIO_CARRIER:</span><br><span>            trx = (struct gsm_bts_trx*) obj;</span><br><span>             /* Mark Dependency TS as Offline (ready to be Opstarted) */</span><br><span>@@ -161,7 +165,6 @@</span><br><span>            break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span>  case NM_OC_BASEB_TRANSC:</span><br><span style="color: hsl(0, 100%, 40%);">-        case NM_OC_BTS:</span><br><span>      case NM_OC_GPRS_NSE:</span><br><span>         case NM_OC_GPRS_CELL:</span><br><span>        case NM_OC_GPRS_NSVC:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/20409">change 20409</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-bts/+/20409"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bts </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Iae631bcc7acdf955296b124707e42d5e565af186 </div>
<div style="display:none"> Gerrit-Change-Number: 20409 </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>