/*
 * (C) 2001 Clemson University and The University of Chicago
 *
 * See COPYING in top-level directory.
 */

/* This file just defines debugging masks to be used with the gossip
 * logging utility.  All debugging masks for ORANGEFS are kept here to make
 * sure we don't have collisions.
 */

#ifndef __ORANGEFS_DEBUG_H
#define __ORANGEFS_DEBUG_H

#ifdef __KERNEL__
#include <linux/types.h>
#else
#include <stdint.h>
#endif

#define GOSSIP_NO_DEBUG                (__u64)0
#define GOSSIP_BMI_DEBUG_TCP           ((__u64)1 << 0)
#define GOSSIP_BMI_DEBUG_CONTROL       ((__u64)1 << 1)
#define GOSSIP_BMI_DEBUG_OFFSETS       ((__u64)1 << 2)
#define GOSSIP_BMI_DEBUG_GM            ((__u64)1 << 3)
#define GOSSIP_JOB_DEBUG               ((__u64)1 << 4)
#define GOSSIP_SERVER_DEBUG            ((__u64)1 << 5)
#define GOSSIP_STO_DEBUG_CTRL          ((__u64)1 << 6)
#define GOSSIP_STO_DEBUG_DEFAULT       ((__u64)1 << 7)
#define GOSSIP_FLOW_DEBUG              ((__u64)1 << 8)
#define GOSSIP_BMI_DEBUG_GM_MEM        ((__u64)1 << 9)
#define GOSSIP_REQUEST_DEBUG           ((__u64)1 << 10)
#define GOSSIP_FLOW_PROTO_DEBUG        ((__u64)1 << 11)
#define GOSSIP_NCACHE_DEBUG            ((__u64)1 << 12)
#define GOSSIP_CLIENT_DEBUG            ((__u64)1 << 13)
#define GOSSIP_REQ_SCHED_DEBUG         ((__u64)1 << 14)
#define GOSSIP_ACACHE_DEBUG            ((__u64)1 << 15)
#define GOSSIP_TROVE_DEBUG             ((__u64)1 << 16)
#define GOSSIP_TROVE_OP_DEBUG          ((__u64)1 << 17)
#define GOSSIP_DIST_DEBUG              ((__u64)1 << 18)
#define GOSSIP_BMI_DEBUG_IB            ((__u64)1 << 19)
#define GOSSIP_DBPF_ATTRCACHE_DEBUG    ((__u64)1 << 20)
#define GOSSIP_MMAP_RCACHE_DEBUG       ((__u64)1 << 21)
#define GOSSIP_LOOKUP_DEBUG            ((__u64)1 << 22)
#define GOSSIP_REMOVE_DEBUG            ((__u64)1 << 23)
#define GOSSIP_GETATTR_DEBUG           ((__u64)1 << 24)
#define GOSSIP_READDIR_DEBUG           ((__u64)1 << 25)
#define GOSSIP_IO_DEBUG                ((__u64)1 << 26)
#define GOSSIP_DBPF_OPEN_CACHE_DEBUG   ((__u64)1 << 27)
#define GOSSIP_PERMISSIONS_DEBUG       ((__u64)1 << 28)
#define GOSSIP_CANCEL_DEBUG            ((__u64)1 << 29)
#define GOSSIP_MSGPAIR_DEBUG           ((__u64)1 << 30)
#define GOSSIP_CLIENTCORE_DEBUG        ((__u64)1 << 31)
#define GOSSIP_CLIENTCORE_TIMING_DEBUG ((__u64)1 << 32)
#define GOSSIP_SETATTR_DEBUG           ((__u64)1 << 33)
#define GOSSIP_MKDIR_DEBUG             ((__u64)1 << 34)
#define GOSSIP_VARSTRIP_DEBUG          ((__u64)1 << 35)
#define GOSSIP_GETEATTR_DEBUG          ((__u64)1 << 36)
#define GOSSIP_SETEATTR_DEBUG          ((__u64)1 << 37)
#define GOSSIP_ENDECODE_DEBUG          ((__u64)1 << 38)
#define GOSSIP_DELEATTR_DEBUG          ((__u64)1 << 39)
#define GOSSIP_ACCESS_DEBUG            ((__u64)1 << 40)
#define GOSSIP_ACCESS_DETAIL_DEBUG     ((__u64)1 << 41)
#define GOSSIP_LISTEATTR_DEBUG         ((__u64)1 << 42)
#define GOSSIP_PERFCOUNTER_DEBUG       ((__u64)1 << 43)
#define GOSSIP_STATE_MACHINE_DEBUG     ((__u64)1 << 44)
#define GOSSIP_DBPF_KEYVAL_DEBUG       ((__u64)1 << 45)
#define GOSSIP_LISTATTR_DEBUG          ((__u64)1 << 46)
#define GOSSIP_DBPF_COALESCE_DEBUG     ((__u64)1 << 47)
#define GOSSIP_ACCESS_HOSTNAMES        ((__u64)1 << 48)
#define GOSSIP_FSCK_DEBUG              ((__u64)1 << 49)
#define GOSSIP_BMI_DEBUG_MX            ((__u64)1 << 50)
#define GOSSIP_BSTREAM_DEBUG           ((__u64)1 << 51)
#define GOSSIP_BMI_DEBUG_PORTALS       ((__u64)1 << 52)
#define GOSSIP_USER_DEV_DEBUG          ((__u64)1 << 53)
#define GOSSIP_DIRECTIO_DEBUG          ((__u64)1 << 54)
#define GOSSIP_MGMT_DEBUG              ((__u64)1 << 55)
#define GOSSIP_MIRROR_DEBUG            ((__u64)1 << 56)
#define GOSSIP_WIN_CLIENT_DEBUG        ((__u64)1 << 57)
#define GOSSIP_SECURITY_DEBUG          ((__u64)1 << 58)
#define GOSSIP_USRINT_DEBUG            ((__u64)1 << 59)
#define GOSSIP_RCACHE_DEBUG            ((__u64)1 << 60)
#define GOSSIP_SECCACHE_DEBUG          ((__u64)1 << 61)

