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