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