Blame wireshark-1.2.6-nfs40-backchnl-decode.patch

Jeff Layton ddc891
From 531ee0b54e7406992f9eefc60fbbbd4534116f99 Mon Sep 17 00:00:00 2001
Jeff Layton ddc891
From: Jeff Layton <jlayton@redhat.com>
Jeff Layton ddc891
Date: Tue, 9 Mar 2010 12:25:50 -0500
Jeff Layton ddc891
Subject: [PATCH] Dynamically register callback dissector based on the NFSv4.0 SETCLIENTID
Jeff Layton ddc891
 args (the equivalent of what had already been done for NFSv4.1
Jeff Layton ddc891
 CREATE_SESSION).
Jeff Layton ddc891
Jeff Layton ddc891
Fix CB_LAYOUTRECALL dissecting: the recall type wasn't getting parsed,
Jeff Layton ddc891
so some of the layout recall info wasn't being displayed.
Jeff Layton ddc891
Jeff Layton ddc891
Parse CB_SEQUENCE's referring call lists.
Jeff Layton ddc891
---
Jeff Layton ddc891
 epan/dissectors/packet-nfs.c |   68 +++++++++++++++++++++++++++++++++++------
Jeff Layton ddc891
 1 files changed, 58 insertions(+), 10 deletions(-)
Jeff Layton ddc891
Jeff Layton ddc891
diff --git a/epan/dissectors/packet-nfs.c b/epan/dissectors/packet-nfs.c
Jeff Layton ddc891
index 82ebfe4..fa475b7 100644
Jeff Layton ddc891
--- a/epan/dissectors/packet-nfs.c
Jeff Layton ddc891
+++ b/epan/dissectors/packet-nfs.c
Jeff Layton ddc891
@@ -7723,7 +7723,10 @@ dissect_nfs_cb_client4(tvbuff_t *tvb, int offset, proto_tree *tree)
Jeff Layton ddc891
 {
Jeff Layton ddc891
 	proto_tree *cb_location = NULL;
Jeff Layton ddc891
 	proto_item *fitem = NULL;
Jeff Layton ddc891
+	int cbprog;
Jeff Layton ddc891
 
Jeff Layton ddc891
+	cbprog = tvb_get_ntohl(tvb, offset);
Jeff Layton ddc891
+	reg_callback(cbprog);
Jeff Layton ddc891
 	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_cb_program, offset);
Jeff Layton ddc891
 	fitem = proto_tree_add_text(tree, tvb, offset, 0, "cb_location");
Jeff Layton ddc891
 
Jeff Layton ddc891
@@ -9646,6 +9649,8 @@ static gint ett_nfs_cb_wantscancelled = -1;
Jeff Layton ddc891
 static gint ett_nfs_cb_notifylock = -1;
Jeff Layton ddc891
 static gint ett_nfs_cb_notifydeviceid = -1;
Jeff Layton ddc891
 static gint ett_nfs_cb_notify = -1;
Jeff Layton ddc891
+static gint ett_nfs_cb_reflists = -1;
Jeff Layton ddc891
+static gint ett_nfs_cb_refcalls = -1;
Jeff Layton ddc891
 static gint ett_nfs_cb_illegal = -1;
Jeff Layton ddc891
 
Jeff Layton ddc891
 static const value_string names_nfs_cb_operation[] = {
Jeff Layton ddc891
@@ -9683,16 +9688,56 @@ gint *nfs_cb_operation_ett[] =
Jeff Layton ddc891
 };
Jeff Layton ddc891
 
Jeff Layton ddc891
 static int
