[PATCH] Wireshark dissector updated, work with the current development tree of wireshark. The way I patched it is not really clean, but it can be useful if some people quickly need to inspect ceph network flows.

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Pierre Rognant <prognant@xxxxxxxxxxx>

---
 wireshark/ceph/ceph_fs.h     |  213 +++++++++++++++-----
 wireshark/ceph/crc32c.h      |    2 +-
 wireshark/ceph/msgr.h        |   67 +++++--
 wireshark/ceph/packet-ceph.c |  461 ++++++++++++++++++++++++++++++++++--------
 wireshark/ceph/rados.h       |  100 +++++++--
 wireshark/ceph/sctp_crc32.c  |   27 ++-
 wireshark/wireshark.patch    |   26 +--
 7 files changed, 695 insertions(+), 201 deletions(-)

diff --git a/wireshark/ceph/ceph_fs.h b/wireshark/ceph/ceph_fs.h
index 41a941c..b8c6069 100644
--- a/wireshark/ceph/ceph_fs.h
+++ b/wireshark/ceph/ceph_fs.h
@@ -16,40 +16,37 @@
 #include "rados.h"
 
 /*
- * Ceph release version
- */
-#define CEPH_VERSION_MAJOR 0
-#define CEPH_VERSION_MINOR 16
-#define CEPH_VERSION_PATCH 1
-
-#define CEPH_STRINGIFY_(x) #x
-#define CEPH_STRINGIFY(x) CEPH_STRINGIFY_(x)
-#define CEPH_MAKE_VERSION(x, y, z) CEPH_STRINGIFY(x) "." CEPH_STRINGIFY(y) \
-	"." CEPH_STRINGIFY(z)
-#define CEPH_VERSION CEPH_MAKE_VERSION(CEPH_VERSION_MAJOR, \
-				       CEPH_VERSION_MINOR, CEPH_VERSION_PATCH)
-
-/*
  * subprotocol versions.  when specific messages types or high-level
  * protocols change, bump the affected components.  we keep rev
  * internal cluster protocols separately from the public,
  * client-facing protocol.
  */
-#define CEPH_OSD_PROTOCOL     7 /* cluster internal */
-#define CEPH_MDS_PROTOCOL     9 /* cluster internal */
+#define CEPH_OSD_PROTOCOL     8 /* cluster internal */
+#define CEPH_MDS_PROTOCOL    12 /* cluster internal */
 #define CEPH_MON_PROTOCOL     5 /* cluster internal */
-#define CEPH_OSDC_PROTOCOL   20 /* server/client */
-#define CEPH_MDSC_PROTOCOL   29 /* server/client */
+#define CEPH_OSDC_PROTOCOL   24 /* server/client */
+#define CEPH_MDSC_PROTOCOL   32 /* server/client */
 #define CEPH_MONC_PROTOCOL   15 /* server/client */
 
 
 #define CEPH_INO_ROOT  1
+#define CEPH_INO_CEPH  2        /* hidden .ceph dir */
 
 /* arbitrary limit on max # of monitors (cluster of 3 is typical) */
 #define CEPH_MAX_MON   31
 
 
-unsigned int ceph_full_name_hash(const char *name, unsigned int len);
+/*
+ * feature bits
+ */
+#define CEPH_FEATURE_UID            (1<<0)
+#define CEPH_FEATURE_NOSRCADDR      (1<<1)
+#define CEPH_FEATURE_MONCLOCKCHECK  (1<<2)
+#define CEPH_FEATURE_FLOCK          (1<<3)
+#define CEPH_FEATURE_SUBSCRIBE2     (1<<4)
+#define CEPH_FEATURE_MONNAMES       (1<<5)
+#define CEPH_FEATURE_RECONNECT_SEQ  (1<<6)
+#define CEPH_FEATURE_DIRLAYOUTHASH  (1<<7)
 
 
 /*
@@ -62,10 +59,10 @@ struct ceph_file_layout {
 	__le32 fl_stripe_count;    /* over this many objects */
 	__le32 fl_object_size;     /* until objects are this big, then move to
 				      new objects */
-	__le32 fl_cas_hash;        /* 0 = none; 1 = sha256 */
+	__le32 fl_cas_hash;        /* UNUSED.  0 = none; 1 = sha256 */
 
 	/* pg -> disk layout */
-	__le32 fl_object_stripe_unit;  /* for per-object parity, if any */
+	__le32 fl_object_stripe_unit;  /* UNUSED.  for per-object parity, if any */
 
 	/* object -> pg layout */
 	__le32 fl_pg_preferred; /* preferred primary for pg (-1 for none) */
