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

Sunil Mushran sunil.mushran at oracle.com
Mon Aug 3 18:35:43 PDT 2009


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