[pnfs] [PATCH 2/2] more nfs4.1 draft-19 updates for layout{get, commit, return}

Benny Halevy bhalevy at panasas.com
Mon Feb 11 10:38:29 EST 2008


Signed-off-by: Benny Halevy <bhalevy at panasas.com>
---
 epan/dissectors/packet-nfs.c |   40 +++++++++++++++++++++++++++++++++-------
 1 files changed, 33 insertions(+), 7 deletions(-)

diff --git a/epan/dissectors/packet-nfs.c b/epan/dissectors/packet-nfs.c
index 1d7f9f0..ffaef77 100644
--- a/epan/dissectors/packet-nfs.c
+++ b/epan/dissectors/packet-nfs.c
@@ -407,7 +407,7 @@ static int hf_nfs_first_stripe_idx4 = -1;
 static int hf_nfs_layout_count = -1;
 static int hf_nfs_pattern_offset = -1;
 static int hf_nfs_notification_bitmap4 = -1;
-
+static int hf_nfs_lrs_present = -1;
 
 /* Hidden field for v2, v3, and v4 status */
 int hf_nfs_nfsstat = -1;
@@ -7718,6 +7718,23 @@ dissect_nfs_layoutreturn4(tvbuff_t *tvb, int offset, proto_tree *tree)
 	if (returntype == 1) { /* RETURN_FILE */
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_offset4, offset);
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_length4, offset);
+		offset = dissect_nfs_stateid4(tvb, offset, tree);
+		offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_data);
+	}
+
+	return offset;
+}
+
+static int
+dissect_nfs_layoutreturn_stateid(tvbuff_t *tvb, proto_tree *tree, int offset)
+{
+	guint lrs_present;
+
+	lrs_present = tvb_get_ntohl(tvb, offset);
+	offset = dissect_rpc_bool(tvb, tree, hf_nfs_lrs_present, offset);
+
+	if (lrs_present) {
+		offset = dissect_nfs_stateid4(tvb, offset, tree);
 	}
 
 	return offset;
@@ -8304,6 +8321,7 @@ dissect_nfs_argop4(tvbuff_t *tvb, int offset, packet_info *pinfo,
 			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
 			offset = dissect_rpc_uint64(tvb, newftree,
 										hf_nfs_length4_minlength, offset);
+			offset = dissect_nfs_stateid4(tvb, offset, newftree);
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_count4_maxcount,
 										offset);
 			break;
@@ -8312,9 +8330,9 @@ dissect_nfs_argop4(tvbuff_t *tvb, int offset, packet_info *pinfo,
 			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset);
 			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
 			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_reclaim4, offset);
+			offset = dissect_nfs_stateid4(tvb, offset, newftree);
 			offset = dissect_nfs_newoffset4(tvb, offset, newftree);
 			offset = dissect_nfs_newtime4(tvb, offset, newftree);
-			offset = dissect_nfs_newtime4(tvb, offset, newftree);
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4,
 										offset);
 			offset = dissect_nfsdata(tvb, offset, newftree,
@@ -8433,7 +8451,7 @@ static int
 dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo,
 	proto_tree *tree)
 {
-	guint32 ops, ops_counter;
+	guint32 ops, ops_counter, count;
 	guint32 opcode;
 	proto_item *fitem;
 	proto_tree *ftree = NULL;
@@ -8646,11 +8664,14 @@ dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo,
 			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_return_on_close4,
 									  offset);
 			offset = dissect_nfs_stateid4(tvb, offset, newftree);
+			count = tvb_get_ntohl(tvb, offset);
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layout_count, offset);
-			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset);
-			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
-			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset);
-			offset = dissect_nfs_layout(tvb, offset, pinfo, newftree);
+			while (count-- > 0) {
+				offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset);
+				offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
+				offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset);
+				offset = dissect_nfs_layout(tvb, offset, pinfo, newftree);
+			}
 			break;
 
 		case NFS4_OP_LAYOUTCOMMIT:
@@ -8658,6 +8679,7 @@ dissect_nfs_resop4(tvbuff_t *tvb, int offset, packet_info *pinfo,
 			break;
 
 		case NFS4_OP_LAYOUTRETURN:
+			offset = dissect_nfs_layoutreturn_stateid(tvb, newftree, offset);
 			break;
 
 		case NFS4_OP_GETDEVINFO:
@@ -10259,6 +10281,10 @@ proto_register_nfs(void)
 			"Cache this?", "nfs.cachethis4", FT_BOOLEAN, BASE_NONE,
 			TFS(&tfs_yes_no), 0, NULL, HFILL }},
 
+		{ &hf_nfs_lrs_present, {
+			"Stateid present?", "nfs.lrs_present", FT_BOOLEAN, BASE_NONE,
+			TFS(&tfs_yes_no), 0, NULL, HFILL }},
+
 	/* Hidden field for v2, v3, and v4 status */
 		{ &hf_nfs_nfsstat, {
 			"Status", "nfs.status", FT_UINT32, BASE_DEC,
-- 
1.5.3.3



More information about the pNFS mailing list