net.c revision 2fc2698113c087352c1851bf5ebfcad6adb53932
1ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe/*
2ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * Transfer data over the net. Pretty basic setup, will only support
3ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe * 1 file per thread/job.
4ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe */
5ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <stdio.h>
6ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <stdlib.h>
7ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <unistd.h>
8ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <errno.h>
9ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <assert.h>
10ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <netinet/in.h>
11ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <arpa/inet.h>
12ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include <netdb.h>
13ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
14ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include "../fio.h"
15ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe#include "../os.h"
16ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
17ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestruct net_data {
18ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	int send_to_net;
19ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct io_u *last_io_u;
20ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe};
21ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
22ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_getevents(struct thread_data *td, int fio_unused min,
23ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe				int max, struct timespec fio_unused *t)
24ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
25ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	assert(max <= 1);
26ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
27ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	/*
28ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	 * we can only have one finished io_u for sync io, since the depth
29ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	 * is always 1
30ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	 */
31ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (list_empty(&td->io_u_busylist))
32ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 0;
33ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
34ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 1;
35ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
36ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
37ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic struct io_u *fio_netio_event(struct thread_data *td, int event)
38ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
39ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct net_data *nd = td->io_ops->data;
40ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
41ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	assert(event == 0);
42ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
43ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return nd->last_io_u;
44ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
45ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
46ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_prep(struct thread_data *td, struct io_u *io_u)
47ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
48ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct net_data *nd = td->io_ops->data;
49ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct fio_file *f = io_u->file;
50ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
51ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (nd->send_to_net) {
52ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		if (io_u->ddir == DDIR_READ) {
53ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			td_verror(td, EINVAL);
54ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			return 1;
55ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		}
56ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	} else {
57ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		if (io_u->ddir == DDIR_WRITE) {
58ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			td_verror(td, EINVAL);
59ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			return 1;
60ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		}
61ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
62ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
63ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (io_u->ddir == DDIR_SYNC)
64ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 0;
65ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (io_u->offset == f->last_completed_pos)
66ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 0;
67ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
68e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	/*
69e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 * If offset is different from last end position, it's a seek.
70e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 * As network io is purely sequential, we don't allow seeks.
71e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 */
72ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	td_verror(td, EINVAL);
73ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 1;
74ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
75ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
76ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_queue(struct thread_data *td, struct io_u *io_u)
77ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
78ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct net_data *nd = td->io_ops->data;
79ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct fio_file *f = io_u->file;
80ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	unsigned int ret = 0;
81ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
82ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (io_u->ddir == DDIR_WRITE)
83ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		ret = write(f->fd, io_u->buf, io_u->buflen);
84ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	else if (io_u->ddir == DDIR_READ)
85ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		ret = read(f->fd, io_u->buf, io_u->buflen);
86ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
87ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (ret != io_u->buflen) {
88ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		if (ret > 0) {
89ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			io_u->resid = io_u->buflen - ret;
90ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			io_u->error = EIO;
91ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		} else
92ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			io_u->error = errno;
93ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
94ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
95ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (!io_u->error)
96ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		nd->last_io_u = io_u;
97ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
98ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return io_u->error;
99ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
100ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
101ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_setup_connect(struct thread_data *td, const char *host,
102e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe				   unsigned short port)
103ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
104ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct sockaddr_in addr;
105ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct fio_file *f;
1062fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	int i;
107ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
108ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	memset(&addr, 0, sizeof(addr));
109ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	addr.sin_family = AF_INET;
110e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	addr.sin_port = htons(port);
111ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
112ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (inet_aton(host, &addr.sin_addr) != 1) {
113ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		struct hostent *hent = gethostbyname(host);
114ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
115ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		if (!hent) {
116ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			td_vmsg(td, errno, "gethostbyname");
117ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe			return 1;
118ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		}
119ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
120ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		memcpy(&addr.sin_addr, hent->h_addr, 4);
121ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
122ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1232fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	for_each_file(td, f, i) {
1242fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		f->fd = socket(AF_INET, SOCK_STREAM, 0);
1252fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		if (f->fd < 0) {
1262fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			td_vmsg(td, errno, "socket");
1272fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			return 1;
1282fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		}
129ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1302fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		if (connect(f->fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
1312fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			td_vmsg(td, errno, "connect");
1322fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			return 1;
1332fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		}
134ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
135ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
136ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 0;
137ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
138ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
139ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
140e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboestatic int fio_netio_setup_listen(struct thread_data *td, unsigned short port)
141ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
142ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct sockaddr_in addr;
143ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	socklen_t socklen;
1442fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	struct fio_file *f;
1452fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	int fd, opt, i;
146ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
147ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	fd = socket(AF_INET, SOCK_STREAM, 0);
148ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (fd < 0) {
149ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		td_vmsg(td, errno, "socket");
150ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
151ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
152ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
153ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	opt = 1;
154ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt)) < 0) {
155ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		td_vmsg(td, errno, "setsockopt");
156ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
157ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
158ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
159ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	memset(&addr, 0, sizeof(addr));
160ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	addr.sin_family = AF_INET;
161ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	addr.sin_addr.s_addr = htonl(INADDR_ANY);
162e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	addr.sin_port = htons(port);
163ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
164ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (bind(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
165ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		td_vmsg(td, errno, "bind");
166ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
167ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
168ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (listen(fd, 1) < 0) {
169ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		td_vmsg(td, errno, "listen");
170ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
171ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
172ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
1732fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	fprintf(f_out, "fio: waiting for %u connections\n", td->nr_files);
1742fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe
175ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	socklen = sizeof(addr);
1762fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	for_each_file(td, f, i) {
1772fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		f->fd = accept(fd, (struct sockaddr *) &addr, &socklen);
1782fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		if (f->fd < 0) {
1792fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			td_vmsg(td, errno, "accept");
1802fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe			return 1;
1812fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		}
182ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
183ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
184ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 0;
185ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
186ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
187ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_setup(struct thread_data *td)
188ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
189e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	char host[64], buf[128];
190ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct net_data *nd;
191e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	unsigned short port;
1922fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	struct fio_file *f;
193ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	char *sep;
1942fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	int ret, i;
195ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
196ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	/*
197ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	 * work around for late init call
198ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	 */
199ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (td->io_ops->init(td))
200ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
201ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
202ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	nd = td->io_ops->data;
203ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
204ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (td->iomix) {
205ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		log_err("fio: network connections must be read OR write\n");
206ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
207ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
208ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
209ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	strcpy(buf, td->filename);
210ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
211ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	sep = strchr(buf, ':');
212ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (!sep) {
213ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		log_err("fio: bad network host:port <<%s>>\n", td->filename);
214ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 1;
215ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
216ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
217ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	*sep = '\0';
218ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	sep++;
219ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	strcpy(host, buf);
220e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	port = atoi(sep);
221ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
222ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (td->ddir == READ) {
223ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		nd->send_to_net = 0;
224ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		ret = fio_netio_setup_listen(td, port);
225ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	} else {
226ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		nd->send_to_net = 1;
227ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		ret = fio_netio_setup_connect(td, host, port);
228ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
229ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
2302fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	if (ret)
2312fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		return ret;
2322fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe
2332fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	td->io_size = td->total_file_size;
2342fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	td->total_io_size = td->io_size;
2352fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe
2362fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	for_each_file(td, f, i) {
2372fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		f->file_size = td->total_file_size / td->nr_files;
2382fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe		f->real_file_size = f->file_size;
239ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
240ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
2412fc2698113c087352c1851bf5ebfcad6adb53932Jens Axboe	return 0;
242ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
243ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
244ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_netio_cleanup(struct thread_data *td)
245ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
246ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (td->io_ops->data) {
247ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		free(td->io_ops->data);
248ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		td->io_ops->data = NULL;
249ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	}
250ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
251ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
252ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic int fio_netio_init(struct thread_data *td)
253ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
254ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	struct net_data *nd;
255ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
256e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	/*
257e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 * Hack to work-around the ->setup() function calling init on its
258e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 * own, since it needs ->io_ops->data to be set up.
259e01547d2b8bf79c3abe14e03c72398cf8998eb1eJens Axboe	 */
260ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	if (td->io_ops->data)
261ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe		return 0;
262ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
263ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	nd  = malloc(sizeof(*nd));
264ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	nd->last_io_u = NULL;
265ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	td->io_ops->data = nd;
266ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	return 0;
267ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
268ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
269ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic struct ioengine_ops ioengine = {
270ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.name		= "net",
271ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.version	= FIO_IOOPS_VERSION,
272ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.init		= fio_netio_init,
273ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.prep		= fio_netio_prep,
274ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.queue		= fio_netio_queue,
275ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.getevents	= fio_netio_getevents,
276ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.event		= fio_netio_event,
277ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.cleanup	= fio_netio_cleanup,
278ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.setup		= fio_netio_setup,
279ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	.flags		= FIO_SYNCIO | FIO_NETIO,
280ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe};
281ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
282ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_init fio_netio_register(void)
283ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
284ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	register_ioengine(&ioengine);
285ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
286ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe
287ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboestatic void fio_exit fio_netio_unregister(void)
288ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe{
289ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe	unregister_ioengine(&ioengine);
290ed92ac0ce9ce1cc64697272d307d4fa7d18ed64cJens Axboe}
291