/*
 * 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) 2012, Intel Corporation.
 */
/*
 * This file is part of Lustre, http://www.lustre.org/
 * Lustre is a trademark of Sun Microsystems, Inc.
 */

#ifndef _LUSTRE_SEC_H_
#define _LUSTRE_SEC_H_

/** \defgroup sptlrpc sptlrpc
 *
 * @{
 */

/*
 * to avoid include
 */
struct obd_import;
struct obd_export;
struct ptlrpc_request;
struct ptlrpc_reply_state;
struct ptlrpc_bulk_desc;
struct brw_page;
/* Linux specific */
struct key;
struct seq_file;

/*
 * forward declaration
 */
struct ptlrpc_sec_policy;
struct ptlrpc_sec_cops;
struct ptlrpc_sec_sops;
struct ptlrpc_sec;
struct ptlrpc_svc_ctx;
struct ptlrpc_cli_ctx;
struct ptlrpc_ctx_ops;

/**
 * \addtogroup flavor flavor
 *
 * RPC flavor is represented by a 32 bits integer. Currently the high 12 bits
 * are unused, must be set to 0 for future expansion.
 * <pre>
 * ------------------------------------------------------------------------
 * | 4b (bulk svc) | 4b (bulk type) | 4b (svc) | 4b (mech)  | 4b (policy) |
 * ------------------------------------------------------------------------
 * </pre>
 *
 * @{
 */

/*
 * flavor constants
 */
enum sptlrpc_policy {
	SPTLRPC_POLICY_NULL	     = 0,
	SPTLRPC_POLICY_PLAIN	    = 1,
	SPTLRPC_POLICY_GSS	      = 2,
	SPTLRPC_POLICY_MAX,
};

enum sptlrpc_mech_null {
	SPTLRPC_MECH_NULL	       = 0,
	SPTLRPC_MECH_NULL_MAX,
};

enum sptlrpc_mech_plain {
	SPTLRPC_MECH_PLAIN	      = 0,
	SPTLRPC_MECH_PLAIN_MAX,
};

enum sptlrpc_mech_gss {
	SPTLRPC_MECH_GSS_NULL	   = 0,
	SPTLRPC_MECH_GSS_KRB5	   = 1,
	SPTLRPC_MECH_GSS_MAX,
};

enum sptlrpc_service_type {
	SPTLRPC_SVC_NULL		= 0,    /**< no security */
	SPTLRPC_SVC_AUTH		= 1,    /**< authentication only */
	SPTLRPC_SVC_INTG		= 2,    /**< integrity */
	SPTLRPC_SVC_PRIV		= 3,    /**< privacy */
	SPTLRPC_SVC_MAX,
};

enum sptlrpc_bulk_type {
	SPTLRPC_BULK_DEFAULT	    = 0,    /**< follow rpc flavor */
	SPTLRPC_BULK_HASH	       = 1,    /**< hash integrity */
	SPTLRPC_BULK_MAX,
};

enum sptlrpc_bulk_service {
	SPTLRPC_BULK_SVC_NULL	   = 0,    /**< no security */
	SPTLRPC_BULK_SVC_AUTH	   = 1,    /**< authentication only */
	SPTLRPC_BULK_SVC_INTG	   = 2,    /**< integrity */
	SPTLRPC_BULK_SVC_PRIV	   = 3,    /**< privacy */
	SPTLRPC_BULK_SVC_MAX,
};

/*
 * compose/extract macros
 */
#define FLVR_POLICY_OFFSET	      (0)
#define FLVR_MECH_OFFSET		(4)
#define FLVR_SVC_OFFSET		 (8)
#define FLVR_BULK_TYPE_OFFSET	   (12)
#define FLVR_BULK_SVC_OFFSET	    (16)

#define MAKE_FLVR(policy, mech, svc, btype, bsvc)		       \
	(((__u32)(policy) << FLVR_POLICY_OFFSET) |		      \
	 ((__u32)(mech) << FLVR_MECH_OFFSET) |			  \
	 ((__u32)(svc) << FLVR_SVC_OFFSET) |			    \
	 ((__u32)(btype) << FLVR_BULK_TYPE_OFFSET) |		    \
	 ((__u32)(bsvc) << FLVR_BULK_SVC_OFFSET))

/*
 * extraction
 */
#define SPTLRPC_FLVR_POLICY(flavor)				     \
	((((__u32)(flavor)) >> FLVR_POLICY_OFFSET) & 0xF)
#define SPTLRPC_FLVR_MECH(flavor)				       \
	((((__u32)(flavor)) >> FLVR_MECH_OFFSET) & 0xF)
#define SPTLRPC_FLVR_SVC(flavor)					\
	((((__u32)(flavor)) >> FLVR_SVC_OFFSET) & 0xF)
#define SPTLRPC_FLVR_BULK_TYPE(flavor)				  \
	((((__u32)(flavor)) >> FLVR_BULK_TYPE_OFFSET) & 0xF)
#define SPTLRPC_FLVR_BULK_SVC(flavor)				   \
	((((__u32)(flavor)) >> FLVR_BULK_SVC_OFFSET) & 0xF)

#define SPTLRPC_FLVR_BASE(flavor)				       \
	((((__u32)(flavor)) >> FLVR_POLICY_OFFSET) & 0xFFF)
