diff options
author | Daniel Willmann <dwillmann@sysmocom.de> | 2023-05-17 17:08:10 +0200 |
---|---|---|
committer | daniel <dwillmann@sysmocom.de> | 2023-05-19 12:50:21 +0000 |
commit | cbbd17e3f4e460f410d59cbb1523ae0b25d130d8 (patch) | |
tree | f4ed2975d12fc2c8146e4b24a29ff18dc6ef6c01 | |
parent | d4d03705f90e4a346f21ee2f328348b9ba37a201 (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.c | 3 | ||||
-rw-r--r-- | src/core/osmo_io_poll.c | 8 | ||||
-rw-r--r-- | tests/osmo_io/osmo_io_test.ok | 1 |
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 |