Home | History | Annotate | Download | only in fio
      1 #ifndef FIO_SERVER_H
      2 #define FIO_SERVER_H
      3 
      4 #include <inttypes.h>
      5 #include <string.h>
      6 #include <sys/time.h>
      7 #include <netinet/in.h>
      8 
      9 #include "stat.h"
     10 #include "os/os.h"
     11 #include "diskutil.h"
     12 
     13 #define FIO_NET_PORT 8765
     14 
     15 struct sk_out {
     16 	unsigned int refs;	/* frees sk_out when it drops to zero.
     17 				 * protected by below ->lock */
     18 
     19 	int sk;			/* socket fd to talk to client */
     20 	struct fio_mutex lock;	/* protects ref and below list */
     21 	struct flist_head list;	/* list of pending transmit work */
     22 	struct fio_mutex wait;	/* wake backend when items added to list */
     23 	struct fio_mutex xmit;	/* held while sending data */
     24 };
     25 
     26 /*
     27  * On-wire encoding is little endian
     28  */
     29 struct fio_net_cmd {
     30 	uint16_t version;	/* protocol version */
     31 	uint16_t opcode;	/* command opcode */
     32 	uint32_t flags;		/* modifier flags */
     33 	uint64_t tag;		/* passed back on reply */
     34 	uint32_t pdu_len;	/* length of post-cmd layload */
     35 	/*
     36 	 * These must be immediately before the payload, anything before
     37 	 * these fields are checksummed.
     38 	 */
     39 	uint16_t cmd_crc16;	/* cmd checksum */
     40 	uint16_t pdu_crc16;	/* payload checksum */
     41 	uint8_t payload[];	/* payload */
     42 };
     43 
     44 struct fio_net_cmd_reply {
     45 	struct flist_head list;
     46 	struct timeval tv;
     47 	uint64_t saved_tag;
     48 	uint16_t opcode;
     49 };
     50 
     51 enum {
     52 	FIO_SERVER_VER			= 61,
     53 
     54 	FIO_SERVER_MAX_FRAGMENT_PDU	= 1024,
     55 	FIO_SERVER_MAX_CMD_MB		= 2048,
     56 
     57 	FIO_NET_CMD_QUIT		= 1,
     58 	FIO_NET_CMD_EXIT		= 2,
     59 	FIO_NET_CMD_JOB			= 3,
     60 	FIO_NET_CMD_JOBLINE		= 4,
     61 	FIO_NET_CMD_TEXT		= 5,
     62 	FIO_NET_CMD_TS			= 6,
     63 	FIO_NET_CMD_GS			= 7,
     64 	FIO_NET_CMD_SEND_ETA		= 8,
     65 	FIO_NET_CMD_ETA			= 9,
     66 	FIO_NET_CMD_PROBE		= 10,
     67 	FIO_NET_CMD_START		= 11,
     68 	FIO_NET_CMD_STOP		= 12,
     69 	FIO_NET_CMD_DU			= 13,
     70 	FIO_NET_CMD_SERVER_START	= 14,
     71 	FIO_NET_CMD_ADD_JOB		= 15,
     72 	FIO_NET_CMD_RUN			= 16,
     73 	FIO_NET_CMD_IOLOG		= 17,
     74 	FIO_NET_CMD_UPDATE_JOB		= 18,
     75 	FIO_NET_CMD_LOAD_FILE		= 19,
     76 	FIO_NET_CMD_VTRIGGER		= 20,
     77 	FIO_NET_CMD_SENDFILE		= 21,
     78 	FIO_NET_CMD_JOB_OPT		= 22,
     79 	FIO_NET_CMD_NR			= 23,
     80 
     81 	FIO_NET_CMD_F_MORE		= 1UL << 0,
     82 
     83 	/* crc does not include the crc fields */
     84 	FIO_NET_CMD_CRC_SZ		= sizeof(struct fio_net_cmd) -
     85 						2 * sizeof(uint16_t),
     86 
     87 	FIO_NET_NAME_MAX		= 256,
     88 
     89 	FIO_NET_CLIENT_TIMEOUT		= 5000,
     90 
     91 	FIO_PROBE_FLAG_ZLIB		= 1UL << 0,
     92 };
     93 
     94 struct cmd_sendfile {
     95 	uint8_t path[FIO_NET_NAME_MAX];
     96 };
     97 
     98 struct cmd_sendfile_reply {
     99 	uint32_t size;
    100 	uint32_t error;
    101 	uint8_t data[0];
    102 };
    103 
    104 /*
    105  * Client sends this to server on VTRIGGER, server sends back a full
    106  * all_io_list structure.
    107  */
    108 struct cmd_vtrigger_pdu {
    109 	uint16_t len;
    110 	uint8_t cmd[];
    111 };
    112 
    113 struct cmd_load_file_pdu {
    114 	uint16_t name_len;
    115 	uint16_t client_type;
    116 	uint8_t file[];
    117 };
    118 
    119 struct cmd_ts_pdu {
    120 	struct thread_stat ts;
    121 	struct group_run_stats rs;
    122 };
    123 
    124 struct cmd_du_pdu {
    125 	struct disk_util_stat dus;
    126 	struct disk_util_agg agg;
    127 };
    128 
    129 struct cmd_client_probe_pdu {
    130 	uint64_t flags;
    131 	uint8_t server[128];
    132 };
    133 
    134 struct cmd_probe_reply_pdu {
    135 	uint8_t hostname[64];
    136 	uint8_t bigendian;
    137 	uint8_t fio_version[32];
    138 	uint8_t os;
    139 	uint8_t arch;
    140 	uint8_t bpp;
    141 	uint32_t cpus;
    142 	uint64_t flags;
    143 };
    144 
    145 struct cmd_single_line_pdu {
    146 	uint16_t len;
    147 	uint8_t text[];
    148 };
    149 
    150 struct cmd_line_pdu {
    151 	uint16_t lines;
    152 	uint16_t client_type;
    153 	struct cmd_single_line_pdu options[];
    154 };
    155 
    156 struct cmd_job_pdu {
    157 	uint32_t buf_len;
    158 	uint32_t client_type;
    159 	uint8_t buf[0];
    160 };
    161 
    162 struct cmd_start_pdu {
    163 	uint32_t jobs;
    164 	uint32_t stat_outputs;
    165 };
    166 
    167 struct cmd_end_pdu {
    168 	uint32_t error;
    169 	uint32_t signal;
    170 };
    171 
    172 struct cmd_add_job_pdu {
    173 	uint32_t thread_number;
    174 	uint32_t groupid;
    175 	struct thread_options_pack top;
    176 };
    177 
    178 struct cmd_text_pdu {
    179 	uint32_t level;
    180 	uint32_t buf_len;
    181 	uint64_t log_sec;
    182 	uint64_t log_usec;
    183 	uint8_t buf[0];
    184 };
    185 
    186 enum {
    187 	XMIT_COMPRESSED		= 1U,
    188 	STORE_COMPRESSED	= 2U,
    189 };
    190 
    191 struct cmd_iolog_pdu {
    192 	uint64_t nr_samples;
    193 	uint32_t thread_number;
    194 	uint32_t log_type;
    195 	uint32_t compressed;
    196 	uint32_t log_offset;
    197 	uint32_t log_hist_coarseness;
    198 	uint8_t name[FIO_NET_NAME_MAX];
    199 	struct io_sample samples[0];
    200 };
    201 
    202 struct cmd_job_option {
    203 	uint16_t global;
    204 	uint16_t truncated;
    205 	uint32_t groupid;
    206 	uint8_t name[64];
    207 	uint8_t value[128];
    208 };
    209 
    210 extern int fio_start_server(char *);
    211 extern int fio_server_text_output(int, const char *, size_t);
    212 extern int fio_net_send_cmd(int, uint16_t, const void *, off_t, uint64_t *, struct flist_head *);
    213 extern int fio_net_send_simple_cmd(int, uint16_t, uint64_t, struct flist_head *);
    214 extern void fio_server_set_arg(const char *);
    215 extern int fio_server_parse_string(const char *, char **, int *, int *, struct in_addr *, struct in6_addr *, int *);
    216 extern int fio_server_parse_host(const char *, int, struct in_addr *, struct in6_addr *);
    217 extern const char *fio_server_op(unsigned int);
    218 extern void fio_server_got_signal(int);
    219 
    220 struct thread_stat;
    221 struct group_run_stats;
    222 extern void fio_server_send_ts(struct thread_stat *, struct group_run_stats *);
    223 extern void fio_server_send_gs(struct group_run_stats *);
    224 extern void fio_server_send_du(void);
    225 extern void fio_server_send_job_options(struct flist_head *, unsigned int);
    226 extern int fio_server_get_verify_state(const char *, int, void **);
    227 
    228 extern struct fio_net_cmd *fio_net_recv_cmd(int sk, bool wait);
    229 
    230 extern int fio_send_iolog(struct thread_data *, struct io_log *, const char *);
    231 extern void fio_server_send_add_job(struct thread_data *);
    232 extern void fio_server_send_start(struct thread_data *);
    233 extern int fio_net_send_quit(int sk);
    234 
    235 extern int fio_server_create_sk_key(void);
    236 extern void fio_server_destroy_sk_key(void);
    237 
    238 extern int exit_backend;
    239 extern int fio_net_port;
    240 
    241 #endif
    242