server.h revision d09a64a01a6c807596e9286c93f6c6f30fd2ea26
150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#ifndef FIO_SERVER_H
250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#define FIO_SERVER_H
350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
4132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#include <inttypes.h>
5142575e6579462656a6d0f7c50ec8c35b8a08802Jens Axboe#include <string.h>
689c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe#include <sys/time.h>
7132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
8a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#include "stat.h"
9610a730c79c90298d41cb3138041e83ba9cdb1d2Jens Axboe#include "os/os.h"
10d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe#include "diskutil.h"
11a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
12132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe/*
13132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe * On-wire encoding is little endian
14132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe */
15132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboestruct fio_net_cmd {
16132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint16_t version;	/* protocol version */
17132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint16_t opcode;	/* command opcode */
18132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint32_t flags;		/* modifier flags */
19af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	uint64_t tag;		/* passed back on reply */
20132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint32_t pdu_len;	/* length of post-cmd layload */
21a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
22a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * These must be immediately before the payload, anything before
23a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * these fields are checksummed.
24a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
25fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	uint16_t cmd_crc16;	/* cmd checksum */
26fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	uint16_t pdu_crc16;	/* payload checksum */
27132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint8_t payload[0];	/* payload */
28132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe};
29132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
3089c1707cb512e562b55b56c268f7fad612be6f04Jens Axboestruct fio_net_int_cmd {
3189c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct fio_net_cmd cmd;
3289c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct flist_head list;
3389c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct timeval tv;
3489c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	uint64_t saved_tag;
3589c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe};
3689c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe
37132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeenum {
38af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	FIO_SERVER_VER		= 5,
39132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
405cf6be78129e41703270325edf3346dba7d0036aJens Axboe	FIO_SERVER_MAX_PDU	= 1024,
41132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
42132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	FIO_NET_CMD_QUIT	= 1,
43d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe	FIO_NET_CMD_EXIT	= 2,
44d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe	FIO_NET_CMD_JOB		= 3,
4581179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe	FIO_NET_CMD_JOBLINE	= 4,
4681179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe	FIO_NET_CMD_TEXT	= 5,
4781179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe	FIO_NET_CMD_TS		= 6,
4881179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe	FIO_NET_CMD_GS		= 7,
49af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	FIO_NET_CMD_SEND_ETA	= 8,
50af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	FIO_NET_CMD_ETA		= 9,
51af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	FIO_NET_CMD_PROBE	= 10,
52af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	FIO_NET_CMD_START	= 11,
53af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	FIO_NET_CMD_STOP	= 12,
54d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	FIO_NET_CMD_DU		= 13,
55d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	FIO_NET_CMD_NR		= 14,
56794d69ca97738736844ee6a6da37f1ef686578cbJens Axboe
57d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe	FIO_NET_CMD_F_MORE	= 1UL << 0,
58fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe
59fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	/* crc does not include the crc fields */
60fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	FIO_NET_CMD_CRC_SZ	= sizeof(struct fio_net_cmd) -
61fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe					2 * sizeof(uint16_t),
6289c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe
6389c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	FIO_NET_CLIENT_TIMEOUT	= 5000,
64132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe};
65132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
66a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct cmd_ts_pdu {
67a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	struct thread_stat ts;
68a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	struct group_run_stats rs;
69a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe};
70a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
71d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboestruct cmd_du_pdu {
72d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	struct disk_util_stat dus;
73d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	struct disk_util_agg agg;
74d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe};
75d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe
76c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboestruct cmd_probe_pdu {
77c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t hostname[64];
786eb2479194603184f393057ea10326643edc7169Jens Axboe	uint8_t bigendian;
79c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t fio_major;
80c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t fio_minor;
81c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t fio_patch;
82cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe	uint8_t os;
83cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe	uint8_t arch;
8438fdef226f1a1fa053ab53005abbc184143bff65Jens Axboe	uint8_t bpp;
85c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe};
86c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe
87fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboestruct cmd_single_line_pdu {
88fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint16_t len;
89fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint8_t text[0];
90fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe};
91fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe
9281179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboestruct cmd_line_pdu {
93fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint16_t lines;
94fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	struct cmd_single_line_pdu options[0];
9581179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe};
9681179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe
97402668f3e05259bfc135fc097136428feda01006Jens Axboeextern int fio_start_server(char *);
9813755d946d034eb7395a818db7ace2c9cb60b4cbJens Axboeextern int fio_server_text_output(const char *, size_t);
99142575e6579462656a6d0f7c50ec8c35b8a08802Jens Axboeextern int fio_server_log(const char *format, ...);
100af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboeextern int fio_net_send_cmd(int, uint16_t, const void *, off_t, uint64_t);
10189c1707cb512e562b55b56c268f7fad612be6f04Jens Axboeextern int fio_net_send_simple_cmd(int, uint16_t, uint64_t, struct flist_head *);
102bebe639808147d587bbe776566d390b9ff98773fJens Axboeextern void fio_server_set_arg(const char *);
103bebe639808147d587bbe776566d390b9ff98773fJens Axboeextern int fio_server_parse_string(const char *, char **, int *, int *, struct in_addr *);
10489c1707cb512e562b55b56c268f7fad612be6f04Jens Axboeextern const char *fio_server_op(unsigned int);
1057b8216842eb888ff626f616c2770a2548b0b0bf9Jens Axboeextern void fio_server_got_signal(int);
106a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
107a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct thread_stat;
108a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct group_run_stats;
109a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_ts(struct thread_stat *, struct group_run_stats *);
110a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_gs(struct group_run_stats *);
111d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboeextern void fio_server_send_du(void);
112cc0df00ad5076d4adbc439899f24d9b0db26075dJens Axboeextern void fio_server_idle_loop(void);
113132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
114a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboeextern int fio_clients_connect(void);
115a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboeextern int fio_clients_send_ini(const char *);
11637db14feece08eb6e43de87c404180650ed5aa6fJens Axboeextern int fio_handle_clients(void);
117bebe639808147d587bbe776566d390b9ff98773fJens Axboeextern int fio_client_add(const char *, void **);
118fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboeextern void fio_client_add_cmd_option(void *, const char *);
119132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
120132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_recv_data(int sk, void *p, unsigned int len);
121132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_send_data(int sk, const void *p, unsigned int len);
122132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern void fio_net_cmd_crc(struct fio_net_cmd *);
123e951bdc47d094d43d6f41de95c6af191b8346459Jens Axboeextern struct fio_net_cmd *fio_net_recv_cmd(int sk);
124132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
125009b1be41b32bf7e32b441c6a22e3ae628ec9b89Jens Axboeextern int exit_backend;
126132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_net_port;
127132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
1284d8f87806db144552baea60d9b59e9becffe5925Jens Axboestatic inline void fio_init_net_cmd(struct fio_net_cmd *cmd, uint16_t opcode,
129af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe				    const void *pdu, uint32_t pdu_len,
130af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe				    uint64_t tag)
131132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe{
132132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	memset(cmd, 0, sizeof(*cmd));
1334d8f87806db144552baea60d9b59e9becffe5925Jens Axboe
134fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	cmd->version	= __cpu_to_le16(FIO_SERVER_VER);
13582fa6b21d98da1341a54f415e43940213b39f18bJens Axboe	cmd->opcode	= cpu_to_le16(opcode);
136af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	cmd->tag	= cpu_to_le64(tag);
1374d8f87806db144552baea60d9b59e9becffe5925Jens Axboe
1384d8f87806db144552baea60d9b59e9becffe5925Jens Axboe	if (pdu) {
1394d8f87806db144552baea60d9b59e9becffe5925Jens Axboe		cmd->pdu_len	= cpu_to_le32(pdu_len);
1404d8f87806db144552baea60d9b59e9becffe5925Jens Axboe		memcpy(&cmd->payload, pdu, pdu_len);
1414d8f87806db144552baea60d9b59e9becffe5925Jens Axboe	}
142132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe}
14350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
14450d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#endif
145