/*
  Copyright (c) 2008-2012 Red Hat, Inc. <http://www.redhat.com>
  This file is part of GlusterFS.

  This file is licensed to you under your choice of the GNU Lesser
  General Public License, version 3 or any later version (LGPLv3 or
  later), or the GNU General Public License, version 2 (GPLv2), in all
  cases as published by the Free Software Foundation.
*/

#ifndef _PROTOCOL_COMMON_H
#define _PROTOCOL_COMMON_H

enum gf_fop_procnum {
    GFS3_OP_NULL, /* 0 */
    GFS3_OP_STAT,
    GFS3_OP_READLINK,
    GFS3_OP_MKNOD,
    GFS3_OP_MKDIR,
    GFS3_OP_UNLINK,
    GFS3_OP_RMDIR,
    GFS3_OP_SYMLINK,
    GFS3_OP_RENAME,
    GFS3_OP_LINK,
    GFS3_OP_TRUNCATE,
    GFS3_OP_OPEN,
    GFS3_OP_READ,
    GFS3_OP_WRITE,
    GFS3_OP_STATFS,
    GFS3_OP_FLUSH,
    GFS3_OP_FSYNC,
    GFS3_OP_SETXATTR,
    GFS3_OP_GETXATTR,
    GFS3_OP_REMOVEXATTR,
    GFS3_OP_OPENDIR,
    GFS3_OP_FSYNCDIR,
    GFS3_OP_ACCESS,
    GFS3_OP_CREATE,
    GFS3_OP_FTRUNCATE,
    GFS3_OP_FSTAT,
    GFS3_OP_LK,
    GFS3_OP_LOOKUP,
    GFS3_OP_READDIR,
    GFS3_OP_INODELK,
    GFS3_OP_FINODELK,
    GFS3_OP_ENTRYLK,
    GFS3_OP_FENTRYLK,
    GFS3_OP_XATTROP,
    GFS3_OP_FXATTROP,
    GFS3_OP_FGETXATTR,
    GFS3_OP_FSETXATTR,
    GFS3_OP_RCHECKSUM,
    GFS3_OP_SETATTR,
    GFS3_OP_FSETATTR,
    GFS3_OP_READDIRP,
    GFS3_OP_RELEASE,
    GFS3_OP_RELEASEDIR,
    GFS3_OP_FREMOVEXATTR,
    GFS3_OP_FALLOCATE,
    GFS3_OP_DISCARD,
    GFS3_OP_ZEROFILL,
    GFS3_OP_IPC,
    GFS3_OP_SEEK,
    GFS3_OP_COMPOUND,
    GFS3_OP_LEASE,
    GFS3_OP_GETACTIVELK,
    GFS3_OP_SETACTIVELK,
    GFS3_OP_ICREATE,
    GFS3_OP_NAMELINK,
    GFS3_OP_PUT,
    GFS3_OP_COPY_FILE_RANGE,
    GFS3_OP_MAXVALUE,
};

enum gf_handshake_procnum {
    GF_HNDSK_NULL,
    GF_HNDSK_SETVOLUME,
    GF_HNDSK_GETSPEC,
    GF_HNDSK_PING,
    GF_HNDSK_SET_LK_VER,
    GF_HNDSK_EVENT_NOTIFY,
    GF_HNDSK_GET_VOLUME_INFO,
    GF_HNDSK_GET_SNAPSHOT_INFO,
    GF_HNDSK_MAXVALUE,
};

enum gf_pmap_procnum {
    GF_PMAP_NULL = 0,
    GF_PMAP_PORTBYBRICK,
    GF_PMAP_BRICKBYPORT,
    /*
     * SIGNUP is not used, and shouldn't be used.  It was kept here only
     * to avoid changing the numbers for things that come after it in this
     * list.
     */
    GF_PMAP_SIGNUP,
    GF_PMAP_SIGNIN,
    GF_PMAP_SIGNOUT,
    GF_PMAP_MAXVALUE,
};

enum gf_aggregator_procnum {
    GF_AGGREGATOR_NULL = 0,
    GF_AGGREGATOR_LOOKUP,
    GF_AGGREGATOR_GETLIMIT,
    GF_AGGREGATOR_MAXVALUE,
};

