<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bts/+/20408">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">Introduce NM BTS Site Manager FSM<br><br>This fixes old behavior mimicing broken behavior in nanoBTS (according to TS 12.21)<br>where BTS Site Mgr NM object was announced as Enabled despite no OPSTART<br>was sent by the BSC.<br>With this new FSM, BTS SiteManager will be announced as Disabled Offline<br>during OML startup conversation, instead of Enabled.<br><br>The new osmo-bsc OML management FSMs use this change in behavior to find<br>out whether it should use the old broken management states (without<br>Offline state, as per nanoBTS) or use the new state transitions (which<br>allow fixing several race conditions).<br><br>Change-Id: Iab2d17c45c9642860cd2d5d523c1baae24502243<br>---<br>M include/osmo-bts/Makefile.am<br>M include/osmo-bts/bts.h<br>A include/osmo-bts/nm_bts_sm_fsm.h<br>M src/common/Makefile.am<br>M src/common/bts.c<br>A src/common/nm_bts_sm_fsm.c<br>M src/common/oml.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>14 files changed, 236 insertions(+), 13 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/08/20408/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 cdbaa4f..c03cf3c 100644</span><br><span>--- a/include/osmo-bts/Makefile.am</span><br><span>+++ b/include/osmo-bts/Makefile.am</span><br><span>@@ -27,4 +27,5 @@</span><br><span>   phy_link.h \</span><br><span>         dtx_dl_amr_fsm.h \</span><br><span>   ta_control.h \</span><br><span style="color: hsl(120, 100%, 40%);">+        nm_bts_sm_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 ffaeb57..191feb9 100644</span><br><span>--- a/include/osmo-bts/bts.h</span><br><span>+++ b/include/osmo-bts/bts.h</span><br><span>@@ -145,6 +145,9 @@</span><br><span>   struct gsm_bts_trx *c0;</span><br><span> </span><br><span>  struct {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* NM BTS Site Manager 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>                struct gsm_abis_mo mo;</span><br><span>       } site_mgr;</span><br><span> </span><br><span>diff --git a/include/osmo-bts/nm_bts_sm_fsm.h b/include/osmo-bts/nm_bts_sm_fsm.h</span><br><span>new file mode 100644</span><br><span>index 0000000..552d289</span><br><span>--- /dev/null</span><br><span>+++ b/include/osmo-bts/nm_bts_sm_fsm.h</span><br><span>@@ -0,0 +1,40 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* NM BTS Site Manager 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_sm_op_fsm_states {</span><br><span style="color: hsl(120, 100%, 40%);">+    NM_BTS_SM_ST_OP_DISABLED_NOTINSTALLED,</span><br><span style="color: hsl(120, 100%, 40%);">+        NM_BTS_SM_ST_OP_DISABLED_OFFLINE,</span><br><span style="color: hsl(120, 100%, 40%);">+     NM_BTS_SM_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_sm_op_fsm_events {</span><br><span style="color: hsl(120, 100%, 40%);">+        NM_BTS_SM_EV_SW_ACT,</span><br><span style="color: hsl(120, 100%, 40%);">+  NM_BTS_SM_EV_OPSTART_ACK,</span><br><span style="color: hsl(120, 100%, 40%);">+     NM_BTS_SM_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_sm_fsm;</span><br><span>diff --git a/src/common/Makefile.am b/src/common/Makefile.am</span><br><span>index e3a72dc..6724374 100644</span><br><span>--- a/src/common/Makefile.am</span><br><span>+++ b/src/common/Makefile.am</span><br><span>@@ -37,6 +37,7 @@</span><br><span>     dtx_dl_amr_fsm.c \</span><br><span>   scheduler_mframe.c \</span><br><span>         ta_control.c \</span><br><span style="color: hsl(120, 100%, 40%);">+        nm_bts_sm_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/bts.c b/src/common/bts.c</span><br><span>index c900428..34a6be2 100644</span><br><span>--- a/src/common/bts.c</span><br><span>+++ b/src/common/bts.c</span><br><span>@@ -52,6 +52,7 @@</span><br><span> #include <osmo-bts/dtx_dl_amr_fsm.h></span><br><span> #include <osmo-bts/cbch.h></span><br><span> #include <osmo-bts/bts_shutdown_fsm.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_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>@@ -219,10 +220,14 @@</span><br><span>                                             LOGL_INFO, NULL);</span><br><span>     osmo_fsm_inst_update_id_f(bts->shutdown_fi, "bts%d", bts->nr);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+    bts->site_mgr.fi = osmo_fsm_inst_alloc(&nm_bts_sm_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->site_mgr.fi, "bts_sm%d", bts->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+     gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER,</span><br><span style="color: hsl(120, 100%, 40%);">+                    0xff, 0xff, 0xff);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     gsm_mo_init(&bts->mo, bts, NM_OC_BTS,</span><br><span>                         bts->nr, 0xff, 0xff);</span><br><span style="color: hsl(0, 100%, 40%);">-        gsm_mo_init(&bts->site_mgr.mo, bts, NM_OC_SITE_MANAGER,</span><br><span style="color: hsl(0, 100%, 40%);">-                  0xff, 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>@@ -327,7 +332,7 @@</span><br><span>        bts->radio_link_timeout = 32;</span><br><span> </span><br><span>         /* Start with the site manager */</span><br><span style="color: hsl(0, 100%, 40%);">-       oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_ENABLED, NM_AVSTATE_OK);</span><br><span style="color: hsl(120, 100%, 40%);">+       oml_mo_state_init(&bts->site_mgr.mo, NM_OPSTATE_DISABLED, NM_AVSTATE_NOT_INSTALLED);</span><br><span> </span><br><span>      /* set BTS to dependency */</span><br><span>  oml_mo_state_init(&bts->mo, -1, NM_AVSTATE_DEPENDENCY);</span><br><span>@@ -390,8 +395,8 @@</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 and SITE MGR are EANBLED, BTS is DEPENDENCY */</span><br><span style="color: hsl(0, 100%, 40%);">-   oml_tx_state_changed(&bts->site_mgr.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* BTS SITE MGR becomes Offline (tx SW ACT Report), BTS is DEPENDENCY */</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_EV_SW_ACT, NULL);</span><br><span>      oml_tx_state_changed(&bts->mo);</span><br><span> </span><br><span>   /* those should all be in DEPENDENCY */</span><br><span>diff --git a/src/common/nm_bts_sm_fsm.c b/src/common/nm_bts_sm_fsm.c</span><br><span>new file mode 100644</span><br><span>index 0000000..74f7a8c</span><br><span>--- /dev/null</span><br><span>+++ b/src/common/nm_bts_sm_fsm.c</span><br><span>@@ -0,0 +1,152 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/* NM BTS Site Manager 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_sm_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_sm_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->site_mgr.opstart_success = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     oml_mo_state_chg(&bts->site_mgr.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_SM_EV_SW_ACT:</span><br><span style="color: hsl(120, 100%, 40%);">+             oml_mo_tx_sw_act_rep(&bts->site_mgr.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+               nm_bts_sm_fsm_state_chg(fi, NM_BTS_SM_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->site_mgr.opstart_success = false;</span><br><span style="color: hsl(120, 100%, 40%);">+     oml_mo_state_chg(&bts->site_mgr.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_SM_EV_OPSTART_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+                bts->site_mgr.opstart_success = true;</span><br><span style="color: hsl(120, 100%, 40%);">+              oml_mo_opstart_ack(&bts->site_mgr.mo);</span><br><span style="color: hsl(120, 100%, 40%);">+         nm_bts_sm_fsm_state_chg(fi, NM_BTS_SM_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_SM_EV_OPSTART_NACK:</span><br><span style="color: hsl(120, 100%, 40%);">+               bts->site_mgr.opstart_success = false;</span><br><span style="color: hsl(120, 100%, 40%);">+             oml_mo_opstart_nack(&bts->site_mgr.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->site_mgr.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_sm_fsm_states[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ [NM_BTS_SM_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_SM_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_SM_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_SM_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_SM_EV_OPSTART_ACK) |</span><br><span style="color: hsl(120, 100%, 40%);">+                 X(NM_BTS_SM_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_SM_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_SM_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_sm_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   { NM_BTS_SM_EV_SW_ACT, "SW_ACT" },</span><br><span style="color: hsl(120, 100%, 40%);">+  { NM_BTS_SM_EV_OPSTART_ACK, "OPSTART_ACK" },</span><br><span style="color: hsl(120, 100%, 40%);">+        { NM_BTS_SM_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_sm_fsm = {</span><br><span style="color: hsl(120, 100%, 40%);">+  .name = "NM_BTS_SM_OP",</span><br><span style="color: hsl(120, 100%, 40%);">+     .states = nm_bts_sm_fsm_states,</span><br><span style="color: hsl(120, 100%, 40%);">+       .num_states = ARRAY_SIZE(nm_bts_sm_fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+       .event_names = nm_bts_sm_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_sm_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_sm_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 14fc80f..fd4aed8 100644</span><br><span>--- a/src/common/oml.c</span><br><span>+++ b/src/common/oml.c</span><br><span>@@ -1621,7 +1621,7 @@</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;</span><br><span>           break;</span><br><span>       case NM_OC_GPRS_NSE:</span><br><span>                 obj = &bts->gprs.nse;</span><br><span>diff --git a/src/osmo-bts-litecell15/oml.c b/src/osmo-bts-litecell15/oml.c</span><br><span>index 194ba7f..366e8da 100644</span><br><span>--- a/src/osmo-bts-litecell15/oml.c</span><br><span>+++ b/src/osmo-bts-litecell15/oml.c</span><br><span>@@ -42,6 +42,7 @@</span><br><span> #include <osmo-bts/phy_link.h></span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "lc15bts.h"</span><br><span>@@ -1887,6 +1888,9 @@</span><br><span>      int rc;</span><br><span> </span><br><span>  switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>@@ -1894,7 +1898,6 @@</span><br><span>               rc = ts_opstart(obj);</span><br><span>                break;</span><br><span>       case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">- case NM_OC_SITE_MANAGER:</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 695850c..798be8f 100644</span><br><span>--- a/src/osmo-bts-oc2g/oml.c</span><br><span>+++ b/src/osmo-bts-oc2g/oml.c</span><br><span>@@ -42,6 +42,7 @@</span><br><span> #include <osmo-bts/phy_link.h></span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "oc2gbts.h"</span><br><span>@@ -1896,6 +1897,9 @@</span><br><span>     int rc;</span><br><span> </span><br><span>  switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>@@ -1903,7 +1907,6 @@</span><br><span>               rc = ts_opstart(obj);</span><br><span>                break;</span><br><span>       case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">- case NM_OC_SITE_MANAGER:</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-octphy/l1_oml.c b/src/osmo-bts-octphy/l1_oml.c</span><br><span>index 7c203eb..1d34378 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>@@ -38,6 +38,7 @@</span><br><span> #include <osmo-bts/bts.h></span><br><span> #include <osmo-bts/bts_model.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "l1_oml.h"</span><br><span>@@ -1766,6 +1767,9 @@</span><br><span>      struct gsm_bts_trx_ts *ts;</span><br><span> </span><br><span>       switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>@@ -1774,7 +1778,6 @@</span><br><span>               rc = ts_connect_as(ts, ts->pchan, pchan_act_compl_cb, NULL);</span><br><span>              break;</span><br><span>       case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">- case NM_OC_SITE_MANAGER:</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 01b78d4..7ac9391 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>@@ -34,6 +34,7 @@</span><br><span> #include <osmo-bts/bts_model.h></span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_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>@@ -129,6 +130,9 @@</span><br><span>  uint8_t tn;</span><br><span> </span><br><span>      switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>@@ -142,7 +146,6 @@</span><br><span>            rc = oml_mo_opstart_ack(mo);</span><br><span>                 break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span style="color: hsl(0, 100%, 40%);">-     case NM_OC_SITE_MANAGER:</span><br><span>     case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_BTS:</span><br><span>      case NM_OC_GPRS_NSE:</span><br><span>diff --git a/src/osmo-bts-sysmo/oml.c b/src/osmo-bts-sysmo/oml.c</span><br><span>index cc53d72..f58a0e6 100644</span><br><span>--- a/src/osmo-bts-sysmo/oml.c</span><br><span>+++ b/src/osmo-bts-sysmo/oml.c</span><br><span>@@ -39,6 +39,7 @@</span><br><span> #include <osmo-bts/phy_link.h></span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "femtobts.h"</span><br><span>@@ -1773,6 +1774,9 @@</span><br><span>         int rc;</span><br><span> </span><br><span>  switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>@@ -1780,7 +1784,6 @@</span><br><span>               rc = ts_opstart(obj);</span><br><span>                break;</span><br><span>       case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">- case NM_OC_SITE_MANAGER:</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-trx/l1_if.c b/src/osmo-bts-trx/l1_if.c</span><br><span>index 8ad004e..c19a1a6 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>@@ -44,6 +44,7 @@</span><br><span> #include <osmo-bts/abis.h></span><br><span> #include <osmo-bts/scheduler.h></span><br><span> #include <osmo-bts/pcu_if.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_fsm.h></span><br><span> </span><br><span> #include "l1_if.h"</span><br><span> #include "trx_if.h"</span><br><span>@@ -616,13 +617,15 @@</span><br><span>    int rc;</span><br><span> </span><br><span>  switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>  case NM_OC_BTS:</span><br><span style="color: hsl(0, 100%, 40%);">- case NM_OC_SITE_MANAGER:</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 74ad31d..47f0ba2 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>@@ -34,6 +34,7 @@</span><br><span> #include <osmo-bts/bts_model.h></span><br><span> #include <osmo-bts/handover.h></span><br><span> #include <osmo-bts/l1sap.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmo-bts/nm_bts_sm_fsm.h></span><br><span> </span><br><span> #include "virtual_um.h"</span><br><span> </span><br><span>@@ -143,6 +144,9 @@</span><br><span>   uint8_t tn;</span><br><span> </span><br><span>      switch (mo->obj_class) {</span><br><span style="color: hsl(120, 100%, 40%);">+   case NM_OC_SITE_MANAGER:</span><br><span style="color: hsl(120, 100%, 40%);">+              rc = osmo_fsm_inst_dispatch(bts->site_mgr.fi, NM_BTS_SM_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>@@ -156,7 +160,6 @@</span><br><span>            rc = oml_mo_opstart_ack(mo);</span><br><span>                 break;</span><br><span>       case NM_OC_CHANNEL:</span><br><span style="color: hsl(0, 100%, 40%);">-     case NM_OC_SITE_MANAGER:</span><br><span>     case NM_OC_BASEB_TRANSC:</span><br><span>     case NM_OC_BTS:</span><br><span>      case NM_OC_GPRS_NSE:</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bts/+/20408">change 20408</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/+/20408"/><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: Iab2d17c45c9642860cd2d5d523c1baae24502243 </div>
<div style="display:none"> Gerrit-Change-Number: 20408 </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>