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

</div><pre style="font-family: monospace,monospace; white-space: pre-wrap;">configure.ac: Introduce --{enable,disable}-libsctp configure flag<br><br>Similar to what we do in libosmocore already, we want to<br>deterministically enable or disable support for the feature without<br>having into account if the system has a libsctp. If libsctp is missing<br>and support is enabled, then fail.<br><br>Extra checks are also added:<br>* Check netinet/sctp.h header<br>* Check libosmocore was built with libsctp support (API<br>osmo_sock_init2_multiaddr() we require).<br>* In stream.c make sure it can be built without HAVE_LIBSCTP, and that<br>set_addrs() fails for more than 1 address (since that feature is only<br>supported through osmo_sock_init2_multiaddrs()).<br><br>Change-Id: I4b3e1f1894f13ac1175a71a5139c02a2633be26d<br>---<br>M configure.ac<br>M src/stream.c<br>2 files changed, 38 insertions(+), 16 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/configure.ac b/configure.ac</span><br><span>index 7af10ec..a96fb70 100644</span><br><span>--- a/configure.ac</span><br><span>+++ b/configure.ac</span><br><span>@@ -87,16 +87,24 @@</span><br><span> dnl FIXME: We depend on libosmoabis by now until we can move LAPD code here</span><br><span> PKG_CHECK_MODULES(LIBOSMOABIS, libosmoabis >= 0.6.0)</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-old_LIBS=$LIBS</span><br><span style="color: hsl(0, 100%, 40%);">-AC_SEARCH_LIBS([sctp_send], [sctp], [</span><br><span style="color: hsl(0, 100%, 40%);">- AC_DEFINE(HAVE_LIBSCTP, 1, [Define 1 to enable SCTP support])</span><br><span style="color: hsl(0, 100%, 40%);">-   AC_SUBST(HAVE_LIBSCTP, [1])</span><br><span style="color: hsl(0, 100%, 40%);">-     if test -n "$ac_lib"; then</span><br><span style="color: hsl(0, 100%, 40%);">-            AC_SUBST(LIBSCTP_LIBS, [-l$ac_lib])</span><br><span style="color: hsl(0, 100%, 40%);">-     fi</span><br><span style="color: hsl(0, 100%, 40%);">-      ], [</span><br><span style="color: hsl(0, 100%, 40%);">-    AC_MSG_ERROR([sctp_send not found in searched libs])])</span><br><span style="color: hsl(0, 100%, 40%);">-LIBS=$old_LIBS</span><br><span style="color: hsl(120, 100%, 40%);">+AC_ARG_ENABLE([libsctp], [AS_HELP_STRING([--disable-libsctp], [Do not enable socket multiaddr APIs requiring libsctp])],</span><br><span style="color: hsl(120, 100%, 40%);">+        [ENABLE_LIBSCTP=$enableval], [ENABLE_LIBSCTP="yes"])</span><br><span style="color: hsl(120, 100%, 40%);">+AM_CONDITIONAL(ENABLE_LIBSCTP, test x"$ENABLE_LIBSCTP" = x"yes")</span><br><span style="color: hsl(120, 100%, 40%);">+AS_IF([test "x$ENABLE_LIBSCTP" = "xyes"], [</span><br><span style="color: hsl(120, 100%, 40%);">+ AC_CHECK_HEADERS(netinet/sctp.h,,AC_MSG_ERROR(netinet/sctp.h not found))</span><br><span style="color: hsl(120, 100%, 40%);">+      old_LIBS=$LIBS</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_CHECK_LIB(osmocore, osmo_sock_init2_multiaddr,, AC_MSG_ERROR(libosmocore built without libsctp support), $LIBOSMOCORE_LIBS)</span><br><span style="color: hsl(120, 100%, 40%);">+        LIBS=$old_LIBS</span><br><span style="color: hsl(120, 100%, 40%);">+        AC_SEARCH_LIBS([sctp_send], [sctp], [</span><br><span style="color: hsl(120, 100%, 40%);">+         AC_DEFINE(HAVE_LIBSCTP, 1, [Define 1 to enable SCTP support])</span><br><span style="color: hsl(120, 100%, 40%);">+         AC_SUBST(HAVE_LIBSCTP, [1])</span><br><span style="color: hsl(120, 100%, 40%);">+           if test -n "$ac_lib"; then</span><br><span style="color: hsl(120, 100%, 40%);">+                  AC_SUBST(LIBSCTP_LIBS, [-l$ac_lib])</span><br><span style="color: hsl(120, 100%, 40%);">+           fi</span><br><span style="color: hsl(120, 100%, 40%);">+            ], [</span><br><span style="color: hsl(120, 100%, 40%);">+          AC_MSG_ERROR([sctp_send not found in searched libs])])</span><br><span style="color: hsl(120, 100%, 40%);">+        LIBS=$old_LIBS</span><br><span style="color: hsl(120, 100%, 40%);">+])</span><br><span> </span><br><span> AC_CHECK_HEADERS(dahdi/user.h,,AC_MSG_WARN(DAHDI input driver will not be built))</span><br><span> </span><br><span>diff --git a/src/stream.c b/src/stream.c</span><br><span>index 744a904..537fd28 100644</span><br><span>--- a/src/stream.c</span><br><span>+++ b/src/stream.c</span><br><span>@@ -106,9 +106,11 @@</span><br><span>  int rc;</span><br><span> </span><br><span>  switch (proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span>        case IPPROTO_SCTP:</span><br><span>           rc = setsockopt(fd, IPPROTO_SCTP, SCTP_NODELAY, &on, sizeof(on));</span><br><span>                break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       case IPPROTO_TCP:</span><br><span>            rc = setsockopt(fd, IPPROTO_TCP, TCP_NODELAY, &on, sizeof(on));</span><br><span>          break;</span><br><span>@@ -143,15 +145,21 @@</span><br><span> #define OSMO_STREAM_CLI_F_RECONF      (1 << 0)</span><br><span> #define OSMO_STREAM_CLI_F_NODELAY     (1 << 1)</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_STREAM_MAX_ADDRS OSMO_SOCK_MAX_ADDRS</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define OSMO_STREAM_MAX_ADDRS 1</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct osmo_stream_cli {</span><br><span>     struct osmo_fd                  ofd;</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[OSMO_SOCK_MAX_ADDRS];</span><br><span style="color: hsl(120, 100%, 40%);">+   char                            *addr[OSMO_STREAM_MAX_ADDRS];</span><br><span>        uint8_t                         addrcnt;</span><br><span>     uint16_t                        port;</span><br><span style="color: hsl(0, 100%, 40%);">-   char                            *local_addr[OSMO_SOCK_MAX_ADDRS];</span><br><span style="color: hsl(120, 100%, 40%);">+     char                            *local_addr[OSMO_STREAM_MAX_ADDRS];</span><br><span>  uint8_t                         local_addrcnt;</span><br><span>       uint16_t                        local_port;</span><br><span>  uint16_t                        proto;</span><br><span>@@ -369,7 +377,7 @@</span><br><span> {</span><br><span>    int i = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (addrcnt > OSMO_SOCK_MAX_ADDRS)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (addrcnt > OSMO_STREAM_MAX_ADDRS)</span><br><span>              return -EINVAL;</span><br><span> </span><br><span>  for (; i < addrcnt; i++)</span><br><span>@@ -426,7 +434,7 @@</span><br><span> {</span><br><span>       int i = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (addrcnt > OSMO_SOCK_MAX_ADDRS)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (addrcnt > OSMO_STREAM_MAX_ADDRS)</span><br><span>              return -EINVAL;</span><br><span> </span><br><span>  for (; i < addrcnt; i++)</span><br><span>@@ -554,12 +562,14 @@</span><br><span>  cli->flags &= ~OSMO_STREAM_CLI_F_RECONF;</span><br><span> </span><br><span>  switch (cli->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span>        case IPPROTO_SCTP:</span><br><span>           ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, cli->proto,</span><br><span>                                                 (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,</span><br><span>                                                (const char **)cli->addr, cli->addrcnt, cli->port,</span><br><span>                                          OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span>          break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       default:</span><br><span>             ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,</span><br><span>                                 cli->local_addr[0], cli->local_port,</span><br><span>@@ -623,12 +633,14 @@</span><br><span> </span><br><span> </span><br><span>     switch (cli->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span>        case IPPROTO_SCTP:</span><br><span>           ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, cli->proto,</span><br><span>                                                 (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,</span><br><span>                                                (const char **)cli->addr, cli->addrcnt, cli->port,</span><br><span>                                          OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span>          break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       default:</span><br><span>             ret = osmo_sock_init2(AF_INET, SOCK_STREAM, cli->proto,</span><br><span>                                 cli->local_addr[0], cli->local_port,</span><br><span>@@ -718,7 +730,7 @@</span><br><span> </span><br><span> struct osmo_stream_srv_link {</span><br><span>         struct osmo_fd                  ofd;</span><br><span style="color: hsl(0, 100%, 40%);">-        char                            *addr[OSMO_SOCK_MAX_ADDRS];</span><br><span style="color: hsl(120, 100%, 40%);">+        char                            *addr[OSMO_STREAM_MAX_ADDRS];</span><br><span>         uint8_t                         addrcnt;</span><br><span>         uint16_t                        port;</span><br><span>         uint16_t                        proto;</span><br><span>@@ -830,7 +842,7 @@</span><br><span> {</span><br><span>      int i = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  if (addrcnt > OSMO_SOCK_MAX_ADDRS)</span><br><span style="color: hsl(120, 100%, 40%);">+ if (addrcnt > OSMO_STREAM_MAX_ADDRS)</span><br><span>              return -EINVAL;</span><br><span> </span><br><span>  for (; i < addrcnt; i++)</span><br><span>@@ -950,11 +962,13 @@</span><br><span>  link->flags &= ~OSMO_STREAM_SRV_F_RECONF;</span><br><span> </span><br><span>         switch (link->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span>       case IPPROTO_SCTP:</span><br><span>           ret = osmo_sock_init2_multiaddr(AF_INET, SOCK_STREAM, link->proto,</span><br><span>                                                (const char **)link->addr, link->addrcnt, link->port,</span><br><span>                                               NULL, 0, 0, OSMO_SOCK_F_BIND);</span><br><span>               break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span>       default:</span><br><span>             ret = osmo_sock_init(AF_INET, SOCK_STREAM, link->proto,</span><br><span>                                   link->addr[0], link->port, OSMO_SOCK_F_BIND);</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-netif/+/16760">change 16760</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/+/16760"/><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: I4b3e1f1894f13ac1175a71a5139c02a2633be26d </div>
<div style="display:none"> Gerrit-Change-Number: 16760 </div>
<div style="display:none"> Gerrit-PatchSet: 2 </div>
<div style="display:none"> Gerrit-Owner: neels <nhofmeyr@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: neels <nhofmeyr@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-MessageType: merged </div>