Jeff Layton ddc891
+dissect_nfs_cb_referring_calls(tvbuff_t *tvb, int offset, proto_tree *tree)
Jeff Layton ddc891
+{
Jeff Layton ddc891
+	guint num_reflists, num_refcalls, i, j;
Jeff Layton ddc891
+	proto_item *rl_item, *rc_item;
Jeff Layton ddc891
+	proto_tree *rl_tree = NULL, *rc_tree = NULL;
Jeff Layton ddc891
+
Jeff Layton ddc891
+	num_reflists = tvb_get_ntohl(tvb, offset);
Jeff Layton ddc891
+	rl_item = proto_tree_add_text(tree, tvb, offset, 4,
Jeff Layton ddc891
+			"referring call lists (count: %u)", num_reflists);
Jeff Layton ddc891
+	offset += 4;
Jeff Layton ddc891
+	if (num_reflists == 0)
Jeff Layton ddc891
+		return offset;
Jeff Layton ddc891
+
Jeff Layton ddc891
+	rl_tree = proto_item_add_subtree(rl_item, ett_nfs_cb_reflists);
Jeff Layton ddc891
+
Jeff Layton ddc891
+	for (i = 0; i < num_reflists; i++) {
Jeff Layton ddc891
+		offset = dissect_rpc_opaque_data(tvb, offset, rl_tree, NULL,
Jeff Layton ddc891
+				hf_nfs_sessionid4, TRUE, 16, FALSE, NULL, NULL);
Jeff Layton ddc891
+		num_refcalls = tvb_get_ntohl(tvb, offset);
Jeff Layton ddc891
+		rc_item = proto_tree_add_text(rl_tree, tvb, offset, 4,
Jeff Layton ddc891
+				"referring calls (count: %u)", num_refcalls);
Jeff Layton ddc891
+		offset += 4;
Jeff Layton ddc891
+		for (j = 0; j < num_refcalls; j++) {
Jeff Layton ddc891
+			rc_tree = proto_item_add_subtree(rc_item, ett_nfs_cb_refcalls);
Jeff Layton ddc891
+			offset = dissect_rpc_uint32(tvb, rc_tree, hf_nfs_seqid4, offset);
Jeff Layton ddc891
+			offset = dissect_rpc_uint32(tvb, rc_tree, hf_nfs_slotid4, offset);
Jeff Layton ddc891
+		}
Jeff Layton ddc891
+	}
Jeff Layton ddc891
+
Jeff Layton ddc891
+	return offset;
Jeff Layton ddc891
+}
Jeff Layton ddc891
+
Jeff Layton ddc891
+static int
Jeff Layton ddc891
 dissect_nfs_cb_layoutrecall(tvbuff_t *tvb, int offset, proto_tree *tree, packet_info *pinfo)
Jeff Layton ddc891
 {
Jeff Layton ddc891
-	guint recalltype = hf_nfs_layouttype4;
Jeff Layton ddc891
+	guint recall_type;
Jeff Layton ddc891
 
Jeff Layton ddc891
-	if (recalltype == 1) { /* RETURN_FILE */
Jeff Layton ddc891
+	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_layouttype4, offset);
Jeff Layton ddc891
+	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_iomode4, offset);
Jeff Layton ddc891
+	offset = dissect_rpc_bool(tvb, tree, hf_nfs_cb_clorachanged, offset);
Jeff Layton ddc891
+
Jeff Layton ddc891
+	recall_type = tvb_get_ntohl(tvb, offset);
Jeff Layton ddc891
+	offset = dissect_rpc_uint32(tvb, tree, hf_nfs_cb_layoutrecall_type, offset);
Jeff Layton ddc891
+
Jeff Layton ddc891
+	if (recall_type == 1) { /* RECALL_FILE */
Jeff Layton ddc891
 		offset = dissect_nfs_fh4(tvb, offset, pinfo, tree, "filehandle");  
Jeff Layton ddc891
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_offset4, offset);
Jeff Layton ddc891
 		offset = dissect_rpc_uint64(tvb, tree, hf_nfs_length4, offset);
Jeff Layton ddc891
 		offset = dissect_nfs_stateid4(tvb, offset, tree);
Jeff Layton ddc891
-	} else if (recalltype == 2) { /* RETURN_FSID */
Jeff Layton ddc891
+	} else if (recall_type == 2) { /* RECALL_FSID */
Jeff Layton ddc891
 		offset = dissect_nfs_fsid4(tvb, offset, tree, "fsid");
Jeff Layton ddc891
 	}
Jeff Layton ddc891
 
