laforge has submitted this change. ( 
https://gerrit.osmocom.org/c/libosmocore/+/35909?usp=email )

 (

4 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted 
one.
 )Change subject: osmo_io: Move notify_connected function to backend
......................................................................

osmo_io: Move notify_connected function to backend

This relocation is necessary as the backend (osmo_io_fd or
osmo_io_uring) requires a different approach in handling connect
notifications. As a result, a function call has been introduced to
struct iofd_backend_ops.

In a subsequent patch, the process for the osmo_io_uring backend will
be modified to handle SCTP connect notifications using poll/select.

If connect notification is requested using poll/select, the file
descriptior must be registered to osmo_fd, using osmo_fd_register. If
read / write notification is requested by application, the file
descriptior must be registered also. A flag is used prevent calling
osmo_fd_register / osmo_fd_unregister multiple times, which would cause
a crash.

Change-Id: I905ec85210570aff8addadfc9603335d04eb057a
Related: OS#5751
---
M src/core/osmo_io.c
M src/core/osmo_io_internal.h
M src/core/osmo_io_poll.c
M src/core/osmo_io_uring.c
4 files changed, 54 insertions(+), 2 deletions(-)

Approvals:
  laforge: Looks good to me, but someone else must approve
  pespin: Looks good to me, approved
  Jenkins Builder: Verified




diff --git a/src/core/osmo_io.c b/src/core/osmo_io.c
index 9de9e2e..71249cf 100644
--- a/src/core/osmo_io.c
+++ b/src/core/osmo_io.c
@@ -781,7 +781,8 @@
 void osmo_iofd_notify_connected(struct osmo_io_fd *iofd)
 {
        OSMO_ASSERT(iofd->mode == OSMO_IO_FD_MODE_READ_WRITE);
-       osmo_iofd_ops.write_enable(iofd);
+       OSMO_ASSERT(osmo_iofd_ops.notify_connected);
+       osmo_iofd_ops.notify_connected(iofd);
 }


diff --git a/src/core/osmo_io_internal.h b/src/core/osmo_io_internal.h
index e8f4ea2..9c86e05 100644
--- a/src/core/osmo_io_internal.h
+++ b/src/core/osmo_io_internal.h
@@ -31,12 +31,14 @@
        void (*write_disable)(struct osmo_io_fd *iofd);
        void (*read_enable)(struct osmo_io_fd *iofd);
        void (*read_disable)(struct osmo_io_fd *iofd);
+       void (*notify_connected)(struct osmo_io_fd *iofd);
 };

 #define IOFD_FLAG_CLOSED (1<<0)
 #define IOFD_FLAG_IN_CALLBACK (1<<1)
 #define IOFD_FLAG_TO_FREE (1<<2)
 #define IOFD_FLAG_NOTIFY_CONNECTED (1<<3)
+#define IOFD_FLAG_FD_REGISTERED (1<<4)

 #define IOFD_FLAG_SET(iofd, flag) \
        (iofd)->flags |= (flag)
diff --git a/src/core/osmo_io_poll.c b/src/core/osmo_io_poll.c
index d7f80c0..8398a30 100644
--- a/src/core/osmo_io_poll.c
+++ b/src/core/osmo_io_poll.c
@@ -119,20 +119,32 @@
 int iofd_poll_register(struct osmo_io_fd *iofd)
 {
        struct osmo_fd *ofd = &iofd->u.poll.ofd;
+       int rc;
+
+       if (IOFD_FLAG_ISSET(iofd, IOFD_FLAG_FD_REGISTERED))
+               return 0;
        osmo_fd_setup(ofd, iofd->fd, 0, &iofd_poll_ofd_cb_dispatch, iofd, 0);
-       return osmo_fd_register(ofd);
+       rc = osmo_fd_register(ofd);
+       if (!rc)
+               IOFD_FLAG_SET(iofd, IOFD_FLAG_FD_REGISTERED);
+       return rc;
 }

 int iofd_poll_unregister(struct osmo_io_fd *iofd)
 {
        struct osmo_fd *ofd = &iofd->u.poll.ofd;
+
+       if (!IOFD_FLAG_ISSET(iofd, IOFD_FLAG_FD_REGISTERED))
+               return 0;
        osmo_fd_unregister(ofd);
+       IOFD_FLAG_UNSET(iofd, IOFD_FLAG_FD_REGISTERED);

        return 0;
 }

 int iofd_poll_close(struct osmo_io_fd *iofd)
 {
+       iofd_poll_unregister(iofd);
        osmo_fd_close(&iofd->u.poll.ofd);

        return 0;
@@ -158,6 +170,16 @@
        osmo_fd_write_disable(&iofd->u.poll.ofd);
 }

+void iofd_poll_notify_connected(struct osmo_io_fd *iofd)
+{
+       int rc;
+
+       rc = iofd_poll_register(iofd);
+       if (rc < 0)
+               return;
+       osmo_fd_write_enable(&iofd->u.poll.ofd);
+}
+
 const struct iofd_backend_ops iofd_poll_ops = {
        .register_fd = iofd_poll_register,
        .unregister_fd = iofd_poll_unregister,
@@ -166,6 +188,7 @@
        .write_disable = iofd_poll_write_disable,
        .read_enable = iofd_poll_read_enable,
        .read_disable = iofd_poll_read_disable,
+       .notify_connected = iofd_poll_notify_connected,
 };

 #endif /* defined(__linux__) */
diff --git a/src/core/osmo_io_uring.c b/src/core/osmo_io_uring.c
index 1aa17d4..24d1e08 100644
--- a/src/core/osmo_io_uring.c
+++ b/src/core/osmo_io_uring.c
@@ -402,6 +402,7 @@
        .write_disable = iofd_uring_write_disable,
        .read_enable = iofd_uring_read_enable,
        .read_disable = iofd_uring_read_disable,
+       .notify_connected = iofd_uring_write_enable,
 };

 #endif /* defined(__linux__) */

--
To view, visit https://gerrit.osmocom.org/c/libosmocore/+/35909?usp=email
To unsubscribe, or for help writing mail filters, visit 
https://gerrit.osmocom.org/settings

Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: I905ec85210570aff8addadfc9603335d04eb057a
Gerrit-Change-Number: 35909
Gerrit-PatchSet: 6
Gerrit-Owner: jolly <[email protected]>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: daniel <[email protected]>
Gerrit-Reviewer: laforge <[email protected]>
Gerrit-Reviewer: pespin <[email protected]>
Gerrit-MessageType: merged

Reply via email to