Radek Vokál 977e92
commit 37859b111eb029ce0f6d16be84e6ae9a1e88e117
Radek Vokál 977e92
Author: stig <stig@f5534014-38df-0310-8fa8-9805f1628bb7>
Radek Vokál 977e92
Date:   Sat Jul 12 19:53:53 2008 +0000
Radek Vokál 977e92
Radek Vokál 977e92
    From J. Bruce Fields (bug 2634):
Radek Vokál 977e92
    The attached patches bring the wireshark code up to date with the latest
Radek Vokál 977e92
    NFSv4.1 protocol drafts (in ietf last call now, so hopefully not too much more
Radek Vokál 977e92
    of this will be required).
Radek Vokál 977e92
    
Radek Vokál 977e92
    They also cover more of the protocol, and do some minor cleanup (e.g. remove
Radek Vokál 977e92
    some operations which were really only used by one prototype implementation,
Radek Vokál 977e92
    and never part of the protocol.)
Radek Vokál 977e92
    
Radek Vokál 977e92
    A few ops and attributes are still missing.
Radek Vokál 977e92
    
Radek Vokál 977e92
Radek Vokál 977e92
diff -up wireshark-1.0.2/epan/dissectors/packet-nfs.c.orig wireshark-1.0.2/epan/dissectors/packet-nfs.c
Radek Vokál 977e92
--- wireshark-1.0.2/epan/dissectors/packet-nfs.c.orig	2008-07-17 06:37:51.000000000 -0400
Radek Vokál 977e92
+++ wireshark-1.0.2/epan/dissectors/packet-nfs.c	2008-07-17 06:42:09.000000000 -0400
Radek Vokál 977e92
@@ -294,6 +294,7 @@ static int hf_nfs_fattr4_space_free = -1
Radek Vokál 977e92
 static int hf_nfs_fattr4_space_total = -1;
Radek Vokál 977e92
 static int hf_nfs_fattr4_space_used = -1;
Radek Vokál 977e92
 static int hf_nfs_fattr4_mounted_on_fileid = -1;
Radek Vokál 977e92
+static int hf_nfs_fattr4_layout_blksize = -1;
Radek Vokál 977e92
 static int hf_nfs_who = -1;
Radek Vokál 977e92
 static int hf_nfs_server = -1;
Radek Vokál 977e92
 static int hf_nfs_fslocation4 = -1;
Radek Vokál 977e92
@@ -348,6 +349,7 @@ static int hf_nfs_callback_ident = -1;
Radek Vokál 977e92
 static int hf_nfs_r_netid = -1;
Radek Vokál 977e92
 static int hf_nfs_gsshandle4 = -1;
Radek Vokál 977e92
 static int hf_nfs_r_addr = -1;
Radek Vokál 977e92
+static int hf_nfs_createmode4 = -1;
Radek Vokál 977e92
 
Radek Vokál 977e92
 /* NFSv4.1 */
Radek Vokál 977e92
 static int hf_nfs_length4_minlength = -1;
Radek Vokál 977e92
@@ -368,7 +370,6 @@ static int hf_nfs_deviceidx4 = -1;
Radek Vokál 977e92
 static int hf_nfs_layout4 = -1;
Radek Vokál 977e92
 static int hf_nfs_stripedevs4 = -1;
Radek Vokál 977e92
 static int hf_nfs_devaddr4 = -1;
Radek Vokál 977e92
-static int hf_nfs_notifydsop4 = -1;
Radek Vokál 977e92
 static int hf_nfs_return_on_close4 = -1;
Radek Vokál 977e92
 static int hf_nfs_slotid4 = -1;
Radek Vokál 977e92
 static int hf_nfs_sr_status4 = -1;
Radek Vokál 977e92
@@ -405,6 +406,13 @@ static int hf_nfs_create_session_flags4 
Radek Vokál 977e92
 static int hf_nfs_cachethis4 = -1;
Radek Vokál 977e92
 static int hf_nfs_util4 = -1;
Radek Vokál 977e92
 static int hf_nfs_first_stripe_idx4 = -1;
Radek Vokál 977e92
+static int hf_nfs_layout_count = -1;
Radek Vokál 977e92
+static int hf_nfs_pattern_offset = -1;
Radek Vokál 977e92
+static int hf_nfs_notification_bitmap4 = -1;
Radek Vokál 977e92
+static int hf_nfs_lrs_present = -1;
Radek Vokál 977e92
+static int hf_nfs_nfl_util = -1;
Radek Vokál 977e92
+static int hf_nfs_nfl_first_stripe_index = -1;
Radek Vokál 977e92
+static int hf_nfs_lrf_body_content = -1;
Radek Vokál 977e92
 
Radek Vokál 977e92
 /* Hidden field for v2, v3, and v4 status */
Radek Vokál 977e92
 int hf_nfs_nfsstat = -1;
Radek Vokál 977e92
@@ -530,12 +538,10 @@ static gint ett_nfs_layoutcommit4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_layoutreturn4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_getdevinfo4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_getdevlist4 = -1;
Radek Vokál 977e92
-static gint ett_nfs_notifyds4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_exchange_id4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_create_session4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_destroy_session4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_sequence4 = -1;
Radek Vokál 977e92
-static gint ett_nfs_pnfs_create4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_slotid4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_sr_status4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_serverscope4 = -1;
Radek Vokál 977e92
@@ -562,6 +568,8 @@ static gint ett_nfs_uid4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_gid4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_service4 = -1;
Radek Vokál 977e92
 static gint ett_nfs_sessionid4 = -1;
Radek Vokál 977e92
+static gint ett_nfs_layoutseg = -1;
Radek Vokál 977e92
+static gint ett_nfs_layoutseg_fh = -1;
Radek Vokál 977e92
 
Radek Vokál 977e92
 /* what type of fhandles shoudl we dissect as */
Radek Vokál 977e92
 static dissector_table_t nfs_fhandle_table;
Radek Vokál 977e92
@@ -5827,6 +5835,19 @@ static const value_string names_nfs_nfss
Radek Vokál 977e92
 	{	10071,	"NFS4ERR_OP_NOT_IN_SESSION"			},
Radek Vokál 977e92
 	{	10072,	"NFS4ERR_HASH_ALG_UNSUPP"			},
Radek Vokál 977e92
 	{	10073,	"NFS4ERR_CONN_BINDING_NOT_ENFORCED"		},
Radek Vokál 977e92
+	{	10074,	"NFS4ERR_CLIENTID_BUSY"				},
Radek Vokál 977e92
+	{	10075,	"NFS4ERR_PNFS_IO_HOLE"				},
Radek Vokál 977e92
+	{	10076,	"NFS4ERR_SEQ_FALSE_RETRY"			},
Radek Vokál 977e92
+	{	10077,	"NFS4ERR_BAD_HIGH_SLOT"				},
Radek Vokál 977e92
+	{	10078,	"NFS4ERR_DEADSESSION"				},
Radek Vokál 977e92
+	{	10079,	"NFS4ERR_ENCR_ALG_UNSUPP"			},
Radek Vokál 977e92
+	{	10080,	"NFS4ERR_PNFS_NO_LAYOUT"			},
Radek Vokál 977e92
+	{	10081,	"NFS4ERR_NOT_ONLY_OP"				},
Radek Vokál 977e92
+	{	10082,	"NFS4ERR_WRONG_CRED"				},
Radek Vokál 977e92
+	{	10083,	"NFS4ERR_WRONG_TYPE"				},
Radek Vokál 977e92
+	{	10084,	"NFS4ERR_DIRDELEG_UNAVAIL"			},
Radek Vokál 977e92
+	{	10085,	"NFS4ERR_REJECT_DELEG"				},
Radek Vokál 977e92
+	{	10086,	"NFS4ERR_RETURNCONFLICT"			},
Radek Vokál 977e92
 	{	0,	NULL }
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -6440,18 +6461,46 @@ static const value_string names_fattr4[]
Radek Vokál 977e92
 	{	FATTR4_MOUNTED_ON_FILEID, "FATTR4_MOUNTED_ON_FILEID"	},