#define GOSSIP_BMI_DEBUG_ALL ((__u64) (GOSSIP_BMI_DEBUG_TCP +	\
					 GOSSIP_BMI_DEBUG_CONTROL +	\
					 GOSSIP_BMI_DEBUG_GM +		\
					 GOSSIP_BMI_DEBUG_OFFSETS +	\
					 GOSSIP_BMI_DEBUG_IB +		\
					 GOSSIP_BMI_DEBUG_MX +		\
					 GOSSIP_BMI_DEBUG_PORTALS))

const char *ORANGEFS_debug_get_next_debug_keyword(int position);

#define GOSSIP_SUPER_DEBUG		((__u64)1 << 0)
#define GOSSIP_INODE_DEBUG		((__u64)1 << 1)
#define GOSSIP_FILE_DEBUG		((__u64)1 << 2)
#define GOSSIP_DIR_DEBUG		((__u64)1 << 3)
#define GOSSIP_UTILS_DEBUG		((__u64)1 << 4)
#define GOSSIP_WAIT_DEBUG		((__u64)1 << 5)
#define GOSSIP_ACL_DEBUG		((__u64)1 << 6)
#define GOSSIP_DCACHE_DEBUG		((__u64)1 << 7)
#define GOSSIP_DEV_DEBUG		((__u64)1 << 8)
#define GOSSIP_NAME_DEBUG		((__u64)1 << 9)
#define GOSSIP_BUFMAP_DEBUG		((__u64)1 << 10)
#define GOSSIP_CACHE_DEBUG		((__u64)1 << 11)
#define GOSSIP_DEBUGFS_DEBUG		((__u64)1 << 12)
#define GOSSIP_XATTR_DEBUG		((__u64)1 << 13)
#define GOSSIP_INIT_DEBUG		((__u64)1 << 14)
#define GOSSIP_SYSFS_DEBUG		((__u64)1 << 15)

#define GOSSIP_MAX_NR                 16
#define GOSSIP_MAX_DEBUG              (((__u64)1 << GOSSIP_MAX_NR) - 1)

/*function prototypes*/
__u64 ORANGEFS_kmod_eventlog_to_mask(const char *event_logging);
__u64 ORANGEFS_debug_eventlog_to_mask(const char *event_logging);
char *ORANGEFS_debug_mask_to_eventlog(__u64 mask);
char *ORANGEFS_kmod_mask_to_eventlog(__u64 mask);

/* a private internal type */
struct __keyword_mask_s {
	const char *keyword;
	__u64 mask_val;
};

