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