<p>lynxis lazus <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmocore/+/21485">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: add member name to bind<br><br>Every bind will have a unique name. Add a name argument<br>to all bind creating functions and require them to be unique.<br><br>This is an API break but there wasn't yet a release with NS2.<br><br>Change-Id: I8f1d66b7b3b12da12db8b5e6bd08c1beff085b3e<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, 75 insertions(+), 4 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 6140da2..86bf1ae 100644</span><br><span>--- a/include/osmocom/gprs/gprs_ns2.h</span><br><span>+++ b/include/osmocom/gprs/gprs_ns2.h</span><br><span>@@ -162,8 +162,13 @@</span><br><span> void gprs_ns2_free_nsvc(struct gprs_ns2_vc *nsvc);</span><br><span> struct gprs_ns2_vc *gprs_ns2_nsvc_by_nsvci(struct gprs_ns2_inst *nsi, uint16_t nsvci);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* generic VL driver */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_ns2_vc_bind *gprs_ns2_bind_by_name(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         const char *name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* IP VL driver */</span><br><span> int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+               const char *name,</span><br><span>                    const struct osmo_sockaddr *local,</span><br><span>                   int dscp,</span><br><span>                    struct gprs_ns2_vc_bind **result);</span><br><span>@@ -176,6 +181,7 @@</span><br><span>                const char *netif);</span><br><span> const char *gprs_ns2_fr_bind_netif(struct gprs_ns2_vc_bind *bind);</span><br><span> int gprs_ns2_fr_bind(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+               const char *name,</span><br><span>                    const char *netif,</span><br><span>                   struct osmo_fr_network *fr_network,</span><br><span>                  enum osmo_fr_role fr_role,</span><br><span>@@ -226,6 +232,7 @@</span><br><span>                const struct osmo_sockaddr *saddr);</span><br><span> </span><br><span> int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                 const char *name,</span><br><span>                    const struct osmo_sockaddr *local,</span><br><span>                   int dscp,</span><br><span>                    struct gprs_ns2_vc_bind **result);</span><br><span>diff --git a/src/gb/gprs_ns2.c b/src/gb/gprs_ns2.c</span><br><span>index 890b656..bd69acf 100644</span><br><span>--- a/src/gb/gprs_ns2.c</span><br><span>+++ b/src/gb/gprs_ns2.c</span><br><span>@@ -1239,6 +1239,7 @@</span><br><span>          bind->driver->free_bind(bind);</span><br><span> </span><br><span>     llist_del(&bind->list);</span><br><span style="color: hsl(120, 100%, 40%);">+        talloc_free((char *)bind->name);</span><br><span>  talloc_free(bind);</span><br><span> }</span><br><span> </span><br><span>@@ -1251,6 +1252,24 @@</span><br><span>         }</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! Search for a bind with a unique name</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] nsi NS instance on which we operate</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] name The unique bind name to search for</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return the bind or NULL if not found</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct gprs_ns2_vc_bind *gprs_ns2_bind_by_name(</span><br><span style="color: hsl(120, 100%, 40%);">+             struct gprs_ns2_inst *nsi, const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+       struct gprs_ns2_vc_bind *bind;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      llist_for_each_entry(bind, &nsi->binding, list) {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (!strcmp(bind->name, name))</span><br><span style="color: hsl(120, 100%, 40%);">+                     return bind;</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 NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> enum gprs_ns2_vc_mode gprs_ns2_dialect_to_vc_mode(</span><br><span>              enum gprs_ns2_dialect dialect)</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 6b4fa52..5da6fce 100644</span><br><span>--- a/src/gb/gprs_ns2_fr.c</span><br><span>+++ b/src/gb/gprs_ns2_fr.c</span><br><span>@@ -453,19 +453,33 @@</span><br><span>  *  \param[out] result pointer to created bind</span><br><span>  *  \return 0 on success; negative on error */</span><br><span> int gprs_ns2_fr_bind(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                    const char *name,</span><br><span>                    const char *netif,</span><br><span>                   struct osmo_fr_network *fr_network,</span><br><span>                  enum osmo_fr_role fr_role,</span><br><span>                   struct gprs_ns2_vc_bind **result)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     struct gprs_ns2_vc_bind *bind = talloc_zero(nsi, struct gprs_ns2_vc_bind);</span><br><span style="color: hsl(120, 100%, 40%);">+    struct gprs_ns2_vc_bind *bind;</span><br><span>       struct priv_bind *priv;</span><br><span>      struct osmo_fr_link *fr_link;</span><br><span>        int rc = 0;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+       if (!name)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gprs_ns2_bind_by_name(nsi, name))</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EALREADY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   bind = talloc_zero(nsi, struct gprs_ns2_vc_bind);</span><br><span>    if (!bind)</span><br><span>           return -ENOSPC;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   bind->name = talloc_strdup(bind, name);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bind->name) {</span><br><span style="color: hsl(120, 100%, 40%);">+         rc = -ENOSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+         goto err_bind;</span><br><span style="color: hsl(120, 100%, 40%);">+        }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  bind->driver = &vc_driver_fr;</span><br><span>         bind->ll = GPRS_NS2_LL_FR;</span><br><span>        bind->send_vc = fr_vc_sendmsg;</span><br><span>@@ -475,7 +489,7 @@</span><br><span>      priv = bind->priv = talloc_zero(bind, struct priv_bind);</span><br><span>  if (!priv) {</span><br><span>                 rc = -ENOSPC;</span><br><span style="color: hsl(0, 100%, 40%);">-           goto err_bind;</span><br><span style="color: hsl(120, 100%, 40%);">+                goto err_name;</span><br><span>       }</span><br><span> </span><br><span>        priv->fd.cb = fr_fd_cb;</span><br><span>@@ -536,6 +550,8 @@</span><br><span>     osmo_fr_link_free(fr_link);</span><br><span> err_priv:</span><br><span>     talloc_free(priv);</span><br><span style="color: hsl(120, 100%, 40%);">+err_name:</span><br><span style="color: hsl(120, 100%, 40%);">+ talloc_free((char *)bind->name);</span><br><span> err_bind:</span><br><span>     talloc_free(bind);</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 423ea4b..014517a 100644</span><br><span>--- a/src/gb/gprs_ns2_frgre.c</span><br><span>+++ b/src/gb/gprs_ns2_frgre.c</span><br><span>@@ -538,6 +538,7 @@</span><br><span>  *  \param[out] result pointer to created bind</span><br><span>  *  \return 0 on success; negative on error */</span><br><span> int gprs_ns2_frgre_bind(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                       const char *name,</span><br><span>                    const struct osmo_sockaddr *local,</span><br><span>                   int dscp,</span><br><span>                    struct gprs_ns2_vc_bind **result)</span><br><span>@@ -546,6 +547,12 @@</span><br><span>     struct priv_bind *priv;</span><br><span>      int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   if (!name)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -ENOSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gprs_ns2_bind_by_name(nsi, name))</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EALREADY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (!bind)</span><br><span>           return -ENOSPC;</span><br><span> </span><br><span>@@ -554,6 +561,12 @@</span><br><span>           return -EINVAL;</span><br><span>      }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ bind->name = talloc_strdup(bind, name);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bind->name) {</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_free(bind);</span><br><span style="color: hsl(120, 100%, 40%);">+            return -ENOSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  bind->driver = &vc_driver_frgre;</span><br><span>      bind->ll = GPRS_NS2_LL_FR_GRE;</span><br><span>    bind->send_vc = frgre_vc_sendmsg;</span><br><span>diff --git a/src/gb/gprs_ns2_internal.h b/src/gb/gprs_ns2_internal.h</span><br><span>index 8c0c135..9bfe0b0 100644</span><br><span>--- a/src/gb/gprs_ns2_internal.h</span><br><span>+++ b/src/gb/gprs_ns2_internal.h</span><br><span>@@ -181,6 +181,8 @@</span><br><span> </span><br><span> /*! Structure repesenting a bind instance. E.g. IPv4 listen port. */</span><br><span> struct gprs_ns2_vc_bind {</span><br><span style="color: hsl(120, 100%, 40%);">+      /*! unique name */</span><br><span style="color: hsl(120, 100%, 40%);">+    const char *name;</span><br><span>    /*! list entry in nsi */</span><br><span>     struct llist_head list;</span><br><span>      /*! list of all VC */</span><br><span>diff --git a/src/gb/gprs_ns2_udp.c b/src/gb/gprs_ns2_udp.c</span><br><span>index b923e81..3eb8116 100644</span><br><span>--- a/src/gb/gprs_ns2_udp.c</span><br><span>+++ b/src/gb/gprs_ns2_udp.c</span><br><span>@@ -298,6 +298,7 @@</span><br><span>  *  \param[out] result if set, returns the bind object</span><br><span>  *  \return 0 on success; negative in case of error */</span><br><span> int gprs_ns2_ip_bind(struct gprs_ns2_inst *nsi,</span><br><span style="color: hsl(120, 100%, 40%);">+                const char *name,</span><br><span>                    const struct osmo_sockaddr *local,</span><br><span>                   int dscp,</span><br><span>                    struct gprs_ns2_vc_bind **result)</span><br><span>@@ -306,6 +307,12 @@</span><br><span>        struct priv_bind *priv;</span><br><span>      int rc;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   if (!name)</span><br><span style="color: hsl(120, 100%, 40%);">+            return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     if (gprs_ns2_bind_by_name(nsi, name))</span><br><span style="color: hsl(120, 100%, 40%);">+         return -EALREADY;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  bind = gprs_ns2_ip_bind_by_sockaddr(nsi, local);</span><br><span>     if (bind) {</span><br><span>          *result = bind;</span><br><span>@@ -316,6 +323,12 @@</span><br><span>       if (!bind)</span><br><span>           return -ENOSPC;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+   bind->name = talloc_strdup(bind, name);</span><br><span style="color: hsl(120, 100%, 40%);">+    if (!bind->name) {</span><br><span style="color: hsl(120, 100%, 40%);">+         talloc_free(bind);</span><br><span style="color: hsl(120, 100%, 40%);">+            return -ENOSPC;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (local->u.sa.sa_family != AF_INET && local->u.sa.sa_family != AF_INET6) {</span><br><span>           talloc_free(bind);</span><br><span>           return -EINVAL;</span><br><span>diff --git a/src/gb/gprs_ns2_vty.c b/src/gb/gprs_ns2_vty.c</span><br><span>index d285c22..fdb6b0b 100644</span><br><span>--- a/src/gb/gprs_ns2_vty.c</span><br><span>+++ b/src/gb/gprs_ns2_vty.c</span><br><span>@@ -895,7 +895,7 @@</span><br><span>       } else {</span><br><span>             /* UDP */</span><br><span>            osmo_sockaddr_str_to_sockaddr(&priv.udp, &sockaddr.u.sas);</span><br><span style="color: hsl(0, 100%, 40%);">-              if (gprs_ns2_ip_bind(vty_nsi, &sockaddr, priv.dscp, &bind)) {</span><br><span style="color: hsl(120, 100%, 40%);">+         if (gprs_ns2_ip_bind(vty_nsi, "vtybind", &sockaddr, priv.dscp, &bind)) {</span><br><span>                   /* TODO: could not bind on the specific address */</span><br><span>                   return -1;</span><br><span>           }</span><br><span>@@ -962,7 +962,7 @@</span><br><span>                                              vty_nsi,</span><br><span>                                             vtyvc->netif);</span><br><span>                    if (!fr) {</span><br><span style="color: hsl(0, 100%, 40%);">-                              rc = gprs_ns2_fr_bind(vty_nsi, vtyvc->netif, vty_fr_network, vtyvc->fr.role, &fr);</span><br><span style="color: hsl(120, 100%, 40%);">+                          rc = gprs_ns2_fr_bind(vty_nsi, vtyvc->netif, vtyvc->netif, vty_fr_network, vtyvc->fr.role, &fr);</span><br><span>                                if (rc < 0) {</span><br><span>                                     LOGP(DLNS, LOGL_ERROR, "Can not create fr bind on device %s err: %d\n", vtyvc->netif, rc);</span><br><span>                                      return rc;</span><br><span>diff --git a/src/gb/libosmogb.map b/src/gb/libosmogb.map</span><br><span>index e3301be..7cc1cc8 100644</span><br><span>--- a/src/gb/libosmogb.map</span><br><span>+++ b/src/gb/libosmogb.map</span><br><span>@@ -109,6 +109,7 @@</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(120, 100%, 40%);">+gprs_ns2_bind_by_name;</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></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmocore/+/21485">change 21485</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/+/21485"/><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: I8f1d66b7b3b12da12db8b5e6bd08c1beff085b3e </div>
<div style="display:none"> Gerrit-Change-Number: 21485 </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: 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>