osmo_io: Add iofd_handle_recv()

Handle msg reception in a common function that can be called from the
different backends.

Change-Id: Ifc407d446805f885d37767f421ff710cb276a01f
diff --git a/src/core/osmo_io.c b/src/core/osmo_io.c
index db1b5ad..5fed19e 100644
--- a/src/core/osmo_io.c
+++ b/src/core/osmo_io.c
@@ -302,6 +302,22 @@
 	iofd->pending = pending;
 }
 
+void iofd_handle_recv(struct osmo_io_fd *iofd, struct msgb *msg, int rc, struct iofd_msghdr *hdr)
+{
+	switch (iofd->mode) {
+	case OSMO_IO_FD_MODE_READ_WRITE:
+		iofd_handle_segmented_read(iofd, msg, rc);
+		break;
+	case OSMO_IO_FD_MODE_RECVFROM_SENDTO:
+		iofd->io_ops.recvfrom_cb(iofd, rc, msg, &hdr->osa);
+		break;
+	case OSMO_IO_FD_MODE_SCTP_RECVMSG_SENDMSG:
+		/* TODO Implement */
+		OSMO_ASSERT(false);
+		break;
+	}
+}
+
 /* Public functions */
 
 /*! Send a message through a connected socket.
diff --git a/src/core/osmo_io_internal.h b/src/core/osmo_io_internal.h
index d45b161..0f0465d 100644
--- a/src/core/osmo_io_internal.h
+++ b/src/core/osmo_io_internal.h
@@ -133,6 +133,7 @@
 struct msgb *iofd_msgb_pending(struct osmo_io_fd *iofd);
 struct msgb *iofd_msgb_pending_or_alloc(struct osmo_io_fd *iofd);
 
+void iofd_handle_recv(struct osmo_io_fd *iofd, struct msgb *msg, int rc, struct iofd_msghdr *msghdr);
 void iofd_handle_segmented_read(struct osmo_io_fd *iofd, struct msgb *msg, int rc);
 
 int iofd_txqueue_enqueue(struct osmo_io_fd *iofd, struct iofd_msghdr *msghdr);
diff --git a/src/core/osmo_io_poll.c b/src/core/osmo_io_poll.c
index 77a741a..c230188 100644
--- a/src/core/osmo_io_poll.c
+++ b/src/core/osmo_io_poll.c
@@ -67,18 +67,7 @@
 		if (rc > 0)
 			msgb_put(msg, rc);
 
-		switch (iofd->mode) {
-		case OSMO_IO_FD_MODE_READ_WRITE:
-			iofd_handle_segmented_read(iofd, msg, rc);
-			break;
-		case OSMO_IO_FD_MODE_RECVFROM_SENDTO:
-			iofd->io_ops.recvfrom_cb(iofd, rc, msg, &hdr.osa);
-			break;
-		case OSMO_IO_FD_MODE_SCTP_RECVMSG_SENDMSG:
-			/* TODO Implement */
-			OSMO_ASSERT(false);
-			break;
-		}
+		iofd_handle_recv(iofd, msg, rc, &hdr);
 	}
 
 	if (IOFD_FLAG_ISSET(iofd, IOFD_FLAG_CLOSED))