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