linux-nfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: fanchaoting <fanchaoting@cn.fujitsu.com>
To: guy-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org
Cc: Developer support list for Wireshark
	<wireshark-dev@wireshark.org>,
	"linux-nfs@vger.kernel.org" <linux-nfs@vger.kernel.org>
Subject: [PATCH] wireshark:decode GETDEVINFO error when using pnfs-block
Date: Wed, 13 Mar 2013 10:33:22 +0800	[thread overview]
Message-ID: <513FE572.2040500@cn.fujitsu.com> (raw)

[-- Attachment #1: Type: text/plain, Size: 6909 bytes --]

now when using pnfs block, if recieve a GETDEVINFO packet, the wireshark
decode this packect error, because GETDEVINFO(block-layout) is Different from 
GETDEVINFO(file-layout). the wireshark now only can decode GETDEVINFO(file-layout).
but when recieve GETDEVINFO(block-layout), it decode error.

 Signed-off-by: fanchaoting<fanchaoting@cn.fujitsu.com>

---

diff --git a/epan/dissectors/packet-nfs.c b/epan/dissectors/packet-nfs.c
index 77b6db5..35b5926 100644
--- a/epan/dissectors/packet-nfs.c
+++ b/epan/dissectors/packet-nfs.c
@@ -407,6 +407,15 @@ static int hf_nfs_op_mask = -1;
 /* NFSv4.1 */
 static int hf_nfs_length4_minlength = -1;
 static int hf_nfs_layouttype4 = -1;
+static int hf_nfs_block_volume_type4 = -1;
+static int hf_nfs_bld_offset = -1;
+static int hf_nfs_bld_sig = -1;
+static int hf_nfs_num_vols = -1;
+static int hf_nfs_bld_start = -1;
+static int hf_nfs_bld_length = -1;
+static int hf_nfs_bld_index = -1;
+static int hf_nfs_bld_chunk_size = -1;
+static int hf_nfs_bld_stripes = -1;
 static int hf_nfs_layoutreturn_type4 = -1;
 static int hf_nfs_iomode4 = -1;
 static int hf_nfs_stripetype4 = -1;
@@ -659,7 +668,7 @@ static gint ett_nfs_fh_ex = -1;
 static gint ett_nfs_layoutseg_fh = -1;
 static gint ett_nfs_reclaim_complete4 = -1;
 static gint ett_nfs_chan_attrs = -1;
-
+static gint ett_nfs_volume = -1;
 /* what type of fhandles should we dissect as */
 static dissector_table_t nfs_fhandle_table;
 
@@ -8777,22 +8786,80 @@ dissect_nfs_devices4(tvbuff_t *tvb, int offset, proto_tree *tree)
 	return offset;
 }
 
+static int
+dissect_nfs_block_volume4(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+	guint num_vols;
+	guint i, j;
+	guint block_volume_type;
+	guint bld_stripes;
+
+	/* disect block volume's count*/
+	num_vols = tvb_get_ntohl(tvb, offset);
+	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_num_vols, offset);
+
+	for (i = 0; i < num_vols; i++) {
+		proto_tree *volume_tree = NULL;
+		proto_item *volume_item = NULL;
+
+		volume_item = proto_tree_add_text(tree, tvb, offset, 4, "volume(%d)", i);
+		volume_tree = proto_item_add_subtree(volume_item, ett_nfs_volume);
+
+		block_volume_type = tvb_get_ntohl(tvb, offset);
+		offset = dissect_rpc_uint32(tvb, volume_tree, hf_nfs_block_volume_type4, offset);
+
+		switch (block_volume_type) {
+		case BLOCK_VOLUME_SIMPLE:
+			offset += 4;
+			offset = dissect_rpc_uint64(tvb, volume_tree, hf_nfs_bld_offset, offset);
+			offset = dissect_rpc_string(tvb, volume_tree, hf_nfs_bld_sig, offset, NULL);
+			break;
+		case BLOCK_VOLUME_CONCAT:
+			break;
+		case BLOCK_VOLUME_SLICE:
+			offset = dissect_rpc_uint64(tvb, volume_tree, hf_nfs_bld_start, offset);
+			offset = dissect_rpc_uint64(tvb, volume_tree, hf_nfs_bld_length, offset);
+			offset = dissect_rpc_uint32(tvb, volume_tree, hf_nfs_bld_index, offset);
+			break;
+		case BLOCK_VOLUME_STRIPE:
+			offset = dissect_rpc_uint64(tvb, volume_tree, hf_nfs_bld_chunk_size, offset);
+			bld_stripes = tvb_get_ntohl(tvb, offset);
+			offset = dissect_rpc_uint32(tvb, volume_tree, hf_nfs_bld_stripes, offset);
+			for (j = 0; j < bld_stripes; j++)
+				offset = dissect_rpc_uint32(tvb, volume_tree, hf_nfs_bld_index, offset);
+			break;
+		default:
+			break;
+		}
+	}
+
+	return offset;
+}
 
 static int
-dissect_nfs_deviceaddr4(tvbuff_t *tvb, int offset, proto_tree *tree)
+dissect_nfs_layout_devinfo4(tvbuff_t *tvb, int offset, proto_tree *tree)
 {
+	guint layout_type;
 
 	/* layout type */
+	layout_type = tvb_get_ntohl(tvb, offset);
 	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset);
 
 	/* skip da_addr_body size */
 	offset+=4;
 
+	if (layout_type == LAYOUT4_BLOCK_VOLUME) {
+		offset = dissect_nfs_block_volume4(tvb, offset, tree);
+		return offset;
+	}
+
 	offset = dissect_nfs_devices4(tvb, offset, tree);