#define __DEBUG_ALL ((__u64) -1)

/* map all config keywords to pvfs2 debug masks here */
static struct __keyword_mask_s s_keyword_mask_map[] = {
	/* Log trove debugging info.  Same as 'trove'. */
	{"storage", GOSSIP_TROVE_DEBUG},
	/* Log trove debugging info.  Same as 'storage'. */
	{"trove", GOSSIP_TROVE_DEBUG},
	/* Log trove operations. */
	{"trove_op", GOSSIP_TROVE_OP_DEBUG},
	/* Log network debug info. */
	{"network", GOSSIP_BMI_DEBUG_ALL},
	/* Log server info, including new operations. */
	{"server", GOSSIP_SERVER_DEBUG},
	/* Log client sysint info.  This is only useful for the client. */
	{"client", GOSSIP_CLIENT_DEBUG},
	/* Debug the varstrip distribution */
	{"varstrip", GOSSIP_VARSTRIP_DEBUG},
	/* Log job info */
	{"job", GOSSIP_JOB_DEBUG},
	/* Debug PINT_process_request calls.  EXTREMELY verbose! */
	{"request", GOSSIP_REQUEST_DEBUG},
	/* Log request scheduler events */
	{"reqsched", GOSSIP_REQ_SCHED_DEBUG},
	/* Log the flow protocol events, including flowproto_multiqueue */
	{"flowproto", GOSSIP_FLOW_PROTO_DEBUG},
	/* Log flow calls */
	{"flow", GOSSIP_FLOW_DEBUG},
	/* Debug the client name cache.  Only useful on the client. */
	{"ncache", GOSSIP_NCACHE_DEBUG},
	/* Debug read-ahead cache events.  Only useful on the client. */
	{"mmaprcache", GOSSIP_MMAP_RCACHE_DEBUG},
	/* Debug the attribute cache.  Only useful on the client. */
	{"acache", GOSSIP_ACACHE_DEBUG},
	/* Log/Debug distribution calls */
	{"distribution", GOSSIP_DIST_DEBUG},
	/* Debug the server-side dbpf attribute cache */
	{"dbpfattrcache", GOSSIP_DBPF_ATTRCACHE_DEBUG},
	/* Debug the client lookup state machine. */
	{"lookup", GOSSIP_LOOKUP_DEBUG},
	/* Debug the client remove state macine. */
	{"remove", GOSSIP_REMOVE_DEBUG},
	/* Debug the server getattr state machine. */
	{"getattr", GOSSIP_GETATTR_DEBUG},
	/* Debug the server setattr state machine. */
	{"setattr", GOSSIP_SETATTR_DEBUG},
	/* vectored getattr server state machine */
	{"listattr", GOSSIP_LISTATTR_DEBUG},
	/* Debug the client and server get ext attributes SM. */
	{"geteattr", GOSSIP_GETEATTR_DEBUG},
	/* Debug the client and server set ext attributes SM. */
	{"seteattr", GOSSIP_SETEATTR_DEBUG},
	/* Debug the readdir operation (client and server) */
	{"readdir", GOSSIP_READDIR_DEBUG},
	/* Debug the mkdir operation (server only) */
	{"mkdir", GOSSIP_MKDIR_DEBUG},
	/*
	 * Debug the io operation (reads and writes)
	 * for both the client and server.
	 */
	{"io", GOSSIP_IO_DEBUG},
	/* Debug the server's open file descriptor cache */
	{"open_cache", GOSSIP_DBPF_OPEN_CACHE_DEBUG},
	/* Debug permissions checking on the server */
	{"permissions", GOSSIP_PERMISSIONS_DEBUG},
	/* Debug the cancel operation */
	{"cancel", GOSSIP_CANCEL_DEBUG},
	/* Debug the msgpair state machine */
	{"msgpair", GOSSIP_MSGPAIR_DEBUG},
	/* Debug the client core app */
	{"clientcore", GOSSIP_CLIENTCORE_DEBUG},
	/* Debug the client timing state machines (job timeout, etc.) */
	{"clientcore_timing", GOSSIP_CLIENTCORE_TIMING_DEBUG},
	/* network encoding */
	{"endecode", GOSSIP_ENDECODE_DEBUG},
	/* Show server file (metadata) accesses (both modify and read-only). */
	{"access", GOSSIP_ACCESS_DEBUG},
	/* Show more detailed server file accesses */
	{"access_detail", GOSSIP_ACCESS_DETAIL_DEBUG},
	/* Debug the listeattr operation */
	{"listeattr", GOSSIP_LISTEATTR_DEBUG},
	/* Debug the state machine management code */
	{"sm", GOSSIP_STATE_MACHINE_DEBUG},
	/* Debug the metadata dbpf keyval functions */
	{"keyval", GOSSIP_DBPF_KEYVAL_DEBUG},
	/* Debug the metadata sync coalescing code */
	{"coalesce", GOSSIP_DBPF_COALESCE_DEBUG},
	/* Display the hostnames instead of IP addrs in debug output */
	{"access_hostnames", GOSSIP_ACCESS_HOSTNAMES},
	/* Show the client device events */
	{"user_dev", GOSSIP_USER_DEV_DEBUG},
	/* Debug the fsck tool */
	{"fsck", GOSSIP_FSCK_DEBUG},
	/* Debug the bstream code */
	{"bstream", GOSSIP_BSTREAM_DEBUG},
	/* Debug trove in direct io mode */
	{"directio", GOSSIP_DIRECTIO_DEBUG},
	/* Debug direct io thread management */
	{"mgmt", GOSSIP_MGMT_DEBUG},
	/* Debug mirroring process */
	{"mirror", GOSSIP_MIRROR_DEBUG},
	/* Windows client */
	{"win_client", GOSSIP_WIN_CLIENT_DEBUG},
	/* Debug robust security code */
	{"security", GOSSIP_SECURITY_DEBUG},
	/* Capability Cache */
	{"seccache", GOSSIP_SECCACHE_DEBUG},
	/* Client User Interface */
	{"usrint", GOSSIP_USRINT_DEBUG},
	/* rcache */
	{"rcache", GOSSIP_RCACHE_DEBUG},
	/* Everything except the periodic events.  Useful for debugging */
	{"verbose",
	 (__DEBUG_ALL &
	  ~(GOSSIP_PERFCOUNTER_DEBUG | GOSSIP_STATE_MACHINE_DEBUG |
	    GOSSIP_ENDECODE_DEBUG | GOSSIP_USER_DEV_DEBUG))
	 },
	/* No debug output */
	{"none", GOSSIP_NO_DEBUG},
	/* Everything */
	{"all", __DEBUG_ALL}
};

