<p>Vadim Yanitskiy has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/12585">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">trxcon: refactor finite state machine hierarchy<br><br>Change-Id: I035b2cb701e2d0b3fedec4d569507b79d400df5b<br>---<br>M src/host/trxcon/Makefile.am<br>M src/host/trxcon/l1ctl_link.c<br>M src/host/trxcon/trx_if.c<br>M src/host/trxcon/trxcon.c<br>M src/host/trxcon/trxcon.h<br>A src/host/trxcon/trxcon_fsm.c<br>6 files changed, 160 insertions(+), 86 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/85/12585/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/host/trxcon/Makefile.am b/src/host/trxcon/Makefile.am</span><br><span>index b51db02..7c6c270 100644</span><br><span>--- a/src/host/trxcon/Makefile.am</span><br><span>+++ b/src/host/trxcon/Makefile.am</span><br><span>@@ -27,6 +27,7 @@</span><br><span>    trx_if.c \</span><br><span>   logging.c \</span><br><span>  trxcon.c \</span><br><span style="color: hsl(120, 100%, 40%);">+    trxcon_fsm.c \</span><br><span>       $(NULL)</span><br><span> </span><br><span> # Scheduler</span><br><span>diff --git a/src/host/trxcon/l1ctl_link.c b/src/host/trxcon/l1ctl_link.c</span><br><span>index 6d6e356..abcf82c 100644</span><br><span>--- a/src/host/trxcon/l1ctl_link.c</span><br><span>+++ b/src/host/trxcon/l1ctl_link.c</span><br><span>@@ -176,8 +176,8 @@</span><br><span>                return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   osmo_fsm_inst_dispatch(trxcon_fsm, L1CTL_EVENT_CONNECT, l1l);</span><br><span>        osmo_fsm_inst_state_chg(l1l->fsm, L1CTL_STATE_CONNECTED, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+    osmo_fsm_inst_dispatch(trxcon_fsm, TRXCON_E_L1CTL_CONNECT, NULL);</span><br><span> </span><br><span>        LOGP(DL1C, LOGL_NOTICE, "L1CTL has a new connection\n");</span><br><span> </span><br><span>@@ -223,8 +223,8 @@</span><br><span>         /* Clear pending messages */</span><br><span>         osmo_wqueue_clear(&l1l->wq);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- osmo_fsm_inst_dispatch(trxcon_fsm, L1CTL_EVENT_DISCONNECT, l1l);</span><br><span>     osmo_fsm_inst_state_chg(l1l->fsm, L1CTL_STATE_IDLE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(trxcon_fsm, TRXCON_E_L1CTL_DISCONNECT, NULL);</span><br><span> </span><br><span>     return 0;</span><br><span> }</span><br><span>diff --git a/src/host/trxcon/trx_if.c b/src/host/trxcon/trx_if.c</span><br><span>index 108f58b..33970f3 100644</span><br><span>--- a/src/host/trxcon/trx_if.c</span><br><span>+++ b/src/host/trxcon/trx_if.c</span><br><span>@@ -173,7 +173,7 @@</span><br><span>    if (++tcm->retry_cnt > 3) {</span><br><span>            LOGP(DTRX, LOGL_NOTICE, "Transceiver offline\n");</span><br><span>          osmo_fsm_inst_state_chg(trx->fsm, TRX_STATE_OFFLINE, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_fsm_inst_dispatch(trxcon_fsm, TRX_EVENT_OFFLINE, trx);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_dispatch(trxcon_fsm, TRXCON_E_TRX_DISCONNECT, NULL);</span><br><span>           return;</span><br><span>      }</span><br><span> </span><br><span>@@ -514,7 +514,7 @@</span><br><span> </span><br><span> rsp_error:</span><br><span>        /* Notify higher layers about the problem */</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_fsm_inst_dispatch(trxcon_fsm, TRX_EVENT_RSP_ERROR, trx);</span><br><span style="color: hsl(120, 100%, 40%);">+ osmo_fsm_inst_dispatch(trxcon_fsm, TRXCON_E_TRX_CTRL_ERROR, NULL);</span><br><span>   return -EIO;</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/host/trxcon/trxcon.c b/src/host/trxcon/trxcon.c</span><br><span>index 500d7e7..dda0a00 100644</span><br><span>--- a/src/host/trxcon/trxcon.c</span><br><span>+++ b/src/host/trxcon/trxcon.c</span><br><span>@@ -1,7 +1,7 @@</span><br><span> /*</span><br><span>  * OsmocomBB <-> SDR connection bridge</span><br><span>  *</span><br><span style="color: hsl(0, 100%, 40%);">- * (C) 2016-2017 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2016-2019 by Vadim Yanitskiy <axilirator@gmail.com></span><br><span>  *</span><br><span>  * All Rights Reserved</span><br><span>  *</span><br><span>@@ -77,72 +77,6 @@</span><br><span> void *tall_trxcon_ctx = NULL;</span><br><span> struct osmo_fsm_inst *trxcon_fsm;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static void trxcon_fsm_idle_action(struct osmo_fsm_inst *fi,</span><br><span style="color: hsl(0, 100%, 40%);">-     uint32_t event, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    if (event == L1CTL_EVENT_CONNECT)</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_fsm_inst_state_chg(trxcon_fsm, TRXCON_STATE_MANAGED, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static void trxcon_fsm_managed_action(struct osmo_fsm_inst *fi,</span><br><span style="color: hsl(0, 100%, 40%);">-        uint32_t event, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-    switch (event) {</span><br><span style="color: hsl(0, 100%, 40%);">-        case L1CTL_EVENT_DISCONNECT:</span><br><span style="color: hsl(0, 100%, 40%);">-            osmo_fsm_inst_state_chg(trxcon_fsm, TRXCON_STATE_IDLE, 0, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-           if (app_data.trx->fsm->state != TRX_STATE_OFFLINE) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      /* Reset scheduler and clock counter */</span><br><span style="color: hsl(0, 100%, 40%);">-                 sched_trx_reset(app_data.trx, true);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-                    /* TODO: implement trx_if_reset() */</span><br><span style="color: hsl(0, 100%, 40%);">-                    trx_if_cmd_poweroff(app_data.trx);</span><br><span style="color: hsl(0, 100%, 40%);">-                      trx_if_cmd_echo(app_data.trx);</span><br><span style="color: hsl(0, 100%, 40%);">-          }</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case TRX_EVENT_RSP_ERROR:</span><br><span style="color: hsl(0, 100%, 40%);">-       case TRX_EVENT_OFFLINE:</span><br><span style="color: hsl(0, 100%, 40%);">-         /* TODO: notify L2 & L3 about that */</span><br><span style="color: hsl(0, 100%, 40%);">-               break;</span><br><span style="color: hsl(0, 100%, 40%);">-  default:</span><br><span style="color: hsl(0, 100%, 40%);">-                LOGPFSML(fi, LOGL_ERROR, "Unhandled event %u\n", event);</span><br><span style="color: hsl(0, 100%, 40%);">-      }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_fsm_state trxcon_fsm_states[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-  [TRXCON_STATE_IDLE] = {</span><br><span style="color: hsl(0, 100%, 40%);">-         .in_event_mask = GEN_MASK(L1CTL_EVENT_CONNECT),</span><br><span style="color: hsl(0, 100%, 40%);">-         .out_state_mask = GEN_MASK(TRXCON_STATE_MANAGED),</span><br><span style="color: hsl(0, 100%, 40%);">-               .name = "IDLE",</span><br><span style="color: hsl(0, 100%, 40%);">-               .action = trxcon_fsm_idle_action,</span><br><span style="color: hsl(0, 100%, 40%);">-       },</span><br><span style="color: hsl(0, 100%, 40%);">-      [TRXCON_STATE_MANAGED] = {</span><br><span style="color: hsl(0, 100%, 40%);">-              .in_event_mask = (</span><br><span style="color: hsl(0, 100%, 40%);">-                      GEN_MASK(L1CTL_EVENT_DISCONNECT) |</span><br><span style="color: hsl(0, 100%, 40%);">-                      GEN_MASK(TRX_EVENT_RSP_ERROR) |</span><br><span style="color: hsl(0, 100%, 40%);">-                 GEN_MASK(TRX_EVENT_OFFLINE)),</span><br><span style="color: hsl(0, 100%, 40%);">-           .out_state_mask = GEN_MASK(TRXCON_STATE_IDLE),</span><br><span style="color: hsl(0, 100%, 40%);">-          .name = "MANAGED",</span><br><span style="color: hsl(0, 100%, 40%);">-            .action = trxcon_fsm_managed_action,</span><br><span style="color: hsl(0, 100%, 40%);">-    },</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static const struct value_string app_evt_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_VALUE_STRING(L1CTL_EVENT_CONNECT),</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(L1CTL_EVENT_DISCONNECT),</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_VALUE_STRING(TRX_EVENT_OFFLINE),</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_VALUE_STRING(TRX_EVENT_RSP_ERROR),</span><br><span style="color: hsl(0, 100%, 40%);">- { 0, NULL }</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_fsm trxcon_fsm_def = {</span><br><span style="color: hsl(0, 100%, 40%);">-  .name = "trxcon_app_fsm",</span><br><span style="color: hsl(0, 100%, 40%);">-     .states = trxcon_fsm_states,</span><br><span style="color: hsl(0, 100%, 40%);">-    .num_states = ARRAY_SIZE(trxcon_fsm_states),</span><br><span style="color: hsl(0, 100%, 40%);">-    .log_subsys = DAPP,</span><br><span style="color: hsl(0, 100%, 40%);">-     .event_names = app_evt_names,</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static void print_usage(const char *app)</span><br><span> {</span><br><span>     printf("Usage: %s\n", app);</span><br><span>@@ -273,18 +207,19 @@</span><br><span>        /* Init logging system */</span><br><span>    trx_log_init(app_data.debug_mask);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /* Allocate the application state machine */</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_fsm_register(&trxcon_fsm_def);</span><br><span style="color: hsl(0, 100%, 40%);">- trxcon_fsm = osmo_fsm_inst_alloc(&trxcon_fsm_def, tall_trxcon_ctx,</span><br><span style="color: hsl(0, 100%, 40%);">-          NULL, LOGL_DEBUG, "main");</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Allocate a trxcon machine */</span><br><span style="color: hsl(120, 100%, 40%);">+       trxcon_fsm = osmo_fsm_inst_alloc(&trxcon_fsm_def,</span><br><span style="color: hsl(120, 100%, 40%);">+         tall_trxcon_ctx, NULL, LOGL_DEBUG, "main");</span><br><span style="color: hsl(120, 100%, 40%);">+ if (trxcon_fsm == NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+               goto exit;</span><br><span> </span><br><span>       /* Init L1CTL server */</span><br><span style="color: hsl(0, 100%, 40%);">- app_data.l1l = l1ctl_link_init(tall_trx_ctx, app_data.bind_socket);</span><br><span style="color: hsl(120, 100%, 40%);">+   app_data.l1l = l1ctl_link_init(tall_trxcon_ctx, app_data.bind_socket);</span><br><span>       if (app_data.l1l == NULL)</span><br><span>            goto exit;</span><br><span> </span><br><span>       /* Init transceiver interface */</span><br><span style="color: hsl(0, 100%, 40%);">-        app_data.trx = trx_if_open(tall_trx_ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+      app_data.trx = trx_if_open(tall_trxcon_ctx,</span><br><span>          app_data.trx_bind_ip, app_data.trx_remote_ip,</span><br><span>                app_data.trx_base_port);</span><br><span>     if (!app_data.trx)</span><br><span>@@ -322,7 +257,8 @@</span><br><span>     trx_if_close(app_data.trx);</span><br><span> </span><br><span>      /* Shutdown main state machine */</span><br><span style="color: hsl(0, 100%, 40%);">-       osmo_fsm_inst_free(trxcon_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (trxcon_fsm != NULL)</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_free(trxcon_fsm);</span><br><span> </span><br><span>  /* Deinitialize logging */</span><br><span>   log_fini();</span><br><span>diff --git a/src/host/trxcon/trxcon.h b/src/host/trxcon/trxcon.h</span><br><span>index f66a628..37be9f5 100644</span><br><span>--- a/src/host/trxcon/trxcon.h</span><br><span>+++ b/src/host/trxcon/trxcon.h</span><br><span>@@ -2,19 +2,41 @@</span><br><span> </span><br><span> #define GEN_MASK(state) (0x01 << state)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+extern const struct value_string trxcon_fsm_event_names[];</span><br><span> extern struct osmo_fsm_inst *trxcon_fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+extern struct osmo_fsm trxcon_fsm_def;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum trxcon_fsm_states {</span><br><span style="color: hsl(120, 100%, 40%);">+enum trxcon_fsm_state_type {</span><br><span>      TRXCON_STATE_IDLE = 0,</span><br><span>       TRXCON_STATE_MANAGED,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum trxcon_fsm_events {</span><br><span style="color: hsl(0, 100%, 40%);">- /* L1CTL specific events */</span><br><span style="color: hsl(0, 100%, 40%);">-     L1CTL_EVENT_CONNECT,</span><br><span style="color: hsl(0, 100%, 40%);">-    L1CTL_EVENT_DISCONNECT,</span><br><span style="color: hsl(120, 100%, 40%);">+enum trxcon_event_type {</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Events coming from L1CTL interface */</span><br><span style="color: hsl(120, 100%, 40%);">+      TRXCON_E_L1CTL_DISCONNECT,      /*!< L1CTL interface has lost a connection */</span><br><span style="color: hsl(120, 100%, 40%);">+      TRXCON_E_L1CTL_CONNECT,         /*!< L1CTL interface has got a connection */</span><br><span style="color: hsl(120, 100%, 40%);">+       TRXCON_E_L1CTL_REQ,             /*!< L1CTL request message from a client */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      /* TRX specific events */</span><br><span style="color: hsl(0, 100%, 40%);">-       TRX_EVENT_RSP_ERROR,</span><br><span style="color: hsl(0, 100%, 40%);">-    TRX_EVENT_OFFLINE,</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Events coming from TRX interface */</span><br><span style="color: hsl(120, 100%, 40%);">+        TRXCON_E_TRX_DISCONNECT,        /*!< TRX interface has lost connection */</span><br><span style="color: hsl(120, 100%, 40%);">+  TRXCON_E_TRX_CTRL_ERROR,        /*!< TRXC (CTRL) error from transceiver */</span><br><span style="color: hsl(120, 100%, 40%);">+ TRXCON_E_TRX_CTRL_RSP,          /*!< TRXC (CTRL) response from transceiver */</span><br><span style="color: hsl(120, 100%, 40%);">+      TRXCON_E_TRX_DL_BURST,          /*!< TRXD (DATA) DL burst from transceiver */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Events coming from scheduler */</span><br><span style="color: hsl(120, 100%, 40%);">+    TRXCON_E_SCHED_CLCK_LOSS,       /*!< No more clock from transceiver */</span><br><span style="color: hsl(120, 100%, 40%);">+     TRXCON_E_SCHED_DT_IND,          /*!< Decoded DL L2 frame from scheduler */</span><br><span style="color: hsl(120, 100%, 40%);">+ TRXCON_E_SCHED_DT_CONF,         /*!< Confirmation that an UL frame has been sent */</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 trxcon {</span><br><span style="color: hsl(120, 100%, 40%);">+ /* FSM of this trxcon, see trxcon_fsm_def */</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_fsm_inst *fsm;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Connection with transceiver */</span><br><span style="color: hsl(120, 100%, 40%);">+     struct trx_if *trx_if;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* L1CTL server link */</span><br><span style="color: hsl(120, 100%, 40%);">+       struct l1ctl_link *l1ctl_link;</span><br><span style="color: hsl(120, 100%, 40%);">+        /* L1CTL client connection */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct l1ctl_conn *l1ctl_conn;</span><br><span> };</span><br><span>diff --git a/src/host/trxcon/trxcon_fsm.c b/src/host/trxcon/trxcon_fsm.c</span><br><span>new file mode 100644</span><br><span>index 0000000..fe8c853</span><br><span>--- /dev/null</span><br><span>+++ b/src/host/trxcon/trxcon_fsm.c</span><br><span>@@ -0,0 +1,115 @@</span><br><span style="color: hsl(120, 100%, 40%);">+/*</span><br><span style="color: hsl(120, 100%, 40%);">+ * OsmocomBB <-> SDR connection bridge</span><br><span style="color: hsl(120, 100%, 40%);">+ * trxcon state machine definition</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ * (C) 2019 by Vadim Yanitskiy <axilirator@gmail.com></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 General Public License as published by</span><br><span style="color: hsl(120, 100%, 40%);">+ * the Free Software Foundation; either version 2 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 General Public License along</span><br><span style="color: hsl(120, 100%, 40%);">+ * with this program; if not, write to the Free Software Foundation, Inc.,</span><br><span style="color: hsl(120, 100%, 40%);">+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.</span><br><span style="color: hsl(120, 100%, 40%);">+ *</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/core/utils.h></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%);">+#include <logging.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <trxcon.h></span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static void trxcon_fsm_idle_action(struct osmo_fsm_inst *fi,</span><br><span style="color: hsl(120, 100%, 40%);">+     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%);">+    * TODO: associate trxcon->l1ctl_conn with this conn</span><br><span style="color: hsl(120, 100%, 40%);">+        */</span><br><span style="color: hsl(120, 100%, 40%);">+   if (event == TRXCON_E_L1CTL_CONNECT)</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_fsm_inst_state_chg(fi, TRXCON_STATE_MANAGED, 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%);">+static void trxcon_fsm_managed_action(struct osmo_fsm_inst *fi,</span><br><span style="color: hsl(120, 100%, 40%);">+        uint32_t event, void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        switch ((enum trxcon_event_type) event) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case TRXCON_E_L1CTL_DISCONNECT:</span><br><span style="color: hsl(120, 100%, 40%);">+               /* TODO: reset TRX interface */</span><br><span style="color: hsl(120, 100%, 40%);">+               osmo_fsm_inst_state_chg(fi, TRXCON_STATE_IDLE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case TRXCON_E_TRX_DISCONNECT:</span><br><span style="color: hsl(120, 100%, 40%);">+         /* TODO: notify L1CTL interface */</span><br><span style="color: hsl(120, 100%, 40%);">+            osmo_fsm_inst_state_chg(fi, TRXCON_STATE_IDLE, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              LOGPFSML(fi, LOGL_ERROR, "Unhandled event '%s'\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                  get_value_string(trxcon_fsm_event_names, event));</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%);">+/* Generates mask for a single state or event */</span><br><span style="color: hsl(120, 100%, 40%);">+#define S(x) (1 << x)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct osmo_fsm_state trxcon_fsm_states[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+   [TRXCON_STATE_IDLE] = {</span><br><span style="color: hsl(120, 100%, 40%);">+               .name = "IDLE",</span><br><span style="color: hsl(120, 100%, 40%);">+             .out_state_mask = S(TRXCON_STATE_MANAGED),</span><br><span style="color: hsl(120, 100%, 40%);">+            .in_event_mask  = S(TRXCON_E_L1CTL_CONNECT),</span><br><span style="color: hsl(120, 100%, 40%);">+          .action = &trxcon_fsm_idle_action,</span><br><span style="color: hsl(120, 100%, 40%);">+        },</span><br><span style="color: hsl(120, 100%, 40%);">+    [TRXCON_STATE_MANAGED] = {</span><br><span style="color: hsl(120, 100%, 40%);">+            .name = "MANAGED",</span><br><span style="color: hsl(120, 100%, 40%);">+          .out_state_mask = S(TRXCON_STATE_IDLE),</span><br><span style="color: hsl(120, 100%, 40%);">+               .in_event_mask  = S(TRXCON_E_L1CTL_DISCONNECT)</span><br><span style="color: hsl(120, 100%, 40%);">+                                | S(TRXCON_E_L1CTL_CONNECT)</span><br><span style="color: hsl(120, 100%, 40%);">+                           | S(TRXCON_E_L1CTL_REQ)</span><br><span style="color: hsl(120, 100%, 40%);">+                               | S(TRXCON_E_TRX_DISCONNECT)</span><br><span style="color: hsl(120, 100%, 40%);">+                          | S(TRXCON_E_TRX_CTRL_ERROR)</span><br><span style="color: hsl(120, 100%, 40%);">+                          | S(TRXCON_E_TRX_CTRL_RSP)</span><br><span style="color: hsl(120, 100%, 40%);">+                            | S(TRXCON_E_TRX_DL_BURST)</span><br><span style="color: hsl(120, 100%, 40%);">+                            | S(TRXCON_E_SCHED_CLCK_LOSS)</span><br><span style="color: hsl(120, 100%, 40%);">+                         | S(TRXCON_E_SCHED_DT_IND)</span><br><span style="color: hsl(120, 100%, 40%);">+                            | S(TRXCON_E_SCHED_DT_CONF),</span><br><span style="color: hsl(120, 100%, 40%);">+          .action = &trxcon_fsm_managed_action,</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 trxcon_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(TRXCON_E_L1CTL_DISCONNECT),</span><br><span style="color: hsl(120, 100%, 40%);">+ OSMO_VALUE_STRING(TRXCON_E_L1CTL_CONNECT),</span><br><span style="color: hsl(120, 100%, 40%);">+    OSMO_VALUE_STRING(TRXCON_E_L1CTL_REQ),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(TRXCON_E_TRX_DISCONNECT),</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_VALUE_STRING(TRXCON_E_TRX_CTRL_ERROR),</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_VALUE_STRING(TRXCON_E_TRX_CTRL_RSP),</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_VALUE_STRING(TRXCON_E_TRX_DL_BURST),</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_VALUE_STRING(TRXCON_E_SCHED_CLCK_LOSS),</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_VALUE_STRING(TRXCON_E_SCHED_DT_IND),</span><br><span style="color: hsl(120, 100%, 40%);">+     OSMO_VALUE_STRING(TRXCON_E_SCHED_DT_CONF),</span><br><span style="color: hsl(120, 100%, 40%);">+</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 trxcon_fsm_def = {</span><br><span style="color: hsl(120, 100%, 40%);">+ .name = "trxcon_fsm",</span><br><span style="color: hsl(120, 100%, 40%);">+       .states = trxcon_fsm_states,</span><br><span style="color: hsl(120, 100%, 40%);">+  .num_states = ARRAY_SIZE(trxcon_fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+  .event_names = trxcon_fsm_event_names,</span><br><span style="color: hsl(120, 100%, 40%);">+        .log_subsys = DAPP,</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 on_dso_load(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      /* Register our FSM */</span><br><span style="color: hsl(120, 100%, 40%);">+        OSMO_ASSERT(osmo_fsm_register(&trxcon_fsm_def) == 0);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12585">change 12585</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/12585"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I035b2cb701e2d0b3fedec4d569507b79d400df5b </div>
<div style="display:none"> Gerrit-Change-Number: 12585 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Vadim Yanitskiy <axilirator@gmail.com> </div>