<p>pespin has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/libosmo-netif/+/26434">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stream: Add support for AF_UNIX sockets<br><br>Change-Id: I5237a8121be05a9a31a39ca38a6a139062f258c4<br>---<br>M include/osmocom/netif/stream.h<br>M src/stream.c<br>2 files changed, 223 insertions(+), 72 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/libosmo-netif refs/changes/34/26434/1</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 331dec1..b82dff1 100644</span><br><span>--- a/include/osmocom/netif/stream.h</span><br><span>+++ b/include/osmocom/netif/stream.h</span><br><span>@@ -25,6 +25,8 @@</span><br><span> int osmo_stream_srv_link_set_addrs(struct osmo_stream_srv_link *link, const char **addr, size_t addrcnt);</span><br><span> void osmo_stream_srv_link_set_port(struct osmo_stream_srv_link *link, uint16_t port);</span><br><span> void osmo_stream_srv_link_set_proto(struct osmo_stream_srv_link *link, uint16_t proto);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_srv_link_set_type(struct osmo_stream_srv_link *link, int type);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_srv_link_set_domain(struct osmo_stream_srv_link *link, int domain);</span><br><span> void osmo_stream_srv_link_set_accept_cb(struct osmo_stream_srv_link *link, int (*accept_cb)(struct osmo_stream_srv_link *link, int fd));</span><br><span> void osmo_stream_srv_link_set_data(struct osmo_stream_srv_link *link, void *data);</span><br><span> void *osmo_stream_srv_link_get_data(struct osmo_stream_srv_link *link);</span><br><span>@@ -57,6 +59,8 @@</span><br><span> void osmo_stream_cli_set_addr(struct osmo_stream_cli *cli, const char *addr);</span><br><span> 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 style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_type(struct osmo_stream_cli *cli, int type);</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_domain(struct osmo_stream_cli *cli, int domain);</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> int osmo_stream_cli_set_local_addrs(struct osmo_stream_cli *cli, const char **addr, size_t addrcnt);</span><br><span>diff --git a/src/stream.c b/src/stream.c</span><br><span>index 309aafe..1b3d0fb 100644</span><br><span>--- a/src/stream.c</span><br><span>+++ b/src/stream.c</span><br><span>@@ -256,6 +256,8 @@</span><br><span>  char                            *local_addr[OSMO_STREAM_MAX_ADDRS];</span><br><span>  uint8_t                         local_addrcnt;</span><br><span>       uint16_t                        local_port;</span><br><span style="color: hsl(120, 100%, 40%);">+   int                             sk_domain;</span><br><span style="color: hsl(120, 100%, 40%);">+    int                             sk_type;</span><br><span>     uint16_t                        proto;</span><br><span>       int (*connect_cb)(struct osmo_stream_cli *srv);</span><br><span>      int (*disconnect_cb)(struct osmo_stream_cli *srv);</span><br><span>@@ -349,20 +351,26 @@</span><br><span> </span><br><span>       LOGSCLI(cli, LOGL_DEBUG, "sending %u bytes of data\n", msgb_length(msg));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- switch (cli->proto) {</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(0, 100%, 40%);">-     case IPPROTO_SCTP:</span><br><span style="color: hsl(0, 100%, 40%);">-              memset(&sinfo, 0, sizeof(sinfo));</span><br><span style="color: hsl(0, 100%, 40%);">-           sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-          sinfo.sinfo_stream = msgb_sctp_stream(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-             ret = sctp_send(cli->ofd.fd, msg->data, msgb_length(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                         &sinfo, MSG_NOSIGNAL);</span><br><span style="color: hsl(120, 100%, 40%);">+    switch (cli->sk_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case AF_UNIX:</span><br><span style="color: hsl(120, 100%, 40%);">+         ret = send(cli->ofd.fd, msg->data, msg->len, 0);</span><br><span>            break;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-    case IPPROTO_TCP:</span><br><span>    default:</span><br><span style="color: hsl(0, 100%, 40%);">-                ret = send(cli->ofd.fd, msg->data, msgb_length(msg), 0);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</span><br><span style="color: hsl(120, 100%, 40%);">+                switch (cli->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(120, 100%, 40%);">+         case IPPROTO_SCTP:</span><br><span style="color: hsl(120, 100%, 40%);">+                    memset(&sinfo, 0, sizeof(sinfo));</span><br><span style="color: hsl(120, 100%, 40%);">+                 sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                        sinfo.sinfo_stream = msgb_sctp_stream(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   ret = sctp_send(cli->ofd.fd, msg->data, msgb_length(msg),</span><br><span style="color: hsl(120, 100%, 40%);">+                                       &sinfo, MSG_NOSIGNAL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+                case IPPROTO_TCP:</span><br><span style="color: hsl(120, 100%, 40%);">+             default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      ret = send(cli->ofd.fd, msg->data, msgb_length(msg), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                        break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    }</span><br><span>    if (ret < 0) {</span><br><span>            if (errno == EPIPE || errno == ENOTCONN) {</span><br><span>@@ -395,15 +403,20 @@</span><br><span> </span><br><span>               LOGSCLI(cli, LOGL_DEBUG, "connection done.\n");</span><br><span>            cli->state = STREAM_CLI_STATE_CONNECTED;</span><br><span style="color: hsl(0, 100%, 40%);">-             if (cli->proto == IPPROTO_SCTP) {</span><br><span style="color: hsl(120, 100%, 40%);">+          switch (cli->sk_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+          case AF_UNIX:</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%);">+                      if (cli->proto == IPPROTO_SCTP) {</span><br><span> #ifdef SO_NOSIGPIPE</span><br><span style="color: hsl(0, 100%, 40%);">-                     int val = 1;</span><br><span style="color: hsl(120, 100%, 40%);">+                          int val = 1;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-                        ret = setsockopt(ofd->fd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&val, sizeof(val));</span><br><span style="color: hsl(0, 100%, 40%);">-                   if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                         LOGSCLI(cli, LOGL_DEBUG, "Failed setting SO_NOSIGPIPE: %s\n", strerror(errno));</span><br><span style="color: hsl(120, 100%, 40%);">+                             ret = setsockopt(ofd->fd, SOL_SOCKET, SO_NOSIGPIPE, (void*)&val, sizeof(val));</span><br><span style="color: hsl(120, 100%, 40%);">+                         if (ret < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                                       LOGSCLI(cli, LOGL_DEBUG, "Failed setting SO_NOSIGPIPE: %s\n", strerror(errno));</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-                     sctp_sock_activate_events(ofd->fd);</span><br><span style="color: hsl(120, 100%, 40%);">+                                sctp_sock_activate_events(ofd->fd);</span><br><span style="color: hsl(120, 100%, 40%);">+                        }</span><br><span>            }</span><br><span>            if (cli->connect_cb)</span><br><span>                      cli->connect_cb(cli);</span><br><span>@@ -441,6 +454,8 @@</span><br><span>       if (!cli)</span><br><span>            return NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      cli->sk_domain = AF_UNSPEC;</span><br><span style="color: hsl(120, 100%, 40%);">+        cli->sk_type = SOCK_STREAM;</span><br><span>       cli->proto = IPPROTO_TCP;</span><br><span>         cli->ofd.fd = -1;</span><br><span>         cli->ofd.priv_nr = 0;        /* XXX */</span><br><span>@@ -557,6 +572,46 @@</span><br><span>     cli->flags |= OSMO_STREAM_CLI_F_RECONF;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Set the socket type for the stream server link</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] type Socket Type (like SOCK_STREAM (default), SOCK_SEQPACKET, ...)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns zero on success, negative on error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_type(struct osmo_stream_cli *cli, int type)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case SOCK_STREAM:</span><br><span style="color: hsl(120, 100%, 40%);">+     case SOCK_SEQPACKET:</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%);">+              return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     cli->sk_type = type;</span><br><span style="color: hsl(120, 100%, 40%);">+       cli->flags |= OSMO_STREAM_CLI_F_RECONF;</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 Set the socket type for the stream server link</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] type Socket Domain (like AF_UNSPEC (default for IP), AF_UNIX, AF_INET, ...)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns zero on success, negative on error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_cli_set_domain(struct osmo_stream_cli *cli, int domain)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  switch (domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case AF_UNSPEC:</span><br><span style="color: hsl(120, 100%, 40%);">+       case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_UNIX:</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%);">+              return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     cli->sk_domain = domain;</span><br><span style="color: hsl(120, 100%, 40%);">+   cli->flags |= OSMO_STREAM_CLI_F_RECONF;</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> /*! \brief Set the reconnect time of the stream client socket</span><br><span>  *  \param[in] cli Stream Client to modify</span><br><span>  *  \param[in] timeout Re-connect timeout in seconds or negative value to disable auto-reconnection */</span><br><span>@@ -731,21 +786,29 @@</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%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-     switch (cli->proto) {</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(0, 100%, 40%);">-     case IPPROTO_SCTP:</span><br><span style="color: hsl(0, 100%, 40%);">-              ret = osmo_sock_init2_multiaddr(AF_UNSPEC, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          (const char **)cli->local_addr, cli->local_addrcnt, cli->local_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                           (const char **)cli->addr, cli->addrcnt, 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->sk_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+  case AF_UNIX:</span><br><span style="color: hsl(120, 100%, 40%);">+         ret = osmo_sock_unix_init(cli->sk_type, 0, cli->addr[0], OSMO_SOCK_F_CONNECT|OSMO_SOCK_F_BIND|OSMO_SOCK_F_NONBLOCK);</span><br><span>           break;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(120, 100%, 40%);">+  case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_UNSPEC:</span><br><span>      default:</span><br><span style="color: hsl(0, 100%, 40%);">-                ret = osmo_sock_init2(AF_UNSPEC, SOCK_STREAM, cli->proto,</span><br><span style="color: hsl(0, 100%, 40%);">-                                  cli->local_addr[0], cli->local_port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                      cli->addr[0], 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%);">+#ifdef HAVE_LIBSCTP</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(cli->sk_domain, cli->sk_type, 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%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+                default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      ret = osmo_sock_init2(cli->sk_domain, cli->sk_type, 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>    }</span><br><span> </span><br><span>        if (ret < 0) {</span><br><span>@@ -827,6 +890,8 @@</span><br><span>      char                    *addr[OSMO_STREAM_MAX_ADDRS];</span><br><span>        uint8_t                 addrcnt;</span><br><span>     uint16_t                port;</span><br><span style="color: hsl(120, 100%, 40%);">+ int                     sk_domain;</span><br><span style="color: hsl(120, 100%, 40%);">+    int                     sk_type;</span><br><span>     uint16_t                proto;</span><br><span>       int (*accept_cb)(struct osmo_stream_srv_link *srv, int fd);</span><br><span>  void                    *data;</span><br><span>@@ -838,7 +903,7 @@</span><br><span>         int ret;</span><br><span>     int sock_fd;</span><br><span>         char addrstr[128];</span><br><span style="color: hsl(0, 100%, 40%);">-      bool is_ipv6;</span><br><span style="color: hsl(120, 100%, 40%);">+ bool is_ipv6 = false;</span><br><span>        struct sockaddr_storage sa;</span><br><span>  socklen_t sa_len = sizeof(sa);</span><br><span>       struct osmo_stream_srv_link *link = ofd->data;</span><br><span>@@ -849,19 +914,35 @@</span><br><span>                    "peer, reason=`%s'\n", strerror(errno));</span><br><span>               return ret;</span><br><span>  }</span><br><span style="color: hsl(0, 100%, 40%);">-       is_ipv6 = ((struct sockaddr *)&sa)->sa_family == AF_INET6;</span><br><span style="color: hsl(0, 100%, 40%);">-       LOGP(DLINP, LOGL_DEBUG, "accept()ed new link from %s to port %u\n",</span><br><span style="color: hsl(0, 100%, 40%);">-           inet_ntop(is_ipv6 ? AF_INET6 : AF_INET,</span><br><span style="color: hsl(0, 100%, 40%);">-                   is_ipv6 ? (void*)&(((struct sockaddr_in6 *)&sa)->sin6_addr) :</span><br><span style="color: hsl(0, 100%, 40%);">-                                  (void*)&(((struct sockaddr_in *)&sa)->sin_addr),</span><br><span style="color: hsl(0, 100%, 40%);">-                   addrstr, sizeof(addrstr)),</span><br><span style="color: hsl(0, 100%, 40%);">-            link->port);</span><br><span>      sock_fd = ret;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      if (link->proto == IPPROTO_SCTP) {</span><br><span style="color: hsl(0, 100%, 40%);">-           ret = sctp_sock_activate_events(sock_fd);</span><br><span style="color: hsl(0, 100%, 40%);">-               if (ret < 0)</span><br><span style="color: hsl(0, 100%, 40%);">-                 goto error_close_socket;</span><br><span style="color: hsl(120, 100%, 40%);">+      is_ipv6 = false;</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (((struct sockaddr *)&sa)->sa_family) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_UNIX:</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DLINP, LOGL_DEBUG, "accept()ed new link on fd %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                sock_fd);</span><br><span style="color: hsl(120, 100%, 40%);">+                break;</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                is_ipv6 = true;</span><br><span style="color: hsl(120, 100%, 40%);">+               /* fall through */</span><br><span style="color: hsl(120, 100%, 40%);">+    case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         LOGP(DLINP, LOGL_DEBUG, "accept()ed new link from %s to port %u\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                 inet_ntop(is_ipv6 ? AF_INET6 : AF_INET,</span><br><span style="color: hsl(120, 100%, 40%);">+                                 is_ipv6 ? (void*)&(((struct sockaddr_in6 *)&sa)->sin6_addr) :</span><br><span style="color: hsl(120, 100%, 40%);">+                                        (void*)&(((struct sockaddr_in *)&sa)->sin_addr),</span><br><span style="color: hsl(120, 100%, 40%);">+                                 addrstr, sizeof(addrstr)),</span><br><span style="color: hsl(120, 100%, 40%);">+                  link->port);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+             if (link->proto == IPPROTO_SCTP) {</span><br><span style="color: hsl(120, 100%, 40%);">+                 ret = sctp_sock_activate_events(sock_fd);</span><br><span style="color: hsl(120, 100%, 40%);">+                     if (ret < 0)</span><br><span style="color: hsl(120, 100%, 40%);">+                               goto error_close_socket;</span><br><span style="color: hsl(120, 100%, 40%);">+              }</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%);">+              LOGP(DLINP, LOGL_DEBUG, "accept()ed unexpected address family %d\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                     ((struct sockaddr *)&sa)->sa_family);</span><br><span style="color: hsl(120, 100%, 40%);">+             goto error_close_socket;</span><br><span>     }</span><br><span> </span><br><span>        if (link->flags & OSMO_STREAM_SRV_F_NODELAY) {</span><br><span>@@ -899,6 +980,8 @@</span><br><span>  if (!link)</span><br><span>           return NULL;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+      link->sk_domain = AF_UNSPEC;</span><br><span style="color: hsl(120, 100%, 40%);">+       link->sk_type = SOCK_STREAM;</span><br><span>      link->proto = IPPROTO_TCP;</span><br><span>        osmo_fd_setup(&link->ofd, -1, OSMO_FD_READ | OSMO_FD_WRITE, osmo_stream_srv_fd_cb, link, 0);</span><br><span> </span><br><span>@@ -978,6 +1061,47 @@</span><br><span>      link->flags |= OSMO_STREAM_SRV_F_RECONF;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*! \brief Set the socket type for the stream server link</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] link Stream Server Link to modify</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] type Socket Type (like SOCK_STREAM (default), SOCK_SEQPACKET, ...)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns zero on success, negative on error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_srv_link_set_type(struct osmo_stream_srv_link *link, int type)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (type) {</span><br><span style="color: hsl(120, 100%, 40%);">+       case SOCK_STREAM:</span><br><span style="color: hsl(120, 100%, 40%);">+     case SOCK_SEQPACKET:</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%);">+              return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     link->sk_type = type;</span><br><span style="color: hsl(120, 100%, 40%);">+      link->flags |= OSMO_STREAM_SRV_F_RECONF;</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 Set the socket type for the stream server link</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] link Stream Server Link to modify</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \param[in] type Socket Domain (like AF_UNSPEC (default for IP), AF_UNIX, AF_INET, ...)</span><br><span style="color: hsl(120, 100%, 40%);">+ *  \returns zero on success, negative on error.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+int osmo_stream_srv_link_set_domain(struct osmo_stream_srv_link *link, int domain)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+ switch (domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+     case AF_UNSPEC:</span><br><span style="color: hsl(120, 100%, 40%);">+       case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+        case AF_UNIX:</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%);">+              return -ENOTSUP;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     link->sk_domain = domain;</span><br><span style="color: hsl(120, 100%, 40%);">+  link->flags |= OSMO_STREAM_SRV_F_RECONF;</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> /*! \brief Set application private data of the stream server link</span><br><span>  *  \param[in] link Stream Server Link to modify</span><br><span>  *  \param[in] data User-specific data (available in call-back functions) */</span><br><span>@@ -1060,17 +1184,28 @@</span><br><span> </span><br><span>        link->flags &= ~OSMO_STREAM_SRV_F_RECONF;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    switch (link->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+     switch (link->sk_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+         case AF_UNIX:</span><br><span style="color: hsl(120, 100%, 40%);">+                 ret = osmo_sock_unix_init(link->sk_type, 0, link->addr[0], OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                case AF_UNSPEC:</span><br><span style="color: hsl(120, 100%, 40%);">+               case AF_INET:</span><br><span style="color: hsl(120, 100%, 40%);">+         case AF_INET6:</span><br><span style="color: hsl(120, 100%, 40%);">+                        switch (link->proto) {</span><br><span> #ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(0, 100%, 40%);">-        case IPPROTO_SCTP:</span><br><span style="color: hsl(0, 100%, 40%);">-              ret = osmo_sock_init2_multiaddr(AF_UNSPEC, SOCK_STREAM, link->proto,</span><br><span style="color: hsl(0, 100%, 40%);">-                                         (const char **)link->addr, link->addrcnt, link->port,</span><br><span style="color: hsl(0, 100%, 40%);">-                                          NULL, 0, 0, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(0, 100%, 40%);">-          break;</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(link->sk_domain, link->sk_type, link->proto,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                         (const char **)link->addr, link->addrcnt, link->port,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                                NULL, 0, 0, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(120, 100%, 40%);">+                                break;</span><br><span> #endif</span><br><span style="color: hsl(0, 100%, 40%);">-        default:</span><br><span style="color: hsl(0, 100%, 40%);">-                ret = osmo_sock_init(AF_UNSPEC, SOCK_STREAM, link->proto,</span><br><span style="color: hsl(0, 100%, 40%);">-                                    link->addr[0], link->port, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(120, 100%, 40%);">+                   default:</span><br><span style="color: hsl(120, 100%, 40%);">+                              ret = osmo_sock_init(link->sk_domain, link->sk_type, link->proto,</span><br><span style="color: hsl(120, 100%, 40%);">+                                                 link->addr[0], link->port, OSMO_SOCK_F_BIND);</span><br><span style="color: hsl(120, 100%, 40%);">+                      }</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 = -ENOTSUP;</span><br><span>      }</span><br><span>    if (ret < 0)</span><br><span>              return ret;</span><br><span>@@ -1144,20 +1279,26 @@</span><br><span>        llist_del(lh);</span><br><span>       msg = llist_entry(lh, struct msgb, list);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-   switch (conn->srv->proto) {</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(0, 100%, 40%);">-    case IPPROTO_SCTP:</span><br><span style="color: hsl(0, 100%, 40%);">-              memset(&sinfo, 0, sizeof(sinfo));</span><br><span style="color: hsl(0, 100%, 40%);">-           sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));</span><br><span style="color: hsl(0, 100%, 40%);">-          sinfo.sinfo_stream = msgb_sctp_stream(msg);</span><br><span style="color: hsl(0, 100%, 40%);">-             ret = sctp_send(conn->ofd.fd, msg->data, msgb_length(msg),</span><br><span style="color: hsl(0, 100%, 40%);">-                                &sinfo, MSG_NOSIGNAL);</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-    case IPPROTO_TCP:</span><br><span style="color: hsl(0, 100%, 40%);">-       default:</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (conn->srv->sk_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_UNIX:</span><br><span>                ret = send(conn->ofd.fd, msg->data, msg->len, 0);</span><br><span>           break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (conn->srv->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(120, 100%, 40%);">+                case IPPROTO_SCTP:</span><br><span style="color: hsl(120, 100%, 40%);">+                    memset(&sinfo, 0, sizeof(sinfo));</span><br><span style="color: hsl(120, 100%, 40%);">+                 sinfo.sinfo_ppid = htonl(msgb_sctp_ppid(msg));</span><br><span style="color: hsl(120, 100%, 40%);">+                        sinfo.sinfo_stream = msgb_sctp_stream(msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                   ret = sctp_send(conn->ofd.fd, msg->data, msgb_length(msg),</span><br><span style="color: hsl(120, 100%, 40%);">+                                      &sinfo, MSG_NOSIGNAL);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+                case IPPROTO_TCP:</span><br><span style="color: hsl(120, 100%, 40%);">+             default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      ret = send(conn->ofd.fd, msg->data, msg->len, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    }</span><br><span>    if (ret < 0) {</span><br><span>            LOGP(DLINP, LOGL_ERROR, "error to send\n");</span><br><span>@@ -1352,16 +1493,22 @@</span><br><span>      if (!msg)</span><br><span>            return -EINVAL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     switch (conn->srv->proto) {</span><br><span style="color: hsl(0, 100%, 40%);">-#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(0, 100%, 40%);">-    case IPPROTO_SCTP:</span><br><span style="color: hsl(0, 100%, 40%);">-              ret = _sctp_recvmsg_wrapper(conn->ofd.fd, msg);</span><br><span style="color: hsl(0, 100%, 40%);">-              break;</span><br><span style="color: hsl(0, 100%, 40%);">-#endif</span><br><span style="color: hsl(0, 100%, 40%);">-    case IPPROTO_TCP:</span><br><span style="color: hsl(0, 100%, 40%);">-       default:</span><br><span style="color: hsl(120, 100%, 40%);">+      switch (conn->srv->sk_domain) {</span><br><span style="color: hsl(120, 100%, 40%);">+ case AF_UNIX:</span><br><span>                ret = recv(conn->ofd.fd, msgb_data(msg), msgb_tailroom(msg), 0);</span><br><span>          break;</span><br><span style="color: hsl(120, 100%, 40%);">+        default:</span><br><span style="color: hsl(120, 100%, 40%);">+              switch (conn->srv->proto) {</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef HAVE_LIBSCTP</span><br><span style="color: hsl(120, 100%, 40%);">+                case IPPROTO_SCTP:</span><br><span style="color: hsl(120, 100%, 40%);">+                    ret = _sctp_recvmsg_wrapper(conn->ofd.fd, msg);</span><br><span style="color: hsl(120, 100%, 40%);">+                    break;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+                case IPPROTO_TCP:</span><br><span style="color: hsl(120, 100%, 40%);">+             default:</span><br><span style="color: hsl(120, 100%, 40%);">+                      ret = recv(conn->ofd.fd, msgb_data(msg), msgb_tailroom(msg), 0);</span><br><span style="color: hsl(120, 100%, 40%);">+                   break;</span><br><span style="color: hsl(120, 100%, 40%);">+                }</span><br><span>    }</span><br><span> </span><br><span>        if (ret < 0) {</span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/libosmo-netif/+/26434">change 26434</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/+/26434"/><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: I5237a8121be05a9a31a39ca38a6a139062f258c4 </div>
<div style="display:none"> Gerrit-Change-Number: 26434 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: pespin <pespin@sysmocom.de> </div>
<div style="display:none"> Gerrit-Reviewer: Arran Cudbard-bell <a.cudbardb@freeradius.org> </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-MessageType: newchange </div>