/*
 * GPL HEADER START
 *
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 only,
 * as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License version 2 for more details (a copy is included
 * in the LICENSE file that accompanied this code).
 *
 * You should have received a copy of the GNU General Public License
 * version 2 along with this program; If not, see
 * http://www.sun.com/software/products/lustre/docs/GPLv2.pdf
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2011, 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * lnet/selftest/console.h
 *
 * kernel structure for LST console
 *
 * Author: Liang Zhen <liangzhen@clusterfs.com>
 */

#ifndef __LST_CONSOLE_H__
#define __LST_CONSOLE_H__


#include <linux/libcfs/libcfs.h>
#include <linux/lnet/lnet.h>
#include <linux/lnet/lib-types.h>
#include <linux/lnet/lnetst.h>
#include "selftest.h"
#include "conrpc.h"

typedef struct lstcon_node {
	lnet_process_id_t    nd_id;	  /* id of the node */
	int		  nd_ref;	 /* reference count */
	int		  nd_state;       /* state of the node */
	int		  nd_timeout;     /* session timeout */
	cfs_time_t	   nd_stamp;       /* timestamp of last replied RPC */
	struct lstcon_rpc    nd_ping;	/* ping rpc */
} lstcon_node_t;				/*** node descriptor */

typedef struct {
	struct list_head	   ndl_link;       /* chain on list */
	struct list_head	   ndl_hlink;      /* chain on hash */
	lstcon_node_t       *ndl_node;       /* pointer to node */
} lstcon_ndlink_t;			      /*** node link descriptor */

typedef struct {
	struct list_head	   grp_link;       /* chain on global group list */
	int		  grp_ref;	/* reference count */
	int		  grp_userland;   /* has userland nodes */
	int		  grp_nnode;      /* # of nodes */
	char		 grp_name[LST_NAME_SIZE]; /* group name */

	struct list_head	   grp_trans_list; /* transaction list */
	struct list_head	   grp_ndl_list;   /* nodes list */
	struct list_head	   grp_ndl_hash[0];/* hash table for nodes */
} lstcon_group_t;		    /*** (alias of nodes) group descriptor */

#define LST_BATCH_IDLE	  0xB0	    /* idle batch */
#define LST_BATCH_RUNNING       0xB1	    /* running batch */

typedef struct lstcon_tsb_hdr {
	lst_bid_t	       tsb_id;	 /* batch ID */
	int		     tsb_index;      /* test index */
} lstcon_tsb_hdr_t;

typedef struct {
	lstcon_tsb_hdr_t	bat_hdr;	/* test_batch header */
	struct list_head	      bat_link;       /* chain on session's batches list */
	int		     bat_ntest;      /* # of test */
	int		     bat_state;      /* state of the batch */
	int		     bat_arg;	/* parameter for run|stop, timeout for run, force for stop */
	char		    bat_name[LST_NAME_SIZE]; /* name of batch */

	struct list_head	      bat_test_list;  /* list head of tests (lstcon_test_t) */
	struct list_head	      bat_trans_list; /* list head of transaction */
	struct list_head	      bat_cli_list;   /* list head of client nodes (lstcon_node_t) */
	struct list_head	     *bat_cli_hash;   /* hash table of client nodes */
	struct list_head	      bat_srv_list;   /* list head of server nodes */
	struct list_head	     *bat_srv_hash;   /* hash table of server nodes */
} lstcon_batch_t;			     /*** (tests ) batch descriptor */

typedef struct lstcon_test {
	lstcon_tsb_hdr_t      tes_hdr;	/* test batch header */
	struct list_head	    tes_link;       /* chain on batch's tests list */
	lstcon_batch_t       *tes_batch;      /* pointer to batch */

	int		   tes_type;       /* type of the test, i.e: bulk, ping */
	int		   tes_stop_onerr; /* stop on error */
	int		   tes_oneside;    /* one-sided test */
	int		   tes_concur;     /* concurrency */
	int		   tes_loop;       /* loop count */
	int		   tes_dist;       /* nodes distribution of target group */
	int		   tes_span;       /* nodes span of target group */
	int		   tes_cliidx;     /* client index, used for RPC creating */

	struct list_head  tes_trans_list; /* transaction list */
	lstcon_group_t       *tes_src_grp;    /* group run the test */
	lstcon_group_t       *tes_dst_grp;    /* target group */

	int		   tes_paramlen;   /* test parameter length */
	char		  tes_param[0];   /* test parameter */
} lstcon_test_t;				/*** a single test descriptor */

#define LST_GLOBAL_HASHSIZE     503	     /* global nodes hash table size */
#define LST_NODE_HASHSIZE       239	     /* node hash table (for batch or group) */

#define LST_SESSION_NONE	0x0	     /* no session */
#define LST_SESSION_ACTIVE      0x1	     /* working session */

#define LST_CONSOLE_TIMEOUT     300	     /* default console timeout */