#define SPTLRPC_FLVR_BASE_SUB(flavor)				   \
	((((__u32)(flavor)) >> FLVR_MECH_OFFSET) & 0xFF)

/*
 * gss subflavors
 */
#define MAKE_BASE_SUBFLVR(mech, svc)				    \
	((__u32)(mech) |						\
	 ((__u32)(svc) << (FLVR_SVC_OFFSET - FLVR_MECH_OFFSET)))

#define SPTLRPC_SUBFLVR_KRB5N					   \
	MAKE_BASE_SUBFLVR(SPTLRPC_MECH_GSS_KRB5, SPTLRPC_SVC_NULL)
#define SPTLRPC_SUBFLVR_KRB5A					   \
	MAKE_BASE_SUBFLVR(SPTLRPC_MECH_GSS_KRB5, SPTLRPC_SVC_AUTH)
#define SPTLRPC_SUBFLVR_KRB5I					   \
	MAKE_BASE_SUBFLVR(SPTLRPC_MECH_GSS_KRB5, SPTLRPC_SVC_INTG)
#define SPTLRPC_SUBFLVR_KRB5P					   \
	MAKE_BASE_SUBFLVR(SPTLRPC_MECH_GSS_KRB5, SPTLRPC_SVC_PRIV)

/*
 * "end user" flavors
 */
#define SPTLRPC_FLVR_NULL			       \
	MAKE_FLVR(SPTLRPC_POLICY_NULL,		  \
		  SPTLRPC_MECH_NULL,		    \
		  SPTLRPC_SVC_NULL,		     \
		  SPTLRPC_BULK_DEFAULT,		 \
		  SPTLRPC_BULK_SVC_NULL)
#define SPTLRPC_FLVR_PLAIN			      \
	MAKE_FLVR(SPTLRPC_POLICY_PLAIN,		 \
		  SPTLRPC_MECH_PLAIN,		   \
		  SPTLRPC_SVC_NULL,		     \
		  SPTLRPC_BULK_HASH,		    \
		  SPTLRPC_BULK_SVC_INTG)
#define SPTLRPC_FLVR_KRB5N			      \
	MAKE_FLVR(SPTLRPC_POLICY_GSS,		   \
		  SPTLRPC_MECH_GSS_KRB5,		\
		  SPTLRPC_SVC_NULL,		     \
		  SPTLRPC_BULK_DEFAULT,		 \
		  SPTLRPC_BULK_SVC_NULL)
#define SPTLRPC_FLVR_KRB5A			      \
	MAKE_FLVR(SPTLRPC_POLICY_GSS,		   \
		  SPTLRPC_MECH_GSS_KRB5,		\
		  SPTLRPC_SVC_AUTH,		     \
		  SPTLRPC_BULK_DEFAULT,		 \
		  SPTLRPC_BULK_SVC_NULL)
#define SPTLRPC_FLVR_KRB5I			      \
	MAKE_FLVR(SPTLRPC_POLICY_GSS,		   \
		  SPTLRPC_MECH_GSS_KRB5,		\
		  SPTLRPC_SVC_INTG,		     \
		  SPTLRPC_BULK_DEFAULT,		 \
		  SPTLRPC_BULK_SVC_INTG)
#define SPTLRPC_FLVR_KRB5P			      \
	MAKE_FLVR(SPTLRPC_POLICY_GSS,		   \
		  SPTLRPC_MECH_GSS_KRB5,		\
		  SPTLRPC_SVC_PRIV,		     \
		  SPTLRPC_BULK_DEFAULT,		 \
		  SPTLRPC_BULK_SVC_PRIV)

#define SPTLRPC_FLVR_DEFAULT	    SPTLRPC_FLVR_NULL

#define SPTLRPC_FLVR_INVALID	    ((__u32) 0xFFFFFFFF)
#define SPTLRPC_FLVR_ANY		((__u32) 0xFFF00000)

/**
 * extract the useful part from wire flavor
 */
#define WIRE_FLVR(wflvr)		(((__u32) (wflvr)) & 0x000FFFFF)

/** @} flavor */

static inline void flvr_set_svc(__u32 *flvr, __u32 svc)
{
	LASSERT(svc < SPTLRPC_SVC_MAX);
	*flvr = MAKE_FLVR(SPTLRPC_FLVR_POLICY(*flvr),
			  SPTLRPC_FLVR_MECH(*flvr),
			  svc,
			  SPTLRPC_FLVR_BULK_TYPE(*flvr),
			  SPTLRPC_FLVR_BULK_SVC(*flvr));
}

static inline void flvr_set_bulk_svc(__u32 *flvr, __u32 svc)
{
	LASSERT(svc < SPTLRPC_BULK_SVC_MAX);
	*flvr = MAKE_FLVR(SPTLRPC_FLVR_POLICY(*flvr),
			  SPTLRPC_FLVR_MECH(*flvr),
			  SPTLRPC_FLVR_SVC(*flvr),
			  SPTLRPC_FLVR_BULK_TYPE(*flvr),
			  svc);
}

struct bulk_spec_hash {
	__u8    hash_alg;
};

/**
 * Full description of flavors being used on a ptlrpc connection, include
 * both regular RPC and bulk transfer parts.
 */
