aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDaniel Willmann <dwillmann@sysmocom.de>2023-05-17 17:08:10 +0200
committerdaniel <dwillmann@sysmocom.de>2023-05-19 12:50:21 +0000
commitcbbd17e3f4e460f410d59cbb1523ae0b25d130d8 (patch)
treef4ed2975d12fc2c8146e4b24a29ff18dc6ef6c01
parentd4d03705f90e4a346f21ee2f328348b9ba37a201 (diff)
osmo_io: Support detecting non-blocking connect()arehbein/osmo_io_ipa
libosmo-netif does a non blocking connect(), which as per definition of the socket API is signalled from the OS to the user by marking the file descriptor writable. osmo_io needs to signal this somehow. Previously osmo_io would only call the write_cb if actual data has been sent. This patch changes the behaviour so that calling osmo_iofd_write_enable() will call write_cb() on a writable socket even if the write queue is empty. Change-Id: I893cbc3becd5e125f2f06b3654578aed0aacadf3
-rw-r--r--src/core/osmo_io.c3
-rw-r--r--src/core/osmo_io_poll.c8
-rw-r--r--tests/osmo_io/osmo_io_test.ok1
3 files changed, 10 insertions, 2 deletions
diff --git a/src/core/osmo_io.c b/src/core/osmo_io.c
index 857644d2..9960fb41 100644
--- a/src/core/osmo_io.c
+++ b/src/core/osmo_io.c
@@ -395,8 +395,7 @@ void osmo_iofd_read_disable(struct osmo_io_fd *iofd)
void osmo_iofd_write_enable(struct osmo_io_fd *iofd)
{
iofd->write_enabled = true;
- if (iofd->tx_queue.current_length > 0)
- osmo_iofd_ops.write_enable(iofd);
+ osmo_iofd_ops.write_enable(iofd);
}
/*! Disable writing to this iofd
diff --git a/src/core/osmo_io_poll.c b/src/core/osmo_io_poll.c
index bc203c0c..dd86f29b 100644
--- a/src/core/osmo_io_poll.c
+++ b/src/core/osmo_io_poll.c
@@ -110,7 +110,15 @@ static void iofd_poll_ofd_cb_recvmsg_sendmsg(struct osmo_fd *ofd, unsigned int w
talloc_free(msghdr);
msgb_free(msg);
+ } else {
+ if (iofd->mode == OSMO_IO_FD_MODE_READ_WRITE)
+ /* Socket is writable, but we have no data to send. A non-blocking/async
+ connect() is signalled this way. */
+ iofd->io_ops.write_cb(iofd, 0, NULL);
+ if (osmo_iofd_txqueue_len(iofd) == 0)
+ iofd_poll_ops.write_disable(iofd);
}
+
}
}
diff --git a/tests/osmo_io/osmo_io_test.ok b/tests/osmo_io/osmo_io_test.ok
index 745e36a8..43e5464f 100644
--- a/tests/osmo_io/osmo_io_test.ok
+++ b/tests/osmo_io/osmo_io_test.ok
@@ -1,5 +1,6 @@
Running test_connected
ep1: write() returned rc=16
+ep2: write() returned rc=0
ep2: read() msg with len=16
01 02 03 04 05 06 07 08 09 0a 0b 0c 0d 0e 0f 10
Running test_unconnected