<p>neels has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20632">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">LCS: add proper BSSMAP-LE RESET re-using new generalized reset FSM<br><br>Previous commits to generalize the a_reset FSM prepare for this commit: use the<br>same reset FSM for the Lb interface.<br><br>Change-Id: I8c03716648f8c69d12d8f0a0bcec14f040d7cff2<br>---<br>M include/osmocom/bsc/lb.h<br>M src/osmo-bsc/lb.c<br>2 files changed, 72 insertions(+), 30 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmo-bsc refs/changes/32/20632/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/bsc/lb.h b/include/osmocom/bsc/lb.h</span><br><span>index db191ba..a3c717f 100644</span><br><span>--- a/include/osmocom/bsc/lb.h</span><br><span>+++ b/include/osmocom/bsc/lb.h</span><br><span>@@ -48,8 +48,8 @@</span><br><span>      struct osmo_sccp_addr smlc_addr;</span><br><span>     char *smlc_addr_name;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       /*! True after either side has sent a BSSMAP-LE RESET-ACK */</span><br><span style="color: hsl(0, 100%, 40%);">-    bool ready;</span><br><span style="color: hsl(120, 100%, 40%);">+   /*! Lb link is ready when reset_is_conn_ready(reset) returns true. */</span><br><span style="color: hsl(120, 100%, 40%);">+ struct reset *reset;</span><br><span> </span><br><span>     struct rate_ctr_group *ctrs;</span><br><span> };</span><br><span>diff --git a/src/osmo-bsc/lb.c b/src/osmo-bsc/lb.c</span><br><span>index f70a930..fa1b5cc 100644</span><br><span>--- a/src/osmo-bsc/lb.c</span><br><span>+++ b/src/osmo-bsc/lb.c</span><br><span>@@ -30,6 +30,7 @@</span><br><span> #include <osmocom/bsc/debug.h></span><br><span> #include <osmocom/bsc/osmo_bsc_sigtran.h></span><br><span> #include <osmocom/bsc/lcs_loc_req.h></span><br><span style="color: hsl(120, 100%, 40%);">+#include <osmocom/bsc/reset.h></span><br><span> </span><br><span> static struct gsm_subscriber_connection *get_bsc_conn_by_lb_conn_id(int conn_id)</span><br><span> {</span><br><span>@@ -46,7 +47,6 @@</span><br><span> </span><br><span> /* Send reset to SMLC */</span><br><span> int bssmap_le_tx_reset()</span><br><span style="color: hsl(0, 100%, 40%);">-     // TODO use this -- patch coming up</span><br><span> {</span><br><span>     struct osmo_ss7_instance *ss7;</span><br><span>       struct msgb *msg;</span><br><span>@@ -60,7 +60,7 @@</span><br><span> </span><br><span>    ss7 = osmo_ss7_instance_find(bsc_gsmnet->smlc->cs7_instance);</span><br><span>  OSMO_ASSERT(ss7);</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DLCS, LOGL_NOTICE, "Sending RESET to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+   LOGP(DRESET, LOGL_INFO, "Sending RESET to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr));</span><br><span>  msg = osmo_bssap_le_enc(&reset);</span><br><span> </span><br><span>     rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_UDT_RESET]);</span><br><span>@@ -82,7 +82,7 @@</span><br><span> </span><br><span>    ss7 = osmo_ss7_instance_find(bsc_gsmnet->smlc->cs7_instance);</span><br><span>  OSMO_ASSERT(ss7);</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DLCS, LOGL_NOTICE, "Tx RESET ACK to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr));</span><br><span style="color: hsl(120, 100%, 40%);">+    LOGP(DRESET, LOGL_NOTICE, "Sending RESET ACK to SMLC: %s\n", osmo_sccp_addr_name(ss7, &bsc_gsmnet->smlc->smlc_addr));</span><br><span>    msg = osmo_bssap_le_enc(&reset_ack);</span><br><span> </span><br><span>         rate_ctr_inc(&bsc_gsmnet->smlc->ctrs->ctr[SMLC_CTR_BSSMAP_LE_TX_UDT_RESET_ACK]);</span><br><span>@@ -90,27 +90,6 @@</span><br><span>                                    &bsc_gsmnet->smlc->smlc_addr, msg);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-static int bssmap_le_handle_reset(const struct bssmap_le_pdu *pdu)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-      struct gsm_subscriber_connection *conn;</span><br><span style="color: hsl(0, 100%, 40%);">- int rc;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- /* Abort all ongoing Location Requests */</span><br><span style="color: hsl(0, 100%, 40%);">-       llist_for_each_entry(conn, &bsc_gsmnet->subscr_conns, entry)</span><br><span style="color: hsl(0, 100%, 40%);">-             lcs_loc_req_reset(conn);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        rc = bssmap_le_tx_reset_ack();</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!rc)</span><br><span style="color: hsl(0, 100%, 40%);">-                bsc_gsmnet->smlc->ready = true;</span><br><span style="color: hsl(0, 100%, 40%);">-   return rc;</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 int bssmap_le_handle_reset_ack()</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-     bsc_gsmnet->smlc->ready = true;</span><br><span style="color: hsl(0, 100%, 40%);">-   return 0;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> static int handle_unitdata_from_smlc(const struct osmo_sccp_addr *smlc_addr, struct msgb *msg,</span><br><span>                                      const struct osmo_sccp_user *scu)</span><br><span> {</span><br><span>@@ -144,11 +123,13 @@</span><br><span>  case BSSMAP_LE_MSGT_RESET:</span><br><span>           rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_RESET]);</span><br><span>             LOGP(DLCS, LOGL_NOTICE, "RESET from SMLC: %s\n", osmo_sccp_addr_name(ss7, smlc_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-                return bssmap_le_handle_reset(&bssap_le.bssmap_le);</span><br><span style="color: hsl(120, 100%, 40%);">+               return osmo_fsm_inst_dispatch(bsc_gsmnet->smlc->reset->fi, RESET_EV_RX_RESET, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      case BSSMAP_LE_MSGT_RESET_ACK:</span><br><span>               rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_RESET_ACK]);</span><br><span>                 LOGP(DLCS, LOGL_NOTICE, "RESET-ACK from SMLC: %s\n", osmo_sccp_addr_name(ss7, smlc_addr));</span><br><span style="color: hsl(0, 100%, 40%);">-            return bssmap_le_handle_reset_ack();</span><br><span style="color: hsl(120, 100%, 40%);">+          return osmo_fsm_inst_dispatch(bsc_gsmnet->smlc->reset->fi, RESET_EV_RX_RESET_ACK, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  default:</span><br><span>             rate_ctr_inc(&ctr[SMLC_CTR_BSSMAP_LE_RX_UDT_ERR_INVALID_MSG]);</span><br><span>           LOGP(DLCS, LOGL_ERROR, "Rx unimplemented UDT message type %s\n",</span><br><span>@@ -294,6 +275,15 @@</span><br><span> </span><br><span>        OSMO_ASSERT(conn);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        if (!reset_is_conn_ready(bsc_gsmnet->smlc->reset)) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGPFSMSL(conn->fi, DLCS, LOGL_ERROR, "Lb link to SMLC is not ready (no RESET-ACK), cannot send %s\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     osmo_bssap_le_pdu_to_str_c(OTC_SELECT, bssap_le));</span><br><span style="color: hsl(120, 100%, 40%);">+          /* If the remote side was lost, make sure that the SCCP conn is discarded in the local state and towards</span><br><span style="color: hsl(120, 100%, 40%);">+               * the STP. */</span><br><span style="color: hsl(120, 100%, 40%);">+                lb_close_conn(conn);</span><br><span style="color: hsl(120, 100%, 40%);">+          return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  msg = osmo_bssap_le_enc(bssap_le);</span><br><span>   if (!msg) {</span><br><span>          LOGPFSMSL(conn->fi, DLCS, LOGL_ERROR, "Failed to encode %s\n",</span><br><span>@@ -364,6 +354,51 @@</span><br><span>           lcs_loc_req_reset(conn);</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void lb_reset_link_up(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      LOGP(DLCS, LOGL_INFO, "Lb link ready\n");</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%);">+void lb_reset_link_lost(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gsm_subscriber_connection *conn;</span><br><span style="color: hsl(120, 100%, 40%);">+       LOGP(DLCS, LOGL_INFO, "Lb link down\n");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  /* Abort all ongoing Location Requests */</span><br><span style="color: hsl(120, 100%, 40%);">+     llist_for_each_entry(conn, &bsc_gsmnet->subscr_conns, entry)</span><br><span style="color: hsl(120, 100%, 40%);">+           lcs_loc_req_reset(conn);</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%);">+void lb_reset_tx_reset(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap_le_tx_reset();</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%);">+void lb_reset_tx_reset_ack(void *data)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ bssmap_le_tx_reset_ack();</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 lb_start_reset_fsm()</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   struct reset_cfg cfg = {</span><br><span style="color: hsl(120, 100%, 40%);">+              .conn_cfm_failure_threshold = 3,</span><br><span style="color: hsl(120, 100%, 40%);">+              .ops = {</span><br><span style="color: hsl(120, 100%, 40%);">+                      .tx_reset = lb_reset_tx_reset,</span><br><span style="color: hsl(120, 100%, 40%);">+                        .tx_reset_ack = lb_reset_tx_reset_ack,</span><br><span style="color: hsl(120, 100%, 40%);">+                        .link_up = lb_reset_link_up,</span><br><span style="color: hsl(120, 100%, 40%);">+                  .link_lost = lb_reset_link_lost,</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%);">+  if (bsc_gsmnet->smlc->reset) {</span><br><span style="color: hsl(120, 100%, 40%);">+          LOGP(DLCS, LOGL_ERROR, "will not allocate a second reset FSM for Lb\n");</span><br><span style="color: hsl(120, 100%, 40%);">+            return;</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%);">+   bsc_gsmnet->smlc->reset = reset_alloc(bsc_gsmnet, "Lb", &cfg);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static int lb_start()</span><br><span> {</span><br><span>        uint32_t default_pc;</span><br><span>@@ -439,6 +474,7 @@</span><br><span>   if (!bsc_gsmnet->smlc->sccp_user)</span><br><span>              return -EINVAL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   lb_start_reset_fsm();</span><br><span>        return 0;</span><br><span> }</span><br><span> </span><br><span>@@ -462,21 +498,27 @@</span><br><span>   if (bsc_gsmnet->smlc->enable) {</span><br><span>                rc = lb_start();</span><br><span>             switch (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* all is fine */</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span>               case -EAGAIN:</span><br><span>                        /* no need to log about anything */</span><br><span>                  break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DLCS, LOGL_ERROR, "Failed to start Lb interface");</span><br><span style="color: hsl(120, 100%, 40%);">+                     LOGP(DLCS, LOGL_ERROR, "Failed to start Lb interface (rc=%d)\n", rc);</span><br><span>                      break;</span><br><span>               }</span><br><span>    } else {</span><br><span>             rc = lb_stop();</span><br><span>              switch (rc) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case 0:</span><br><span style="color: hsl(120, 100%, 40%);">+                       /* all is fine */</span><br><span style="color: hsl(120, 100%, 40%);">+                     break;</span><br><span>               case -EAGAIN:</span><br><span>                        /* no need to log about anything */</span><br><span>                  break;</span><br><span>               default:</span><br><span style="color: hsl(0, 100%, 40%);">-                        LOGP(DLCS, LOGL_ERROR, "Failed to stop Lb interface");</span><br><span style="color: hsl(120, 100%, 40%);">+                      LOGP(DLCS, LOGL_ERROR, "Failed to stop Lb interface (rc=%d)\n", rc);</span><br><span>                       break;</span><br><span>               }</span><br><span>    }</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmo-bsc/+/20632">change 20632</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/+/20632"/><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: I8c03716648f8c69d12d8f0a0bcec14f040d7cff2 </div>
<div style="display:none"> Gerrit-Change-Number: 20632 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>