struct sptlrpc_flavor {
	/**
	 * wire flavor, should be renamed to sf_wire.
	 */
	__u32   sf_rpc;
	/**
	 * general flags of PTLRPC_SEC_FL_*
	 */
	__u32   sf_flags;
	/**
	 * rpc flavor specification
	 */
	union {
		/* nothing for now */
	} u_rpc;
	/**
	 * bulk flavor specification
	 */
	union {
		struct bulk_spec_hash hash;
	} u_bulk;
};

/**
 * identify the RPC is generated from what part of Lustre. It's encoded into
 * RPC requests and to be checked by ptlrpc service.
 */
enum lustre_sec_part {
	LUSTRE_SP_CLI	   = 0,
	LUSTRE_SP_MDT,
	LUSTRE_SP_OST,
	LUSTRE_SP_MGC,
	LUSTRE_SP_MGS,
	LUSTRE_SP_ANY	   = 0xFF
};

enum lustre_sec_part sptlrpc_target_sec_part(struct obd_device *obd);

/**
 * A rule specifies a flavor to be used by a ptlrpc connection between
 * two Lustre parts.
 */
struct sptlrpc_rule {
	__u32		   sr_netid;   /* LNET network ID */
	__u8		    sr_from;    /* sec_part */
	__u8		    sr_to;      /* sec_part */
	__u16		   sr_padding;
	struct sptlrpc_flavor   sr_flvr;
};

/**
 * A set of rules in memory.
 *
 * Rules are generated and stored on MGS, and propagated to MDT, OST,
 * and client when needed.
 */
struct sptlrpc_rule_set {
	int		     srs_nslot;
	int		     srs_nrule;
	struct sptlrpc_rule    *srs_rules;
};

int sptlrpc_parse_flavor(const char *str, struct sptlrpc_flavor *flvr);
bool sptlrpc_flavor_has_bulk(struct sptlrpc_flavor *flvr);

static inline void sptlrpc_rule_set_init(struct sptlrpc_rule_set *set)
{
	memset(set, 0, sizeof(*set));
}

int  sptlrpc_process_config(struct lustre_cfg *lcfg);
void sptlrpc_conf_log_start(const char *logname);
void sptlrpc_conf_log_stop(const char *logname);
void sptlrpc_conf_log_update_begin(const char *logname);
void sptlrpc_conf_log_update_end(const char *logname);
void sptlrpc_conf_client_adapt(struct obd_device *obd);

/* The maximum length of security payload. 1024 is enough for Kerberos 5,
 * and should be enough for other future mechanisms but not sure.
 * Only used by pre-allocated request/reply pool.
 */
#define SPTLRPC_MAX_PAYLOAD     (1024)

struct vfs_cred {
	uint32_t	vc_uid;
	uint32_t	vc_gid;
};

struct ptlrpc_ctx_ops {
	/**
	 * To determine whether it's suitable to use the \a ctx for \a vcred.
	 */
	int     (*match)       (struct ptlrpc_cli_ctx *ctx,
				struct vfs_cred *vcred);

	/**
	 * To bring the \a ctx uptodate.
	 */
	int     (*refresh)     (struct ptlrpc_cli_ctx *ctx);

	/**
	 * Validate the \a ctx.
	 */
	int     (*validate)    (struct ptlrpc_cli_ctx *ctx);

	/**
	 * Force the \a ctx to die.
	 */
	void    (*force_die)   (struct ptlrpc_cli_ctx *ctx,
				int grace);
	int     (*display)     (struct ptlrpc_cli_ctx *ctx,
				char *buf, int bufsize);

	/**
	 * Sign the request message using \a ctx.
	 *
	 * \pre req->rq_reqmsg point to request message.
	 * \pre req->rq_reqlen is the request message length.
	 * \post req->rq_reqbuf point to request message with signature.
	 * \post req->rq_reqdata_len is set to the final request message size.
	 *
	 * \see null_ctx_sign(), plain_ctx_sign(), gss_cli_ctx_sign().
	 */
	int     (*sign)	(struct ptlrpc_cli_ctx *ctx,
				struct ptlrpc_request *req);

	/**
	 * Verify the reply message using \a ctx.
	 *
	 * \pre req->rq_repdata point to reply message with signature.
	 * \pre req->rq_repdata_len is the total reply message length.
	 * \post req->rq_repmsg point to reply message without signature.
	 * \post req->rq_replen is the reply message length.
	 *
	 * \see null_ctx_verify(), plain_ctx_verify(), gss_cli_ctx_verify().
	 */
	int     (*verify)      (struct ptlrpc_cli_ctx *ctx,
				struct ptlrpc_request *req);

	/**
	 * Encrypt the request message using \a ctx.
	 *
	 * \pre req->rq_reqmsg point to request message in clear text.
	 * \pre req->rq_reqlen is the request message length.
	 * \post req->rq_reqbuf point to request message.
	 * \post req->rq_reqdata_len is set to the final request message size.
	 *
	 * \see gss_cli_ctx_seal().
	 */
	int     (*seal)	(struct ptlrpc_cli_ctx *ctx,
				struct ptlrpc_request *req);

	/**
	 * Decrypt the reply message using \a ctx.
	 *
	 * \pre req->rq_repdata point to encrypted reply message.
	 * \pre req->rq_repdata_len is the total cipher text length.
	 * \post req->rq_repmsg point to reply message in clear text.
	 * \post req->rq_replen is the reply message length in clear text.
	 *
	 * \see gss_cli_ctx_unseal().
	 */
	int     (*unseal)      (struct ptlrpc_cli_ctx *ctx,
				struct ptlrpc_request *req);