#undef __DEBUG_ALL

/*
 * Map all kmod keywords to kmod debug masks here. Keep this
 * structure "packed":
 *
 *   "all" is always last...
 *
 *   keyword     mask_val     index
 *     foo          1           0
 *     bar          2           1
 *     baz          4           2
 *     qux          8           3
 *      .           .           .
 */
static struct __keyword_mask_s s_kmod_keyword_mask_map[] = {
	{"super", GOSSIP_SUPER_DEBUG},
	{"inode", GOSSIP_INODE_DEBUG},
	{"file", GOSSIP_FILE_DEBUG},
	{"dir", GOSSIP_DIR_DEBUG},
	{"utils", GOSSIP_UTILS_DEBUG},
	{"wait", GOSSIP_WAIT_DEBUG},
	{"acl", GOSSIP_ACL_DEBUG},
	{"dcache", GOSSIP_DCACHE_DEBUG},
	{"dev", GOSSIP_DEV_DEBUG},
	{"name", GOSSIP_NAME_DEBUG},
	{"bufmap", GOSSIP_BUFMAP_DEBUG},
	{"cache", GOSSIP_CACHE_DEBUG},
	{"debugfs", GOSSIP_DEBUGFS_DEBUG},
	{"xattr", GOSSIP_XATTR_DEBUG},
	{"init", GOSSIP_INIT_DEBUG},
	{"sysfs", GOSSIP_SYSFS_DEBUG},
	{"none", GOSSIP_NO_DEBUG},
	{"all", GOSSIP_MAX_DEBUG}
};

static const int num_kmod_keyword_mask_map = (int)
	(sizeof(s_kmod_keyword_mask_map) / sizeof(struct __keyword_mask_s));

static const int num_keyword_mask_map = (int)
	(sizeof(s_keyword_mask_map) / sizeof(struct __keyword_mask_s));

#endif /* __ORANGEFS_DEBUG_H */