Radek Vokál 977e92
 #define FATTR4_DIR_NOTIF_DELAY 56
Radek Vokál 977e92
 	{	FATTR4_DIR_NOTIF_DELAY, "FATTR4_DIR_NOTIF_DELAY"	},
Radek Vokál 977e92
-#define FATTR4_DIRENT_NOTIF_DELAY   57
Radek Vokál 977e92
+#define FATTR4_DIRENT_NOTIF_DELAY  57
Radek Vokál 977e92
 	{	FATTR4_DIRENT_NOTIF_DELAY, "FATTR4_DIRENT_NOTIF_DELAY"	},
Radek Vokál 977e92
-#define FATTR4_SEND_IMPL_ID   58
Radek Vokál 977e92
-	{	FATTR4_SEND_IMPL_ID, "FATTR4_SEND_IMPL_ID"	},
Radek Vokál 977e92
-#define FATTR4_RECV_IMPL_ID  59
Radek Vokál 977e92
-	{	FATTR4_RECV_IMPL_ID, "FATTR4_RECV_IMPL_ID"	},
Radek Vokál 977e92
-#define FATTR4_ABSENT  60
Radek Vokál 977e92
-	{	FATTR4_ABSENT, "FATTR4_ABSENT"	},
Radek Vokál 977e92
-#define FATTR4_FS_STATUS  61
Radek Vokál 977e92
-	{	FATTR4_FS_STATUS, "FATTR4_FS_STATUS"	},
Radek Vokál 977e92
-#define FATTR4_FS_LAYOUT_TYPES   62
Radek Vokál 977e92
-	{	FATTR4_MOUNTED_ON_FILEID, "FATTR4_FS_LAYOUT_TYPES"	},
Radek Vokál 977e92
+#define FATTR4_DACL                58
Radek Vokál 977e92
+	{	FATTR4_DACL, "FATTR4_DACL"				},
Radek Vokál 977e92
+#define FATTR4_SACL                59
Radek Vokál 977e92
+	{	FATTR4_SACL, "FATTR4_SACL"				},
Radek Vokál 977e92
+#define FATTR4_CHANGE_POLICY       60
Radek Vokál 977e92
+	{	FATTR4_CHANGE_POLICY, "FATTR4_CHANGE_POLICY"		},
Radek Vokál 977e92
+#define FATTR4_FS_STATUS           61
Radek Vokál 977e92
+	{	FATTR4_FS_STATUS, "FATTR4_FS_STATUS"			},
Radek Vokál 977e92
+#define FATTR4_FS_LAYOUT_TYPE      62
Radek Vokál 977e92
+	{	FATTR4_FS_LAYOUT_TYPE, "FATTR4_FS_LAYOUT_TYPE"		},
Radek Vokál 977e92
+#define FATTR4_LAYOUT_HINT         63
Radek Vokál 977e92
+	{	FATTR4_LAYOUT_HINT, "FATTR4_LAYOUT_HINT"		},
Radek Vokál 977e92
+#define FATTR4_LAYOUT_TYPE         64
Radek Vokál 977e92
+	{	FATTR4_LAYOUT_TYPE, "FATTR4_LAYOUT_TYPE"		},
Radek Vokál 977e92
+#define FATTR4_LAYOUT_BLKSIZE      65
Radek Vokál 977e92
+	{	FATTR4_LAYOUT_BLKSIZE, "FATTR4_LAYOUT_BLKSIZE"		},
Radek Vokál 977e92
+#define FATTR4_LAYOUT_ALIGNMENT    66
Radek Vokál 977e92
+	{	FATTR4_LAYOUT_ALIGNMENT, "FATTR4_LAYOUT_ALIGNMENT"	},
Radek Vokál 977e92
+#define FATTR4_FS_LOCATIONS_INFO   67
Radek Vokál 977e92
+	{	FATTR4_FS_LOCATIONS_INFO, "FATTR4_FS_LOCATIONS_INFO"	},
Radek Vokál 977e92
+#define FATTR4_MDSTHRESHOLD        68
Radek Vokál 977e92
+	{	FATTR4_MDSTHRESHOLD, "FATTR4_MDSTHRESHOLD"		},
Radek Vokál 977e92
+#define FATTR4_RETENTION_GET       69
Radek Vokál 977e92
+	{	FATTR4_RETENTION_GET, "FATTR4_RETENTION_GET"		},
Radek Vokál 977e92
+#define FATTR4_RETENTION_SET       70
Radek Vokál 977e92
+	{	FATTR4_RETENTION_SET, "FATTR4_RETENTION_SET"		},
Radek Vokál 977e92
+#define FATTR4_RETENTEVT_GET       71
Radek Vokál 977e92
+	{	FATTR4_RETENTEVT_GET, "FATTR4_RETENTEVT_GET"		},
Radek Vokál 977e92
+#define FATTR4_RETENTEVT_SET       72
Radek Vokál 977e92
+	{	FATTR4_RETENTEVT_SET, "FATTR4_RETENTEVT_SET"		},
Radek Vokál 977e92
+#define FATTR4_RETENTION_HOLD      73
Radek Vokál 977e92
+	{	FATTR4_RETENTION_HOLD, "FATTR4_RETENTION_HOLD"		},
Radek Vokál 977e92
+#define FATTR4_MODE_SET_MASKED     74
Radek Vokál 977e92
+	{	FATTR4_MODE_SET_MASKED, "FATTR4_MODE_SET_MASKED"	},
Radek Vokál 977e92
+#define FATTR4_SUPPATTR_EXCLCREAT  75
Radek Vokál 977e92
+	{	FATTR4_SUPPATTR_EXCLCREAT, "FATTR4_SUPPATTR_EXCLCREAT"	},
Radek Vokál 977e92
+#define FATTR4_FS_CHARSET_CAP      76
Radek Vokál 977e92
+	{	FATTR4_FS_CHARSET_CAP, "FATTR4_FS_CHARSET_CAP"		},
Radek Vokál 977e92
 	{	0,	NULL	}
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -6794,6 +6843,10 @@ dissect_nfs_attributes(tvbuff_t *tvb, in
Radek Vokál 977e92
 						attr_vals_offset = dissect_rpc_uint64(tvb, attr_newftree, 
Radek Vokál 977e92
 							hf_nfs_fattr4_mounted_on_fileid, attr_vals_offset);
Radek Vokál 977e92
 						break;
Radek Vokál 977e92
+					case FATTR4_LAYOUT_BLKSIZE:
Radek Vokál 977e92
+						attr_vals_offset = dissect_rpc_uint32(tvb, attr_newftree,
Radek Vokál 977e92
+							hf_nfs_fattr4_layout_blksize, attr_vals_offset);
Radek Vokál 977e92
+						break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 					default:
Radek Vokál 977e92
 						break;
Radek Vokál 977e92
@@ -6836,6 +6889,22 @@ static const value_string names_open4_sh
Radek Vokál 977e92
 	{ OPEN4_SHARE_ACCESS_WRITE, "OPEN4_SHARE_ACCESS_WRITE" },
Radek Vokál 977e92
 #define OPEN4_SHARE_ACCESS_BOTH 0x00000003
Radek Vokál 977e92
 	{ OPEN4_SHARE_ACCESS_BOTH, "OPEN4_SHARE_ACCESS_BOTH" },
Radek Vokál 977e92
+#define  OPEN4_SHARE_ACCESS_WANT_NO_PREFERENCE     0x0000
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_NO_PREFERENCE, "OPEN4_SHARE_ACCESS_WANT_NO_PREFERENCE" },
Radek Vokál 977e92
+#define  OPEN4_SHARE_ACCESS_WANT_READ_DELEG        0x0100
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_READ_DELEG, "OPEN4_SHARE_ACCESS_WANT_READ_DELEG" },
Radek Vokál 977e92
+#define  OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG       0x0200
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG, "OPEN4_SHARE_ACCESS_WANT_WRITE_DELEG" },
Radek Vokál 977e92
+#define  OPEN4_SHARE_ACCESS_WANT_ANY_DELEG         0x0300
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_ANY_DELEG, "OPEN4_SHARE_ACCESS_WANT_ANY_DELEG" },
Radek Vokál 977e92
+#define  OPEN4_SHARE_ACCESS_WANT_NO_DELEG          0x0400
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_NO_DELEG, "OPEN4_SHARE_ACCESS_WANT_NO_DELEG" },
Radek Vokál 977e92
+#define  OPEN4_SHARE_ACCESS_WANT_CANCEL            0x0500
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_CANCEL, "OPEN4_SHARE_ACCESS_WANT_CANCEL" },
Radek Vokál 977e92
+#define OPEN4_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL 0x10000
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL, "OPEN4_SHARE_ACCESS_WANT_SIGNAL_DELEG_WHEN_RESRC_AVAIL"},
Radek Vokál 977e92
+#define OPEN4_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED  0x20000
Radek Vokál 977e92
+	{ OPEN4_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED, "OPEN4_SHARE_ACCESS_WANT_PUSH_DELEG_WHEN_UNCONTENDED"},
Radek Vokál 977e92
 	{ 0, NULL }
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -6902,12 +6971,18 @@ dissect_nfs_open_claim_delegate_cur4(tvb
Radek Vokál 977e92
 #define CLAIM_PREVIOUS			1
Radek Vokál 977e92
 #define CLAIM_DELEGATE_CUR		2
Radek Vokál 977e92
 #define CLAIM_DELEGATE_PREV	3
Radek Vokál 977e92
+#define CLAIM_FH		4
Radek Vokál 977e92
+#define CLAIM_DELEG_CUR_FH	5
Radek Vokál 977e92
+#define CLAIM_DELEG_CUR_PREV_FH	6
Radek Vokál 977e92
 
Radek Vokál 977e92
 static const value_string names_claim_type4[] = {
Radek Vokál 977e92
 	{	CLAIM_NULL,  		"CLAIM_NULL"  },
Radek Vokál 977e92
 	{	CLAIM_PREVIOUS, 	"CLAIM_PREVIOUS" },
Radek Vokál 977e92
 	{	CLAIM_DELEGATE_CUR, 	"CLAIM_DELEGATE_CUR" },
Radek Vokál 977e92
 	{	CLAIM_DELEGATE_PREV,	"CLAIM_DELEGATE_PREV" },
Radek Vokál 977e92
+	{	CLAIM_FH,		"CLAIM_FH" },
Radek Vokál 977e92
+	{	CLAIM_DELEG_CUR_FH,	"CLAIM_DELEG_CUR_FH"},
Radek Vokál 977e92
+	{	CLAIM_DELEG_CUR_PREV_FH,"CLAIN_DELEG_CUR_PREV_FH"},
Radek Vokál 977e92
 	{	0, NULL }
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -6956,26 +7031,38 @@ dissect_nfs_open_claim4(tvbuff_t *tvb, i
Radek Vokál 977e92
 	return offset;
Radek Vokál 977e92
 }
Radek Vokál 977e92
 
Radek Vokál 977e92
+static const value_string names_createmode4[] = {
Radek Vokál 977e92
+	{	UNCHECKED4, "UNCHECKED4" },
Radek Vokál 977e92
+	{	GUARDED4,   "GUARDED4" },
Radek Vokál 977e92
+	{	EXCLUSIVE4, "EXCLUSIVE4" },
Radek Vokál 977e92
+	{	EXCLUSIVE4_1, "EXCLUSIVE4_1" },
Radek Vokál 977e92
+	{	0, NULL }
Radek Vokál 977e92
+};
Radek Vokál 977e92
+
Radek Vokál 977e92
 static int
Radek Vokál 977e92
 dissect_nfs_createhow4(tvbuff_t *tvb, int offset, packet_info *pinfo,
Radek Vokál 977e92
 	proto_tree *tree)
Radek Vokál 977e92
 {
Radek Vokál 977e92
 	guint mode;
Radek Vokál 977e92
 
Radek Vokál 977e92
-	/* This is intentional; we're using the same flags as NFSv3 */
Radek Vokál 977e92
 	mode = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
-	proto_tree_add_uint(tree, hf_nfs_createmode3, tvb, offset, 4, mode);
Radek Vokál 977e92
+	proto_tree_add_uint(tree, hf_nfs_createmode4, tvb, offset, 4, mode);
Radek Vokál 977e92
 	offset += 4;
Radek Vokál 977e92
 
Radek Vokál 977e92
 	switch(mode)
Radek Vokál 977e92
 	{
Radek Vokál 977e92
-	case UNCHECKED:		/* UNCHECKED4 */
Radek Vokál 977e92
-	case GUARDED:		/* GUARDED4 */
Radek Vokál 977e92
+	case UNCHECKED4:
Radek Vokál 977e92
+	case GUARDED4:
Radek Vokál 977e92
 		offset = dissect_nfs_fattr4(tvb, offset, pinfo, tree);
Radek Vokál 977e92
 		break;
Radek Vokál 977e92
 
Radek Vokál 977e92
-	case EXCLUSIVE:		/* EXCLUSIVE4 */
Radek Vokál 977e92
+	case EXCLUSIVE4:
Radek Vokál 977e92
+		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_verifier4, offset);
Radek Vokál 977e92
+		break;
Radek Vokál 977e92
+
Radek Vokál 977e92
+	case EXCLUSIVE4_1:
Radek Vokál 977e92
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_verifier4, offset);
Radek Vokál 977e92
+		offset = dissect_nfs_fattr4(tvb, offset, pinfo, tree);
Radek Vokál 977e92
 		break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 	default:
Radek Vokál 977e92
@@ -7119,16 +7206,20 @@ static const value_string names_nfsv4_op
Radek Vokál 977e92
 	{	NFS4_OP_EXCHANGE_ID,		"EXCHANGE_ID" },
Radek Vokál 977e92
 	{	NFS4_OP_CREATE_SESSION,		"CREATE_SESSION" },
Radek Vokál 977e92
 	{	NFS4_OP_DESTROY_SESSION,	"DESTROY_SESSION" },
Radek Vokál 977e92
-	{	NFS4_OP_SEQUENCE,		"SEQUENCE" },
Radek Vokál 977e92
+	{	NFS4_OP_FREE_STATEID,		"FREE_STATEID"},
Radek Vokál 977e92
+	{	NFS4_OP_GET_DIR_DELEGATION,	"GET_DIR_DELEGATION"},
Radek Vokál 977e92
 	{	NFS4_OP_GETDEVINFO,		"GETDEVINFO"},
Radek Vokál 977e92
 	{	NFS4_OP_GETDEVLIST,		"GETDEVLIST"},
Radek Vokál 977e92
 	{	NFS4_OP_LAYOUTCOMMIT,		"LAYOUTCOMMIT" },
Radek Vokál 977e92
 	{	NFS4_OP_LAYOUTGET,		"LAYOUTGET" },
Radek Vokál 977e92
 	{	NFS4_OP_LAYOUTRETURN,		"LAYOUTRETURN" },
Radek Vokál 977e92
-	{	NFS4_OP_NOTIFYDS,		"PNFS_NOTIFYDS"},
Radek Vokál 977e92
-	{	NFS4_OP_PNFS_CREATE,		"PNFS_CREATE"},
Radek Vokál 977e92
-	{	NFS4_OP_PNFS_WRITE,		"PNFS_WRITE"},
Radek Vokál 977e92
-	{	NFS4_OP_PNFS_READ,		"PNFS_READ"},
Radek Vokál 977e92
+	{	NFS4_OP_SECINFO_NO_NAME,	"SECINFO_NO_NAME" },
Radek Vokál 977e92
+	{	NFS4_OP_SEQUENCE,		"SEQUENCE" },
Radek Vokál 977e92
+	{	NFS4_OP_SET_SSV,		"SET-SSV"},
Radek Vokál 977e92
+	{	NFS4_OP_TEST_STATEID,		"TEST-STATEID"},
Radek Vokál 977e92
+	{	NFS4_OP_WANT_DELEGATION,	"WANT-DELEG" },
Radek Vokál 977e92
+	{	NFS4_OP_DESTROY_CLIENTID,	"DESTROY-CLIENTID" },
Radek Vokál 977e92
+	{	NFS4_OP_RECLAIM_COMPLETE,	"RECLAIM-COMPLETE" },
Radek Vokál 977e92
 	{	NFS4_OP_ILLEGAL,		"ILLEGAL"},
Radek Vokál 977e92
 	{	0,	NULL }
Radek Vokál 977e92
 };
Radek Vokál 977e92
@@ -7172,28 +7263,25 @@ gint *nfsv4_operation_ett[] =
Radek Vokál 977e92
 	 &ett_nfs_verify4 ,
Radek Vokál 977e92
 	 &ett_nfs_write4,
Radek Vokál 977e92
 	 &ett_nfs_release_lockowner4,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
+	 NULL, /* backchannel_ctl */
Radek Vokál 977e92
+	 NULL, /* bind connection to session */
Radek Vokál 977e92
 	 &ett_nfs_exchange_id4,
Radek Vokál 977e92
 	 &ett_nfs_create_session4,
Radek Vokál 977e92
 	 &ett_nfs_destroy_session4,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
+	 NULL, /* free stateid */
Radek Vokál 977e92
+	 NULL, /* get dir delegation */
Radek Vokál 977e92
 	 &ett_nfs_getdevinfo4,
Radek Vokál 977e92
 	 &ett_nfs_getdevlist4,
Radek Vokál 977e92
 	 &ett_nfs_layoutcommit4,
Radek Vokál 977e92
 	 &ett_nfs_layoutget4,
Radek Vokál 977e92
 	 &ett_nfs_layoutreturn4,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
+	 NULL, /* secinfo no name */
Radek Vokál 977e92
 	 &ett_nfs_sequence4,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 NULL,
Radek Vokál 977e92
-	 &ett_nfs_notifyds4,
Radek Vokál 977e92
-	 &ett_nfs_pnfs_create4
Radek Vokál 977e92
+	 NULL, /* set ssv */
Radek Vokál 977e92
+	 NULL, /* test stateid */
Radek Vokál 977e92
+	 NULL, /* want delegation */
Radek Vokál 977e92
+	 NULL, /* destroy clientid */
Radek Vokál 977e92
+	 NULL  /* reclaim complete*/
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
 static int
Radek Vokál 977e92
@@ -7556,10 +7644,12 @@ dissect_nfs_open_write_delegation4(tvbuf
Radek Vokál 977e92
 #define OPEN_DELEGATE_NONE 0
Radek Vokál 977e92
 #define OPEN_DELEGATE_READ 1
Radek Vokál 977e92
 #define OPEN_DELEGATE_WRITE 2
Radek Vokál 977e92
+#define OPEN_DELEGATE_NONE_EXT 3 /* new to v4.1 */
Radek Vokál 977e92
 static const value_string names_open_delegation_type4[] = {
Radek Vokál 977e92
 	{	OPEN_DELEGATE_NONE,	"OPEN_DELEGATE_NONE" },
Radek Vokál 977e92
 	{	OPEN_DELEGATE_READ, 	"OPEN_DELEGATE_READ" },
Radek Vokál 977e92
 	{	OPEN_DELEGATE_WRITE,	"OPEN_DELEGATE_WRITE" },
Radek Vokál 977e92
+	{	OPEN_DELEGATE_NONE_EXT, "OPEN_DELEGATE_NONE_EXT"},
Radek Vokál 977e92
 	{	0,	NULL }
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -7715,16 +7805,48 @@ dissect_nfs_layoutreturn4(tvbuff_t *tvb,
Radek Vokál 977e92
 	if (returntype == 1) { /* RETURN_FILE */
Radek Vokál 977e92
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_offset4, offset);
Radek Vokál 977e92
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_length4, offset);
Radek Vokál 977e92
+		offset = dissect_nfs_stateid4(tvb, offset, tree);
Radek Vokál 977e92
+		offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_lrf_body_content);
Radek Vokál 977e92
 	}
Radek Vokál 977e92
 
Radek Vokál 977e92
 	return offset;
Radek Vokál 977e92
 }