	/**
	 * Wrap bulk request data. This is called before wrapping RPC
	 * request message.
	 *
	 * \pre bulk buffer is descripted by desc->bd_iov and
	 * desc->bd_iov_count. note for read it's just buffer, no data
	 * need to be sent;  for write it contains data in clear text.
	 * \post when necessary, ptlrpc_bulk_sec_desc was properly prepared
	 * (usually inside of RPC request message).
	 * - encryption: cipher text bulk buffer is descripted by
	 *   desc->bd_enc_iov and desc->bd_iov_count (currently assume iov
	 *   count remains the same).
	 * - otherwise: bulk buffer is still desc->bd_iov and
	 *   desc->bd_iov_count.
	 *
	 * \return 0: success.
	 * \return -ev: error code.
	 *
	 * \see plain_cli_wrap_bulk(), gss_cli_ctx_wrap_bulk().
	 */
	int     (*wrap_bulk)   (struct ptlrpc_cli_ctx *ctx,
				struct ptlrpc_request *req,
				struct ptlrpc_bulk_desc *desc);

	/**
	 * Unwrap bulk reply data. This is called after wrapping RPC
	 * reply message.
	 *
	 * \pre bulk buffer is descripted by desc->bd_iov/desc->bd_enc_iov and
	 * desc->bd_iov_count, according to wrap_bulk().
	 * \post final bulk data in clear text is placed in buffer described
	 * by desc->bd_iov and desc->bd_iov_count.
	 * \return +ve nob of actual bulk data in clear text.
	 * \return -ve error code.
	 *
	 * \see plain_cli_unwrap_bulk(), gss_cli_ctx_unwrap_bulk().
	 */
	int     (*unwrap_bulk) (struct ptlrpc_cli_ctx *ctx,
				struct ptlrpc_request *req,
				struct ptlrpc_bulk_desc *desc);
};

#define PTLRPC_CTX_NEW_BIT	     (0)  /* newly created */
#define PTLRPC_CTX_UPTODATE_BIT	(1)  /* uptodate */
#define PTLRPC_CTX_DEAD_BIT	    (2)  /* mark expired gracefully */
#define PTLRPC_CTX_ERROR_BIT	   (3)  /* fatal error (refresh, etc.) */
#define PTLRPC_CTX_CACHED_BIT	  (8)  /* in ctx cache (hash etc.) */
#define PTLRPC_CTX_ETERNAL_BIT	 (9)  /* always valid */

#define PTLRPC_CTX_NEW		 (1 << PTLRPC_CTX_NEW_BIT)
#define PTLRPC_CTX_UPTODATE	    (1 << PTLRPC_CTX_UPTODATE_BIT)
#define PTLRPC_CTX_DEAD		(1 << PTLRPC_CTX_DEAD_BIT)
#define PTLRPC_CTX_ERROR	       (1 << PTLRPC_CTX_ERROR_BIT)
#define PTLRPC_CTX_CACHED	      (1 << PTLRPC_CTX_CACHED_BIT)
#define PTLRPC_CTX_ETERNAL	     (1 << PTLRPC_CTX_ETERNAL_BIT)

#define PTLRPC_CTX_STATUS_MASK	 (PTLRPC_CTX_NEW_BIT    |       \
					PTLRPC_CTX_UPTODATE   |       \
					PTLRPC_CTX_DEAD       |       \
					PTLRPC_CTX_ERROR)

struct ptlrpc_cli_ctx {
	struct hlist_node	cc_cache;      /* linked into ctx cache */
	atomic_t	    cc_refcount;
	struct ptlrpc_sec      *cc_sec;
	struct ptlrpc_ctx_ops  *cc_ops;
	unsigned long	      cc_expire;     /* in seconds */
	unsigned int	    cc_early_expire:1;
	unsigned long	   cc_flags;
	struct vfs_cred	 cc_vcred;
	spinlock_t		cc_lock;
	struct list_head	      cc_req_list;   /* waiting reqs linked here */
	struct list_head	      cc_gc_chain;   /* linked to gc chain */
};

/**
 * client side policy operation vector.
 */
struct ptlrpc_sec_cops {
	/**
	 * Given an \a imp, create and initialize a ptlrpc_sec structure.
	 * \param ctx service context:
	 * - regular import: \a ctx should be NULL;
	 * - reverse import: \a ctx is obtained from incoming request.
	 * \param flavor specify what flavor to use.
	 *
	 * When necessary, policy module is responsible for taking reference
	 * on the import.
	 *
	 * \see null_create_sec(), plain_create_sec(), gss_sec_create_kr().
	 */
	struct ptlrpc_sec *     (*create_sec)  (struct obd_import *imp,
						struct ptlrpc_svc_ctx *ctx,
						struct sptlrpc_flavor *flavor);

	/**
	 * Destructor of ptlrpc_sec. When called, refcount has been dropped
	 * to 0 and all contexts has been destroyed.
	 *
	 * \see null_destroy_sec(), plain_destroy_sec(), gss_sec_destroy_kr().
	 */
	void		    (*destroy_sec) (struct ptlrpc_sec *sec);

