<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20627">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  neels: Looks good to me, approved
  Jenkins Builder: Verified

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">BSSMAP RESET: move RESET-ACK into reset fsm<br><br>The Lb interface will need the same RESET-ACK logic.<br><br>Change-Id: Idf4682319a0af5665e867dbc0515d1fe343d9daf<br>---<br>M include/osmocom/bsc/bssmap_reset.h<br>M src/osmo-bsc/a_reset.c<br>M src/osmo-bsc/bssmap_reset.c<br>M src/osmo-bsc/osmo_bsc_bssap.c<br>M tests/handover/handover_test.c<br>5 files changed, 51 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/bssmap_reset.h b/include/osmocom/bsc/bssmap_reset.h</span><br><span>index ba64257..560c543 100644</span><br><span>--- a/include/osmocom/bsc/bssmap_reset.h</span><br><span>+++ b/include/osmocom/bsc/bssmap_reset.h</span><br><span>@@ -2,6 +2,7 @@</span><br><span> #pragma once</span><br><span> </span><br><span> enum bssmap_reset_fsm_event {</span><br><span style="color: hsl(120, 100%, 40%);">+   BSSMAP_RESET_EV_RX_RESET,</span><br><span>    BSSMAP_RESET_EV_RX_RESET_ACK,</span><br><span>        BSSMAP_RESET_EV_CONN_CFM_SUCCESS,</span><br><span>    BSSMAP_RESET_EV_CONN_CFM_FAILURE,</span><br><span>@@ -11,6 +12,7 @@</span><br><span>        int conn_cfm_failure_threshold;</span><br><span>      struct {</span><br><span>             void (*tx_reset)(void *data);</span><br><span style="color: hsl(120, 100%, 40%);">+         void (*tx_reset_ack)(void *data);</span><br><span>            void (*link_up)(void *data);</span><br><span>                 void (*link_lost)(void *data);</span><br><span>       } ops;</span><br><span>diff --git a/src/osmo-bsc/a_reset.c b/src/osmo-bsc/a_reset.c</span><br><span>index feaf491..2371499 100644</span><br><span>--- a/src/osmo-bsc/a_reset.c</span><br><span>+++ b/src/osmo-bsc/a_reset.c</span><br><span>@@ -32,6 +32,12 @@</span><br><span>     osmo_bsc_sigtran_tx_reset(msc);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void a_reset_tx_reset_ack(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct bsc_msc_data *msc = data;</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_bsc_sigtran_tx_reset_ack(msc);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void a_reset_link_up(void *data)</span><br><span> {</span><br><span>     struct bsc_msc_data *msc = data;</span><br><span>@@ -56,6 +62,7 @@</span><br><span>                 .conn_cfm_failure_threshold = 3,</span><br><span>             .ops = {</span><br><span>                     .tx_reset = a_reset_tx_reset,</span><br><span style="color: hsl(120, 100%, 40%);">+                 .tx_reset_ack = a_reset_tx_reset_ack,</span><br><span>                        .link_up = a_reset_link_up,</span><br><span>                  .link_lost = a_reset_link_lost,</span><br><span>              },</span><br><span>diff --git a/src/osmo-bsc/bssmap_reset.c b/src/osmo-bsc/bssmap_reset.c</span><br><span>index 98f6b65..9215e90 100644</span><br><span>--- a/src/osmo-bsc/bssmap_reset.c</span><br><span>+++ b/src/osmo-bsc/bssmap_reset.c</span><br><span>@@ -32,6 +32,7 @@</span><br><span> };</span><br><span> </span><br><span> static const struct value_string bssmap_reset_fsm_event_names[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      OSMO_VALUE_STRING(BSSMAP_RESET_EV_RX_RESET),</span><br><span>         OSMO_VALUE_STRING(BSSMAP_RESET_EV_RX_RESET_ACK),</span><br><span>     OSMO_VALUE_STRING(BSSMAP_RESET_EV_CONN_CFM_FAILURE),</span><br><span>         OSMO_VALUE_STRING(BSSMAP_RESET_EV_CONN_CFM_SUCCESS),</span><br><span>@@ -90,6 +91,12 @@</span><br><span>            bssmap_reset->cfg.ops.tx_reset(bssmap_reset->cfg.data);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void tx_reset_ack(struct bssmap_reset *bssmap_reset)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (bssmap_reset->cfg.ops.tx_reset_ack)</span><br><span style="color: hsl(120, 100%, 40%);">+            bssmap_reset->cfg.ops.tx_reset_ack(bssmap_reset->cfg.data);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void bssmap_reset_disc_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span> {</span><br><span>  struct bssmap_reset *bssmap_reset = (struct bssmap_reset*)fi->priv;</span><br><span>@@ -99,7 +106,21 @@</span><br><span> </span><br><span> static void bssmap_reset_disc_action(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     bssmap_reset_fsm_state_chg(fi, BSSMAP_RESET_ST_CONN);</span><br><span style="color: hsl(120, 100%, 40%);">+ struct bssmap_reset *bssmap_reset = (struct bssmap_reset*)fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+        switch (event) {</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    case BSSMAP_RESET_EV_RX_RESET:</span><br><span style="color: hsl(120, 100%, 40%);">+                tx_reset_ack(bssmap_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+           bssmap_reset_fsm_state_chg(fi, BSSMAP_RESET_ST_CONN);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      case BSSMAP_RESET_EV_RX_RESET_ACK:</span><br><span style="color: hsl(120, 100%, 40%);">+            bssmap_reset_fsm_state_chg(fi, BSSMAP_RESET_ST_CONN);</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      default:</span><br><span style="color: hsl(120, 100%, 40%);">+              OSMO_ASSERT(false);</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span> }</span><br><span> </span><br><span> static void bssmap_reset_conn_onenter(struct osmo_fsm_inst *fi, uint32_t prev_state)</span><br><span>@@ -115,8 +136,15 @@</span><br><span> </span><br><span>        switch (event) {</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  case BSSMAP_RESET_EV_RX_RESET:</span><br><span style="color: hsl(120, 100%, 40%);">+                /* We were connected, but the remote side has restarted. */</span><br><span style="color: hsl(120, 100%, 40%);">+           link_lost(bssmap_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+              tx_reset_ack(bssmap_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+           link_up(bssmap_reset);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     case BSSMAP_RESET_EV_RX_RESET_ACK:</span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPFSML(fi, LOGL_INFO, "Ignoring duplicate RESET ACK\n");</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGPFSML(fi, LOGL_INFO, "Link is already up, ignoring RESET ACK\n");</span><br><span>               break;</span><br><span> </span><br><span>   case BSSMAP_RESET_EV_CONN_CFM_FAILURE:</span><br><span>@@ -153,6 +181,7 @@</span><br><span>         [BSSMAP_RESET_ST_DISC] = {</span><br><span>                .name = "DISC",</span><br><span>                    .in_event_mask = 0</span><br><span style="color: hsl(120, 100%, 40%);">+                            | S(BSSMAP_RESET_EV_RX_RESET)</span><br><span>                        | S(BSSMAP_RESET_EV_RX_RESET_ACK)</span><br><span>                            ,</span><br><span>                    .out_state_mask = 0</span><br><span>@@ -165,6 +194,7 @@</span><br><span>       [BSSMAP_RESET_ST_CONN] = {</span><br><span>                .name = "CONN",</span><br><span>                    .in_event_mask = 0</span><br><span style="color: hsl(120, 100%, 40%);">+                            | S(BSSMAP_RESET_EV_RX_RESET)</span><br><span>                        | S(BSSMAP_RESET_EV_RX_RESET_ACK)</span><br><span>                            | S(BSSMAP_RESET_EV_CONN_CFM_FAILURE)</span><br><span>                        | S(BSSMAP_RESET_EV_CONN_CFM_SUCCESS)</span><br><span>diff --git a/src/osmo-bsc/osmo_bsc_bssap.c b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>index d37b3e0..f168b65 100644</span><br><span>--- a/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>+++ b/src/osmo-bsc/osmo_bsc_bssap.c</span><br><span>@@ -45,6 +45,7 @@</span><br><span> #include <osmocom/core/socket.h></span><br><span> #include <osmocom/core/sockaddr_str.h></span><br><span> #include <osmocom/bsc/lcs_loc_req.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/bssmap_reset.h></span><br><span> </span><br><span> #define IP_V4_ADDR_LEN 4</span><br><span> </span><br><span>@@ -96,17 +97,17 @@</span><br><span>            osmo_sccp_addr_name(osmo_ss7_instance_find(msc->a.cs7_instance),</span><br><span>                              &msc->a.msc_addr));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Instruct the bsc to close all open sigtran connections and to</span><br><span style="color: hsl(0, 100%, 40%);">-         * close all active channels on the BTS side as well */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_sigtran_reset(msc);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>         update_msc_osmux_support(msc, msg, length);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- /* Inform the MSC that we have received the reset request and</span><br><span style="color: hsl(0, 100%, 40%);">-    * that we acted accordingly */</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_bsc_sigtran_tx_reset_ack(msc);</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!msc->a.bssmap_reset) {</span><br><span style="color: hsl(120, 100%, 40%);">+                LOGP(DMSC, LOGL_ERROR, "(msc%d) missing RESET FSM\n", msc->nr);</span><br><span style="color: hsl(120, 100%, 40%);">+          /* Make sure to shut down all open connections, if any */</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_bsc_sigtran_reset(msc);</span><br><span style="color: hsl(120, 100%, 40%);">+          return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     /* Normal case: let the reset FSM orchestrate link down / link up callbacks. */</span><br><span style="color: hsl(120, 100%, 40%);">+       return osmo_fsm_inst_dispatch(msc->a.bssmap_reset->fi, BSSMAP_RESET_EV_RX_RESET, NULL);</span><br><span> }</span><br><span> </span><br><span> /* Page a subscriber based on TMSI and LAC via the specified BTS.</span><br><span>diff --git a/tests/handover/handover_test.c b/tests/handover/handover_test.c</span><br><span>index 230192b..84a48af 100644</span><br><span>--- a/tests/handover/handover_test.c</span><br><span>+++ b/tests/handover/handover_test.c</span><br><span>@@ -1816,6 +1816,7 @@</span><br><span>                                            struct gsm_lchan *lchan) { return HO_RESULT_OK; }</span><br><span> void bsc_tx_bssmap_ho_failure(struct gsm_subscriber_connection *conn) {}</span><br><span> void osmo_bsc_sigtran_tx_reset(void) {}</span><br><span style="color: hsl(120, 100%, 40%);">+void osmo_bsc_sigtran_tx_reset_ack(void) {}</span><br><span> void osmo_bsc_sigtran_reset(void) {}</span><br><span> void bssmap_reset_alloc(void) {}</span><br><span> void bssmap_reset_is_conn_ready(void) {}</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20627">change 20627</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmo-bsc/+/20627"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmo-bsc </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Idf4682319a0af5665e867dbc0515d1fe343d9daf </div>
<div style="display:none"> Gerrit-Change-Number: 20627 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>