net.c revision 413dd459a7710ba421061e840dd9ac3161c70f20
1ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe/*
2d4f12dd05cfb2e8e7a72604cd870e10f2394914eJens Axboe * Transfer data over the net.
3ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe */
4ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <stdio.h>
5ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <stdlib.h>
6ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <unistd.h>
7ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <errno.h>
8ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <assert.h>
9ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <netinet/in.h>
10ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <arpa/inet.h>
11ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <netdb.h>
125fdd124a3b811993542825847f207587d5f4661eJens Axboe#include <sys/poll.h>
13ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
14ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include "../fio.h"
15ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include "../os.h"
16ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe#define send_to_net(td)	((td)->io_ops->priv)
18ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
19ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_prep(struct thread_data *td, struct io_u *io_u)
20ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
21ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct fio_file *f = io_u->file;
22ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
237a6499dada619928267d26b4629b0c8623dc423aJens Axboe	/*
247a6499dada619928267d26b4629b0c8623dc423aJens Axboe	 * Make sure we don't see spurious reads to a receiver, and vice versa
257a6499dada619928267d26b4629b0c8623dc423aJens Axboe	 */
2636167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe	if ((send_to_net(td) && io_u->ddir == DDIR_READ) ||
2736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe	    (!send_to_net(td) && io_u->ddir == DDIR_WRITE)) {
28e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, EINVAL, "bad direction");
297a6499dada619928267d26b4629b0c8623dc423aJens Axboe		return 1;
30ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
317a6499dada619928267d26b4629b0c8623dc423aJens Axboe
32ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (io_u->ddir == DDIR_SYNC)
33ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 0;
34ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (io_u->offset == f->last_completed_pos)
35ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 0;
36ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
37e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	/*
38e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 * If offset is different from last end position, it's a seek.
39e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 * As network io is purely sequential, we don't allow seeks.
40e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 */
41e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe	td_verror(td, EINVAL, "cannot seek");
42ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 1;
43ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
44ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
45ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_queue(struct thread_data *td, struct io_u *io_u)
46ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
47ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct fio_file *f = io_u->file;
48d4f12dd05cfb2e8e7a72604cd870e10f2394914eJens Axboe	int ret, flags = 0;
497a6499dada619928267d26b4629b0c8623dc423aJens Axboe
507a6499dada619928267d26b4629b0c8623dc423aJens Axboe	if (io_u->ddir == DDIR_WRITE) {
517a6499dada619928267d26b4629b0c8623dc423aJens Axboe		/*
527a6499dada619928267d26b4629b0c8623dc423aJens Axboe		 * if we are going to write more, set MSG_MORE
537a6499dada619928267d26b4629b0c8623dc423aJens Axboe		 */
547a6499dada619928267d26b4629b0c8623dc423aJens Axboe		if (td->this_io_bytes[DDIR_WRITE] + io_u->xfer_buflen <
557a6499dada619928267d26b4629b0c8623dc423aJens Axboe		    td->io_size)
567a6499dada619928267d26b4629b0c8623dc423aJens Axboe			flags = MSG_MORE;
57ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
587a6499dada619928267d26b4629b0c8623dc423aJens Axboe		ret = send(f->fd, io_u->xfer_buf, io_u->xfer_buflen, flags);
59d4f12dd05cfb2e8e7a72604cd870e10f2394914eJens Axboe	} else if (io_u->ddir == DDIR_READ) {
60d4f12dd05cfb2e8e7a72604cd870e10f2394914eJens Axboe		flags = MSG_WAITALL;
61d4f12dd05cfb2e8e7a72604cd870e10f2394914eJens Axboe		ret = recv(f->fd, io_u->xfer_buf, io_u->xfer_buflen, flags);
62d4f12dd05cfb2e8e7a72604cd870e10f2394914eJens Axboe	} else
637a6499dada619928267d26b4629b0c8623dc423aJens Axboe		ret = 0;	/* must be a SYNC */
64ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
65cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe	if (ret != (int) io_u->xfer_buflen) {
6622819ec237297fc39435ed566bee01a4225bfb39Jens Axboe		if (ret >= 0) {
67cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe			io_u->resid = io_u->xfer_buflen - ret;
68cec6b55da1c282b5b91ad346c7804171fccf151eJens Axboe			io_u->error = 0;
6936167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe			return FIO_Q_COMPLETED;
70ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		} else
71ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			io_u->error = errno;
72ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
73ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
7436167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe	if (io_u->error)
75e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, io_u->error, "xfer");
76ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
7736167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe	return FIO_Q_COMPLETED;
78ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
79ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
80ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_setup_connect(struct thread_data *td, const char *host,
81e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe				   unsigned short port)
82ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
83ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct sockaddr_in addr;
84ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct fio_file *f;
852fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	int i;
86ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
87ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	memset(&addr, 0, sizeof(addr));
88ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	addr.sin_family = AF_INET;
89e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	addr.sin_port = htons(port);
90ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
91ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (inet_aton(host, &addr.sin_addr) != 1) {
927a6499dada619928267d26b4629b0c8623dc423aJens Axboe		struct hostent *hent;
93ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
947a6499dada619928267d26b4629b0c8623dc423aJens Axboe		hent = gethostbyname(host);
95ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		if (!hent) {
96e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe			td_verror(td, errno, "gethostbyname");
97ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			return 1;
98ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		}
99ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
100ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		memcpy(&addr.sin_addr, hent->h_addr, 4);
101ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
102ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1032fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	for_each_file(td, f, i) {
1046bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe		f->fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1052fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		if (f->fd < 0) {
106e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe			td_verror(td, errno, "socket");
1072fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			return 1;
1082fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		}
109ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1102fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		if (connect(f->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
111e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe			td_verror(td, errno, "connect");
1122fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			return 1;
1132fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		}
114ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
115ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
116ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 0;
117ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
118ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
119ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1205fdd124a3b811993542825847f207587d5f4661eJens Axboestatic int fio_netio_accept_connections(struct thread_data *td, int fd,
1215fdd124a3b811993542825847f207587d5f4661eJens Axboe					struct sockaddr_in *addr)
1225fdd124a3b811993542825847f207587d5f4661eJens Axboe{
1235fdd124a3b811993542825847f207587d5f4661eJens Axboe	socklen_t socklen = sizeof(*addr);
1245fdd124a3b811993542825847f207587d5f4661eJens Axboe	unsigned int accepts = 0;
1255fdd124a3b811993542825847f207587d5f4661eJens Axboe	struct pollfd pfd;
1265fdd124a3b811993542825847f207587d5f4661eJens Axboe
1275fdd124a3b811993542825847f207587d5f4661eJens Axboe	fprintf(f_out, "fio: waiting for %u connections\n", td->nr_files);
1285fdd124a3b811993542825847f207587d5f4661eJens Axboe
1295fdd124a3b811993542825847f207587d5f4661eJens Axboe	/*
1305fdd124a3b811993542825847f207587d5f4661eJens Axboe	 * Accept loop. poll for incoming events, accept them. Repeat until we
1315fdd124a3b811993542825847f207587d5f4661eJens Axboe	 * have all connections.
1325fdd124a3b811993542825847f207587d5f4661eJens Axboe	 */
1335fdd124a3b811993542825847f207587d5f4661eJens Axboe	while (!td->terminate && accepts < td->nr_files) {
1345fdd124a3b811993542825847f207587d5f4661eJens Axboe		struct fio_file *f;
1355fdd124a3b811993542825847f207587d5f4661eJens Axboe		int ret, i;
1365fdd124a3b811993542825847f207587d5f4661eJens Axboe
1375fdd124a3b811993542825847f207587d5f4661eJens Axboe		pfd.fd = fd;
1385fdd124a3b811993542825847f207587d5f4661eJens Axboe		pfd.events = POLLIN;
1395fdd124a3b811993542825847f207587d5f4661eJens Axboe
1405fdd124a3b811993542825847f207587d5f4661eJens Axboe		ret = poll(&pfd, 1, -1);
1415fdd124a3b811993542825847f207587d5f4661eJens Axboe		if (ret < 0) {
1425fdd124a3b811993542825847f207587d5f4661eJens Axboe			if (errno == EINTR)
1435fdd124a3b811993542825847f207587d5f4661eJens Axboe				continue;
1445fdd124a3b811993542825847f207587d5f4661eJens Axboe
145e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe			td_verror(td, errno, "poll");
1465fdd124a3b811993542825847f207587d5f4661eJens Axboe			break;
1475fdd124a3b811993542825847f207587d5f4661eJens Axboe		} else if (!ret)
1485fdd124a3b811993542825847f207587d5f4661eJens Axboe			continue;
1495fdd124a3b811993542825847f207587d5f4661eJens Axboe
1500c09442b26216aed16f758712f744a2c54726cdbJens Axboe		/*
1510c09442b26216aed16f758712f744a2c54726cdbJens Axboe		 * should be impossible
1520c09442b26216aed16f758712f744a2c54726cdbJens Axboe		 */
1530c09442b26216aed16f758712f744a2c54726cdbJens Axboe		if (!(pfd.revents & POLLIN))
1540c09442b26216aed16f758712f744a2c54726cdbJens Axboe			continue;
1550c09442b26216aed16f758712f744a2c54726cdbJens Axboe
1565fdd124a3b811993542825847f207587d5f4661eJens Axboe		for_each_file(td, f, i) {
1575fdd124a3b811993542825847f207587d5f4661eJens Axboe			if (f->fd != -1)
1585fdd124a3b811993542825847f207587d5f4661eJens Axboe				continue;
1595fdd124a3b811993542825847f207587d5f4661eJens Axboe
1605fdd124a3b811993542825847f207587d5f4661eJens Axboe			f->fd = accept(fd, (struct sockaddr *) addr, &socklen);
1615fdd124a3b811993542825847f207587d5f4661eJens Axboe			if (f->fd < 0) {
162e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe				td_verror(td, errno, "accept");
1635fdd124a3b811993542825847f207587d5f4661eJens Axboe				return 1;
1645fdd124a3b811993542825847f207587d5f4661eJens Axboe			}
1655fdd124a3b811993542825847f207587d5f4661eJens Axboe			accepts++;
1665fdd124a3b811993542825847f207587d5f4661eJens Axboe			break;
1675fdd124a3b811993542825847f207587d5f4661eJens Axboe		}
1685fdd124a3b811993542825847f207587d5f4661eJens Axboe	}
1695fdd124a3b811993542825847f207587d5f4661eJens Axboe
1705fdd124a3b811993542825847f207587d5f4661eJens Axboe	return 0;
1715fdd124a3b811993542825847f207587d5f4661eJens Axboe}
1725fdd124a3b811993542825847f207587d5f4661eJens Axboe
173e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboestatic int fio_netio_setup_listen(struct thread_data *td, unsigned short port)
174ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
175ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct sockaddr_in addr;
1765fdd124a3b811993542825847f207587d5f4661eJens Axboe	int fd, opt;
177ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1786bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe	fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
179ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (fd < 0) {
180e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "socket");
181ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
182ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
183ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
184ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	opt = 1;
185ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
186e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "setsockopt");
187ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
188ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
1896bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe#ifdef SO_REUSEPORT
1906bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe	if (setsockopt(fd, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt)) < 0) {
191e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "setsockopt");
1926bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe		return 1;
1936bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe	}
1946bedbfafcffbc7202b5bb621ac5886aafdc0f362Jens Axboe#endif
195ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
196ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	memset(&addr, 0, sizeof(addr));
197ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	addr.sin_family = AF_INET;
198ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	addr.sin_addr.s_addr = htonl(INADDR_ANY);
199e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	addr.sin_port = htons(port);
200ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
201ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
202e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "bind");
203ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
204ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
205ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (listen(fd, 1) < 0) {
206e1161c325f7866bae879e686d1c673ca32ab09aeJens Axboe		td_verror(td, errno, "listen");
207ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
208ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
209ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
2105fdd124a3b811993542825847f207587d5f4661eJens Axboe	return fio_netio_accept_connections(td, fd, &addr);
211ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
212ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
213ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_setup(struct thread_data *td)
214ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
215e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	char host[64], buf[128];
216e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	unsigned short port;
2172fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	struct fio_file *f;
218ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	char *sep;
2192fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	int ret, i;
220ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
2217a6499dada619928267d26b4629b0c8623dc423aJens Axboe	if (!td->total_file_size) {
2227a6499dada619928267d26b4629b0c8623dc423aJens Axboe		log_err("fio: need size= set\n");
2237a6499dada619928267d26b4629b0c8623dc423aJens Axboe		return 1;
2247a6499dada619928267d26b4629b0c8623dc423aJens Axboe	}
2257a6499dada619928267d26b4629b0c8623dc423aJens Axboe
226413dd459a7710ba421061e840dd9ac3161c70f20Jens Axboe	if (td_rw(td)) {
227ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		log_err("fio: network connections must be read OR write\n");
228ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
229ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
230ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
231ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	strcpy(buf, td->filename);
232ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
233ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	sep = strchr(buf, ':');
234ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (!sep) {
235ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		log_err("fio: bad network host:port <<%s>>\n", td->filename);
236ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
237ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
238ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
239ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	*sep = '\0';
240ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	sep++;
241ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	strcpy(host, buf);
242e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	port = atoi(sep);
243ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
244413dd459a7710ba421061e840dd9ac3161c70f20Jens Axboe	if (td_read(td)) {
24536167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		send_to_net(td) = 0;
246ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		ret = fio_netio_setup_listen(td, port);
247ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	} else {
24836167d82e5f49dee91c6d2cd426068edee90e36fJens Axboe		send_to_net(td) = 1;
249ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		ret = fio_netio_setup_connect(td, host, port);
250ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
251ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
2522fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	if (ret)
2532fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		return ret;
2542fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe
2552fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	td->io_size = td->total_file_size;
2562fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	td->total_io_size = td->io_size;
2572fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe
2582fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	for_each_file(td, f, i) {
2592fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		f->file_size = td->total_file_size / td->nr_files;
2602fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		f->real_file_size = f->file_size;
261ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
262ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
2632fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	return 0;
264ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
265ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
266ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic struct ioengine_ops ioengine = {
267ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.name		= "net",
268ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.version	= FIO_IOOPS_VERSION,
269ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.prep		= fio_netio_prep,
270ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.queue		= fio_netio_queue,
271ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.setup		= fio_netio_setup,
272ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.flags		= FIO_SYNCIO | FIO_NETIO,
273ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe};
274ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
275ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_init fio_netio_register(void)
276ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
277ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	register_ioengine(&ioengine);
278ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
279ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
280ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_exit fio_netio_unregister(void)
281ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
282ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	unregister_ioengine(&ioengine);
283ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
284