	/**
	 * Notify that this ptlrpc_sec is going to die. Optionally, policy
	 * module is supposed to set sec->ps_dying and whatever necessary
	 * actions.
	 *
	 * \see plain_kill_sec(), gss_sec_kill().
	 */
	void		    (*kill_sec)    (struct ptlrpc_sec *sec);

	/**
	 * Given \a vcred, lookup and/or create its context. The policy module
	 * is supposed to maintain its own context cache.
	 * XXX currently \a create and \a remove_dead is always 1, perhaps
	 * should be removed completely.
	 *
	 * \see null_lookup_ctx(), plain_lookup_ctx(), gss_sec_lookup_ctx_kr().
	 */
	struct ptlrpc_cli_ctx * (*lookup_ctx)  (struct ptlrpc_sec *sec,
						struct vfs_cred *vcred,
						int create,
						int remove_dead);

	/**
	 * Called then the reference of \a ctx dropped to 0. The policy module
	 * is supposed to destroy this context or whatever else according to
	 * its cache maintenance mechanism.
	 *
	 * \param sync if zero, we shouldn't wait for the context being
	 * destroyed completely.
	 *
	 * \see plain_release_ctx(), gss_sec_release_ctx_kr().
	 */
	void		    (*release_ctx) (struct ptlrpc_sec *sec,
						struct ptlrpc_cli_ctx *ctx,
						int sync);

	/**
	 * Flush the context cache.
	 *
	 * \param uid context of which user, -1 means all contexts.
	 * \param grace if zero, the PTLRPC_CTX_UPTODATE_BIT of affected
	 * contexts should be cleared immediately.
	 * \param force if zero, only idle contexts will be flushed.
	 *
	 * \see plain_flush_ctx_cache(), gss_sec_flush_ctx_cache_kr().
	 */
	int		     (*flush_ctx_cache)
					       (struct ptlrpc_sec *sec,
						uid_t uid,
						int grace,
						int force);

	/**
	 * Called periodically by garbage collector to remove dead contexts
	 * from cache.
	 *
	 * \see gss_sec_gc_ctx_kr().
	 */
	void		    (*gc_ctx)      (struct ptlrpc_sec *sec);

	/**
	 * Given an context \a ctx, install a corresponding reverse service
	 * context on client side.
	 * XXX currently it's only used by GSS module, maybe we should remove
	 * this from general API.
	 */
	int		     (*install_rctx)(struct obd_import *imp,
						struct ptlrpc_sec *sec,
						struct ptlrpc_cli_ctx *ctx);

	/**
	 * To allocate request buffer for \a req.
	 *
	 * \pre req->rq_reqmsg == NULL.
	 * \pre req->rq_reqbuf == NULL, otherwise it must be pre-allocated,
	 * we are not supposed to free it.
	 * \post if success, req->rq_reqmsg point to a buffer with size
	 * at least \a lustre_msg_size.
	 *
	 * \see null_alloc_reqbuf(), plain_alloc_reqbuf(), gss_alloc_reqbuf().
	 */
	int		     (*alloc_reqbuf)(struct ptlrpc_sec *sec,
						struct ptlrpc_request *req,
						int lustre_msg_size);

	/**
	 * To free request buffer for \a req.
	 *
	 * \pre req->rq_reqbuf != NULL.
	 *
	 * \see null_free_reqbuf(), plain_free_reqbuf(), gss_free_reqbuf().
	 */
	void		    (*free_reqbuf) (struct ptlrpc_sec *sec,
						struct ptlrpc_request *req);

	/**
	 * To allocate reply buffer for \a req.
	 *
	 * \pre req->rq_repbuf == NULL.
	 * \post if success, req->rq_repbuf point to a buffer with size
	 * req->rq_repbuf_len, the size should be large enough to receive
	 * reply which be transformed from \a lustre_msg_size of clear text.
	 *
	 * \see null_alloc_repbuf(), plain_alloc_repbuf(), gss_alloc_repbuf().
	 */
	int		     (*alloc_repbuf)(struct ptlrpc_sec *sec,
						struct ptlrpc_request *req,
						int lustre_msg_size);

	/**
	 * To free reply buffer for \a req.
	 *
	 * \pre req->rq_repbuf != NULL.
	 * \post req->rq_repbuf == NULL.
	 * \post req->rq_repbuf_len == 0.
	 *
	 * \see null_free_repbuf(), plain_free_repbuf(), gss_free_repbuf().
	 */
	void		    (*free_repbuf) (struct ptlrpc_sec *sec,
						struct ptlrpc_request *req);

	/**
	 * To expand the request buffer of \a req, thus the \a segment in
	 * the request message pointed by req->rq_reqmsg can accommodate
	 * at least \a newsize of data.
	 *
	 * \pre req->rq_reqmsg->lm_buflens[segment] < newsize.
	 *
	 * \see null_enlarge_reqbuf(), plain_enlarge_reqbuf(),
	 * gss_enlarge_reqbuf().
	 */
	int		     (*enlarge_reqbuf)
					       (struct ptlrpc_sec *sec,
						struct ptlrpc_request *req,
						int segment, int newsize);
	/*
	 * misc
	 */
	int		     (*display)     (struct ptlrpc_sec *sec,
						struct seq_file *seq);
};

