Ethereal-dev: [Ethereal-dev] [PATCH] NFSv4 updates
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Mike Frisch <mfrisch@xxxxxxxxxx>
Date: Mon, 29 Oct 2001 10:48:47 -0500
Enclosed are the updates for the latest protocol changes in NFSv4. These updates are current as of the 1.103 nfs4_prot.x changes of October 22nd, 2001.
Index: packet-nfs.c =================================================================== RCS file: /cvsroot/ethereal/packet-nfs.c,v retrieving revision 1.57 diff -u -r1.57 packet-nfs.c --- packet-nfs.c 2001/09/14 08:22:29 1.57 +++ packet-nfs.c 2001/10/29 15:44:50 @@ -180,7 +180,6 @@ static int hf_nfs_tag4 = -1; static int hf_nfs_component4 = -1; static int hf_nfs_clientid4 = -1; -static int hf_nfs_clientid4_verifier = -1; static int hf_nfs_ace4 = -1; static int hf_nfs_recall = -1; static int hf_nfs_open_claim_type4 = -1; @@ -192,6 +191,7 @@ static int hf_nfs_open4_share_access = -1; static int hf_nfs_open4_share_deny = -1; static int hf_nfs_seqid4 = -1; +static int hf_nfs_lock_seqid4 = -1; static int hf_nfs_mand_attr = -1; static int hf_nfs_recc_attr = -1; static int hf_nfs_time_how4 = -1; @@ -241,7 +241,7 @@ static int hf_nfs_offset4 = -1; static int hf_nfs_specdata1 = -1; static int hf_nfs_specdata2 = -1; -static int hf_nfs_locktype4 = -1; +static int hf_nfs_lock_type4 = -1; static int hf_nfs_reclaim4 = -1; static int hf_nfs_length4 = -1; static int hf_nfs_changeid4 = -1; @@ -269,6 +269,16 @@ static int hf_nfs_count4_dircount = -1; static int hf_nfs_count4_maxcount = -1; static int hf_nfs_minorversion = -1; +static int hf_nfs_open_owner4 = -1; +static int hf_nfs_lock_owner4 = -1; +static int hf_nfs_new_lock_owner = -1; +static int hf_nfs_sec_oid4 = -1; +static int hf_nfs_qop4 = -1; +static int hf_nfs_secinfo_rpcsec_gss_info_service = -1; +static int hf_nfs_attrdircreate = -1; +static int hf_nfs_client_id4_id = -1; +static int hf_nfs_stateid4_other = -1; +static int hf_nfs_lock4_reclaim = -1; static gint ett_nfs = -1; static gint ett_nfs_fh_encoding = -1; @@ -356,7 +366,7 @@ static gint ett_nfs_open_delegation4 = -1; static gint ett_nfs_open_claim4 = -1; static gint ett_nfs_opentype4 = -1; -static gint ett_nfs_lockowner4 = -1; +static gint ett_nfs_lock_owner4 = -1; static gint ett_nfs_cb_client4 = -1; static gint ett_nfs_client_id4 = -1; static gint ett_nfs_bitmap4 = -1; @@ -365,6 +375,8 @@ static gint ett_nfs_fs_locations4 = -1; static gint ett_nfs_fs_location4 = -1; static gint ett_nfs_open4_result_flags = -1; +static gint ett_nfs_secinfo4_flavor_info = -1; +static gint ett_nfs_stateid4 = -1; /* file handle dissection */ @@ -1070,6 +1082,12 @@ { 10029, "NFS4ERR_SYMLINK" }, { 10030, "NFS4ERR_READDIR_NOSPC" }, { 10031, "NFS4ERR_LEASE_MOVED" }, + { 10032, "NFS4ERR_ATTRNOTSUPP" }, + { 10033, "NFS4ERR_NO_GRACE" }, + { 10034, "NFS4ERR_RECLAIM_BAD" }, + { 10035, "NFS4ERR_RECLAIM_CONFLICT" }, + { 10036, "NFS4ERR_BADXDR" }, + { 10037, "NFS4ERR_LOCKS_HELD" }, { 0, NULL } }; @@ -1095,7 +1113,9 @@ } offset += 4; - *status = stat; + + if (status) *status = stat; + return offset; } @@ -3774,10 +3794,10 @@ return offset; } -/* 1 missing functions */ +/**********************************************************/ +/* NFS Version 4, RFC 3010 with nfs4_prot.x 1.103 changes */ +/**********************************************************/ -/* NFS Version 4 Protocol Draft Specification 07 */ - int dissect_nfs_utf8string(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, int hf, char **string_ret) @@ -3787,19 +3807,6 @@ } int -dissect_nfs_seqid4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree) -{ - guint seqid; - - seqid = tvb_get_ntohl(tvb, offset); - proto_tree_add_uint(tree, hf_nfs_seqid4, tvb, offset, 4, seqid); - offset += 4; - - return offset; -} - -int dissect_nfs_linktext4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { @@ -3818,12 +3825,10 @@ } int -dissect_nfs_client_id4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree, char *name) +dissect_nfs_clientid4(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) { - offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_clientid4_verifier, - offset); - offset = dissect_nfsdata(tvb, offset, pinfo, tree, hf_nfs_data); + offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_clientid4, offset); return offset; } @@ -3842,19 +3847,6 @@ }; int -dissect_nfs_ftype4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree, char *name) -{ - guint ftype4; - - ftype4 = tvb_get_ntohl(tvb, offset); - proto_tree_add_uint(tree, hf_nfs_ftype4, tvb, offset, 4, ftype4); - offset += 4; - - return offset; -} - -int dissect_nfs_component4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { @@ -3883,7 +3875,7 @@ proto_tree *tree, char *name); int -dissect_nfs_lockowner4(tvbuff_t *tvb, int offset, packet_info *pinfo, +dissect_nfs_lock_owner4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { proto_tree *newftree = NULL; @@ -3892,7 +3884,7 @@ fitem = proto_tree_add_text(tree, tvb, offset, 4, "Owner"); if (fitem) { - newftree = proto_item_add_subtree(fitem, ett_nfs_lockowner4); + newftree = proto_item_add_subtree(fitem, ett_nfs_lock_owner4); if (newftree) { offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_clientid4, @@ -4264,6 +4256,8 @@ { 0, NULL } }; +#define FATTR4_BITMAP_ONLY 0 +#define FATTR4_FULL_DISSECT 1 int dissect_nfs_attributes(tvbuff_t *tvb, int offset, packet_info *pinfo, @@ -4319,15 +4313,13 @@ (fattr < FATTR4_ACL)? hf_nfs_mand_attr: hf_nfs_recc_attr, tvb, offset, 4, fattr); - if (attr_fitem == NULL) - continue; + if (attr_fitem == NULL) break; attr_newftree = proto_item_add_subtree(attr_fitem, ett_nfs_bitmap4); - if (attr_newftree == NULL) - continue; + if (attr_newftree == NULL) break; - if (type == 1) + if (type == FATTR4_FULL_DISSECT) { /* do a full decode of the arguments for the set flag */ switch(fattr) @@ -4335,17 +4327,18 @@ case FATTR4_SUPPORTED_ATTRS: attr_vals_offset = dissect_nfs_attributes(tvb, attr_vals_offset, pinfo, attr_newftree, - "fattr4_supported_attrs", 0); + "fattr4_supported_attrs", FATTR4_BITMAP_ONLY); break; case FATTR4_TYPE: - attr_vals_offset = dissect_nfs_ftype4(tvb, attr_vals_offset, - pinfo, attr_newftree, "fattr4_type"); + attr_vals_offset = dissect_rpc_uint32(tvb, pinfo, + attr_newftree, hf_nfs_ftype4, attr_vals_offset); break; case FATTR4_FH_EXPIRE_TYPE: - attr_vals_offset = dissect_nfs_fh_expire_type(tvb, - attr_vals_offset, pinfo, attr_newftree); + attr_vals_offset = dissect_rpc_uint32(tvb, pinfo, + attr_newftree, hf_nfs_fattr4_expire_type, + attr_vals_offset); break; case FATTR4_CHANGE: @@ -4388,7 +4381,8 @@ case FATTR4_LEASE_TIME: attr_vals_offset = dissect_rpc_uint32(tvb, pinfo, - attr_newftree, hf_nfs_fattr4_lease_time, offset); + attr_newftree, hf_nfs_fattr4_lease_time, + attr_vals_offset); break; case FATTR4_RDATTR_ERROR: @@ -4620,13 +4614,6 @@ } int -dissect_nfs_attrlist4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree) -{ - return dissect_nfsdata(tvb, offset, pinfo, tree, hf_nfs_attrlist4); -} - -int dissect_nfs_fattr4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { @@ -4640,9 +4627,11 @@ newftree = proto_item_add_subtree(fitem, ett_nfs_fattr4); if (newftree == NULL) return offset; + + offset = dissect_nfs_attributes(tvb, offset, pinfo, newftree, name, + FATTR4_FULL_DISSECT); - offset = dissect_nfs_attributes(tvb, offset, pinfo, newftree, name, 1); - offset = dissect_nfs_attrlist4(tvb, offset, pinfo, newftree); + offset = dissect_nfsdata(tvb, offset, pinfo, tree, hf_nfs_attrlist4); return offset; } @@ -4698,12 +4687,22 @@ } int +dissect_nfs_open_owner4(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) +{ + offset = dissect_nfs_clientid4(tvb, offset, pinfo, tree); + offset = dissect_nfsdata(tvb, offset, pinfo, tree, hf_nfs_open_owner4); + + return offset; +} + +int dissect_nfs_open_claim_delegate_cur4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { - offset = dissect_nfs_pathname4(tvb, offset, pinfo, tree, "file"); offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_stateid4_delegate_stateid, offset); + offset = dissect_nfs_component4(tvb, offset, pinfo, tree, "file"); return offset; } @@ -4741,7 +4740,7 @@ switch(open_claim_type4) { case CLAIM_NULL: - offset = dissect_nfs_pathname4(tvb, offset, pinfo, newftree, + offset = dissect_nfs_component4(tvb, offset, pinfo, newftree, "file"); break; @@ -4756,7 +4755,7 @@ break; case CLAIM_DELEGATE_PREV: - offset = dissect_nfs_pathname4(tvb, offset, pinfo, newftree, + offset = dissect_nfs_component4(tvb, offset, pinfo, newftree, "file_delegate_prev"); break; @@ -4770,10 +4769,6 @@ } int -dissect_nfs_verifier4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree, char *name); - -int dissect_nfs_createhow4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { @@ -4792,7 +4787,7 @@ break; case EXCLUSIVE: /* EXCLUSIVE4 */ - offset = dissect_nfs_verifier4(tvb, offset, pinfo, tree, "createverf"); + offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_verifier4, offset); break; default: @@ -4845,29 +4840,6 @@ } int -dissect_nfs_verifier4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree, char *name) -{ - return dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_verifier4, offset); -} - - -int -dissect_nfs_cookie4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree, char *name) -{ - return dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_cookie4, offset); -} - -int -dissect_nfs_cookieverf4(tvbuff_t *tvb, int offset, packet_info *pinfo, - proto_tree *tree, char *name) -{ - return dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_cookieverf4, offset); -} - - -int dissect_nfs_clientaddr4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { @@ -5017,10 +4989,11 @@ offset = dissect_rpc_bool(tvb, pinfo, newftree, hf_nfs_data_follows, offset); - + while (nextentry) { - offset = dissect_nfs_cookie4(tvb, offset, pinfo, newftree, "cookie"); + // offset = dissect_nfs_cookie4(tvb, offset, pinfo, newftree); + offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_cookie4, offset); offset = dissect_nfs_component4(tvb, offset, pinfo, newftree, "name"); offset = dissect_nfs_fattr4(tvb, offset, pinfo, newftree, "attrs"); nextentry = tvb_get_ntohl(tvb, offset); @@ -5043,7 +5016,7 @@ fitem = proto_tree_add_text(tree, tvb, offset, 0, "%s", name); if (fitem) { - newftree=proto_item_add_subtree(fitem, ett_nfs_change_info4); + newftree = proto_item_add_subtree(fitem, ett_nfs_change_info4); if (newftree) { offset = dissect_rpc_bool(tvb, pinfo, newftree, @@ -5056,13 +5029,29 @@ return offset; } +static const value_string names_nfs_lock_type4[] = +{ +#define READ_LT 1 + { READ_LT, "READ_LT" }, +#define WRITE_LT 2 + { WRITE_LT, "WRITE_LT" }, +#define READW_LT 3 + { READW_LT, "READW_LT" }, +#define WRITEW_LT 4 + { WRITEW_LT, "WRITEW_LT" }, +#define RELEASE_STATE 5 + { RELEASE_STATE, "RELEASE_STATE" }, + { 0, NULL } +}; + int dissect_nfs_lock4denied(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree, char *name) { - offset = dissect_nfs_lockowner4(tvb, offset, pinfo, tree, "owner"); offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_offset4, offset); offset = dissect_nfs_length4(tvb, offset, pinfo, tree, "length"); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_lock_type4, offset); + offset = dissect_nfs_lock_owner4(tvb, offset, pinfo, tree, "owner"); return offset; } @@ -5101,19 +5090,21 @@ "%s: 0x%08x", name, rflags); if (rflags_item) + { rflags_tree = proto_item_add_subtree(rflags_item, ett_nfs_open4_result_flags); - } - if (rflags_tree) - { - proto_tree_add_text(rflags_tree, tvb, offset, 4, "%s", - decode_enumerated_bitfield(rflags, OPEN4_RESULT_MLOCK, 2, - names_open4_result_flags, "%s")); - - proto_tree_add_text(rflags_tree, tvb, offset, 4, "%s", - decode_enumerated_bitfield(rflags, OPEN4_RESULT_CONFIRM, 2, - names_open4_result_flags, "%s")); + if (rflags_tree) + { + proto_tree_add_text(rflags_tree, tvb, offset, 4, "%s", + decode_enumerated_bitfield(rflags, OPEN4_RESULT_MLOCK, 2, + names_open4_result_flags, "%s")); + + proto_tree_add_text(rflags_tree, tvb, offset, 4, "%s", + decode_enumerated_bitfield(rflags, OPEN4_RESULT_CONFIRM, 2, + names_open4_result_flags, "%s")); + } + } } offset += 4; @@ -5122,10 +5113,51 @@ } int +dissect_nfs_stateid4(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) +{ + proto_item *fitem = NULL; + proto_tree *newftree = NULL; + int sublen; + int bytes_left; + gboolean first_line; + + fitem = proto_tree_add_text(tree, tvb, offset, 4, "stateid"); + + if (fitem) { + newftree = proto_item_add_subtree(fitem, ett_nfs_stateid4); + if (newftree) { + offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_seqid4, + offset); + + bytes_left = 12; + first_line = TRUE; + + while (bytes_left != 0) + { + sublen = 12; + if (sublen > bytes_left) + sublen = bytes_left; + + proto_tree_add_text(newftree, tvb, offset, sublen, "%s%s", + first_line ? "other: " : " ", + tvb_bytes_to_str(tvb, offset, sublen)); + + bytes_left -= sublen; + offset += sublen; + first_line = FALSE; + } + } + } + + return offset; +} + +int dissect_nfs_open_read_delegation4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree) { - offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_stateid4, offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, tree); offset = dissect_rpc_bool(tvb, pinfo, tree, hf_nfs_recall4, offset); offset = dissect_nfs_ace4(tvb, offset, pinfo, tree, "permissions"); @@ -5184,7 +5216,7 @@ dissect_nfs_open_write_delegation4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree) { - offset = dissect_rpc_uint64(tvb, pinfo, tree, hf_nfs_stateid4, offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, tree); offset = dissect_rpc_bool(tvb, pinfo, tree, hf_nfs_recall, offset); offset = dissect_nfs_space_limit4(tvb, offset, pinfo, tree, "space_limit"); return dissect_nfs_ace4(tvb, offset, pinfo, tree, "permissions"); @@ -5239,8 +5271,64 @@ return offset; } +int +dissect_nfs_rpcsec_gss_info(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) +{ + guint data_follows; + + while ((data_follows = tvb_get_ntohl(tvb, offset))) + { + offset += 4; + offset = dissect_nfsdata(tvb, offset, pinfo, tree, hf_nfs_sec_oid4); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_qop4, offset); + offset = dissect_rpc_uint32(tvb, pinfo, tree, + hf_nfs_secinfo_rpcsec_gss_info_service, offset); + } + + return offset; +} + +int +dissect_nfs_open_to_lock_owner4(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) +{ + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_seqid4, offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, tree); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_lock_seqid4, offset); + offset = dissect_nfs_lock_owner4(tvb, offset, pinfo, tree, "owner"); + + return offset; +} + +int +dissect_nfs_exist_lock_owner4(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) +{ + offset = dissect_nfs_stateid4(tvb, offset, pinfo, tree); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_lock_seqid4, offset); + + return offset; +} int +dissect_nfs_locker4(tvbuff_t *tvb, int offset, packet_info *pinfo, + proto_tree *tree) +{ + guint new_lock_owner; + + new_lock_owner = tvb_get_ntohl(tvb, offset); + offset = dissect_rpc_bool(tvb, pinfo, tree, hf_nfs_new_lock_owner, offset); + + if (new_lock_owner) + offset = dissect_nfs_open_to_lock_owner4(tvb, offset, pinfo, tree); + else + offset = dissect_nfs_exist_lock_owner4(tvb, offset, pinfo, tree); + + return offset; +} + +int dissect_nfs_argop4(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree *tree) { @@ -5265,17 +5353,19 @@ for (ops_counter=0; ops_counter<ops; ops_counter++) { opcode = tvb_get_ntohl(tvb, offset); + + printf("Call Opcode: %d\n", opcode); + fitem = proto_tree_add_uint(ftree, hf_nfs_argop4, tvb, offset, 4, opcode); offset += 4; - if (opcode < NFS4_OP_ACCESS || opcode >NFS4_OP_WRITE) + if (opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_WRITE) break; if (fitem == NULL) break; newftree = proto_item_add_subtree(fitem, *nfsv4_operation_ett[opcode-3]); - if (newftree == NULL) break; switch(opcode) @@ -5285,9 +5375,9 @@ break; case NFS4_OP_CLOSE: - offset = dissect_nfs_seqid4(tvb, offset, pinfo, newftree); - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, + offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_seqid4, offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); break; case NFS4_OP_COMMIT: @@ -5301,11 +5391,9 @@ { guint create_type; - offset = dissect_nfs_component4(tvb, offset, pinfo, newftree, - "objname"); - create_type = tvb_get_ntohl(tvb, offset); - offset = dissect_nfs_ftype4(tvb, offset, pinfo, newftree, "type"); + offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_ftype4, + offset); switch(create_type) { @@ -5328,6 +5416,12 @@ default: break; } + + offset = dissect_nfs_component4(tvb, offset, pinfo, newftree, + "objname"); + + offset = dissect_nfs_fattr4(tvb, offset, pinfo, newftree, + "createattrs"); } break; @@ -5337,13 +5431,12 @@ break; case NFS4_OP_DELEGRETURN: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); break; case NFS4_OP_GETATTR: offset = dissect_nfs_attributes(tvb, offset, pinfo, newftree, - "attr_request", 0); + "attr_request", FATTR4_BITMAP_ONLY); break; case NFS4_OP_GETFH: @@ -5355,39 +5448,39 @@ break; case NFS4_OP_LOCK: - offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_locktype4, + offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_lock_type4, offset); - offset = dissect_nfs_seqid4(tvb, offset, pinfo, newftree); - offset = dissect_nfs_reclaim4(tvb, offset, pinfo, newftree, "reclaim"); - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, + offset = dissect_rpc_bool(tvb, pinfo, newftree, hf_nfs_lock4_reclaim, offset); offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_offset4, offset); offset = dissect_nfs_length4(tvb, offset, pinfo, newftree, "length"); + offset = dissect_nfs_locker4(tvb, offset, pinfo, newftree); break; case NFS4_OP_LOCKT: - offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_locktype4, + offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_lock_type4, offset); - offset = dissect_nfs_lockowner4(tvb, offset, pinfo, newftree, "owner"); + offset = dissect_nfs_lock_owner4(tvb, offset, pinfo, newftree, + "owner"); offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_offset4, offset); offset = dissect_nfs_length4(tvb, offset, pinfo, newftree, "length"); break; case NFS4_OP_LOCKU: - offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_locktype4, + offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_lock_type4, offset); - offset = dissect_nfs_seqid4(tvb, offset, pinfo, newftree); - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_seqid4, offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_offset4, offset); offset = dissect_nfs_length4(tvb, offset, pinfo, newftree, "length"); break; case NFS4_OP_LOOKUP: - offset = dissect_nfs_pathname4(tvb, offset, pinfo, newftree, "path"); + offset = dissect_nfs_component4(tvb, offset, pinfo, newftree, + "objname"); break; case NFS4_OP_LOOKUPP: @@ -5399,28 +5492,28 @@ break; case NFS4_OP_OPEN: - offset = dissect_nfs_open_claim4(tvb, offset, pinfo, newftree, - "claim"); - offset = dissect_nfs_openflag4(tvb, offset, pinfo, newftree); - offset = dissect_nfs_lockowner4(tvb, offset, pinfo, newftree, "Owner"); - offset = dissect_nfs_seqid4(tvb, offset, pinfo, newftree); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_seqid4, offset); offset = dissect_nfs_open4_share_access(tvb, offset, pinfo, newftree); offset = dissect_nfs_open4_share_deny(tvb, offset, pinfo, newftree); + offset = dissect_nfs_open_owner4(tvb, offset, pinfo, newftree); + offset = dissect_nfs_openflag4(tvb, offset, pinfo, newftree); + offset = dissect_nfs_open_claim4(tvb, offset, pinfo, newftree, + "claim"); break; case NFS4_OP_OPENATTR: + offset = dissect_rpc_bool(tvb, pinfo, newftree, hf_nfs_attrdircreate, + offset); break; case NFS4_OP_OPEN_CONFIRM: - offset = dissect_nfs_seqid4(tvb, offset, pinfo, newftree); - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "verifier"); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_seqid4, offset); break; case NFS4_OP_OPEN_DOWNGRADE: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); - offset = dissect_nfs_seqid4(tvb, offset, pinfo, newftree); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); + offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_seqid4, offset); offset = dissect_nfs_open4_share_access(tvb, offset, pinfo, newftree); offset = dissect_nfs_open4_share_deny(tvb, offset, pinfo, newftree); break; @@ -5434,8 +5527,7 @@ break; case NFS4_OP_READ: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_offset4, offset); offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_count4, @@ -5443,15 +5535,16 @@ break; case NFS4_OP_READDIR: - offset = dissect_nfs_cookie4(tvb, offset, pinfo, newftree, "cookie"); - offset = dissect_nfs_cookieverf4(tvb, offset, pinfo, newftree, - "cookieverf"); + offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_cookie4, + offset); + offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_cookieverf4, + offset); offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_count4_dircount, offset); offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_count4_maxcount, offset); offset = dissect_nfs_attributes(tvb, offset, pinfo, newftree, "attr", - 0); + FATTR4_BITMAP_ONLY); break; case NFS4_OP_READLINK: @@ -5470,8 +5563,7 @@ break; case NFS4_OP_RENEW: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_clientid4(tvb, offset, pinfo, newftree); break; case NFS4_OP_RESTOREFH: @@ -5483,8 +5575,7 @@ break; case NFS4_OP_SETATTR: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); offset = dissect_nfs_fattr4(tvb, offset, pinfo, newftree, "obj_attributes"); break; @@ -5493,19 +5584,23 @@ { proto_tree *client_tree = NULL; - fitem = proto_tree_add_text(newftree, tvb, offset, 0, "Client"); + fitem = proto_tree_add_text(newftree, tvb, offset, 0, "client"); if (fitem) { client_tree = proto_item_add_subtree(fitem, ett_nfs_client_id4); if (newftree) - offset = dissect_nfs_client_id4(tvb, offset, pinfo, - client_tree, "client"); + { + offset = dissect_nfs_clientid4(tvb, offset, pinfo, + client_tree); + + offset = dissect_nfsdata(tvb, offset, pinfo, client_tree, + hf_nfs_client_id4_id); + } } - fitem = proto_tree_add_text(newftree, tvb, offset, 0, - "Callback"); + fitem = proto_tree_add_text(newftree, tvb, offset, 0, "callback"); if (fitem) { newftree = proto_item_add_subtree(fitem, ett_nfs_cb_client4); if (newftree) @@ -5516,18 +5611,16 @@ break; case NFS4_OP_SETCLIENTID_CONFIRM: - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "setclientid_confirm"); + offset = dissect_nfs_clientid4(tvb, offset, pinfo, newftree); break; case NFS4_OP_VERIFY: offset = dissect_nfs_fattr4(tvb, offset, pinfo, newftree, - "obj_attributes"); + "obj_attributes"); break; case NFS4_OP_WRITE: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_offset4, offset); offset = dissect_nfs_stable_how4(tvb, offset, pinfo, newftree, @@ -5551,6 +5644,7 @@ offset = dissect_rpc_uint32(tvb, pinfo, tree, hf_nfs_minorversion, offset); offset = dissect_nfs_argop4(tvb, offset, pinfo, tree); + return offset; } @@ -5580,6 +5674,8 @@ { opcode = tvb_get_ntohl(tvb, offset); + printf("Reply opcode: %d\n", opcode); + /* sanity check for bogus packets */ if (opcode < NFS4_OP_ACCESS || opcode > NFS4_OP_WRITE) break; @@ -5615,26 +5711,19 @@ break; case NFS4_OP_CLOSE: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); break; case NFS4_OP_COMMIT: - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "writeverf"); + offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_verifier4, + offset); break; case NFS4_OP_CREATE: offset = dissect_nfs_change_info4(tvb, offset, pinfo, newftree, "change_info"); - break; - - case NFS4_OP_DELEGPURGE: - /* void */ - break; - - case NFS4_OP_DELEGRETURN: - /* void */ + offset = dissect_nfs_fattr4(tvb, offset, pinfo, newftree, + "attrsset"); break; case NFS4_OP_GETATTR: @@ -5654,8 +5743,7 @@ case NFS4_OP_LOCK: case NFS4_OP_LOCKT: if (status == NFS4_OK) - offset = dissect_rpc_uint64(tvb, pinfo, newftree, - hf_nfs_stateid4, offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); else if (status == NFS4ERR_DENIED) offset = dissect_nfs_lock4denied(tvb, offset, pinfo, newftree, @@ -5663,55 +5751,24 @@ break; case NFS4_OP_LOCKU: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); break; - case NFS4_OP_LOOKUP: - /* void */ - break; - - case NFS4_OP_LOOKUPP: - /* void */ - break; - - case NFS4_OP_NVERIFY: - /* void */ - break; - case NFS4_OP_OPEN: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); offset = dissect_nfs_change_info4(tvb, offset, pinfo, newftree, "change_info"); offset = dissect_nfs_open4_rflags(tvb, offset, pinfo, newftree, "result_flags"); - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "verifier"); + offset = dissect_nfs_attributes(tvb, offset, pinfo, newftree, + "attrsset", FATTR4_BITMAP_ONLY); offset = dissect_nfs_open_delegation4(tvb, offset, pinfo, newftree, "delegation"); break; - case NFS4_OP_OPENATTR: - /* void */ - break; - case NFS4_OP_OPEN_CONFIRM: case NFS4_OP_OPEN_DOWNGRADE: - offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_stateid4, - offset); - break; - - case NFS4_OP_PUTFH: - /* void */ - break; - - case NFS4_OP_PUTPUBFH: - /* void */ - break; - - case NFS4_OP_PUTROOTFH: - /* void */ + offset = dissect_nfs_stateid4(tvb, offset, pinfo, newftree); break; case NFS4_OP_READ: @@ -5721,13 +5778,13 @@ break; case NFS4_OP_READDIR: - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "cookieverf"); + offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_verifier4, + offset); offset = dissect_nfs_dirlist4(tvb, offset, pinfo, newftree, "reply"); break; case NFS4_OP_READLINK: - offset = dissect_nfs_linktext4(tvb, offset, pinfo, newftree, "link"); + offset = dissect_nfs_linktext4(tvb, offset, pinfo, newftree, "link"); break; case NFS4_OP_REMOVE: @@ -5742,61 +5799,64 @@ "target_cinfo"); break; - case NFS4_OP_RENEW: - /* void */ - break; + case NFS4_OP_SECINFO: + { + guint data_follows; + guint flavor; + proto_item *fitem; + proto_tree *secftree; - case NFS4_OP_RESTOREFH: - /* void */ - break; + while ((data_follows = tvb_get_ntohl(tvb, offset))) + { + offset += 4; - case NFS4_OP_SAVEFH: - /* void */ - break; + flavor = tvb_get_ntohl(tvb, offset); + fitem = proto_tree_add_uint(tree, hf_nfs_secinfo_flavor, tvb, + offset, 4, flavor); + offset += 4; - case NFS4_OP_SECINFO: - offset = dissect_rpc_uint32(tvb, pinfo, newftree, - hf_nfs_secinfo_flavor, offset); - offset = dissect_nfs_opaque4(tvb, offset, pinfo, newftree, - "flavor_info"); + if (fitem) + { + switch(flavor) + { + case RPCSEC_GSS: + secftree = proto_item_add_subtree(fitem, + ett_nfs_secinfo4_flavor_info); + if (secftree) + offset = dissect_nfs_rpcsec_gss_info(tvb, offset, + pinfo, secftree); + break; + + default: + break; + } + } + } + } break; case NFS4_OP_SETATTR: offset = dissect_nfs_attributes(tvb, offset, pinfo, newftree, - "attrsset", 0); + "attrsset", FATTR4_BITMAP_ONLY); break; case NFS4_OP_SETCLIENTID: if (status == NFS4_OK) - { offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_clientid4, offset); - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "setclientid_confirm"); - } else if (status == NFS4ERR_CLID_INUSE) - { offset = dissect_nfs_clientaddr4(tvb, offset, pinfo, newftree, "client_using"); - } break; - case NFS4_OP_SETCLIENTID_CONFIRM: - /* void */ - break; - - case NFS4_OP_VERIFY: - /* void */ - break; - case NFS4_OP_WRITE: offset = dissect_rpc_uint32(tvb, pinfo, newftree, hf_nfs_count4, offset); offset = dissect_nfs_stable_how4(tvb, offset, pinfo, newftree, "committed"); - offset = dissect_nfs_verifier4(tvb, offset, pinfo, newftree, - "writeverf"); + offset = dissect_rpc_uint64(tvb, pinfo, newftree, hf_nfs_verifier4, + offset); break; default: @@ -6291,10 +6351,6 @@ "clientid", "nfs.clientid", FT_UINT32, BASE_DEC, NULL, 0, "Client ID", HFILL }}, - { &hf_nfs_clientid4_verifier, { - "verifier", "nfs.clientid.verifier", FT_UINT32, BASE_DEC, - NULL, 0, "Verifier Client ID", HFILL }}, - { &hf_nfs_ace4, { "ace", "nfs.ace", FT_STRING, BASE_DEC, NULL, 0, "Access Control Entry", HFILL }}, @@ -6339,6 +6395,10 @@ "seqid", "nfs.seqid", FT_UINT32, BASE_HEX, NULL, 0, "Sequence ID", HFILL }}, + { &hf_nfs_lock_seqid4, { + "lock_seqid", "nfs.lock_seqid", FT_UINT32, BASE_HEX, + NULL, 0, "Lock Sequence ID", HFILL }}, + { &hf_nfs_mand_attr, { "mand_attr", "nfs.attr", FT_UINT32, BASE_DEC, VALS(names_fattr4), 0, "Mandatory Attribute", HFILL }}, @@ -6459,9 +6519,9 @@ "specdata2", "nfs.specdata2", FT_UINT32, BASE_DEC, NULL, 0, "nfs.specdata2", HFILL }}, - { &hf_nfs_locktype4, { + { &hf_nfs_lock_type4, { "locktype", "nfs.locktype4", FT_UINT32, BASE_DEC, - NULL, 0, "nfs.locktype4", HFILL }}, + VALS(names_nfs_lock_type4), 0, "nfs.locktype4", HFILL }}, { &hf_nfs_reclaim4, { "reclaim", "nfs.reclaim4", FT_UINT32, BASE_DEC, @@ -6552,8 +6612,8 @@ NULL, 0, "nfs.delegate_type", HFILL }}, { &hf_nfs_secinfo_flavor, { - "secinfo_flavor", "nfs.secinfo_flavor", FT_UINT32, BASE_DEC, - NULL, 0, "nfs.secinfo_flavor", HFILL }}, + "flavor", "nfs.secinfo.flavor", FT_UINT32, BASE_DEC, + VALS(rpc_auth_flavor), 0, "nfs.secinfo.flavor", HFILL }}, { &hf_nfs_num_blocks, { "num_blocks", "nfs.num_blocks", FT_UINT32, BASE_DEC, @@ -6711,6 +6771,45 @@ "nano seconds", "nfs.dtime.nsec", FT_UINT32, BASE_DEC, NULL, 0, "Time Delta, Nano-seconds", HFILL }}, + { &hf_nfs_open_owner4, { + "owner", "nfs.open_owner4", FT_BYTES, BASE_DEC, + NULL, 0, "owner", HFILL }}, + + { &hf_nfs_lock_owner4, { + "owner", "nfs.lock_owner4", FT_BYTES, BASE_DEC, + NULL, 0, "owner", HFILL }}, + + { &hf_nfs_secinfo_rpcsec_gss_info_service, { + "service", "nfs.secinfo.rpcsec_gss_info.service", FT_UINT32, + BASE_DEC, VALS(rpc_authgss_svc), 0, "service", HFILL }}, + + { &hf_nfs_attrdircreate, { + "attribute dir create", "nfs.openattr4.createdir", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.openattr4.createdir", HFILL }}, + + { &hf_nfs_new_lock_owner, { + "new lock owner?", "nfs.lock.locker.new_lock_owner", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.lock.locker.new_lock_owner", HFILL }}, + + { &hf_nfs_lock4_reclaim, { + "reclaim?", "nfs.lock.reclaim", FT_BOOLEAN, + BASE_NONE, &yesno, 0, "nfs.lock.reclaim", HFILL }}, + + { &hf_nfs_sec_oid4, { + "oid", "nfs.secinfo.flavor_info.rpcsec_gss_info.oid", FT_BYTES, + BASE_DEC, NULL, 0, "oid", HFILL }}, + + { &hf_nfs_qop4, { + "qop", "nfs.secinfo.flavor_info.rpcsec_gss_info.qop", FT_UINT32, + BASE_DEC, NULL, 0, "qop", HFILL }}, + + { &hf_nfs_client_id4_id, { + "Data", "nfs.nfs_client_id4.id", FT_BYTES, BASE_DEC, + NULL, 0, "Data", HFILL }}, + + { &hf_nfs_stateid4_other, { + "Data", "nfs.stateid4.other", FT_BYTES, BASE_DEC, + NULL, 0, "Data", HFILL }}, }; static gint *ett[] = { @@ -6784,7 +6883,6 @@ &ett_nfs_renew4, &ett_nfs_restorefh4, &ett_nfs_savefh4, - &ett_nfs_secinfo4, &ett_nfs_setattr4, &ett_nfs_setclientid4, &ett_nfs_setclientid_confirm4, @@ -6798,7 +6896,7 @@ &ett_nfs_open_delegation4, &ett_nfs_open_claim4, &ett_nfs_opentype4, - &ett_nfs_lockowner4, + &ett_nfs_lock_owner4, &ett_nfs_cb_client4, &ett_nfs_client_id4, &ett_nfs_bitmap4, @@ -6806,7 +6904,9 @@ &ett_nfs_fsid4, &ett_nfs_fs_locations4, &ett_nfs_fs_location4, - &ett_nfs_open4_result_flags + &ett_nfs_open4_result_flags, + &ett_nfs_secinfo4_flavor_info, + &ett_nfs_stateid4 }; proto_nfs = proto_register_protocol("Network File System", "NFS", "nfs"); proto_register_field_array(proto_nfs, hf, array_length(hf));
Index: packet-rpc.c =================================================================== RCS file: /cvsroot/ethereal/packet-rpc.c,v retrieving revision 1.72 diff -u -r1.72 packet-rpc.c --- packet-rpc.c 2001/09/17 02:07:00 1.72 +++ packet-rpc.c 2001/10/29 15:45:47 @@ -96,7 +96,7 @@ { 0, NULL } }; -static const value_string rpc_authgss_svc[] = { +value_string rpc_authgss_svc[] = { { RPCSEC_GSS_SVC_NONE, "rpcsec_gss_svc_none" }, { RPCSEC_GSS_SVC_INTEGRITY, "rpcsec_gss_svc_integrity" }, { RPCSEC_GSS_SVC_PRIVACY, "rpcsec_gss_svc_privacy" },
Index: packet-rpc.h =================================================================== RCS file: /cvsroot/ethereal/packet-rpc.h,v retrieving revision 1.29 diff -u -r1.29 packet-rpc.h --- packet-rpc.h 2001/05/30 06:01:02 1.29 +++ packet-rpc.h 2001/10/29 15:45:54 @@ -74,6 +74,8 @@ #define AUTHDES_NAMEKIND_FULLNAME 0 #define AUTHDES_NAMEKIND_NICKNAME 1 +extern value_string rpc_authgss_svc[]; + typedef int (old_dissect_function_t)(const u_char* pd, int offset, frame_data* fd, proto_tree* tree); typedef int (dissect_function_t)(tvbuff_t *tvb, int offset, packet_info *pinfo, proto_tree* tree);
- Follow-Ups:
- Re: [Ethereal-dev] [PATCH] NFSv4 updates
- From: Guy Harris
- Re: [Ethereal-dev] [PATCH] NFSv4 updates
- Prev by Date: [Ethereal-dev] PPP CCP support added
- Next by Date: Re: [Ethereal-dev] Plugin API
- Previous by thread: Re: [Ethereal-dev] Re: PPP CCP support added
- Next by thread: Re: [Ethereal-dev] [PATCH] NFSv4 updates
- Index(es):