typedef struct {
	struct mutex		ses_mutex;      /* only 1 thread in session */
	lst_sid_t	       ses_id;	 /* global session id */
	int		     ses_key;	/* local session key */
	int		     ses_state;      /* state of session */
	int		     ses_timeout;    /* timeout in seconds */
	time_t		  ses_laststamp;  /* last operation stamp (seconds) */
	/** tests features of the session */
	unsigned		ses_features;
	/** features are synced with remote test nodes */
	unsigned		ses_feats_updated:1;
	/** force creating */
	unsigned		ses_force:1;
	/** session is shutting down */
	unsigned		ses_shutdown:1;
	/** console is timedout */
	unsigned		ses_expired:1;
	__u64		   ses_id_cookie;  /* batch id cookie */
	char		    ses_name[LST_NAME_SIZE];  /* session name */
	lstcon_rpc_trans_t     *ses_ping;       /* session pinger */
	stt_timer_t	     ses_ping_timer; /* timer for pinger */
	lstcon_trans_stat_t     ses_trans_stat; /* transaction stats */

	struct list_head	      ses_trans_list; /* global list of transaction */
	struct list_head	      ses_grp_list;   /* global list of groups */
	struct list_head	      ses_bat_list;   /* global list of batches */
	struct list_head	      ses_ndl_list;   /* global list of nodes */
	struct list_head	     *ses_ndl_hash;   /* hash table of nodes */

	spinlock_t	  ses_rpc_lock;   /* serialize */
	atomic_t	    ses_rpc_counter;/* # of initialized RPCs */
	struct list_head	      ses_rpc_freelist; /* idle console rpc */
} lstcon_session_t;			     /*** session descriptor */

extern lstcon_session_t	 console_session;

static inline lstcon_trans_stat_t *
lstcon_trans_stat(void)
{
	return &console_session.ses_trans_stat;
}

static inline struct list_head *
lstcon_id2hash (lnet_process_id_t id, struct list_head *hash)
{
	unsigned int idx = LNET_NIDADDR(id.nid) % LST_NODE_HASHSIZE;

	return &hash[idx];
}

extern int lstcon_session_match(lst_sid_t sid);
extern int lstcon_session_new(char *name, int key, unsigned version,
			      int timeout, int flags, lst_sid_t *sid_up);
extern int lstcon_session_info(lst_sid_t *sid_up, int *key, unsigned *verp,
			       lstcon_ndlist_ent_t *entp, char *name_up, int len);
extern int lstcon_session_end(void);
extern int lstcon_session_debug(int timeout, struct list_head *result_up);
extern int lstcon_session_feats_check(unsigned feats);
extern int lstcon_batch_debug(int timeout, char *name,
			      int client, struct list_head *result_up);
extern int lstcon_group_debug(int timeout, char *name,
			      struct list_head *result_up);
extern int lstcon_nodes_debug(int timeout, int nnd, lnet_process_id_t *nds_up,
			      struct list_head *result_up);
extern int lstcon_group_add(char *name);
extern int lstcon_group_del(char *name);
extern int lstcon_group_clean(char *name, int args);
extern int lstcon_group_refresh(char *name, struct list_head *result_up);
extern int lstcon_nodes_add(char *name, int nnd, lnet_process_id_t *nds_up,
			    unsigned *featp, struct list_head *result_up);
extern int lstcon_nodes_remove(char *name, int nnd, lnet_process_id_t *nds_up,
			       struct list_head *result_up);
extern int lstcon_group_info(char *name, lstcon_ndlist_ent_t *gent_up,
			     int *index_p, int *ndent_p, lstcon_node_ent_t *ndents_up);
extern int lstcon_group_list(int idx, int len, char *name_up);
extern int lstcon_batch_add(char *name);
extern int lstcon_batch_run(char *name, int timeout,
			    struct list_head *result_up);
extern int lstcon_batch_stop(char *name, int force,
			     struct list_head *result_up);
extern int lstcon_test_batch_query(char *name, int testidx,
				   int client, int timeout,
				   struct list_head *result_up);
extern int lstcon_batch_del(char *name);
extern int lstcon_batch_list(int idx, int namelen, char *name_up);
extern int lstcon_batch_info(char *name, lstcon_test_batch_ent_t *ent_up,
			     int server, int testidx, int *index_p,
			     int *ndent_p, lstcon_node_ent_t *dents_up);
extern int lstcon_group_stat(char *grp_name, int timeout,
			     struct list_head *result_up);
extern int lstcon_nodes_stat(int count, lnet_process_id_t *ids_up,
			     int timeout, struct list_head *result_up);
extern int lstcon_test_add(char *batch_name, int type, int loop,
			   int concur, int dist, int span,
			   char *src_name, char *dst_name,
			   void *param, int paramlen, int *retp,
			   struct list_head *result_up);
#endif