/**
 * server side policy operation vector.
 */
struct ptlrpc_sec_sops {
	/**
	 * verify an incoming request.
	 *
	 * \pre request message is pointed by req->rq_reqbuf, size is
	 * req->rq_reqdata_len; and the message has been unpacked to
	 * host byte order.
	 *
	 * \retval SECSVC_OK success, req->rq_reqmsg point to request message
	 * in clear text, size is req->rq_reqlen; req->rq_svc_ctx is set;
	 * req->rq_sp_from is decoded from request.
	 * \retval SECSVC_COMPLETE success, the request has been fully
	 * processed, and reply message has been prepared; req->rq_sp_from is
	 * decoded from request.
	 * \retval SECSVC_DROP failed, this request should be dropped.
	 *
	 * \see null_accept(), plain_accept(), gss_svc_accept_kr().
	 */
	int		     (*accept)      (struct ptlrpc_request *req);

	/**
	 * Perform security transformation upon reply message.
	 *
	 * \pre reply message is pointed by req->rq_reply_state->rs_msg, size
	 * is req->rq_replen.
	 * \post req->rs_repdata_len is the final message size.
	 * \post req->rq_reply_off is set.
	 *
	 * \see null_authorize(), plain_authorize(), gss_svc_authorize().
	 */
	int		     (*authorize)   (struct ptlrpc_request *req);

	/**
	 * Invalidate server context \a ctx.
	 *
	 * \see gss_svc_invalidate_ctx().
	 */
	void		    (*invalidate_ctx)
					       (struct ptlrpc_svc_ctx *ctx);

	/**
	 * Allocate a ptlrpc_reply_state.
	 *
	 * \param msgsize size of the reply message in clear text.
	 * \pre if req->rq_reply_state != NULL, then it's pre-allocated, we
	 * should simply use it; otherwise we'll responsible for allocating
	 * a new one.
	 * \post req->rq_reply_state != NULL;
	 * \post req->rq_reply_state->rs_msg != NULL;
	 *
	 * \see null_alloc_rs(), plain_alloc_rs(), gss_svc_alloc_rs().
	 */
	int		     (*alloc_rs)    (struct ptlrpc_request *req,
						int msgsize);

	/**
	 * Free a ptlrpc_reply_state.
	 */
	void		    (*free_rs)     (struct ptlrpc_reply_state *rs);

	/**
	 * Release the server context \a ctx.
	 *
	 * \see gss_svc_free_ctx().
	 */
	void		    (*free_ctx)    (struct ptlrpc_svc_ctx *ctx);

	/**
	 * Install a reverse context based on the server context \a ctx.
	 *
	 * \see gss_svc_install_rctx_kr().
	 */
	int		     (*install_rctx)(struct obd_import *imp,
						struct ptlrpc_svc_ctx *ctx);

	/**
	 * Prepare buffer for incoming bulk write.
	 *
	 * \pre desc->bd_iov and desc->bd_iov_count describes the buffer
	 * intended to receive the write.
	 *
	 * \see gss_svc_prep_bulk().
	 */
	int		     (*prep_bulk)   (struct ptlrpc_request *req,
						struct ptlrpc_bulk_desc *desc);

	/**
	 * Unwrap the bulk write data.
	 *
	 * \see plain_svc_unwrap_bulk(), gss_svc_unwrap_bulk().
	 */
	int		     (*unwrap_bulk) (struct ptlrpc_request *req,
						struct ptlrpc_bulk_desc *desc);

	/**
	 * Wrap the bulk read data.
	 *
	 * \see plain_svc_wrap_bulk(), gss_svc_wrap_bulk().
	 */
	int		     (*wrap_bulk)   (struct ptlrpc_request *req,
						struct ptlrpc_bulk_desc *desc);
};

struct ptlrpc_sec_policy {
	struct module		   *sp_owner;
	char			   *sp_name;
	__u16			   sp_policy; /* policy number */
	struct ptlrpc_sec_cops	 *sp_cops;   /* client ops */
	struct ptlrpc_sec_sops	 *sp_sops;   /* server ops */
};

#define PTLRPC_SEC_FL_REVERSE	   0x0001 /* reverse sec */
#define PTLRPC_SEC_FL_ROOTONLY	  0x0002 /* treat everyone as root */
#define PTLRPC_SEC_FL_UDESC	     0x0004 /* ship udesc */
#define PTLRPC_SEC_FL_BULK	      0x0008 /* intensive bulk i/o expected */
#define PTLRPC_SEC_FL_PAG	       0x0010 /* PAG mode */

/**
 * The ptlrpc_sec represents the client side ptlrpc security facilities,
 * each obd_import (both regular and reverse import) must associate with
 * a ptlrpc_sec.
 *
 * \see sptlrpc_import_sec_adapt().
 */
struct ptlrpc_sec {
	struct ptlrpc_sec_policy       *ps_policy;
	atomic_t		    ps_refcount;
	/** statistic only */
	atomic_t		    ps_nctx;
	/** unique identifier */
	int			     ps_id;
	struct sptlrpc_flavor	   ps_flvr;
	enum lustre_sec_part	    ps_part;
	/** after set, no more new context will be created */
	unsigned int		    ps_dying:1;
	/** owning import */
	struct obd_import	      *ps_import;
	spinlock_t			ps_lock;