enum gf_probe_resp {
    GF_PROBE_SUCCESS,
    GF_PROBE_LOCALHOST,
    GF_PROBE_FRIEND,
    GF_PROBE_ANOTHER_CLUSTER,
    GF_PROBE_VOLUME_CONFLICT,
    GF_PROBE_SAME_UUID,
    GF_PROBE_UNKNOWN_PEER,
    GF_PROBE_ADD_FAILED,
    GF_PROBE_QUORUM_NOT_MET,
    GF_PROBE_MISSED_SNAP_CONFLICT,
    GF_PROBE_SNAP_CONFLICT,
    GF_PROBE_FRIEND_DETACHING,
};

enum gf_deprobe_resp {
    GF_DEPROBE_SUCCESS,
    GF_DEPROBE_LOCALHOST,
    GF_DEPROBE_NOT_FRIEND,
    GF_DEPROBE_BRICK_EXIST,
    GF_DEPROBE_FRIEND_DOWN,
    GF_DEPROBE_QUORUM_NOT_MET,
    GF_DEPROBE_FRIEND_DETACHING,
    GF_DEPROBE_SNAP_BRICK_EXIST,
};

enum gf_cbk_procnum {
    GF_CBK_NULL = 0,
    GF_CBK_FETCHSPEC,
    GF_CBK_INO_FLUSH,
    GF_CBK_EVENT_NOTIFY,
    GF_CBK_GET_SNAPS,
    GF_CBK_CACHE_INVALIDATION,
    GF_CBK_CHILD_UP,
    GF_CBK_CHILD_DOWN,
    GF_CBK_RECALL_LEASE,
    GF_CBK_STATEDUMP,
    GF_CBK_INODELK_CONTENTION,
    GF_CBK_ENTRYLK_CONTENTION,
    GF_CBK_MAXVALUE,
};

enum gluster_cli_procnum {
    GLUSTER_CLI_NULL, /* 0 */
    GLUSTER_CLI_PROBE,
    GLUSTER_CLI_DEPROBE,
    GLUSTER_CLI_LIST_FRIENDS,
    GLUSTER_CLI_CREATE_VOLUME,
    GLUSTER_CLI_GET_VOLUME,
    GLUSTER_CLI_GET_NEXT_VOLUME,
    GLUSTER_CLI_DELETE_VOLUME,
    GLUSTER_CLI_START_VOLUME,
    GLUSTER_CLI_STOP_VOLUME,
    GLUSTER_CLI_RENAME_VOLUME,  // This option is obsolete and not used anymore
    GLUSTER_CLI_DEFRAG_VOLUME,
    GLUSTER_CLI_SET_VOLUME,
    GLUSTER_CLI_ADD_BRICK,
    GLUSTER_CLI_REMOVE_BRICK,
    GLUSTER_CLI_REPLACE_BRICK,
    GLUSTER_CLI_LOG_ROTATE,
    GLUSTER_CLI_GETSPEC,
    GLUSTER_CLI_PMAP_PORTBYBRICK,
    GLUSTER_CLI_SYNC_VOLUME,
    GLUSTER_CLI_RESET_VOLUME,
    GLUSTER_CLI_FSM_LOG,
    GLUSTER_CLI_GSYNC_SET,
    GLUSTER_CLI_PROFILE_VOLUME,
    GLUSTER_CLI_QUOTA,
    GLUSTER_CLI_TOP_VOLUME,
    GLUSTER_CLI_GETWD,
    GLUSTER_CLI_STATUS_VOLUME,
    GLUSTER_CLI_STATUS_ALL,
    GLUSTER_CLI_MOUNT,
    GLUSTER_CLI_UMOUNT,
    GLUSTER_CLI_HEAL_VOLUME,
    GLUSTER_CLI_STATEDUMP_VOLUME,
    GLUSTER_CLI_LIST_VOLUME,
    GLUSTER_CLI_CLRLOCKS_VOLUME,
    GLUSTER_CLI_UUID_RESET,
    GLUSTER_CLI_UUID_GET,
    GLUSTER_CLI_COPY_FILE,
    GLUSTER_CLI_SYS_EXEC,
    GLUSTER_CLI_SNAP,
    GLUSTER_CLI_BARRIER_VOLUME,
    GLUSTER_CLI_GET_VOL_OPT,
    GLUSTER_CLI_GANESHA,
    GLUSTER_CLI_BITROT,
    GLUSTER_CLI_ATTACH_TIER,
    GLUSTER_CLI_TIER,
    GLUSTER_CLI_GET_STATE,
    GLUSTER_CLI_RESET_BRICK,
    GLUSTER_CLI_REMOVE_TIER_BRICK,
    GLUSTER_CLI_ADD_TIER_BRICK,
    GLUSTER_CLI_MAXVALUE,
};

