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