diff options
author | girlich <girlich@f5534014-38df-0310-8fa8-9805f1628bb7> | 1999-12-10 10:52:40 +0000 |
---|---|---|
committer | girlich <girlich@f5534014-38df-0310-8fa8-9805f1628bb7> | 1999-12-10 10:52:40 +0000 |
commit | 812f332cc020713ebf68f7d555bf4898b4f9d8cf (patch) | |
tree | 767026d725e75e222e2481b7b7492d462610aa6e /packet-nfs.c | |
parent | bc3d08f00e2dadb9121f26fe39e31d77ced49728 (diff) |
More v3 dissectors added. 11 function are still missing.
git-svn-id: http://anonsvn.wireshark.org/wireshark/trunk@1282 f5534014-38df-0310-8fa8-9805f1628bb7
Diffstat (limited to 'packet-nfs.c')
-rw-r--r-- | packet-nfs.c | 299 |
1 files changed, 288 insertions, 11 deletions
diff --git a/packet-nfs.c b/packet-nfs.c index 071a8ae8af..4c580c0135 100644 --- a/packet-nfs.c +++ b/packet-nfs.c @@ -2,7 +2,7 @@ * Routines for nfs dissection * Copyright 1999, Uwe Girlich <Uwe.Girlich@philosys.de> * - * $Id: packet-nfs.c,v 1.14 1999/12/09 12:54:10 girlich Exp $ + * $Id: packet-nfs.c,v 1.15 1999/12/10 10:52:40 girlich Exp $ * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@unicom.net> @@ -66,6 +66,21 @@ static int hf_nfs_statfs_blocks = -1; static int hf_nfs_statfs_bfree = -1; static int hf_nfs_statfs_bavail = -1; static int hf_nfs_createmode3 = -1; +static int hf_nfs_fsstat_invarsec = -1; +static int hf_nfs_fsinfo_rtmax = -1; +static int hf_nfs_fsinfo_rtpref = -1; +static int hf_nfs_fsinfo_rtmult = -1; +static int hf_nfs_fsinfo_wtmax = -1; +static int hf_nfs_fsinfo_wtpref = -1; +static int hf_nfs_fsinfo_wtmult = -1; +static int hf_nfs_fsinfo_dtpref = -1; +static int hf_nfs_fsinfo_properties = -1; +static int hf_nfs_pathconf_linkmax = -1; +static int hf_nfs_pathconf_name_max = -1; +static int hf_nfs_pathconf_no_trunc = -1; +static int hf_nfs_pathconf_chown_restricted = -1; +static int hf_nfs_pathconf_case_insensitive = -1; +static int hf_nfs_pathconf_case_preserving = -1; static gint ett_nfs = -1; @@ -96,6 +111,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; +static gint ett_nfs_fsinfo_properties = -1; /***************************/ @@ -842,7 +858,7 @@ dissect_nfs2_statfs_reply(const u_char* pd, int offset, frame_data* fd, proto_tr offset = dissect_stat(pd, offset, fd, tree, "status", &status); switch (status) { case 0: - if (!BYTES_ARE_IN_FRAME(offset,20)) return offset; + if (!BYTES_ARE_IN_FRAME(offset,5 * 4)) return offset; tsize = EXTRACT_UINT(pd, offset+ 0); bsize = EXTRACT_UINT(pd, offset+ 4); blocks = EXTRACT_UINT(pd, offset+ 8); @@ -2284,7 +2300,222 @@ dissect_nfs3_link_reply(const u_char* pd, int offset, frame_data* fd, proto_tree } -/* 14 missing functions */ +/* RFC 1813, Page 84..86 */ +int +dissect_nfs3_fsstat_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree) +{ + guint32 status; + guint32 invarsec; + + 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_size3 (pd, offset, fd, tree, "tbytes"); + offset = dissect_size3 (pd, offset, fd, tree, "fbytes"); + offset = dissect_size3 (pd, offset, fd, tree, "abytes"); + offset = dissect_size3 (pd, offset, fd, tree, "tfiles"); + offset = dissect_size3 (pd, offset, fd, tree, "ffiles"); + offset = dissect_size3 (pd, offset, fd, tree, "afiles"); + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + invarsec = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsstat_invarsec, + offset+0, 4, invarsec); + offset += 4; + break; + default: + offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes"); + break; + } + + return offset; +} + + +#define FSF3_LINK 0x0001 +#define FSF3_SYMLINK 0x0002 +#define FSF3_HOMOGENEOUS 0x0008 +#define FSF3_CANSETTIME 0x0010 + + +/* RFC 1813, Page 86..90 */ +int +dissect_nfs3_fsinfo_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree) +{ + guint32 status; + guint32 rtmax; + guint32 rtpref; + guint32 rtmult; + guint32 wtmax; + guint32 wtpref; + guint32 wtmult; + guint32 dtpref; + guint32 properties; + proto_item* properties_item = NULL; + proto_tree* properties_tree = NULL; + + offset = dissect_nfsstat3(pd, offset, fd, tree, "status", &status); + switch (status) { + case 0: + offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes"); + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + rtmax = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_rtmax, + offset+0, 4, rtmax); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + rtpref = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_rtpref, + offset+0, 4, rtpref); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + rtmult = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_rtmult, + offset+0, 4, rtmult); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + wtmax = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_wtmax, + offset+0, 4, wtmax); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + wtpref = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_wtpref, + offset+0, 4, wtpref); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + wtmult = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_wtmult, + offset+0, 4, wtmult); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + dtpref = EXTRACT_UINT(pd, offset+0); + if (tree) + proto_tree_add_item(tree, hf_nfs_fsinfo_dtpref, + offset+0, 4, dtpref); + offset += 4; + + offset = dissect_size3 (pd, offset, fd, tree, "maxfilesize"); + offset = dissect_nfstime3(pd, offset, fd, tree, "time_delta"); + if (!BYTES_ARE_IN_FRAME(offset,4)) return offset; + properties = EXTRACT_UINT(pd, offset+0); + if (tree) { + properties_item = proto_tree_add_item(tree, + hf_nfs_fsinfo_properties, + offset+0, 4, properties); + if (properties_item) + properties_tree = proto_item_add_subtree(properties_item, ett_nfs_fsinfo_properties); + if (properties_tree) { + proto_tree_add_text(properties_tree, + offset, 4, "%s", + decode_boolean_bitfield(properties, + FSF3_CANSETTIME,5, + "SETATTR can set time on server", + "SETATTR can't set time on server")); + + proto_tree_add_text(properties_tree, + offset, 4, "%s", + decode_boolean_bitfield(properties, + FSF3_HOMOGENEOUS,5, + "PATHCONF is valid for all files", + "PATHCONF should be get for every single file")); + + proto_tree_add_text(properties_tree, + offset, 4, "%s", + decode_boolean_bitfield(properties, + FSF3_SYMLINK,5, + "File System supports symbolic links", + "File System does not symbolic hard links")); + + proto_tree_add_text(properties_tree, + offset, 4, "%s", + decode_boolean_bitfield(properties, + FSF3_LINK,5, + "File System supports hard links", + "File System does not support hard links")); + } + } + offset += 4; + break; + default: + offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes"); + break; + } + + return offset; +} + + +/* RFC 1813, Page 90..92 */ +int +dissect_nfs3_pathconf_reply(const u_char* pd, int offset, frame_data* fd, proto_tree* tree) +{ + guint32 status; + guint32 linkmax; + guint32 name_max; + guint32 no_trunc; + guint32 chown_restricted; + guint32 case_insensitive; + guint32 case_preserving; + + offset = dissect_nfsstat3(pd, offset, fd, tree, "status", &status); + switch (status) { + case 0: + offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes"); + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + linkmax = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_pathconf_linkmax, + offset+0, 4, linkmax); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + name_max = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_pathconf_name_max, + offset+0, 4, name_max); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + no_trunc = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_pathconf_no_trunc, + offset+0, 4, no_trunc); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + chown_restricted = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_pathconf_chown_restricted, + offset+0, 4, chown_restricted); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + case_insensitive = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_pathconf_case_insensitive, + offset+0, 4, case_insensitive); + offset += 4; + if (!BYTES_ARE_IN_FRAME(offset, 4)) return offset; + case_preserving = EXTRACT_UINT(pd, offset + 0); + if (tree) + proto_tree_add_item(tree, hf_nfs_pathconf_case_preserving, + offset+0, 4, case_preserving); + offset += 4; + break; + default: + offset = dissect_post_op_attr(pd, offset, fd, tree, "obj_attributes"); + break; + } + + return offset; +} + + +/* 11 missing functions */ /* proc number, "proc name", dissect_request, dissect_reply */ @@ -2326,12 +2557,12 @@ const vsff nfs3_proc[] = { dissect_nfs3_nfs_fh3_call, dissect_nfs3_any_reply }, { 17, "READDIRPLUS", /* todo: call, reply */ dissect_nfs3_nfs_fh3_call, dissect_nfs3_any_reply }, - { 18, "FSSTAT", /* todo: reply */ - dissect_nfs3_nfs_fh3_call, dissect_nfs3_any_reply }, - { 19, "FSINFO", /* todo: reply */ - dissect_nfs3_nfs_fh3_call, dissect_nfs3_any_reply }, - { 20, "PATHCONF", /* todo: reply */ - dissect_nfs3_nfs_fh3_call, dissect_nfs3_any_reply }, + { 18, "FSSTAT", /* OK */ + dissect_nfs3_nfs_fh3_call, dissect_nfs3_fsstat_reply }, + { 19, "FSINFO", /* OK */ + dissect_nfs3_nfs_fh3_call, dissect_nfs3_fsinfo_reply }, + { 20, "PATHCONF", /* OK */ + dissect_nfs3_nfs_fh3_call, dissect_nfs3_pathconf_reply }, { 21, "COMMIT", /* todo: call, reply */ dissect_nfs3_nfs_fh3_call, dissect_nfs3_any_reply }, { 0,NULL,NULL,NULL } @@ -2417,7 +2648,52 @@ proto_register_nfs(void) NULL, 0, "Available Blocks" }}, { &hf_nfs_createmode3, { "Create Mode", "nfs.createmode", FT_UINT32, BASE_DEC, - VALS(text_createmode3), 0, "Create Mode" }} + VALS(text_createmode3), 0, "Create Mode" }}, + { &hf_nfs_fsstat_invarsec, { + "invarsec", "nfs.fsstat.invarsec", FT_UINT32, BASE_DEC, + NULL, 0, "probable number of seconds of file system invariance" }}, + { &hf_nfs_fsinfo_rtmax, { + "rtmax", "nfs.fsinfo.rtmax", FT_UINT32, BASE_DEC, + NULL, 0, "maximum READ request" }}, + { &hf_nfs_fsinfo_rtpref, { + "rtpref", "nfs.fsinfo.rtpref", FT_UINT32, BASE_DEC, + NULL, 0, "preferred READ request" }}, + { &hf_nfs_fsinfo_rtmult, { + "rtmult", "nfs.fsinfo.rtmult", FT_UINT32, BASE_DEC, + NULL, 0, "suggested READ multiple" }}, + { &hf_nfs_fsinfo_wtmax, { + "wtmax", "nfs.fsinfo.rtmax", FT_UINT32, BASE_DEC, + NULL, 0, "maximum WRITE request" }}, + { &hf_nfs_fsinfo_wtpref, { + "wtpref", "nfs.fsinfo.rtpref", FT_UINT32, BASE_DEC, + NULL, 0, "preferred WRITE request" }}, + { &hf_nfs_fsinfo_wtmult, { + "wtmult", "nfs.fsinfo.rtmult", FT_UINT32, BASE_DEC, + NULL, 0, "suggested WRITE multiple" }}, + { &hf_nfs_fsinfo_dtpref, { + "dtpref", "nfs.fsinfo.dtpref", FT_UINT32, BASE_DEC, + NULL, 0, "preferred READDIR request" }}, + { &hf_nfs_fsinfo_properties, { + "Properties", "nfs.fsinfo.propeties", FT_UINT32, BASE_HEX, + NULL, 0, "File System Properties" }}, + { &hf_nfs_pathconf_linkmax, { + "linkmax", "nfs.pathconf.linkmax", FT_UINT32, BASE_DEC, + NULL, 0, "Maximum number of hard links" }}, + { &hf_nfs_pathconf_name_max, { + "name_max", "nfs.pathconf.name_max", FT_UINT32, BASE_DEC, + NULL, 0, "Maximum file name length" }}, + { &hf_nfs_pathconf_no_trunc, { + "no_trunc", "nfs.pathconf.no_trunc", FT_BOOLEAN, BASE_NONE, + &yesno, 0, "No long file name truncation" }}, + { &hf_nfs_pathconf_chown_restricted, { + "chown_restricted", "nfs.pathconf.chown_restricted", FT_BOOLEAN, BASE_NONE, + &yesno, 0, "chown is restricted to root" }}, + { &hf_nfs_pathconf_case_insensitive, { + "case_insensitive", "nfs.pathconf.case_insensitive", FT_BOOLEAN, BASE_NONE, + &yesno, 0, "file names are treated case insensitive" }}, + { &hf_nfs_pathconf_case_preserving, { + "case_preserving", "nfs.pathconf.case_preserving", FT_BOOLEAN, BASE_NONE, + &yesno, 0, "file name cases are preserved" }} }; static gint *ett[] = { @@ -2448,7 +2724,8 @@ proto_register_nfs(void) &ett_nfs_post_op_attr, &ett_nfs_wcc_attr, &ett_nfs_wcc_data, - &ett_nfs_access + &ett_nfs_access, + &ett_nfs_fsinfo_properties }; proto_nfs = proto_register_protocol("Network File System", "nfs"); proto_register_field_array(proto_nfs, hf, array_length(hf)); |