	/*
	 * garbage collection
	 */
	struct list_head		      ps_gc_list;
	unsigned long		      ps_gc_interval; /* in seconds */
	time64_t		      ps_gc_next;     /* in seconds */
};

static inline int sec_is_reverse(struct ptlrpc_sec *sec)
{
	return (sec->ps_flvr.sf_flags & PTLRPC_SEC_FL_REVERSE);
}

static inline int sec_is_rootonly(struct ptlrpc_sec *sec)
{
	return (sec->ps_flvr.sf_flags & PTLRPC_SEC_FL_ROOTONLY);
}

struct ptlrpc_svc_ctx {
	atomic_t		    sc_refcount;
	struct ptlrpc_sec_policy       *sc_policy;
};

/*
 * user identity descriptor
 */
#define LUSTRE_MAX_GROUPS	       (128)

struct ptlrpc_user_desc {
	__u32	   pud_uid;
	__u32	   pud_gid;
	__u32	   pud_fsuid;
	__u32	   pud_fsgid;
	__u32	   pud_cap;
	__u32	   pud_ngroups;
	__u32	   pud_groups[0];
};

/*
 * bulk flavors
 */
enum sptlrpc_bulk_hash_alg {
	BULK_HASH_ALG_NULL      = 0,
	BULK_HASH_ALG_ADLER32,
	BULK_HASH_ALG_CRC32,
	BULK_HASH_ALG_MD5,
	BULK_HASH_ALG_SHA1,
	BULK_HASH_ALG_SHA256,
	BULK_HASH_ALG_SHA384,
	BULK_HASH_ALG_SHA512,
	BULK_HASH_ALG_MAX
};

const char *sptlrpc_get_hash_name(__u8 hash_alg);
__u8 sptlrpc_get_hash_alg(const char *algname);

enum {
	BSD_FL_ERR      = 1,
};

struct ptlrpc_bulk_sec_desc {
	__u8	    bsd_version;    /* 0 */
	__u8	    bsd_type;       /* SPTLRPC_BULK_XXX */
	__u8	    bsd_svc;	/* SPTLRPC_BULK_SVC_XXXX */
	__u8	    bsd_flags;      /* flags */
	__u32	   bsd_nob;	/* nob of bulk data */
	__u8	    bsd_data[0];    /* policy-specific token */
};

/*
 * round size up to next power of 2, for slab allocation.
 * @size must be sane (can't overflow after round up)
 */
static inline int size_roundup_power2(int size)
{
	size--;
	size |= size >> 1;
	size |= size >> 2;
	size |= size >> 4;
	size |= size >> 8;
	size |= size >> 16;
	size++;
	return size;
}

/*
 * internal support libraries
 */
void _sptlrpc_enlarge_msg_inplace(struct lustre_msg *msg,
				  int segment, int newsize);

/*
 * security policies
 */
int sptlrpc_register_policy(struct ptlrpc_sec_policy *policy);
int sptlrpc_unregister_policy(struct ptlrpc_sec_policy *policy);

__u32 sptlrpc_name2flavor_base(const char *name);
const char *sptlrpc_flavor2name_base(__u32 flvr);
char *sptlrpc_flavor2name_bulk(struct sptlrpc_flavor *sf,
			       char *buf, int bufsize);
char *sptlrpc_flavor2name(struct sptlrpc_flavor *sf, char *buf, int bufsize);

static inline
struct ptlrpc_sec_policy *sptlrpc_policy_get(struct ptlrpc_sec_policy *policy)
{
	__module_get(policy->sp_owner);
	return policy;
}

static inline
void sptlrpc_policy_put(struct ptlrpc_sec_policy *policy)
{
	module_put(policy->sp_owner);
}

/*
 * client credential
 */
static inline
unsigned long cli_ctx_status(struct ptlrpc_cli_ctx *ctx)
{
	return (ctx->cc_flags & PTLRPC_CTX_STATUS_MASK);
}

static inline
int cli_ctx_is_ready(struct ptlrpc_cli_ctx *ctx)
{
	return (cli_ctx_status(ctx) == PTLRPC_CTX_UPTODATE);
}

static inline
int cli_ctx_is_refreshed(struct ptlrpc_cli_ctx *ctx)
{
	return (cli_ctx_status(ctx) != 0);
}

static inline
int cli_ctx_is_uptodate(struct ptlrpc_cli_ctx *ctx)
{
	return ((ctx->cc_flags & PTLRPC_CTX_UPTODATE) != 0);
}

static inline
int cli_ctx_is_error(struct ptlrpc_cli_ctx *ctx)
{
	return ((ctx->cc_flags & PTLRPC_CTX_ERROR) != 0);
}

static inline
int cli_ctx_is_dead(struct ptlrpc_cli_ctx *ctx)
{
	return ((ctx->cc_flags & (PTLRPC_CTX_DEAD | PTLRPC_CTX_ERROR)) != 0);
}

static inline
int cli_ctx_is_eternal(struct ptlrpc_cli_ctx *ctx)
{
	return ((ctx->cc_flags & PTLRPC_CTX_ETERNAL) != 0);
}

/*
 * sec get/put
 */
void sptlrpc_sec_put(struct ptlrpc_sec *sec);

/*
 * internal apis which only used by policy implementation
 */
int  sptlrpc_get_next_secid(void);

