All of lore.kernel.org
 help / color / mirror / Atom feed
* [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.
@ 2012-04-25 14:23 Pierre Rognant
  2012-05-01 17:59 ` Yehuda Sadeh Weinraub
  0 siblings, 1 reply; 3+ messages in thread
From: Pierre Rognant @ 2012-04-25 14:23 UTC (permalink / raw)
  To: ceph-devel

From: Pierre Rognant <prognant@oodrive.com>

---
 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


^ permalink raw reply related	[flat|nested] 3+ messages in thread

* Re: [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.
  2012-04-25 14:23 [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 Pierre Rognant
@ 2012-05-01 17:59 ` Yehuda Sadeh Weinraub
  2012-07-31 22:49   ` Yehuda Sadeh
  0 siblings, 1 reply; 3+ messages in thread
From: Yehuda Sadeh Weinraub @ 2012-05-01 17:59 UTC (permalink / raw)
  To: Pierre Rognant; +Cc: ceph-devel

Hi,

this is really awesome, thanks.

   Sorry for the late response. We got another wireshark update
out-of-list a few weeks ago, and I assumed it was the same one.
Comparing them both now, it is obvious that these are completely two
different implementations. Both require cleanups, and from what I can
tell need extra work to get them upstream (that is, upstream to
wireshark). I'll try to push both into branches so that the work is
not lost and is readily useful.

The extra work that needs to be done and that the original dissector
suffered from is (AFAIR) that we dereference structures directly,
which shouldn't be done according to the wireshark style guide. I'm
not too sure now whether we do it all around or on just packed
structures, and whether it matters if it's the latter, but that should
be looked into. It'd be nice if someone could pick that up and work
through whatever is needed to get it upstream.

Thanks,
Yehuda

On Wed, Apr 25, 2012 at 7:23 AM, Pierre Rognant <prognant@oodrive.fr> wrote:
>
> From: Pierre Rognant <prognant@oodrive.com>
>
> ---
>  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@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe ceph-devel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 3+ messages in thread

* Re: [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.
  2012-05-01 17:59 ` Yehuda Sadeh Weinraub
@ 2012-07-31 22:49   ` Yehuda Sadeh
  0 siblings, 0 replies; 3+ messages in thread
From: Yehuda Sadeh @ 2012-07-31 22:49 UTC (permalink / raw)
  To: Pierre Rognant, Pierre Rognant; +Cc: ceph-devel

Sorry for the late response, but we finally got to it. Your patch has
gotten merge a few weeks ago, I also just pushed an update to ceph's
master updating the wireshark patch to the latest upstream dev
version.

Thanks!
Yehuda

On Tue, May 1, 2012 at 10:59 AM, Yehuda Sadeh Weinraub
<yehudasa@gmail.com> wrote:
> Hi,
>
> this is really awesome, thanks.
>
>    Sorry for the late response. We got another wireshark update
> out-of-list a few weeks ago, and I assumed it was the same one.
> Comparing them both now, it is obvious that these are completely two
> different implementations. Both require cleanups, and from what I can
> tell need extra work to get them upstream (that is, upstream to
> wireshark). I'll try to push both into branches so that the work is
> not lost and is readily useful.
>
> The extra work that needs to be done and that the original dissector
> suffered from is (AFAIR) that we dereference structures directly,
> which shouldn't be done according to the wireshark style guide. I'm
> not too sure now whether we do it all around or on just packed
> structures, and whether it matters if it's the latter, but that should
> be looked into. It'd be nice if someone could pick that up and work
> through whatever is needed to get it upstream.
>
> Thanks,
> Yehuda
>
> On Wed, Apr 25, 2012 at 7:23 AM, Pierre Rognant <prognant@oodrive.fr> wrote:
>>
>> From: Pierre Rognant <prognant@oodrive.com>
>>
>> ---
>>  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@vger.kernel.org
>> More majordomo info at  http://vger.kernel.org/majordomo-info.html

^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2012-07-31 22:49 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2012-04-25 14:23 [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 Pierre Rognant
2012-05-01 17:59 ` Yehuda Sadeh Weinraub
2012-07-31 22:49   ` Yehuda Sadeh

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.