<p>Harald Welte <strong>merged</strong> this change.</p><p><a href="https://gerrit.osmocom.org/12364">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  Max: Looks good to me, but someone else must approve
  Neels Hofmeyr: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">fix ipa_asp_fsm down state transition<br><br>Properly transition into IPA_ASP_S_DOWN from IPA_ASP_S_ACTIVE<br>and fix the mask of legal out states from IPA_ASP_S_ACTIVE.<br><br>BSC-sccplite tests are still passing with this change.<br><br>Change-Id: Idb8e7bd1c74a4b47080fe32ebe0161c503ead571<br>Related: OS#3111<br>---<br>M src/xua_asp_fsm.c<br>1 file changed, 27 insertions(+), 22 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/xua_asp_fsm.c b/src/xua_asp_fsm.c</span><br><span>index d6edac0..9dc9a82 100644</span><br><span>--- a/src/xua_asp_fsm.c</span><br><span>+++ b/src/xua_asp_fsm.c</span><br><span>@@ -916,6 +916,29 @@</span><br><span>        }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+static void ipa_asp_fsm_del_route(struct ipa_asp_fsm_priv *iafp)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct osmo_ss7_asp *asp = iafp->asp;</span><br><span style="color: hsl(120, 100%, 40%);">+      struct osmo_ss7_instance *inst = asp->inst;</span><br><span style="color: hsl(120, 100%, 40%);">+        struct osmo_ss7_as *as = osmo_ss7_as_find_by_rctx(inst, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+   struct osmo_ss7_route *rt;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  OSMO_ASSERT(as);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    /* find the route which we have created if we ever reached ipa_asp_fsm_wait_id_ack2 */</span><br><span style="color: hsl(120, 100%, 40%);">+        rt = osmo_ss7_route_find_dpc_mask(inst->rtable_system, as->cfg.routing_key.pc, 0xffffff);</span><br><span style="color: hsl(120, 100%, 40%);">+       /* no route found, bail out */</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!rt)</span><br><span style="color: hsl(120, 100%, 40%);">+              return;</span><br><span style="color: hsl(120, 100%, 40%);">+       /* route points to different AS, bail out */</span><br><span style="color: hsl(120, 100%, 40%);">+  if (rt->dest.as != as)</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%);">+     osmo_ss7_route_destroy(rt);</span><br><span style="color: hsl(120, 100%, 40%);">+   /* FIXME: Why don't we also delete this timer if we return early above?</span><br><span style="color: hsl(120, 100%, 40%);">+    * FIXME: Where is this timer even scheduled? */</span><br><span style="color: hsl(120, 100%, 40%);">+      osmo_timer_del(&iafp->pong_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span> </span><br><span> /* Server + Client: We're actively transmitting user data */</span><br><span> static void ipa_asp_fsm_active(struct osmo_fsm_inst *fi, uint32_t event, void *data)</span><br><span>@@ -923,7 +946,8 @@</span><br><span>   switch (event) {</span><br><span>     case XUA_ASP_E_M_ASP_DOWN_REQ:</span><br><span>       case XUA_ASP_E_M_ASP_INACTIVE_REQ:</span><br><span style="color: hsl(0, 100%, 40%);">-              /* FIXME: kill ASP and (wait for) re-connect */</span><br><span style="color: hsl(120, 100%, 40%);">+               ipa_asp_fsm_del_route(fi->priv);</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_fsm_inst_state_chg(fi, IPA_ASP_S_DOWN, 0, 0);</span><br><span>           break;</span><br><span>       }</span><br><span> }</span><br><span>@@ -1025,8 +1049,7 @@</span><br><span>       [IPA_ASP_S_ACTIVE] = {</span><br><span>               .in_event_mask = S(XUA_ASP_E_M_ASP_DOWN_REQ) |</span><br><span>                                S(XUA_ASP_E_M_ASP_INACTIVE_REQ),</span><br><span style="color: hsl(0, 100%, 40%);">-               .out_state_mask = S(XUA_ASP_S_INACTIVE) |</span><br><span style="color: hsl(0, 100%, 40%);">-                                 S(XUA_ASP_S_DOWN),</span><br><span style="color: hsl(120, 100%, 40%);">+          .out_state_mask = S(IPA_ASP_S_DOWN),</span><br><span>                 .name = "ASP_ACTIVE",</span><br><span>              .action = ipa_asp_fsm_active,</span><br><span>                .onenter = ipa_asp_fsm_active_onenter,</span><br><span>@@ -1035,25 +1058,7 @@</span><br><span> </span><br><span> static void ipa_asp_fsm_cleanup(struct osmo_fsm_inst *fi, enum osmo_fsm_term_cause cause)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   struct ipa_asp_fsm_priv *iafp = fi->priv;</span><br><span style="color: hsl(0, 100%, 40%);">-    struct osmo_ss7_asp *asp = iafp->asp;</span><br><span style="color: hsl(0, 100%, 40%);">-        struct osmo_ss7_instance *inst = asp->inst;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct osmo_ss7_as *as = osmo_ss7_as_find_by_rctx(inst, 0);</span><br><span style="color: hsl(0, 100%, 40%);">-     struct osmo_ss7_route *rt;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-      OSMO_ASSERT(as);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-        /* find the route which we have created if we ever reached ipa_asp_fsm_wait_id_ack2 */</span><br><span style="color: hsl(0, 100%, 40%);">-  rt = osmo_ss7_route_find_dpc_mask(inst->rtable_system, as->cfg.routing_key.pc, 0xffffff);</span><br><span style="color: hsl(0, 100%, 40%);">- /* no route found, bail out */</span><br><span style="color: hsl(0, 100%, 40%);">-  if (!rt)</span><br><span style="color: hsl(0, 100%, 40%);">-                return;</span><br><span style="color: hsl(0, 100%, 40%);">- /* route points to different AS, bail out */</span><br><span style="color: hsl(0, 100%, 40%);">-    if (rt->dest.as != as)</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_ss7_route_destroy(rt);</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_timer_del(&iafp->pong_timer);</span><br><span style="color: hsl(120, 100%, 40%);">+     ipa_asp_fsm_del_route(fi->priv);</span><br><span> }</span><br><span> </span><br><span> struct osmo_fsm ipa_asp_fsm = {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/12364">change 12364</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/12364"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: merged </div>
<div style="display:none"> Gerrit-Change-Id: Idb8e7bd1c74a4b47080fe32ebe0161c503ead571 </div>
<div style="display:none"> Gerrit-Change-Number: 12364 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: Stefan Sperling <stsp@stsp.name> </div>
<div style="display:none"> Gerrit-Reviewer: Harald Welte <laforge@gnumonks.org> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder (1000002) </div>
<div style="display:none"> Gerrit-Reviewer: Max <msuraev@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Neels Hofmeyr <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Stefan Sperling <stsp@stsp.name> </div>