Radek Vokál 977e92
 
Radek Vokál 977e92
 static int
Radek Vokál 977e92
-dissect_nfs_devices4(tvbuff_t *tvb, int offset, proto_tree *tree)
Radek Vokál 977e92
+dissect_nfs_layoutreturn_stateid(tvbuff_t *tvb, proto_tree *tree, int offset)
Radek Vokál 977e92
 {
Radek Vokál 977e92
+	guint lrs_present;
Radek Vokál 977e92
+
Radek Vokál 977e92
+	lrs_present = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
+	offset = dissect_rpc_bool(tvb, tree, hf_nfs_lrs_present, offset);
Radek Vokál 977e92
+
Radek Vokál 977e92
+	if (lrs_present) {
Radek Vokál 977e92
+		offset = dissect_nfs_stateid4(tvb, offset, tree);
Radek Vokál 977e92
+	}
Radek Vokál 977e92
+
Radek Vokál 977e92
+	return offset;
Radek Vokál 977e92
+}
Radek Vokál 977e92
+
Radek Vokál 977e92
+static int
Radek Vokál 977e92
+dissect_nfs_notification_bitmap4(tvbuff_t *tvb, proto_tree *tree, int offset)
Radek Vokál 977e92
+{
Radek Vokál 977e92
+	guint32 bitmap_num;
Radek Vokál 977e92
 	guint i;
Radek Vokál 977e92
-	guint32 num_devs,num_indices,num_multipath;
Radek Vokál 977e92
+
Radek Vokál 977e92
+	bitmap_num = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
+	offset += 4;
Radek Vokál 977e92
+	for (i = 0; i < bitmap_num; i++) {
Radek Vokál 977e92
+		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_notification_bitmap4, offset);
Radek Vokál 977e92
+	}
Radek Vokál 977e92
+
Radek Vokál 977e92
+	return offset;
Radek Vokál 977e92
+}
Radek Vokál 977e92
+
Radek Vokál 977e92
+static int
Radek Vokál 977e92
+dissect_nfs_devices4(tvbuff_t *tvb, int offset, proto_tree *tree)
Radek Vokál 977e92
+{
Radek Vokál 977e92
+	guint i,j;
Radek Vokál 977e92
+	guint32 num_indices,num_multipath, num_addr;
Radek Vokál 977e92
 
Radek Vokál 977e92
 	/* No layout type - argh */
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -7737,13 +7859,12 @@ dissect_nfs_devices4(tvbuff_t *tvb, int 
Radek Vokál 977e92
 		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_deviceidx4,offset);
Radek Vokál 977e92
 	}