Jeff Layton ddc891
@@ -9748,9 +9793,6 @@ dissect_nfs_cb_argop(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *
Jeff Layton ddc891
 			break;
Jeff Layton ddc891
 		case NFS4_OP_CB_GETATTR:
Jeff Layton ddc891
 		case NFS4_OP_CB_LAYOUTRECALL:
Jeff Layton ddc891
-		  	offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_layouttype4, offset);
Jeff Layton ddc891
-			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_iomode4, offset);
Jeff Layton ddc891
-			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_cb_clorachanged, offset);
Jeff Layton ddc891
 			offset = dissect_nfs_cb_layoutrecall(tvb, offset, newftree, pinfo);
Jeff Layton ddc891
 			break;
Jeff Layton ddc891
 		case NFS4_OP_CB_NOTIFY:
Jeff Layton ddc891
@@ -9766,8 +9808,7 @@ dissect_nfs_cb_argop(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *
Jeff Layton ddc891
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset);
Jeff Layton ddc891
 			offset = dissect_rpc_uint32(tvb, newftree, hf_nfs_slotid4, offset);
Jeff Layton ddc891
 			offset = dissect_rpc_bool(tvb, newftree, hf_nfs_cachethis4, offset);
Jeff Layton ddc891
-			/* skip refs -- assume 0 */
Jeff Layton ddc891
-			offset = offset + 4;
Jeff Layton ddc891
+			offset = dissect_nfs_cb_referring_calls(tvb, offset, newftree);
Jeff Layton ddc891
 			break;
Jeff Layton ddc891
 		case NFS4_OP_CB_WANTS_CANCELLED:
Jeff Layton ddc891
 		case NFS4_OP_CB_NOTIFY_LOCK:
Jeff Layton ddc891
@@ -9920,8 +9961,13 @@ void reg_callback(int cbprog)
Jeff Layton ddc891
 	/* Register the protocol as RPC */
Jeff Layton ddc891
 	rpc_init_prog(proto_nfs, cbprog, ett_nfs);
Jeff Layton ddc891
 	
Jeff Layton ddc891
-	/* Register the procedure tables */
Jeff Layton ddc891
+	/*
Jeff Layton ddc891
+	 * Register the procedure tables.  The version should be 4,
Jeff Layton ddc891
+	 * but some Linux kernels set this field to 1.  "Temporarily",
Jeff Layton ddc891
+	 * accomodate these servers.
Jeff Layton ddc891
+	 */
Jeff Layton ddc891
 	rpc_init_proc_table(cbprog, 1, nfs_cb_proc, hf_nfs_cb_procedure);
Jeff Layton ddc891
+	rpc_init_proc_table(cbprog, 4, nfs_cb_proc, hf_nfs_cb_procedure);
Jeff Layton ddc891
 }
Jeff Layton ddc891
 
Jeff Layton ddc891
 void
Jeff Layton ddc891
@@ -11274,7 +11320,7 @@ proto_register_nfs(void)
Jeff Layton ddc891
 			"CREATE_SESSION flags", "nfs.create_session_flags", FT_UINT32, BASE_HEX,
Jeff Layton ddc891
 			NULL, 0, NULL, HFILL }},
Jeff Layton ddc891
 		{ &hf_nfs_cachethis4, {
Jeff Layton ddc891
-			"Cache this?", "nfs.cachethis4", FT_BOOLEAN, BASE_NONE,
Jeff Layton ddc891
+			"cache this?", "nfs.cachethis4", FT_BOOLEAN, BASE_NONE,
Jeff Layton ddc891
 			TFS(&tfs_yes_no), 0, NULL, HFILL }},
Jeff Layton ddc891
 		 
Jeff Layton ddc891
 		{ &hf_nfs_cb_procedure, {
Jeff Layton ddc891
@@ -11479,6 +11525,8 @@ proto_register_nfs(void)
Jeff Layton ddc891
 		&ett_nfs_cb_notifylock,
Jeff Layton ddc891
 		&ett_nfs_cb_notifydeviceid,
Jeff Layton ddc891
 		&ett_nfs_cb_notify,
Jeff Layton ddc891
+		&ett_nfs_cb_reflists,
Jeff Layton ddc891
+		&ett_nfs_cb_refcalls,
Jeff Layton ddc891
 		&ett_nfs_cb_illegal,
Jeff Layton ddc891
 	};
Jeff Layton ddc891
 	module_t *nfs_module;
Jeff Layton ddc891
-- 
Jeff Layton ddc891
1.6.6.1
Jeff Layton ddc891