1dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron#ifndef CLIENT_H
2dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron#define CLIENT_H
3dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron
40f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe#include <sys/socket.h>
50f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe#include <sys/un.h>
60f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe#include <netinet/in.h>
70f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe#include <arpa/inet.h>
80f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
93e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe#include "stat.h"
103e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe
11dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameronstruct fio_net_cmd;
12a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboestruct client_ops;
13dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron
14b9d2f30a214ebd274340f888739be250838d63c2Jens Axboeenum {
15b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	Client_created		= 0,
16b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	Client_connected	= 1,
17b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	Client_started		= 2,
18b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	Client_running		= 3,
19b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	Client_stopped		= 4,
20b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe	Client_exited		= 5,
21b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe};
22b9d2f30a214ebd274340f888739be250838d63c2Jens Axboe
233589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboestruct client_file {
243589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	char *file;
253589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	int remote;
263589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe};
273589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe
280f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboestruct fio_client {
290f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	struct flist_head list;
300f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	struct flist_head hash_list;
310f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	struct flist_head arg_list;
320f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	union {
330f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe		struct sockaddr_in addr;
340f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe		struct sockaddr_in6 addr6;
350f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe		struct sockaddr_un addr_un;
360f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	};
370f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	char *hostname;
380f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int port;
390f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int fd;
405121a9aa0299a2c23b3c50bf110ab4a05677c740Jens Axboe	unsigned int refs;
410f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
420f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	char *name;
430f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
440f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int state;
450f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
460f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int skip_newline;
470f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int is_sock;
480f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int disk_stats_shown;
490f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	unsigned int jobs;
5030f8e31626ead5d71814f2e4299ef878f3b87ecfJens Axboe	unsigned int nr_stat;
510f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int error;
52122c772599f1b0a3148a5790775698d3fa92cc10Jens Axboe	int signal;
530f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int ipv6;
540f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	int sent_job;
551e5324e723116a5faf9da686993cc79c14d62d4bJens Axboe	int did_stat;
5646bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	uint32_t type;
570f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
5840c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	uint32_t thread_number;
5940c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	uint32_t groupid;
6040c605169e60d32fc321a2f9f465e76cba745489Jens Axboe
610f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	struct flist_head eta_list;
620f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	struct client_eta *eta_in_flight;
630f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
640f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	struct flist_head cmd_list;
650f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
660f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	uint16_t argc;
670f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe	char **argv;
683ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe
69a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboe	struct client_ops *ops;
703ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe	void *client_data;
7114ea90edf265aae2b82f25418fde179c452909f9Jens Axboe
723589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	struct client_file *files;
733589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboe	unsigned int nr_files;
740f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe};
750f92bd205af256af6d4a12cc8883f68b4d23ca85Jens Axboe
761b42725f06f8906b9b99381da3490484f59df28aJens Axboestruct cmd_iolog_pdu;
7735c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboetypedef void (client_cmd_op)(struct fio_client *, struct fio_net_cmd *);
7835c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboetypedef void (client_eta_op)(struct jobs_eta *je);
7935c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboetypedef void (client_timed_out_op)(struct fio_client *);
8035c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboetypedef void (client_jobs_eta_op)(struct fio_client *client, struct jobs_eta *je);
811b42725f06f8906b9b99381da3490484f59df28aJens Axboetypedef void (client_iolog_op)(struct fio_client *client, struct cmd_iolog_pdu *);
823ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe
83dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameronstruct client_ops {
8435c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*text;
8535c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*disk_util;
8635c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*thread_status;
8735c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*group_stats;
8835c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_jobs_eta_op	*jobs_eta;
8935c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_eta_op		*eta;
9035c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*probe;
9135c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*quit;
9235c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*add_job;
9340c605169e60d32fc321a2f9f465e76cba745489Jens Axboe	client_cmd_op		*update_job;
9435c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_timed_out_op	*timed_out;
9535c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*stop;
9635c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*start;
9735c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe	client_cmd_op		*job_start;
981b42725f06f8906b9b99381da3490484f59df28aJens Axboe	client_iolog_op		*iolog;
990cf3ece062d6856bd79b89770780296c99937a98Jens Axboe	client_timed_out_op	*removed;
10035c0ba7ff55bbd438cdc171945c61d501a4e693eJens Axboe
1016433ee054a5dc6533066e105baee4ff85197d392Jens Axboe	unsigned int eta_msec;
1023ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe	int stay_connected;
10346bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	uint32_t client_type;
104dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron};
105dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron
106dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameronextern struct client_ops fio_client_ops;
107dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron
1083e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboestruct client_eta {
1093e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe	unsigned int pending;
110166fb52041fd81e453fa77ccea48abaa20dc5b3eJens Axboe	struct jobs_eta eta;
1113e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe};
1123e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe
113a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboeextern int fio_handle_client(struct fio_client *);
114a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboeextern void fio_client_dec_jobs_eta(struct client_eta *eta, client_eta_op fn);
1153e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboeextern void fio_client_sum_jobs_eta(struct jobs_eta *dst, struct jobs_eta *je);
1163e47bd250cac5fb81a5c0ad578dfbe90c6ddf6deJens Axboe
1173ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboeenum {
1183ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe	Fio_client_ipv4 = 1,
1193ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe	Fio_client_ipv6,
1203ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe	Fio_client_socket,
1213ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe};
1223ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboe
1232f99deb0895b2d0b618e6e72c74add7192b4d73fJens Axboeextern int fio_client_connect(struct fio_client *);
1243ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboeextern int fio_clients_connect(void);
125b9d2f30a214ebd274340f888739be250838d63c2Jens Axboeextern int fio_start_client(struct fio_client *);
126b9d2f30a214ebd274340f888739be250838d63c2Jens Axboeextern int fio_start_all_clients(void);
1273ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboeextern int fio_clients_send_ini(const char *);
1283589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboeextern int fio_client_send_ini(struct fio_client *, const char *, int);
129a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboeextern int fio_handle_clients(struct client_ops *);
130a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboeextern int fio_client_add(struct client_ops *, const char *, void **);
131a52766160d7f2a937c74d4adee1819ef00467d4bJens Axboeextern struct fio_client *fio_client_add_explicit(struct client_ops *, const char *, int, int);
1323ec62ec45ce971b76dd3029412dfd3d0c6221384Jens Axboeextern void fio_client_add_cmd_option(void *, const char *);
1333589918ceb15ffdc795c963923ce10ac9b9c87d5Jens Axboeextern int fio_client_add_ini_file(void *, const char *, int);
1340cf3ece062d6856bd79b89770780296c99937a98Jens Axboeextern int fio_client_terminate(struct fio_client *);
135df06f220c56a2f833a17883dae5e01ba8d99eb80Jens Axboeextern void fio_clients_terminate(void);
136343cb4a98200757bdcb0c5203e9120bb777625a8Jens Axboeextern struct fio_client *fio_get_client(struct fio_client *);
137343cb4a98200757bdcb0c5203e9120bb777625a8Jens Axboeextern void fio_put_client(struct fio_client *);
13840c605169e60d32fc321a2f9f465e76cba745489Jens Axboeextern int fio_client_update_options(struct fio_client *, struct thread_options *, uint64_t *);
13940c605169e60d32fc321a2f9f465e76cba745489Jens Axboeextern int fio_client_wait_for_reply(struct fio_client *, uint64_t);
140de54cfd8b8e93d2a32a02961f1587b83f0763aa8Jens Axboeextern int fio_clients_send_trigger(const char *);
141df06f220c56a2f833a17883dae5e01ba8d99eb80Jens Axboe
1426433ee054a5dc6533066e105baee4ff85197d392Jens Axboe#define FIO_CLIENT_DEF_ETA_MSEC		900
1436433ee054a5dc6533066e105baee4ff85197d392Jens Axboe
14446bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboeenum {
14546bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	FIO_CLIENT_TYPE_CLI		= 1,
14646bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe	FIO_CLIENT_TYPE_GUI		= 2,
14746bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe};
14846bcd498f7b3fb55f7f048bf299f36bd8c8f7db1Jens Axboe
149dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron#endif
150dd366728eb503e6344215ae6ec153c7ab6eafd9bStephen M. Cameron
151