aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHarald Welte <laforge@osmocom.org>2023-11-18 20:11:47 +0100
committerHarald Welte <laforge@osmocom.org>2024-02-08 12:31:49 +0100
commit960af680a6a2f89f73305e588baf0c36af10f888 (patch)
tree13314d35e93c9e3bae62ba468866cb595bad7189
parent96e26d5539423b217c17dcaba5859ade805e5bb3 (diff)
stream_{cli,srv}: Add support for SCTP in OSMO_IO mode
Let's enable the OSMO_IO_FD_MODE_SCTP_RECVMSG_SEND mode for SCTP sockets, allowing OSMO_STREAM_MODE_OSMO_IO to be used with SCTP. Change-Id: I6cf5bad5f618e71c80017960c38009b089dbd6a1 Depends: libosmocore Change-Id: I89eb519b22d21011d61a7855b2364bc3c295df82 Closes: OS#5753
-rw-r--r--TODO-RELEASE3
-rw-r--r--src/stream_cli.c13
-rw-r--r--src/stream_srv.c12
3 files changed, 21 insertions, 7 deletions
diff --git a/TODO-RELEASE b/TODO-RELEASE
index 492c205..5a67192 100644
--- a/TODO-RELEASE
+++ b/TODO-RELEASE
@@ -9,4 +9,5 @@
#library what description / commit summary line
libosmocore >1.9.0 working osmo_sock_init2_multiaddr2() without setting flag OSMO_SOCK_F_BIND
libosmocore >1.9.0 use osmo_sock_multiaddr_get_name_buf()
-libosmo-netif added osmo_stream_srv_get_sockname() \ No newline at end of file
+libosmo-netif added osmo_stream_srv_get_sockname()
+libosmo-netif update-dependency libosmocore > 1.9.0 required for I89eb519b22d21011d61a7855b2364bc3c295df82
diff --git a/src/stream_cli.c b/src/stream_cli.c
index 1b9994c..e7e0ec6 100644
--- a/src/stream_cli.c
+++ b/src/stream_cli.c
@@ -904,8 +904,12 @@ int osmo_stream_cli_open(struct osmo_stream_cli *cli)
goto error_close_socket;
break;
case OSMO_STREAM_MODE_OSMO_IO:
- if (!cli->iofd)
- cli->iofd = osmo_iofd_setup(cli, fd, cli->name, OSMO_IO_FD_MODE_READ_WRITE, &osmo_stream_cli_ioops, cli);
+ if (!cli->iofd) {
+ enum osmo_io_fd_mode iofd_mode = OSMO_IO_FD_MODE_READ_WRITE;
+ if (cli->proto == IPPROTO_SCTP)
+ iofd_mode = OSMO_IO_FD_MODE_SCTP_RECVMSG_SEND;
+ cli->iofd = osmo_iofd_setup(cli, fd, cli->name, iofd_mode, &osmo_stream_cli_ioops, cli);
+ }
if (!cli->iofd)
goto error_close_socket;
configure_cli_segmentation_cb(cli->iofd, cli->segmentation_cb);
@@ -951,7 +955,10 @@ void osmo_stream_cli_send(struct osmo_stream_cli *cli, struct msgb *msg)
osmo_fd_write_enable(&cli->ofd);
break;
case OSMO_STREAM_MODE_OSMO_IO:
- osmo_iofd_write_msgb(cli->iofd, msg);
+ if (cli->proto == IPPROTO_SCTP)
+ osmo_iofd_sctp_send_msgb(cli->iofd, msg, MSG_NOSIGNAL);
+ else
+ osmo_iofd_write_msgb(cli->iofd, msg);
break;
default:
OSMO_ASSERT(false);
diff --git a/src/stream_srv.c b/src/stream_srv.c
index dbf8aed..ff38756 100644
--- a/src/stream_srv.c
+++ b/src/stream_srv.c
@@ -752,9 +752,13 @@ struct osmo_stream_srv *
osmo_stream_srv_create2(void *ctx, struct osmo_stream_srv_link *link, int fd, void *data)
{
struct osmo_stream_srv *conn;
+ enum osmo_io_fd_mode iofd_mode = OSMO_IO_FD_MODE_READ_WRITE;
OSMO_ASSERT(link);
+ if (link->proto == IPPROTO_SCTP)
+ iofd_mode = OSMO_IO_FD_MODE_SCTP_RECVMSG_SEND;
+
conn = talloc_zero(ctx, struct osmo_stream_srv);
if (conn == NULL)
return NULL;
@@ -764,8 +768,7 @@ osmo_stream_srv_create2(void *ctx, struct osmo_stream_srv_link *link, int fd, vo
osmo_sock_get_name_buf(conn->sockname, sizeof(conn->sockname), fd);
- conn->iofd = osmo_iofd_setup(conn, fd, conn->sockname,
- OSMO_IO_FD_MODE_READ_WRITE, &srv_ioops, conn);
+ conn->iofd = osmo_iofd_setup(conn, fd, conn->sockname, iofd_mode, &srv_ioops, conn);
if (!conn->iofd) {
talloc_free(conn);
return NULL;
@@ -951,7 +954,10 @@ void osmo_stream_srv_send(struct osmo_stream_srv *conn, struct msgb *msg)
osmo_fd_write_enable(&conn->ofd);
break;
case OSMO_STREAM_MODE_OSMO_IO:
- osmo_iofd_write_msgb(conn->iofd, msg);
+ if (conn->srv->proto == IPPROTO_SCTP)
+ osmo_iofd_sctp_send_msgb(conn->iofd, msg, MSG_NOSIGNAL);
+ else
+ osmo_iofd_write_msgb(conn->iofd, msg);
break;
default:
OSMO_ASSERT(false);