Radek Vokál 977e92
 
Radek Vokál 977e92
-	/* disect devices */
Radek Vokál 977e92
-	num_devs = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
+	num_multipath = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
 	offset += 4;
Radek Vokál 977e92
-	for (i = 0; i < num_devs; i++) {
Radek Vokál 977e92
-		num_multipath = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
+	for (i = 0; i < num_multipath; i++) {
Radek Vokál 977e92
+		num_addr = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
 		offset += 4;
Radek Vokál 977e92
-		for (i = 0; i < num_multipath; i++) {
Radek Vokál 977e92
+		for (j = 0; j < num_addr; j++) {
Radek Vokál 977e92
 			offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_r_netid);
Radek Vokál 977e92
 			offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_r_addr);
Radek Vokál 977e92
 		}
Radek Vokál 977e92
@@ -7756,11 +7877,13 @@ dissect_nfs_devices4(tvbuff_t *tvb, int 
Radek Vokál 977e92
 static int
Radek Vokál 977e92
 dissect_nfs_deviceaddr4(tvbuff_t *tvb, int offset, proto_tree *tree)
Radek Vokál 977e92
 {
Radek Vokál 977e92
-	/* No layout type - argh */
Radek Vokál 977e92
 
Radek Vokál 977e92
-	/* Assume file layout for now */
Radek Vokál 977e92
+	/* layout type */
Radek Vokál 977e92
 	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
+	/* skip da_addr_body size */
Radek Vokál 977e92
+	offset+=4;
Radek Vokál 977e92
+
Radek Vokál 977e92
 	offset = dissect_nfs_devices4(tvb, offset, tree);
Radek Vokál 977e92
 
Radek Vokál 977e92
 	return offset;
Radek Vokál 977e92
@@ -7775,17 +7898,9 @@ dissect_nfs_devicelist4(tvbuff_t *tvb, i
Radek Vokál 977e92
 	count = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
 	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_devicenum4, offset);
Radek Vokál 977e92
 	for (i = 0; i < count; i++) {
Radek Vokál 977e92
-		int opaque_devs, dev_limit;
Radek Vokál 977e92
-		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_deviceid4, offset);
Radek Vokál 977e92
-
Radek Vokál 977e92
-		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset);
Radek Vokál 977e92
-
Radek Vokál 977e92
-		opaque_devs = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
-		offset += 4;
Radek Vokál 977e92
-		dev_limit = opaque_devs + offset;
Radek Vokál 977e92
-		while (offset < dev_limit) {
Radek Vokál 977e92
-			offset = dissect_nfs_devices4(tvb, offset, tree);
Radek Vokál 977e92
-		}
Radek Vokál 977e92
+		offset = dissect_rpc_opaque_data(tvb, offset, tree, NULL,
Radek Vokál 977e92
+						hf_nfs_deviceid4, TRUE, 16,
Radek Vokál 977e92
+						FALSE, NULL, NULL);
Radek Vokál 977e92
 	}
Radek Vokál 977e92
 	return offset;
Radek Vokál 977e92
 }
