<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>