+ return bytes;
+
+}
+
+/*
+ * vmsplice() pipe to io_u buffer
+ */
+static int vmsplice_io_u_out(struct thread_data *td, struct io_u *io_u,
+ unsigned int len)
+{
+ struct netio_data *nd = td->io_ops->data;
+
+ return vmsplice_io_u(io_u, nd->pipes[0], len);
+}
+
+/*
+ * vmsplice() io_u to pipe
+ */
+static int vmsplice_io_u_in(struct thread_data *td, struct io_u *io_u)
+{
+ struct netio_data *nd = td->io_ops->data;
+
+ return vmsplice_io_u(io_u, nd->pipes[1], io_u->xfer_buflen);
+}
+
+/*
+ * splice receive - transfer socket data into a pipe using splice, then map
+ * that pipe data into the io_u using vmsplice.
+ */
+static int fio_netio_splice_in(struct thread_data *td, struct io_u *io_u)
+{
+ int ret;
+
+ ret = splice_in(td, io_u);
+ if (ret > 0)
+ return vmsplice_io_u_out(td, io_u, ret);
+
+ return ret;
+}
+
+/*
+ * splice transmit - map data from the io_u into a pipe by using vmsplice,
+ * then transfer that pipe to a socket using splice.
+ */
+static int fio_netio_splice_out(struct thread_data *td, struct io_u *io_u)
+{
+ int ret;
+
+ ret = vmsplice_io_u_in(td, io_u);
+ if (ret > 0)
+ return splice_out(td, io_u, ret);
+
+ return ret;
+}
+#else
+static int fio_netio_splice_in(struct thread_data *td, struct io_u *io_u)
+{
+ errno = EOPNOTSUPP;
+ return -1;
+}
+
+static int fio_netio_splice_out(struct thread_data *td, struct io_u *io_u)
+{
+ errno = EOPNOTSUPP;
+ return -1;
+}
+#endif
+
+static int fio_netio_send(struct thread_data *td, struct io_u *io_u)
+{
+ int flags = 0;