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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: use an event to free the nsvscs when using SNS<br><br>Otherwise there could be recursive loop when free'ing NSVCs which<br>in the end create an event which the SNS want to free the NSVCs a<br>second time<br><br>Change-Id: Ie99ba5fe8a84519fe8a8c0abdf875606715ab7f6<br>---<br>M src/gb/gprs_ns2.c<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_sns.c<br>3 files changed, 18 insertions(+), 3 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c</span><br><span>index 45cdfcc..83a8ca0 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -674,8 +674,12 @@</span><br><span>       if (!nse || nse->freed)</span><br><span>           return;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry_safe(nsvc, tmp, &nse->nsvc, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-         gprs_ns2_free_nsvc(nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (nse->bss_sns_fi) {</span><br><span style="color: hsl(120, 100%, 40%);">+             osmo_fsm_inst_dispatch(nse->bss_sns_fi, NS2_SNS_EV_REQ_FREE_NSVCS, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+  } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              llist_for_each_entry_safe(nsvc, tmp, &nse->nsvc, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       gprs_ns2_free_nsvc(nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>    }</span><br><span> }</span><br><span> </span><br><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index 6096263..d2407f6 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -332,6 +332,7 @@</span><br><span>        NS2_SNS_EV_RX_CHANGE_WEIGHT,</span><br><span>         NS2_SNS_EV_RX_ACK,                      /*!< Rx of SNS-ACK (response to ADD/DELETE/CHG_WEIGHT */</span><br><span>  NS2_SNS_EV_REQ_NO_NSVC,         /*!< no more NS-VC remaining (all dead) */</span><br><span style="color: hsl(120, 100%, 40%);">+ NS2_SNS_EV_REQ_FREE_NSVCS,              /*!< free all NS-VCs */</span><br><span>   NS2_SNS_EV_REQ_NSVC_ALIVE,              /*!< a NS-VC became alive */</span><br><span>      NS2_SNS_EV_REQ_ADD_BIND,                /*!< add a new local bind to this NSE */</span><br><span>  NS2_SNS_EV_REQ_DELETE_BIND,             /*!< remove a local bind from this NSE */</span><br><span>diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c</span><br><span>index 1b2864e..e96f6b3 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -84,6 +84,7 @@</span><br><span>    { NS2_SNS_EV_RX_ACK,                    "RX_ACK" },</span><br><span>        { NS2_SNS_EV_RX_CHANGE_WEIGHT,          "RX_CHANGE_WEIGHT" },</span><br><span>      { NS2_SNS_EV_REQ_NO_NSVC,               "REQ_NO_NSVC" },</span><br><span style="color: hsl(120, 100%, 40%);">+    { NS2_SNS_EV_REQ_FREE_NSVCS,            "REQ_FREE_NSVCS" },</span><br><span>        { NS2_SNS_EV_REQ_NSVC_ALIVE,            "REQ_NSVC_ALIVE"},</span><br><span>         { NS2_SNS_EV_REQ_ADD_BIND,              "REQ_ADD_BIND"},</span><br><span>   { NS2_SNS_EV_REQ_DELETE_BIND,           "REQ_DELETE_BIND"},</span><br><span>@@ -1564,6 +1565,7 @@</span><br><span> {</span><br><span>   struct ns2_sns_state *gss = (struct ns2_sns_state *) fi->priv;</span><br><span>    struct gprs_ns2_nse *nse = nse_inst_from_fi(fi);</span><br><span style="color: hsl(120, 100%, 40%);">+      struct gprs_ns2_vc *nsvc, *nsvc2;</span><br><span> </span><br><span>        /* reset when receiving NS2_SNS_EV_REQ_NO_NSVC */</span><br><span>    switch (event) {</span><br><span>@@ -1574,11 +1576,14 @@</span><br><span> </span><br><span>               sns_failed(fi, "no remaining NSVC, resetting SNS FSM");</span><br><span>            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NS2_SNS_EV_REQ_FREE_NSVCS:</span><br><span>      case NS2_SNS_EV_REQ_SELECT_ENDPOINT:</span><br><span>                 /* tear down previous state</span><br><span>           * gprs_ns2_free_nsvcs() will trigger NO_NSVC, prevent this from triggering a reselection */</span><br><span>                 gss->reselection_running = true;</span><br><span style="color: hsl(0, 100%, 40%);">-             gprs_ns2_free_nsvcs(nse);</span><br><span style="color: hsl(120, 100%, 40%);">+             llist_for_each_entry_safe(nsvc, nsvc2, &nse->nsvc, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+                     gprs_ns2_free_nsvc(nsvc);</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span>            ns2_clear_elems(&gss->local);</span><br><span>                 ns2_clear_elems(&gss->remote);</span><br><span> </span><br><span>@@ -1613,6 +1618,7 @@</span><br><span>    .states = ns2_sns_bss_states,</span><br><span>        .num_states = ARRAY_SIZE(ns2_sns_bss_states),</span><br><span>        .allstate_event_mask = S(NS2_SNS_EV_REQ_NO_NSVC) |</span><br><span style="color: hsl(120, 100%, 40%);">+                           S(NS2_SNS_EV_REQ_FREE_NSVCS) |</span><br><span>                               S(NS2_SNS_EV_REQ_SELECT_ENDPOINT) |</span><br><span>                          S(NS2_SNS_EV_REQ_ADD_BIND) |</span><br><span>                         S(NS2_SNS_EV_REQ_DELETE_BIND),</span><br><span>@@ -2329,6 +2335,9 @@</span><br><span>                if (flag & 1)</span><br><span>                    osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_SGSN_WAIT_CONFIG, 0, 0);</span><br><span>             break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case NS2_SNS_EV_REQ_FREE_NSVCS:</span><br><span style="color: hsl(120, 100%, 40%);">+               sns_failed(fi, "On user request to free all NSVCs");</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span>       default:</span><br><span>             ns2_sns_st_all_action(fi, event, data);</span><br><span>              break;</span><br><span>@@ -2341,6 +2350,7 @@</span><br><span>       .num_states = ARRAY_SIZE(ns2_sns_sgsn_states),</span><br><span>       .allstate_event_mask = S(NS2_SNS_EV_RX_SIZE) |</span><br><span>                              S(NS2_SNS_EV_REQ_NO_NSVC) |</span><br><span style="color: hsl(120, 100%, 40%);">+                           S(NS2_SNS_EV_REQ_FREE_NSVCS) |</span><br><span>                               S(NS2_SNS_EV_REQ_ADD_BIND) |</span><br><span>                         S(NS2_SNS_EV_REQ_DELETE_BIND),</span><br><span>        .allstate_action = ns2_sns_st_all_action_sgsn,</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/25146">change 25146</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/libosmocore/+/25146"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmocore </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Ie99ba5fe8a84519fe8a8c0abdf875606715ab7f6 </div>
<div style="display:none"> Gerrit-Change-Number: 25146 </div>
<div style="display:none"> Gerrit-PatchSet: 5 </div>
<div style="display:none"> Gerrit-Owner: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: Jenkins Builder </div>
<div style="display:none"> Gerrit-Reviewer: daniel <dwillmann@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: dexter <pmaier@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>