<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/8054">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Harald Welte: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">a_reset: cleanup + remove dead code<br><br>a_reset.c/h was originally developed to be used in both, bsc and<br>msc without changes. Unfortunately no suitable library has been<br>found for a_reset.c/h so the file ended up as duplicated code in<br>both split brances. Eventually we decided to specialize the<br>generalized code again, which means some of the functions needed<br>only by osmo-bsc are removed.<br><br>- Remove dead code<br>- Fix timer identification number (T16)<br>- use fi->priv to hold context info<br>- Minor cosmetic fixes<br><br>Change-Id: I8e489eb494d358d130e51cb2167929edeaa12e92<br>Depends: libosmocore I36d221c973d3890721ef1d376fb9be82c4311378<br>Related: OS#3103<br>---<br>M include/osmocom/msc/a_iface.h<br>M include/osmocom/msc/a_reset.h<br>M src/libmsc/a_iface.c<br>M src/libmsc/a_iface_bssap.c<br>M src/libmsc/a_reset.c<br>5 files changed, 59 insertions(+), 159 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/msc/a_iface.h b/include/osmocom/msc/a_iface.h</span><br><span>index 3098b51..217011d 100644</span><br><span>--- a/include/osmocom/msc/a_iface.h</span><br><span>+++ b/include/osmocom/msc/a_iface.h</span><br><span>@@ -51,7 +51,7 @@</span><br><span>    /* A pointer to the reset handler FSM, the</span><br><span>    * state machine is allocated when the BSC</span><br><span>    * is registerd. */</span><br><span style="color: hsl(0, 100%, 40%);">-     struct a_reset_ctx *reset;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct osmo_fsm_inst *reset_fsm;</span><br><span> </span><br><span>         /* A pointer to the sccp_user that is associated</span><br><span>      * with the A interface. We need this information</span><br><span>diff --git a/include/osmocom/msc/a_reset.h b/include/osmocom/msc/a_reset.h</span><br><span>index cdb17c2..8eb3bbf 100644</span><br><span>--- a/include/osmocom/msc/a_reset.h</span><br><span>+++ b/include/osmocom/msc/a_reset.h</span><br><span>@@ -20,45 +20,12 @@</span><br><span> </span><br><span> #pragma once</span><br><span> </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%);">-/* Reset context data (callbacks, state machine etc...) */</span><br><span style="color: hsl(0, 100%, 40%);">-struct a_reset_ctx {</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* FSM instance, which handles the reset procedure */</span><br><span style="color: hsl(0, 100%, 40%);">-   struct osmo_fsm_inst *fsm;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      /* Connection failure counter. When this counter</span><br><span style="color: hsl(0, 100%, 40%);">-         * reaches a certain threshold, the reset procedure</span><br><span style="color: hsl(0, 100%, 40%);">-      * will be triggered */</span><br><span style="color: hsl(0, 100%, 40%);">- int conn_loss_counter;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-  /* A human readable name to display in the logs */</span><br><span style="color: hsl(0, 100%, 40%);">-      char name[256];</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Callback function to be called when a connection</span><br><span style="color: hsl(0, 100%, 40%);">-      * failure is detected and a rest must occur */</span><br><span style="color: hsl(0, 100%, 40%);">- void (*cb)(void *priv);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Privated data for the callback function */</span><br><span style="color: hsl(0, 100%, 40%);">-   void *priv;</span><br><span style="color: hsl(0, 100%, 40%);">-};</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Create and start state machine which handles the reset/reset-ack procedure */</span><br><span style="color: hsl(0, 100%, 40%);">-struct a_reset_ctx *a_reset_alloc(const void *ctx, const char *name, void *cb, void *priv,</span><br><span style="color: hsl(0, 100%, 40%);">-                               bool already_connected);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Tear down state machine */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_free(struct a_reset_ctx *reset);</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_fsm_inst *a_reset_alloc(void *ctx, const char *name, void *cb,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  void *priv, bool already_connected);</span><br><span> </span><br><span> /* Confirm that we sucessfully received a reset acknowlege message */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_ack_confirm(struct a_reset_ctx *reset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Report a failed connection */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_conn_fail(struct a_reset_ctx *reset);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/* Report a successful connection */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_conn_success(struct a_reset_ctx *reset);</span><br><span style="color: hsl(120, 100%, 40%);">+void a_reset_ack_confirm(struct osmo_fsm_inst *reset_fsm);</span><br><span> </span><br><span> /* Check if we have a connection to a specified msc */</span><br><span style="color: hsl(0, 100%, 40%);">-bool a_reset_conn_ready(struct a_reset_ctx *reset);</span><br><span style="color: hsl(120, 100%, 40%);">+bool a_reset_conn_ready(struct osmo_fsm_inst *reset_fsm);</span><br><span>diff --git a/src/libmsc/a_iface.c b/src/libmsc/a_iface.c</span><br><span>index 6f2000e..75fa438 100644</span><br><span>--- a/src/libmsc/a_iface.c</span><br><span>+++ b/src/libmsc/a_iface.c</span><br><span>@@ -209,7 +209,7 @@</span><br><span> </span><br><span>  /* Deliver paging request to all known BSCs */</span><br><span>       llist_for_each_entry(bsc_ctx, &gsm_network->a.bscs, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-              if (a_reset_conn_ready(bsc_ctx->reset)) {</span><br><span style="color: hsl(120, 100%, 40%);">+          if (a_reset_conn_ready(bsc_ctx->reset_fsm)) {</span><br><span>                     LOGP(DBSSAP, LOGL_DEBUG,</span><br><span>                          "Tx BSSMAP paging message from MSC %s to BSC %s (imsi=%s, tmsi=0x%08x, lac=%u)\n",</span><br><span>                         osmo_sccp_addr_name(ss7, &bsc_ctx->msc_addr),</span><br><span>@@ -471,10 +471,10 @@</span><br><span> void a_start_reset(struct bsc_context *bsc_ctx, bool already_connected)</span><br><span> {</span><br><span>    char bsc_name[32];</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(bsc_ctx->reset == NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(bsc_ctx->reset_fsm == NULL);</span><br><span>  /* Start reset procedure to make the new connection active */</span><br><span>        snprintf(bsc_name, sizeof(bsc_name), "bsc-%i", bsc_ctx->bsc_addr.pc);</span><br><span style="color: hsl(0, 100%, 40%);">-      bsc_ctx->reset = a_reset_alloc(bsc_ctx, bsc_name, a_reset_cb, bsc_ctx, already_connected);</span><br><span style="color: hsl(120, 100%, 40%);">+ bsc_ctx->reset_fsm = a_reset_alloc(bsc_ctx, bsc_name, a_reset_cb, bsc_ctx, already_connected);</span><br><span> }</span><br><span> </span><br><span> /* determine if given msg is BSSMAP RESET related (true) or not (false) */</span><br><span>@@ -521,7 +521,7 @@</span><br><span>                       a_start_reset(a_conn_info.bsc, false);</span><br><span>               } else {</span><br><span>                     /* This BSC is already known to us, check if we have been through reset yet */</span><br><span style="color: hsl(0, 100%, 40%);">-                  if (a_reset_conn_ready(a_conn_info.bsc->reset) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (a_reset_conn_ready(a_conn_info.bsc->reset_fsm) == false) {</span><br><span>                            LOGP(DBSSAP, LOGL_NOTICE, "Refusing N-CONNECT.ind(%u, %s), BSC not reset yet\n",</span><br><span>                                scu_prim->u.connect.conn_id, msgb_hexdump_l2(oph->msg));</span><br><span>                          rc = osmo_sccp_tx_disconn(scu, a_conn_info.conn_id, &a_conn_info.bsc->msc_addr,</span><br><span>@@ -580,7 +580,7 @@</span><br><span> </span><br><span>             /* As long as we are in the reset phase, only reset related BSSMAP messages may pass</span><br><span>                  * beond here. */</span><br><span style="color: hsl(0, 100%, 40%);">-               if (!bssmap_is_reset(oph->msg) && a_reset_conn_ready(a_conn_info.bsc->reset) == false) {</span><br><span style="color: hsl(120, 100%, 40%);">+                if (!bssmap_is_reset(oph->msg) && a_reset_conn_ready(a_conn_info.bsc->reset_fsm) == false) {</span><br><span>                   LOGP(DBSSAP, LOGL_NOTICE, "Ignoring N-UNITDATA.ind(%s), BSC not reset yet\n",</span><br><span>                           msgb_hexdump_l2(oph->msg));</span><br><span>                  break;</span><br><span>diff --git a/src/libmsc/a_iface_bssap.c b/src/libmsc/a_iface_bssap.c</span><br><span>index 6d5848a..1ace43d 100644</span><br><span>--- a/src/libmsc/a_iface_bssap.c</span><br><span>+++ b/src/libmsc/a_iface_bssap.c</span><br><span>@@ -114,12 +114,12 @@</span><br><span>  /* Make sure all orphand subscriber connections will be cleard */</span><br><span>    a_clear_all(scu, &a_conn_info->bsc->bsc_addr);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    if (!a_conn_info->bsc->reset)</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!a_conn_info->bsc->reset_fsm)</span><br><span>              a_start_reset(a_conn_info->bsc, true);</span><br><span> </span><br><span>        /* Treat an incoming RESET like an ACK to any RESET request we may have just sent.</span><br><span>    * After all, what we wanted is the A interface to be reset, which we now know has happened. */</span><br><span style="color: hsl(0, 100%, 40%);">- a_reset_ack_confirm(a_conn_info->bsc->reset);</span><br><span style="color: hsl(120, 100%, 40%);">+   a_reset_ack_confirm(a_conn_info->bsc->reset_fsm);</span><br><span> }</span><br><span> </span><br><span> /* Endpoint to handle BSSMAP reset acknowlegement */</span><br><span>@@ -133,7 +133,7 @@</span><br><span>       ss7 = osmo_ss7_instance_find(network->a.cs7_instance);</span><br><span>    OSMO_ASSERT(ss7);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (a_conn_info->bsc->reset == NULL) {</span><br><span style="color: hsl(120, 100%, 40%);">+  if (a_conn_info->bsc->reset_fsm == NULL) {</span><br><span>             LOGP(DBSSAP, LOGL_ERROR, "Received RESET ACK from an unknown BSC %s, ignoring...\n",</span><br><span>                    osmo_sccp_addr_name(ss7, &a_conn_info->bsc->bsc_addr));</span><br><span>               return;</span><br><span>@@ -144,7 +144,7 @@</span><br><span> </span><br><span>    /* Confirm that we managed to get the reset ack message</span><br><span>       * towards the connection reset logic */</span><br><span style="color: hsl(0, 100%, 40%);">-        a_reset_ack_confirm(a_conn_info->bsc->reset);</span><br><span style="color: hsl(120, 100%, 40%);">+   a_reset_ack_confirm(a_conn_info->bsc->reset_fsm);</span><br><span> }</span><br><span> </span><br><span> /* Handle UNITDATA BSSMAP messages */</span><br><span>diff --git a/src/libmsc/a_reset.c b/src/libmsc/a_reset.c</span><br><span>index 701066f..1e35a10 100644</span><br><span>--- a/src/libmsc/a_reset.c</span><br><span>+++ b/src/libmsc/a_reset.c</span><br><span>@@ -28,188 +28,121 @@</span><br><span> #include <osmocom/msc/debug.h></span><br><span> #include <osmocom/msc/a_reset.h></span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-#define RESET_RESEND_INTERVAL 2     /* sec */</span><br><span style="color: hsl(0, 100%, 40%);">-#define RESET_RESEND_TIMER_NO 1234     /* FIXME: dig out the real timer number */</span><br><span style="color: hsl(0, 100%, 40%);">-#define BAD_CONNECTION_THRESOLD 3     /* connection failures */</span><br><span style="color: hsl(120, 100%, 40%);">+#define RESET_RESEND_INTERVAL 2              /* sec */</span><br><span style="color: hsl(120, 100%, 40%);">+#define RESET_RESEND_TIMER_NO 16     /* See also 3GPP TS 48.008 Chapter 3.1.4.1.3.2 */</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum fsm_states {</span><br><span style="color: hsl(120, 100%, 40%);">+enum reset_fsm_states {</span><br><span>      ST_DISC,                /* Disconnected from remote end */</span><br><span>   ST_CONN,                /* We have a confirmed connection */</span><br><span> };</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-enum fsm_evt {</span><br><span style="color: hsl(0, 100%, 40%);">-    EV_RESET_ACK,           /* got reset acknowlegement from remote end */</span><br><span style="color: hsl(0, 100%, 40%);">-  EV_N_DISCONNECT,        /* lost a connection */</span><br><span style="color: hsl(0, 100%, 40%);">- EV_N_CONNECT,           /* made a successful connection */</span><br><span style="color: hsl(120, 100%, 40%);">+enum reset_fsm_evt {</span><br><span style="color: hsl(120, 100%, 40%);">+      EV_CONN_ACK,            /* Received either BSSMAP RESET or BSSMAP RESET</span><br><span style="color: hsl(120, 100%, 40%);">+                                * ACK from the remote end */</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%);">+/* Reset context data (callbacks, state machine etc...) */</span><br><span style="color: hsl(120, 100%, 40%);">+struct reset_ctx {</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Callback function to be called when a connection</span><br><span style="color: hsl(120, 100%, 40%);">+    * failure is detected and a rest must occur */</span><br><span style="color: hsl(120, 100%, 40%);">+       void (*cb)(void *priv);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Privated data for the callback function */</span><br><span style="color: hsl(120, 100%, 40%);">+ void *priv;</span><br><span> };</span><br><span> </span><br><span> static const struct value_string fsm_event_names[] = {</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_VALUE_STRING(EV_RESET_ACK),</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_VALUE_STRING(EV_N_DISCONNECT),</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_VALUE_STRING(EV_N_CONNECT),</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(EV_CONN_ACK),</span><br><span>      {0, NULL}</span><br><span> };</span><br><span> </span><br><span> /* Disconnected state */</span><br><span> static void fsm_disc_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct a_reset_ctx *reset = (struct a_reset_ctx *)data;</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(reset);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGPFSML(reset->fsm, LOGL_NOTICE, "SIGTRAN connection succeded.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-       reset->conn_loss_counter = 0;</span><br><span>     osmo_fsm_inst_state_chg(fi, ST_CONN, 0, 0);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* Connected state */</span><br><span style="color: hsl(0, 100%, 40%);">-static void fsm_conn_cb(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- struct a_reset_ctx *reset = (struct a_reset_ctx *)data;</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(reset);</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 EV_N_DISCONNECT:</span><br><span style="color: hsl(0, 100%, 40%);">-           if (reset->conn_loss_counter >= BAD_CONNECTION_THRESOLD) {</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGPFSML(reset->fsm, LOGL_NOTICE, "SIGTRAN connection down, reconnecting...\n");</span><br><span style="color: hsl(0, 100%, 40%);">-                   osmo_fsm_inst_state_chg(fi, ST_DISC, RESET_RESEND_INTERVAL, RESET_RESEND_TIMER_NO);</span><br><span style="color: hsl(0, 100%, 40%);">-             } else</span><br><span style="color: hsl(0, 100%, 40%);">-                  reset->conn_loss_counter++;</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(0, 100%, 40%);">-  case EV_N_CONNECT:</span><br><span style="color: hsl(0, 100%, 40%);">-              reset->conn_loss_counter = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-                break;</span><br><span style="color: hsl(0, 100%, 40%);">-  }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* Timer callback to retransmit the reset signal */</span><br><span> static int fsm_reset_ack_timeout_cb(struct osmo_fsm_inst *fi)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- struct a_reset_ctx *reset = (struct a_reset_ctx *)fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     LOGPFSML(reset->fsm, LOGL_NOTICE, "(re)sending BSSMAP RESET message...\n");</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        reset->cb(reset->priv);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(120, 100%, 40%);">+ struct reset_ctx *reset_ctx = (struct reset_ctx *)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        LOGPFSML(fi, LOGL_NOTICE, "(re)sending BSSMAP RESET message...\n");</span><br><span style="color: hsl(120, 100%, 40%);">+ reset_ctx->cb(reset_ctx->priv);</span><br><span>        osmo_fsm_inst_state_chg(fi, ST_DISC, RESET_RESEND_INTERVAL, RESET_RESEND_TIMER_NO);</span><br><span>  return 0;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static struct osmo_fsm_state fsm_states[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+static struct osmo_fsm_state reset_fsm_states[] = {</span><br><span>         [ST_DISC] = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .in_event_mask = (1 << EV_RESET_ACK),</span><br><span style="color: hsl(0, 100%, 40%);">-                     .out_state_mask = (1 << ST_DISC) | (1 << ST_CONN),</span><br><span style="color: hsl(120, 100%, 40%);">+                .in_event_mask = (1 << EV_CONN_ACK),</span><br><span style="color: hsl(120, 100%, 40%);">+                    .out_state_mask = (1 << ST_CONN) | (1 << ST_DISC),</span><br><span>               .name = "DISC",</span><br><span>                    .action = fsm_disc_cb,</span><br><span>               },</span><br><span>      [ST_CONN] = {</span><br><span style="color: hsl(0, 100%, 40%);">-                .in_event_mask = (1 << EV_N_DISCONNECT) | (1 << EV_N_CONNECT),</span><br><span style="color: hsl(0, 100%, 40%);">-              .out_state_mask = (1 << ST_DISC) | (1 << ST_CONN),</span><br><span style="color: hsl(120, 100%, 40%);">+                .in_event_mask = (1 << EV_CONN_ACK),</span><br><span>                   .name = "CONN",</span><br><span style="color: hsl(0, 100%, 40%);">-               .action = fsm_conn_cb,</span><br><span>               },</span><br><span> };</span><br><span> </span><br><span> /* State machine definition */</span><br><span> static struct osmo_fsm fsm = {</span><br><span>        .name = "A-RESET",</span><br><span style="color: hsl(0, 100%, 40%);">-    .states = fsm_states,</span><br><span style="color: hsl(0, 100%, 40%);">-   .num_states = ARRAY_SIZE(fsm_states),</span><br><span style="color: hsl(120, 100%, 40%);">+ .states = reset_fsm_states,</span><br><span style="color: hsl(120, 100%, 40%);">+   .num_states = ARRAY_SIZE(reset_fsm_states),</span><br><span>  .log_subsys = DMSC,</span><br><span>  .timer_cb = fsm_reset_ack_timeout_cb,</span><br><span>        .event_names = fsm_event_names,</span><br><span> };</span><br><span> </span><br><span> /* Create and start state machine which handles the reset/reset-ack procedure */</span><br><span style="color: hsl(0, 100%, 40%);">-struct a_reset_ctx *a_reset_alloc(const void *ctx, const char *name, void *cb, void *priv,</span><br><span style="color: hsl(0, 100%, 40%);">-                           bool already_connected)</span><br><span style="color: hsl(120, 100%, 40%);">+struct osmo_fsm_inst *a_reset_alloc(void *ctx, const char *name, void *cb,</span><br><span style="color: hsl(120, 100%, 40%);">+                             void *priv, bool already_connected)</span><br><span> {</span><br><span>         OSMO_ASSERT(name);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  struct a_reset_ctx *reset;</span><br><span style="color: hsl(120, 100%, 40%);">+    struct reset_ctx *reset_ctx;</span><br><span style="color: hsl(120, 100%, 40%);">+  struct osmo_fsm_inst *reset_fsm;</span><br><span> </span><br><span>         /* Register the fsm description (if not already done) */</span><br><span>     if (osmo_fsm_find_by_name(fsm.name) != &fsm)</span><br><span>             osmo_fsm_register(&fsm);</span><br><span> </span><br><span>     /* Allocate and configure a new fsm instance */</span><br><span style="color: hsl(0, 100%, 40%);">- reset = talloc_zero(ctx, struct a_reset_ctx);</span><br><span style="color: hsl(0, 100%, 40%);">-   OSMO_ASSERT(reset);</span><br><span style="color: hsl(0, 100%, 40%);">-     reset->priv = priv;</span><br><span style="color: hsl(0, 100%, 40%);">-  reset->cb = cb;</span><br><span style="color: hsl(0, 100%, 40%);">-      reset->conn_loss_counter = 0;</span><br><span style="color: hsl(0, 100%, 40%);">-        reset->fsm = osmo_fsm_inst_alloc(&fsm, NULL, NULL, LOGL_DEBUG, name);</span><br><span style="color: hsl(0, 100%, 40%);">-    OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-     reset->fsm->priv = reset;</span><br><span style="color: hsl(120, 100%, 40%);">+       reset_ctx = talloc_zero(ctx, struct reset_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+       OSMO_ASSERT(reset_ctx);</span><br><span style="color: hsl(120, 100%, 40%);">+       reset_ctx->priv = priv;</span><br><span style="color: hsl(120, 100%, 40%);">+    reset_ctx->cb = cb;</span><br><span style="color: hsl(120, 100%, 40%);">+        reset_fsm = osmo_fsm_inst_alloc(&fsm, ctx, reset_ctx, LOGL_DEBUG, name);</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(reset_fsm);</span><br><span> </span><br><span>  if (already_connected)</span><br><span style="color: hsl(0, 100%, 40%);">-          osmo_fsm_inst_state_chg(reset->fsm, ST_CONN, 0, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_state_chg(reset_fsm, ST_CONN, 0, 0);</span><br><span>   else {</span><br><span>               /* kick off reset-ack sending mechanism */</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_fsm_inst_state_chg(reset->fsm, ST_DISC, RESET_RESEND_INTERVAL,</span><br><span style="color: hsl(120, 100%, 40%);">+                osmo_fsm_inst_state_chg(reset_fsm, ST_DISC, RESET_RESEND_INTERVAL,</span><br><span>                                   RESET_RESEND_TIMER_NO);</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return reset;</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%);">-/* Tear down state machine */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_free(struct a_reset_ctx *reset)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        OSMO_ASSERT(reset);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_free(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-      reset->fsm = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-   memset(reset, 0, sizeof(*reset));</span><br><span style="color: hsl(0, 100%, 40%);">-       talloc_free(reset);</span><br><span style="color: hsl(120, 100%, 40%);">+   return reset_fsm;</span><br><span> }</span><br><span> </span><br><span> /* Confirm that we sucessfully received a reset acknowlege message */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_ack_confirm(struct a_reset_ctx *reset)</span><br><span style="color: hsl(120, 100%, 40%);">+void a_reset_ack_confirm(struct osmo_fsm_inst *reset_fsm)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  OSMO_ASSERT(reset);</span><br><span style="color: hsl(0, 100%, 40%);">-     OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_dispatch(reset->fsm, EV_RESET_ACK, reset);</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%);">-/* Report a failed connection */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_conn_fail(struct a_reset_ctx *reset)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-  /* If no reset context is supplied, just drop the info */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!reset)</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_dispatch(reset->fsm, EV_N_DISCONNECT, reset);</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%);">-/* Report a successful connection */</span><br><span style="color: hsl(0, 100%, 40%);">-void a_reset_conn_success(struct a_reset_ctx *reset)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        /* If no reset context is supplied, just drop the info */</span><br><span style="color: hsl(0, 100%, 40%);">-       if (!reset)</span><br><span style="color: hsl(0, 100%, 40%);">-             return;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_fsm_inst_dispatch(reset->fsm, EV_N_CONNECT, reset);</span><br><span style="color: hsl(120, 100%, 40%);">+   OSMO_ASSERT(reset_fsm);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_fsm_inst_dispatch(reset_fsm, EV_CONN_ACK, NULL);</span><br><span> }</span><br><span> </span><br><span> /* Check if we have a connection to a specified msc */</span><br><span style="color: hsl(0, 100%, 40%);">-bool a_reset_conn_ready(struct a_reset_ctx *reset)</span><br><span style="color: hsl(120, 100%, 40%);">+bool a_reset_conn_ready(struct osmo_fsm_inst *reset_fsm)</span><br><span> {</span><br><span>    /* If no reset context is supplied, we assume that</span><br><span>    * the connection can't be ready! */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (!reset)</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!reset_fsm)</span><br><span>              return false;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       OSMO_ASSERT(reset->fsm);</span><br><span style="color: hsl(0, 100%, 40%);">-     if (reset->fsm->state == ST_CONN)</span><br><span style="color: hsl(120, 100%, 40%);">+       if (reset_fsm->state == ST_CONN)</span><br><span>          return true;</span><br><span> </span><br><span>     return false;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/8054">change 8054</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/8054"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-msc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: I8e489eb494d358d130e51cb2167929edeaa12e92 </div>
<div style="display:none"> Gerrit-Change-Number: 8054 </div>
<div style="display:none"> Gerrit-PatchSet: 4 </div>
<div style="display:none"> Gerrit-Owner: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>