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 */
30372aecb9049618c1279a946b66f6b29066730951Jens Axboe	uint8_t payload[];	/* payload */
31132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe};
32132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
3340c605169e60d32fc321a2f9f465e76cba745489Jens Axboestruct fio_net_cmd_reply {
3489c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct flist_head list;
3589c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	struct timeval tv;
3689c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe	uint64_t saved_tag;
3740c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	uint16_t opcode;
3889c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe};
3989c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe
40132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeenum {
4180ac020b479bd433590d221fcefa3eb47327f9a3Jens Axboe	FIO_SERVER_VER			= 42,
42132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
43b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	FIO_SERVER_MAX_FRAGMENT_PDU	= 1024,
44dfbf1f6f34dfef111120438d9c4e2f75f20b4578Jens Axboe	FIO_SERVER_MAX_CMD_MB		= 2048,
45132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
465d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_QUIT		= 1,
475d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_EXIT		= 2,
485d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_JOB			= 3,
495d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_JOBLINE		= 4,
505d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_TEXT		= 5,
515d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_TS			= 6,
525d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_GS			= 7,
535d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_SEND_ETA		= 8,
545d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_ETA			= 9,
555d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_PROBE		= 10,
565d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_START		= 11,
575d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_STOP		= 12,
585d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_DU			= 13,
595d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_SERVER_START	= 14,
605d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_ADD_JOB		= 15,
61b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	FIO_NET_CMD_RUN			= 16,
621b42725f06f8906b9b99381da3490484f59df28aJens Axboe	FIO_NET_CMD_IOLOG		= 17,
63f58bd2a4fc0ba558fd90878fe7db5f2d4809990bJens Axboe	FIO_NET_CMD_UPDATE_JOB		= 18,
643589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	FIO_NET_CMD_LOAD_FILE		= 19,
65de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	FIO_NET_CMD_VTRIGGER		= 20,
66de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	FIO_NET_CMD_SENDFILE		= 21,
67de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	FIO_NET_CMD_NR			= 22,
68794d69ca97738736844ee6a6da37f1ef686578cbJens Axboe
695d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_F_MORE		= 1UL << 0,
70fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe
71fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe	/* crc does not include the crc fields */
725d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CMD_CRC_SZ		= sizeof(struct fio_net_cmd) -
735d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe						2 * sizeof(uint16_t),
7489c1707cb512e562b55b56c268f7fad612be6f04Jens Axboe
751b42725f06f8906b9b99381da3490484f59df28aJens Axboe	FIO_NET_NAME_MAX		= 256,
761b42725f06f8906b9b99381da3490484f59df28aJens Axboe
775d7793aa2b1dc1044b1918d829a1bcd4c9a19196Jens Axboe	FIO_NET_CLIENT_TIMEOUT		= 5000,
783989b14303458519192f4ace8caf091d587f5e6eJens Axboe
793989b14303458519192f4ace8caf091d587f5e6eJens Axboe	FIO_PROBE_FLAG_ZLIB		= 1UL << 0,
80132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe};
81132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
82de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboestruct cmd_sendfile {
83de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint8_t path[FIO_NET_NAME_MAX];
84de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe};
85de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe
86de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboestruct cmd_sendfile_reply {
87de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint32_t size;
88de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint32_t error;
89de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint8_t data[0];
90de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe};
91de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe
92de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe/*
93de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * Client sends this to server on VTRIGGER, server sends back a full
94de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe * all_io_list structure.
95de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe */
96de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboestruct cmd_vtrigger_pdu {
97de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint16_t len;
98de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint8_t cmd[];
99de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe};
100de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe
1013589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboestruct cmd_load_file_pdu {
1023589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	uint16_t name_len;
1033589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	uint16_t client_type;
1043589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	uint8_t file[];
1053589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe};
1063589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe
107a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct cmd_ts_pdu {
108a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	struct thread_stat ts;
109a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe	struct group_run_stats rs;
110a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe};
111a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
112d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboestruct cmd_du_pdu {
113d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	struct disk_util_stat dus;
114d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe	struct disk_util_agg agg;
115d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe};
116d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboe
1173989b14303458519192f4ace8caf091d587f5e6eJens Axboestruct cmd_client_probe_pdu {
1183989b14303458519192f4ace8caf091d587f5e6eJens Axboe	uint64_t flags;
119de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboe	uint8_t server[128];
1203989b14303458519192f4ace8caf091d587f5e6eJens Axboe};
1213989b14303458519192f4ace8caf091d587f5e6eJens Axboe
1223989b14303458519192f4ace8caf091d587f5e6eJens Axboestruct cmd_probe_reply_pdu {
123c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe	uint8_t hostname[64];
1246eb2479194603184f393057ea10326643edc7169Jens Axboe	uint8_t bigendian;
125750db473abdebdbf3ddfc8556a9873762c9db8f4Jens Axboe	uint8_t fio_version[32];
126cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe	uint8_t os;
127cca84643cc10cd72b0b453ff92ccb8643ba51493Jens Axboe	uint8_t arch;
12838fdef226f1a1fa053ab53005abbc184143bff65Jens Axboe	uint8_t bpp;
129d31e26d0a575f91db96bda4d76b36fe38996d5f8Jens Axboe	uint32_t cpus;
130d31e26d0a575f91db96bda4d76b36fe38996d5f8Jens Axboe	uint64_t flags;
131c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe};
132c28e8e8c68f7e908085f4585299e6e4d74d01837Jens Axboe
133fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboestruct cmd_single_line_pdu {
134fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint16_t len;
135372aecb9049618c1279a946b66f6b29066730951Jens Axboe	uint8_t text[];
136fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe};
137fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe
13881179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboestruct cmd_line_pdu {
139fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	uint16_t lines;
14046bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	uint16_t client_type;
141372aecb9049618c1279a946b66f6b29066730951Jens Axboe	struct cmd_single_line_pdu options[];
14281179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe};
14381179eec4a84ff25c190a8a6a685b0b3b4dd2a37Jens Axboe
14446bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboestruct cmd_job_pdu {
14546bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	uint32_t buf_len;
14646bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	uint32_t client_type;
14746bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	uint8_t buf[0];
14846bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe};
14946bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe
15011e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboestruct cmd_start_pdu {
15111e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe	uint32_t jobs;
152108fea772db5f1dd91e2fb67737e3e0d36827b76Jens Axboe	uint32_t stat_outputs;
15311e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe};
15411e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe
15511e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboestruct cmd_end_pdu {
15611e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe	uint32_t error;
157122c772599f1b0a3148a5790775698d3fa92cc10Jens Axboe	uint32_t signal;
15811e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe};
15911e950bd785d9f03b7d35a8ee4b4704256217504Jens Axboe
160807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboestruct cmd_add_job_pdu {
1612f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboe	uint32_t thread_number;
1622f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboe	uint32_t groupid;
163dcaeb6060f2c7aef184cca5699e12c264ef0b834Jens Axboe	struct thread_options_pack top;
164807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe};
165807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe
166084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboestruct cmd_text_pdu {
167084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint32_t level;
168084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint32_t buf_len;
169084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint64_t log_sec;
170084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint64_t log_usec;
171084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe	uint8_t buf[0];
172084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe};
173084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboe
1741b42725f06f8906b9b99381da3490484f59df28aJens Axboestruct cmd_iolog_pdu {
175ccefd5fea1de87a83db9c372985b69f4fbbe922cJens Axboe	uint64_t nr_samples;
1762f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboe	uint32_t thread_number;
1771b42725f06f8906b9b99381da3490484f59df28aJens Axboe	uint32_t log_type;
1783989b14303458519192f4ace8caf091d587f5e6eJens Axboe	uint32_t compressed;
179ccefd5fea1de87a83db9c372985b69f4fbbe922cJens Axboe	uint32_t log_offset;
1801b42725f06f8906b9b99381da3490484f59df28aJens Axboe	uint8_t name[FIO_NET_NAME_MAX];
1811b42725f06f8906b9b99381da3490484f59df28aJens Axboe	struct io_sample samples[0];
1821b42725f06f8906b9b99381da3490484f59df28aJens Axboe};
1831b42725f06f8906b9b99381da3490484f59df28aJens Axboe
184402668f3e05259bfc135fc097136428feda01006Jens Axboeextern int fio_start_server(char *);
185084d1c6f817eacaaefa1de4f0637ef6c1405d74bJens Axboeextern int fio_server_text_output(int, const char *, size_t);
18640c605169e60d32fc321a2f9f465e76cba745489Jens Axboeextern int fio_net_send_cmd(int, uint16_t, const void *, off_t, uint64_t *, struct flist_head *);
18789c1707cb512e562b55b56c268f7fad612be6f04Jens Axboeextern int fio_net_send_simple_cmd(int, uint16_t, uint64_t, struct flist_head *);
188bebe639808147d587bbe776566d390b9ff98773fJens Axboeextern void fio_server_set_arg(const char *);
189811826be429fd6fc5154d9b04ced1cd22bd66758Jens Axboeextern int fio_server_parse_string(const char *, char **, int *, int *, struct in_addr *, struct in6_addr *, int *);
1903aa3ceeb5c93f05e50d13a0e8f374843e6cb8ec5Jens Axboeextern int fio_server_parse_host(const char *, int, struct in_addr *, struct in6_addr *);
19189c1707cb512e562b55b56c268f7fad612be6f04Jens Axboeextern const char *fio_server_op(unsigned int);
1927b8216842eb888ff626f616c2770a2548b0b0bf9Jens Axboeextern void fio_server_got_signal(int);
193a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe
194a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct thread_stat;
195a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct group_run_stats;
196a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_ts(struct thread_stat *, struct group_run_stats *);
197a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_gs(struct group_run_stats *);
198d09a64a01a6c807596e9286c93f6c6f30fd2ea26Jens Axboeextern void fio_server_send_du(void);
199cc0df00ad5076d4adbc439899f24d9b0db26075dJens Axboeextern void fio_server_idle_loop(void);
200de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboeextern int fio_server_get_verify_state(const char *, int, void **);
201132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
202132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_recv_data(int sk, void *p, unsigned int len);
203132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_send_data(int sk, const void *p, unsigned int len);
204132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern void fio_net_cmd_crc(struct fio_net_cmd *);
20553bd8dbcbf692d1f622d6c9e62284121e710fdc3Jens Axboeextern void fio_net_cmd_crc_pdu(struct fio_net_cmd *, const void *);
206e951bdc47d094d43d6f41de95c6af191b8346459Jens Axboeextern struct fio_net_cmd *fio_net_recv_cmd(int sk);
207132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
2081b42725f06f8906b9b99381da3490484f59df28aJens Axboeextern int fio_send_iolog(struct thread_data *, struct io_log *, const char *);
2092f122b135b7319ff8dd04dadf31ff28b301051a3Jens Axboeextern void fio_server_send_add_job(struct thread_data *);
210122c772599f1b0a3148a5790775698d3fa92cc10Jens Axboeextern void fio_server_send_start(struct thread_data *);
211122c772599f1b0a3148a5790775698d3fa92cc10Jens Axboeextern int fio_net_send_stop(int sk, int error, int signal);
212122c772599f1b0a3148a5790775698d3fa92cc10Jens Axboeextern int fio_net_send_quit(int sk);
213807f9971e7bfedfc905d2cb2c38a6e558db2f343Jens Axboe
214009b1be41b32bf7e32b441c6a22e3ae628ec9b89Jens Axboeextern int exit_backend;
215132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_net_port;
216132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe
2171b42725f06f8906b9b99381da3490484f59df28aJens Axboestatic inline void __fio_init_net_cmd(struct fio_net_cmd *cmd, uint16_t opcode,
2181b42725f06f8906b9b99381da3490484f59df28aJens Axboe				      uint32_t pdu_len, uint64_t tag)
219132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe{
220132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe	memset(cmd, 0, sizeof(*cmd));
2214d8f87806db144552baea60d9b59e9becffe5925Jens Axboe
222fa2ea806de0d6410320abd97599bc52f5a3e72ccJens Axboe	cmd->version	= __cpu_to_le16(FIO_SERVER_VER);
22382fa6b21d98da1341a54f415e43940213b39f18bJens Axboe	cmd->opcode	= cpu_to_le16(opcode);
224af9c9fb34e420fc4d9cf317aa0f3cf6795a5a07fJens Axboe	cmd->tag	= cpu_to_le64(tag);
2251b42725f06f8906b9b99381da3490484f59df28aJens Axboe	cmd->pdu_len	= cpu_to_le32(pdu_len);
2261b42725f06f8906b9b99381da3490484f59df28aJens Axboe}
2271b42725f06f8906b9b99381da3490484f59df28aJens Axboe
2281b42725f06f8906b9b99381da3490484f59df28aJens Axboe
2291b42725f06f8906b9b99381da3490484f59df28aJens Axboestatic inline void fio_init_net_cmd(struct fio_net_cmd *cmd, uint16_t opcode,
2301b42725f06f8906b9b99381da3490484f59df28aJens Axboe				    const void *pdu, uint32_t pdu_len,
2311b42725f06f8906b9b99381da3490484f59df28aJens Axboe				    uint64_t tag)
2321b42725f06f8906b9b99381da3490484f59df28aJens Axboe{
2331b42725f06f8906b9b99381da3490484f59df28aJens Axboe	__fio_init_net_cmd(cmd, opcode, pdu_len, tag);
2344d8f87806db144552baea60d9b59e9becffe5925Jens Axboe
2351b42725f06f8906b9b99381da3490484f59df28aJens Axboe	if (pdu)
2364d8f87806db144552baea60d9b59e9becffe5925Jens Axboe		memcpy(&cmd->payload, pdu, pdu_len);
237132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe}
23850d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe
23950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#endif
240