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