/*
 * 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.gnu.org/licenses/gpl-2.0.html
 *
 * GPL HEADER END
 */
/*
 * Copyright (c) 2007, 2010, Oracle and/or its affiliates. All rights reserved.
 * Use is subject to license terms.
 *
 * Copyright (c) 2011, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 *
 * /lnet/selftest/conrpc.h
 *
 * Console rpc
 *
 * Author: Liang Zhen <liang@whamcloud.com>
 */

#ifndef __LST_CONRPC_H__
#define __LST_CONRPC_H__

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

/* Console rpc and rpc transaction */
#define LST_TRANS_TIMEOUT	30
#define LST_TRANS_MIN_TIMEOUT	3

#define LST_VALIDATE_TIMEOUT(t) min(max(t, LST_TRANS_MIN_TIMEOUT), LST_TRANS_TIMEOUT)

#define LST_PING_INTERVAL	8

struct lstcon_rpc_trans;
struct lstcon_tsb_hdr;
struct lstcon_test;
struct lstcon_node;

struct lstcon_rpc {
	struct list_head	 crp_link;	/* chain on rpc transaction */
	struct srpc_client_rpc	*crp_rpc;	/* client rpc */
	struct lstcon_node	*crp_node;	/* destination node */
	struct lstcon_rpc_trans *crp_trans;	/* conrpc transaction */

	unsigned int		 crp_posted:1;	/* rpc is posted */
	unsigned int		 crp_finished:1; /* rpc is finished */
	unsigned int		 crp_unpacked:1; /* reply is unpacked */
	/** RPC is embedded in other structure and can't free it */
	unsigned int		 crp_embedded:1;
	int			 crp_status;	/* console rpc errors */
	unsigned long		 crp_stamp;	/* replied time stamp */
};

struct lstcon_rpc_trans {
	struct list_head  tas_olink;	     /* link chain on owner list */
	struct list_head  tas_link;	     /* link chain on global list */
	int		  tas_opc;	     /* operation code of transaction */
	unsigned int	  tas_feats_updated; /* features mask is uptodate */
	unsigned int	  tas_features;      /* test features mask */
	wait_queue_head_t tas_waitq;	     /* wait queue head */
	atomic_t	  tas_remaining;     /* # of un-scheduled rpcs */
	struct list_head  tas_rpcs_list;     /* queued requests */
};

#define LST_TRANS_PRIVATE	0x1000

#define LST_TRANS_SESNEW	(LST_TRANS_PRIVATE | 0x01)
#define LST_TRANS_SESEND	(LST_TRANS_PRIVATE | 0x02)
#define LST_TRANS_SESQRY	0x03
#define LST_TRANS_SESPING	0x04

#define LST_TRANS_TSBCLIADD	(LST_TRANS_PRIVATE | 0x11)
#define LST_TRANS_TSBSRVADD	(LST_TRANS_PRIVATE | 0x12)
#define LST_TRANS_TSBRUN	(LST_TRANS_PRIVATE | 0x13)
#define LST_TRANS_TSBSTOP	(LST_TRANS_PRIVATE | 0x14)
#define LST_TRANS_TSBCLIQRY	0x15
#define LST_TRANS_TSBSRVQRY	0x16

#define LST_TRANS_STATQRY	0x21

typedef int (*lstcon_rpc_cond_func_t)(int, struct lstcon_node *, void *);
typedef int (*lstcon_rpc_readent_func_t)(int, struct srpc_msg *,
					 struct lstcon_rpc_ent __user *);

int  lstcon_sesrpc_prep(struct lstcon_node *nd, int transop,
			unsigned int version, struct lstcon_rpc **crpc);
int  lstcon_dbgrpc_prep(struct lstcon_node *nd,
			unsigned int version, struct lstcon_rpc **crpc);
int  lstcon_batrpc_prep(struct lstcon_node *nd, int transop,
			unsigned int version, struct lstcon_tsb_hdr *tsb,
			struct lstcon_rpc **crpc);
int  lstcon_testrpc_prep(struct lstcon_node *nd, int transop,
			 unsigned int version, struct lstcon_test *test,
			 struct lstcon_rpc **crpc);
int  lstcon_statrpc_prep(struct lstcon_node *nd, unsigned int version,
			 struct lstcon_rpc **crpc);
void lstcon_rpc_put(struct lstcon_rpc *crpc);
int  lstcon_rpc_trans_prep(struct list_head *translist,
			   int transop, struct lstcon_rpc_trans **transpp);
int  lstcon_rpc_trans_ndlist(struct list_head *ndlist,
			     struct list_head *translist, int transop,
			     void *arg, lstcon_rpc_cond_func_t condition,
			     struct lstcon_rpc_trans **transpp);
void lstcon_rpc_trans_stat(struct lstcon_rpc_trans *trans,
			   struct lstcon_trans_stat *stat);
int  lstcon_rpc_trans_interpreter(struct lstcon_rpc_trans *trans,
				  struct list_head __user *head_up,
				  lstcon_rpc_readent_func_t readent);
void lstcon_rpc_trans_abort(struct lstcon_rpc_trans *trans, int error);
void lstcon_rpc_trans_destroy(struct lstcon_rpc_trans *trans);
void lstcon_rpc_trans_addreq(struct lstcon_rpc_trans *trans,
			     struct lstcon_rpc *req);
int  lstcon_rpc_trans_postwait(struct lstcon_rpc_trans *trans, int timeout);
int  lstcon_rpc_pinger_start(void);
void lstcon_rpc_pinger_stop(void);
void lstcon_rpc_cleanup_wait(void);
int  lstcon_rpc_module_init(void);
void lstcon_rpc_module_fini(void);

#endif
