<p>laforge <strong>submitted</strong> this change.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-netif/+/15783">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;">stream: osmo_stream_cli: Support setting multiple addr<br><br>This API will be later used to set multiple addresses for SCTP sockets.<br><br>Depends: libosmocore.git Ic8681d9e093216c99c6bca4be81c31ef83688ed1<br>Related: OS#3608<br><br>Change-Id: I09f0d989f2309abdeb304fe570355abed2cd107b<br>---<br>M include/osmocom/netif/stream.h<br>M src/stream.c<br>2 files changed, 85 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/osmocom/netif/stream.h b/include/osmocom/netif/stream.h</span><br><span>index 8fe2578..331dec1 100644</span><br><span>--- a/include/osmocom/netif/stream.h</span><br><span>+++ b/include/osmocom/netif/stream.h</span><br><span>@@ -55,9 +55,11 @@</span><br><span> </span><br><span> void osmo_stream_cli_set_nodelay(struct osmo_stream_cli *cli, bool nodelay);</span><br><span> void osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt);</span><br><span> void osmo_stream_cli_set_port(struct osmo_stream_cli *cli, uint16_t port);</span><br><span> void osmo_stream_cli_set_proto(struct osmo_stream_cli *cli, uint16_t proto);</span><br><span> void osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_local_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt);</span><br><span> void osmo_stream_cli_set_local_port(struct osmo_stream_cli *cli, uint16_t port);</span><br><span> void osmo_stream_cli_set_data(struct osmo_stream_cli *cli, void *data);</span><br><span> void osmo_stream_cli_set_reconnect_timeout(struct osmo_stream_cli *cli, int timeout);</span><br><span>diff --git a/src/stream.c b/src/stream.c</span><br><span>index 0027537..b7e5c3c 100644</span><br><span>--- a/src/stream.c</span><br><span>+++ b/src/stream.c</span><br><span>@@ -148,9 +148,11 @@</span><br><span>  struct llist_head               tx_queue;</span><br><span>    struct osmo_timer_list          timer;</span><br><span>       enum osmo_stream_cli_state      state;</span><br><span style="color: hsl(0, 100%, 40%);">-  char                            *addr;</span><br><span style="color: hsl(120, 100%, 40%);">+        char                            *addr[OSMO_SOCK_MAX_ADDRS];</span><br><span style="color: hsl(120, 100%, 40%);">+   uint8_t                         addrcnt;</span><br><span>     uint16_t                        port;</span><br><span style="color: hsl(0, 100%, 40%);">-   char                            *local_addr;</span><br><span style="color: hsl(120, 100%, 40%);">+  char                            *local_addr[OSMO_SOCK_MAX_ADDRS];</span><br><span style="color: hsl(120, 100%, 40%);">+     uint8_t                         local_addrcnt;</span><br><span>       uint16_t                        local_port;</span><br><span>  uint16_t                        proto;</span><br><span>       int (*connect_cb)(struct osmo_stream_cli *srv);</span><br><span>@@ -354,8 +356,32 @@</span><br><span> void</span><br><span> osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  osmo_talloc_replace_string(cli, &cli->addr, addr);</span><br><span style="color: hsl(120, 100%, 40%);">+     osmo_stream_cli_set_addrs(cli, &addr, 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%);">+/*! \brief Set the remote address set to which we connect.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Useful for protocols allowing connecting to more than one address (such as SCTP)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] cli Stream Client to modify</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] addr Remote IP address set</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return negative on error, 0 on success</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)</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 (addrcnt > OSMO_SOCK_MAX_ADDRS)</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 < addrcnt; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_talloc_replace_string(cli, &cli->addr[i], addr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+       for (; i < cli->addrcnt; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 talloc_free(cli->addr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+                 cli->addr[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%);">+   cli->addrcnt = addrcnt;</span><br><span>   cli->flags |= OSMO_STREAM_CLI_F_RECONF;</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span> }</span><br><span> </span><br><span> /*! \brief Set the remote port number to which we connect</span><br><span>@@ -387,8 +413,32 @@</span><br><span> void</span><br><span> osmo_stream_cli_set_local_addr(struct osmo_stream_cli *cli, const char *addr)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    osmo_talloc_replace_string(cli, &cli->local_addr, addr);</span><br><span style="color: hsl(120, 100%, 40%);">+       osmo_stream_cli_set_local_addrs(cli, &addr, 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%);">+/*! \brief Set the local address set to which we connect.</span><br><span style="color: hsl(120, 100%, 40%);">+ *  Useful for protocols allowing bind to more than one address (such as SCTP)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] cli Stream Client to modify</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] addr Local IP address set</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \return negative on error, 0 on success</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_local_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt)</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 (addrcnt > OSMO_SOCK_MAX_ADDRS)</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 < addrcnt; i++)</span><br><span style="color: hsl(120, 100%, 40%);">+           osmo_talloc_replace_string(cli, &cli->local_addr[i], addr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+ for (; i < cli->local_addrcnt; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+                   talloc_free(cli->local_addr[i]);</span><br><span style="color: hsl(120, 100%, 40%);">+                   cli->local_addr[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%);">+   cli->local_addrcnt = addrcnt;</span><br><span>     cli->flags |= OSMO_STREAM_CLI_F_RECONF;</span><br><span style="color: hsl(120, 100%, 40%);">+    return 0;</span><br><span> }</span><br><span> </span><br><span> /*! \brief Set the protocol for the stream client socket</span><br><span>@@ -503,10 +553,20 @@</span><br><span> </span><br><span>   cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(0, 100%, 40%);">-                            cli->local_addr, cli->local_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                         cli->addr, cli->port,</span><br><span style="color: hsl(0, 100%, 40%);">-                             OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (cli->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case IPPROTO_SCTP:</span><br><span style="color: hsl(120, 100%, 40%);">+            ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         (const char **)cli->addr, cli->addrcnt, cli->port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</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%);">+              ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  cli->local_addr[0], cli->local_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    cli->addr[0], cli->port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (ret < 0) {</span><br><span>            if (reconnect)</span><br><span>                       osmo_stream_cli_reconnect(cli);</span><br><span>@@ -561,10 +621,21 @@</span><br><span> </span><br><span>  cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(0, 100%, 40%);">-                            cli->local_addr, cli->local_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                         cli->addr, cli->port,</span><br><span style="color: hsl(0, 100%, 40%);">-                             OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (cli->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+      case IPPROTO_SCTP:</span><br><span style="color: hsl(120, 100%, 40%);">+            ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(120, 100%, 40%);">+                                          (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                         (const char **)cli->addr, cli->addrcnt, cli->port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                           OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</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%);">+              ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(120, 100%, 40%);">+                                  cli->local_addr[0], cli->local_port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                    cli->addr[0], cli->port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>  if (ret < 0) {</span><br><span>            osmo_stream_cli_reconnect(cli);</span><br><span>              return ret;</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-netif/+/15783">change 15783</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-netif/+/15783"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: libosmo-netif </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I09f0d989f2309abdeb304fe570355abed2cd107b </div>
<div style="display:none"> Gerrit-Change-Number: 15783 </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: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>