server.h revision b9d2f30a214ebd274340f888739be250838d63c2
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>
7811826be429fd6fc5154d9b04ced1cd22bd66758Jens Axboe#include <netinet/in.h>
8132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
9a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#include "stat.h"
10610a730c79c90298d41cb3138041e83ba9cdb1d2Jens Axboe#include "os/os.h"
11d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe#include "diskutil.h"
12a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
135adc2447a8d52322981da4cd364a560bbd9d8351Stephen M. Cameron#define FIO_NET_PORT 8765
145adc2447a8d52322981da4cd364a560bbd9d8351Stephen M. Cameron
15132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe/*
16132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe * On-wire encoding is little endian
17132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe */
18132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboestruct fio_net_cmd {
19132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint16_t version;	/* protocol version */
20132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint16_t opcode;	/* command opcode */
21132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint32_t flags;		/* modifier flags */
22af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	uint64_t tag;		/* passed back on reply */
23132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint32_t pdu_len;	/* length of post-cmd layload */
24a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	/*
25a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * These must be immediately before the payload, anything before
26a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 * these fields are checksummed.
27a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	 */
28fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	uint16_t cmd_crc16;	/* cmd checksum */
29fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	uint16_t pdu_crc16;	/* payload checksum */
30132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	uint8_t payload[0];	/* payload */
31132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe};
32132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
3389c1707cb512e562b55b56c268f7fad612be6f04Jens Axboestruct fio_net_int_cmd {
3489c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct fio_net_cmd cmd;
3589c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct flist_head list;
3689c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct timeval tv;
3789c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	uint64_t saved_tag;
3889c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe};
3989c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe
40132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeenum {
41b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	FIO_SERVER_VER			= 10,
42132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
43b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	FIO_SERVER_MAX_FRAGMENT_PDU	= 1024,
44132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
455d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_QUIT		= 1,
465d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_EXIT		= 2,
475d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_JOB			= 3,
485d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_JOBLINE		= 4,
495d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_TEXT		= 5,
505d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_TS			= 6,
515d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_GS			= 7,
525d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_SEND_ETA		= 8,
535d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_ETA			= 9,
545d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_PROBE		= 10,
555d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_START		= 11,
565d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_STOP		= 12,
575d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_DU			= 13,
585d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_SERVER_START	= 14,
595d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_ADD_JOB		= 15,
60b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	FIO_NET_CMD_RUN			= 16,
61b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	FIO_NET_CMD_NR			= 17,
62794d69ca97738736844ee6a6da37f1ef686578cbJens Axboe
635d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_F_MORE		= 1UL << 0,
64fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe
65fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	/* crc does not include the crc fields */
665d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_CRC_SZ		= sizeof(struct fio_net_cmd) -
675d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe						2 * sizeof(uint16_t),
6889c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe
695d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CLIENT_TIMEOUT		= 5000,
70132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe};
71132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
72a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct cmd_ts_pdu {
73a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	struct thread_stat ts;
74a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	struct group_run_stats rs;
75a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe};
76a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
77d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboestruct cmd_du_pdu {
78d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	struct disk_util_stat dus;
79d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	struct disk_util_agg agg;
80d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe};
81d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe
82c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboestruct cmd_probe_pdu {
83c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t hostname[64];
846eb2479194603184f393057ea10326643edc7169Jens Axboe	uint8_t bigendian;
85c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t fio_major;
86c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t fio_minor;
87c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t fio_patch;
88cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe	uint8_t os;
89cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe	uint8_t arch;
9038fdef226f1a1fa053ab53005abbc184143bff65Jens Axboe	uint8_t bpp;
91c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe};
92c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe
93fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboestruct cmd_single_line_pdu {
94fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint16_t len;
95fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint8_t text[0];
96fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe};
97fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe
9881179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboestruct cmd_line_pdu {
99fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint16_t lines;
100fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	struct cmd_single_line_pdu options[0];
10181179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe};
10281179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe
10311e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboestruct cmd_start_pdu {
10411e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe	uint32_t jobs;
10511e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe};
10611e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe
10711e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboestruct cmd_end_pdu {
10811e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe	uint32_t error;
10911e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe};
11011e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe
111807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboestruct cmd_add_job_pdu {
112dcaeb6060f2c7aef184cca5699e12c264ef0b834Jens Axboe	struct thread_options_pack top;
113807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe};
114807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe
115084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboestruct cmd_text_pdu {
116084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint32_t level;
117084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint32_t buf_len;
118084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint64_t log_sec;
119084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint64_t log_usec;
120084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint8_t buf[0];
121084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe};
122084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe
123402668f3e05259bfc135fc097136428feda01006Jens Axboeextern int fio_start_server(char *);
124084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboeextern int fio_server_text_output(int, const char *, size_t);
125af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboeextern int fio_net_send_cmd(int, uint16_t, const void *, off_t, uint64_t);
12689c1707cb512e562b55b56c268f7fad612be6f04Jens Axboeextern int fio_net_send_simple_cmd(int, uint16_t, uint64_t, struct flist_head *);
127bebe639808147d587bbe776566d390b9ff98773fJens Axboeextern void fio_server_set_arg(const char *);
128811826be429fd6fc5154d9b04ced1cd22bd66758Jens Axboeextern int fio_server_parse_string(const char *, char **, int *, int *, struct in_addr *, struct in6_addr *, int *);
1293ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboeextern int fio_server_parse_host(const char *, int *, struct in_addr *, struct in6_addr *);
13089c1707cb512e562b55b56c268f7fad612be6f04Jens Axboeextern const char *fio_server_op(unsigned int);
1317b8216842eb888ff626f616c2770a2548b0b0bf9Jens Axboeextern void fio_server_got_signal(int);
132a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
133a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct thread_stat;
134a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct group_run_stats;
135a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_ts(struct thread_stat *, struct group_run_stats *);
136a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_gs(struct group_run_stats *);
137d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboeextern void fio_server_send_du(void);
138cc0df00ad5076d4adbc439899f24d9b0db26075dJens Axboeextern void fio_server_idle_loop(void);
139132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
140132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_recv_data(int sk, void *p, unsigned int len);
141132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_send_data(int sk, const void *p, unsigned int len);
142132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern void fio_net_cmd_crc(struct fio_net_cmd *);
143e951bdc47d094d43d6f41de95c6af191b8346459Jens Axboeextern struct fio_net_cmd *fio_net_recv_cmd(int sk);
144132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
145807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboestruct thread_options;
146807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboeextern void fio_server_send_add_job(struct thread_options *, const char *);
147807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe
148009b1be41b32bf7e32b441c6a22e3ae628ec9b89Jens Axboeextern int exit_backend;
149132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_net_port;
150132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
1514d8f87806db144552baea60d9b59e9becffe5925Jens Axboestatic inline void fio_init_net_cmd(struct fio_net_cmd *cmd, uint16_t opcode,
152af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe				    const void *pdu, uint32_t pdu_len,
153af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe				    uint64_t tag)
154132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe{
155132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	memset(cmd, 0, sizeof(*cmd));
1564d8f87806db144552baea60d9b59e9becffe5925Jens Axboe
157fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	cmd->version	= __cpu_to_le16(FIO_SERVER_VER);
15882fa6b21d98da1341a54f415e43940213b39f18bJens Axboe	cmd->opcode	= cpu_to_le16(opcode);
159af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	cmd->tag	= cpu_to_le64(tag);
1604d8f87806db144552baea60d9b59e9becffe5925Jens Axboe
1614d8f87806db144552baea60d9b59e9becffe5925Jens Axboe	if (pdu) {
1624d8f87806db144552baea60d9b59e9becffe5925Jens Axboe		cmd->pdu_len	= cpu_to_le32(pdu_len);
1634d8f87806db144552baea60d9b59e9becffe5925Jens Axboe		memcpy(&cmd->payload, pdu, pdu_len);
1644d8f87806db144552baea60d9b59e9becffe5925Jens Axboe	}
165132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe}
16650d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
16750d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#endif
168