<p>laforge has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/23246">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: Encapsulate setting NSE dialect<br><br>Setting the NSE dialect possibly involves the creating (or destruction)<br>of a IP-SNS FSM.  Encapsulate that, rather than having every caller<br>re-implement that.<br><br>Change-Id: I24fdc26fbcfda039bd58ea166f4d5c2fd1801da1<br>---<br>M src/gb/gprs_ns2.c<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_vty.c<br>3 files changed, 52 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/46/23246/1</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 e19ae78..67403f4 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -781,7 +781,6 @@</span><br><span>                                    enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect)</span><br><span> {</span><br><span>     struct gprs_ns2_nse *nse;</span><br><span style="color: hsl(0, 100%, 40%);">-       char sns[16];</span><br><span> </span><br><span>    nse = gprs_ns2_nse_by_nsei(nsi, nsei);</span><br><span>       if (nse) {</span><br><span>@@ -792,17 +791,13 @@</span><br><span>   nse = talloc_zero(nsi, struct gprs_ns2_nse);</span><br><span>         if (!nse)</span><br><span>            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   if (dialect == GPRS_NS2_DIALECT_SNS) {</span><br><span style="color: hsl(0, 100%, 40%);">-          snprintf(sns, sizeof(sns), "NSE%05u-SNS", nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-              nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!nse->bss_sns_fi) {</span><br><span style="color: hsl(0, 100%, 40%);">-                      talloc_free(nse);</span><br><span style="color: hsl(0, 100%, 40%);">-                       return NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-            }</span><br><span style="color: hsl(120, 100%, 40%);">+     if (ns2_nse_set_dialect(nse, dialect) < 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+               talloc_free(nse);</span><br><span style="color: hsl(120, 100%, 40%);">+             return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   nse->dialect = dialect;</span><br><span>   nse->ll = linklayer;</span><br><span>      nse->nsei = nsei;</span><br><span>         nse->nsi = nsi;</span><br><span>@@ -814,6 +809,37 @@</span><br><span>    return nse;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_nse_set_dialect(struct gprs_ns2_nse *nse, enum gprs_ns2_dialect dialect)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     char sns[16];</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       if (nse->dialect == dialect)</span><br><span style="color: hsl(120, 100%, 40%);">+               return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (nse->dialect) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case GPRS_NS2_DIALECT_UNDEF:</span><br><span style="color: hsl(120, 100%, 40%);">+          if (dialect == GPRS_NS2_DIALECT_SNS) {</span><br><span style="color: hsl(120, 100%, 40%);">+                        snprintf(sns, sizeof(sns), "NSE%05u-SNS", nse->nsei);</span><br><span style="color: hsl(120, 100%, 40%);">+                    nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (!nse->bss_sns_fi)</span><br><span style="color: hsl(120, 100%, 40%);">+                              return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+            }</span><br><span style="color: hsl(120, 100%, 40%);">+             nse->dialect = dialect;</span><br><span style="color: hsl(120, 100%, 40%);">+            break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              if (dialect == GPRS_NS2_DIALECT_UNDEF) {</span><br><span style="color: hsl(120, 100%, 40%);">+                      osmo_fsm_inst_term(nse->bss_sns_fi, OSMO_FSM_TERM_REQUEST, NULL);</span><br><span style="color: hsl(120, 100%, 40%);">+                  nse->bss_sns_fi = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+                    nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             } else {</span><br><span style="color: hsl(120, 100%, 40%);">+                      /* we don't support arbitrary changes without going through UNDEF first */</span><br><span style="color: hsl(120, 100%, 40%);">+                        return -EPERM;</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%);">+   return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Return the NSEI</span><br><span>  * \param[in] nse NS Entity</span><br><span>  * \return the nsei.</span><br><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index 80e664c..688a587 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -306,6 +306,7 @@</span><br><span>                       enum gprs_ns2_affecting_cause cause);</span><br><span> void ns2_nse_notify_alive(struct gprs_ns2_vc *nsvc, bool alive);</span><br><span> void ns2_nse_update_mtu(struct gprs_ns2_nse *nse);</span><br><span style="color: hsl(120, 100%, 40%);">+int ns2_nse_set_dialect(struct gprs_ns2_nse *nse, enum gprs_ns2_dialect dialect);</span><br><span> </span><br><span> /* message */</span><br><span> int ns2_validate(struct gprs_ns2_vc *nsvc,</span><br><span>diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c</span><br><span>index 97e8413..f4a1ff2 100644</span><br><span>--- a/src/gb/gprs_ns2_vty.c</span><br><span>+++ b/src/gb/gprs_ns2_vty.c</span><br><span>@@ -900,7 +900,7 @@</span><br><span>        }</span><br><span> </span><br><span>        if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                nse->dialect = GPRS_NS2_DIALECT_STATIC_RESETBLOCK;</span><br><span style="color: hsl(120, 100%, 40%);">+         ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_STATIC_RESETBLOCK);</span><br><span>                dialect_modified = true;</span><br><span>     }</span><br><span> </span><br><span>@@ -935,7 +935,7 @@</span><br><span>  if (ll_modified)</span><br><span>             nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span>      if (dialect_modified)</span><br><span style="color: hsl(0, 100%, 40%);">-           nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span> </span><br><span>        return CMD_WARNING;</span><br><span> }</span><br><span>@@ -986,7 +986,7 @@</span><br><span>       gprs_ns2_free_nsvc(nsvc);</span><br><span>    if (llist_empty(&nse->nsvc)) {</span><br><span>                nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-         nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>@@ -1032,7 +1032,7 @@</span><br><span>  gprs_ns2_free_nsvc(nsvc);</span><br><span>    if (llist_empty(&nse->nsvc)) {</span><br><span>                nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-         nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>@@ -1056,7 +1056,7 @@</span><br><span>  }</span><br><span> </span><br><span>        if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                nse->dialect = GPRS_NS2_DIALECT_STATIC_ALIVE;</span><br><span style="color: hsl(120, 100%, 40%);">+              ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_STATIC_ALIVE);</span><br><span>             dialect_modified = true;</span><br><span>     }</span><br><span> </span><br><span>@@ -1117,7 +1117,7 @@</span><br><span>        if (ll_modified)</span><br><span>             nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span>      if (dialect_modified)</span><br><span style="color: hsl(0, 100%, 40%);">-           nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    return CMD_WARNING;</span><br><span> }</span><br><span> </span><br><span>@@ -1232,7 +1232,7 @@</span><br><span>         gprs_ns2_free_nsvc(nsvc);</span><br><span>    if (llist_empty(&nse->nsvc)) {</span><br><span>                nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-         nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>@@ -1267,7 +1267,7 @@</span><br><span>  }</span><br><span> </span><br><span>        if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                nse->dialect = GPRS_NS2_DIALECT_IPACCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+          ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_IPACCESS);</span><br><span>                 dialect_modified = true;</span><br><span>     }</span><br><span> </span><br><span>@@ -1317,7 +1317,7 @@</span><br><span>        if (ll_modified)</span><br><span>             nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span>      if (dialect_modified)</span><br><span style="color: hsl(0, 100%, 40%);">-           nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    return CMD_WARNING;</span><br><span> }</span><br><span> </span><br><span>@@ -1407,7 +1407,7 @@</span><br><span>         gprs_ns2_free_nsvc(nsvc);</span><br><span>    if (llist_empty(&nse->nsvc)) {</span><br><span>                nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-         nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>@@ -1436,12 +1436,8 @@</span><br><span>         }</span><br><span> </span><br><span>        if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                char sns[16];</span><br><span style="color: hsl(0, 100%, 40%);">-           snprintf(sns, sizeof(sns), "NSE%05u-SNS", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-              nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!nse->bss_sns_fi)</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_SNS) < 0)</span><br><span>                   goto err;</span><br><span style="color: hsl(0, 100%, 40%);">-               nse->dialect = GPRS_NS2_DIALECT_SNS;</span><br><span>              dialect_modified = true;</span><br><span>     }</span><br><span> </span><br><span>@@ -1481,7 +1477,7 @@</span><br><span>        if (ll_modified)</span><br><span>             nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span>      if (dialect_modified)</span><br><span style="color: hsl(0, 100%, 40%);">-           nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>    return CMD_WARNING;</span><br><span> }</span><br><span> </span><br><span>@@ -1528,10 +1524,8 @@</span><br><span>                return CMD_SUCCESS;</span><br><span>  } else {</span><br><span>             /* clean up nse to allow other nsvc commands */</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_fsm_inst_term(nse->bss_sns_fi, OSMO_FSM_TERM_REQUEST, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-            nse->bss_sns_fi = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+            ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>            nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-         nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span>    }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span>@@ -1557,12 +1551,8 @@</span><br><span>         }</span><br><span> </span><br><span>        if (nse->dialect == GPRS_NS2_DIALECT_UNDEF) {</span><br><span style="color: hsl(0, 100%, 40%);">-                char sns[16];</span><br><span style="color: hsl(0, 100%, 40%);">-           snprintf(sns, sizeof(sns), "NSE%05u-SNS", nse->nsei);</span><br><span style="color: hsl(0, 100%, 40%);">-              nse->bss_sns_fi = ns2_sns_bss_fsm_alloc(nse, sns);</span><br><span style="color: hsl(0, 100%, 40%);">-           if (!nse->bss_sns_fi)</span><br><span style="color: hsl(120, 100%, 40%);">+              if (ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_SNS) < 0)</span><br><span>                   goto err;</span><br><span style="color: hsl(0, 100%, 40%);">-               nse->dialect = GPRS_NS2_DIALECT_SNS;</span><br><span>              dialect_modified = true;</span><br><span>     }</span><br><span> </span><br><span>@@ -1632,7 +1622,7 @@</span><br><span>        if (ll_modified)</span><br><span>             nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span>      if (dialect_modified)</span><br><span style="color: hsl(0, 100%, 40%);">-           nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span style="color: hsl(120, 100%, 40%);">+             ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span> </span><br><span>        return CMD_WARNING;</span><br><span> }</span><br><span>@@ -1698,10 +1688,8 @@</span><br><span> </span><br><span>        if (!vty_nse_check_sns(nse)) {</span><br><span>               /* clean up nse to allow other nsvc commands */</span><br><span style="color: hsl(0, 100%, 40%);">-         osmo_fsm_inst_term(nse->bss_sns_fi, OSMO_FSM_TERM_REQUEST, NULL);</span><br><span style="color: hsl(0, 100%, 40%);">-            nse->bss_sns_fi = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+            ns2_nse_set_dialect(nse, GPRS_NS2_DIALECT_UNDEF);</span><br><span>            nse->ll = GPRS_NS2_LL_UNDEF;</span><br><span style="color: hsl(0, 100%, 40%);">-         nse->dialect = GPRS_NS2_DIALECT_UNDEF;</span><br><span>    }</span><br><span> </span><br><span>        return CMD_SUCCESS;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/23246">change 23246</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/+/23246"/><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: I24fdc26fbcfda039bd58ea166f4d5c2fd1801da1 </div>
<div style="display:none"> Gerrit-Change-Number: 23246 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>