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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2_sns: refactor SNS failures into a function<br><br>The SNS fsm is similar for BSS and SGSN.<br>Terminate the SGSN failures by freeing the NSE.<br><br>Change-Id: I1896f6c3ddb4f98ca261139c1cc77aa8f1558c6f<br>---<br>M src/gb/gprs_ns2_sns.c<br>1 file changed, 25 insertions(+), 10 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/gb/gprs_ns2_sns.c b/src/gb/gprs_ns2_sns.c</span><br><span>index 367f77c..5e43d8c 100644</span><br><span>--- a/src/gb/gprs_ns2_sns.c</span><br><span>+++ b/src/gb/gprs_ns2_sns.c</span><br><span>@@ -171,6 +171,26 @@</span><br><span>   return gss->nse;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* The SNS has failed. Etither restart the SNS (BSS) or remove the SNS (SGSN) */</span><br><span style="color: hsl(120, 100%, 40%);">+#define sns_failed(fi, reason) \</span><br><span style="color: hsl(120, 100%, 40%);">+      _sns_failed(fi, reason, __FILE__, __LINE__)</span><br><span style="color: hsl(120, 100%, 40%);">+static void _sns_failed(struct osmo_fsm_inst *fi, const char *reason, const char *file, int line)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     struct ns2_sns_state *gss = fi->priv;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (reason)</span><br><span style="color: hsl(120, 100%, 40%);">+           LOGPFSML(fi, LOGL_ERROR, "NSE %d: SNS failed: %s\n", gss->nse->nsei, reason);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (gss->role == GPRS_SNS_ROLE_SGSN) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (!gss->nse->persistent)</span><br><span style="color: hsl(120, 100%, 40%);">+                      gprs_ns2_free_nse(gss->nse);</span><br><span style="color: hsl(120, 100%, 40%);">+               else</span><br><span style="color: hsl(120, 100%, 40%);">+                  _osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_UNCONFIGURED, 0, 0, file, line);</span><br><span style="color: hsl(120, 100%, 40%);">+     } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              _osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_REQ_SELECT_ENDPOINT, NULL, file, line);</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> /* helper function to compute the sum of all (data or signaling) weights */</span><br><span> static int ip4_weight_sum(const struct ns2_sns_elems *elems, bool data_weight)</span><br><span> {</span><br><span>@@ -1427,31 +1447,27 @@</span><br><span>       switch (fi->T) {</span><br><span>  case 1:</span><br><span>              if (gss->N >= nsi->timeout[NS_TOUT_TSNS_SIZE_RETRIES]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                       LOGPFSML(fi, LOGL_ERROR, "NSE %d: Size retries failed. Selecting next IP-SNS endpoint.\n", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-                     osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    sns_failed(fi, "Size retries failed. Selecting next IP-SNS endpoint.");</span><br><span>            } else {</span><br><span>                     osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_BSS_SIZE, nsi->timeout[NS_TOUT_TSNS_PROV], 1);</span><br><span>            }</span><br><span>            break;</span><br><span>       case 2:</span><br><span>              if (gss->N >= nsi->timeout[NS_TOUT_TSNS_CONFIG_RETRIES]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGPFSML(fi, LOGL_ERROR, "NSE %d: BSS Config retries failed. Selecting next IP-SNS endpoint.\n", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-                       osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    sns_failed(fi, "BSS Config retries failed. Selecting next IP-SNS endpoint");</span><br><span>               } else {</span><br><span>                     osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_BSS_CONFIG_BSS, nsi->timeout[NS_TOUT_TSNS_PROV], 2);</span><br><span>              }</span><br><span>            break;</span><br><span>       case 3:</span><br><span>              if (gss->N >= nsi->timeout[NS_TOUT_TSNS_CONFIG_RETRIES]) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     LOGPFSML(fi, LOGL_ERROR, "NSE %d: SGSN Config retries failed. Selecting next IP-SNS endpoint.\n", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-                      osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    sns_failed(fi, "SGSN Config retries failed. Selecting next IP-SNS endpoint.");</span><br><span>             } else {</span><br><span>                     osmo_fsm_inst_state_chg(fi, GPRS_SNS_ST_BSS_CONFIG_SGSN, nsi->timeout[NS_TOUT_TSNS_PROV], 3);</span><br><span>             }</span><br><span>            break;</span><br><span>       case 4:</span><br><span style="color: hsl(0, 100%, 40%);">-         LOGPFSML(fi, LOGL_ERROR, "NSE %d: Config succeeded but no NS-VC came online. Selecting next IP-SNS endpoint.\n", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-               osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+            sns_failed(fi, "Config succeeded but no NS-VC came online. Selecting next IP-SNS endpoint.");</span><br><span>              break;</span><br><span>       }</span><br><span>    return 0;</span><br><span>@@ -1573,8 +1589,7 @@</span><br><span>            if (gss->reselection_running)</span><br><span>                     break;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-              LOGPFSML(fi, LOGL_ERROR, "NSE %d: no remaining NSVC, resetting SNS FSM\n", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-             osmo_fsm_inst_dispatch(fi, GPRS_SNS_EV_REQ_SELECT_ENDPOINT, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+            sns_failed(fi, "no remaining NSVC, resetting SNS FSM");</span><br><span>            break;</span><br><span>       case GPRS_SNS_EV_REQ_SELECT_ENDPOINT:</span><br><span>                /* tear down previous state</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/24649">change 24649</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/+/24649"/><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: I1896f6c3ddb4f98ca261139c1cc77aa8f1558c6f </div>
<div style="display:none"> Gerrit-Change-Number: 24649 </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: 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>