Radek Vokál 977e92
@@ -7872,73 +7987,61 @@ dissect_rpc_secparms4(tvbuff_t *tvb, int
Radek Vokál 977e92
 }
Radek Vokál 977e92
 
Radek Vokál 977e92
 static int
Radek Vokál 977e92
-dissect_nfs_notifydsargs4(tvbuff_t *tvb, int offset, proto_tree *tree)
Radek Vokál 977e92
+dissect_nfs_layout(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
Radek Vokál 977e92
 {
Radek Vokál 977e92
+	guint layout_type;
Radek Vokál 977e92
+	guint fh_num;
Radek Vokál 977e92
+	guint lo_seg_count;
Radek Vokál 977e92
+	guint i, lo_seg;
Radek Vokál 977e92
+	proto_item *fitem;
Radek Vokál 977e92
+	proto_item *fh_fitem;
Radek Vokál 977e92
+	proto_tree *newtree = NULL;
Radek Vokál 977e92
+	proto_tree *fh_tree = NULL;
Radek Vokál 977e92
 
Radek Vokál 977e92
-	guint op;
Radek Vokál 977e92
+	lo_seg_count = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
-	op = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
-	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_notifydsop4, offset);
Radek Vokál 977e92
-	switch(op) {
Radek Vokál 977e92
-	case 0: { /* ADDSTATE */
Radek Vokál 977e92
-		guint count, i;
Radek Vokál 977e92
-		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_clientid4, offset);
Radek Vokál 977e92
+	fitem = proto_tree_add_text(tree, tvb, offset, 4,
Radek Vokál 977e92
+			"Layout Segment (count: %u)", lo_seg_count);
Radek Vokál 977e92
+	offset += 4;
Radek Vokál 977e92
 
Radek Vokál 977e92
-		proto_tree_add_text(tree, tvb, offset, 0, "filehandle: %s",
Radek Vokál 977e92
-							tvb_bytes_to_str(tvb, offset, 16));
Radek Vokál 977e92
-		offset += 16;
Radek Vokál 977e92
+	newtree = proto_item_add_subtree(fitem, ett_nfs_layoutseg);
Radek Vokál 977e92
 
Radek Vokál 977e92
-		count = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
-		offset += 4;
Radek Vokál 977e92
-		for (i = 0; i < count; i++) {
Radek Vokál 977e92
-			offset = dissect_nfs_stateid4(tvb, offset, tree);
Radek Vokál 977e92
-		}
Radek Vokál 977e92
-		break;
Radek Vokál 977e92
-	}
Radek Vokál 977e92
-	case 1: { /* DELSTATE */
Radek Vokál 977e92
-		guint count, i;
Radek Vokál 977e92
-		count = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
-		offset += 4;
Radek Vokál 977e92
-		for (i = 0; i < count; i++) {
Radek Vokál 977e92
-			offset = dissect_nfs_stateid4(tvb, offset, tree);
Radek Vokál 977e92
-		}
Radek Vokál 977e92
-		break;
Radek Vokál 977e92
-	}
Radek Vokál 977e92
-	case 2: /* DELCLIENT */
Radek Vokál 977e92
-		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_clientid4, offset);
Radek Vokál 977e92
-		break;
Radek Vokál 977e92
-	default:
Radek Vokál 977e92
-		break;
Radek Vokál 977e92
-	}
Radek Vokál 977e92
+	for (lo_seg = 0; lo_seg < lo_seg_count; lo_seg++) {
Radek Vokál 977e92
+		offset = dissect_rpc_uint64(tvb, newtree, hf_nfs_offset4, offset);
Radek Vokál 977e92
+		offset = dissect_rpc_uint64(tvb, newtree, hf_nfs_length4, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
-	return offset;
Radek Vokál 977e92
-}
Radek Vokál 977e92
+		offset = dissect_rpc_uint32(tvb, newtree, hf_nfs_iomode4, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
-static int
Radek Vokál 977e92
-dissect_nfs_layout(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree)
Radek Vokál 977e92
-{
Radek Vokál 977e92
-	guint layout_type;
Radek Vokál 977e92
+		layout_type = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
+		offset = dissect_rpc_uint32(tvb, newtree, hf_nfs_layouttype4, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
-	layout_type = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
-	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset);
Radek Vokál 977e92
+		/* If not files layout type eat the rest and move on.. */
Radek Vokál 977e92
+		if (layout_type != LAYOUT4_NFSV4_1_FILES) {
Radek Vokál 977e92
+			offset = dissect_nfsdata(tvb, offset, newtree, hf_nfs_layout4);
Radek Vokál 977e92
+			continue;
Radek Vokál 977e92
+		}
Radek Vokál 977e92
 
Radek Vokál 977e92
-	if (layout_type == 1) { /* NFS Files */
Radek Vokál 977e92
-		guint num;
Radek Vokál 977e92
-		guint i;
Radek Vokál 977e92
+		/* NFS Files */
Radek Vokál 977e92
 		offset += 4; /* Skip past opaque count */
Radek Vokál 977e92
-		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_deviceid4, offset);
Radek Vokál 977e92
-		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_util4, offset);
Radek Vokál 977e92
-		offset = dissect_rpc_uint32(tvb, tree, hf_nfs_first_stripe_idx4, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
-		num = tvb_get_ntohl(tvb, offset); /* Len of dev list */
Radek Vokál 977e92
+		offset = dissect_rpc_opaque_data(tvb, offset, newtree, NULL,
Radek Vokál 977e92
+				hf_nfs_deviceid4, TRUE, 16, FALSE, NULL, NULL);
Radek Vokál 977e92
+
Radek Vokál 977e92
+		offset = dissect_rpc_uint32(tvb, newtree, hf_nfs_nfl_util, offset);
Radek Vokál 977e92
+		offset = dissect_rpc_uint32(tvb, newtree, hf_nfs_nfl_first_stripe_index, offset);
Radek Vokál 977e92
+		offset = dissect_rpc_uint64(tvb, newtree, hf_nfs_offset4, offset);
Radek Vokál 977e92
+
Radek Vokál 977e92
+		fh_num = tvb_get_ntohl(tvb, offset); /* Len of FH list */
Radek Vokál 977e92
+
Radek Vokál 977e92
+		fh_fitem = proto_tree_add_text(newtree, tvb, offset, 4,
Radek Vokál 977e92
+				"File Handles (count: %u)", fh_num);
Radek Vokál 977e92
 		offset += 4;
Radek Vokál 977e92
-		for (i = 0; i < num; i++) {
Radek Vokál 977e92
-			offset = dissect_nfs_fh4(tvb, offset, pinfo, tree, "filehandle");
Radek Vokál 977e92
+
Radek Vokál 977e92
+		fh_tree = proto_item_add_subtree(fh_fitem, ett_nfs_layoutseg_fh);
Radek Vokál 977e92
+		for (i = 0; i < fh_num; i++) {
Radek Vokál 977e92
+			offset = dissect_nfs_fh4(tvb, offset, pinfo, fh_tree, "lo_filehandle");
Radek Vokál 977e92
 		}
Radek Vokál 977e92
-	} else {
Radek Vokál 977e92
-		offset = dissect_nfsdata(tvb, offset, tree, hf_nfs_layout4);
Radek Vokál 977e92
 	}
Radek Vokál 977e92
-
Radek Vokál 977e92
 	return offset;
Radek Vokál 977e92
 }
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -7979,7 +8082,7 @@ dissect_nfs_argop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 		offset += 4;
Radek Vokál 977e92
 
Radek Vokál 977e92
 		/* the opcodes are not contiguous */
Radek Vokál 977e92
-		if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_PNFS_CREATE)	&&
Radek Vokál 977e92
+		if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_RECLAIM_COMPLETE)	&&
Radek Vokál 977e92
 			(opcode != NFS4_OP_ILLEGAL))
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -8288,6 +8391,7 @@ dissect_nfs_argop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
Radek Vokál 977e92
 			offset = dissect_rpc_uint64(tvb, newftree,
Radek Vokál 977e92
 										hf_nfs_length4_minlength, offset);