enum glusterd_mgmt_procnum {
    GLUSTERD_MGMT_NULL, /* 0 */
    GLUSTERD_MGMT_CLUSTER_LOCK,
    GLUSTERD_MGMT_CLUSTER_UNLOCK,
    GLUSTERD_MGMT_STAGE_OP,
    GLUSTERD_MGMT_COMMIT_OP,
    GLUSTERD_MGMT_MAXVALUE,
};

enum glusterd_friend_procnum {
    GLUSTERD_FRIEND_NULL, /* 0 */
    GLUSTERD_PROBE_QUERY,
    GLUSTERD_FRIEND_ADD,
    GLUSTERD_FRIEND_REMOVE,
    GLUSTERD_FRIEND_UPDATE,
    GLUSTERD_FRIEND_MAXVALUE,
};

enum glusterd_brick_procnum {
    GLUSTERD_BRICK_NULL, /* 0 */
    GLUSTERD_BRICK_TERMINATE,
    GLUSTERD_BRICK_XLATOR_INFO,
    GLUSTERD_BRICK_XLATOR_OP,
    GLUSTERD_BRICK_STATUS,
    GLUSTERD_BRICK_OP,
    GLUSTERD_BRICK_XLATOR_DEFRAG,
    GLUSTERD_NODE_PROFILE,
    GLUSTERD_NODE_STATUS,
    GLUSTERD_VOLUME_BARRIER_OP,
    GLUSTERD_BRICK_BARRIER,
    GLUSTERD_NODE_BITROT,
    GLUSTERD_BRICK_ATTACH,
    GLUSTERD_DUMP_METRICS,
    GLUSTERD_SVC_ATTACH,
    GLUSTERD_SVC_DETACH,
    GLUSTERD_BRICK_MAXVALUE,
};

enum glusterd_mgmt_hndsk_procnum {
    GD_MGMT_HNDSK_NULL,
    GD_MGMT_HNDSK_VERSIONS,
    GD_MGMT_HNDSK_VERSIONS_ACK,
    GD_MGMT_HNDSK_MAXVALUE,
};

typedef enum {
    GF_SHD_OP_INVALID,
    GF_SHD_OP_HEAL_INDEX,
    GF_SHD_OP_HEAL_FULL,
    GF_SHD_OP_INDEX_SUMMARY,
    GF_SHD_OP_HEALED_FILES,
    GF_SHD_OP_HEAL_FAILED_FILES,
    GF_SHD_OP_SPLIT_BRAIN_FILES,
    GF_SHD_OP_STATISTICS,
    GF_SHD_OP_STATISTICS_HEAL_COUNT,
    GF_SHD_OP_STATISTICS_HEAL_COUNT_PER_REPLICA,
    GF_SHD_OP_SBRAIN_HEAL_FROM_BIGGER_FILE,
    GF_SHD_OP_SBRAIN_HEAL_FROM_BRICK,
    GF_SHD_OP_HEAL_ENABLE,
    GF_SHD_OP_HEAL_DISABLE,
    GF_SHD_OP_SBRAIN_HEAL_FROM_LATEST_MTIME,
    GF_SHD_OP_GRANULAR_ENTRY_HEAL_ENABLE,
    GF_SHD_OP_GRANULAR_ENTRY_HEAL_DISABLE,
    GF_SHD_OP_HEAL_SUMMARY,
} gf_xl_afr_op_t;

