server.h revision a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1
150d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#ifndef FIO_SERVER_H 250d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#define FIO_SERVER_H 350d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 4132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#include <inttypes.h> 5142575e6579462656a6d0f7c50ec8c35b8a08802Jens Axboe#include <string.h> 6132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#include <endian.h> 7132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 8a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe#include "stat.h" 9a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 10132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe/* 11132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe * On-wire encoding is little endian 12132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe */ 13132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboestruct fio_net_cmd { 14132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe uint16_t version; /* protocol version */ 15132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe uint16_t opcode; /* command opcode */ 16132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe uint32_t flags; /* modifier flags */ 17132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe uint64_t serial; /* serial number */ 18132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe uint32_t pdu_len; /* length of post-cmd layload */ 19a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe /* 20a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * These must be immediately before the payload, anything before 21a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe * these fields are checksummed. 22a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe */ 23fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe uint16_t cmd_crc16; /* cmd checksum */ 24fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe uint16_t pdu_crc16; /* payload checksum */ 25132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe uint8_t payload[0]; /* payload */ 26132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe}; 27132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 28132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeenum { 29132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe FIO_SERVER_VER = 1, 30132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe FIO_SERVER_VER1 = 1, 31132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 32794d69ca97738736844ee6a6da37f1ef686578cbJens Axboe FIO_SERVER_MAX_PDU = 64, 33132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 34132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe FIO_NET_CMD_QUIT = 1, 35d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe FIO_NET_CMD_EXIT = 2, 36d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe FIO_NET_CMD_JOB = 3, 37d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe FIO_NET_CMD_ACK = 4, 38d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe FIO_NET_CMD_NAK = 5, 39d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe FIO_NET_CMD_TEXT = 6, 40a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe FIO_NET_CMD_TS = 7, 41a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe FIO_NET_CMD_GS = 8, 42794d69ca97738736844ee6a6da37f1ef686578cbJens Axboe 43d7959186aa6f8ca6ee5bdcd773d77280fc806617Jens Axboe FIO_NET_CMD_F_MORE = 1UL << 0, 44fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe 45fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe /* crc does not include the crc fields */ 46fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe FIO_NET_CMD_CRC_SZ = sizeof(struct fio_net_cmd) - 47fcee5ff6f30d0f05582a378a310ed1f68491766fJens Axboe 2 * sizeof(uint16_t), 48132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe}; 49132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 50a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct cmd_ts_pdu { 51a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe struct thread_stat ts; 52a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe struct group_run_stats rs; 53a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe}; 54a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 55e46d809110bd4ad2980ca64931b683673444454bJens Axboeextern int fio_start_server(int); 56142575e6579462656a6d0f7c50ec8c35b8a08802Jens Axboeextern int fio_server_text_output(const char *, unsigned int len); 57142575e6579462656a6d0f7c50ec8c35b8a08802Jens Axboeextern int fio_server_log(const char *format, ...); 58a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern int fio_net_send_cmd(int, uint16_t, const void *, off_t); 59a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboe 60a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct thread_stat; 61a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboestruct group_run_stats; 62a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_ts(struct thread_stat *, struct group_run_stats *); 63a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern void fio_server_send_gs(struct group_run_stats *); 64132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 65a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboeextern int fio_clients_connect(void); 66a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboeextern int fio_clients_send_ini(const char *); 6737db14feece08eb6e43de87c404180650ed5aa6fJens Axboeextern int fio_handle_clients(void); 68a37f69b72a74cbde6151458b890aab8d093f0c9fJens Axboeextern void fio_client_add(const char *); 69132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 70132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_recv_data(int sk, void *p, unsigned int len); 71132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_send_data(int sk, const void *p, unsigned int len); 72132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern void fio_net_cmd_crc(struct fio_net_cmd *); 73a64e88dad0c0e4a510ae8ab54cde1a20b99c59d1Jens Axboeextern struct fio_net_cmd *fio_net_recv_cmd(int sk); 74132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 75009b1be41b32bf7e32b441c6a22e3ae628ec9b89Jens Axboeextern int exit_backend; 76132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboeextern int fio_net_port; 77132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 78132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#if __BYTE_ORDER == __LITTLE_ENDIAN 79132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define le16_to_cpu(x) (x) 80132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define le32_to_cpu(x) (x) 81132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define le64_to_cpu(x) (x) 82132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define cpu_to_le16(x) (x) 83132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define cpu_to_le32(x) (x) 84132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define cpu_to_le64(x) (x) 85132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#elif __BYTE_ORDER == __BIG_ENDIAN 86132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define le16_to_cpu(x) __bswap_16(x) 87132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define le32_to_cpu(x) __bswap_32(x) 88132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define le64_to_cpu(x) __bswap_64(x) 89132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define cpu_to_le16(x) __bswap_16(x) 90132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define cpu_to_le32(x) __bswap_32(x) 91132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#define cpu_to_le64(x) __bswap_64(x) 92132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#else 93132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#error "Endianness not detected" 94132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe#endif 95132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe 964d8f87806db144552baea60d9b59e9becffe5925Jens Axboestatic inline void fio_init_net_cmd(struct fio_net_cmd *cmd, uint16_t opcode, 974d8f87806db144552baea60d9b59e9becffe5925Jens Axboe const void *pdu, uint32_t pdu_len) 98132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe{ 99132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe memset(cmd, 0, sizeof(*cmd)); 1004d8f87806db144552baea60d9b59e9becffe5925Jens Axboe 1014d8f87806db144552baea60d9b59e9becffe5925Jens Axboe cmd->version = cpu_to_le16(FIO_SERVER_VER1); 10282fa6b21d98da1341a54f415e43940213b39f18bJens Axboe cmd->opcode = cpu_to_le16(opcode); 1034d8f87806db144552baea60d9b59e9becffe5925Jens Axboe 1044d8f87806db144552baea60d9b59e9becffe5925Jens Axboe if (pdu) { 1054d8f87806db144552baea60d9b59e9becffe5925Jens Axboe cmd->pdu_len = cpu_to_le32(pdu_len); 1064d8f87806db144552baea60d9b59e9becffe5925Jens Axboe memcpy(&cmd->payload, pdu, pdu_len); 1074d8f87806db144552baea60d9b59e9becffe5925Jens Axboe } 108132159a5a062cabfe963b3d57e82a80741bf5506Jens Axboe} 10950d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe 11050d16976ac0cd44c1f5aba9217148ff05e141436Jens Axboe#endif 111