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