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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">gprs_ns2: introduce NS dialects<br><br>A NS dialect describes how the NS Entity interacts with<br>different virtual circuits. E.g. ipaccess use reset/block on udp<br>and is a dynamic connection.<br>A single NS Entity can only support one dialect. This can be later<br>used to protect a NS Entity against dynamic NS virtual circuits of a<br>different type.<br><br>It further allows a bind to support multiple dialects at the same time.<br><br>Change-Id: Ia118bb6f994845d84db09de7a94856f5ca573404<br>---<br>M include/osmocom/gprs/gprs_ns2.h<br>M src/gb/gprs_ns2.c<br>M src/gb/gprs_ns2_fr.c<br>M src/gb/gprs_ns2_frgre.c<br>M src/gb/gprs_ns2_internal.h<br>M src/gb/gprs_ns2_udp.c<br>M src/gb/gprs_ns2_vty.c<br>M src/gb/libosmogb.map<br>8 files changed, 79 insertions(+), 86 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/gprs/gprs_ns2.h b/include/osmocom/gprs/gprs_ns2.h</span><br><span>index 4575329..6140da2 100644</span><br><span>--- a/include/osmocom/gprs/gprs_ns2.h</span><br><span>+++ b/include/osmocom/gprs/gprs_ns2.h</span><br><span>@@ -32,6 +32,14 @@</span><br><span>  NS2_VC_MODE_ALIVE,</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+enum gprs_ns2_dialect {</span><br><span style="color: hsl(120, 100%, 40%);">+ NS2_DIALECT_UNDEF,</span><br><span style="color: hsl(120, 100%, 40%);">+    NS2_DIALECT_STATIC_ALIVE,</span><br><span style="color: hsl(120, 100%, 40%);">+     NS2_DIALECT_STATIC_RESETBLOCK,</span><br><span style="color: hsl(120, 100%, 40%);">+        NS2_DIALECT_IPACCESS,</span><br><span style="color: hsl(120, 100%, 40%);">+ NS2_DIALECT_SNS,</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! Osmocom NS link layer types */</span><br><span> enum gprs_ns2_ll {</span><br><span>   GPRS_NS2_LL_UDP,        /*!< NS/UDP/IP */</span><br><span>@@ -144,7 +152,8 @@</span><br><span>                         gprs_ns2_foreach_nsvc_cb cb, void *cb_data);</span><br><span> struct gprs_ns2_nse *gprs_ns2_nse_by_nsei(struct gprs_ns2_inst *nsi, uint16_t nsei);</span><br><span> struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         enum gprs_ns2_ll linklayer);</span><br><span style="color: hsl(120, 100%, 40%);">+                                  enum gprs_ns2_ll linklayer,</span><br><span style="color: hsl(120, 100%, 40%);">+                                   enum gprs_ns2_dialect dialect);</span><br><span> uint16_t gprs_ns2_nse_nsei(struct gprs_ns2_nse *nse);</span><br><span> void gprs_ns2_free_nse(struct gprs_ns2_nse *nse);</span><br><span> void gprs_ns2_free_nses(struct gprs_ns2_inst *nsi);</span><br><span>@@ -160,7 +169,6 @@</span><br><span>               struct gprs_ns2_vc_bind **result);</span><br><span> struct gprs_ns2_vc_bind *gprs_ns2_ip_bind_by_sockaddr(struct gprs_ns2_inst *nsi,</span><br><span>                                                const struct osmo_sockaddr *sockaddr);</span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_ns2_bind_set_mode(struct gprs_ns2_vc_bind *bind, enum gprs_ns2_vc_mode mode);</span><br><span> </span><br><span> /* FR VL driver */</span><br><span> struct gprs_ns2_vc_bind *gprs_ns2_fr_bind_by_netif(</span><br><span>@@ -188,7 +196,8 @@</span><br><span> struct gprs_ns2_vc *gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind,</span><br><span>                                         const struct osmo_sockaddr *remote,</span><br><span>                                          uint16_t nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  uint16_t nsvci);</span><br><span style="color: hsl(120, 100%, 40%);">+                                      uint16_t nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       enum gprs_ns2_dialect dialect);</span><br><span> struct gprs_ns2_vc *gprs_ns2_ip_connect_inactive(struct gprs_ns2_vc_bind *bind,</span><br><span>                                  const struct osmo_sockaddr *remote,</span><br><span>                                  struct gprs_ns2_nse *nse,</span><br><span>@@ -238,7 +247,5 @@</span><br><span> int gprs_ns2_vty_init(struct gprs_ns2_inst *nsi,</span><br><span>                const struct osmo_sockaddr_str *default_bind);</span><br><span> int gprs_ns2_vty_create();</span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_ns2_vty_force_vc_mode(bool force, enum gprs_ns2_vc_mode mode, const char *reason);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> </span><br><span> /*! @} */</span><br><span>diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c</span><br><span>index d90ba85..920fa68 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -492,7 +492,8 @@</span><br><span>  * \param[in] nse The NS Entity on which we operate</span><br><span>  * \param[in] initiater - if this is an incoming remote (!initiater) or a local outgoing connection (initater)</span><br><span>  * \return newly allocated NS-VC on success; NULL on error */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_ns2_vc *ns2_vc_alloc(struct gprs_ns2_vc_bind *bind, struct gprs_ns2_nse *nse, bool initiater)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_ns2_vc *ns2_vc_alloc(struct gprs_ns2_vc_bind *bind, struct gprs_ns2_nse *nse, bool initiater,</span><br><span style="color: hsl(120, 100%, 40%);">+                           enum gprs_ns2_vc_mode vc_mode)</span><br><span> {</span><br><span>         struct gprs_ns2_vc *nsvc = talloc_zero(bind, struct gprs_ns2_vc);</span><br><span> </span><br><span>@@ -501,7 +502,7 @@</span><br><span> </span><br><span>      nsvc->bind = bind;</span><br><span>        nsvc->nse = nse;</span><br><span style="color: hsl(0, 100%, 40%);">-     nsvc->mode = bind->vc_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+     nsvc->mode = vc_mode;</span><br><span>     nsvc->sig_weight = 1;</span><br><span>     nsvc->data_weight = 1;</span><br><span> </span><br><span>@@ -672,7 +673,8 @@</span><br><span>  *  \param[in] nsi NS instance in which to create NS Entity</span><br><span>  *  \param[in] nsei NS Entity Identifier of to-be-created NSE</span><br><span>  *  \returns newly-allocated NS-E in successful case; NULL on error */</span><br><span style="color: hsl(0, 100%, 40%);">-struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei, enum gprs_ns2_ll linklayer)</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_ns2_nse *gprs_ns2_create_nse(struct gprs_ns2_inst *nsi, uint16_t nsei,</span><br><span style="color: hsl(120, 100%, 40%);">+                                        enum gprs_ns2_ll linklayer, enum gprs_ns2_dialect dialect)</span><br><span> {</span><br><span>     struct gprs_ns2_nse *nse;</span><br><span> </span><br><span>@@ -686,6 +688,7 @@</span><br><span>  if (!nse)</span><br><span>            return NULL;</span><br><span> </span><br><span style="color: hsl(120, 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>@@ -765,6 +768,8 @@</span><br><span>     struct tlv_parsed tp;</span><br><span>        struct gprs_ns2_vc *nsvc;</span><br><span>    struct gprs_ns2_nse *nse;</span><br><span style="color: hsl(120, 100%, 40%);">+     enum gprs_ns2_dialect dialect;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum gprs_ns2_vc_mode vc_mode;</span><br><span>       uint16_t nsvci;</span><br><span>      uint16_t nsei;</span><br><span> </span><br><span>@@ -794,8 +799,10 @@</span><br><span>            return GPRS_NS2_CS_SKIPPED;</span><br><span>  case NS_PDUT_RESET:</span><br><span>          /* accept PDU RESET when vc_mode matches */</span><br><span style="color: hsl(0, 100%, 40%);">-             if (bind->vc_mode == NS2_VC_MODE_BLOCKRESET)</span><br><span style="color: hsl(120, 100%, 40%);">+               if (bind->accept_ipaccess) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       dialect = NS2_DIALECT_IPACCESS;</span><br><span>                      break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span> </span><br><span>                rc = reject_status_msg(msg, &tp, reject, NS_CAUSE_PDU_INCOMP_PSTATE);</span><br><span>            if (rc < 0) {</span><br><span>@@ -837,13 +844,14 @@</span><br><span>                     return GPRS_NS2_CS_SKIPPED;</span><br><span>          }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-           nse = gprs_ns2_create_nse(bind->nsi, nsei, bind->ll);</span><br><span style="color: hsl(120, 100%, 40%);">+           nse = gprs_ns2_create_nse(bind->nsi, nsei, bind->ll, dialect);</span><br><span>                 if (!nse) {</span><br><span>                  return GPRS_NS2_CS_ERROR;</span><br><span>            }</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   nsvc = ns2_vc_alloc(bind, nse, false);</span><br><span style="color: hsl(120, 100%, 40%);">+        vc_mode = gprs_ns2_dialect_to_vc_mode(dialect);</span><br><span style="color: hsl(120, 100%, 40%);">+       nsvc = ns2_vc_alloc(bind, nse, false, vc_mode);</span><br><span>      if (!nsvc)</span><br><span>           return GPRS_NS2_CS_SKIPPED;</span><br><span> </span><br><span>@@ -911,12 +919,13 @@</span><br><span> struct gprs_ns2_vc *gprs_ns2_ip_connect2(struct gprs_ns2_vc_bind *bind,</span><br><span>                                    const struct osmo_sockaddr *remote,</span><br><span>                                          uint16_t nsei,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  uint16_t nsvci)</span><br><span style="color: hsl(120, 100%, 40%);">+                                       uint16_t nsvci,</span><br><span style="color: hsl(120, 100%, 40%);">+                                       enum gprs_ns2_dialect dialect)</span><br><span> {</span><br><span>         struct gprs_ns2_nse *nse = gprs_ns2_nse_by_nsei(bind->nsi, nsei);</span><br><span> </span><br><span>     if (!nse) {</span><br><span style="color: hsl(0, 100%, 40%);">-             nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_UDP);</span><br><span style="color: hsl(120, 100%, 40%);">+               nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_UDP, dialect);</span><br><span>             if (!nse)</span><br><span>                    return NULL;</span><br><span>         }</span><br><span>@@ -937,11 +946,19 @@</span><br><span>    struct gprs_ns2_vc *nsvc;</span><br><span> </span><br><span>        if (!nse) {</span><br><span style="color: hsl(0, 100%, 40%);">-             nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_UDP);</span><br><span style="color: hsl(120, 100%, 40%);">+               nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_UDP, NS2_DIALECT_SNS);</span><br><span>             if (!nse)</span><br><span>                    return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ if (nse->ll != GPRS_NS2_LL_UDP) {</span><br><span style="color: hsl(120, 100%, 40%);">+          return -2;</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%);">+   if (nse->dialect != NS2_DIALECT_SNS) {</span><br><span style="color: hsl(120, 100%, 40%);">+             return -2;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  nsvc = gprs_ns2_ip_bind_connect(bind, nse, remote);</span><br><span>  if (!nsvc)</span><br><span>           return -1;</span><br><span>@@ -1199,14 +1216,6 @@</span><br><span>  }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/*! Set the mode of given bind.</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] bind the bind we want to set the mode of</span><br><span style="color: hsl(0, 100%, 40%);">- *  \param[in] mode mode to set bind to */</span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_ns2_bind_set_mode(struct gprs_ns2_vc_bind *bind, enum gprs_ns2_vc_mode mode)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-       bind->vc_mode = mode;</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /*! Destroy a given bind.</span><br><span>  *  \param[in] bind the bind we want to destroy */</span><br><span> void gprs_ns2_free_bind(struct gprs_ns2_vc_bind *bind)</span><br><span>@@ -1234,4 +1243,20 @@</span><br><span>              gprs_ns2_free_bind(bind);</span><br><span>    }</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+enum gprs_ns2_vc_mode gprs_ns2_dialect_to_vc_mode(</span><br><span style="color: hsl(120, 100%, 40%);">+          enum gprs_ns2_dialect dialect)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (dialect) {</span><br><span style="color: hsl(120, 100%, 40%);">+    case NS2_DIALECT_SNS:</span><br><span style="color: hsl(120, 100%, 40%);">+ case NS2_DIALECT_STATIC_ALIVE:</span><br><span style="color: hsl(120, 100%, 40%);">+                return NS2_VC_MODE_ALIVE;</span><br><span style="color: hsl(120, 100%, 40%);">+     case NS2_DIALECT_STATIC_RESETBLOCK:</span><br><span style="color: hsl(120, 100%, 40%);">+   case NS2_DIALECT_IPACCESS:</span><br><span style="color: hsl(120, 100%, 40%);">+            return NS2_VC_MODE_BLOCKRESET;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</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%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /*! @} */</span><br><span>diff --git a/src/gb/gprs_ns2_fr.c b/src/gb/gprs_ns2_fr.c</span><br><span>index 2d5b021..6b4fa52 100644</span><br><span>--- a/src/gb/gprs_ns2_fr.c</span><br><span>+++ b/src/gb/gprs_ns2_fr.c</span><br><span>@@ -486,7 +486,6 @@</span><br><span>       }</span><br><span>    strncpy(priv->netif, netif, sizeof(priv->netif));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     ns2_vty_bind_apply(bind);</span><br><span>    if (result)</span><br><span>          *result = bind;</span><br><span> </span><br><span>@@ -600,7 +599,7 @@</span><br><span>    struct priv_vc *priv = NULL;</span><br><span>         struct gprs_ns2_nse *nse = gprs_ns2_nse_by_nsei(bind->nsi, nsei);</span><br><span>         if (!nse) {</span><br><span style="color: hsl(0, 100%, 40%);">-             nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_FR);</span><br><span style="color: hsl(120, 100%, 40%);">+                nse = gprs_ns2_create_nse(bind->nsi, nsei, GPRS_NS2_LL_FR, NS2_DIALECT_STATIC_RESETBLOCK);</span><br><span>                if (!nse)</span><br><span>                    return NULL;</span><br><span>                 created_nse = true;</span><br><span>@@ -611,7 +610,7 @@</span><br><span>            goto err_nse;</span><br><span>        }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   nsvc = ns2_vc_alloc(bind, nse, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ nsvc = ns2_vc_alloc(bind, nse, true, NS2_VC_MODE_BLOCKRESET);</span><br><span>        if (!nsvc)</span><br><span>           goto err_nse;</span><br><span> </span><br><span>diff --git a/src/gb/gprs_ns2_frgre.c b/src/gb/gprs_ns2_frgre.c</span><br><span>index 3c276bc..423ea4b 100644</span><br><span>--- a/src/gb/gprs_ns2_frgre.c</span><br><span>+++ b/src/gb/gprs_ns2_frgre.c</span><br><span>@@ -592,8 +592,6 @@</span><br><span>                             dscp, rc, errno);</span><br><span>    }</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   ns2_vty_bind_apply(bind);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    if (result)</span><br><span>          *result = bind;</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 e72deff..8c0c135 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -130,6 +130,9 @@</span><br><span>       /*! which link-layer are we based on? */</span><br><span>     enum gprs_ns2_ll ll;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      /*! which dialect does this NSE speaks? */</span><br><span style="color: hsl(120, 100%, 40%);">+    enum gprs_ns2_dialect dialect;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>     struct osmo_fsm_inst *bss_sns_fi;</span><br><span> };</span><br><span> </span><br><span>@@ -188,8 +191,8 @@</span><br><span>    struct gprs_ns2_inst *nsi;</span><br><span>   struct gprs_ns2_vc_driver *driver;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  /*! if VCs use reset/block/unblock method. IP shall not use this */</span><br><span style="color: hsl(0, 100%, 40%);">-     enum gprs_ns2_vc_mode vc_mode;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool accept_ipaccess;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool accept_sns;</span><br><span> </span><br><span>         /*! which link-layer are we based on? */</span><br><span>     enum gprs_ns2_ll ll;</span><br><span>@@ -222,7 +225,8 @@</span><br><span> </span><br><span> struct gprs_ns2_vc *ns2_vc_alloc(struct gprs_ns2_vc_bind *bind,</span><br><span>                             struct gprs_ns2_nse *nse,</span><br><span style="color: hsl(0, 100%, 40%);">-                               bool initiater);</span><br><span style="color: hsl(120, 100%, 40%);">+                              bool initiater,</span><br><span style="color: hsl(120, 100%, 40%);">+                               enum gprs_ns2_vc_mode vc_mode);</span><br><span> </span><br><span> struct msgb *gprs_ns2_msgb_alloc(void);</span><br><span> </span><br><span>@@ -298,8 +302,6 @@</span><br><span> int gprs_ns2_vc_is_alive(struct gprs_ns2_vc *nsvc);</span><br><span> int gprs_ns2_vc_is_unblocked(struct gprs_ns2_vc *nsvc);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-/* vty.c */</span><br><span style="color: hsl(0, 100%, 40%);">-void ns2_vty_bind_apply(struct gprs_ns2_vc_bind *bind);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> /* nse */</span><br><span> void ns2_nse_notify_unblocked(struct gprs_ns2_vc *nsvc, bool unblocked);</span><br><span style="color: hsl(120, 100%, 40%);">+enum gprs_ns2_vc_mode gprs_ns2_dialect_to_vc_mode(enum gprs_ns2_dialect dialect);</span><br><span>diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c</span><br><span>index 928116d..b923e81 100644</span><br><span>--- a/src/gb/gprs_ns2_udp.c</span><br><span>+++ b/src/gb/gprs_ns2_udp.c</span><br><span>@@ -359,8 +359,6 @@</span><br><span>         }</span><br><span> </span><br><span>        llist_add(&bind->list, &nsi->binding);</span><br><span style="color: hsl(0, 100%, 40%);">-    ns2_vty_bind_apply(bind);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    if (result)</span><br><span>          *result = bind;</span><br><span> </span><br><span>@@ -378,8 +376,16 @@</span><br><span> {</span><br><span>      struct gprs_ns2_vc *nsvc;</span><br><span>    struct priv_vc *priv;</span><br><span style="color: hsl(120, 100%, 40%);">+ enum gprs_ns2_vc_mode vc_mode;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      nsvc = ns2_vc_alloc(bind, nse, true);</span><br><span style="color: hsl(120, 100%, 40%);">+ vc_mode = gprs_ns2_dialect_to_vc_mode(nse->dialect);</span><br><span style="color: hsl(120, 100%, 40%);">+       if ((int) vc_mode == -1) {</span><br><span style="color: hsl(120, 100%, 40%);">+            LOGP(DLNS, LOGL_ERROR, "Can not derive vc mode from dialect %d. Maybe libosmocore is too old.\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                nse->dialect);</span><br><span style="color: hsl(120, 100%, 40%);">+                return NULL;</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%);">+   nsvc = ns2_vc_alloc(bind, nse, true, vc_mode);</span><br><span>       if (!nsvc)</span><br><span>           return NULL;</span><br><span> </span><br><span>diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c</span><br><span>index 43e9c2c..d285c22 100644</span><br><span>--- a/src/gb/gprs_ns2_vty.c</span><br><span>+++ b/src/gb/gprs_ns2_vty.c</span><br><span>@@ -62,10 +62,6 @@</span><br><span>       struct osmo_sockaddr_str frgreaddr;</span><br><span>  int dscp;</span><br><span>    enum gprs_ns2_vc_mode vc_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-  /* force vc mode if another configuration forces</span><br><span style="color: hsl(0, 100%, 40%);">-         * the vc mode. E.g. SNS configuration */</span><br><span style="color: hsl(0, 100%, 40%);">-       bool force_vc_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-     const char *force_vc_mode_reason;</span><br><span>    bool frgre;</span><br><span> </span><br><span>      struct llist_head vtyvc;</span><br><span>@@ -714,30 +710,14 @@</span><br><span>     "Disable NS-{RESET,BLOCK,UNBLOCK}\n")</span><br><span> {</span><br><span>         enum gprs_ns2_vc_mode vc_mode;</span><br><span style="color: hsl(0, 100%, 40%);">-  struct gprs_ns2_vc_bind *bind;</span><br><span> </span><br><span>   if (!strcmp(argv[0], "enabled"))</span><br><span>           vc_mode = NS2_VC_MODE_BLOCKRESET;</span><br><span>    else</span><br><span>                 vc_mode = NS2_VC_MODE_ALIVE;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        if (priv.force_vc_mode) {</span><br><span style="color: hsl(0, 100%, 40%);">-               if (priv.vc_mode != vc_mode)</span><br><span style="color: hsl(0, 100%, 40%);">-            {</span><br><span style="color: hsl(0, 100%, 40%);">-                       vty_out(vty, "Ignoring use-reset-block because it's already set by %s.%s",</span><br><span style="color: hsl(0, 100%, 40%);">-                                priv.force_vc_mode_reason, VTY_NEWLINE);</span><br><span style="color: hsl(0, 100%, 40%);">-                        return CMD_WARNING;</span><br><span style="color: hsl(0, 100%, 40%);">-             }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-               return CMD_SUCCESS;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    priv.vc_mode = vc_mode;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     llist_for_each_entry(bind, &vty_nsi->binding, list) {</span><br><span style="color: hsl(0, 100%, 40%);">-            gprs_ns2_bind_set_mode(bind, priv.vc_mode);</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span>    return CMD_SUCCESS;</span><br><span> }</span><br><span> </span><br><span>@@ -902,6 +882,7 @@</span><br><span>   struct gprs_ns2_nse *nse;</span><br><span>    struct gprs_ns2_vc *nsvc;</span><br><span>    struct osmo_sockaddr sockaddr;</span><br><span style="color: hsl(120, 100%, 40%);">+        enum gprs_ns2_dialect dialect = NS2_DIALECT_UNDEF;</span><br><span>   int rc = 0;</span><br><span> </span><br><span>      if (!vty_nsi)</span><br><span>@@ -918,7 +899,7 @@</span><br><span>                  /* TODO: could not bind on the specific address */</span><br><span>                   return -1;</span><br><span>           }</span><br><span style="color: hsl(0, 100%, 40%);">-               gprs_ns2_bind_set_mode(bind, priv.vc_mode);</span><br><span style="color: hsl(120, 100%, 40%);">+           bind->accept_ipaccess = true;</span><br><span>     }</span><br><span> </span><br><span>        /* create vcs */</span><br><span>@@ -926,6 +907,7 @@</span><br><span>               /* validate settings */</span><br><span>              switch (vtyvc->ll) {</span><br><span>              case GPRS_NS2_LL_UDP:</span><br><span style="color: hsl(120, 100%, 40%);">+                 dialect = NS2_DIALECT_IPACCESS;</span><br><span>                      if (strlen(vtyvc->remote.ip) == 0) {</span><br><span>                              /* Invalid IP for VC */</span><br><span>                              continue;</span><br><span>@@ -942,14 +924,16 @@</span><br><span>                    }</span><br><span>                    break;</span><br><span>               case GPRS_NS2_LL_FR:</span><br><span style="color: hsl(120, 100%, 40%);">+                  dialect = NS2_DIALECT_STATIC_RESETBLOCK;</span><br><span>                     break;</span><br><span>               case GPRS_NS2_LL_FR_GRE:</span><br><span style="color: hsl(120, 100%, 40%);">+                      dialect = NS2_DIALECT_STATIC_RESETBLOCK;</span><br><span>                     continue;</span><br><span>            }</span><br><span> </span><br><span>                nse = gprs_ns2_nse_by_nsei(vty_nsi, vtyvc->nsei);</span><br><span>                 if (!nse) {</span><br><span style="color: hsl(0, 100%, 40%);">-                     nse = gprs_ns2_create_nse(vty_nsi, vtyvc->nsei, vtyvc->ll);</span><br><span style="color: hsl(120, 100%, 40%);">+                     nse = gprs_ns2_create_nse(vty_nsi, vtyvc->nsei, vtyvc->ll, dialect);</span><br><span>                   if (!nse) {</span><br><span>                          /* Could not create NSE for VTY */</span><br><span>                           continue;</span><br><span>@@ -1001,29 +985,3 @@</span><br><span> </span><br><span>        return 0;</span><br><span> }</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief ns2_vty_bind_apply will be called when a new bind is created to apply vty settings</span><br><span style="color: hsl(0, 100%, 40%);">- * \param bind</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%);">-void ns2_vty_bind_apply(struct gprs_ns2_vc_bind *bind)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">- gprs_ns2_bind_set_mode(bind, priv.vc_mode);</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-/*!</span><br><span style="color: hsl(0, 100%, 40%);">- * \brief ns2_vty_force_vc_mode force a mode and prevents the vty from overwriting it.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param force if true mode and reason will be set. false to allow modification via vty.</span><br><span style="color: hsl(0, 100%, 40%);">- * \param mode</span><br><span style="color: hsl(0, 100%, 40%);">- * \param reason A description shown to the user when a vty command wants to change the mode.</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span style="color: hsl(0, 100%, 40%);">-void gprs_ns2_vty_force_vc_mode(bool force, enum gprs_ns2_vc_mode mode, const char *reason)</span><br><span style="color: hsl(0, 100%, 40%);">-{</span><br><span style="color: hsl(0, 100%, 40%);">-        priv.force_vc_mode = force;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     if (force) {</span><br><span style="color: hsl(0, 100%, 40%);">-            priv.vc_mode = mode;</span><br><span style="color: hsl(0, 100%, 40%);">-            priv.force_vc_mode_reason = reason;</span><br><span style="color: hsl(0, 100%, 40%);">-     }</span><br><span style="color: hsl(0, 100%, 40%);">-}</span><br><span>diff --git a/src/gb/libosmogb.map b/src/gb/libosmogb.map</span><br><span>index f8ad901..e3301be 100644</span><br><span>--- a/src/gb/libosmogb.map</span><br><span>+++ b/src/gb/libosmogb.map</span><br><span>@@ -109,7 +109,6 @@</span><br><span> gprs_ns_msgb_alloc;</span><br><span> </span><br><span> gprs_ns2_aff_cause_prim_strs;</span><br><span style="color: hsl(0, 100%, 40%);">-gprs_ns2_bind_set_mode;</span><br><span> gprs_ns2_cause_strs;</span><br><span> gprs_ns2_create_nse;</span><br><span> gprs_ns2_dynamic_create_nse;</span><br><span>@@ -159,7 +158,6 @@</span><br><span> gprs_ns2_reset_persistent_nsvcs;</span><br><span> gprs_ns2_start_alive_all_nsvcs;</span><br><span> gprs_ns2_vty_create;</span><br><span style="color: hsl(0, 100%, 40%);">-gprs_ns2_vty_force_vc_mode;</span><br><span> gprs_ns2_vty_init;</span><br><span> </span><br><span> gprs_nsvc_create2;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21484">change 21484</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/+/21484"/><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: Ia118bb6f994845d84db09de7a94856f5ca573404 </div>
<div style="display:none"> Gerrit-Change-Number: 21484 </div>
<div style="display:none"> Gerrit-PatchSet: 11 </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: laforge <laforge@osmocom.org> </div>
<div style="display:none"> Gerrit-Reviewer: lynxis lazus <lynxis@fe80.eu> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>