@@ -76,6 +73,26 @@ struct ceph_file_layout {
 
 int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
 
+struct ceph_dir_layout {
+	__u8   dl_dir_hash;   /* see ceph_hash.h for ids */
+	__u8   dl_unused1;
+	__u16  dl_unused2;
+	__u32  dl_unused3;
+} __attribute__ ((packed));
+
+/* crypto algorithms */
+#define CEPH_CRYPTO_NONE 0x0
+#define CEPH_CRYPTO_AES  0x1
+
+#define CEPH_AES_IV "cephsageyudagreg"
+
+/* security/authentication protocols */
+#define CEPH_AUTH_UNKNOWN	0x0
+#define CEPH_AUTH_NONE	 	0x1
+#define CEPH_AUTH_CEPHX	 	0x2
+
+#define CEPH_AUTH_UID_DEFAULT ((__u64) -1)
+
 
 /*********************************************
  * message layer
@@ -92,12 +109,12 @@ int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
 /* client <-> monitor */
 #define CEPH_MSG_MON_MAP                4
 #define CEPH_MSG_MON_GET_MAP            5
-#define CEPH_MSG_CLIENT_MOUNT           10
-#define CEPH_MSG_CLIENT_MOUNT_ACK       11
 #define CEPH_MSG_STATFS                 13
 #define CEPH_MSG_STATFS_REPLY           14
 #define CEPH_MSG_MON_SUBSCRIBE          15
 #define CEPH_MSG_MON_SUBSCRIBE_ACK      16
+#define CEPH_MSG_AUTH			17
+#define CEPH_MSG_AUTH_REPLY		18
 
 /* client <-> mds */
 #define CEPH_MSG_MDS_MAP                21
@@ -113,10 +130,35 @@ int ceph_file_layout_is_valid(const struct ceph_file_layout *layout);
 #define CEPH_MSG_CLIENT_SNAP            0x312
 #define CEPH_MSG_CLIENT_CAPRELEASE      0x313
 
+/* pool ops */
+#define CEPH_MSG_POOLOP_REPLY           48
+#define CEPH_MSG_POOLOP                 49
+
+
 /* osd */
-#define CEPH_MSG_OSD_MAP          41
-#define CEPH_MSG_OSD_OP           42
-#define CEPH_MSG_OSD_OPREPLY      43
+#define CEPH_MSG_OSD_MAP                41
+#define CEPH_MSG_OSD_OP                 42
+#define CEPH_MSG_OSD_OPREPLY            43
+#define CEPH_MSG_WATCH_NOTIFY           44
+
+
+/* watch-notify operations */
+enum {
+  WATCH_NOTIFY				= 1, /* notifying watcher */
+  WATCH_NOTIFY_COMPLETE			= 2, /* notifier notified when done */
+};
+
+
+/* pool operations */
+enum {
+  POOL_OP_CREATE			= 0x01,
+  POOL_OP_DELETE			= 0x02,
+  POOL_OP_AUID_CHANGE			= 0x03,
+  POOL_OP_CREATE_SNAP			= 0x11,
+  POOL_OP_DELETE_SNAP			= 0x12,
+  POOL_OP_CREATE_UNMANAGED_SNAP		= 0x21,
+  POOL_OP_DELETE_UNMANAGED_SNAP		= 0x22,
+};
 
 struct ceph_mon_request_header {
 	__le64 have_version;
@@ -127,7 +169,6 @@ struct ceph_mon_request_header {
 struct ceph_mon_statfs {
 	struct ceph_mon_request_header monhdr;
 	struct ceph_fsid fsid;
-	__le64 tid;
 } __attribute__ ((packed));
 
 struct ceph_statfs {
@@ -137,11 +178,35 @@ struct ceph_statfs {
 
 struct ceph_mon_statfs_reply {
 	struct ceph_fsid fsid;
-	__le64 tid;
 	__le64 version;
 	struct ceph_statfs st;
 } __attribute__ ((packed));
 
+const char *ceph_pool_op_name(int op);
+
+struct ceph_mon_poolop {
+	struct ceph_mon_request_header monhdr;
+	struct ceph_fsid fsid;
+	__le32 pool;
+	__le32 op;
+	__le64 auid;
+	__le64 snapid;
+	__le32 name_len;
+} __attribute__ ((packed));
+
+struct ceph_mon_poolop_reply {
+	struct ceph_mon_request_header monhdr;
+	struct ceph_fsid fsid;
+	__le32 reply_code;
+	__le32 epoch;
+	char has_data;
+	char data[0];
+} __attribute__ ((packed));
+
+struct ceph_mon_unmanaged_snap {
+	__le64 snapid;
+} __attribute__ ((packed));
+
 struct ceph_osd_getmap {
 	struct ceph_mon_request_header monhdr;
 	struct ceph_fsid fsid;
@@ -157,11 +222,18 @@ struct ceph_client_mount {
 	struct ceph_mon_request_header monhdr;
 } __attribute__ ((packed));
 
+#define CEPH_SUBSCRIBE_ONETIME    1  /* i want only 1 update after have */
+
 struct ceph_mon_subscribe_item {
-	__le64 have_version;	__le64 have;
+	__le64 have_version;    __le64 have;
 	__u8 onetime;
 } __attribute__ ((packed));
 
+struct ceph_mon_subscribe_ack {
+	__le32 duration;         /* seconds */
+	struct ceph_fsid fsid;
+} __attribute__ ((packed));
+
 /*
  * mds states
  *   > 0 -> in
@@ -194,16 +266,18 @@ extern const char *ceph_mds_state_name(int s);
  *  - they also define the lock ordering by the MDS
  *  - a few of these are internal to the mds
  */
-#define CEPH_LOCK_DN          1
-#define CEPH_LOCK_ISNAP       2
-#define CEPH_LOCK_IVERSION    4     /* mds internal */
-#define CEPH_LOCK_IFILE       8     /* mds internal */
-#define CEPH_LOCK_IAUTH       32
-#define CEPH_LOCK_ILINK       64
-#define CEPH_LOCK_IDFT        128   /* dir frag tree */
-#define CEPH_LOCK_INEST       256   /* mds internal */
-#define CEPH_LOCK_IXATTR      512
-#define CEPH_LOCK_INO         2048  /* immutable inode bits; not a lock */
+#define CEPH_LOCK_DVERSION    1
+#define CEPH_LOCK_DN          2
+#define CEPH_LOCK_ISNAP       16
+#define CEPH_LOCK_IVERSION    32    /* mds internal */
+#define CEPH_LOCK_IFILE       64
+#define CEPH_LOCK_IAUTH       128
+#define CEPH_LOCK_ILINK       256
+#define CEPH_LOCK_IDFT        512   /* dir frag tree */
+#define CEPH_LOCK_INEST       1024  /* mds internal */
+#define CEPH_LOCK_IXATTR      2048
+#define CEPH_LOCK_IFLOCK      4096  /* advisory file locks */
+#define CEPH_LOCK_INO         8192  /* immutable inode bits; not a lock */
 
 /* client_session ops */
 enum {
@@ -239,11 +313,15 @@ enum {
 	CEPH_MDS_OP_GETATTR    = 0x00101,
 	CEPH_MDS_OP_LOOKUPHASH = 0x00102,
 	CEPH_MDS_OP_LOOKUPPARENT = 0x00103,
+	CEPH_MDS_OP_LOOKUPINO  = 0x00104,
 
 	CEPH_MDS_OP_SETXATTR   = 0x01105,
 	CEPH_MDS_OP_RMXATTR    = 0x01106,
 	CEPH_MDS_OP_SETLAYOUT  = 0x01107,
 	CEPH_MDS_OP_SETATTR    = 0x01108,
+	CEPH_MDS_OP_SETFILELOCK= 0x01109,
+	CEPH_MDS_OP_GETFILELOCK= 0x00110,
+	CEPH_MDS_OP_SETDIRLAYOUT=0x0110a,
 
 	CEPH_MDS_OP_MKNOD      = 0x01201,
 	CEPH_MDS_OP_LINK       = 0x01202,
@@ -253,7 +331,7 @@ enum {
 	CEPH_MDS_OP_RMDIR      = 0x01221,
 	CEPH_MDS_OP_SYMLINK    = 0x01222,
 
-	CEPH_MDS_OP_CREATE     = 0x00301,
+	CEPH_MDS_OP_CREATE     = 0x01301,
 	CEPH_MDS_OP_OPEN       = 0x00302,
 	CEPH_MDS_OP_READDIR    = 0x00305,
 
@@ -290,6 +368,7 @@ union ceph_mds_request_args {
 	struct {
 		__le32 frag;                 /* which dir fragment */
 		__le32 max_entries;          /* how many dentries to grab */
+		__le32 max_bytes;
 	} __attribute__ ((packed)) readdir;
 	struct {
 		__le32 mode;
@@ -313,13 +392,22 @@ union ceph_mds_request_args {
 	struct {
 		struct ceph_file_layout layout;
 	} __attribute__ ((packed)) setlayout;
+	struct {
+		__u8 rule; /* currently fcntl or flock */
+		__u8 type; /* shared, exclusive, remove*/
+		__le64 pid; /* process id requesting the lock */
+		__le64 pid_namespace;
+		__le64 start; /* initial location to lock */
+		__le64 length; /* num bytes to lock from start */
+		__u8 wait; /* will caller wait for lock to become available? */
+	} __attribute__ ((packed)) filelock_change;
 } __attribute__ ((packed));
 
 #define CEPH_MDS_FLAG_REPLAY        1  /* this is a replayed op */
 #define CEPH_MDS_FLAG_WANT_DENTRY   2  /* want dentry in reply */
 
 struct ceph_mds_request_head {
-	__le64 tid, oldest_client_tid;
+	__le64 oldest_client_tid;
 	__le32 mdsmap_epoch;           /* on client */
 	__le32 flags;                  /* CEPH_MDS_FLAG_* */
 	__u8 num_retry, num_fwd;       /* count retry, fwd attempts */
@@ -342,7 +430,6 @@ struct ceph_mds_request_release {
 
 /* client reply */
 struct ceph_mds_reply_head {
-	__le64 tid;
 	__le32 op;
 	__le32 result;
 	__le32 mdsmap_epoch;
@@ -392,7 +479,7 @@ struct ceph_mds_reply_inode {
 	struct ceph_timespec rctime;
 	struct ceph_frag_tree_head fragtree;  /* (must be at end of struct) */
 } __attribute__ ((packed));
-/* followed by frag array, then symlink string, then xattr blob */
+/* followed by frag array, symlink string, dir layout, xattr blob */
 
 /* reply_lease follows dname, and reply_inode */
 struct ceph_mds_reply_lease {
@@ -408,6 +495,23 @@ struct ceph_mds_reply_dirfrag {
 	__le32 dist[];
 } __attribute__ ((packed));
 
+#define CEPH_LOCK_FCNTL    1
+#define CEPH_LOCK_FLOCK    2
+
+#define CEPH_LOCK_SHARED   1
+#define CEPH_LOCK_EXCL     2
+#define CEPH_LOCK_UNLOCK   4
+
+struct ceph_filelock {
+	__le64 start;/* file offset to start lock at */
+	__le64 length; /* num bytes to lock; 0 for all following start */
+	__le64 client; /* which client holds the lock */
+	__le64 pid; /* process id holding the lock on the client */
+	__le64 pid_namespace;
+	__u8 type; /* shared lock, exclusive lock, or unlock */
+} __attribute__ ((packed));
+
+
 /* file access modes */
 #define CEPH_FILE_MODE_PIN        0
 #define CEPH_FILE_MODE_RD         1
@@ -436,9 +540,10 @@ int ceph_flags_to_mode(int flags);
 #define CEPH_CAP_SAUTH      2
 #define CEPH_CAP_SLINK      4
 #define CEPH_CAP_SXATTR     6
-#define CEPH_CAP_SFILE      8   /* goes at the end (uses >2 cap bits) */
+#define CEPH_CAP_SFILE      8
+#define CEPH_CAP_SFLOCK    20 
 
-#define CEPH_CAP_BITS       16
+#define CEPH_CAP_BITS       22
 
 /* composed values */
 #define CEPH_CAP_AUTH_SHARED  (CEPH_CAP_GSHARED  << CEPH_CAP_SAUTH)
@@ -456,6 +561,9 @@ int ceph_flags_to_mode(int flags);
 #define CEPH_CAP_FILE_BUFFER   (CEPH_CAP_GBUFFER   << CEPH_CAP_SFILE)
 #define CEPH_CAP_FILE_WREXTEND (CEPH_CAP_GWREXTEND << CEPH_CAP_SFILE)
 #define CEPH_CAP_FILE_LAZYIO   (CEPH_CAP_GLAZYIO   << CEPH_CAP_SFILE)
+#define CEPH_CAP_FLOCK_SHARED  (CEPH_CAP_GSHARED   << CEPH_CAP_SFLOCK)
+#define CEPH_CAP_FLOCK_EXCL    (CEPH_CAP_GEXCL     << CEPH_CAP_SFLOCK)
+
 
 /* cap masks (for getattr) */
 #define CEPH_STAT_CAP_INODE    CEPH_CAP_PIN
@@ -491,7 +599,8 @@ int ceph_flags_to_mode(int flags);
 			      CEPH_CAP_FILE_EXCL)
 #define CEPH_CAP_ANY_WR   (CEPH_CAP_ANY_EXCL | CEPH_CAP_ANY_FILE_WR)
 #define CEPH_CAP_ANY      (CEPH_CAP_ANY_RD | CEPH_CAP_ANY_EXCL | \
-			   CEPH_CAP_ANY_FILE_WR | CEPH_CAP_PIN)
+			   CEPH_CAP_ANY_FILE_WR | CEPH_CAP_FILE_LAZYIO | \
+			   CEPH_CAP_PIN)
 
 #define CEPH_CAP_LOCKS (CEPH_LOCK_IFILE | CEPH_LOCK_IAUTH | CEPH_LOCK_ILINK | \
 			CEPH_LOCK_IXATTR)
@@ -528,7 +637,6 @@ struct ceph_mds_caps {
 	__le32 migrate_seq;
 	__le64 snap_follows;
 	__le32 snap_trace_len;
-	__le64 client_tid;          /* for FLUSH(SNAP) -> FLUSH(SNAP)_ACK */
 
 	/* authlock */
 	__le32 uid, gid, mode;
@@ -582,12 +690,21 @@ struct ceph_mds_cap_reconnect {
 	__le64 cap_id;
 	__le32 wanted;
 	__le32 issued;
+	__le64 snaprealm;
+	__le64 pathbase;        /* base ino for our path to this ino */
+	__le32 flock_len;       /* size of flock state blob, if any */
+} __attribute__ ((packed));
+/* followed by flock blob */
+
+struct ceph_mds_cap_reconnect_v1 {
+	__le64 cap_id;
+	__le32 wanted;
+	__le32 issued;
 	__le64 size;
 	struct ceph_timespec mtime, atime;
 	__le64 snaprealm;
 	__le64 pathbase;        /* base ino for our path to this ino */
 } __attribute__ ((packed));
-/* followed by encoded string */
 
 struct ceph_mds_snaprealm_reconnect {
 	__le64 ino;     /* snap realm base */
diff --git a/wireshark/ceph/crc32c.h b/wireshark/ceph/crc32c.h
index 13df359..e3cf8ff 100644
--- a/wireshark/ceph/crc32c.h
+++ b/wireshark/ceph/crc32c.h
@@ -5,7 +5,7 @@
 extern "C" {
 #endif
 
-uint32_t crc32c_le(uint32_t crc, unsigned char const *data, unsigned length);
+uint32_t ceph_crc32c_le(uint32_t crc, unsigned char const *data, unsigned length);
 
 #ifdef __cplusplus
 }
diff --git a/wireshark/ceph/msgr.h b/wireshark/ceph/msgr.h
index 2f61704..2604e1a 100644
--- a/wireshark/ceph/msgr.h
+++ b/wireshark/ceph/msgr.h
@@ -1,6 +1,10 @@
 #ifndef CEPH_MSGR_H
 #define CEPH_MSGR_H
 
+#ifdef __cplusplus
+#include <sys/socket.h> // for struct sockaddr_storage
+#endif
+
 /*
  * Data types for message passing layer used by Ceph.
  */
@@ -21,7 +25,7 @@
  * whenever the wire protocol changes.  try to keep this string length
  * constant.
  */
-#define CEPH_BANNER "ceph v022"
+#define CEPH_BANNER "ceph v027"
 #define CEPH_BANNER_MAX_LEN 30
 
 
@@ -46,33 +50,25 @@ struct ceph_entity_name {
 	__le64 num;
 } __attribute__ ((packed));
 
-#define CEPH_ENTITY_TYPE_MON    1
-#define CEPH_ENTITY_TYPE_MDS    2
-#define CEPH_ENTITY_TYPE_OSD    3
-#define CEPH_ENTITY_TYPE_CLIENT 4
+#define CEPH_ENTITY_TYPE_MON    0x01
+#define CEPH_ENTITY_TYPE_MDS    0x02
+#define CEPH_ENTITY_TYPE_OSD    0x04
+#define CEPH_ENTITY_TYPE_CLIENT 0x08
+#define CEPH_ENTITY_TYPE_AUTH   0x20
+
+#define CEPH_ENTITY_TYPE_ANY    0xFF
+
+extern const char *ceph_entity_type_name(int type);
 
 /*
  * entity_addr -- network address
  */
 struct ceph_entity_addr {
-	__le32 erank;  /* entity's rank in process */
+	__le32 type;
 	__le32 nonce;  /* unique id for process (e.g. pid) */
 	struct sockaddr_storage in_addr;
 } __attribute__ ((packed));
 
-static inline bool ceph_entity_addr_is_local(const struct ceph_entity_addr *a,
-					     const struct ceph_entity_addr *b)
-{
-	return a->nonce == b->nonce &&
-		memcmp(&a->in_addr, &b->in_addr, sizeof(a->in_addr)) == 0;
-}
-
-static inline bool ceph_entity_addr_equal(const struct ceph_entity_addr *a,
-					  const struct ceph_entity_addr *b)
-{
-	return memcmp(a, b, sizeof(*a)) == 0;
-}
-
 struct ceph_entity_inst {
 	struct ceph_entity_name name;
 	struct ceph_entity_addr addr;
@@ -93,24 +89,32 @@ struct ceph_entity_inst {
 #define CEPH_MSGR_TAG_ACK           8  /* message ack */
 #define CEPH_MSGR_TAG_KEEPALIVE     9  /* just a keepalive byte! */
 #define CEPH_MSGR_TAG_BADPROTOVER  10  /* bad protocol version */
+#define CEPH_MSGR_TAG_BADAUTHORIZER 11 /* bad authorizer */
+#define CEPH_MSGR_TAG_FEATURES      12 /* insufficient features */
+#define CEPH_MSGR_TAG_SEQ           13 /* 64-bit int follows with seen seq number */
 
 
 /*
  * connection negotiation
  */
 struct ceph_msg_connect {
+	__le64 features;     /* supported feature bits */
 	__le32 host_type;    /* CEPH_ENTITY_TYPE_* */
 	__le32 global_seq;   /* count connections initiated by this host */
 	__le32 connect_seq;  /* count connections initiated in this session */
 	__le32 protocol_version;
+	__le32 authorizer_protocol;
+	__le32 authorizer_len;
 	__u8  flags;         /* CEPH_MSG_CONNECT_* */
 } __attribute__ ((packed));
 
 struct ceph_msg_connect_reply {
 	__u8 tag;
+	__le64 features;     /* feature bits for this session */
 	__le32 global_seq;
 	__le32 connect_seq;
 	__le32 protocol_version;
+	__le32 authorizer_len;
 	__u8 flags;
 } __attribute__ ((packed));
 
@@ -120,8 +124,9 @@ struct ceph_msg_connect_reply {
 /*
  * message header
  */
-struct ceph_msg_header {
+struct ceph_msg_header_old {
 	__le64 seq;       /* message seq# for this session */
+	__le64 tid;       /* transaction id */
 	__le16 type;      /* message type */
 	__le16 priority;  /* priority.  higher value == higher priority */
 	__le16 version;   /* version of message encoding */
@@ -133,10 +138,30 @@ struct ceph_msg_header {
 			     receiver: mask against ~PAGE_MASK */
 
 	struct ceph_entity_inst src, orig_src;
-	__le32 dst_erank;
+	__le32 reserved;
+	__le32 crc;       /* header crc32c */
+} __attribute__ ((packed));
+
+
+struct ceph_msg_header {
+	__le64 seq;       /* message seq# for this session */
+	__le64 tid;       /* transaction id */
+	__le16 type;      /* message type */
+	__le16 priority;  /* priority.  higher value == higher priority */
+	__le16 version;   /* version of message encoding */
+
+	__le32 front_len; /* bytes in main payload */
+	__le32 middle_len;/* bytes in middle payload */
+	__le32 data_len;  /* bytes of data payload */
+	__le16 data_off;  /* sender: include full offset;
+			     receiver: mask against ~PAGE_MASK */
+
+	struct ceph_entity_name src;
+	__le32 reserved;
 	__le32 crc;       /* header crc32c */
 } __attribute__ ((packed));
 
+
 #define CEPH_MSG_PRIO_LOW     64
 #define CEPH_MSG_PRIO_DEFAULT 127
 #define CEPH_MSG_PRIO_HIGH    196
diff --git a/wireshark/ceph/packet-ceph.c b/wireshark/ceph/packet-ceph.c
index 754478d..5acdd43 100644
--- a/wireshark/ceph/packet-ceph.c
+++ b/wireshark/ceph/packet-ceph.c
@@ -18,18 +18,21 @@
 # include "config.h"
 #endif
 
+
 #include <stdio.h>
 #include <glib.h>
 #include <epan/packet.h>
+#include <epan/tvbuff.h>
+#include <epan/tvbuff-int.h>
+
 #include <epan/dissectors/packet-tcp.h>
 
 #include "types.h"
-
 #include "crc32c.h"
-
 #include <string.h>
 
 #define PROTO_TAG_CEPH	"CEPH"
+#define AUTH_LEN		174
 
 /* Wireshark ID of the CEPH protocol */
 static int proto_ceph = -1;
@@ -69,6 +72,14 @@ static guint32 global_ceph_max_mon_port = 6799;
 #define PROTO_ADD_TEXT(type, s, field, modifier)\
 	proto_tree_add_text(tree, tvb, offset + offsetof(type, field), sizeof(s->field), "" #field ": " modifier, s->field);
 
+#define PROTO_ADD_SIMPLE_TEXT(tree,getter,format,var)\
+	do { \
+	    var = getter(tvb,offset); \
+	    proto_tree_add_text(tree, tvb, offset, sizeof(var), format, var);\
+	    offset += sizeof(var); \
+	} while(0)
+
+
 #define PROTO_ADD_ITEM(tree, type, hf, s, field) \
 	proto_tree_add_item(tree, hf, tvb, offset + offsetof(type, field), sizeof(s->field), TRUE);
 
@@ -91,6 +102,11 @@ static const value_string packettypenames[] = {
 	{ 11, "Client Mount Ack" },
 	{ 12, "Client Unmount" },
 	{ 13, "Statfs" },
+	{ 14, "Statfs Reply" },
+	{ 15, "Mon Subscribe" },
+	{ 16, "Mon Subscribe Ack" },
+	{ 17, "Authentication" },
+	{ 18, "Authentication reply" },
 	{ 20, "MDS Get Map" },
 	{ 21, "MDS Map" },
 	{ 22, "Client Session" },
@@ -101,10 +117,14 @@ static const value_string packettypenames[] = {
 	{ 0x310, "Client Caps" },
 	{ 0x311, "Client Lease" },
 	{ 0x312, "Client Snap" },
+	{ 0x313, "Client Cap Release" },
 	{ 40, "OSD Get Map" },
 	{ 41, "OSD Map" },
 	{ 42, "OSD Op" },
 	{ 43, "OSD Op Reply" },
+	{ 44, "Watch Notify" },
+	{ 48, "Poolop Reply" },
+	{ 49, "Poolop" },
 	{ 0, NULL }
 };	
 
@@ -168,7 +188,11 @@ static gint hf_ceph_footer_flags = -1;
 static gint hf_ceph_footer_front_crc = -1;
 static gint hf_ceph_footer_middle_crc = -1;
 static gint hf_ceph_footer_data_crc = -1;
-
+static gint hf_ceph_monmap = -1;
+static gint hf_ceph_mdsmap = -1;
+static gint hf_ceph_mdsnode = -1;
+static gint hf_ceph_auth_reply = -1;
+static gint hf_ceph_pgpools = -1;
 
 /* These are the ids of the subtrees that we may be creating */
 static gint ett_ceph = -1;
@@ -183,6 +207,65 @@ static gint ett_ceph_data = -1;
 static gint ett_ceph_footer = -1;
 
 
+const char *ceph_cap_op_name(int op)
+{
+        char* plop = malloc(16*sizeof(char));
+        sprintf(plop,"%i",op);
+        switch (op) {
+        case CEPH_CAP_OP_GRANT: return "grant";
+        case CEPH_CAP_OP_REVOKE: return "revoke";
+        case CEPH_CAP_OP_TRUNC: return "trunc";
+        case CEPH_CAP_OP_EXPORT: return "export";
+        case CEPH_CAP_OP_IMPORT: return "import";
+        case CEPH_CAP_OP_UPDATE: return "update";
+        case CEPH_CAP_OP_DROP: return "drop";
+        case CEPH_CAP_OP_FLUSH: return "flush";
+        case CEPH_CAP_OP_FLUSH_ACK: return "flush_ack";
+        case CEPH_CAP_OP_FLUSHSNAP: return "flushsnap";
+        case CEPH_CAP_OP_FLUSHSNAP_ACK: return "flushsnap_ack";
+        case CEPH_CAP_OP_RELEASE: return "release";
+        case CEPH_CAP_OP_RENEW: return "renew";
+        }
+        return plop;
+}
+
+const char *ceph_mds_op_name(int op)
+{
+  char* plop = malloc(16*sizeof(char));
+         sprintf(plop,"%i",op);
+        switch (op) {
+        case CEPH_MDS_OP_LOOKUP:  return "lookup";
+        case CEPH_MDS_OP_LOOKUPHASH:  return "lookuphash";
+        case CEPH_MDS_OP_LOOKUPPARENT:  return "lookupparent";
+        case CEPH_MDS_OP_LOOKUPINO:  return "lookupino";
+        case CEPH_MDS_OP_GETATTR:  return "getattr";
+        case CEPH_MDS_OP_SETXATTR: return "setxattr";
+        case CEPH_MDS_OP_SETATTR: return "setattr";
+        case CEPH_MDS_OP_RMXATTR: return "rmxattr";
+        case CEPH_MDS_OP_SETLAYOUT: return "setlayou";
+        case CEPH_MDS_OP_SETDIRLAYOUT: return "setdirlayout";
+        case CEPH_MDS_OP_READDIR: return "readdir";
+        case CEPH_MDS_OP_MKNOD: return "mknod";
+        case CEPH_MDS_OP_LINK: return "link";
+        case CEPH_MDS_OP_UNLINK: return "unlink";
+        case CEPH_MDS_OP_RENAME: return "rename";
+        case CEPH_MDS_OP_MKDIR: return "mkdir";
+        case CEPH_MDS_OP_RMDIR: return "rmdir";
+        case CEPH_MDS_OP_SYMLINK: return "symlink";
+        case CEPH_MDS_OP_CREATE: return "create";
+        case CEPH_MDS_OP_OPEN: return "open";
+        case CEPH_MDS_OP_LOOKUPSNAP: return "lookupsnap";
+        case CEPH_MDS_OP_LSSNAP: return "lssnap";
+        case CEPH_MDS_OP_MKSNAP: return "mksnap";
+        case CEPH_MDS_OP_RMSNAP: return "rmsnap";
+        case CEPH_MDS_OP_SETFILELOCK: return "setfilelock";
+        case CEPH_MDS_OP_GETFILELOCK: return "getfilelock";
+        }
+        return plop;
+}
+
+
+
 void proto_reg_handoff_ceph(void)
 {
 	static gboolean initialized=FALSE;
@@ -207,8 +290,23 @@ void proto_register_ceph (void)
 	*/
 	static hf_register_info hf[] = {
 		{ &hf_ceph,
-			{ "Data", "ceph.data", FT_NONE, BASE_NONE, NULL, 0x0,
+			{ "Data", "ceph.data", FT_NONE , BASE_NONE, NULL, 0,
 			"CEPH PDU", HFILL }},
+		{ &hf_ceph_pgpools,
+			{ "pgpools", "ceph.pgpools", FT_NONE , BASE_NONE, NULL, 0,
+			"CEPH PG Pools", HFILL }},
+		{ &hf_ceph_monmap,
+			{ "MON map", "ceph.monmap", FT_NONE , BASE_NONE, NULL, 0,
+			"CEPH MON map", HFILL }},
+		{ &hf_ceph_mdsmap,
+			{ "MDS map", "ceph.mdsmap", FT_NONE , BASE_NONE, NULL, 0,
+			"CEPH MDS map", HFILL }},
+		{ &hf_ceph_mdsnode,
+			{ "MDS node", "ceph.mdsnode", FT_NONE , BASE_NONE, NULL, 0,
+			"CEPH MDS node", HFILL }},
+		{ &hf_ceph_auth_reply,
+			{ "Authentication reply", "ceph.auth.reply", FT_NONE , BASE_NONE, NULL, 0,
+			"CEPH Authentication reply", HFILL }},
 		{ &hf_ceph_header,
 			{ "Header", "ceph.header", FT_NONE, BASE_NONE, NULL, 0x0,
 		 	"CEPH Header", HFILL }},
@@ -219,7 +317,7 @@ void proto_register_ceph (void)
 			{ "Ceph Entity Type", "ceph.entity.type", FT_UINT32, BASE_DEC, NULL, 0x0,
 			"Ceph Entity Type", HFILL }},
 		{ &hf_ceph_entity_num,
-			{ "Ceph Entity Num", "ceph.entity.num", FT_UINT32, BASE_DEC, NULL, 0x0,
+			{ "Ceph Entity Num", "ceph.entity.num", FT_UINT64, BASE_DEC, NULL, 0x0,
 			"Ceph Entity Num", HFILL }},
 		{ &hf_ceph_entity_addr,
 			{ "Ceph Entity Addr", "ceph.entity.addr", FT_NONE, BASE_NONE, NULL, 0x0,
@@ -339,10 +437,10 @@ void proto_register_ceph (void)
 			{ "Front", "ceph.front", FT_NONE, BASE_NONE, NULL, 0x0,
 		 	"Ceph Front", HFILL }},
 		{ &hf_ceph_data,
-			{ "Data", "ceph.data", FT_NONE, BASE_HEX, NULL, 0x0,
+			{ "Data", "ceph.data", FT_NONE, BASE_NONE, NULL, 0x0,
 		 	"Ceph Data", HFILL }},
 		{ &hf_ceph_footer,
-			{ "Footer", "ceph.footer", FT_NONE, BASE_HEX, NULL, 0x0,
+			{ "Footer", "ceph.footer", FT_NONE, BASE_NONE, NULL, 0x0,
 		 	"Ceph Footer", HFILL }},
 		{ &hf_ceph_footer_flags,
 			{ "flags", "ceph.footer.flags", FT_UINT32, BASE_HEX, NULL, 0x0,
@@ -367,7 +465,7 @@ void proto_register_ceph (void)
 		&ett_ceph_text,
 		&ett_ceph_data,
 		&ett_ceph_front,
-		&ett_ceph_footer
+		&ett_ceph_footer,
 	};
 	//if (proto_ceph == -1) { /* execute protocol initialization only once */
 	proto_ceph = proto_register_protocol ("CEPH Protocol", "CEPH", "ceph");
@@ -430,40 +528,30 @@ static guint32 dissect_ceph_entity_addr(tvbuff_t *tvb, proto_tree *tree, guint32
 
 static guint32 dissect_ceph_fsid(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-	proto_tree *ceph_entity_tree = NULL;
-	proto_item *ceph_sub_item = NULL;
-	struct ceph_fsid *fsid;
-
-	fsid = (struct ceph_fsid *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_fsid));
-
-	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_fsid, tvb, offset, sizeof(struct ceph_entity_addr), TRUE );
-	ceph_entity_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
-
-	proto_tree_add_item(ceph_entity_tree, hf_ceph_connect_erank, tvb, offset, 4, TRUE);
-	proto_tree_add_item(ceph_entity_tree, hf_ceph_connect_nonce, tvb, offset+4, 4, TRUE);
-
-	proto_tree_add_text(tree, tvb, 0, 
-				sizeof(struct ceph_fsid), "fsid: " FMT_INO "." FMT_INO, ((unsigned long long *)fsid->fsid)[0], ((unsigned long long *)fsid->fsid)[1]);
-	
+	struct ceph_fsid fsid;
+	guint32 * fsid_dec = NULL;
+	fsid_dec = malloc(4*sizeof(guint32));
+	fsid = *(struct ceph_fsid *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_fsid));
+	memcpy(fsid_dec,fsid.fsid,4*sizeof(guint32));
+	proto_tree_add_text(tree, tvb, offset,sizeof(struct ceph_fsid), "fsid: %x-%x-%x-%x",
+			ntohl(fsid_dec[0]),
+			ntohl(fsid_dec[1]),
+			ntohl(fsid_dec[2]),
+			ntohl(fsid_dec[3])
+			);
 	offset += sizeof(struct ceph_fsid);
-
 	return offset;
 }
 
-static guint32 dissect_ceph_entity_inst(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
+guint32 dissect_ceph_entity_name(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
 {
-	proto_tree *ceph_entity_tree = NULL;
-	proto_item *ceph_sub_item = NULL;
-
-	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_entity_addr, tvb, offset, sizeof(struct ceph_entity_addr), TRUE );
-	ceph_entity_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
-	proto_tree_add_item(ceph_entity_tree, hf_ceph_entity_type, tvb, offset, 4, TRUE);
-	proto_tree_add_item(ceph_entity_tree, hf_ceph_entity_num, tvb, offset+4, 4, TRUE);
-	offset += 8;
-	offset = dissect_ceph_entity_addr(tvb, ceph_entity_tree, offset);
+	proto_tree_add_item(tree, hf_ceph_entity_type, tvb, offset, 1, TRUE);
+	proto_tree_add_item(tree, hf_ceph_entity_num, tvb, offset+1, 8, TRUE);
+	offset += sizeof(struct ceph_entity_name);
 	return offset;
 }
 
+
 static guint32 dissect_ceph_footer(tvbuff_t *tvb, proto_tree *tree, guint32 offset, guint32 data_crc)
 {
 	proto_tree *ceph_footer_tree = NULL;
@@ -472,13 +560,13 @@ static guint32 dissect_ceph_footer(tvbuff_t *tvb, proto_tree *tree, guint32 offs
 
 	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_footer, tvb, offset, sizeof(struct ceph_msg_footer), TRUE );
 	ceph_footer_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
-	proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_flags, tvb, offset, 4, TRUE);
-	proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_front_crc, tvb, offset+4, 4, TRUE);
-	proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_middle_crc, tvb, offset+8, 4, TRUE);
-	data_crc_item = proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_data_crc, tvb, offset+12, 4, TRUE);
+	proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_front_crc, tvb, offset, 4, TRUE);
+	proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_middle_crc, tvb, offset+4, 4, TRUE);
+	data_crc_item = proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_data_crc, tvb, offset+8, 4, TRUE);
 	proto_item_append_text(data_crc_item, " (calculated %x)", data_crc);
+	proto_tree_add_item(ceph_footer_tree, hf_ceph_footer_flags, tvb, offset+12, 1, TRUE);
 
-	offset += 12;
+	offset += 13;
 	return offset;
 }
 
@@ -488,6 +576,7 @@ static guint32 dissect_ceph_client_connect(tvbuff_t *tvb, proto_tree *tree, guin
 	proto_item *ceph_sub_item = NULL;
 	proto_item *ceph_item = proto_tree_get_parent(tree);
 	struct ceph_msg_connect *msg;
+	guint32 auth_len = 0;
 
 	offset = dissect_ceph_banner(tvb, tree, offset);
 
@@ -507,12 +596,19 @@ static guint32 dissect_ceph_client_connect(tvbuff_t *tvb, proto_tree *tree, guin
 #endif
 
 	msg = (struct ceph_msg_connect *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_msg_connect));
+	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, features, "%lld");
 	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, host_type, "%d");
-	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, global_seq, "%d");
 	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, connect_seq, "%d");
+	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, global_seq, "%d");
 	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, protocol_version, "%d");
 	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, flags, "%x");
-
+	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, authorizer_protocol, "%d");
+	PROTO_ADD_TEXT(struct ceph_msg_connect, msg, authorizer_len, "%d");
+	offset += sizeof(struct ceph_msg_connect);
+	auth_len = msg->authorizer_len;
+	auth_len = 174;
+	proto_tree_add_text(tree,tvb, offset, auth_len, "Authentication key");
+	offset += auth_len;
 	return offset;
 }
 
@@ -534,9 +630,11 @@ static guint32 dissect_ceph_server_connect(tvbuff_t *tvb, proto_tree *tree, guin
 	offset = dissect_ceph_entity_addr(tvb, ceph_header_tree, offset);
 	msg = (struct ceph_msg_connect_reply *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_msg_connect_reply));
 	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, tag, "%d");
+	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, features, "%lld");
 	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, global_seq, "%d");
 	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, connect_seq, "%d");
 	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, protocol_version, "%d");
+	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, authorizer_len, "%d");
 	PROTO_ADD_TEXT(struct ceph_msg_connect_reply, msg, flags, "%x");
 
 	return offset;
@@ -594,7 +692,7 @@ static guint32 dissect_ceph_mon_statfs(tvbuff_t *tvb, proto_tree *tree, guint32
 	req = (struct ceph_mon_statfs *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_mon_statfs));
 	
 	dissect_ceph_fsid(tvb, tree, offset + offsetof(struct ceph_mon_statfs, fsid));
-	PROTO_ADD_TEXT(struct ceph_mon_statfs, req, tid, "%lld");
+	PROTO_ADD_TEXT(struct ceph_mon_statfs, req, monhdr.session_mon_tid, "%lld");
 
 	return offset + sizeof(struct ceph_mon_statfs);
 }
@@ -606,7 +704,8 @@ static guint32 dissect_ceph_mon_statfs_reply(tvbuff_t *tvb, proto_tree *tree, gu
 	req = (struct ceph_mon_statfs_reply *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_mon_statfs_reply));
 	
 	dissect_ceph_fsid(tvb, tree, offset + offsetof(struct ceph_mon_statfs_reply, fsid));
-	PROTO_ADD_TEXT(struct ceph_mon_statfs_reply, req, tid, "%lld");
+	PROTO_ADD_TEXT(struct ceph_mon_statfs_reply, req, version, "%lld");
+
 	PROTO_ADD_TEXT(struct ceph_mon_statfs_reply, req, st.kb, "%lld");
 	PROTO_ADD_TEXT(struct ceph_mon_statfs_reply, req, st.kb_used, "%lld");
 	PROTO_ADD_TEXT(struct ceph_mon_statfs_reply, req, st.kb_avail, "%lld");
@@ -646,7 +745,7 @@ static guint32 dissect_ceph_client_mds_request(tvbuff_t *tvb, packet_info *pinfo
 
 	head = (struct ceph_mds_request_head *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_mds_request_head));
 	
-	PROTO_ADD_TEXT(struct ceph_mds_request_head, head, tid, "%lld");
+	//PROTO_ADD_TEXT(struct ceph_mds_request_head, head, tid, "%lld");
 	PROTO_ADD_TEXT(struct ceph_mds_request_head, head, oldest_client_tid, "%lld");
 	PROTO_ADD_TEXT(struct ceph_mds_request_head, head, mdsmap_epoch, "%d");
 	PROTO_ADD_TEXT(struct ceph_mds_request_head, head, num_retry, "%d");
@@ -695,6 +794,7 @@ static guint32 dissect_ceph_client_mds_request(tvbuff_t *tvb, packet_info *pinfo
 	case CEPH_MDS_OP_LSSNAP:
 	case CEPH_MDS_OP_MKSNAP:
 	case CEPH_MDS_OP_RMSNAP:
+	case CEPH_MDS_OP_CREATE:
 		break;
 	}
 
@@ -730,7 +830,7 @@ static guint32 dissect_ceph_client_mds_reply(tvbuff_t *tvb, packet_info *pinfo,
 
 	head = (struct ceph_mds_reply_head *)tvb_get_ptr(tvb, offset, sizeof(struct ceph_mds_reply_head));
 	
-	PROTO_ADD_TEXT(struct ceph_mds_reply_head, head, tid, "%lld");
+	//PROTO_ADD_TEXT(struct ceph_mds_reply_head, head, tid, "%lld");
 
 	proto_tree_add_text(tree, tvb, offsetof(struct ceph_mds_reply_head, op), 
 				sizeof(head->op), "op: %d (%s)", head->op, ceph_mds_op_name(head->op));
@@ -789,7 +889,7 @@ static guint32 dissect_ceph_client_mds_caps_request(tvbuff_t *tvb, packet_info *
 	PROTO_ADD_TEXT(struct ceph_mds_caps, head, snap_follows, "%llu");
 	PROTO_ADD_TEXT(struct ceph_mds_caps, head, snap_trace_len, "%d");
 
-#define CAPS_REQ_ADD_TIME(field) PROTO_ADD_TIME(tvb, tree, struct ceph_mds_caps, offset, head, field, field) 
+#define CAPS_REQ_ADD_TIME(field) PROTO_ADD_TIME(tvb, tree, struct ceph_mds_caps, offset, head, field, field)
 	CAPS_REQ_ADD_TIME(mtime);
 	CAPS_REQ_ADD_TIME(atime);
 	CAPS_REQ_ADD_TIME(ctime);
@@ -801,9 +901,163 @@ static guint32 dissect_ceph_client_mds_caps_request(tvbuff_t *tvb, packet_info *
 	return orig_ofs + sizeof(struct ceph_mds_caps);
 }
 
-static guint32 dissect_ceph_client_front(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint16 type)
+static guint32 dissect_ceph_auth_reply(tvbuff_t *tvb, proto_tree *tree, guint32 offset){
+	guint32 protocol, result, payload_len,str_len;
+	guint64 global_id;
+	proto_item *ceph_sub_item = NULL;
+	proto_item *ceph_item = proto_tree_get_parent(tree);
+    proto_tree *ceph_auth_reply_tree;
+
+    ceph_auth_reply_tree = proto_item_add_subtree(ceph_item, ett_ceph);
+	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_auth_reply, tvb, offset, 16, TRUE );
+    ceph_auth_reply_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
+
+    PROTO_ADD_SIMPLE_TEXT(ceph_auth_reply_tree,tvb_get_letohl,"protocol: %d",protocol);
+    PROTO_ADD_SIMPLE_TEXT(ceph_auth_reply_tree,tvb_get_letohl,"result: %d",result);
+    PROTO_ADD_SIMPLE_TEXT(ceph_auth_reply_tree,tvb_get_letoh64,"global_id: %lu", global_id);
+    PROTO_ADD_SIMPLE_TEXT(ceph_auth_reply_tree,tvb_get_letohl,"payload_len: %d",payload_len);
+
+    str_len = tvb_get_letohl(tvb,offset+payload_len);
+    proto_tree_add_text(ceph_auth_reply_tree, tvb, offset+payload_len, str_len,"%s",tvb_get_const_stringz(tvb,offset,&str_len));
+	return offset;
+}
+
+static guint32 dissect_ceph_pgpools(tvbuff_t *tvb, proto_tree *tree, guint32 offset){
+	guint32 n, i, pool;
+	proto_item *ceph_item = proto_tree_get_parent(tree);
+	proto_tree *ceph_pgpools_tree;
+	proto_item *ceph_sub_item = NULL;
+	ceph_pgpools_tree = proto_item_add_subtree(ceph_item, ett_ceph);
+	ceph_sub_item = proto_tree_add_item(tree, hf_ceph_pgpools, tvb, offset, -1, TRUE );
+	ceph_pgpools_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
+    PROTO_ADD_SIMPLE_TEXT(ceph_pgpools_tree,tvb_get_letohl," %d pool(s)",n);
+    for ( i = 0; i<n; i++){
+        PROTO_ADD_SIMPLE_TEXT(ceph_pgpools_tree,tvb_get_letohl,"data_pg_pool: %d",pool);
+        PROTO_ADD_SIMPLE_TEXT(ceph_pgpools_tree,tvb_get_letohl,"cas_pg_pool: %d",pool);
+    }
+	return offset;
+}
+static guint32 dissect_ceph_mdsmap_node(tvbuff_t *tvb, proto_tree *tree, guint32 offset){
+	guint8 infoversion;
+	guint32 field, num_export_targets, i;
+	guint64 global_id, field64;
+	proto_item *ceph_item = proto_tree_get_parent(tree);
+	proto_tree *ceph_mdsnode_tree;
+	proto_item *ceph_sub_item = NULL;
+	struct ceph_timespec *cephtime = NULL;
+	time_t time;
+	ceph_mdsnode_tree = proto_item_add_subtree(ceph_item, ett_ceph);
+	ceph_sub_item = proto_tree_add_item(tree, hf_ceph_mdsnode, tvb, offset, -1, TRUE );
+	ceph_mdsnode_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
+
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letoh64,"Global ID: %ld",global_id);
+	infoversion = *tvb_get_ptr(tvb,offset,sizeof(infoversion));
+	offset++;
+	offset+=sizeof(guint64);
+    proto_tree_add_text(ceph_mdsnode_tree, tvb, offset, sizeof(infoversion), "version: %d", infoversion);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letoh64,"Name length: %d",field);
+    proto_tree_add_text(ceph_mdsnode_tree, tvb, offset, field,"MDS name: %s",tvb_get_const_stringz(tvb,offset,&field));
+    offset+=field-1;
+    PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letohl,"mds: %d",field);
+    PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letohl,"inc: %d",field);
+    PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letohl,"state: %d",field);
+    PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letoh64,"state seq: %ld",field64);
+	offset = dissect_ceph_entity_addr(tvb, ceph_mdsnode_tree, offset);
+	cephtime = (struct ceph_timespec *) tvb_get_ptr(tvb, offset, sizeof(struct ceph_timespec));
+	time = cephtime->tv_sec;
+	proto_tree_add_text(ceph_mdsnode_tree, tvb, offset, sizeof(time), "Time: %s (%d ns)", ctime(&time), cephtime->tv_nsec);
+	offset += sizeof(struct ceph_timespec);
+	offset += sizeof(guint32);
+	offset += tvb_get_letohl(tvb,offset);
+	offset += sizeof(guint32);
+	//offset ++;
+	if (infoversion >= 2 ){
+		PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letohl,"num_export_targets: %d",num_export_targets);
+	}
+	else{
+		num_export_targets = 0;
+	}
+	for ( i = 0; i < num_export_targets ; i++){
+		PROTO_ADD_SIMPLE_TEXT(ceph_mdsnode_tree,tvb_get_letohl,"export_target: %d",field);
+	}
+
+	return offset;
+}
+
+static guint32 dissect_ceph_mon_map(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
+{
+	guint32 epoch, num_mon, len, i;
+	guint16 version;
+	proto_item *ceph_item = proto_tree_get_parent(tree);
+	proto_tree *ceph_monmap_tree;
+	proto_item *ceph_sub_item = NULL;
+	ceph_monmap_tree = proto_item_add_subtree(ceph_item, ett_ceph);
+	len = tvb_get_letohl(tvb,offset);
+	ceph_sub_item = proto_tree_add_item(tree, hf_ceph_monmap, tvb, offset, len, TRUE );
+	ceph_monmap_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
+
+	PROTO_ADD_SIMPLE_TEXT(ceph_monmap_tree,tvb_get_letohl,"length: %i",len);
+	PROTO_ADD_SIMPLE_TEXT(ceph_monmap_tree,tvb_get_letohs,"version: %i",version);
+	offset = dissect_ceph_fsid(tvb, ceph_monmap_tree, offset);
+	PROTO_ADD_SIMPLE_TEXT(ceph_monmap_tree,tvb_get_letohl,"epoch: %i",epoch);
+	PROTO_ADD_SIMPLE_TEXT(ceph_monmap_tree,tvb_get_letohl,"%i monitor",num_mon);
+	for (i = 0; i < num_mon; i++)
+		offset = dissect_ceph_entity_name(tvb, ceph_monmap_tree, offset);
+		offset = dissect_ceph_entity_addr(tvb, ceph_monmap_tree, offset);
+
+	return offset;
+}
+
+static guint32 dissect_ceph_mds_map(tvbuff_t *tvb, proto_tree *tree, guint32 offset)
+{
+	guint16 version;
+	guint32 epoch, map_len, len, plop, i;
+	guint64 max_filesize;
+	proto_item *ceph_item = proto_tree_get_parent(tree);
+	proto_tree *ceph_mdsmap_tree;
+	proto_item *ceph_sub_item = NULL;
+	ceph_mdsmap_tree = proto_item_add_subtree(ceph_item, ett_ceph);
+	len = tvb_get_letohl(tvb,offset);
+	ceph_sub_item = proto_tree_add_item(tree, hf_ceph_mdsmap, tvb, offset, len, TRUE );
+	ceph_mdsmap_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
+	offset = dissect_ceph_fsid(tvb, ceph_mdsmap_tree, offset);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"epoch: %i",epoch);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"map length: %i",map_len);
+
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"version: %i",version);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_epoch: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_client_epoch: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_last_failure: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_root: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_session_timeout: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_session_autoclose: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letoh64,"m_maxfile_size: %ld",max_filesize);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"m_max_mds: %i",plop);
+	PROTO_ADD_SIMPLE_TEXT(ceph_mdsmap_tree,tvb_get_letohl,"n: %i",len);
+
+
+	for (i = 0; i < len; i++){
+		 offset = dissect_ceph_mdsmap_node(tvb, ceph_mdsmap_tree, offset);
+	}
+	offset = dissect_ceph_pgpools(tvb, ceph_mdsmap_tree, offset);
+	return offset;
+}
+
+static guint32 dissect_ceph_front(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, guint32 offset, guint16 type)
 {
 	switch (type) {
+/*	case CEPH_MSG_AUTH:
+		offset = dissect_ceph_auth();
+		break;*/
+	case CEPH_MSG_AUTH_REPLY:
+		offset = dissect_ceph_auth_reply(tvb, tree, offset);
+		break;
+	case CEPH_MSG_MON_MAP:
+		offset = dissect_ceph_mon_map(tvb, tree, offset);
+		break;
+	case CEPH_MSG_MDS_MAP:
+		offset = dissect_ceph_mds_map(tvb, tree, offset);
+		break;
 	case CEPH_MSG_STATFS:
 		offset = dissect_ceph_mon_statfs(tvb, tree, offset);
 		break;
@@ -835,18 +1089,23 @@ static guint32 dissect_ceph_generic(tvbuff_t *tvb, packet_info *pinfo, proto_tre
 	proto_item *ceph_item = proto_tree_get_parent(tree);
 	guint32 front_len, middle_len, data_len;
 	guint8 tag;
+	guint32 hlen;
 	guint32 orig_ofs = offset;
 	guint16 type;
 	guint64 seq;
 	struct ceph_msg_header *header;
     unsigned int data_crc = 0;
 
+    tag = tvb_get_guint8(tvb, offset);
+    hlen = ( tag == CEPH_MSGR_TAG_ACK ) ? ACK_MSG_SIZE:0;
+    hlen += sizeof(struct ceph_msg_header);
+    hlen++;
+
 	ceph_header_tree = proto_item_add_subtree(ceph_item, ett_ceph);
 
-	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_header, tvb, offset, -1, TRUE );
+	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_header, tvb, offset, hlen, TRUE );
 	ceph_header_tree = proto_item_add_subtree(ceph_sub_item, ett_ceph);
 
-	tag = tvb_get_guint8(tvb, offset);
 
 	if (tag == CEPH_MSGR_TAG_ACK) {
 		proto_tree_add_item(ceph_header_tree, hf_ceph_hdr_tag, tvb, offset, 1, TRUE);
@@ -867,23 +1126,22 @@ static guint32 dissect_ceph_generic(tvbuff_t *tvb, packet_info *pinfo, proto_tre
 	PROTO_ADD_ITEM(ceph_header_tree, struct ceph_msg_header, hf_ceph_hdr_middle_len, header, middle_len);
 	PROTO_ADD_ITEM(ceph_header_tree, struct ceph_msg_header, hf_ceph_hdr_data_off, header, data_off);
 	PROTO_ADD_ITEM(ceph_header_tree, struct ceph_msg_header, hf_ceph_hdr_data_len, header, data_len);
-	dissect_ceph_entity_inst(tvb, ceph_header_tree, offset + offsetof(struct ceph_msg_header, src));
-	dissect_ceph_entity_inst(tvb, ceph_header_tree, offset + offsetof(struct ceph_msg_header, orig_src));
 	PROTO_ADD_ITEM(ceph_header_tree, struct ceph_msg_header, hf_ceph_hdr_crc, header, crc);
-	
-	offset += sizeof(struct ceph_msg_header);
-	
+
+	// Bad location
+	dissect_ceph_entity_name(tvb, ceph_header_tree, offset + offsetof(struct ceph_msg_header, src));
+	//dissect_ceph_entity_inst(tvb, ceph_header_tree, offset + offsetof(struct ceph_msg_header, orig_src));
+
 	type = TVB_MSG_FIELD(tvb_get_letohl, tvb, orig_ofs, type);
 	seq = TVB_MSG_FIELD(tvb_get_letoh64, tvb, orig_ofs, seq);
 	front_len = TVB_MSG_FIELD(tvb_get_letohs, tvb, orig_ofs, front_len);
 	middle_len = TVB_MSG_FIELD(tvb_get_letohs, tvb, orig_ofs, middle_len);
 	data_len = TVB_MSG_FIELD(tvb_get_letohl, tvb, orig_ofs, data_len);
 
-	if (front_len) {
-	/*	ceph_sub_item = proto_tree_add_item( tree, hf_ceph_front, tvb, offset, front_len, TRUE );
-		offset += front_len; */
+	offset += sizeof(struct ceph_msg_header);
 
-		dissect_ceph_client_front(tvb, pinfo, tree, offset, type);
+	if (front_len) {
+		dissect_ceph_front(tvb, pinfo, tree, offset, type);
 		offset += front_len;
 	}
 
@@ -895,17 +1153,32 @@ static guint32 dissect_ceph_generic(tvbuff_t *tvb, packet_info *pinfo, proto_tre
 		char *data;
 		ceph_sub_item = proto_tree_add_item( tree, hf_ceph_data, tvb, offset, data_len, TRUE );
 	    data = (char *)tvb_get_ptr(tvb, offset, data_len);
-
-		data_crc = crc32c_le(0, data, data_len);
-
+		data_crc = ceph_crc32c_le(0, data, data_len);
 		offset += data_len;
 	}
-
 	offset = dissect_ceph_footer(tvb, tree, offset, data_crc);
-
 	return offset;
 }
 
+
+static const char *ceph_protocol_to_text(guint32 proto){
+	if ( proto == CEPH_OSD_PROTOCOL )
+		return "osd";
+	if ( proto == CEPH_MDS_PROTOCOL )
+		return "mds";
+	if ( proto == CEPH_MON_PROTOCOL )
+		return "mon";
+	if ( proto == CEPH_OSDC_PROTOCOL )
+		return "osd";
+	if ( proto == CEPH_MDSC_PROTOCOL )
+		return "mds";
+	if ( proto == CEPH_MONC_PROTOCOL )
+		return "mon";
+	else{
+		return "???";
+	}
+}
+
 static const char *entity_name_by_type(int type)
 {
 	if (type < 4)
@@ -936,6 +1209,7 @@ dissect_ceph_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 	proto_item *ceph_item = NULL;
 	proto_tree *ceph_tree = NULL;
 	guint16 type = 0;
+	guint32 proto = 0;
 	const guchar *ptr;
 	guint32 pos = 0;
 	int have_banner = 0;
@@ -955,7 +1229,8 @@ dissect_ceph_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 
 	// This is not a good way of dissecting packets.  The tvb length should
 	// be sanity checked so we aren't going past the actual size of the buffer.
-	type = tvb_get_guint8( tvb, 4 ); // Get the type byte
+	type = tvb_get_guint8(tvb,4); // Get the type byte
+
 
 	if (check_col(pinfo->cinfo, COL_INFO)) {
 		const char *entity_str = NULL;
@@ -963,9 +1238,11 @@ dissect_ceph_client(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 		if (have_banner) {
 			if (IS_MON(pinfo))
 				entity_str = MON_STR;
-			else 
-				entity_str = "???";
-
+			else{
+				// Guess communication type from "struct ceph_msg_connect"
+				proto = tvb_get_letohl(tvb,9 + sizeof(struct ceph_entity_addr) + 20);
+				entity_str = ceph_protocol_to_text(proto);
+			}
 			col_add_fstr(pinfo->cinfo, COL_INFO, "[%s] Connect Request", entity_str);
 		} else {
 			type = TVB_MSG_FIELD(tvb_get_letohl, tvb, 0, type);
@@ -1021,8 +1298,9 @@ dissect_ceph_server(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
 		const char *entity_str;
 			if (IS_MON(pinfo))
 				entity_str = MON_STR;
-			else 
+			else{
 				entity_str = "???";
+			}
 		if (have_banner) {
 			col_add_fstr(pinfo->cinfo, COL_INFO, "[%s] Connect Response", entity_str);
 		} else {
@@ -1084,19 +1362,19 @@ static guint get_ceph_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
 	const char *ptr;
 	guint32 len;
 	guint32 pos = 0;
-
-	ptr = tvb_get_ptr(tvb, offset, /* sizeof(CEPH_BANNER) */tvb->length-offset);
+	guint32 tlen = (int) tvb->length;
+	ptr = tvb_get_ptr(tvb, offset, tlen - offset);
+	//ptr = tvb_get_ptr(tvb, offset, /* sizeof(CEPH_BANNER) */ (tvb->length)-offset);
 	if (ptr && memcmp(ptr, "ceph", 4) == 0) {
 		if (DEST_PORT_CEPH) {
 			len = sizeof(CEPH_BANNER) - 1 +
 				sizeof(struct ceph_entity_addr) +
-				sizeof(struct ceph_msg_connect);
+				sizeof(struct ceph_msg_connect) + AUTH_LEN;
 		} else
 			len = sizeof(CEPH_BANNER) - 1 +
 				sizeof(struct ceph_entity_addr) +
 				sizeof(struct ceph_entity_addr) +
 				sizeof(struct ceph_msg_connect_reply);
-
 		return len;
 	}
 
@@ -1114,18 +1392,39 @@ static guint get_ceph_message_len(packet_info *pinfo, tvbuff_t *tvb, int offset)
 }
 
 
-static void dissect_ceph(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
-{
+static void dissect_ceph(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree){
 	const char *ptr;
-
 	ptr = tvb_get_ptr(tvb, 0, 6);
-
-	if ((*ptr == CEPH_MSGR_TAG_MSG) || 
-            (memcmp(ptr, CEPH_BANNER, 4) == 0) || 
-	   ((ptr[0] == CEPH_MSGR_TAG_ACK) && (ptr[5] == CEPH_MSGR_TAG_MSG))
-	)  {
+	if(*ptr == CEPH_MSGR_TAG_RESETSESSION){
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_CEPH);
+		col_add_fstr(pinfo->cinfo, COL_INFO, "Ceph reset session");
+	}
+	else if(*ptr == CEPH_MSGR_TAG_WAIT){
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_CEPH);
+		col_add_fstr(pinfo->cinfo, COL_INFO, "Ceph I am waiting");
+	}
+	else if(*ptr == CEPH_MSGR_TAG_RETRY_SESSION){
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_CEPH);
+		col_add_fstr(pinfo->cinfo, COL_INFO, "Ceph retry session");
+	}
+	else if(*ptr == CEPH_MSGR_TAG_RETRY_GLOBAL){
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_CEPH);
+		col_add_fstr(pinfo->cinfo, COL_INFO, "Ceph retry global");
+	}
+	else if(*ptr == CEPH_MSGR_TAG_CLOSE){
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_CEPH);
+		col_add_fstr(pinfo->cinfo, COL_INFO, "Ceph close");
+	}
+	else if(*ptr == CEPH_MSGR_TAG_KEEPALIVE){
+		col_set_str(pinfo->cinfo, COL_PROTOCOL, PROTO_TAG_CEPH);
+		col_add_fstr(pinfo->cinfo, COL_INFO, "Ceph keep alive");
+	}
+	else if ((*ptr == CEPH_MSGR_TAG_MSG) ||
+			(memcmp(ptr, CEPH_BANNER, 4) == 0) ||
+			((ptr[0] == CEPH_MSGR_TAG_ACK) && (ptr[9] == CEPH_MSGR_TAG_MSG))
+	){
 		tcp_dissect_pdus(tvb, pinfo, tree, TRUE, TVB_MSG_HEADER_POS(src),
-			get_ceph_message_len, dissect_ceph_message);
+				get_ceph_message_len, dissect_ceph_message);
 	} else {
 		dissect_ceph_acks(tvb, pinfo, tree);
 	}
diff --git a/wireshark/ceph/rados.h b/wireshark/ceph/rados.h
index 2b7833c..0a99099 100644
--- a/wireshark/ceph/rados.h
+++ b/wireshark/ceph/rados.h
@@ -9,6 +9,14 @@
 #include "msgr.h"
 
 /*
+ * osdmap encoding versions
+ */
+#define CEPH_OSDMAP_INC_VERSION     5
+#define CEPH_OSDMAP_INC_VERSION_EXT 6
+#define CEPH_OSDMAP_VERSION         5
+#define CEPH_OSDMAP_VERSION_EXT     6
+
+/*
  * fs id
  */
 struct ceph_fsid {
@@ -50,18 +58,16 @@ struct ceph_timespec {
 #define CEPH_PG_LAYOUT_LINEAR 2
 #define CEPH_PG_LAYOUT_HYBRID 3
 
+#define CEPH_PG_MAX_SIZE      16  /* max # osds in a single pg */
 
 /*
  * placement group.
  * we encode this into one __le64.
  */
-union ceph_pg {
-	__u64 pg64;
-	struct {
-		__s16 preferred; /* preferred primary osd */
-		__u16 ps;        /* placement seed */
-		__u32 pool;      /* object pool */
-	} __attribute__ ((packed)) pg;
+struct ceph_pg {
+	__le16 preferred; /* preferred primary osd */
+	__le16 ps;        /* placement seed */
+	__le32 pool;      /* object pool */
 } __attribute__ ((packed));
 
 /*
@@ -83,17 +89,20 @@ union ceph_pg {
  */
 #define CEPH_PG_TYPE_REP     1
 #define CEPH_PG_TYPE_RAID4   2
+#define CEPH_PG_POOL_VERSION 2
 struct ceph_pg_pool {
 	__u8 type;                /* CEPH_PG_TYPE_* */
 	__u8 size;                /* number of osds in each pg */
 	__u8 crush_ruleset;       /* crush placement rule */
+	__u8 object_hash;         /* hash mapping object name to ps */
 	__le32 pg_num, pgp_num;   /* number of pg's */
 	__le32 lpg_num, lpgp_num; /* number of localized pg's */
 	__le32 last_change;       /* most recent epoch changed */
 	__le64 snap_seq;          /* seq for per-pool snapshot */
 	__le32 snap_epoch;        /* epoch of last snap */
 	__le32 num_snaps;
-	__le32 num_removed_snap_intervals;
+	__le32 num_removed_snap_intervals; /* if non-empty, NO per-pool snaps */
+	__le64 auid;               /* who owns the pg */
 } __attribute__ ((packed));
 
 /*
@@ -117,7 +126,7 @@ static inline int ceph_stable_mod(int x, int b, int bmask)
  * object layout - how a given object should be stored.
  */
 struct ceph_object_layout {
-	__le64 ol_pgid;           /* raw pg, with _full_ ps precision. */
+	struct ceph_pg ol_pgid;   /* raw pg, with _full_ ps precision. */
 	__le32 ol_stripe_unit;    /* for per-object parity, if any */
 } __attribute__ ((packed));
 
@@ -159,7 +168,6 @@ struct ceph_eversion {
 #define CEPH_OSD_OP_MODE_WR    0x2000
 #define CEPH_OSD_OP_MODE_RMW   0x3000
 #define CEPH_OSD_OP_MODE_SUB   0x4000
-#define CEPH_OSD_OP_MODE_EXEC  0x8000
 
 #define CEPH_OSD_OP_TYPE       0x0f00
 #define CEPH_OSD_OP_TYPE_LOCK  0x0100
@@ -173,9 +181,17 @@ enum {
 	/* read */
 	CEPH_OSD_OP_READ      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 1,
 	CEPH_OSD_OP_STAT      = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 2,
+	CEPH_OSD_OP_MAPEXT    = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 3,
 
 	/* fancy read */
-	CEPH_OSD_OP_MASKTRUNC = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4,
+	CEPH_OSD_OP_MASKTRUNC   = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 4,
+	CEPH_OSD_OP_SPARSE_READ = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 5,
+
+	CEPH_OSD_OP_NOTIFY    = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 6,
+	CEPH_OSD_OP_NOTIFY_ACK = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 7,
+
+	/* versioning */
+	CEPH_OSD_OP_ASSERT_VER = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 8,
 
 	/* write */
 	CEPH_OSD_OP_WRITE     = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 1,
@@ -195,11 +211,15 @@ enum {
 	CEPH_OSD_OP_TMAPGET = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_DATA | 12,
 
 	CEPH_OSD_OP_CREATE  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 13,
+	CEPH_OSD_OP_ROLLBACK= CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 14,
+
+	CEPH_OSD_OP_WATCH   = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_DATA | 15,
 
 	/** attrs **/
 	/* read */
 	CEPH_OSD_OP_GETXATTR  = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 1,
 	CEPH_OSD_OP_GETXATTRS = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 2,
+	CEPH_OSD_OP_CMPXATTR  = CEPH_OSD_OP_MODE_RD | CEPH_OSD_OP_TYPE_ATTR | 3,
 
 	/* write */
 	CEPH_OSD_OP_SETXATTR  = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 1,
@@ -208,11 +228,14 @@ enum {
 	CEPH_OSD_OP_RMXATTR   = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_ATTR | 4,
 
 	/** subop **/
-	CEPH_OSD_OP_PULL           = CEPH_OSD_OP_MODE_SUB | 1,
-	CEPH_OSD_OP_PUSH           = CEPH_OSD_OP_MODE_SUB | 2,
-	CEPH_OSD_OP_BALANCEREADS   = CEPH_OSD_OP_MODE_SUB | 3,
-	CEPH_OSD_OP_UNBALANCEREADS = CEPH_OSD_OP_MODE_SUB | 4,
-	CEPH_OSD_OP_SCRUB          = CEPH_OSD_OP_MODE_SUB | 5,
+	CEPH_OSD_OP_PULL            = CEPH_OSD_OP_MODE_SUB | 1,
+	CEPH_OSD_OP_PUSH            = CEPH_OSD_OP_MODE_SUB | 2,
+	CEPH_OSD_OP_BALANCEREADS    = CEPH_OSD_OP_MODE_SUB | 3,
+	CEPH_OSD_OP_UNBALANCEREADS  = CEPH_OSD_OP_MODE_SUB | 4,
+	CEPH_OSD_OP_SCRUB           = CEPH_OSD_OP_MODE_SUB | 5,
+	CEPH_OSD_OP_SCRUB_RESERVE   = CEPH_OSD_OP_MODE_SUB | 6,
+	CEPH_OSD_OP_SCRUB_UNRESERVE = CEPH_OSD_OP_MODE_SUB | 7,
+	CEPH_OSD_OP_SCRUB_STOP      = CEPH_OSD_OP_MODE_SUB | 8,
 
 	/** lock **/
 	CEPH_OSD_OP_WRLOCK    = CEPH_OSD_OP_MODE_WR | CEPH_OSD_OP_TYPE_LOCK | 1,
@@ -263,6 +286,10 @@ static inline int ceph_osd_op_mode_modify(int op)
 	return (op & CEPH_OSD_OP_MODE) == CEPH_OSD_OP_MODE_WR;
 }
 
+/*
+ * note that the following tmap stuff is also defined in the ceph librados.h
+ * any modification here needs to be updated there
+ */
 #define CEPH_OSD_TMAP_HDR 'h'
 #define CEPH_OSD_TMAP_SET 's'
 #define CEPH_OSD_TMAP_RM  'r'
@@ -287,6 +314,8 @@ enum {
 	CEPH_OSD_FLAG_BALANCE_READS = 256,
 	CEPH_OSD_FLAG_PARALLELEXEC = 512, /* execute op in parallel */
 	CEPH_OSD_FLAG_PGOP = 1024,      /* pg op, no object */
+	CEPH_OSD_FLAG_EXEC = 2048,      /* op may exec */
+	CEPH_OSD_FLAG_EXEC_PUBLIC = 4096, /* op may exec (public) */
 };
 
 enum {
@@ -296,6 +325,24 @@ enum {
 #define EOLDSNAPC    ERESTART  /* ORDERSNAP flag set; writer has old snapc*/
 #define EBLACKLISTED ESHUTDOWN /* blacklisted */
 
+/* xattr comparison */
+enum {
+	CEPH_OSD_CMPXATTR_OP_NOP = 0,
+	CEPH_OSD_CMPXATTR_OP_EQ  = 1,
+	CEPH_OSD_CMPXATTR_OP_NE  = 2,
+	CEPH_OSD_CMPXATTR_OP_GT  = 3,
+	CEPH_OSD_CMPXATTR_OP_GTE = 4,
+	CEPH_OSD_CMPXATTR_OP_LT  = 5,
+	CEPH_OSD_CMPXATTR_OP_LTE = 6
+};
+
+enum {
+	CEPH_OSD_CMPXATTR_MODE_STRING = 1,
+	CEPH_OSD_CMPXATTR_MODE_U64    = 2
+};
+
+#define RADOS_NOTIFY_VER	1
+
 /*
  * an individual object operation.  each may be accompanied by some data
  * payload
@@ -306,16 +353,16 @@ struct ceph_osd_op {
 	union {
 		struct {
 			__le64 offset, length;
+			__le64 truncate_size;
+			__le32 truncate_seq;
 		} __attribute__ ((packed)) extent;
 		struct {
 			__le32 name_len;
 			__le32 value_len;
+			__u8 cmp_op;       /* CEPH_OSD_CMPXATTR_OP_* */
+			__u8 cmp_mode;     /* CEPH_OSD_CMPXATTR_MODE_* */
 		} __attribute__ ((packed)) xattr;
 		struct {
-			__le64 truncate_size;
-			__le32 truncate_seq;
-		} __attribute__ ((packed)) trunc;
-		struct {
 			__u8 class_len;
 			__u8 method_len;
 			__u8 argc;
@@ -324,7 +371,15 @@ struct ceph_osd_op {
 		struct {
 			__le64 cookie, count;
 		} __attribute__ ((packed)) pgls;
-	};
+	        struct {
+		        __le64 snapid;
+	        } __attribute__ ((packed)) snap;
+		struct {
+			__le64 cookie;
+			__le64 ver;
+			__u8 flag;	/* 0 = unwatch, 1 = watch */
+		} __attribute__ ((packed)) watch;
+};
 	__le32 payload_len;
 } __attribute__ ((packed));
 
@@ -333,7 +388,6 @@ struct ceph_osd_op {
  * ceph_osd_op object operations.
  */
 struct ceph_osd_request_head {
-	__le64 tid;                        /* transaction id */
 	__le32 client_inc;                 /* client incarnation */
 	struct ceph_object_layout layout;  /* pgid */
 	__le32 osdmap_epoch;               /* client's osdmap epoch */
@@ -354,7 +408,6 @@ struct ceph_osd_request_head {
 } __attribute__ ((packed));
 
 struct ceph_osd_reply_head {
-	__le64 tid;                       /* transaction id */
 	__le32 client_inc;                /* client incarnation */
 	__le32 flags;
 	struct ceph_object_layout layout;
@@ -369,4 +422,5 @@ struct ceph_osd_reply_head {
 } __attribute__ ((packed));
 
 
+
 #endif
diff --git a/wireshark/ceph/sctp_crc32.c b/wireshark/ceph/sctp_crc32.c
index 43c06b4..1385834 100644
--- a/wireshark/ceph/sctp_crc32.c
+++ b/wireshark/ceph/sctp_crc32.c
@@ -31,15 +31,22 @@
 /* $KAME: sctp_crc32.c,v 1.12 2005/03/06 16:04:17 itojun Exp $	 */
 
 
-//#include <sys/cdefs.h>
+#include <sys/cdefs.h>
+#if 0
+__FBSDID("$FreeBSD: src/sys/netinet/sctp_crc32.c,v 1.8 2007/05/08 17:01:10 rrs Exp $");
 
-#include <glib.h>
 
-typedef guint8  uint8_t;
-typedef guint32 uint32_t;
-typedef unsigned long uintptr_t;
+#include <netinet/sctp_os.h>
+#include <netinet/sctp_crc32.h>
+#endif
 
+#include <stdint.h>
 
+#if defined(__FreeBSD__)
+#include <sys/endian.h>
+#else
+#include <endian.h>
+#endif
 
 #ifndef SCTP_USE_ADLER32
 
@@ -588,7 +595,7 @@ sctp_crc32c_sb8_64_bit(uint32_t crc,
  *
  *		none
  */
-uint32_t
+static uint32_t
 update_crc32(uint32_t crc32c,
     unsigned char const *buffer,
     unsigned int length)
@@ -672,7 +679,8 @@ uint32_t sctp_crc_c[256] = {
 
 #define SCTP_CRC32C(c,d) (c=(c>>8)^sctp_crc_c[(c^(d))&0xFF])
 
-uint32_t
+#if 0
+static uint32_t
 old_update_crc32(uint32_t crc32c,
     unsigned char const *buffer,
     unsigned int length)
@@ -686,7 +694,7 @@ old_update_crc32(uint32_t crc32c,
 }
 
 
-uint32_t
+static uint32_t
 sctp_csum_finalize(uint32_t crc32c)
 {
 	uint32_t result;
@@ -718,8 +726,9 @@ sctp_csum_finalize(uint32_t crc32c)
 #endif
 	return (crc32c);
 }
+#endif
 
-uint32_t crc32c_le(uint32_t crc, unsigned char const *data, unsigned length)
+uint32_t ceph_crc32c_le(uint32_t crc, unsigned char const *data, unsigned length)
 {
 	return update_crc32(crc, data, length);
 }
diff --git a/wireshark/wireshark.patch b/wireshark/wireshark.patch
index eb765c9..2e3b873 100644
--- a/wireshark/wireshark.patch
+++ b/wireshark/wireshark.patch
@@ -26,24 +26,14 @@ Index: plugins/Makefile.nmake
 ===================================================================
 --- plugins/Makefile.nmake	(revision 29691)
 +++ plugins/Makefile.nmake	(working copy)
-@@ -33,6 +33,9 @@
- 	cd asn1
- 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake $(PLUGIN_TARGET)
- 	cd ..
-+	cd ceph
-+	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake $(PLUGIN_TARGET)
-+	cd ..
- 	cd docsis
- 	$(MAKE) /$(MAKEFLAGS) -f Makefile.nmake $(PLUGIN_TARGET)
- 	cd ..
-@@ -86,6 +89,7 @@
- !IFDEF ENABLE_LIBWIRESHARK
- 	cd..
- 	xcopy plugins\asn1\*.dll $(INSTALL_DIR)\plugins\$(VERSION) /d
-+	xcopy plugins\ceph\*.dll $(INSTALL_DIR)\plugins\$(VERSION) /d
- 	xcopy plugins\docsis\*.dll $(INSTALL_DIR)\plugins\$(VERSION) /d
- 	xcopy plugins\ethercat\*.dll $(INSTALL_DIR)\plugins\$(VERSION) /d
- 	xcopy plugins\giop\*.dll $(INSTALL_DIR)\plugins\$(VERSION) /d
+@@ -8,6 +8,7 @@
+ 
+ PLUGIN_LIST = \
+	asn1        \
++	ceph        \
+	docsis      \
+	ethercat    \
+	giop        \
 Index: plugins/Makefile.am
 ===================================================================
 --- plugins/Makefile.am	(revision 29691)
-- 
1.7.5.4

--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [CEPH Users]     [Ceph Large]     [Information on CEPH]     [Linux BTRFS]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]
  Powered by Linux