[Ocfs2-tools-devel] [PATCH 1/1] wireshark-ocfs2: add dlm_query_join_request handler V2
Jeff Liu
jeff.liu at oracle.com
Fri Aug 14 06:33:32 PDT 2009
this patch dissect the dlm_query_join_request message as follows,
Magic: Request (0xfa55)
...
..
DLM Protocol: 1.0
FS Protocol: 1.0
Domain Name: A898D073F6244E9EBEB057B4F47EF61A
Node Map: 0000001100000000000000000000000000000000000000000000000000000000
Node Map: 0000000000000000000000000000000000000000000000000000000000000000
Node Map: 0000000000000000000000000000000000000000000000000000000000000000
Node Map: 0000000000000000000000000000000000000000000000000000000000000000
Signed-off-by: Jeff Liu <jeff.liu at oracle.com>
---
epan/dissectors/packet-ocfs2.c | 106 ++++++++++++++++++++++++++++++++++++++-
1 files changed, 103 insertions(+), 3 deletions(-)
diff --git a/epan/dissectors/packet-ocfs2.c b/epan/dissectors/packet-ocfs2.c
index ce57c3f..1523e22 100644
--- a/epan/dissectors/packet-ocfs2.c
+++ b/epan/dissectors/packet-ocfs2.c
@@ -776,13 +776,36 @@ struct dlm_master_requery {
guint32 pad3;
guint8 name[O2NM_MAX_NAME_LEN];
};
-struct dlm_query_join_request
-{
+
+#define O2NM_MAX_NODES 255
+#define BITS_PER_BYTE 8
+#define BITS_TO_BYTES(bits) (((bits)+BITS_PER_BYTE-1)/BITS_PER_BYTE)
+
+/* dlm_query_join_request for ocfs2-1.2.x */
+struct dlm_query_join_request_129 {
guint8 node_idx;
guint8 pad1[2]; // unused
guint8 name_len;
guint8 domain[O2NM_MAX_NAME_LEN];
+ guint8 node_map[BITS_TO_BYTES(O2NM_MAX_NODES)];
+};
+
+struct dlm_protocol_version {
+ guint8 pv_major;
+ guint8 pv_minor;
+};
+
+/* the latest msg layout */
+struct dlm_query_join_request {
+ guint8 node_idx;
+ guint8 pad1[2];
+ guint8 name_len;
+ struct dlm_protocol_version dlm_proto;
+ struct dlm_protocol_version fs_proto;
+ guint8 domain[O2NM_MAX_NAME_LEN];
+ guint8 node_map[BITS_TO_BYTES(O2NM_MAX_NODES)];
};
+
struct dlm_assert_joined
{
guint8 node_idx;
@@ -1148,6 +1171,79 @@ static void msg_struct_enumerate_fields(struct dlm_msg_struct_def *def, proto_tr
}
}
+static void dissect_dlm_query_join_request(proto_tree *tree, tvbuff_t *tvb,
+ int offset)
+{
+ proto_item *item;
+ guint8 cc, namelen;
+ guint8 node_bits_array[256];
+ guint8 node_map[BITS_TO_BYTES(O2NM_MAX_NODES)];
+ guint16 dlm_proto, fs_proto;
+ gint len;
+ char line[65];
+ int i, j;
+
+ proto_tree_add_item(tree, hf_dlm_node_idx, tvb, offset, 1, FALSE);
+
+ /* skip follow 2 padding bytes */
+ offset += 3;
+ namelen = tvb_get_guint8(tvb, offset);
+ proto_tree_add_item(tree, hf_dlm_namelen, tvb, offset, 1, FALSE);
+
+ ++offset;
+ len = tvb_reported_length_remaining(tvb, offset);
+
+ /* if the left message length more than namelen + node_map length,
+ * its most likely ocfs2-1.4 or newer message comming,
+ * or else ocfs2-1.2 if equal to */
+ if (len == (sizeof(struct dlm_protocol_version) * 2 +
+ O2NM_MAX_NAME_LEN +
+ BITS_TO_BYTES(O2NM_MAX_NODES))) {
+ dlm_proto = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 2,
+ "DLM Protocol: %d.%d",
+ ((dlm_proto >> 8) & 0xff),
+ (dlm_proto & 0xff));
+
+ offset += 2;
+ fs_proto = tvb_get_ntohs(tvb, offset);
+ proto_tree_add_text(tree, tvb, offset, 2,
+ "FS Protocol: %d.%d",
+ ((fs_proto >> 8) & 0xff),
+ (fs_proto & 0xff));
+
+ offset += 2;
+ proto_tree_add_item(tree, hf_dlm_domain_name, tvb,
+ offset, namelen, FALSE);
+ } else if (len == (O2NM_MAX_NAME_LEN + BITS_TO_BYTES(O2NM_MAX_NODES)))
+ proto_tree_add_item(tree, hf_dlm_domain_name, tvb,
+ offset, namelen, FALSE);
+
+ offset += O2NM_MAX_NAME_LEN;
+ tvb_memcpy(tvb, node_map, offset, sizeof(node_map));
+
+ memset(node_bits_array, 0, sizeof(node_bits_array));
+ for (i = 0; i < sizeof(node_map); i++) {
+ cc = node_map[i];
+ for (j = 0; j < 8; j++)
+ node_bits_array[i * 8 + j] = (((cc >> j) & 1) ?
+ '1' : '0');
+ }
+
+ i = 0;
+ while (i < 256) {
+ memset(line, 0, sizeof(line));
+ /* line[65], the valid buf size is 64, the latest char
+ * is used to cut off the string
+ */
+ for (j = 0; j < (sizeof(line) - 1); j++)
+ line[j] = node_bits_array[i++];
+
+ item = proto_tree_add_text(tree, tvb, offset, 10, "Node Map: ");
+ proto_item_append_text(item, "%s", line);
+ }
+}
+
static int dissect_ocfs2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_tree *subtree = NULL;
@@ -1240,13 +1336,17 @@ static int dissect_ocfs2(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
}
}
-
if (magic == O2NET_MSG_MAGIC) {
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);
}
+
+ if (msg_type == DLM_QUERY_JOIN_MSG)
+ if (magic == O2NET_MSG_MAGIC)
+ dissect_dlm_query_join_request(subtree,
+ tvb, O2NET_MSG_HDR_OFF_PAYLOAD);
}
out:
return ret;
--
1.5.4.3
More information about the Ocfs2-tools-devel
mailing list