summaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-fmp.c
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-10 20:34:10 +0000
commite4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc (patch)
tree68cb5ef9081156392f1dd62a00c6ccc1451b93df /epan/dissectors/packet-fmp.c
parentInitial commit. (diff)
downloadwireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.tar.xz
wireshark-e4ba6dbc3f1e76890b22773807ea37fe8fa2b1bc.zip
Adding upstream version 4.2.2.upstream/4.2.2
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'epan/dissectors/packet-fmp.c')
-rw-r--r--epan/dissectors/packet-fmp.c2307
1 files changed, 2307 insertions, 0 deletions
diff --git a/epan/dissectors/packet-fmp.c b/epan/dissectors/packet-fmp.c
new file mode 100644
index 00000000..0c4348c4
--- /dev/null
+++ b/epan/dissectors/packet-fmp.c
@@ -0,0 +1,2307 @@
+/* packet-fmp.c
+ * Routines for fmp dissection
+ *
+ * Wireshark - Network traffic analyzer
+ * By Gerald Combs <gerald@wireshark.org>
+ * Copyright 1998 Gerald Combs
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+#include "config.h"
+
+#include <epan/packet.h>
+#include <epan/prefs.h>
+#include "packet-fmp.h"
+#include "packet-rpc.h"
+
+void proto_register_fmp(void);
+void proto_reg_handoff_fmp(void);
+
+static int hf_fmp_procedure = -1;
+static int hf_fmp_fsID = -1;
+static int hf_fmp_fsBlkSz = -1;
+static int hf_fmp_sessionHandle = -1;
+static int hf_fmp_fmpFHandle = -1;
+static int hf_fmp_msgNum = -1;
+static int hf_fmp_fileSize = -1;
+static int hf_fmp_cookie = -1;
+static int hf_fmp_firstLogBlk = -1;
+static int hf_fmp_numBlksReq = -1;
+
+static int proto_fmp = -1;
+static int hf_fmp_hostID = -1;
+static int hf_fmp_status = -1;
+static int hf_fmp_btime = -1;
+static int hf_fmp_time_sec = -1;
+static int hf_fmp_time_nsec = -1;
+static int hf_fmp_notifyPort = -1;
+static int hf_fmp_minBlks = -1;
+static int hf_fmp_eof = -1;
+static int hf_fmp_path = -1;
+static int hf_fmp_plugInID = -1;
+static int hf_fmp_plugInBuf = -1;
+static int hf_fmp_nfsFHandle = -1;
+static int hf_fmp_extentList_len = -1;
+static int hf_fmp_extent_state = -1;
+static int hf_fmp_numBlks = -1;
+static int hf_fmp_volID = -1;
+static int hf_fmp_startOffset = -1;
+static int hf_fmp_volHandle = -1;
+static int hf_fmp_devSignature = -1;
+static int hf_fmp_dskSigEnt_val = -1;
+static int hf_fmp_mount_path = -1;
+static int hf_fmp_sig_offset = -1;
+static int hf_fmp_os_major = -1;
+static int hf_fmp_os_minor = -1;
+static int hf_fmp_os_name = -1;
+static int hf_fmp_os_patch = -1;
+static int hf_fmp_os_build = -1;
+static int hf_fmp_server_version_string = -1;
+static int hf_fmp_description = -1;
+static int hf_fmp_nfsv3Attr_type = -1;
+static int hf_fmp_nfsv3Attr_mode = -1;
+static int hf_fmp_nfsv3Attr_nlink = -1;
+static int hf_fmp_nfsv3Attr_uid = -1;
+static int hf_fmp_nfsv3Attr_gid = -1;
+static int hf_fmp_nfsv3Attr_used = -1;
+static int hf_fmp_nfsv3Attr_rdev = -1;
+static int hf_fmp_nfsv3Attr_fsid = -1;
+static int hf_fmp_nfsv3Attr_fileid = -1;
+static int hf_fmp_cmd = -1;
+static int hf_fmp_topVolumeId = -1;
+static int hf_fmp_cursor = -1;
+static int hf_fmp_offset64 = -1;
+static int hf_fmp_start_offset64 = -1;
+static int hf_fmp_slice_size = -1;
+static int hf_fmp_volume = -1;
+static int hf_fmp_stripeSize = -1;
+static int hf_fmp_firstLogBlk64 =-1;
+static int hf_fmp_native_protocol = -1;
+static int hf_fmp_encoding_mode = -1;
+static int hf_fmp_capability = -1;
+static int hf_fmp_devSerial_query_cmd = -1;
+static int hf_fmp_volume_desc = -1;
+static int hf_fmp_disk_identifier = -1;
+static int hf_fmp_volume_mgmt_type = -1;
+static int hf_fmp_notify_protocol = -1;
+static int hf_fmp_client_error_number = -1;
+/* Generated from convert_proto_tree_add_text.pl */
+static int hf_fmp_cap = -1;
+static int hf_fmp_cap_revoke_handle_list = -1;
+static int hf_fmp_length_of_volume_list = -1;
+static int hf_fmp_cap_unc_names = -1;
+static int hf_fmp_length_of_list = -1;
+static int hf_fmp_sigoffset = -1;
+static int hf_fmp_uid = -1;
+static int hf_fmp_fid = -1;
+static int hf_fmp_fsid = -1;
+static int hf_fmp_tid = -1;
+static int hf_fmp_cifsport = -1;
+static int hf_fmp_blockindex = -1;
+static int hf_fmp_number_of_disk = -1;
+static int hf_fmp_cap_cifsv2 = -1;
+static int hf_fmp_mtime = -1;
+static int hf_fmp_atime = -1;
+static int hf_fmp_ctime = -1;
+static int hf_fmp_heartbeat_interval = -1;
+static int hf_fmp_volindex = -1;
+
+static gint ett_fmp = -1;
+static gint ett_fmp_timeval = -1;
+static gint ett_fmp_extList = -1;
+static gint ett_fmp_ext = -1;
+static gint ett_fmp_fileHandle = -1;
+static gint ett_capabilities = -1;
+static gint ett_HierVolumeDescription = -1;
+static gint ett_attrs = -1;
+
+static const value_string fmp_encoding_mode_vals[] = {
+ {FMP_ASCII, "ASCII"},
+ {FMP_UTF8, "UTF8"},
+ {FMP_UNICODE1, "UNICODE"},
+ {0,NULL}
+};
+
+static gboolean fmp_fhandle_reqrep_matching = FALSE;
+
+static int
+dissect_fmp_genString(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_fmp_encoding_mode, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ if (try_val_to_str(tvb_get_ntohl(tvb, offset), fmp_encoding_mode_vals) == NULL)
+ return offset;
+
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_path,
+ offset, NULL);
+
+ return offset;
+}
+
+static int
+get_fileHandleSrc_size(tvbuff_t *tvb, int offset)
+{
+ int length;
+ nativeProtocol np;
+
+ np = (nativeProtocol)tvb_get_ntohl(tvb, offset);
+
+ switch (np) {
+ case FMP_PATH:
+ length = 4 + FMP_MAX_PATH_LEN;
+ break;
+ case FMP_NFS:
+ length = 8 + tvb_get_ntohl(tvb, offset + 4);
+ break;
+ case FMP_CIFS:
+ length = 10;
+ break;
+ case FMP_FMP:
+ length = 8 + tvb_get_ntohl(tvb, offset + 4);
+ break;
+ case FMP_FS_ONLY:
+ length = 8;
+ break;
+ case FMP_SHARE:
+ /* FALLTHROUGH */
+ case FMP_MOUNT:
+ length = 8 + FMP_MAX_PATH_LEN;
+ break;
+ default:
+ length = 4;
+ break;
+ }
+
+ return length;
+}
+
+static int
+dissect_fmp_fileHandleSrc(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+ proto_tree *tree)
+{
+ nativeProtocol np;
+
+ proto_tree *fileHandleTree;
+ int length;
+
+ length = get_fileHandleSrc_size(tvb, offset);
+
+ fileHandleTree = proto_tree_add_subtree(tree, tvb, offset, length,
+ ett_fmp_fileHandle, NULL, "Source File Handle");
+
+ np = (nativeProtocol)tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(fileHandleTree, hf_fmp_native_protocol, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ switch (np) {
+ case FMP_PATH:
+ offset = dissect_rpc_string(tvb, fileHandleTree,
+ hf_fmp_mount_path, offset, NULL);
+ break;
+
+ case FMP_NFS:
+ offset = dissect_rpc_data(tvb, fileHandleTree,
+ hf_fmp_nfsFHandle, offset);
+ break;
+
+ case FMP_CIFS:
+ proto_tree_add_item(fileHandleTree, hf_fmp_fid, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(fileHandleTree, hf_fmp_tid, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(fileHandleTree, hf_fmp_uid, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ break;
+
+ case FMP_FMP:
+ offset = dissect_rpc_string(tvb, fileHandleTree,
+ hf_fmp_fmpFHandle, offset, NULL);
+ break;
+
+ case FMP_FS_ONLY:
+ proto_tree_add_item(fileHandleTree, hf_fmp_fsid, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ break;
+
+ case FMP_SHARE:
+ offset = dissect_fmp_genString(tvb, offset, fileHandleTree);
+ break;
+
+ case FMP_MOUNT:
+ offset = dissect_fmp_genString(tvb, offset, fileHandleTree);
+ break;
+
+ case FMP_CIFSV2:
+ proto_tree_add_item(fileHandleTree, hf_fmp_fid, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(fileHandleTree, hf_fmp_tid, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(fileHandleTree, hf_fmp_uid, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+
+ proto_tree_add_item(fileHandleTree, hf_fmp_cifsport, tvb, offset, 2, ENC_BIG_ENDIAN);
+ offset += 2;
+ break;
+ case FMP_UNC:
+ offset = dissect_fmp_genString(tvb, offset, fileHandleTree);
+ break;
+
+ default:
+ break;
+ }
+
+ return offset;
+}
+
+static int
+dissect_fmp_extentState(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_extent_state,
+ offset);
+
+ return offset;
+}
+
+static int
+dissect_fmp_extent(tvbuff_t *tvb, int offset, packet_info *pinfo _U_, proto_tree *tree, guint32 ext_num)
+{
+ proto_tree *extTree;
+
+ extTree = proto_tree_add_subtree_format(tree, tvb, offset, 20 ,
+ ett_fmp_ext, NULL, "Extent (%u)", (guint32) ext_num);
+
+ offset = dissect_rpc_uint32(tvb, extTree, hf_fmp_firstLogBlk,
+ offset);
+ offset = dissect_rpc_uint32(tvb, extTree, hf_fmp_numBlks,
+ offset);
+ offset = dissect_rpc_uint32(tvb, extTree, hf_fmp_volID, offset);
+ offset = dissect_rpc_uint32(tvb, extTree, hf_fmp_startOffset,
+ offset);
+ offset = dissect_fmp_extentState(tvb, offset, extTree);
+
+ return offset;
+}
+
+static int
+dissect_fmp_extentList(tvbuff_t *tvb, int offset, packet_info *pinfo,
+ proto_tree *tree)
+{
+ guint32 numExtents;
+ guint32 totalLength;
+ proto_tree *extListTree;
+ guint32 i;
+
+ numExtents = tvb_get_ntohl(tvb, offset);
+ totalLength = 4 + (20 * numExtents);
+
+ extListTree = proto_tree_add_subtree(tree, tvb, offset, totalLength,
+ ett_fmp_extList, NULL, "Extent List");
+
+ offset = dissect_rpc_uint32(tvb, extListTree,
+ hf_fmp_extentList_len, offset);
+
+ for (i = 0; i < numExtents; i++) {
+ offset = dissect_fmp_extent(tvb, offset, pinfo, extListTree, i+1);
+ }
+
+ return offset;
+}
+
+
+static int
+dissect_fmp_extentListEx(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+ proto_tree *tree)
+{
+ guint32 numExtents;
+ proto_tree *extListTree;
+ guint32 i;
+
+ numExtents = tvb_get_ntohl(tvb, offset);
+
+ offset += 4;
+
+ for (i = 0; i < numExtents; i++) {
+ extListTree = proto_tree_add_subtree(tree, tvb, offset, 28,
+ ett_fmp_extList, NULL, "Extent List");
+
+ offset = dissect_rpc_uint64(tvb,extListTree , hf_fmp_firstLogBlk64, offset);
+
+ offset = dissect_rpc_uint32(tvb,extListTree , hf_fmp_numBlksReq,
+ offset);
+
+ offset = dissect_rpc_uint32(tvb,extListTree , hf_fmp_volID, offset);
+
+ offset = dissect_rpc_uint64(tvb,extListTree , hf_fmp_start_offset64, offset);
+
+ offset = dissect_fmp_extentState(tvb, offset, extListTree);
+
+ }
+
+ return offset;
+}
+
+
+static int
+dissect_plugInID(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ if (!tree) {
+ return offset;
+ }
+
+ proto_tree_add_item(tree, hf_fmp_plugInID, tvb, offset, FMP_PLUG_IN_ID_SZ,
+ ENC_NA);
+ return offset;
+}
+
+static int
+dissect_fmp_flushCmd(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ guint32 cmd;
+ char msg[MAX_MSG_SIZE];
+ guint32 bitValue;
+ int i;
+
+ if (tree) {
+ cmd = tvb_get_ntohl(tvb, offset);
+
+ /* Initialize the message for an empty string */
+ msg[0] = '\0';
+
+ for (i = 0; cmd != 0 && i < 32; i++) {
+
+ bitValue = 1U << i;
+
+ if (cmd & bitValue) {
+ switch (bitValue) {
+ case FMP_COMMIT_SPECIFIED:
+ (void) g_strlcat(msg, "COMMIT_SPECIFIED", MAX_MSG_SIZE);
+ break;
+ case FMP_RELEASE_SPECIFIED:
+ (void) g_strlcat(msg, "RELEASE_SPECIFIED", MAX_MSG_SIZE);
+ break;
+ case FMP_RELEASE_ALL:
+ (void) g_strlcat(msg, "RELEASE_ALL", MAX_MSG_SIZE);
+ break;
+ case FMP_CLOSE_FILE:
+ (void) g_strlcat(msg, "CLOSE_FILE", MAX_MSG_SIZE);
+ break;
+ case FMP_UPDATE_TIME:
+ (void) g_strlcat(msg, "UPDATE_TIME", MAX_MSG_SIZE);
+ break;
+ case FMP_ACCESS_TIME:
+ (void) g_strlcat(msg, "ACCESS_TIME", MAX_MSG_SIZE);
+ break;
+ default:
+ (void) g_strlcat(msg, "UNKNOWN", MAX_MSG_SIZE);
+ break;
+ }
+
+ /* clear the bit that we processed */
+ cmd &= ~bitValue;
+
+ /* add a "bitwise inclusive OR" symbol between cmds */
+ if (cmd) {
+ (void) g_strlcat(msg, " | ", MAX_MSG_SIZE);
+ }
+ }
+ }
+
+ if (strlen(msg) == 0) {
+ (void) g_strlcpy(msg, "No command specified", MAX_MSG_SIZE);
+ }
+
+ proto_tree_add_uint_format_value(tree, hf_fmp_cmd, tvb, offset, 4, cmd, "%s", msg);
+ }
+ offset += 4;
+ return offset;
+}
+
+static int
+dissect_InterpretVolMgtStuff(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ int length, numdisks, i, j;
+
+ numdisks = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(tree, hf_fmp_number_of_disk, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ for (i=0; i<numdisks; i++) {
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_sig_offset, offset);
+ length = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(tree, hf_fmp_length_of_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ for (j=0; j<length; j++) {
+ proto_tree_add_item(tree, hf_fmp_sigoffset, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_dskSigEnt_val,
+ offset, NULL);
+
+ }
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_volID, offset);
+
+ }
+ return offset;
+
+
+}
+
+static int
+dissect_fmp_capability(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_fmp_capability, tvb, offset, 4, ENC_BIG_ENDIAN);
+ return offset+4;
+}
+
+static int
+dissect_fmp_timeval(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+ proto_tree *tree, int hf_time, int hf_time_sec,
+ int hf_time_nsec)
+{
+ if (tree) {
+ nstime_t ts;
+
+ proto_item* time_item;
+ proto_tree* time_tree;
+
+ ts.secs = tvb_get_ntohl(tvb, offset+0);
+ ts.nsecs = tvb_get_ntohl(tvb, offset+4);
+
+ time_item = proto_tree_add_time(tree, hf_time, tvb, offset, 8, &ts);
+ time_tree = proto_item_add_subtree(time_item, ett_fmp_timeval);
+
+ proto_tree_add_uint(time_tree, hf_time_sec, tvb, offset, 4,
+ (guint32) ts.secs);
+ proto_tree_add_uint(time_tree, hf_time_nsec, tvb, offset+4, 4,
+ ts.nsecs);
+ }
+ offset += 8;
+ return offset;
+}
+
+static int
+dissect_fmp_heartBeatIntv(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+ proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_fmp_heartbeat_interval, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset += 8;
+ return offset;
+}
+
+static int
+dissect_fmp_status(tvbuff_t *tvb, int offset, proto_tree *tree, int *rval)
+{
+ fmpStat status;
+
+ status = (fmpStat)tvb_get_ntohl(tvb, offset);
+
+ switch (status) {
+ case FMP_OK:
+ *rval = 0;
+ break;
+ case FMP_IOERROR:
+ *rval = 1;
+ break;
+ case FMP_NOMEM:
+ *rval = 1;
+ break;
+ case FMP_NOACCESS:
+ *rval = 1;
+ break;
+ case FMP_INVALIDARG:
+
+ *rval = 1;
+ break;
+ case FMP_FSFULL:
+ *rval = 0;
+ break;
+ case FMP_QUEUE_FULL:
+ case FMP_NOTIFY_ERROR:
+ case FMP_WRITER_LOST_BLK:
+ case FMP_WRONG_MSG_NUM:
+ case FMP_SESSION_LOST:
+ case FMP_REQUEST_CANCELLED:
+ *rval = 1;
+ break;
+ case FMP_HOT_SESSION:
+ *rval = 0;
+ break;
+ case FMP_COLD_SESSION:
+ *rval = 0;
+ break;
+ case FMP_CLIENT_TERMINATED:
+ *rval = 0;
+ break;
+ case FMP_REQUEST_QUEUED:
+ *rval = 0;
+ break;
+ case FMP_FALL_BACK:
+ *rval = 0;
+ break;
+ case FMP_WRITER_ZEROED_BLK:
+ *rval = 0;
+ break;
+ case FMP_WRONG_HANDLE:
+ *rval = 0;
+ break;
+ case FMP_DUPLICATE_OPEN:
+ *rval = 1;
+ break;
+ case FMP_PLUGIN_NOFUNC:
+ *rval = 1;
+ break;
+ default:
+ *rval = 1;
+ break;
+ }
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_status , offset);
+ return offset;
+}
+
+static int
+dissect_fmp_devSerial(tvbuff_t *tvb, int offset, packet_info *pinfo _U_,
+ proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_fmp_devSerial_query_cmd, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(tree, hf_fmp_sigoffset, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_devSignature,
+ offset, NULL);
+ return offset;
+}
+
+static int
+dissect_fmp_VolumeDescription(tvbuff_t *tvb, int offset, proto_tree * tree)
+{
+ int i,length;
+ proto_tree *Hietree;
+ proto_item *ti;
+ fmpVolumeType volumeType;
+ fmpDiskIdentifierType diskIdentifierType;
+
+ volumeType = (fmpVolumeType)tvb_get_ntohl(tvb, offset);
+ ti = proto_tree_add_item(tree, hf_fmp_volume_desc, tvb, offset, 4, ENC_BIG_ENDIAN);
+ Hietree = proto_item_add_subtree(ti, ett_HierVolumeDescription);
+ offset += 4;
+
+ switch (volumeType) {
+
+ case FMP_VOLUME_DISK:
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volID, offset);
+ offset += 8; /* blockIndex64 */
+ diskIdentifierType = (fmpDiskIdentifierType)tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(Hietree, hf_fmp_disk_identifier, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ switch (diskIdentifierType) {
+ case FMP_DISK_IDENTIFIER_SIGNATURE:
+ offset = dissect_rpc_uint64(tvb, Hietree, hf_fmp_sig_offset, offset);
+ length = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(Hietree, hf_fmp_length_of_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ for (i=0; i<length; i++) {
+ proto_tree_add_item(Hietree, hf_fmp_sigoffset, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ offset = dissect_rpc_string(tvb, Hietree, hf_fmp_dskSigEnt_val, offset, NULL);
+
+
+ }
+ break;
+
+ case FMP_DISK_IDENTIFIER_SERIAL:
+ dissect_fmp_devSerial(tvb, offset, NULL, Hietree);
+ break;
+ }
+
+ break;
+ case FMP_VOLUME_SLICE:
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volID, offset);
+
+ offset = dissect_rpc_uint64(tvb, Hietree, hf_fmp_offset64, offset);
+
+ offset = dissect_rpc_uint64(tvb, Hietree, hf_fmp_slice_size, offset);
+
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volume, offset);
+
+ break;
+
+ case FMP_VOLUME_STRIPE:
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volID, offset);
+
+ offset = dissect_rpc_uint64(tvb, Hietree, hf_fmp_stripeSize, offset);
+ length = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(Hietree, hf_fmp_length_of_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ for (i=0; i<length; i++) {
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volume, offset); /* FIXME: Size or length not know */
+
+ }
+ break;
+
+ case FMP_VOLUME_META:
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volID, offset);
+
+ length = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(Hietree, hf_fmp_length_of_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ for (i=0; i<length; i++) {
+ offset = dissect_rpc_uint32(tvb, Hietree, hf_fmp_volume, offset); /* FIXME: Size or length not know */
+ }
+ break;
+ default:
+ break;
+ }
+ return offset;
+}
+
+
+static int
+dissect_fmp_Hiervolume(tvbuff_t *tvb, int offset, proto_tree * tree)
+{
+
+ int vollength;
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_topVolumeId, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cursor, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie, offset);
+
+ /* hierarchical description of volume. Each volume describes a
+ piece of the entire hierarchy and is guarenteed to only refer to
+ volumes that have already been described by the data structure up
+ to this point in time. In some extreme cases, the number of
+ volumes and their descriptions may be to large to fit in a single
+ RPC reply. In this case, the application may send getVolumeInfo
+ requests for the specific topVolumeId -- specifying the number of
+ volumes already received by the client, and the cookie. The
+ server is then responsible for sending another message containing
+ additional volumes. These RPCs exchanges may continue multiple
+ times, until the client has fetched the entire hierarchical
+ volume description. If the volume hierarchy changes duing a
+ multiple RPC sequence, the server will return an
+ FMP_VOLUME_CHANGED error, and the client must discard all
+ information already received and restart the request with
+ FMP_Mount.
+ */
+
+ vollength = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(tree, hf_fmp_length_of_volume_list, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ while (vollength) {
+ offset = dissect_fmp_VolumeDescription(tvb, offset, tree);
+ vollength--;
+ }
+
+ return offset;
+
+}
+
+
+
+static int
+dissect_fmp_vmInfo(tvbuff_t *tvb, int offset, packet_info *pinfo,
+ proto_tree *tree)
+{
+ int vmType;
+ guint32 phyVolList_len;
+
+ vmType = tvb_get_ntohl(tvb, offset);
+ proto_tree_add_item(tree, hf_fmp_volume_mgmt_type, tvb, offset, 4, ENC_BIG_ENDIAN);
+
+ switch (vmType) {
+ case FMP_SERVER_BASED:
+ /*
+ * Need to finish
+ */
+ phyVolList_len = tvb_get_ntohl(tvb, offset);
+ offset += 4;
+
+ /*
+ * Loop through and print all of the devInfo
+ * structures.
+ */
+ while (phyVolList_len) {
+ offset = dissect_fmp_devSerial(tvb, offset, pinfo, tree);
+ proto_tree_add_item(tree, hf_fmp_volindex, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ phyVolList_len--;
+ }
+ break;
+
+ case FMP_THIRD_PARTY:
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_volHandle,
+ offset, NULL);
+ break;
+
+ case FMP_CLIENT_BASED_DART:
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_volHandle,
+ offset, NULL);
+ break;
+
+ case FMP_CLIENT_BASED_SIMPLE:
+ /*
+ * Decoding simpleVolInfo
+ */
+ offset = dissect_fmp_devSerial(tvb, offset, pinfo, tree);
+
+ proto_tree_add_item(tree, hf_fmp_blockindex, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+ break;
+
+ case FMP_DISK_SIGNATURE:
+ offset = dissect_InterpretVolMgtStuff(tvb, offset, tree);
+ break;
+
+ case FMP_HIERARCHICAL_VOLUME:
+ dissect_fmp_Hiervolume(tvb, offset, tree);
+ break;
+
+ default:
+ break;
+ }
+
+ return offset;
+}
+
+static int
+dissect_fmp_notifyProtocol(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ proto_tree_add_item(tree, hf_fmp_notify_protocol, tvb, offset, 4, ENC_BIG_ENDIAN);
+ return (offset+4);
+}
+
+
+static int
+dissect_fmp_capabilities(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ static int * const capabilities[] = {
+ &hf_fmp_cap_revoke_handle_list,
+ &hf_fmp_cap_unc_names,
+ &hf_fmp_cap_cifsv2,
+ NULL
+ };
+
+ proto_tree_add_bitmask_with_flags(tree, tvb, offset, hf_fmp_cap, ett_capabilities,
+ capabilities, ENC_BIG_ENDIAN, BMT_NO_APPEND);
+ return (offset+4);
+}
+
+static int
+dissect_fmp_cerrInfo(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ int rval;
+
+ proto_tree_add_item(tree, hf_fmp_client_error_number, tvb, offset, 4, ENC_BIG_ENDIAN);
+ offset += 4;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+
+ return offset;
+}
+
+static int
+dissect_fmp_attrs(tvbuff_t *tvb, int offset, proto_tree *tree)
+{
+ proto_tree *attrsTree;
+
+ attrsTree = proto_tree_add_subtree(tree, tvb, offset, 84,
+ ett_attrs, NULL, "Attribute: ");
+ offset = dissect_rpc_uint32(tvb, attrsTree, hf_fmp_nfsv3Attr_type, offset);
+ offset = dissect_rpc_uint32(tvb, attrsTree, hf_fmp_nfsv3Attr_mode, offset);
+ offset = dissect_rpc_uint32(tvb, attrsTree, hf_fmp_nfsv3Attr_nlink, offset);
+ offset = dissect_rpc_uint32(tvb, attrsTree, hf_fmp_nfsv3Attr_uid, offset);
+ offset = dissect_rpc_uint32(tvb, attrsTree, hf_fmp_nfsv3Attr_gid, offset);
+ offset = dissect_rpc_uint64(tvb, attrsTree, hf_fmp_fileSize, offset);
+ /* Here hf_fmp_fileSize is used in
+ * place of size
+ */
+ offset = dissect_rpc_uint64(tvb, attrsTree, hf_fmp_nfsv3Attr_used, offset);
+ offset = dissect_rpc_uint64(tvb, attrsTree, hf_fmp_nfsv3Attr_rdev, offset);
+ offset = dissect_rpc_uint64(tvb, attrsTree, hf_fmp_nfsv3Attr_fsid, offset);
+ offset = dissect_rpc_uint64(tvb, attrsTree, hf_fmp_nfsv3Attr_fileid, offset);
+ proto_tree_add_item(tree, hf_fmp_atime, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset +=8;
+ proto_tree_add_item(tree, hf_fmp_mtime, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset +=8;
+ proto_tree_add_item(tree, hf_fmp_ctime, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset +=8;
+ return offset;
+}
+
+
+
+static int
+dissect_FMP_SessionCreate_request(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_hostID,
+ offset, NULL);
+ offset = dissect_fmp_timeval(tvb, offset, pinfo, tree, hf_fmp_btime,
+ hf_fmp_time_sec, hf_fmp_time_nsec);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_notifyPort,
+ offset);
+ return offset;
+}
+
+static int
+dissect_FMP_SessionCreate_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree,
+ hf_fmp_sessionHandle, offset);
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_hostID,
+ offset, NULL);
+ offset = dissect_fmp_timeval(tvb, offset, pinfo, tree,
+ hf_fmp_btime, hf_fmp_time_sec,
+ hf_fmp_time_nsec);
+ offset = dissect_fmp_heartBeatIntv(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_HeartBeat_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ return dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle, 0);
+}
+
+static int
+dissect_FMP_HeartBeat_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+
+ return dissect_fmp_status(tvb, 0, tree, &rval);
+}
+
+static int
+dissect_FMP_Mount_request(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle,
+ offset);
+ offset = dissect_fmp_capability(tvb, offset, tree);
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ return offset;
+}
+
+static int
+dissect_FMP_Mount_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsBlkSz,
+ offset);
+ offset = dissect_fmp_vmInfo(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_Open_request(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle,
+ offset);
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ return offset;
+}
+
+static int
+dissect_FMP_Open_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID,
+ offset);
+ }
+ return offset;
+}
+
+static int
+dissect_FMP_Close_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_Close_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_OpenGetMap_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle,
+ offset);
+
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_firstLogBlk,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_OpenGetMap_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID,
+ offset);
+ offset = dissect_fmp_extentList(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_OpenAllocSpace_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle, offset);
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_firstLogBlk, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_OpenAllocSpace_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID,
+ offset);
+ offset = dissect_fmp_extentList(tvb, offset, pinfo, tree);
+ }
+ return offset;
+}
+
+static int
+dissect_FMP_GetMap_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_firstLogBlk,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_GetMap_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_fmp_extentList(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_AllocSpace_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_firstLogBlk,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_AllocSpace_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_fmp_extentList(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_Flush_request(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_fmp_flushCmd(tvb, offset, tree);
+ offset = dissect_rpc_uint64(tvb,tree, hf_fmp_eof, offset);
+ offset = dissect_fmp_extentList(tvb, offset, pinfo, tree);
+ return offset;
+}
+
+static int
+dissect_FMP_Flush_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ }
+ return offset;
+}
+
+static int
+dissect_FMP_CancelReq_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_CancelReq_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ }
+ return offset;
+}
+
+static int
+dissect_FMP_PlugIn_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_plugInID(tvb, offset, tree);
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_plugInBuf, offset);
+ return offset;
+}
+
+static int
+dissect_FMP_PlugIn_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_plugInBuf,
+ offset);
+ }
+ return offset;
+}
+
+static int
+dissect_FMP_SessionTerminate_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ return dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle, 0);
+}
+
+static int
+dissect_FMP_SessionTerminate_reply(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int rval;
+
+ return dissect_fmp_status(tvb, 0,tree, &rval);
+}
+
+static int
+dissect_FMP_SessionCreateEx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_hostID,
+ offset, NULL);
+ offset = dissect_fmp_timeval(tvb, offset, pinfo ,tree, hf_fmp_btime,
+ hf_fmp_time_sec, hf_fmp_time_nsec);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_notifyPort,
+ offset);
+ offset = dissect_fmp_notifyProtocol(tvb, offset, tree);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_major,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_minor,
+ offset);
+
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_os_name,
+ offset, NULL);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_patch,
+ offset);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_build,
+ offset);
+
+ offset = dissect_fmp_capabilities(tvb, offset, tree);
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_SessionCreateEx_reply(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset, tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree,
+ hf_fmp_sessionHandle, offset);
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_hostID,
+ offset, NULL);
+ offset = dissect_fmp_timeval(tvb, offset, pinfo ,tree,
+ hf_fmp_btime, hf_fmp_time_sec,
+ hf_fmp_time_nsec);
+ offset = dissect_fmp_heartBeatIntv(tvb, offset, pinfo , tree);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_major,
+ offset);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_minor,
+ offset);
+
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_server_version_string,
+ offset, NULL);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_patch,
+ offset);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_os_build,
+ offset);
+
+ offset = dissect_fmp_capabilities(tvb, offset, tree);
+ }
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_ReportClientError_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_string(tvb, tree, hf_fmp_description,
+ offset, NULL);
+
+ offset = dissect_fmp_cerrInfo(tvb, offset, tree);
+ return offset;
+}
+
+static int
+dissect_FMP_ReportClientError_reply(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+
+ return offset;
+}
+
+static int
+dissect_FMP_GetAttr_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_GetAttr_reply(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+
+ offset = dissect_fmp_attrs(tvb, offset, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_OpenGetAttr_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle,
+ offset);
+
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_OpenGetAttr_reply(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset, tree, &rval);
+
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID, offset);
+ offset = dissect_fmp_attrs(tvb, offset, tree);
+ }
+
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_FlushGetAttr_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cmd, offset);
+ offset = dissect_rpc_uint64(tvb,tree, hf_fmp_eof, offset);
+
+ proto_tree_add_item(tree, hf_fmp_mtime, tvb, offset, 8, ENC_BIG_ENDIAN);
+ offset += 8;
+ offset = dissect_fmp_extentList(tvb, offset, pinfo, tree);
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_FlushGetAttr_reply(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+
+ offset = dissect_fmp_attrs(tvb, offset, tree);
+ }
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_GetVolumeInfo_request(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_topVolumeId, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cursor, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie, offset);
+ return offset;
+}
+
+
+
+static int
+dissect_FMP_GetVolumeInfo_reply(tvbuff_t *tvb, packet_info *pinfo _U_, proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ /* FIXME: I don't know size of this volumes */
+ offset = dissect_fmp_Hiervolume(tvb,offset, tree);
+ }
+ return offset;
+
+}
+
+static int
+dissect_FMP_OpenGetMapEx_request(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_sessionHandle,
+ offset);
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_firstLogBlk64, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+
+static int
+dissect_FMP_OpenGetMapEx_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID,
+ offset);
+ offset = dissect_fmp_extentListEx(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_OpenAllocSpaceEx_request(tvbuff_t *tvb,
+ packet_info *pinfo, proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb , tree, hf_fmp_sessionHandle,
+ offset);
+ offset = dissect_fmp_fileHandleSrc(tvb, offset, pinfo, tree);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_firstLogBlk64, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+
+static int
+dissect_FMP_OpenAllocSpaceEx_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_fsID,
+ offset);
+ offset = dissect_fmp_extentListEx(tvb, offset, pinfo, tree);
+ }
+ return offset;
+}
+
+static int
+dissect_FMP_GetMapEx_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_firstLogBlk64, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+
+static int
+dissect_FMP_GetMapEx_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_fmp_extentListEx(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+
+static int
+dissect_FMP_AllocSpaceEx_request(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_firstLogBlk64, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_numBlksReq,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_minBlks, offset);
+ return offset;
+}
+
+
+static int
+dissect_FMP_AllocSpaceEx_reply(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_cookie,
+ offset);
+ offset = dissect_rpc_uint64(tvb, tree, hf_fmp_fileSize,
+ offset);
+ offset = dissect_fmp_extentListEx(tvb, offset, pinfo, tree);
+ }
+
+ return offset;
+}
+
+static int
+dissect_FMP_FlushEx_request(tvbuff_t *tvb, packet_info *pinfo,
+ proto_tree *tree, void* data _U_)
+{
+ int offset = 0;
+ offset = dissect_rpc_data(tvb, tree, hf_fmp_fmpFHandle, offset);
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum, offset);
+ offset = dissect_fmp_flushCmd(tvb, offset, tree);
+ offset = dissect_rpc_uint64(tvb,tree, hf_fmp_eof, offset);
+ offset = dissect_fmp_extentListEx(tvb, offset, pinfo, tree);
+ return offset;
+}
+
+static int
+dissect_FMP_FlushEx_reply(tvbuff_t *tvb, packet_info *pinfo _U_,
+ proto_tree *tree, void* data _U_)
+{
+ int rval;
+ int offset = 0;
+
+ offset = dissect_fmp_status(tvb, offset,tree, &rval);
+ if (rval == 0) {
+ offset = dissect_rpc_uint32(tvb, tree, hf_fmp_msgNum,
+ offset);
+ }
+ return offset;
+}
+/*
+ * proc number, "proc name", dissect_request, dissect_reply
+ */
+static const vsff fmp3_proc[] = {
+ { 0,
+ "NULL",
+ dissect_rpc_void,
+ dissect_rpc_void, },
+
+ { 1,
+ "SessionCreate",
+ dissect_FMP_SessionCreate_request,
+ dissect_FMP_SessionCreate_reply },
+
+ { 2,
+ "HeartBeat",
+ dissect_FMP_HeartBeat_request,
+ dissect_FMP_HeartBeat_reply },
+
+ { 3,
+ "Mount",
+ dissect_FMP_Mount_request,
+ dissect_FMP_Mount_reply },
+
+ { 4,
+ "Open",
+ dissect_FMP_Open_request,
+ dissect_FMP_Open_reply },
+
+ { 5,
+ "Close",
+ dissect_FMP_Close_request,
+ dissect_FMP_Close_reply },
+
+ { 6,
+ "OpenGetMap",
+ dissect_FMP_OpenGetMap_request,
+ dissect_FMP_OpenGetMap_reply },
+
+ { 7,
+ "OpenAllocSpace",
+ dissect_FMP_OpenAllocSpace_request,
+ dissect_FMP_OpenAllocSpace_reply },
+
+ { 8,
+ "GetMap",
+ dissect_FMP_GetMap_request,
+ dissect_FMP_GetMap_reply },
+
+ { 9,
+ "AllocSpace",
+ dissect_FMP_AllocSpace_request,
+ dissect_FMP_AllocSpace_reply },
+
+ { 10,
+ "Flush",
+ dissect_FMP_Flush_request,
+ dissect_FMP_Flush_reply },
+
+ { 11,
+ "CancelReq",
+ dissect_FMP_CancelReq_request,
+ dissect_FMP_CancelReq_reply },
+
+ { 12,
+ "PlugIn",
+ dissect_FMP_PlugIn_request,
+ dissect_FMP_PlugIn_reply },
+
+ { 13,
+ "SessionTerminate",
+ dissect_FMP_SessionTerminate_request,
+ dissect_FMP_SessionTerminate_reply },
+
+ { 14,
+ "SessionCreateEx",
+ dissect_FMP_SessionCreateEx_request,
+ dissect_FMP_SessionCreateEx_reply },
+
+ { 15,
+ "ReportClientError",
+ dissect_FMP_ReportClientError_request,
+ dissect_FMP_ReportClientError_reply },
+
+ { 16 ,
+ "Get Attribute",
+ dissect_FMP_GetAttr_request,
+ dissect_FMP_GetAttr_reply },
+
+ { 17 ,
+ "Open Get Attribute",
+ dissect_FMP_OpenGetAttr_request,
+ dissect_FMP_OpenGetAttr_reply },
+
+ { 18 ,
+ "Flush Get Attribute",
+ dissect_FMP_FlushGetAttr_request,
+ dissect_FMP_FlushGetAttr_reply },
+
+ { 19 ,
+ "OpenGetMapEx",
+ dissect_FMP_OpenGetMapEx_request,
+ dissect_FMP_OpenGetMapEx_reply },
+
+ { 20 ,
+ "OpenAllocSpaceEx",
+ dissect_FMP_OpenAllocSpaceEx_request,
+ dissect_FMP_OpenAllocSpaceEx_reply },
+
+ { 21 ,
+ "GetMapEx",
+ dissect_FMP_GetMapEx_request,
+ dissect_FMP_GetMapEx_reply },
+
+ { 22 ,
+ "AllocSpaceEx",
+ dissect_FMP_AllocSpaceEx_request,
+ dissect_FMP_AllocSpaceEx_reply },
+
+ { 23 ,
+ "FMP_FlushEx",
+ dissect_FMP_FlushEx_request,
+ dissect_FMP_FlushEx_reply },
+#if 0
+
+ { 24 ,
+ "FlushGetAttrEx",
+ dissect_FMP_FlushGetAttrEx_request,
+ dissect_FMP_FlushGetAttrEx_reply },
+
+#endif
+
+ { 25 ,
+ "GetVolumeInfo",
+ dissect_FMP_GetVolumeInfo_request,
+ dissect_FMP_GetVolumeInfo_reply },
+
+
+ {0 , NULL , NULL , NULL }
+
+};
+
+
+static const rpc_prog_vers_info fmp_vers_info[] = {
+ { FMP_VERSION_3, fmp3_proc, &hf_fmp_procedure }
+};
+
+
+static const value_string fmp_proc_vals[] = {
+ { 0, "NULL" },
+ { 1, "SessionCreate" },
+ { 2, "HeartBeat" },
+ { 3, "Mount" },
+ { 4, "Open" },
+ { 5, "Close" },
+ { 6, "OpenGetMap" },
+ { 7, "OpenAllocSpace" },
+ { 8, "GetMap" },
+ { 9, "AllocSpace " },
+ { 10, "Flush" },
+ { 11, "CancelReq" },
+ { 12, "PlugIn" },
+ { 13, "SessionTerminate" },
+ { 14, "SessionCreateEx" },
+ { 15, "ReportClientError" },
+ { 16, "GetAttr " },
+ { 17, "OpenGetAttr" },
+ { 18, "FlushGetAttr"},
+ { 19, "OpenGetMapEx"},
+ { 20, "OpenAllocSpaceEx"},
+ { 21, "GetMapEx"},
+ { 22, "AllocSpaceEx"},
+ { 23, "FlushEx"},
+ { 24, "FlushGetAttrEx"},
+ { 25, "GetVolumeInfo"},
+ { 0,NULL }
+};
+
+
+static const value_string fmp_status_vals[] = {
+ { 0, "OK"},
+ { 5, "IOERROR"},
+ { 12, "NOMEM"},
+ { 13, "NOACCESS"},
+ { 22, "INVALIDARG"},
+ { 28, "FSFULL"},
+ { 79, "QUEUE_FULL"},
+ {500, "WRONG_MSG_NUM"},
+ {501, "SESSION_LOST"},
+ {502, "HOT_SESSION"},
+ {503, "COLD_SESSION"},
+ {504, "CLIENT_TERMINATED"},
+ {505, "WRITER_LOST_BLK"},
+ {506, "FMP_REQUEST_QUEUED"},
+ {507, "FMP_FALL_BACK"},
+ {508, "REQUEST_CANCELLED"},
+ {509, "WRITER_ZEROED_BLK"},
+ {510, "NOTIFY_ERROR"},
+ {511, "FMP_WRONG_HANDLE"},
+ {512, "DUPLICATE_OPEN"},
+ {600, "PLUGIN_NOFUNC"},
+ {0,NULL}
+};
+
+
+static const value_string fmp_extentState_vals[] = {
+ {0,"VALID_DATA"},
+ {1,"INVALID_DATA"},
+ {2,"NONE_DATA"},
+ {0,NULL}
+};
+
+static const value_string fmp_native_protocol_vals[] = {
+ {FMP_PATH, "PATH"},
+ {FMP_NFS, "NFS"},
+ {FMP_CIFS, "CIFS"},
+ {FMP_FMP, "FMP"},
+ {FMP_FS_ONLY, "FS_ONLY"},
+ {FMP_SHARE, "SHARE"},
+ {FMP_MOUNT, "MOUNT"},
+ {FMP_CIFSV2, "CIFSV2"},
+ {FMP_UNC,"UNC"},
+ {0,NULL}
+};
+
+static const value_string fmp_volume_mgmt_capability_vals[] = {
+ {FMP_SERVER_BASED, "SERVER_BASED"},
+ {FMP_THIRD_PARTY, "THIRD_PARTY"},
+ {FMP_CLIENT_BASED_DART, "CLIENT_BASED_DART"},
+ {FMP_CLIENT_BASED_SIMPLE, "CLIENT_BASED_SIMPLE"},
+ {FMP_HIERARCHICAL_VOLUME, "FMP_HIERARCHICAL_VOLUME"},
+ {0,NULL}
+};
+
+static const value_string fmp_query_cmd_vals[] = {
+ {FMP_SCSI_INQUIRY, "SCSI_INQUIRY"},
+ {FMP_DART_STAMP, "DART_STAMP"},
+ {0,NULL}
+};
+
+static const value_string fmp_volume_desc_vals[] = {
+ {FMP_VOLUME_DISK, "DISK"},
+ {FMP_VOLUME_SLICE, "SLICE"},
+ {FMP_VOLUME_STRIPE, "STRIPE"},
+ {FMP_VOLUME_META, "META"},
+ {FMP_VOLUME_SLICE, "SLICE"},
+ {FMP_VOLUME_SLICE, "SLICE"},
+ {0,NULL}
+};
+
+static const value_string fmp_disk_identifier_vals[] = {
+ {FMP_DISK_IDENTIFIER_SIGNATURE, "SIGNATURE"},
+ {FMP_DISK_IDENTIFIER_SERIAL, "SERIAL"},
+ {0,NULL}
+};
+
+static const value_string fmp_notify_protocol_vals[] = {
+ {FMP_TCP, "TCP"},
+ {FMP_UDP, "UDP"},
+ {0,NULL}
+};
+
+static const value_string fmp_volume_mgmt_type_vals[] = {
+ {FMP_SERVER_BASED, "SERVER_BASED"},
+ {FMP_THIRD_PARTY, "THIRD_PARTY"},
+ {FMP_CLIENT_BASED_DART, "CLIENT_BASED_DART"},
+ {FMP_CLIENT_BASED_SIMPLE, "CLIENT_BASED_SIMPLE"},
+ {FMP_DISK_SIGNATURE, "DISK_SIGNATURE"},
+ {FMP_HIERARCHICAL_VOLUME, "HIERARCHICAL_VOLUME"},
+ {0,NULL}
+};
+
+static const value_string fmp_client_error_number_vals[] = {
+ {FMP_CE_GENERIC, "FMP_CE_GENERIC"},
+ {FMP_CE_DISK_ERROR, "FMP_CE_DISK_ERROR"},
+ {0,NULL}
+};
+
+void
+proto_register_fmp(void)
+{
+ static hf_register_info hf[] = {
+ { &hf_fmp_procedure,
+ { "Procedure", "fmp.procedure",
+ FT_UINT32, BASE_DEC, VALS(fmp_proc_vals),
+ 0, NULL, HFILL }}, /* New addition */
+
+ { &hf_fmp_hostID,
+ { "Host ID", "fmp.hostID",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_btime,
+ { "Boot Time", "fmp.btime",
+ FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0,
+ "Machine Boot Time", HFILL }},
+
+ { &hf_fmp_time_sec,
+ { "seconds", "fmp.btime.sec",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_time_nsec,
+ { "nanoseconds", "fmp.btime.nsec",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_notifyPort,
+ { "Notify Port", "fmp.notifyPort",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_sessionHandle,
+ { "Session Handle", "fmp.sessHandle",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_fmpFHandle,
+ { "FMP File Handle", "fmp.fmpFHandle",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL,
+
+ HFILL }},
+ { &hf_fmp_nfsFHandle,
+ { "NFS File Handle", "fmp.nfsFHandle",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_fsID,
+ { "File System ID", "fmp.fsID",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_status,
+ { "Status", "fmp.status",
+ FT_UINT32, BASE_DEC, VALS(fmp_status_vals), 0,
+ "Reply Status", HFILL }},
+
+ { &hf_fmp_fsBlkSz,
+ { "File System Block Size", "fmp.fsBlkSz",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_volHandle,
+ { "Volume Handle", "fmp.volHandle",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_dskSigEnt_val,
+ { "Celerra Signature", "fmp.dsi.ds.dsList.dskSigLst_val.dse.dskSigEnt_val",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_devSignature,
+ { "Signature DATA", "fmp.devSig",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_mount_path,
+ { "Native Protocol: PATH", "fmp.mount_path",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Absolute path from the root on the server side", HFILL }},
+
+ { &hf_fmp_sig_offset,
+ { "Sig Offset", "fmp.dsi.ds.sig_offset",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_numBlksReq,
+ { "Extent Length", "fmp.numBlksReq",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_minBlks,
+ { "Minimum Blocks to Grant", "fmp.minBlks",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_msgNum,
+ { "Message Number", "fmp.msgNum",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_cookie,
+ { "Cookie", "fmp.cookie",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ "Cookie for FMP_REQUEST_QUEUED Resp", HFILL }},
+
+ { &hf_fmp_fileSize,
+ { "File Size", "fmp.fileSize",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_extentList_len,
+ { "Extent List Length", "fmp.extentList_len",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_extent_state,
+ { "Extent State", "fmp.extentState",
+ FT_UINT32,BASE_DEC, VALS(fmp_extentState_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_firstLogBlk,
+ { "First Logical File Block", "fmp.firstLogBlk",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_numBlks,
+ { "Number of Blocks", "fmp.numBlks",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_volID,
+ { "Volume ID inside DART", "fmp.volID",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_startOffset,
+ { "Start Offset", "fmp.startOffset",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_start_offset64,
+ { "Start offset", "fmp.start_offset64",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ "Start Offset of extentEx", HFILL }},
+
+ { &hf_fmp_eof,
+ { "EOF", "fmp.eof",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ "End Of File", HFILL }},
+
+ { &hf_fmp_plugInID,
+ { "Plug In Cmd ID", "fmp.plugInID",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_plugInBuf,
+ { "Plug In Args", "fmp.plugIn",
+ FT_BYTES, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_os_major,
+ { "OS Major", "fmp.os_major",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_os_minor,
+ { "OS Minor", "fmp.os_minor",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_os_name,
+ { "OS Name", "fmp.os_name",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_path,
+ { "Mount Path", "fmp.Path",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_os_patch,
+ { "OS Path", "fmp.os_patch",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_os_build,
+ { "OS Build", "fmp.os_build",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_server_version_string,
+ { "Server Version String", "fmp.server_version_string",
+ FT_STRING, BASE_NONE, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_description,
+ { "Error Description", "fmp.description",
+ FT_STRING, BASE_NONE, NULL, 0,
+ "Client Error Description", HFILL }},
+
+ { &hf_fmp_nfsv3Attr_type,
+ { "Type", "fmp.nfsv3Attr_type",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ "NFSV3 Attr Type", HFILL }},
+
+ { &hf_fmp_nfsv3Attr_mode,
+ { "Mode", "fmp.nfsv3Attr_mod",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_nfsv3Attr_nlink,
+ { "nlink", "fmp.nfsv3Attr_nlink",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_nfsv3Attr_uid,
+ { "uid", "fmp.nfsv3Attr_uid",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_nfsv3Attr_gid,
+ { "gid", "fmp.nfsv3Attr_gid",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ /* for nfsv3Attr_size use hf_fmp_fileSize */
+ { &hf_fmp_nfsv3Attr_used,
+ { "Used", "fmp.nfsv3Attr_used",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_nfsv3Attr_rdev,
+ { "rdev", "fmp.nfsv3Attr_rdev",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_nfsv3Attr_fsid,
+ { "fsid", "fmp.nfsv3Attr_fsid",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_nfsv3Attr_fileid,
+ { "File ID", "fmp.nfsv3Attr_fileid",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_cmd,
+ { "Command", "fmp.cmd",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_topVolumeId,
+ { "Top Volume ID", "fmp.topVolumeId",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_cursor,
+ { "number of volumes", "fmp.cursor",
+ FT_UINT32, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_offset64,
+ { "offset", "fmp.offset64",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_slice_size,
+ { "size of the slice", "fmp.slice_size",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_volume,
+ { "Volume ID's", "fmp.volume",
+ FT_UINT32, BASE_HEX, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_stripeSize,
+ { "size of the stripe", "fmp.stripeSize",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_firstLogBlk64,
+ { "First Logical Block", "fmp.firstLogBlk64",
+ FT_UINT64, BASE_DEC, NULL, 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_native_protocol,
+ { "Native Protocol", "fmp.native_protocol",
+ FT_UINT32, BASE_DEC, VALS(fmp_native_protocol_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_encoding_mode,
+ { "Encoding Mode", "fmp.encoding_mode",
+ FT_UINT32, BASE_DEC, VALS(fmp_encoding_mode_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_capability,
+ { "Volume Mgmt Capability", "fmp.capability",
+ FT_UINT32, BASE_DEC, VALS(fmp_volume_mgmt_capability_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_devSerial_query_cmd,
+ { "Query Command", "fmp.devSerial.query_cmd",
+ FT_UINT32, BASE_DEC, VALS(fmp_query_cmd_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_volume_desc,
+ { "VOLUME", "fmp.volume_desc",
+ FT_UINT32, BASE_DEC, VALS(fmp_volume_desc_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_disk_identifier,
+ { "DISK IDENTIFIER", "fmp.disk_identifier",
+ FT_UINT32, BASE_DEC, VALS(fmp_disk_identifier_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_volume_mgmt_type,
+ { "Volume Mgmt Type", "fmp.volume_mgmt_type",
+ FT_UINT32, BASE_DEC, VALS(fmp_volume_mgmt_type_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_notify_protocol,
+ { "Protocol", "fmp.notify_protocol",
+ FT_UINT32, BASE_DEC, VALS(fmp_notify_protocol_vals), 0,
+ NULL, HFILL }},
+
+ { &hf_fmp_client_error_number,
+ { "CLIENT Error Number", "fmp.client_error_number",
+ FT_UINT32, BASE_DEC, VALS(fmp_client_error_number_vals), 0,
+ NULL, HFILL }},
+
+ /* Generated from convert_proto_tree_add_text.pl */
+ { &hf_fmp_fid, { "fid", "fmp.fid", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_tid, { "tid", "fmp.tid", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_uid, { "uid", "fmp.uid", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_fsid, { "FsID", "fmp.fsid", FT_INT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_cifsport, { "cifsPort", "fmp.cifsport", FT_INT16, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_number_of_disk, { "Number of Disk", "fmp.number_of_disk", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_length_of_list, { "Length of List", "fmp.length_of_list", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_sigoffset, { "sigOffset", "fmp.sigoffset", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_length_of_volume_list, { "Length of volume List", "fmp.length_of_volume_list", FT_UINT32, BASE_DEC, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_blockindex, { "blockIndex", "fmp.blockindex", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_cap, { "Capabilities", "fmp.cap", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_cap_revoke_handle_list, { "CAP_REVOKE_HANDLE_LIST", "fmp.cap.revoke_handle_list", FT_BOOLEAN, 32, TFS(&tfs_yes_no), FMP_CAP_REVOKE_HANDLE_LIST, NULL, HFILL }},
+ { &hf_fmp_cap_unc_names, { "CAP_UNC_NAMES", "fmp.cap.unc_names", FT_BOOLEAN, 32, TFS(&tfs_yes_no), FMP_CAP_UNC_NAMES, NULL, HFILL }},
+ { &hf_fmp_cap_cifsv2, { "CAP_CIFSV2", "fmp.cap.cifsv2", FT_BOOLEAN, 32, TFS(&tfs_yes_no), FMP_CAP_CIFSV2, NULL, HFILL }},
+ { &hf_fmp_mtime, { "mtime", "fmp.mtime", FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_atime, { "atime", "fmp.atime", FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_ctime, { "ctime", "fmp.ctime", FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_heartbeat_interval, { "Heartbeat interval", "fmp.heartbeat_interval", FT_RELATIVE_TIME, BASE_NONE, NULL, 0x0, NULL, HFILL }},
+ { &hf_fmp_volindex, { "volIndex", "fmp.volindex", FT_UINT32, BASE_HEX, NULL, 0x0, NULL, HFILL }},
+ };
+
+ static gint *ett[] = {
+ &ett_fmp,
+ &ett_fmp_timeval,
+ &ett_fmp_extList,
+ &ett_fmp_ext,
+ &ett_fmp_fileHandle,
+ &ett_capabilities,
+ &ett_HierVolumeDescription,
+ &ett_attrs
+ };
+
+ module_t *fmp_module;
+ proto_fmp = proto_register_protocol("File Mapping Protocol", "FMP", "fmp");
+
+ proto_register_field_array(proto_fmp, hf, array_length(hf));
+ proto_register_subtree_array(ett, array_length(ett));
+
+ fmp_module=prefs_register_protocol(proto_fmp, NULL);
+
+ prefs_register_bool_preference(fmp_module, "fhandle_find_both_reqrep",
+ "Fhandle filters finds both request/response",
+ "With this option display filters for fmp fhandle a RPC call,"
+ " even if the actual fhandle is only present in one of the packets",
+ &fmp_fhandle_reqrep_matching);
+
+}
+
+void
+proto_reg_handoff_fmp(void)
+{
+ /* Register the protocol as RPC */
+ rpc_init_prog(proto_fmp, FMP_PROGRAM, ett_fmp,
+ G_N_ELEMENTS(fmp_vers_info), fmp_vers_info);
+}
+
+/*
+ * Editor modelines - https://www.wireshark.org/tools/modelines.html
+ *
+ * Local variables:
+ * c-basic-offset: 4
+ * tab-width: 8
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vi: set shiftwidth=4 tabstop=8 expandtab:
+ * :indentSize=4:tabSize=8:noTabs=true:
+ */