Radek Vokál 977e92
+			offset = dissect_nfs_stateid4(tvb, offset, newftree);
Radek Vokál 977e92
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_count4_maxcount,
Radek Vokál 977e92
 										offset);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
@@ -8296,9 +8400,9 @@ dissect_nfs_argop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset);
Radek Vokál 977e92
 			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
Radek Vokál 977e92
 			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_reclaim4, offset);
Radek Vokál 977e92
+			offset = dissect_nfs_stateid4(tvb, offset, newftree);
Radek Vokál 977e92
 			offset = dissect_nfs_newoffset4(tvb, offset, newftree);
Radek Vokál 977e92
 			offset = dissect_nfs_newtime4(tvb, offset, newftree);
Radek Vokál 977e92
-			offset = dissect_nfs_newtime4(tvb, offset, newftree);
Radek Vokál 977e92
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4,
Radek Vokál 977e92
 										offset);
Radek Vokál 977e92
 			offset = dissect_nfsdata(tvb, offset, newftree,
Radek Vokál 977e92
@@ -8314,12 +8418,15 @@ dissect_nfs_argop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 		case NFS4_OP_GETDEVINFO:
Radek Vokál 977e92
-			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_deviceid4,
Radek Vokál 977e92
-										offset);
Radek Vokál 977e92
+			offset = dissect_rpc_opaque_data(tvb, offset, newftree, NULL,
Radek Vokál 977e92
+							hf_nfs_deviceid4, TRUE, 16,
Radek Vokál 977e92
+							FALSE, NULL, NULL);
Radek Vokál 977e92
+
Radek Vokál 977e92
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4,
Radek Vokál 977e92
 										offset);
Radek Vokál 977e92
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_count4_maxcount,
Radek Vokál 977e92
 										offset);
Radek Vokál 977e92
+			offset = dissect_nfs_notification_bitmap4(tvb, newftree, offset);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 		case NFS4_OP_GETDEVLIST:
Radek Vokál 977e92
@@ -8342,14 +8449,6 @@ dissect_nfs_argop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_cachethis4, offset);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
-		case NFS4_OP_NOTIFYDS:
Radek Vokál 977e92
-			offset = dissect_nfs_notifydsargs4(tvb, offset, newftree);
Radek Vokál 977e92
-			break;
Radek Vokál 977e92
-
Radek Vokál 977e92
-		case NFS4_OP_PNFS_CREATE:
Radek Vokál 977e92
-			offset = dissect_nfs_utf8string(tvb, offset, newftree, hf_nfs_component4, NULL);
Radek Vokál 977e92
-			break;
Radek Vokál 977e92
-
Radek Vokál 977e92
 		/* In theory, it's possible to get this opcode */
