[Ocfs2-tools-devel] [PATCH 3/5] wireshark-ocfs2: add dlm_migratable_lockres handler v2
Jeff Liu
jeff.liu at oracle.com
Fri Aug 14 20:01:43 PDT 2009
this message is dissected like following,
ocfs2:
....
..
master: 3
lockname length: 31
lock num: 2
migres flags: 0x06
total locks: 2
migres cookie: 0x0000000000000000
lockname: o000000000000000017a00900000000
lvb1: 303030303030303030313761303039303030303030303000
lvb2: 000000000000000000000000000000000000000000000000
lvb3: 00000000000000000000000000000000
locks: 0, 0x0000000000000000, 0, 0x00, 0, 0, 0
locks: 27, 0x0000000000000000, 0, 0x00, 0, 0, 0
Signed-off-by: Jeff Liu <jeff.liu at oracle.com>
---
epan/dissectors/packet-ocfs2.c | 156 ++++++++++++++++++++++++++++++++++++----
1 files changed, 142 insertions(+), 14 deletions(-)
diff --git a/epan/dissectors/packet-ocfs2.c b/epan/dissectors/packet-ocfs2.c
index 1021799..a37e0b1 100644
--- a/epan/dissectors/packet-ocfs2.c
+++ b/epan/dissectors/packet-ocfs2.c
@@ -118,7 +118,12 @@ static int hf_dlm_domain_name_len = -1;
static int hf_dlm_domain_name = -1;
static int hf_dlm_master = -1;
static int hf_dlm_new_master = -1;
-
+static int hf_dlm_mres_num_locks = -1;
+static int hf_dlm_mres_flags = -1;
+static int hf_dlm_mres_total_locks = -1;
+static int hf_dlm_mres_mig_cookie = -1;
+static int hf_dlm_lockname = -1;
+static int hf_dlm_lockname_len = -1;
#define TCP_PORT_OCFS2 7777
#define O2NM_MAX_NAME_LEN 64
@@ -999,12 +1004,6 @@ static struct dlm_msg_struct_def dlm_struct_defs[] = {
}
};
-#if 0
-
-/*
- * unimplemented cuz i forgot about these
- */
-
struct dlm_migratable_lock
{
guint64 cookie;
@@ -1055,7 +1054,9 @@ struct dlm_migratable_lock
* So a lockres would need more than 240 locks before it would
* use more than one network packet to recover. Not too bad.
*/
-#define DLM_MAX_MIGRATABLE_LOCKS 240
+#define DLM_LOCKID_NAME_MAX 32
+#define DLM_MAX_MIGRATABLE_LOCKS 240
+#define O2NET_MAX_PAYLOAD_BYTES (4096 - sizeof(struct ocfs2_msg))
struct dlm_migratable_lockres
{
@@ -1083,15 +1084,112 @@ struct dlm_migratable_lockres
#define DLM_MIG_LOCKRES_RESERVED (NET_MAX_PAYLOAD_BYTES - \
DLM_MIG_LOCKRES_MAX_LEN)
+static void dissect_dlm_mig_lockres_msg(proto_tree *tree, tvbuff_t *tvb,
+ guint offset)
+{
+ int miglock_size;
+ unsigned int i;
+ guint8 master, flags;
+ guint8 num_locks = 0;
+ guint32 total_locks;
+ guint64 mig_cookie;
-#endif
+ /* master */
+ proto_tree_add_item(tree, hf_dlm_master, tvb, offset, 1, FALSE);
+ ++offset;
+ /* lockname_len */
+ proto_tree_add_item(tree, hf_dlm_lockname_len, tvb, offset, 1, FALSE);
-#if 0
-/* EEEEK still need to do these 3 */
-static gint ett_dlm_migrate_lockres = -1;
-#endif
+ ++offset;
+ /* move offset ptr to num_locks */
+ num_locks = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_dlm_mres_num_locks, tvb, offset, 1,
+ FALSE);
+ /* no locks were found on this lockres! done! */
+ if (num_locks == 0)
+ return ;
+
+ /* flags */
+ ++offset;
+ proto_tree_add_item(tree, hf_dlm_mres_flags, tvb, offset, 1, FALSE);
+ /* total_locks */
+ ++offset;
+ proto_tree_add_item(tree, hf_dlm_mres_total_locks, tvb, offset, 4,
+ FALSE);
+
+ /* mig_cookie */
+ offset += 4;
+ proto_tree_add_item(tree, hf_dlm_mres_mig_cookie, tvb, offset, 8,
+ FALSE);
+
+ /* lockname */
+ offset += 8;
+ if (tvb_offset_exists(tvb, offset))
+ proto_tree_add_item(tree, hf_dlm_lockname, tvb, offset,
+ DLM_LOCKID_NAME_MAX, FALSE);
+
+ /* lvb */
+ offset += DLM_LOCKID_NAME_MAX;
+ proto_tree_add_item(tree, hf_dlm_lvb1, tvb,
+ LVB1_OFFSET(struct dlm_migratable_lockres),
+ DLM_FIELD_BYTES_LEN, FALSE);
+ proto_tree_add_item(tree, hf_dlm_lvb2, tvb,
+ LVB2_OFFSET(struct dlm_migratable_lockres),
+ DLM_FIELD_BYTES_LEN, FALSE);
+ proto_tree_add_item(tree, hf_dlm_lvb3, tvb,
+ LVB3_OFFSET(struct dlm_migratable_lockres),
+ LVB_REMAIN_BYTES_LEN, FALSE);
+
+ offset += DLM_LVB_LEN;
+ miglock_size = sizeof(struct dlm_migratable_lock);
+
+ /* dlm_migratable_lock */
+ for (i = 0; i < num_locks; i++) {
+ proto_item *item;
+ guint64 cookie;
+ guint8 node, list, flags, type;
+ guint8 convert_type, highest_blocked;
+
+ item = proto_tree_add_text(tree, tvb, offset, 5, "Locks: ");
+
+ offset = (offsetof(struct dlm_migratable_lockres, ml) +
+ miglock_size * i);
+
+ /* cookie */
+ cookie = tvb_get_ntoh64(tvb, offset);
+
+ offset += 10;
+ /* list */
+ list = tvb_get_guint8(tvb, offset);
+
+ ++offset;
+ /* flags */
+ flags = tvb_get_guint8(tvb, offset);
+
+ ++offset;
+ /* type */
+ type = tvb_get_guint8(tvb, offset);
+
+ ++offset;
+ /* convert_type */
+ convert_type = tvb_get_guint8(tvb, offset);
+
+ ++offset;
+ /* highest_blocked */
+ highest_blocked = tvb_get_guint8(tvb, offset);
+
+ ++offset;
+ /* node */
+ node = tvb_get_guint8(tvb, offset);
+
+ proto_item_append_text(item,
+ "%u, 0x%016x, %u, 0x%02x, %u, %u, %u",
+ node, cookie, list, flags, type,
+ convert_type, highest_blocked);
+ }
+}
static int valid_magic(guint16 magic)
{
@@ -1338,13 +1436,21 @@ static int dissect_ocfs2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
struct dlm_msg_struct_def *def;
def = msg_struct_lookup_by_type(msg_type);
if (def)
- msg_struct_enumerate_fields(def, subtree, tvb, O2NET_MSG_HDR_OFF_PAYLOAD);
+ msg_struct_enumerate_fields(def, subtree,
+ tvb,
+ O2NET_MSG_HDR_OFF_PAYLOAD);
}
if (msg_type == DLM_QUERY_JOIN_MSG)
if (magic == O2NET_MSG_MAGIC)
dissect_dlm_query_join_request(subtree,
tvb, O2NET_MSG_HDR_OFF_PAYLOAD);
+
+ if ((magic == O2NET_MSG_MAGIC) &&
+ (msg_type == DLM_MIG_LOCKRES_MSG))
+ dissect_dlm_mig_lockres_msg(subtree, tvb,
+ O2NET_MSG_HDR_OFF_PAYLOAD);
+
}
out:
return ret;
@@ -1450,6 +1556,28 @@ void proto_register_ocfs2(void)
{ &hf_dlm_new_master, { "New Master", "ocfs2.dlm.new_master",
FT_UINT8, BASE_DEC, NULL, 0x0,
"New Master", HFILL } },
+ { &hf_dlm_mres_num_locks, { "Lock Num", "ocfs2.dlm.num_locks",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Lock Num", HFILL } },
+ { &hf_dlm_mres_flags, { "Migres Flags", "ocfs2.dlm.mres_flags",
+ FT_UINT8, BASE_HEX, NULL, 0x0,
+ "Migres Flags", HFILL } },
+ { &hf_dlm_mres_total_locks, { "Total Locks",
+ "ocfs2.dlm.total_locks",
+ FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Migres Total Locks", HFILL } },
+ { &hf_dlm_mres_mig_cookie, { "Migres Cookie",
+ "ocfs2.dlm.migratable_lock.mig_cookie",
+ FT_UINT64, BASE_HEX, NULL, 0x0,
+ "Migres Cookie", HFILL } },
+ { &hf_dlm_lockname, { "Lockname",
+ "ocfs2.dlm.migratable_lock.lockname",
+ FT_STRING, BASE_NONE, NULL, 0x0,
+ "Migres Lockname", HFILL } },
+ { &hf_dlm_lockname_len, { "Lockname Length",
+ "ocfs2.dlm.migratable_lock.lockname_len",
+ FT_UINT8, BASE_DEC, NULL, 0x0,
+ "Migres Lockname Length", HFILL } },
};
static gint *ett[] = {
&ett_ocfs2,
--
1.5.4.3
More information about the Ocfs2-tools-devel
mailing list