+	offset = dissect_nfs_notification_bitmap4(tvb, tree, offset);
 
 	return offset;
 }
 
+
 static int
 dissect_nfs_devicelist4(tvbuff_t *tvb, int offset, proto_tree *tree)
 {
@@ -9981,8 +10048,7 @@ dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo,
 			break;
 
 		case NFS4_OP_GETDEVINFO:
-			offset = dissect_nfs_deviceaddr4(tvb, offset, newftree);
-			offset = dissect_nfs_notification_bitmap4(tvb, newftree, offset);
+			offset = dissect_nfs_layout_devinfo4(tvb, offset, newftree);
 			break;
 
 		case NFS4_OP_GETDEVLIST:
@@ -10280,6 +10346,15 @@ static const value_string layouttype_names[] = {
 	{ 0, NULL }
 };
 
+static const value_string blockvolumetype_names[] = {
+	{ 0, "BLOCK_VOLUME_SIMPLE"},
+	{ 1, "BLOCK_VOLUME_SLICE"},
+	{ 2, "BLOCK_VOLUME_CONCAT"},
+	{ 3, "BLOCK_VOLUME_STRIPE"},
+	{ 0, NULL }
+};
+
+
 static const value_string layoutreturn_names[] = {
 	{ 1, "RETURN_FILE"},
 	{ 2, "RETURN_FSID"},
@@ -11834,6 +11909,42 @@ proto_register_nfs(void)
 			"layout type", "nfs.layouttype", FT_UINT32, BASE_DEC,
 			VALS(layouttype_names), 0, NULL, HFILL }},
 
+		{ &hf_nfs_block_volume_type4, {
+			"block_volume_type", "nfs.block_volume_type", FT_UINT32, BASE_DEC,
+			VALS(blockvolumetype_names), 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_offset, {
+			"bld_offset", "nfs.bld_offset", FT_UINT64, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_sig, {
+			"bld_sig", "nfs.bld_sig", FT_STRING, BASE_NONE,
+			NULL, 0, NULL, HFILL }},
+		
+		{ &hf_nfs_num_vols, {
+			"num_vols", "nfs.num_vols", FT_UINT32, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_start, {
+			"bld_start", "nfs.bld_start", FT_UINT64, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_length, {
+			"bld_length", "nfs.bld_length", FT_UINT64, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_index, {
+			"bld_index", "nfs.bld_index", FT_UINT32, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_chunk_size, {
+			"bld_chunk_size", "nfs.bld_chunk_size", FT_UINT64, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+
+		{ &hf_nfs_bld_stripes, {
+			"bld_stripes", "nfs.bld_stripes", FT_UINT32, BASE_DEC,
+			NULL, 0, NULL, HFILL }},
+	
 		{ &hf_nfs_layoutreturn_type4, {
 			"return type", "nfs.returntype", FT_UINT32, BASE_DEC,
 			VALS(layoutreturn_names), 0, NULL, HFILL }},
@@ -12474,7 +12585,9 @@ proto_register_nfs(void)
 		&ett_nfs_cb_illegal,
 		&ett_nfs_chan_attrs,
 		&ett_create_session_flags,
+		&ett_nfs_volume,
 	};
+
 	module_t *nfs_module;
 
 	proto_nfs = proto_register_protocol("Network File System", "NFS", "nfs");
diff --git a/epan/dissectors/packet-nfs.h b/epan/dissectors/packet-nfs.h
index b14bfaa..a3e81e3 100644
--- a/epan/dissectors/packet-nfs.h
+++ b/epan/dissectors/packet-nfs.h
@@ -173,6 +173,12 @@
 #define LAYOUT4_OSD2_OBJECTS   2
 #define LAYOUT4_BLOCK_VOLUME   3
 
+/* pNFS block volume types */
+#define BLOCK_VOLUME_SIMPLE    0
+#define BLOCK_VOLUME_SLICE     1
+#define BLOCK_VOLUME_CONCAT    2
+#define BLOCK_VOLUME_STRIPE    3
+
 extern gboolean nfs_file_name_snooping;
 
 extern int dissect_fhandle(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,

[-- Attachment #2: deviceinfo_patch_after.JPG --]
[-- Type: image/jpeg, Size: 52931 bytes --]

[-- Attachment #3: pnfsmount.pcap --]
[-- Type: application/octet-stream, Size: 704968 bytes --]

[-- Attachment #4: deviceinfo_patch_before.JPG --]
[-- Type: image/jpeg, Size: 105632 bytes --]

[-- Attachment #5: Type: text/plain, Size: 344 bytes --]

___________________________________________________________________________
Sent via:    Wireshark-dev mailing list <wireshark-dev@wireshark.org>
Archives:    http://www.wireshark.org/lists/wireshark-dev
Unsubscribe: https://wireshark.org/mailman/options/wireshark-dev
             mailto:wireshark-dev-request@wireshark.org?subject=unsubscribe

             reply	other threads:[~2013-03-13  2:33 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-03-13  2:33 fanchaoting [this message]
     [not found] ` <513FE66C.8040205@cn.fujitsu.com>
2013-03-13  7:42   ` [PATCH] wireshark:decode GETDEVINFO error when using pnfs-block fanchaoting

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=513FE572.2040500@cn.fujitsu.com \
    --to=fanchaoting@cn.fujitsu.com \
    --cc=guy-FrUbXkNCsVf2fBVCVOL8/A@public.gmane.org \
    --cc=linux-nfs@vger.kernel.org \
    --cc=wireshark-dev@wireshark.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).