Ethereal-dev: [ethereal-dev] NFS goes on and on

Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.

From: Uwe Girlich <Uwe.Girlich@xxxxxxxxxxx>
Date: Mon, 29 Nov 1999 14:21:03 +0100
The next tiny step for NFS, just checked in:

packet-nfs.c
	NFS	v3	ACCESS	call,reply

Index: packet-nfs.c
===================================================================
RCS file: /usr/local/cvsroot/ethereal/packet-nfs.c,v
retrieving revision 1.9
diff -u -r1.9 packet-nfs.c
--- packet-nfs.c	1999/11/29 11:52:40	1.9
+++ packet-nfs.c	1999/11/29 13:06:50
@@ -68,6 +68,7 @@
 static gint ett_nfs_post_op_attr = -1;
 static gint ett_nfs_wcc_attr = -1;
 static gint ett_nfs_wcc_data = -1;
+static gint ett_nfs_access = -1;
 
 
 /***************************/
@@ -1490,6 +1491,44 @@
 }
 
 
+/* RFC 1813, Page 40 */
+int
+dissect_access(const u_char *pd, int offset, frame_data *fd, proto_tree *tree, char* name)
+{
+	guint32 access;
+	proto_item* access_item = NULL;
+	proto_tree* access_tree = NULL;
+
+	if (!BYTES_ARE_IN_FRAME(offset,4)) return offset;
+	access = EXTRACT_UINT(pd, offset+0);
+	
+	if (tree) {
+		access_item = proto_tree_add_text(tree, offset, 4,
+			"%s: 0x%02x", name, access);
+		if (access_item)
+			access_tree = proto_item_add_subtree(access_item, ett_nfs_access);
+	}
+
+	if (access_tree) {
+		proto_tree_add_text(access_tree, offset, 4, "%s READ",
+		decode_boolean_bitfield(access,  0x001, 6, "allow", "not allow"));
+		proto_tree_add_text(access_tree, offset, 4, "%s LOOKUP",
+		decode_boolean_bitfield(access,  0x002, 6, "allow", "not allow"));
+		proto_tree_add_text(access_tree, offset, 4, "%s MODIFY",
+		decode_boolean_bitfield(access,  0x004, 6, "allowed", "not allow"));
+		proto_tree_add_text(access_tree, offset, 4, "%s EXTEND",
+		decode_boolean_bitfield(access,  0x008, 6, "allow", "not allow"));
+		proto_tree_add_text(access_tree, offset, 4, "%s DELETE",
+		decode_boolean_bitfield(access,  0x010, 6, "allow", "not allow"));
+		proto_tree_add_text(access_tree, offset, 4, "%s EXECUTE",
+		decode_boolean_bitfield(access,  0x020, 6, "allow", "not allow"));
+	}
+
+	offset += 4;
+	return offset;
+}
+
+
 /* generic NFS3 call dissector */
 int
 dissect_nfs3_any_call(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
@@ -1512,7 +1551,7 @@
 }
 
 
-/* RFC 1813, Page 32 */
+/* RFC 1813, Page 32,33 */
 int
 dissect_nfs3_getattr_call(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
 {
@@ -1521,7 +1560,7 @@
 }
 
 
-/* RFC 1813, Page 32 */
+/* RFC 1813, Page 32,33 */
 int
 dissect_nfs3_getattr_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
 {
@@ -1587,7 +1626,7 @@
 }
 
 
-/* RFC 1813, Page 33 */
+/* RFC 1813, Page 33..36 */
 int
 dissect_nfs3_setattr_call(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
 {
@@ -1598,7 +1637,7 @@
 }
 
 
-/* RFC 1813, Page 33 */
+/* RFC 1813, Page 33..36 */
 int
 dissect_nfs3_setattr_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
 {
@@ -1618,7 +1657,7 @@
 }
 
 
-/* RFC 1813, Page 37 */
+/* RFC 1813, Page 37..39 */
 int
 dissect_nfs3_lookup_call(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
 {
@@ -1627,7 +1666,7 @@
 }
 
 
-/* RFC 1813, Page 37 */
+/* RFC 1813, Page 37..39 */
 int
 dissect_nfs3_lookup_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
 {
@@ -1648,6 +1687,39 @@
 	return offset;
 }
 
+
+/* RFC 1813, Page 40..43 */
+int
+dissect_nfs3_access_call(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
+{
+	offset = dissect_nfs_fh3(pd, offset, fd, tree, "object");
+	offset = dissect_access (pd, offset, fd, tree, "access");
+
+	return offset;
+}
+
+
+/* RFC 1813, Page 40..43 */
+int
+dissect_nfs3_access_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree)
+{
+	guint32 status;
+
+	offset = dissect_nfsstat3(pd, offset, fd, tree, "status", &status);
+	switch (status) {
+		case 0:
+			offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes");
+			offset = dissect_access      (pd, offset, fd, tree, "access");
+		break;
+		default:
+			offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes");
+		break;
+	}
+		
+	return offset;
+}
+
+
 /* proc number, "proc name", dissect_request, dissect_reply */
 /* NULL as function pointer means: take the generic one. */
 const vsff nfs3_proc[] = {
@@ -1655,7 +1727,7 @@
 	{ 1,	"GETATTR",	dissect_nfs3_getattr_call,	dissect_nfs3_getattr_reply },
 	{ 2,	"SETATTR",	dissect_nfs3_setattr_call,	dissect_nfs3_setattr_reply },
 	{ 3,	"LOOKUP",	dissect_nfs3_lookup_call,	dissect_nfs3_lookup_reply },
-	{ 4,	"ACCESS",	dissect_nfs3_any_call,		dissect_nfs3_any_reply },
+	{ 4,	"ACCESS",	dissect_nfs3_access_call,	dissect_nfs3_access_reply },
 	{ 5,	"READLINK",	dissect_nfs3_any_call,		dissect_nfs3_any_reply },
 	{ 6,	"READ",		dissect_nfs3_any_call,		dissect_nfs3_any_reply },
 	{ 7,	"WRITE",	dissect_nfs3_any_call,		dissect_nfs3_any_reply },
@@ -1712,6 +1784,7 @@
 		&ett_nfs_post_op_attr,
 		&ett_nfs_wcc_attr,
 		&ett_nfs_wcc_data,
+		&ett_nfs_access
 	};
 	proto_nfs = proto_register_protocol("Network File System", "nfs");
 	proto_register_field_array(proto_nfs, hf, array_length(hf));