diff options
author | Harald Welte <laforge@osmocom.org> | 2023-11-18 20:11:47 +0100 |
---|---|---|
committer | Harald Welte <laforge@osmocom.org> | 2024-02-08 12:31:49 +0100 |
commit | 960af680a6a2f89f73305e588baf0c36af10f888 (patch) | |
tree | 13314d35e93c9e3bae62ba468866cb595bad7189 | |
parent | 96e26d5539423b217c17dcaba5859ade805e5bb3 (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-RELEASE | 3 | ||||
-rw-r--r-- | src/stream_cli.c | 13 | ||||
-rw-r--r-- | src/stream_srv.c | 12 |
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); |