[Ocfs2-tools-devel] [PATCH 1/1] wireshark-ocfs2: add dlm_query_join_request handler

jeff.liu jeff.liu at oracle.com
Wed Aug 5 07:48:25 PDT 2009


Hi Sunil,

There have 2 protocol version structures contains in query_join_request 
message for the newer version(i.e. dlm_proto and fs_proto)

Is it ok to print them separately in two lines like below?

Dlm Proto: 256 (1:0)
Fs Proto: 256 (1:0)

or just one line as:
Protocol Version: 256 (1:0)



Thanks,
Jeff

Sunil Mushran 写道:
> Sorry for the delay.
>
> The patch looks good. But it is not printing the node map and
> the protocol versions. It would be good to have those values too.
>
> The protocol versions could be major.minor.
>
> The node maps could be printed like 00110000110000 starting with
> node 0.
>
> Jeff Liu wrote:
>> this patch add dlm_query_join_request handler in dissector, it could 
>> deal with the message variants
>> for both ocfs2-1.2.x and the newer.
>>
>> Signed-off-by: Jeff Liu <jeff.liu at oracle.com>
>> ---
>> epan/dissectors/packet-ocfs2.c | 69 
>> ++++++++++++++++++++++++++++++++++------
>> 1 files changed, 59 insertions(+), 10 deletions(-)
>>
>> diff --git a/epan/dissectors/packet-ocfs2.c 
>> b/epan/dissectors/packet-ocfs2.c
>> index ce57c3f..264294b 100644
>> --- a/epan/dissectors/packet-ocfs2.c
>> +++ b/epan/dissectors/packet-ocfs2.c
>> @@ -235,7 +235,6 @@ enum dlm_query_join_response {
>> JOIN_OK_NO_MAP,
>> };
>>
>> -
>> /* DLM lock modes */
>> enum {
>> LKM_IVMODE = -1,
>> @@ -776,13 +775,35 @@ 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;
>> @@ -946,12 +967,6 @@ static struct dlm_msg_struct_def 
>> dlm_struct_defs[] = {
>> { "dead_node", &hf_dlm_dead_node, FIELD_OFFSET_AND_SIZE(struct 
>> dlm_begin_reco,dead_node), dlm_node_idx_handler},
>> { DLM_MSG_STRUCT_DEF_END } }
>> },
>> -{ "dlm_query_join_request", "DLM Query Join Request", 
>> DLM_QUERY_JOIN_MSG, &ett_dlm_query_join, {
>> - { "node_idx", &hf_dlm_node_idx, FIELD_OFFSET_AND_SIZE(struct 
>> dlm_query_join_request,node_idx), dlm_node_idx_handler},
>> - { "name_len", &hf_dlm_domain_name_len,FIELD_OFFSET_AND_SIZE(struct 
>> dlm_query_join_request,name_len), dlm_domain_namelen_handler},
>> - { "domain", &hf_dlm_domain_name, FIELD_OFFSET_AND_SIZE(struct 
>> dlm_query_join_request,domain), dlm_domain_name_handler},
>> - { DLM_MSG_STRUCT_DEF_END } }
>> -},
>> { "dlm_assert_joined", "DLM Assert Joined", DLM_ASSERT_JOINED_MSG, 
>> &ett_dlm_assert_joined, {
>> { "node_idx", &hf_dlm_node_idx, FIELD_OFFSET_AND_SIZE(struct 
>> dlm_assert_joined,node_idx), dlm_node_idx_handler},
>> { "name_len", &hf_dlm_domain_name_len,FIELD_OFFSET_AND_SIZE(struct 
>> dlm_assert_joined,name_len), dlm_domain_namelen_handler},
>> @@ -1148,6 +1163,36 @@ 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)
>> +{
>> + guint8 namelen;
>> + gint len;
>> + int msg_len;
>> +
>> + 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);
>> +
>> + len = tvb_reported_length_remaining(tvb, offset);
>> +
>> + ++offset;
>> + /* if the left message length more than namelen, its most likely
>> + * ocfs2-1.4 or newer we are dealing with, or else ocfs2-1.2 or
>> + * mismatch */
>> + if (len > (namelen +
>> + sizeof(((struct dlm_query_join_request *)0L)->node_map)))
>> + proto_tree_add_item(tree, hf_dlm_domain_name, tvb,
>> + offset + 4, namelen, FALSE);
>> + else if (len == (namelen +
>> + sizeof(((struct dlm_query_join_request_129 *)0L)->node_map)))
>> + proto_tree_add_item(tree, hf_dlm_domain_name, tvb,
>> + offset, namelen, FALSE);
>> +}
>> +
>> static int dissect_ocfs2(tvbuff_t *tvb, packet_info *pinfo, 
>> proto_tree *tree)
>> {
>> proto_tree *subtree = NULL;
>> @@ -1240,13 +1285,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;
>




More information about the Ocfs2-tools-devel mailing list