Radek Vokál 977e92
 		case NFS4_OP_ILLEGAL:
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
@@ -8438,7 +8537,7 @@ dissect_nfs_resop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 		opcode = tvb_get_ntohl(tvb, offset);
Radek Vokál 977e92
 
Radek Vokál 977e92
 		/* sanity check for bogus packets */
Radek Vokál 977e92
-		if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_PNFS_CREATE) &&
Radek Vokál 977e92
+		if ((opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_RECLAIM_COMPLETE) &&
Radek Vokál 977e92
 			(opcode != NFS4_OP_ILLEGAL))
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -8639,9 +8738,7 @@ dissect_nfs_resop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 		case NFS4_OP_LAYOUTGET:
Radek Vokál 977e92
 			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_return_on_close4,
Radek Vokál 977e92
 									  offset);
Radek Vokál 977e92
-			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_offset4, offset);
Radek Vokál 977e92
-			offset = dissect_rpc_uint64(tvb, newftree, hf_nfs_length4, offset);
Radek Vokál 977e92
-			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset);
Radek Vokál 977e92
+			offset = dissect_nfs_stateid4(tvb, offset, newftree);
Radek Vokál 977e92
 			offset = dissect_nfs_layout(tvb, offset, pinfo, newftree);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -8650,10 +8747,12 @@ dissect_nfs_resop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 		case NFS4_OP_LAYOUTRETURN:
Radek Vokál 977e92
+			offset = dissect_nfs_layoutreturn_stateid(tvb, newftree, offset);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 		case NFS4_OP_GETDEVINFO:
Radek Vokál 977e92
 			offset = dissect_nfs_deviceaddr4(tvb, offset, newftree);
Radek Vokál 977e92
+			offset = dissect_nfs_notification_bitmap4(tvb, newftree, offset);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
 		case NFS4_OP_GETDEVLIST:
Radek Vokál 977e92
@@ -8677,12 +8776,6 @@ dissect_nfs_resop4(tvbuff_t *tvb, int of
Radek Vokál 977e92
 										offset);
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 
Radek Vokál 977e92
-		case NFS4_OP_NOTIFYDS:
Radek Vokál 977e92
-			break;
Radek Vokál 977e92
-
Radek Vokál 977e92
-		case NFS4_OP_PNFS_CREATE:
Radek Vokál 977e92
-			break;
Radek Vokál 977e92
-
Radek Vokál 977e92
 		default:
Radek Vokál 977e92
 			break;
Radek Vokál 977e92
 		}
Radek Vokál 977e92
@@ -8885,13 +8978,6 @@ static const value_string names_nfs_nfss
Radek Vokál 977e92
 	{	0,	NULL }
Radek Vokál 977e92
 };
Radek Vokál 977e92
 