/*
 * exported client context api
 */
struct ptlrpc_cli_ctx *sptlrpc_cli_ctx_get(struct ptlrpc_cli_ctx *ctx);
void sptlrpc_cli_ctx_put(struct ptlrpc_cli_ctx *ctx, int sync);

/*
 * exported client context wrap/buffers
 */
int sptlrpc_cli_wrap_request(struct ptlrpc_request *req);
int sptlrpc_cli_unwrap_reply(struct ptlrpc_request *req);
int sptlrpc_cli_alloc_reqbuf(struct ptlrpc_request *req, int msgsize);
void sptlrpc_cli_free_reqbuf(struct ptlrpc_request *req);
int sptlrpc_cli_alloc_repbuf(struct ptlrpc_request *req, int msgsize);
void sptlrpc_cli_free_repbuf(struct ptlrpc_request *req);
int sptlrpc_cli_enlarge_reqbuf(struct ptlrpc_request *req,
			       int segment, int newsize);
int  sptlrpc_cli_unwrap_early_reply(struct ptlrpc_request *req,
				    struct ptlrpc_request **req_ret);
void sptlrpc_cli_finish_early_reply(struct ptlrpc_request *early_req);

void sptlrpc_request_out_callback(struct ptlrpc_request *req);

/*
 * exported higher interface of import & request
 */
int sptlrpc_import_sec_adapt(struct obd_import *imp,
			     struct ptlrpc_svc_ctx *ctx,
			     struct sptlrpc_flavor *flvr);
struct ptlrpc_sec *sptlrpc_import_sec_ref(struct obd_import *imp);
void sptlrpc_import_sec_put(struct obd_import *imp);

int  sptlrpc_import_check_ctx(struct obd_import *imp);
void sptlrpc_import_flush_root_ctx(struct obd_import *imp);
void sptlrpc_import_flush_my_ctx(struct obd_import *imp);
void sptlrpc_import_flush_all_ctx(struct obd_import *imp);
int  sptlrpc_req_get_ctx(struct ptlrpc_request *req);
void sptlrpc_req_put_ctx(struct ptlrpc_request *req, int sync);
int  sptlrpc_req_refresh_ctx(struct ptlrpc_request *req, long timeout);
void sptlrpc_req_set_flavor(struct ptlrpc_request *req, int opcode);

/* gc */
void sptlrpc_gc_add_sec(struct ptlrpc_sec *sec);
void sptlrpc_gc_del_sec(struct ptlrpc_sec *sec);

/* misc */
const char *sec2target_str(struct ptlrpc_sec *sec);
/*
 * lprocfs
 */
int sptlrpc_lprocfs_cliobd_attach(struct obd_device *dev);

/*
 * server side
 */
enum secsvc_accept_res {
	SECSVC_OK       = 0,
	SECSVC_COMPLETE,
	SECSVC_DROP,
};

int  sptlrpc_svc_unwrap_request(struct ptlrpc_request *req);
int  sptlrpc_svc_alloc_rs(struct ptlrpc_request *req, int msglen);
int  sptlrpc_svc_wrap_reply(struct ptlrpc_request *req);
void sptlrpc_svc_free_rs(struct ptlrpc_reply_state *rs);
void sptlrpc_svc_ctx_addref(struct ptlrpc_request *req);
void sptlrpc_svc_ctx_decref(struct ptlrpc_request *req);

int  sptlrpc_target_export_check(struct obd_export *exp,
				 struct ptlrpc_request *req);

/* bulk security api */
void sptlrpc_enc_pool_put_pages(struct ptlrpc_bulk_desc *desc);

int sptlrpc_cli_wrap_bulk(struct ptlrpc_request *req,
			  struct ptlrpc_bulk_desc *desc);
int sptlrpc_cli_unwrap_bulk_read(struct ptlrpc_request *req,
				 struct ptlrpc_bulk_desc *desc,
				 int nob);
int sptlrpc_cli_unwrap_bulk_write(struct ptlrpc_request *req,
				  struct ptlrpc_bulk_desc *desc);

/* bulk helpers (internal use only by policies) */
int sptlrpc_get_bulk_checksum(struct ptlrpc_bulk_desc *desc, __u8 alg,
			      void *buf, int buflen);

int bulk_sec_desc_unpack(struct lustre_msg *msg, int offset, int swabbed);

/* user descriptor helpers */
static inline int sptlrpc_user_desc_size(int ngroups)
{
	return sizeof(struct ptlrpc_user_desc) + ngroups * sizeof(__u32);
}

int sptlrpc_current_user_desc_size(void);
int sptlrpc_pack_user_desc(struct lustre_msg *msg, int offset);
int sptlrpc_unpack_user_desc(struct lustre_msg *req, int offset, int swabbed);

#define CFS_CAP_CHOWN_MASK (1 << CFS_CAP_CHOWN)
#define CFS_CAP_SYS_RESOURCE_MASK (1 << CFS_CAP_SYS_RESOURCE)

enum {
	LUSTRE_SEC_NONE	 = 0,
	LUSTRE_SEC_REMOTE       = 1,
	LUSTRE_SEC_SPECIFY      = 2,
	LUSTRE_SEC_ALL	  = 3
};

/** @} sptlrpc */

#endif /* _LUSTRE_SEC_H_ */