struct gf_gsync_detailed_status_ {
    char node[NAME_MAX];
    char primary[NAME_MAX];
    char brick[PATH_MAX];
    char secondary_user[NAME_MAX];
    char secondary[NAME_MAX];
    char secondary_node[NAME_MAX];
    char worker_status[NAME_MAX];
    char crawl_status[NAME_MAX];
    char last_synced[NAME_MAX];
    char last_synced_utc[NAME_MAX];
    char entry[NAME_MAX];
    char data[NAME_MAX];
    char meta[NAME_MAX];
    char failures[NAME_MAX];
    char checkpoint_time[NAME_MAX];
    char checkpoint_time_utc[NAME_MAX];
    char checkpoint_completed[NAME_MAX];
    char checkpoint_completion_time[NAME_MAX];
    char checkpoint_completion_time_utc[NAME_MAX];
    char brick_host_uuid[NAME_MAX];
    char secondarykey[NAME_MAX];
    char session_secondary[NAME_MAX];
};

enum glusterd_mgmt_v3_procnum {
    GLUSTERD_MGMT_V3_NULL, /* 0 */
    GLUSTERD_MGMT_V3_LOCK,
    GLUSTERD_MGMT_V3_PRE_VALIDATE,
    GLUSTERD_MGMT_V3_BRICK_OP,
    GLUSTERD_MGMT_V3_COMMIT,
    GLUSTERD_MGMT_V3_POST_VALIDATE,
    GLUSTERD_MGMT_V3_UNLOCK,
    GLUSTERD_MGMT_V3_POST_COMMIT,
    /* Always add new proc just before the MGMT_V3_MAXVALUE declartion */
    GLUSTERD_MGMT_V3_MAXVALUE,
};

enum gf_fd_reopen_status {
    FD_REOPEN_ALLOWED = 0,
    FD_REOPEN_NOT_ALLOWED,
    FD_BAD,
};

typedef struct gf_gsync_detailed_status_ gf_gsync_status_t;

enum gf_get_volume_info_type {
    GF_GET_VOLUME_NONE, /* 0 */
    GF_GET_VOLUME_UUID
};

typedef enum gf_get_volume_info_type gf_get_volume_info_type;

enum gf_get_snapshot_info_type {
    GF_GET_SNAPSHOT_LIST,
};
typedef enum gf_get_snapshot_info_type gf_get_snapshot_info_type;

enum gf_getspec_flags_type { GF_GETSPEC_FLAG_SERVERS_LIST = 1 };
typedef enum gf_getspec_flags_type gf_getspec_flags_type;

#define GLUSTER_HNDSK_PROGRAM 14398633 /* Completely random */
#define GLUSTER_HNDSK_VERSION 2        /* 0.0.2 */

#define GLUSTER_PMAP_PROGRAM 34123456
#define GLUSTER_PMAP_VERSION 1

#define GLUSTER_CBK_PROGRAM 52743234 /* Completely random */
#define GLUSTER_CBK_VERSION 1        /* 0.0.1 */

#define GLUSTER_FOP_PROGRAM 1298437 /* Completely random */
#define GLUSTER_FOP_VERSION 330     /* 3.3.0 */
#define GLUSTER_FOP_PROCCNT GFS3_OP_MAXVALUE

#define GLUSTER_FOP_VERSION_v2 400 /* 4.0.0 */

/* Aggregator */
#define GLUSTER_AGGREGATOR_PROGRAM 29852134 /* Completely random */
#define GLUSTER_AGGREGATOR_VERSION 1

/* Second version */
#define GD_MGMT_PROGRAM 1238433 /* Completely random */
#define GD_MGMT_VERSION 2       /* 0.0.2 */

#define GD_FRIEND_PROGRAM 1238437 /* Completely random */
#define GD_FRIEND_VERSION 2       /* 0.0.2 */

#define GLUSTER_CLI_PROGRAM 1238463 /* Completely random */
#define GLUSTER_CLI_VERSION 2       /* 0.0.2 */

#define GD_BRICK_PROGRAM 4867634 /*Completely random*/
#define GD_BRICK_VERSION 2

/* Third version */
#define GD_MGMT_V3_VERSION 3

/* OP-VERSION handshake */
#define GD_MGMT_HNDSK_PROGRAM 1239873 /* Completely random */
#define GD_MGMT_HNDSK_VERSION 1

#define GD_VOLUME_NAME_MAX (NAME_MAX + 1) /* Maximum size of volume name */

#define GLUSTER_PROCESS_UUID_FMT                                               \
    "CTX_ID:%s-GRAPH_ID:%d-PID:%d-HOST:%s-PC_NAME:%s-RECON_NO:%s"
#endif /* !_PROTOCOL_COMMON_H */
