<p>pespin <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/16795">View Change</a></p><div style="white-space:pre-wrap">Approvals:
  Jenkins Builder: Verified
  osmith: Looks good to me, approved

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">ss7: Introduce APIs to manage asp_peer hosts<br><br>The code managing addresses is decoupled from xua_server since they will<br>also be used to manage addresses for ASPs.<br><br>Change-Id: I4af2a6915ac57c7baa67343bd9414c65154d67f7<br>---<br>M include/osmocom/sigtran/osmo_ss7.h<br>M src/osmo_ss7.c<br>2 files changed, 67 insertions(+), 37 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/sigtran/osmo_ss7.h b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>index de9494b..2502407 100644</span><br><span>--- a/include/osmocom/sigtran/osmo_ss7.h</span><br><span>+++ b/include/osmocom/sigtran/osmo_ss7.h</span><br><span>@@ -429,6 +429,9 @@</span><br><span> };</span><br><span> </span><br><span> int osmo_ss7_asp_peer_snprintf(char* buf, size_t buf_len, struct osmo_ss7_asp_peer *peer);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_ss7_asp_peer_set_hosts(struct osmo_ss7_asp_peer *peer, void *talloc_ctx,</span><br><span style="color: hsl(120, 100%, 40%);">+                          const char* const* hosts, size_t host_cnt);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_ss7_asp_peer_add_host(struct osmo_ss7_asp_peer *peer, void *talloc_ctx, const char *host);</span><br><span> </span><br><span> struct osmo_ss7_asp *</span><br><span> osmo_ss7_asp_find_by_name(struct osmo_ss7_instance *inst, const char *name);</span><br><span>diff --git a/src/osmo_ss7.c b/src/osmo_ss7.c</span><br><span>index ee762c4..7eb94b2 100644</span><br><span>--- a/src/osmo_ss7.c</span><br><span>+++ b/src/osmo_ss7.c</span><br><span>@@ -1113,6 +1113,60 @@</span><br><span>  return len;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Set (copy) addresses for a given ASP peer. Previous addresses are freed.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] peer Application Server Process peer whose addresses are to be set.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] talloc_ctx talloc context used to allocate new addresses.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] hosts Array of strings containing IP addresses.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] host_cnt Number of strings in hosts</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negtive otherwise */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_ss7_asp_peer_set_hosts(struct osmo_ss7_asp_peer *peer, void *talloc_ctx, const char* const* hosts, size_t host_cnt)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  if (host_cnt > ARRAY_SIZE(peer->host))</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%);">+     for (; i < host_cnt; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+          osmo_talloc_replace_string(talloc_ctx, &peer->host[i], hosts[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+      for (; i < peer->host_cnt; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                       talloc_free(peer->host[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+                        peer->host[i] = 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%);">+   peer->host_cnt = host_cnt;</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 style="color: hsl(120, 100%, 40%);">+/*! \brief Append (copy) address to a given ASP peer. Previous addresses are kept.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] peer Application Server Process peer the address is appened to.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] talloc_ctx talloc context used to allocate new address.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] host string containing an IP addresses.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns 0 on success; negtive otherwise */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_ss7_asp_peer_add_host(struct osmo_ss7_asp_peer *peer, void *talloc_ctx, const char *host)</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%);">+  int i;</span><br><span style="color: hsl(120, 100%, 40%);">+        bool new_is_any = !host || !strcmp(host, "0.0.0.0");</span><br><span style="color: hsl(120, 100%, 40%);">+        bool iter_is_any;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Makes no sense to have INET_ANY and specific addresses in the set */</span><br><span style="color: hsl(120, 100%, 40%);">+       for (i = 0; i < peer->host_cnt; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                  iter_is_any = !peer->host[i] ||</span><br><span style="color: hsl(120, 100%, 40%);">+                                  !strcmp(peer->host[i], "0.0.0.0");</span><br><span style="color: hsl(120, 100%, 40%);">+                 if (new_is_any && iter_is_any)</span><br><span style="color: hsl(120, 100%, 40%);">+                                return -EINVAL;</span><br><span style="color: hsl(120, 100%, 40%);">+                       if (!new_is_any && iter_is_any)</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%);">+     /* Makes no sense to have INET_ANY many times */</span><br><span style="color: hsl(120, 100%, 40%);">+      if (new_is_any && peer->host_cnt)</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%);">+     osmo_talloc_replace_string(talloc_ctx, &peer->host[peer->host_cnt], host);</span><br><span style="color: hsl(120, 100%, 40%);">+  peer->host_cnt++;</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> struct osmo_ss7_asp *</span><br><span> osmo_ss7_asp_find_by_name(struct osmo_ss7_instance *inst, const char *name)</span><br><span> {</span><br><span>@@ -1985,51 +2039,24 @@</span><br><span> int</span><br><span> osmo_ss7_xua_server_set_local_hosts(struct osmo_xua_server *xs, const char **local_hosts, size_t local_host_cnt)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   int i = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    int rc;</span><br><span>      OSMO_ASSERT(ss7_initialized);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       if (local_host_cnt > ARRAY_SIZE(xs->cfg.local.host))</span><br><span style="color: hsl(0, 100%, 40%);">-              return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- for (; i < local_host_cnt; i++)</span><br><span style="color: hsl(0, 100%, 40%);">-              osmo_talloc_replace_string(xs, &xs->cfg.local.host[i], local_hosts[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-  for (; i < xs->cfg.local.host_cnt; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                 talloc_free(xs->cfg.local.host[i]);</span><br><span style="color: hsl(0, 100%, 40%);">-                  xs->cfg.local.host[i] = NULL;</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%);">-       xs->cfg.local.host_cnt = local_host_cnt;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     osmo_stream_srv_link_set_addrs(xs->server, (const char **)xs->cfg.local.host, xs->cfg.local.host_cnt);</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = osmo_ss7_asp_peer_set_hosts(&xs->cfg.local, xs, local_hosts, local_host_cnt);</span><br><span style="color: hsl(120, 100%, 40%);">+     if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    return osmo_stream_srv_link_set_addrs(xs->server, (const char **)xs->cfg.local.host, xs->cfg.local.host_cnt);</span><br><span> }</span><br><span> </span><br><span> int</span><br><span> osmo_ss7_xua_server_add_local_host(struct osmo_xua_server *xs, const char *local_host)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   int i;</span><br><span style="color: hsl(0, 100%, 40%);">-  bool new_is_any = !local_host || !strcmp(local_host, "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-      bool iter_is_any;</span><br><span style="color: hsl(120, 100%, 40%);">+     int rc;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     /* Makes no sense to have INET_ANY and specific addresses in the set */</span><br><span style="color: hsl(0, 100%, 40%);">- for (i = 0; i < xs->cfg.local.host_cnt; i++) {</span><br><span style="color: hsl(0, 100%, 40%);">-                    iter_is_any = !xs->cfg.local.host[i] ||</span><br><span style="color: hsl(0, 100%, 40%);">-                                    !strcmp(xs->cfg.local.host[i], "0.0.0.0");</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (new_is_any && iter_is_any)</span><br><span style="color: hsl(0, 100%, 40%);">-                          return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-                 if (!new_is_any && iter_is_any)</span><br><span style="color: hsl(0, 100%, 40%);">-                         return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">- }</span><br><span style="color: hsl(0, 100%, 40%);">-       /* Makes no sense to have INET_ANY many times */</span><br><span style="color: hsl(0, 100%, 40%);">-        if (new_is_any && xs->cfg.local.host_cnt)</span><br><span style="color: hsl(0, 100%, 40%);">-            return -EINVAL;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">- osmo_talloc_replace_string(xs, &xs->cfg.local.host[xs->cfg.local.host_cnt], local_host);</span><br><span style="color: hsl(0, 100%, 40%);">-      xs->cfg.local.host_cnt++;</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_stream_srv_link_set_addrs(xs->server, (const char **)xs->cfg.local.host, xs->cfg.local.host_cnt);</span><br><span style="color: hsl(0, 100%, 40%);">- return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     rc = osmo_ss7_asp_peer_add_host(&xs->cfg.local, xs, local_host);</span><br><span style="color: hsl(120, 100%, 40%);">+       if (rc < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                return rc;</span><br><span style="color: hsl(120, 100%, 40%);">+    return osmo_stream_srv_link_set_addrs(xs->server, (const char **)xs->cfg.local.host, xs->cfg.local.host_cnt);</span><br><span> }</span><br><span> </span><br><span> void osmo_ss7_xua_server_destroy(struct osmo_xua_server *xs)</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-sccp/+/16795">change 16795</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/libosmo-sccp/+/16795"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-sccp </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I4af2a6915ac57c7baa67343bd9414c65154d67f7 </div>
<div style="display:none"> Gerrit-Change-Number: 16795 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </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: osmith <osmith@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>