Radek Vokál 977e92
-static const value_string notifydsop_names[] = {
Radek Vokál 977e92
-	{	0,	"ADD_STATE"				},
Radek Vokál 977e92
-	{	1,	"DEL_STATE"				},
Radek Vokál 977e92
-	{	2,	"DEL_CLIENT"			},
Radek Vokál 977e92
-	{	0,	NULL }
Radek Vokál 977e92
-};
Radek Vokál 977e92
-
Radek Vokál 977e92
 static const value_string iomode_names[] = {
Radek Vokál 977e92
 	{ 1, "IOMODE_READ"},
Radek Vokál 977e92
 	{ 2, "IOMODE_RW"},
Radek Vokál 977e92
@@ -9756,6 +9842,10 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"fileid", "nfs.fattr4.mounted_on_fileid", FT_UINT64, BASE_HEX,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_fattr4_layout_blksize, {
Radek Vokál 977e92
+			"fileid", "nfs.fattr4.layout_blksize", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
+			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
 		{ &hf_nfs_verifier4, {
Radek Vokál 977e92
 			"verifier", "nfs.verifier4", FT_UINT64, BASE_HEX,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
@@ -9868,6 +9958,10 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"owner", "nfs.lock_owner4", FT_BYTES, BASE_DEC,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_createmode4, {
Radek Vokál 977e92
+			"Create Mode", "nfs.createmode4", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
+			VALS(names_createmode4), 0, NULL, HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
 		{ &hf_nfs_secinfo_rpcsec_gss_info_service, {
Radek Vokál 977e92
 			"service", "nfs.secinfo.rpcsec_gss_info.service", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
 			VALS(rpc_authgss_svc), 0, NULL, HFILL }},
Radek Vokál 977e92
@@ -10040,6 +10134,10 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"return type", "nfs.returntype", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
 			VALS(layoutreturn_names), 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_lrf_body_content, {
Radek Vokál 977e92
+			"lrf_body_content", "nfs.lrf_body_content", FT_BYTES, BASE_HEX,
Radek Vokál 977e92
+			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
 		{ &hf_nfs_iomode4, {
Radek Vokál 977e92
 			"IO mode", "nfs.iomode", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
 			VALS(iomode_names), 0, NULL, HFILL }},
Radek Vokál 977e92
@@ -10060,6 +10158,14 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"first stripe index", "nfs.stripeindex", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_pattern_offset, {
Radek Vokál 977e92
+			"layout pattern offset", "nfs.patternoffset", FT_UINT64, BASE_DEC,
Radek Vokál 977e92
+			NULL, 0, "layout pattern offset", HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
+		{ &hf_nfs_notification_bitmap4, {
Radek Vokál 977e92
+			"notification bitmap", "nfs.notificationbitmap", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
+			NULL, 0, "notification bitmap", HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
 		{ &hf_nfs_newtime4, {
Radek Vokál 977e92
 			"new time?", "nfs.newtime", FT_BOOLEAN, BASE_NONE,
Radek Vokál 977e92
 			TFS(&tfs_yes_no), 0, NULL, HFILL }},
Radek Vokál 977e92
@@ -10085,8 +10191,8 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
 		{ &hf_nfs_deviceid4, {
Radek Vokál 977e92
-			"device ID", "nfs.deviceid", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
-			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
+			"device ID", "nfs.deviceid", FT_BYTES, BASE_HEX,
Radek Vokál 977e92
+			NULL, 0, "device ID", HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
 		{ &hf_nfs_devicenum4, {
Radek Vokál 977e92
 			"num devices", "nfs.devicenum4", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
@@ -10100,6 +10206,11 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"layout", "nfs.layout", FT_BYTES, BASE_DEC,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_layout_count, {
Radek Vokál 977e92
+			"layout", "nfs.layoutcount", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
+			NULL, 0, "layout count", HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
+
Radek Vokál 977e92
 		{ &hf_nfs_stripedevs4, {
Radek Vokál 977e92
 			"stripe devs", "nfs.stripedevs", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
@@ -10108,14 +10219,18 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"device addr", "nfs.devaddr", FT_BYTES, BASE_DEC,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
-		{ &hf_nfs_notifydsop4, {
Radek Vokál 977e92
-			"NotifyDS op", "nfs.notifydsop", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
-			VALS(notifydsop_names), 0, NULL, HFILL }},
Radek Vokál 977e92
-
Radek Vokál 977e92
 		{ &hf_nfs_return_on_close4, {
Radek Vokál 977e92
 			"return on close?", "nfs.retclose4", FT_BOOLEAN, BASE_NONE,
Radek Vokál 977e92
 			TFS(&tfs_yes_no), 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_nfl_util, {
Radek Vokál 977e92
+			"nfl_util", "nfs.nfl_util", FT_UINT32, BASE_HEX,
Radek Vokál 977e92
+			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
+		{ &hf_nfs_nfl_first_stripe_index, {
Radek Vokál 977e92
+			"first stripe to use index", "nfs.nfl_first_stripe_index", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
+			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
 		{ &hf_nfs_slotid4, {
Radek Vokál 977e92
 			"slot ID", "nfs.slotid4", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
 			NULL, 0, NULL, HFILL }},
Radek Vokál 977e92
@@ -10237,6 +10352,10 @@ proto_register_nfs(void)
Radek Vokál 977e92
 			"Cache this?", "nfs.cachethis4", FT_BOOLEAN, BASE_NONE,
Radek Vokál 977e92
 			TFS(&tfs_yes_no), 0, NULL, HFILL }},
Radek Vokál 977e92
 
Radek Vokál 977e92
+		{ &hf_nfs_lrs_present, {
Radek Vokál 977e92
+			"Stateid present?", "nfs.lrs_present", FT_BOOLEAN, BASE_NONE,
Radek Vokál 977e92
+			TFS(&tfs_yes_no), 0, NULL, HFILL }},
Radek Vokál 977e92
+
Radek Vokál 977e92
 	/* Hidden field for v2, v3, and v4 status */
Radek Vokál 977e92
 		{ &hf_nfs_nfsstat, {
Radek Vokál 977e92
 			"Status", "nfs.status", FT_UINT32, BASE_DEC,
Radek Vokál 977e92
@@ -10337,8 +10456,6 @@ proto_register_nfs(void)
Radek Vokál 977e92
 		&ett_nfs_layoutreturn4,
Radek Vokál 977e92
 		&ett_nfs_getdevinfo4,
Radek Vokál 977e92
 		&ett_nfs_getdevlist4,
Radek Vokál 977e92
-		&ett_nfs_notifyds4,
Radek Vokál 977e92
-		&ett_nfs_pnfs_create4,
Radek Vokál 977e92
 		&ett_nfs_illegal4,
Radek Vokál 977e92
 		&ett_nfs_verifier4,
Radek Vokál 977e92
 		&ett_nfs_opaque,
Radek Vokál 977e92
@@ -10393,7 +10510,9 @@ proto_register_nfs(void)
Radek Vokál 977e92
 		&ett_nfs_uid4,
Radek Vokál 977e92
 		&ett_nfs_gid4,
Radek Vokál 977e92
 		&ett_nfs_service4,
Radek Vokál 977e92
-		&ett_nfs_sessionid4
Radek Vokál 977e92
+		&ett_nfs_sessionid4,
Radek Vokál 977e92
+		&ett_nfs_layoutseg,
Radek Vokál 977e92
+		&ett_nfs_layoutseg_fh
Radek Vokál 977e92
 	};
Radek Vokál 977e92
 	module_t *nfs_module;
Radek Vokál 977e92
 
Radek Vokál 977e92
diff -up wireshark-1.0.2/epan/dissectors/packet-nfs.h.orig wireshark-1.0.2/epan/dissectors/packet-nfs.h
Radek Vokál 977e92
--- wireshark-1.0.2/epan/dissectors/packet-nfs.h.orig	2008-07-10 13:39:23.000000000 -0400
Radek Vokál 977e92
+++ wireshark-1.0.2/epan/dissectors/packet-nfs.h	2008-07-17 06:42:09.000000000 -0400
Radek Vokál 977e92
@@ -105,19 +105,25 @@
Radek Vokál 977e92
 #define NFS4_OP_WRITE						38
Radek Vokál 977e92
 #define NFS4_OP_RELEASE_LOCKOWNER		39
Radek Vokál 977e92
 /* Minor version 1 */
Radek Vokál 977e92
+#define NFS4_OP_BACKCHANNEL_CTL       40
Radek Vokál 977e92
+#define NFS4_OP_BIND_CONN_TO_SESSION  41
Radek Vokál 977e92
 #define NFS4_OP_EXCHANGE_ID       42
Radek Vokál 977e92
 #define NFS4_OP_CREATE_SESSION    43
Radek Vokál 977e92
 #define NFS4_OP_DESTROY_SESSION   44
Radek Vokál 977e92
+#define NFS4_OP_FREE_STATEID          45
Radek Vokál 977e92
+#define NFS4_OP_GET_DIR_DELEGATION    46
Radek Vokál 977e92
 #define NFS4_OP_GETDEVINFO        47
Radek Vokál 977e92
 #define NFS4_OP_GETDEVLIST		  48
Radek Vokál 977e92
 #define NFS4_OP_LAYOUTCOMMIT         49
Radek Vokál 977e92
 #define NFS4_OP_LAYOUTGET	    	 50
Radek Vokál 977e92
 #define NFS4_OP_LAYOUTRETURN		 51
Radek Vokál 977e92
+#define NFS4_OP_SECINFO_NO_NAME       52
Radek Vokál 977e92
 #define NFS4_OP_SEQUENCE             53
Radek Vokál 977e92
-#define NFS4_OP_NOTIFYDS             60
Radek Vokál 977e92
-#define NFS4_OP_PNFS_CREATE          61
Radek Vokál 977e92
-#define NFS4_OP_PNFS_WRITE           62
Radek Vokál 977e92
-#define NFS4_OP_PNFS_READ            63
Radek Vokál 977e92
+#define NFS4_OP_SET_SSV               54
Radek Vokál 977e92
+#define NFS4_OP_TEST_STATEID          55
Radek Vokál 977e92
+#define NFS4_OP_WANT_DELEGATION       56
Radek Vokál 977e92
+#define NFS4_OP_DESTROY_CLIENTID      57
Radek Vokál 977e92
+#define NFS4_OP_RECLAIM_COMPLETE      58
Radek Vokál 977e92
 
Radek Vokál 977e92
 #define NFS4_OP_ILLEGAL						10044
Radek Vokál 977e92
 
Radek Vokál 977e92
@@ -131,6 +137,17 @@
Radek Vokál 977e92
 #define GUARDED 1
Radek Vokál 977e92
 #define EXCLUSIVE 2
Radek Vokál 977e92
 
Radek Vokál 977e92
+/* for create4 */
Radek Vokál 977e92
+#define UNCHECKED4 0
Radek Vokál 977e92
+#define GUARDED4 1
Radek Vokál 977e92
+#define EXCLUSIVE4 2
Radek Vokál 977e92
+#define EXCLUSIVE4_1 3
Radek Vokál 977e92
+
Radek Vokál 977e92
+/* pNFS layout types */
Radek Vokál 977e92
+#define LAYOUT4_NFSV4_1_FILES  1
Radek Vokál 977e92
+#define LAYOUT4_OSD2_OBJECTS   2
Radek Vokál 977e92
+#define LAYOUT4_BLOCK_VOLUME   3
Radek Vokál 977e92
+
Radek Vokál 977e92
 extern gboolean nfs_file_name_snooping;
Radek Vokál 977e92
 
Radek Vokál 977e92
 extern int dissect_fhandle(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree,