aboutsummaryrefslogtreecommitdiffstats
path: root/epan/dissectors/packet-9p.c
diff options
context:
space:
mode:
authorJeff Morriss <jeff.morriss.ws@gmail.com>2013-05-17 02:00:05 +0000
committerJeff Morriss <jeff.morriss.ws@gmail.com>2013-05-17 02:00:05 +0000
commit504d83098179b491ef86983027fbead50fd6a159 (patch)
treecf5ced24dde615a75e9bf967e80c0f3919fd3890 /epan/dissectors/packet-9p.c
parent5dc6e4598e09535a981f71670083a13915b742d1 (diff)
From Dominique Martinet via https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=8589 :
Theses patches add alot of new message types for the 9P protocol and its extensions (most specifically 9P2000.L), while staying compatible with the legacy protocol (hence the hashtable with conversation information, since version is only known at handshake) It is still missing alot of 9P2000.u specifics, but I don't have any server to test it with. I'm also missing some dump to test legacy, but I'm pretty confident I didn't break much there as it is mostly compatible, most differences are handled using different messages, the only one that was changed would be RERROR. second diff also adds deeper interpretation of the protocol, by following the conversation stream and keeping a bigger hashtable associating fid (file handles) and file names, for easier debugging. From me: roll the contents of the (new) packet-9p.h back into the C file. svn path=/trunk/; revision=49363
Diffstat (limited to 'epan/dissectors/packet-9p.c')
-rw-r--r--epan/dissectors/packet-9p.c2207
1 files changed, 2006 insertions, 201 deletions
diff --git a/epan/dissectors/packet-9p.c b/epan/dissectors/packet-9p.c
index 62833393da..14a84b33a5 100644
--- a/epan/dissectors/packet-9p.c
+++ b/epan/dissectors/packet-9p.c
@@ -33,6 +33,750 @@
#include <epan/packet.h>
#include <epan/strutil.h>
+#include <epan/conversation.h>
+
+/**
+ * enum _9p_msg_t - 9P message types
+ * @_9P_TLERROR: not used
+ * @_9P_RLERROR: response for any failed request for 9P2000.L
+ * @_9P_TSTATFS: file system status request
+ * @_9P_RSTATFS: file system status response
+ * @_9P_TSYMLINK: make symlink request
+ * @_9P_RSYMLINK: make symlink response
+ * @_9P_TMKNOD: create a special file object request
+ * @_9P_RMKNOD: create a special file object response
+ * @_9P_TLCREATE: prepare a handle for I/O on an new file for 9P2000.L
+ * @_9P_RLCREATE: response with file access information for 9P2000.L
+ * @_9P_TRENAME: rename request
+ * @_9P_RRENAME: rename response
+ * @_9P_TMKDIR: create a directory request
+ * @_9P_RMKDIR: create a directory response
+ * @_9P_TVERSION: version handshake request
+ * @_9P_RVERSION: version handshake response
+ * @_9P_TAUTH: request to establish authentication channel
+ * @_9P_RAUTH: response with authentication information
+ * @_9P_TATTACH: establish user access to file service
+ * @_9P_RATTACH: response with top level handle to file hierarchy
+ * @_9P_TERROR: not used
+ * @_9P_RERROR: response for any failed request
+ * @_9P_TFLUSH: request to abort a previous request
+ * @_9P_RFLUSH: response when previous request has been cancelled
+ * @_9P_TWALK: descend a directory hierarchy
+ * @_9P_RWALK: response with new handle for position within hierarchy
+ * @_9P_TOPEN: prepare a handle for I/O on an existing file
+ * @_9P_ROPEN: response with file access information
+ * @_9P_TCREATE: prepare a handle for I/O on a new file
+ * @_9P_RCREATE: response with file access information
+ * @_9P_TREAD: request to transfer data from a file or directory
+ * @_9P_RREAD: response with data requested
+ * @_9P_TWRITE: reuqest to transfer data to a file
+ * @_9P_RWRITE: response with out much data was transfered to file
+ * @_9P_TCLUNK: forget about a handle to an entity within the file system
+ * @_9P_RCLUNK: response when server has forgotten about the handle
+ * @_9P_TREMOVE: request to remove an entity from the hierarchy
+ * @_9P_RREMOVE: response when server has removed the entity
+ * @_9P_TSTAT: request file entity attributes
+ * @_9P_RSTAT: response with file entity attributes
+ * @_9P_TWSTAT: request to update file entity attributes
+ * @_9P_RWSTAT: response when file entity attributes are updated
+ *
+ * There are 14 basic operations in 9P2000, paired as
+ * requests and responses. The one special case is ERROR
+ * as there is no @_9P_TERROR request for clients to transmit to
+ * the server, but the server may respond to any other request
+ * with an @_9P_RERROR.
+ *
+ * See Also: http://plan9.bell-labs.com/sys/man/5/INDEX.html
+ */
+
+enum _9p_msg_t {
+ _9P_TLERROR = 6,
+ _9P_RLERROR,
+ _9P_TSTATFS = 8,
+ _9P_RSTATFS,
+ _9P_TLOPEN = 12,
+ _9P_RLOPEN,
+ _9P_TLCREATE = 14,
+ _9P_RLCREATE,
+ _9P_TSYMLINK = 16,
+ _9P_RSYMLINK,
+ _9P_TMKNOD = 18,
+ _9P_RMKNOD,
+ _9P_TRENAME = 20,
+ _9P_RRENAME,
+ _9P_TREADLINK = 22,
+ _9P_RREADLINK,
+ _9P_TGETATTR = 24,
+ _9P_RGETATTR,
+ _9P_TSETATTR = 26,
+ _9P_RSETATTR,
+ _9P_TXATTRWALK = 30,
+ _9P_RXATTRWALK,
+ _9P_TXATTRCREATE = 32,
+ _9P_RXATTRCREATE,
+ _9P_TREADDIR = 40,
+ _9P_RREADDIR,
+ _9P_TFSYNC = 50,
+ _9P_RFSYNC,
+ _9P_TLOCK = 52,
+ _9P_RLOCK,
+ _9P_TGETLOCK = 54,
+ _9P_RGETLOCK,
+ _9P_TLINK = 70,
+ _9P_RLINK,
+ _9P_TMKDIR = 72,
+ _9P_RMKDIR,
+ _9P_TRENAMEAT = 74,
+ _9P_RRENAMEAT,
+ _9P_TUNLINKAT = 76,
+ _9P_RUNLINKAT,
+ _9P_TVERSION = 100,
+ _9P_RVERSION,
+ _9P_TAUTH = 102,
+ _9P_RAUTH,
+ _9P_TATTACH = 104,
+ _9P_RATTACH,
+ _9P_TERROR = 106,
+ _9P_RERROR,
+ _9P_TFLUSH = 108,
+ _9P_RFLUSH,
+ _9P_TWALK = 110,
+ _9P_RWALK,
+ _9P_TOPEN = 112,
+ _9P_ROPEN,
+ _9P_TCREATE = 114,
+ _9P_RCREATE,
+ _9P_TREAD = 116,
+ _9P_RREAD,
+ _9P_TWRITE = 118,
+ _9P_RWRITE,
+ _9P_TCLUNK = 120,
+ _9P_RCLUNK,
+ _9P_TREMOVE = 122,
+ _9P_RREMOVE,
+ _9P_TSTAT = 124,
+ _9P_RSTAT,
+ _9P_TWSTAT = 126,
+ _9P_RWSTAT,
+};
+
+/* 9P Msg types to name mapping */
+static const value_string ninep_msg_type[] =
+{
+ {_9P_TLERROR, "Tlerror"},
+ {_9P_RLERROR, "Rlerror"},
+ {_9P_TSTATFS, "Tstatfs"},
+ {_9P_RSTATFS, "Rstatfs"},
+ {_9P_TLOPEN, "Tlopen"},
+ {_9P_RLOPEN, "Rlopen"},
+ {_9P_TLCREATE, "Tlcreate"},
+ {_9P_RLCREATE, "Rlcreate"},
+ {_9P_TSYMLINK, "Tsymlink"},
+ {_9P_RSYMLINK, "Rsymlink"},
+ {_9P_TMKNOD, "Tmknod"},
+ {_9P_RMKNOD, "Rmknod"},
+ {_9P_TRENAME, "Trename"},
+ {_9P_RRENAME, "Rrename"},
+ {_9P_TREADLINK, "Treadlink"},
+ {_9P_RREADLINK, "Rreadlink"},
+ {_9P_TGETATTR, "Tgetattr"},
+ {_9P_RGETATTR, "Rgetattr"},
+ {_9P_TSETATTR, "Tsetattr"},
+ {_9P_RSETATTR, "Rsetattr"},
+ {_9P_TXATTRWALK, "Txattrwalk"},
+ {_9P_RXATTRWALK, "Rxattrwalk"},
+ {_9P_TXATTRCREATE, "Txattrcreate"},
+ {_9P_RXATTRCREATE, "Rxattrcreate"},
+ {_9P_TREADDIR, "Treaddir"},
+ {_9P_RREADDIR, "Rreaddir"},
+ {_9P_TFSYNC, "Tfsync"},
+ {_9P_RFSYNC, "Rfsync"},
+ {_9P_TLOCK, "Tlock"},
+ {_9P_RLOCK, "Rlock"},
+ {_9P_TGETLOCK, "Tgetlock"},
+ {_9P_RGETLOCK, "Rgetlock"},
+ {_9P_TLINK, "Tlink"},
+ {_9P_RLINK, "Rlink"},
+ {_9P_TMKDIR, "Tmkdir"},
+ {_9P_RMKDIR, "Rmkdir"},
+ {_9P_TRENAMEAT, "Trenameat"},
+ {_9P_RRENAMEAT, "Rrenameat"},
+ {_9P_TUNLINKAT, "Tunlinkat"},
+ {_9P_RUNLINKAT, "Runlinkat"},
+ {_9P_TVERSION, "Tversion"},
+ {_9P_RVERSION, "Rversion"},
+ {_9P_TAUTH, "Tauth"},
+ {_9P_RAUTH, "Rauth"},
+ {_9P_TATTACH, "Tattach"},
+ {_9P_RATTACH, "Rattach"},
+ {_9P_TERROR, "Terror"},
+ {_9P_RERROR, "Rerror"},
+ {_9P_TFLUSH, "Tflush"},
+ {_9P_RFLUSH, "Rflush"},
+ {_9P_TWALK, "Twalk"},
+ {_9P_RWALK, "Rwalk"},
+ {_9P_TOPEN, "Topen"},
+ {_9P_ROPEN, "Ropen"},
+ {_9P_TCREATE, "Tcreate"},
+ {_9P_RCREATE, "Rcreate"},
+ {_9P_TREAD, "Tread"},
+ {_9P_RREAD, "Rread"},
+ {_9P_TWRITE, "Twrite"},
+ {_9P_RWRITE, "Rwrite"},
+ {_9P_TCLUNK, "Tclunk"},
+ {_9P_RCLUNK, "Rclunk"},
+ {_9P_TREMOVE, "Tremove"},
+ {_9P_RREMOVE, "Rremove"},
+ {_9P_TSTAT, "Tstat"},
+ {_9P_RSTAT, "Rstat"},
+ {_9P_TWSTAT, "Twstat"},
+ {_9P_RWSTAT, "Rwstat"},
+ {0, NULL},
+};
+static value_string_ext ninep_msg_type_ext = VALUE_STRING_EXT_INIT(ninep_msg_type);
+
+enum _9p_version {
+ _9P = 1,
+ _9P2000,
+ _9P2000_L,
+ _9P2000_u
+};
+
+static const value_string ninep_version[] =
+{
+ {_9P, "9P"},
+ {_9P2000, "9P2000"},
+ {_9P2000_L, "9P2000.L"},
+ {_9P2000_u, "9P2000.u"},
+ {0, NULL},
+};
+static value_string_ext ninep_version_ext = VALUE_STRING_EXT_INIT(ninep_version);
+
+
+/* File open modes */
+#define _9P_OREAD 0x0
+#define _9P_OWRITE 0x1
+#define _9P_ORDWR 0x2
+#define _9P_OEXEC 0x3
+#define _9P_MODEMASK 0x3
+#define _9P_OTRUNC 0x10
+#define _9P_ORCLOSE 0x40
+
+/* Open/Create modes */
+static const value_string ninep_mode_vals[] =
+{
+ {_9P_OREAD, "Read Access"},
+ {_9P_OWRITE, "Write Access"},
+ {_9P_ORDWR, "Read/Write Access "},
+ {_9P_OEXEC, "Execute Access"},
+ {0, NULL},
+};
+static value_string_ext ninep_mode_vals_ext = VALUE_STRING_EXT_INIT(ninep_mode_vals);
+
+
+/* stat mode flags */
+#define DMDIR 0x80000000 /* Directory */
+#define DMAPPEND 0x40000000 /* Append only */
+#define DMEXCL 0x20000000 /* Exclusive use */
+#define DMMOUNT 0x10000000 /* Mounted channel */
+#define DMAUTH 0x08000000 /* Authentication */
+#define DMTMP 0x04000000 /* Temporary */
+
+
+/**
+ * enum _9p_qid_t - QID types
+ * @_9P_QTDIR: directory
+ * @_9P_QTAPPEND: append-only
+ * @_9P_QTEXCL: excluse use (only one open handle allowed)
+ * @_9P_QTMOUNT: mount points
+ * @_9P_QTAUTH: authentication file
+ * @_9P_QTTMP: non-backed-up files
+ * @_9P_QTSYMLINK: symbolic links (9P2000.u)
+ * @_9P_QTLINK: hard-link (9P2000.u)
+ * @_9P_QTFILE: normal files
+ *
+ * QID types are a subset of permissions - they are primarily
+ * used to differentiate semantics for a file system entity via
+ * a jump-table. Their value is also the most signifigant 16 bits
+ * of the permission_t
+ *
+ * See Also: http://plan9.bell-labs.com/magic/man2html/2/stat
+ */
+enum _9p_qid_t {
+ _9P_QTDIR = 0x80,
+ _9P_QTAPPEND = 0x40,
+ _9P_QTEXCL = 0x20,
+ _9P_QTMOUNT = 0x10,
+ _9P_QTAUTH = 0x08,
+ _9P_QTTMP = 0x04,
+ _9P_QTSYMLINK = 0x02,
+ _9P_QTLINK = 0x01,
+ _9P_QTFILE = 0x00,
+};
+
+/* 9P Magic Numbers */
+#define _9P_NOTAG (guint16)(~0)
+#define _9P_NOFID (guint32)(~0)
+#define _9P_NONUNAME (guint32)(~0)
+#define _9P_MAXWELEM 16
+
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 1024
+#endif
+
+
+/**
+ * @brief Length prefixed string type
+ *
+ * The protocol uses length prefixed strings for all
+ * string data, so we replicate that for our internal
+ * string members.
+ */
+
+struct _9p_str {
+ guint16 len; /*< Length of the string */
+ char *str; /*< The string */
+};
+
+/**
+ * @brief file system entity information
+ *
+ * qids are /identifiers used by 9P servers to track file system
+ * entities. The type is used to differentiate semantics for operations
+ * on the entity (ie. read means something different on a directory than
+ * on a file). The path provides a server unique index for an entity
+ * (roughly analogous to an inode number), while the version is updated
+ * every time a file is modified and can be used to maintain cache
+ * coherency between clients and serves.
+ * Servers will often differentiate purely synthetic entities by setting
+ * their version to 0, signaling that they should never be cached and
+ * should be accessed synchronously.
+ *
+ * See Also://plan9.bell-labs.com/magic/man2html/2/stat
+ */
+
+struct _9p_qid {
+ guint8 type; /*< Type */
+ guint32 version; /*< Monotonically incrementing version number */
+ guint64 path; /*< Per-server-unique ID for a file system element */
+};
+
+
+/* Bit values for getattr valid field.
+ */
+#define _9P_GETATTR_MODE 0x00000001ULL
+#define _9P_GETATTR_NLINK 0x00000002ULL
+#define _9P_GETATTR_UID 0x00000004ULL
+#define _9P_GETATTR_GID 0x00000008ULL
+#define _9P_GETATTR_RDEV 0x00000010ULL
+#define _9P_GETATTR_ATIME 0x00000020ULL
+#define _9P_GETATTR_MTIME 0x00000040ULL
+#define _9P_GETATTR_CTIME 0x00000080ULL
+#define _9P_GETATTR_INO 0x00000100ULL
+#define _9P_GETATTR_SIZE 0x00000200ULL
+#define _9P_GETATTR_BLOCKS 0x00000400ULL
+
+#define _9P_GETATTR_BTIME 0x00000800ULL
+#define _9P_GETATTR_GEN 0x00001000ULL
+#define _9P_GETATTR_DATA_VERSION 0x00002000ULL
+
+#define _9P_GETATTR_BASIC 0x000007ffULL /* Mask for fields up to BLOCKS */
+#define _9P_GETATTR_ALL 0x00003fffULL /* Mask for All fields above */
+
+
+/* Bit values for setattr valid field from <linux/fs.h>.
+ */
+#define _9P_SETATTR_MODE 0x00000001UL
+#define _9P_SETATTR_UID 0x00000002UL
+#define _9P_SETATTR_GID 0x00000004UL
+#define _9P_SETATTR_SIZE 0x00000008UL
+#define _9P_SETATTR_ATIME 0x00000010UL
+#define _9P_SETATTR_MTIME 0x00000020UL
+#define _9P_SETATTR_CTIME 0x00000040UL
+#define _9P_SETATTR_ATIME_SET 0x00000080UL
+#define _9P_SETATTR_MTIME_SET 0x00000100UL
+
+#define _9P_SETATTR_ALL 0x000001FFUL
+
+/* 9p2000.L open flags */
+#define _9P_DOTL_RDONLY 00000000
+#define _9P_DOTL_WRONLY 00000001
+#define _9P_DOTL_RDWR 00000002
+#define _9P_DOTL_NOACCESS 00000003
+#define _9P_DOTL_CREATE 00000100
+#define _9P_DOTL_EXCL 00000200
+#define _9P_DOTL_NOCTTY 00000400
+#define _9P_DOTL_TRUNC 00001000
+#define _9P_DOTL_APPEND 00002000
+#define _9P_DOTL_NONBLOCK 00004000
+#define _9P_DOTL_DSYNC 00010000
+#define _9P_DOTL_FASYNC 00020000
+#define _9P_DOTL_DIRECT 00040000
+#define _9P_DOTL_LARGEFILE 00100000
+#define _9P_DOTL_DIRECTORY 00200000
+#define _9P_DOTL_NOFOLLOW 00400000
+#define _9P_DOTL_NOATIME 01000000
+#define _9P_DOTL_CLOEXEC 02000000
+#define _9P_DOTL_SYNC 04000000
+
+
+/* Bit values for lock type.
+ */
+#define _9P_LOCK_TYPE_RDLCK 0
+#define _9P_LOCK_TYPE_WRLCK 1
+#define _9P_LOCK_TYPE_UNLCK 2
+
+/* 9P lock type to string table */
+static const value_string ninep_lock_type[] =
+{
+ {_9P_LOCK_TYPE_RDLCK, "Read lock"},
+ {_9P_LOCK_TYPE_WRLCK, "Write lock"},
+ {_9P_LOCK_TYPE_UNLCK, "Unlock"},
+ { 0, NULL},
+};
+static value_string_ext ninep_lock_type_ext = VALUE_STRING_EXT_INIT(ninep_lock_type);
+
+/* Bit values for lock status.
+ */
+#define _9P_LOCK_SUCCESS 0
+#define _9P_LOCK_BLOCKED 1
+#define _9P_LOCK_ERROR 2
+#define _9P_LOCK_GRACE 3
+
+/* 9P lock status to string table */
+static const value_string ninep_lock_status[] =
+{
+ {_9P_LOCK_SUCCESS, "Success"},
+ {_9P_LOCK_BLOCKED, "Blocked"},
+ {_9P_LOCK_ERROR, "Error"},
+ {_9P_LOCK_GRACE, "Grace"},
+ { 0, NULL},
+};
+static value_string_ext ninep_lock_status_ext = VALUE_STRING_EXT_INIT(ninep_lock_status);
+
+/* Bit values for lock flags.
+ */
+#define _9P_LOCK_FLAGS_NONE 0
+#define _9P_LOCK_FLAGS_BLOCK 1
+#define _9P_LOCK_FLAGS_RECLAIM 2
+
+/* 9P lock flag to string table */
+static const value_string ninep_lock_flag[] =
+{
+ {_9P_LOCK_FLAGS_NONE, "No flag"},
+ {_9P_LOCK_FLAGS_BLOCK, "Block"},
+ {_9P_LOCK_BLOCKED, "Reclaim"},
+ { 0, NULL},
+};
+static value_string_ext ninep_lock_flag_ext = VALUE_STRING_EXT_INIT(ninep_lock_flag);
+
+
+/* Structures for Protocol Operations */
+struct _9p_rlerror {
+ guint32 ecode;
+};
+struct _9p_tstatfs {
+ guint32 fid;
+};
+struct _9p_rstatfs {
+ guint32 type;
+ guint32 bsize;
+ guint64 blocks;
+ guint64 bfree;
+ guint64 bavail;
+ guint64 files;
+ guint64 ffree;
+ guint64 fsid;
+ guint32 namelen;
+};
+struct _9p_tlopen {
+ guint32 fid;
+ guint32 flags;
+};
+struct _9p_rlopen {
+ struct _9p_qid qid;
+ guint32 iounit;
+};
+struct _9p_tlcreate {
+ guint32 fid;
+ struct _9p_str name;
+ guint32 flags;
+ guint32 mode;
+ guint32 gid;
+};
+struct _9p_rlcreate {
+ struct _9p_qid qid;
+ guint32 iounit;
+};
+struct _9p_tsymlink {
+ guint32 fid;
+ struct _9p_str name;
+ struct _9p_str symtgt;
+ guint32 gid;
+};
+struct _9p_rsymlink {
+ struct _9p_qid qid;
+};
+struct _9p_tmknod {
+ guint32 fid;
+ struct _9p_str name;
+ guint32 mode;
+ guint32 major;
+ guint32 minor;
+ guint32 gid;
+};
+struct _9p_rmknod {
+ struct _9p_qid qid;
+};
+struct _9p_trename {
+ guint32 fid;
+ guint32 dfid;
+ struct _9p_str name;
+};
+struct _9p_rrename {
+};
+struct _9p_treadlink {
+ guint32 fid;
+};
+struct _9p_rreadlink {
+ struct _9p_str target;
+};
+struct _9p_tgetattr {
+ guint32 fid;
+ guint64 request_mask;
+};
+struct _9p_rgetattr {
+ guint64 valid;
+ struct _9p_qid qid;
+ guint32 mode;
+ guint32 uid;
+ guint32 gid;
+ guint64 nlink;
+ guint64 rdev;
+ guint64 size;
+ guint64 blksize;
+ guint64 blocks;
+ guint64 atime_sec;
+ guint64 atime_nsec;
+ guint64 mtime_sec;
+ guint64 mtime_nsec;
+ guint64 ctime_sec;
+ guint64 ctime_nsec;
+ guint64 btime_sec;
+ guint64 btime_nsec;
+ guint64 gen;
+ guint64 data_version;
+};
+struct _9p_tsetattr {
+ guint32 fid;
+ guint32 valid;
+ guint32 mode;
+ guint32 uid;
+ guint32 gid;
+ guint64 size;
+ guint64 atime_sec;
+ guint64 atime_nsec;
+ guint64 mtime_sec;
+ guint64 mtime_nsec;
+};
+struct _9p_rsetattr {
+};
+struct _9p_txattrwalk {
+ guint32 fid;
+ guint32 attrfid;
+ struct _9p_str name;
+};
+struct _9p_rxattrwalk {
+ guint64 size;
+};
+struct _9p_txattrcreate {
+ guint32 fid;
+ struct _9p_str name;
+ guint64 size;
+ guint32 flag;
+};
+struct _9p_rxattrcreate {
+};
+struct _9p_treaddir {
+ guint32 fid;
+ guint64 offset;
+ guint32 count;
+};
+struct _9p_rreaddir {
+ guint32 count;
+ guint8 *data;
+};
+struct _9p_tfsync {
+ guint32 fid;
+};
+struct _9p_rfsync {
+};
+struct _9p_tlock {
+ guint32 fid;
+ guint8 type;
+ guint32 flags;
+ guint64 start;
+ guint64 length;
+ guint32 proc_id;
+ struct _9p_str client_id;
+};
+struct _9p_rlock {
+ guint8 status;
+};
+struct _9p_tgetlock {
+ guint32 fid;
+ guint8 type;
+ guint64 start;
+ guint64 length;
+ guint32 proc_id;
+ struct _9p_str client_id;
+};
+struct _9p_rgetlock {
+ guint8 type;
+ guint64 start;
+ guint64 length;
+ guint32 proc_id;
+ struct _9p_str client_id;
+};
+struct _9p_tlink {
+ guint32 dfid;
+ guint32 fid;
+ struct _9p_str name;
+};
+struct _9p_rlink {
+};
+struct _9p_tmkdir {
+ guint32 fid;
+ struct _9p_str name;
+ guint32 mode;
+ guint32 gid;
+};
+struct _9p_rmkdir {
+ struct _9p_qid qid;
+};
+struct _9p_trenameat {
+ guint32 olddirfid;
+ struct _9p_str oldname;
+ guint32 newdirfid;
+ struct _9p_str newname;
+};
+struct _9p_rrenameat {
+};
+struct _9p_tunlinkat {
+ guint32 dirfid;
+ struct _9p_str name;
+ guint32 flags;
+};
+struct _9p_runlinkat {
+};
+struct _9p_tawrite {
+ guint32 fid;
+ guint8 datacheck;
+ guint64 offset;
+ guint32 count;
+ guint32 rsize;
+ guint8 *data;
+ guint32 check;
+};
+struct _9p_rawrite {
+ guint32 count;
+};
+struct _9p_tversion {
+ guint32 msize ;
+ struct _9p_str version ;
+};
+struct _9p_rversion {
+ guint32 msize;
+ struct _9p_str version;
+};
+struct _9p_tauth {
+ guint32 afid;
+ struct _9p_str uname;
+ struct _9p_str aname;
+ guint32 n_uname; /* 9P2000.u extensions */
+};
+struct _9p_rauth {
+ struct _9p_qid qid;
+};
+struct _9p_rerror {
+ struct _9p_str error;
+ guint32 errnum; /* 9p2000.u extension */
+};
+struct _9p_tflush {
+ guint16 oldtag;
+};
+struct _9p_rflush {
+};
+struct _9p_tattach {
+ guint32 fid;
+ guint32 afid;
+ struct _9p_str uname;
+ struct _9p_str aname;
+ guint32 n_uname; /* 9P2000.u extensions */
+};
+struct _9p_rattach {
+ struct _9p_qid qid;
+};
+struct _9p_twalk {
+ guint32 fid;
+ guint32 newfid;
+ guint16 nwname;
+ struct _9p_str wnames[_9P_MAXWELEM];
+};
+struct _9p_rwalk {
+ guint16 nwqid;
+ struct _9p_qid wqids[_9P_MAXWELEM];
+};
+struct _9p_topen {
+ guint32 fid;
+ guint8 mode;
+};
+struct _9p_ropen {
+ struct _9p_qid qid;
+ guint32 iounit;
+};
+struct _9p_tcreate {
+ guint32 fid;
+ struct _9p_str name;
+ guint32 perm;
+ guint8 mode;
+ struct _9p_str extension;
+};
+struct _9p_rcreate {
+ struct _9p_qid qid;
+ guint32 iounit;
+};
+struct _9p_tread {
+ guint32 fid;
+ guint64 offset;
+ guint32 count;
+};
+struct _9p_rread {
+ guint32 count;
+ guint8 *data;
+};
+struct _9p_twrite {
+ guint32 fid;
+ guint64 offset;
+ guint32 count;
+ guint8 *data;
+};
+struct _9p_rwrite {
+ guint32 count;
+};
+struct _9p_tclunk {
+ guint32 fid;
+};
+struct _9p_rclunk {
+};
+struct _9p_tremove {
+ guint32 fid;
+};
+struct _9p_rremove {
+};
+
+union _9p_tmsg {
+} ;
#define NINEPORT 564
@@ -40,49 +784,6 @@
void proto_register_9P(void);
void proto_reg_handoff_9P(void);
-/*Message types for 9P */
-/*See man 5 intro on Plan 9 - or;
- http://www.cs.bell-labs.com/sys/man/5/INDEX.html
-*/
-enum {
- TVERSION = 100,
- RVERSION = 101,
- TAUTH = 102,
- RAUTH = 103,
- TATTACH = 104,
- RATTACH = 105,
- TERROR = 106, /* Not used */
- RERROR = 107,
- TFLUSH = 108,
- RFLUSH = 109,
- TWALK = 110,
- RWALK = 111,
- TOPEN = 112,
- ROPEN,
- TCREATE = 114,
- RCREATE,
- TREAD = 116,
- RREAD,
- TWRITE = 118,
- RWRITE,
- TCLUNK = 120,
- RCLUNK,
- TREMOVE = 122,
- RREMOVE,
- TSTAT = 124,
- RSTAT,
- TWSTAT = 126,
- RWSTAT
-};
-/* File open modes */
-#define P9_OREAD 0x0
-#define P9_OWRITE 0x1
-#define P9_ORDWR 0x2
-#define P9_OEXEC 0x3
-#define P9_MODEMASK 0x3
-#define P9_OTRUNC 0x10
-#define P9_ORCLOSE 0x40
-
/* Initialize the protocol and registered fields */
static int proto_9P = -1;
static int hf_9P_msgsz = -1;
@@ -129,6 +830,8 @@ static int hf_9P_stattype = -1;
static int hf_9P_statmode = -1;
static int hf_9P_atime = -1;
static int hf_9P_mtime = -1;
+static int hf_9P_ctime = -1;
+static int hf_9P_btime = -1;
static int hf_9P_length = -1;
static int hf_9P_dev = -1;
static int hf_9P_wname = -1;
@@ -137,14 +840,85 @@ static int hf_9P_afid = -1;
static int hf_9P_uname = -1;
static int hf_9P_aname = -1;
static int hf_9P_ename = -1;
+static int hf_9P_enum = -1;
static int hf_9P_name = -1;
static int hf_9P_filename = -1;
static int hf_9P_sdlen = -1;
+static int hf_9P_user = -1;
+static int hf_9P_group = -1;
static int hf_9P_uid = -1;
static int hf_9P_gid = -1;
static int hf_9P_muid = -1;
static int hf_9P_nwalk = -1;
static int hf_9P_newfid = -1;
+static int hf_9P_dfid = -1;
+static int hf_9P_getattr_flags = -1;
+static int hf_9P_getattr_mode = -1;
+static int hf_9P_getattr_nlink = -1;
+static int hf_9P_getattr_uid = -1;
+static int hf_9P_getattr_gid = -1;
+static int hf_9P_getattr_rdev = -1;
+static int hf_9P_getattr_atime = -1;
+static int hf_9P_getattr_mtime = -1;
+static int hf_9P_getattr_ctime = -1;
+static int hf_9P_getattr_ino = -1;
+static int hf_9P_getattr_size = -1;
+static int hf_9P_getattr_blocks = -1;
+static int hf_9P_getattr_btime = -1;
+static int hf_9P_getattr_gen = -1;
+static int hf_9P_getattr_dataversion = -1;
+static int hf_9P_setattr_flags = -1;
+static int hf_9P_setattr_mode = -1;
+static int hf_9P_setattr_uid = -1;
+static int hf_9P_setattr_gid = -1;
+static int hf_9P_setattr_size = -1;
+static int hf_9P_setattr_atime = -1;
+static int hf_9P_setattr_mtime = -1;
+static int hf_9P_setattr_ctime = -1;
+static int hf_9P_setattr_atime_set = -1;
+static int hf_9P_setattr_mtime_set = -1;
+static int hf_9P_nlink = -1;
+static int hf_9P_rdev = -1;
+static int hf_9P_size = -1;
+static int hf_9P_blksize = -1;
+static int hf_9P_blocks = -1;
+static int hf_9P_gen = -1;
+static int hf_9P_dataversion = -1;
+static int hf_9P_fstype = -1;
+static int hf_9P_bfree = -1;
+static int hf_9P_bavail = -1;
+static int hf_9P_files = -1;
+static int hf_9P_ffree = -1;
+static int hf_9P_fsid = -1;
+static int hf_9P_namelen = -1;
+static int hf_9P_mknod_major = -1;
+static int hf_9P_mknod_minor = -1;
+static int hf_9P_lflags = -1;
+static int hf_9P_lflags_rdonly = -1;
+static int hf_9P_lflags_wronly = -1;
+static int hf_9P_lflags_rdwr = -1;
+static int hf_9P_lflags_create = -1;
+static int hf_9P_lflags_excl = -1;
+static int hf_9P_lflags_noctty = -1;
+static int hf_9P_lflags_trunc = -1;
+static int hf_9P_lflags_append = -1;
+static int hf_9P_lflags_nonblock = -1;
+static int hf_9P_lflags_dsync = -1;
+static int hf_9P_lflags_fasync = -1;
+static int hf_9P_lflags_direct = -1;
+static int hf_9P_lflags_largefile = -1;
+static int hf_9P_lflags_directory = -1;
+static int hf_9P_lflags_nofollow = -1;
+static int hf_9P_lflags_noatime = -1;
+static int hf_9P_lflags_cloexec = -1;
+static int hf_9P_lflags_sync = -1;
+static int hf_9P_xattr_flag = -1;
+static int hf_9P_lock_type = -1;
+static int hf_9P_lock_flag = -1;
+static int hf_9P_lock_start = -1;
+static int hf_9P_lock_length = -1;
+static int hf_9P_lock_procid = -1;
+static int hf_9P_lock_status = -1;
/*handle for dissecting data in 9P msgs*/
static dissector_handle_t data_handle;
@@ -157,92 +931,255 @@ static gint ett_9P_wname = -1;
static gint ett_9P_aname = -1;
static gint ett_9P_ename = -1;
static gint ett_9P_uname = -1;
-static gint ett_9P_uid = -1;
-static gint ett_9P_gid = -1;
+static gint ett_9P_user = -1;
+static gint ett_9P_group = -1;
static gint ett_9P_muid = -1;
static gint ett_9P_filename = -1;
static gint ett_9P_version = -1;
static gint ett_9P_qid = -1;
static gint ett_9P_qidtype = -1;
+static gint ett_9P_getattr_flags = -1;
+static gint ett_9P_setattr_flags = -1;
+static gint ett_9P_lflags = -1;
-/*9P Msg types to name mapping */
-static const value_string ninep_msg_type[] =
-{ {TVERSION, "Tversion"},
- {RVERSION, "Rversion"},
- {TAUTH, "Tauth"},
- {RAUTH, "Rauth"},
- {TATTACH, "Tattach"},
- {RATTACH, "Rattach"},
- {RERROR, "Rerror"},
- {TFLUSH, "Tflush"},
- {RFLUSH, "Rflush"},
- {TWALK, "Twalk"},
- {RWALK, "Rwalk"},
- {TOPEN, "Topen"},
- {ROPEN, "Ropen"},
- {TCREATE, "Tcreate"},
- {RCREATE, "Rcreate"},
- {TREAD, "Tread"},
- {RREAD, "Rread"},
- {TWRITE, "Twrite"},
- {RWRITE, "Rwrite"},
- {TCLUNK, "Tclunk"},
- {RCLUNK, "Rclunk"},
- {TREMOVE, "Tremove"},
- {RREMOVE, "Rremove"},
- {TSTAT, "Tstat"},
- {RSTAT, "Rstat"},
- {TWSTAT, "Twstat"},
- {RWSTAT, "Rwstat"},
- {0, NULL},
-};
-static value_string_ext ninep_msg_type_ext = VALUE_STRING_EXT_INIT(ninep_msg_type);
-/* Open/Create modes */
-static const value_string ninep_mode_vals[] =
-{
- {P9_OREAD, "Read Access"},
- {P9_OWRITE, "Write Access"},
- {P9_ORDWR, "Read/Write Access "},
- {P9_OEXEC, "Execute Access"},
- {0, NULL}
-};
+static GHashTable *_9p_hashtable = NULL;
static void dissect_9P_mode(tvbuff_t * tvb, proto_item * tree,int offset);
static void dissect_9P_dm(tvbuff_t * tvb, proto_item * tree,int offset,int iscreate);
static void dissect_9P_qid(tvbuff_t * tvb, proto_tree * tree,int offset);
+static void dissect_9P_lflags(tvbuff_t * tvb, proto_tree * tree, int offset);
+static void dissect_9P_getattrflags(tvbuff_t * tvb, proto_tree * tree, int offset);
+static void dissect_9P_setattrflags(tvbuff_t * tvb, proto_tree * tree, int offset);
+
+struct _9p_hashkey {
+ guint32 conv_index;
+ guint16 tag;
+ guint32 fid;
+};
+
+struct _9p_hashval {
+ int len;
+ char *data;
+};
+
+struct _9p_taginfo {
+ enum _9p_msg_t msgtype;
+ guint32 fid;
+};
+
+static gint _9p_hash_equal(gconstpointer k1, gconstpointer k2) {
+ const struct _9p_hashkey *key1 = (struct _9p_hashkey *)k1, *key2 = (struct _9p_hashkey *)k2;
+
+ return ((key1->conv_index == key2->conv_index) && (key1->tag == key2->tag) && (key1->fid == key2->fid));
+}
+
+static guint _9p_hash_hash(gconstpointer k)
+{
+ const struct _9p_hashkey *key = (struct _9p_hashkey *)k;
+
+ return (key->conv_index ^ key->tag ^ key->fid);
+}
+
+static gboolean _9p_hash_free_all(gpointer key _U_, gpointer value _U_, gpointer user_data _U_)
+{
+ return TRUE;
+}
+
+static void _9p_hash_free_val(gpointer value)
+{
+ struct _9p_hashval *val = (struct _9p_hashval *)value;
+
+ if (val->data) {
+ g_free(val->data);
+ val->data = NULL;
+ }
+
+ g_free(value);
+}
+
+static struct _9p_hashval *_9p_hash_new_val(int len)
+{
+ struct _9p_hashval *val;
+ val = (struct _9p_hashval *)g_malloc(sizeof(struct _9p_hashval));
+
+ val->data = (char *)g_malloc(len);
+ val->len = len;
+
+ return val;
+}
+
+static void _9p_hash_init(void)
+{
+ if (_9p_hashtable != NULL) {
+ g_hash_table_foreach_remove(_9p_hashtable, _9p_hash_free_all, NULL);
+ } else {
+ _9p_hashtable = g_hash_table_new_full(_9p_hash_hash, _9p_hash_equal, g_free, _9p_hash_free_val);
+ }
+}
+
+static void _9p_hash_set(packet_info *pinfo, guint16 tag, guint32 fid, struct _9p_hashval *val)
+{
+ struct _9p_hashkey *key;
+ struct _9p_hashval *oldval;
+ conversation_t *conv;
+
+ conv = find_or_create_conversation(pinfo);
+
+ key = (struct _9p_hashkey *)g_malloc(sizeof(struct _9p_hashkey));
+
+ key->conv_index = conv->index;
+ key->tag = tag;
+ key->fid = fid;
+
+ /* remove eventual old entry */
+ oldval = (struct _9p_hashval *)g_hash_table_lookup(_9p_hashtable, key);
+ if (oldval) {
+ g_hash_table_remove(_9p_hashtable, key);
+ }
+ g_hash_table_insert(_9p_hashtable, key, val);
+}
+
+static struct _9p_hashval *_9p_hash_get(packet_info *pinfo, guint16 tag, guint32 fid)
+{
+ struct _9p_hashkey key;
+ conversation_t *conv;
+
+ conv = find_or_create_conversation(pinfo);
+
+ key.conv_index = conv->index;
+ key.tag = tag;
+ key.fid = fid;
+
+ return (struct _9p_hashval *)g_hash_table_lookup(_9p_hashtable, &key);
+}
+
+static void _9p_hash_free(packet_info *pinfo, guint16 tag, guint32 fid)
+{
+ struct _9p_hashkey key;
+ conversation_t *conv;
+
+ conv = find_or_create_conversation(pinfo);
+
+ key.conv_index = conv->index;
+ key.tag = tag;
+ key.fid = fid;
+
+ g_hash_table_remove(_9p_hashtable, &key);
+}
+
+static void conv_set_version(packet_info *pinfo, enum _9p_version version)
+{
+ struct _9p_hashval *val;
+
+ val = _9p_hash_new_val(sizeof(version));
+
+ *(int*)val->data = version;
+
+ _9p_hash_set(pinfo, _9P_NOTAG, _9P_NOFID, val);
+}
+
+static enum _9p_version conv_get_version(packet_info *pinfo)
+{
+ struct _9p_hashval *val;
+
+ val = _9p_hash_get(pinfo, _9P_NOTAG, _9P_NOFID);
+
+ return val ? *(enum _9p_version*)val->data : _9P;
+}
+
+static void conv_set_fid(packet_info *pinfo, guint32 fid, const char *path, int len)
+{
+ struct _9p_hashval *val;
+
+ val = _9p_hash_new_val(len);
+
+ /* Check this is len long? */
+ g_strlcpy(val->data, path, len);
+
+ _9p_hash_set(pinfo, _9P_NOTAG, fid, val);
+}
+
+static char *conv_get_fid(packet_info *pinfo, guint32 fid)
+{
+ struct _9p_hashval *val;
+
+ val = _9p_hash_get(pinfo, _9P_NOTAG, fid);
+
+ return val ? val->data : (char*)"";
+}
+
+static inline void conv_free_fid(packet_info *pinfo, guint32 fid)
+{
+ if (fid != _9P_NOFID)
+ _9p_hash_free(pinfo, _9P_NOTAG, fid);
+}
+
+static void conv_set_tag(packet_info *pinfo, guint16 tag, enum _9p_msg_t msgtype, guint32 fid)
+{
+ struct _9p_hashval *val;
+ struct _9p_taginfo *taginfo;
+
+ val = _9p_hash_new_val(sizeof(struct _9p_taginfo));
+ taginfo = (struct _9p_taginfo*)val->data;
+
+ taginfo->msgtype = msgtype;
+ taginfo->fid = fid;
+
+ _9p_hash_set(pinfo, tag, _9P_NOFID, val);
+}
+
+static inline struct _9p_taginfo *conv_get_tag(packet_info *pinfo, guint16 tag)
+{
+ struct _9p_hashval *val;
+
+ /* check that length matches? */
+ val = _9p_hash_get(pinfo, tag, _9P_NOFID);
+
+ return val ? (struct _9p_taginfo*)val->data : NULL;
+}
+
+static inline void conv_free_tag(packet_info *pinfo, guint16 tag)
+{
+ _9p_hash_free(pinfo, tag, _9P_NOFID);
+}
/* Dissect 9P messages*/
static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, void * data _U_)
{
- guint32 /*ninesz,*/tmp,i;
- guint16 tmp16;
- guint8 ninemsg;
+ guint32 /*ninesz,*/tmp, i, fid;
+ guint16 tmp16, tag;
+ enum _9p_msg_t ninemsg;
guint offset = 0;
const char *mname;
- gint len,reportedlen;
+ char *tmppath, *tmps;
+ gint len, reportedlen;
tvbuff_t *next_tvb;
proto_item *ti;
- proto_tree *ninep_tree,*tmp_tree;
+ proto_tree *ninep_tree, *tmp_tree;
nstime_t tv;
+ struct _9p_taginfo *taginfo;
+ int _9p_version = conv_get_version(pinfo);
+
+ col_set_str(pinfo->cinfo, COL_PROTOCOL, val_to_str_ext_const(_9p_version, &ninep_version_ext, "9P"));
- col_set_str(pinfo->cinfo, COL_PROTOCOL, "9P");
col_clear(pinfo->cinfo, COL_INFO);
/*ninesz = tvb_get_letohl(tvb, offset);*/
- ninemsg = tvb_get_guint8(tvb, offset + 4);
+ ninemsg = (enum _9p_msg_t)tvb_get_guint8(tvb, offset + 4);
mname = val_to_str_ext_const(ninemsg, &ninep_msg_type_ext, "Unknown");
if(strcmp(mname,"Unknown") == 0) {
- col_add_fstr(pinfo->cinfo, COL_INFO, "9P Data Continuation(?) (Tag %u)",(guint)ninemsg);
+ col_add_fstr(pinfo->cinfo, COL_INFO, "9P Data (Message type %u)",(guint)ninemsg);
return 0;
}
- col_append_fstr(pinfo->cinfo, COL_INFO, "%s Tag=%u",mname,(guint)tvb_get_letohs(tvb,offset+5));
+ tag = tvb_get_letohs(tvb,offset+5);
+ col_append_fstr(pinfo->cinfo, COL_INFO, "%s Tag=%u",mname,(guint)tag);
- if (!tree) /*not much more of one line summary interrest yet.. */
+ if (!tree) /*not much more of one line summary interest yet.. */
return 0;
ti = proto_tree_add_item(tree, proto_9P, tvb, 0, -1, ENC_NA);
@@ -256,18 +1193,32 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
offset += 2;
switch(ninemsg) {
- case RVERSION:
- case TVERSION:
+ case _9P_RVERSION:
+ case _9P_TVERSION:
proto_tree_add_item(ninep_tree, hf_9P_maxsize, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset +=4;
tmp16 = tvb_get_letohs(tvb,offset);
+ tmps = tvb_get_string(tvb, offset+2, tmp16);
ti = proto_tree_add_item(ninep_tree, hf_9P_version, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
tmp_tree = proto_item_add_subtree(ti,ett_9P_version);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += 2;
+
+ if (!strncmp(tmps, "9P2000", tmp16)) {
+ tmp = _9P2000;
+ } else if (!strncmp(tmps, "9P2000.L", tmp16)) {
+ tmp = _9P2000_L;
+ } else if (!strncmp(tmps, "9P2000.u", tmp16)) {
+ tmp = _9P2000_u;
+ } else {
+ tmp = _9P;
+ }
+
+ conv_set_version(pinfo, (enum _9p_version)tmp);
+ g_free(tmps);
break;
- case TAUTH:
+ case _9P_TAUTH:
proto_tree_add_item(ninep_tree, hf_9P_afid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset +=4;
@@ -282,25 +1233,36 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
tmp_tree = proto_item_add_subtree(ti,ett_9P_aname);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset +=2;
+
+ conv_set_tag(pinfo, tag, ninemsg, _9P_NOFID);
break;
- case RAUTH:
- dissect_9P_qid(tvb,ninep_tree,offset);
- offset += 13;
- break;
- case RERROR:
- tmp16 = tvb_get_letohs(tvb,offset);
- ti = proto_tree_add_item(ninep_tree, hf_9P_ename, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
- tmp_tree = proto_item_add_subtree(ti,ett_9P_ename);
- proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
- offset +=2;
+ case _9P_RERROR:
+ if (_9p_version == _9P2000_L) {
+ tmp = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_enum, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", g_strerror(tmp));
+ offset += 4;
+ } else {
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_ename, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti,ett_9P_ename);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += 2 + tmp16;
+ }
+
+ taginfo = conv_get_tag(pinfo, tag);
+ if (taginfo && (taginfo->msgtype == _9P_TWALK || taginfo->msgtype == _9P_TATTACH))
+ conv_free_fid(pinfo, taginfo->fid);
break;
- case TFLUSH:
+ case _9P_TFLUSH:
+ tmp16 = tvb_get_letohs(tvb, offset);
proto_tree_add_item(ninep_tree, hf_9P_oldtag, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ conv_set_tag(pinfo, tag, ninemsg, _9P_NOFID);
+ conv_free_tag(pinfo, tmp16);
break;
- case RFLUSH:
- break;
- case TATTACH:
+ case _9P_TATTACH:
+ fid = tvb_get_letohl(tvb, offset);
proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset +=4;
@@ -314,19 +1276,25 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
offset += tmp16 + 2;
tmp16 = tvb_get_letohs(tvb,offset);
+ tmps = tvb_get_string(tvb, offset+2, tmp16);
+ conv_set_fid(pinfo, fid, tmps, tmp16+1);
+ g_free(tmps);
ti = proto_tree_add_item(ninep_tree, hf_9P_aname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
tmp_tree = proto_item_add_subtree(ti,ett_9P_aname);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case RATTACH:
- dissect_9P_qid(tvb,ninep_tree,offset);
- offset += 13;
- break;
- case TWALK:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ case _9P_TWALK:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset +=4;
+ tmppath = (char*)g_malloc(MAXPATHLEN);
+ len = g_strlcpy(tmppath, conv_get_fid(pinfo, fid), MAXPATHLEN);
+ proto_item_append_text(ti, " (%s)", tmppath);
+
+ fid = tvb_get_letohl(tvb, offset);
proto_tree_add_item(ninep_tree, hf_9P_newfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset +=4;
@@ -343,19 +1311,26 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
for(i = 0 ; i < tmp16; i++) {
guint16 tmplen;
- proto_item *wname;
- proto_tree *wname_tree;
tmplen = tvb_get_letohs(tvb,offset);
- wname = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmplen, ENC_UTF_8|ENC_NA);
- wname_tree = proto_item_add_subtree(wname,ett_9P_wname);
- proto_tree_add_item(wname_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmplen, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+
+ tmps = tvb_get_string(tvb, offset+2, tmplen);
+ len += g_strlcat(tmppath, "/", MAXPATHLEN);
+ len += g_strlcat(tmppath, tmps, MAXPATHLEN);
+ g_free(tmps);
offset += tmplen + 2;
}
+ conv_set_fid(pinfo, fid, tmppath, len+1);
+ g_free(tmppath);
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case RWALK:
+ case _9P_RWALK:
tmp16 = tvb_get_letohs(tvb,offset);
proto_tree_add_item(ninep_tree, hf_9P_nqid, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset +=2;
@@ -371,20 +1346,37 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
dissect_9P_qid(tvb,ninep_tree,offset);
offset += 13;
}
+ conv_free_tag(pinfo, tag);
break;
- case TOPEN:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ case _9P_TLOPEN:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
offset +=4;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_lflags(tvb,ti,offset);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TOPEN:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset +=4;
+
ti = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
dissect_9P_mode(tvb,ti,offset);
+ offset += 1;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case ROPEN:
- dissect_9P_qid(tvb,ninep_tree,offset);
- offset += 13;
- proto_tree_add_item(ninep_tree, hf_9P_iounit, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- break;
- case TCREATE:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ case _9P_TCREATE:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
offset +=4;
tmp16 = tvb_get_letohs(tvb,offset);
@@ -399,23 +1391,56 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
ti = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, ENC_LITTLE_ENDIAN);
dissect_9P_mode(tvb,ti,offset);
+ offset +=1;
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case RCREATE:
- dissect_9P_qid(tvb,ninep_tree,offset);
- offset += 13;
- proto_tree_add_item(ninep_tree, hf_9P_iounit, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+
+ case _9P_TLCREATE:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset +=4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_name, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti,ett_9P_filename);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_lflags, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_lflags(tvb, ti, offset);
+ offset += 4;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_dm(tvb,ti,offset,0);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case TREAD:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+
+ case _9P_TREAD:
+ case _9P_TREADDIR:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
offset +=4;
proto_tree_add_item(ninep_tree, hf_9P_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN);
offset +=8;
proto_tree_add_item(ninep_tree, hf_9P_count, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset +=4;
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case RREAD:
+ case _9P_RREAD:
+ case _9P_RREADDIR:
tmp = tvb_get_letohl(tvb,offset);
proto_tree_add_item(ninep_tree, hf_9P_count, tvb, offset, 4, ENC_LITTLE_ENDIAN);
offset += 4;
@@ -424,9 +1449,12 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
reportedlen = ((gint)tmp&0xffff) > len ? len : (gint)tmp&0xffff;
next_tvb = tvb_new_subset(tvb, offset, len, reportedlen);
call_dissector(data_handle,next_tvb, pinfo, tree);
+ conv_free_tag(pinfo, tag);
break;
- case TWRITE:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ case _9P_TWRITE:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
offset +=4;
proto_tree_add_item(ninep_tree, hf_9P_offset, tvb, offset, 8, ENC_LITTLE_ENDIAN);
@@ -439,26 +1467,14 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
reportedlen = ((gint)tmp&0xffff) > len ? len : (gint)tmp&0xffff;
next_tvb = tvb_new_subset(tvb, offset, len, reportedlen);
call_dissector(data_handle,next_tvb, pinfo, tree);
+ conv_set_tag(pinfo, tag, ninemsg, fid);
break;
- case RWRITE:
+ case _9P_RWRITE:
proto_tree_add_item(ninep_tree, hf_9P_count, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ conv_free_tag(pinfo, tag);
break;
- case TCLUNK:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- break;
- case RCLUNK:
- break;
- case TREMOVE:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
-
- break;
- case RREMOVE:
- break;
- case TSTAT:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- break;
- case RSTAT:
+ case _9P_RSTAT:
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset +=2;
@@ -498,14 +1514,14 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
offset += tmp16+2;
tmp16 = tvb_get_letohs(tvb,offset);
- ti = proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
- tmp_tree = proto_item_add_subtree(ti,ett_9P_uid);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_user, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti,ett_9P_user);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
tmp16 = tvb_get_letohs(tvb,offset);
- ti = proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
- tmp_tree = proto_item_add_subtree(ti,ett_9P_gid);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_group, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti,ett_9P_group);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
@@ -515,8 +1531,10 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
break;
- case TWSTAT:
- proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ case _9P_TWSTAT:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
offset += 4;
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
@@ -558,14 +1576,14 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
offset += tmp16+2;
tmp16 = tvb_get_letohs(tvb,offset);
- ti = proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
- tmp_tree = proto_item_add_subtree(ti,ett_9P_uid);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_user, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti,ett_9P_user);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
tmp16 = tvb_get_letohs(tvb,offset);
- ti = proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
- tmp_tree = proto_item_add_subtree(ti,ett_9P_gid);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_group, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti,ett_9P_group);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
@@ -574,6 +1592,494 @@ static int dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree, vo
tmp_tree = proto_item_add_subtree(ti,ett_9P_muid);
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
offset += tmp16+2;
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_TGETATTR:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_getattr_flags, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ dissect_9P_getattrflags(tvb,ti,offset);
+ offset += 8;
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_RGETATTR:
+ ti = proto_tree_add_item(ninep_tree, hf_9P_getattr_flags, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ dissect_9P_getattrflags(tvb,ti,offset);
+ offset += 8;
+
+ dissect_9P_qid(tvb,ninep_tree,offset);
+ offset += 13;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_dm(tvb,ti,offset,0);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_nlink, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_rdev, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_size, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_blksize, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_blocks, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ tv.secs = tvb_get_letoh64(tvb,offset);
+ tv.nsecs = tvb_get_letoh64(tvb,offset+8);;
+ proto_tree_add_time(ninep_tree, hf_9P_atime, tvb, offset, 16, &tv);
+ offset += 16;
+
+ tv.secs = tvb_get_letoh64(tvb,offset);
+ tv.nsecs = tvb_get_letoh64(tvb,offset+8);;
+ proto_tree_add_time(ninep_tree, hf_9P_mtime, tvb, offset, 16, &tv);
+ offset += 16;
+
+ tv.secs = tvb_get_letoh64(tvb,offset);
+ tv.nsecs = tvb_get_letoh64(tvb,offset+8);;
+ proto_tree_add_time(ninep_tree, hf_9P_ctime, tvb, offset, 16, &tv);
+ offset += 16;
+
+ tv.secs = tvb_get_letoh64(tvb,offset);
+ tv.nsecs = tvb_get_letoh64(tvb,offset+8);;
+ proto_tree_add_time(ninep_tree, hf_9P_btime, tvb, offset, 16, &tv);
+ offset += 16;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gen, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_dataversion, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_TSETATTR:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_setattr_flags, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_setattrflags(tvb,ti,offset);
+ offset += 4;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_dm(tvb,ti,offset,0);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_size, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ tv.secs = tvb_get_letoh64(tvb,offset);
+ tv.nsecs = tvb_get_letoh64(tvb,offset+8);;
+ proto_tree_add_time(ninep_tree, hf_9P_atime, tvb, offset, 16, &tv);
+ offset += 16;
+
+ tv.secs = tvb_get_letoh64(tvb,offset);
+ tv.nsecs = tvb_get_letoh64(tvb,offset+8);;
+ proto_tree_add_time(ninep_tree, hf_9P_mtime, tvb, offset, 16, &tv);
+ offset += 16;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_RSTATFS:
+ proto_tree_add_item(ninep_tree, hf_9P_fstype, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_blksize, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_blocks, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_bfree, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_bavail, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_files, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_ffree, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_fsid, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_namelen, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_TSYMLINK:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TMKNOD:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_dm(tvb,ti,offset,0);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_mknod_major, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_mknod_minor, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TRENAME:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_dfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_RREADLINK:
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_TXATTRWALK:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ tmps = conv_get_fid(pinfo, fid);
+ proto_item_append_text(ti, " (%s)", tmps);
+ offset +=4;
+
+ fid = tvb_get_letohl(tvb, offset);
+ proto_tree_add_item(ninep_tree, hf_9P_newfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ conv_set_fid(pinfo, fid, tmps, strlen(tmps)+1);
+ offset +=4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_RXATTRWALK:
+ proto_tree_add_item(ninep_tree, hf_9P_size, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_TXATTRCREATE:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset +=4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ proto_tree_add_item(ninep_tree, hf_9P_size, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_xattr_flag, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TLOCK:
+ case _9P_TGETLOCK:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_flag, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_start, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_length, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_procid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_RLOCK:
+ proto_tree_add_item(ninep_tree, hf_9P_lock_status, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_RGETLOCK:
+ proto_tree_add_item(ninep_tree, hf_9P_lock_type, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ offset += 1;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_flag, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_start, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_length, tvb, offset, 8, ENC_LITTLE_ENDIAN);
+ offset += 8;
+
+ proto_tree_add_item(ninep_tree, hf_9P_lock_procid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_free_tag(pinfo, tag);
+ break;
+
+ case _9P_TLINK:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_dfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TMKDIR:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ dissect_9P_dm(tvb,ti,offset,0);
+ offset += 4;
+
+ proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TRENAMEAT:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_dfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_newfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TUNLINKAT:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_dfid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ offset += 4;
+
+ tmp16 = tvb_get_letohs(tvb,offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmp16, ENC_UTF_8|ENC_NA);
+ tmp_tree = proto_item_add_subtree(ti, ett_9P_wname);
+ proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, ENC_LITTLE_ENDIAN);
+ offset += tmp16 + 2;
+
+ /* missing 32bit flag, no clue what meaning it has */
+
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ /* Request with only fid */
+ case _9P_TSTATFS:
+ case _9P_TREADLINK:
+ case _9P_TFSYNC:
+ case _9P_TREMOVE:
+ case _9P_TSTAT:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ case _9P_TCLUNK:
+ fid = tvb_get_letohl(tvb, offset);
+ ti = proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_item_append_text(ti, " (%s)", conv_get_fid(pinfo, fid));
+
+ conv_free_fid(pinfo, fid);
+ conv_set_tag(pinfo, tag, ninemsg, fid);
+ break;
+
+ /* Reply with qid and ionuit */
+ case _9P_ROPEN:
+ case _9P_RLOPEN:
+ case _9P_RCREATE:
+ case _9P_RLCREATE:
+ dissect_9P_qid(tvb,ninep_tree,offset);
+ offset += 13;
+ proto_tree_add_item(ninep_tree, hf_9P_iounit, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ offset += 4;
+ conv_free_tag(pinfo, tag);
+ break;
+
+ /* Reply with only qid */
+ case _9P_RSYMLINK:
+ case _9P_RMKNOD:
+ case _9P_RMKDIR:
+ case _9P_RAUTH:
+ case _9P_RATTACH:
+ dissect_9P_qid(tvb,ninep_tree,offset);
+ offset += 13;
+ conv_free_tag(pinfo, tag);
+ break;
+
+ /* Empty reply */
+ case _9P_RRENAME:
+ case _9P_RSETATTR:
+ case _9P_RXATTRCREATE:
+ case _9P_RFSYNC:
+ case _9P_RLINK:
+ case _9P_RRENAMEAT:
+ case _9P_RUNLINKAT:
+ case _9P_RFLUSH:
+ case _9P_RCLUNK:
+ case _9P_RREMOVE:
+ /* Unhandled reply */
+ case _9P_RWSTAT:
+ case _9P_RLERROR:
+ conv_free_tag(pinfo, tag);
+ break;
+
+ /* Should-not-happen query */
+ case _9P_TLERROR:
+ case _9P_TERROR:
+ conv_set_tag(pinfo, tag, ninemsg, _9P_NOFID);
break;
}
return offset;
@@ -615,12 +2121,12 @@ static void dissect_9P_qid(tvbuff_t * tvb, proto_tree * tree,int offset)
qidtype_item = proto_tree_add_item(qid_tree, hf_9P_qidtype, tvb, offset, 1, ENC_LITTLE_ENDIAN);
qidtype_tree = proto_item_add_subtree(qidtype_item,ett_9P_qidtype);
- proto_tree_add_item(qidtype_tree, hf_9P_qidtype_dir, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(qidtype_tree, hf_9P_qidtype_append, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(qidtype_tree, hf_9P_qidtype_exclusive, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(qidtype_tree, hf_9P_qidtype_mount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(qidtype_tree, hf_9P_qidtype_auth_file, tvb, offset, 1, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(qidtype_tree, hf_9P_qidtype_temp_file, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(qidtype_tree, hf_9P_qidtype_dir, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(qidtype_tree, hf_9P_qidtype_append, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(qidtype_tree, hf_9P_qidtype_exclusive, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(qidtype_tree, hf_9P_qidtype_mount, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(qidtype_tree, hf_9P_qidtype_auth_file, tvb, offset, 1, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(qidtype_tree, hf_9P_qidtype_temp_file, tvb, offset, 1, ENC_LITTLE_ENDIAN);
proto_tree_add_item(qid_tree, hf_9P_qidvers, tvb, offset+1, 4, ENC_LITTLE_ENDIAN);
proto_tree_add_item(qid_tree, hf_9P_qidpath, tvb, offset+1+4, 8, ENC_LITTLE_ENDIAN);
@@ -636,26 +2142,102 @@ static void dissect_9P_dm(tvbuff_t * tvb, proto_item * item,int offset,int iscr
if(!mode_tree)
return;
- proto_tree_add_item(mode_tree, hf_9P_dm_dir, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_dir, tvb, offset, 4, ENC_LITTLE_ENDIAN);
if(!iscreate) { /* Not applicable to Tcreate (?) */
- proto_tree_add_item(mode_tree, hf_9P_dm_append, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_exclusive, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_mount, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_auth_file, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_temp_file, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_append, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_exclusive, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_mount, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_auth_file, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_temp_file, tvb, offset, 4, ENC_LITTLE_ENDIAN);
}
- proto_tree_add_item(mode_tree, hf_9P_dm_read_owner, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_write_owner, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_exec_owner, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_read_group, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_write_group, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_exec_group, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_read_others, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_write_others, tvb, offset, 4, ENC_LITTLE_ENDIAN);
- proto_tree_add_item(mode_tree, hf_9P_dm_exec_others, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_read_owner, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_write_owner, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_exec_owner, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_read_group, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_write_group, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_exec_group, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_read_others, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_write_others, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(mode_tree, hf_9P_dm_exec_others, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+}
+
+/* Dissect 9P getattr_flags */
+static void dissect_9P_getattrflags(tvbuff_t *tvb, proto_item *item, int offset)
+{
+ proto_item *attrmask_tree;
+
+ attrmask_tree = proto_item_add_subtree(item, ett_9P_getattr_flags);
+ if(!attrmask_tree)
+ return;
+
+ /* fixme: This is actually 8 bytes (64bit) long, but masks have to fit on 32bit. */
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_mode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_nlink, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_uid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_rdev, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_atime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_mtime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_ctime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_ino, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_blocks, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_btime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_gen, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_getattr_dataversion, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+}
+
+/* Dissect 9P setattr_flags */
+static void dissect_9P_setattrflags(tvbuff_t *tvb, proto_item *item, int offset)
+{
+ proto_item *attrmask_tree;
+
+ attrmask_tree = proto_item_add_subtree(item, ett_9P_setattr_flags);
+ if(!attrmask_tree)
+ return;
+
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_mode, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_uid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_gid, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_size, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_atime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_mtime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_ctime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_atime_set, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_setattr_mtime_set, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+}
+
+/* Dissect 9P lflags */
+static void dissect_9P_lflags(tvbuff_t *tvb, proto_item *item, int offset)
+{
+ proto_item *attrmask_tree;
+
+ attrmask_tree = proto_item_add_subtree(item, ett_9P_lflags);
+ if(!attrmask_tree)
+ return;
+
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_rdonly, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_wronly, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_rdwr, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_create, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_excl, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_noctty, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_trunc, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_append, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_nonblock, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_dsync, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_fasync, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_direct, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_largefile, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_directory, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_nofollow, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_noatime, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_cloexec, tvb, offset, 4, ENC_LITTLE_ENDIAN);
+ proto_tree_add_item(attrmask_tree, hf_9P_lflags_sync, tvb, offset, 4, ENC_LITTLE_ENDIAN);
}
+
/* Register 9P with Wireshark */
void proto_register_9P(void)
{
@@ -688,13 +2270,13 @@ void proto_register_9P(void)
{"Mode", "9p.mode", FT_UINT8, BASE_HEX, NULL, 0x0,
NULL, HFILL}},
{&hf_9P_mode_rwx,
- {"Open/Create Mode", "9p.mode.rwx", FT_UINT8, BASE_DEC,VALS(ninep_mode_vals),P9_MODEMASK,
+ {"Open/Create Mode", "9p.mode.rwx", FT_UINT8, BASE_OCT | BASE_EXT_STRING, &ninep_mode_vals_ext, _9P_MODEMASK,
NULL, HFILL}},
{&hf_9P_mode_t,
- {"Trunc", "9p.mode.trunc", FT_BOOLEAN, 8, TFS(&tfs_set_notset), P9_OTRUNC,
+ {"Trunc", "9p.mode.trunc", FT_BOOLEAN, 8, TFS(&tfs_set_notset), _9P_OTRUNC,
"Truncate", HFILL}},
{&hf_9P_mode_c,
- {"Remove on close", "9p.mode.orclose", FT_BOOLEAN, 8, TFS(&tfs_set_notset), P9_ORCLOSE,
+ {"Remove on close", "9p.mode.orclose", FT_BOOLEAN, 8, TFS(&tfs_set_notset), _9P_ORCLOSE,
NULL, HFILL}},
{&hf_9P_iounit,
{"I/O Unit", "9p.iounit", FT_UINT32, BASE_DEC, NULL, 0x0,
@@ -792,6 +2374,12 @@ void proto_register_9P(void)
{&hf_9P_mtime,
{"Mtime", "9p.mtime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
"Modified Time", HFILL}},
+ {&hf_9P_ctime,
+ {"Ctime", "9p.ctime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
+ "Creation Time", HFILL}},
+ {&hf_9P_btime,
+ {"Btime", "9p.btime", FT_ABSOLUTE_TIME, ABSOLUTE_TIME_LOCAL, NULL, 0x0,
+ "Btime (Synchronization information)", HFILL}},
{&hf_9P_length,
{"Length", "9p.length", FT_UINT64, BASE_DEC, NULL, 0x0,
"File Length", HFILL}},
@@ -816,6 +2404,9 @@ void proto_register_9P(void)
{&hf_9P_ename,
{"Ename", "9p.ename", FT_STRING, BASE_NONE, NULL, 0x0,
"Error", HFILL}},
+ {&hf_9P_enum,
+ {"Enum", "9p.enum", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Error", HFILL}},
{&hf_9P_name,
{"Name", "9p.name", FT_STRING, BASE_NONE, NULL, 0x0,
"Name of file", HFILL}},
@@ -825,11 +2416,17 @@ void proto_register_9P(void)
{&hf_9P_filename,
{"File name", "9p.filename", FT_STRING, BASE_NONE, NULL, 0x0,
NULL, HFILL}},
+ {&hf_9P_user,
+ {"User", "9p.user", FT_STRING, BASE_NONE, NULL, 0x0,
+ "User name", HFILL}},
+ {&hf_9P_group,
+ {"Group", "9p.group", FT_STRING, BASE_NONE, NULL, 0x0,
+ "Group name", HFILL}},
{&hf_9P_uid,
- {"Uid", "9p.uid", FT_STRING, BASE_NONE, NULL, 0x0,
+ {"Uid", "9p.uid", FT_UINT32, BASE_DEC, NULL, 0x0,
"User id", HFILL}},
{&hf_9P_gid,
- {"Gid", "9p.gid", FT_STRING, BASE_NONE, NULL, 0x0,
+ {"Gid", "9p.gid", FT_UINT32, BASE_DEC, NULL, 0x0,
"Group id", HFILL}},
{&hf_9P_muid,
{"Muid", "9p.muid", FT_STRING, BASE_NONE, NULL, 0x0,
@@ -837,10 +2434,214 @@ void proto_register_9P(void)
{&hf_9P_newfid,
{"New fid", "9p.newfid", FT_UINT32, BASE_DEC, NULL, 0x0,
"New file ID", HFILL}},
+ {&hf_9P_dfid,
+ {"Directory fid", "9p.dfid", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Directory ID", HFILL}},
{&hf_9P_nwalk,
{"Nr Walks", "9p.nwalk", FT_UINT32, BASE_DEC, NULL, 0x0,
- "Nr of walk items", HFILL}}
-
+ "Nr of walk items", HFILL}},
+ {&hf_9P_nlink,
+ {"nlink", "9p.nlink", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Number of links", HFILL}},
+ {&hf_9P_getattr_flags,
+ {"getattr_flags", "9p.getattr.flags", FT_UINT64, BASE_HEX, NULL, _9P_GETATTR_ALL,
+ "Getattr flags", HFILL}},
+ {&hf_9P_getattr_mode,
+ {"Mode", "9p.getattr.mode", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_MODE,
+ NULL, HFILL}},
+ {&hf_9P_getattr_nlink,
+ {"Nlink", "9p.getattr.nlink", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_NLINK,
+ NULL, HFILL}},
+ {&hf_9P_getattr_uid,
+ {"UID", "9p.getattr.uid", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_UID,
+ NULL, HFILL}},
+ {&hf_9P_getattr_gid,
+ {"GID", "9p.getattr.gid", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_GID,
+ NULL, HFILL}},
+ {&hf_9P_getattr_rdev,
+ {"Rdev", "9p.getattr.rdev", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_RDEV,
+ NULL, HFILL}},
+ {&hf_9P_getattr_atime,
+ {"Atime", "9p.getattr.atime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_ATIME,
+ NULL, HFILL}},
+ {&hf_9P_getattr_mtime,
+ {"Mtime", "9p.getattr.mtime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_MTIME,
+ NULL, HFILL}},
+ {&hf_9P_getattr_ctime,
+ {"Ctime", "9p.getattr.ctime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_CTIME,
+ NULL, HFILL}},
+ {&hf_9P_getattr_ino,
+ {"Inode", "9p.getattr.inode", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_INO,
+ NULL, HFILL}},
+ {&hf_9P_getattr_size,
+ {"Size", "9p.getattr.size", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_SIZE,
+ NULL, HFILL}},
+ {&hf_9P_getattr_blocks,
+ {"Blocks", "9p.getattr.blocks", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_BLOCKS,
+ NULL, HFILL}},
+ {&hf_9P_getattr_btime,
+ {"Btime", "9p.getattr.btime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_BTIME,
+ NULL, HFILL}},
+ {&hf_9P_getattr_gen,
+ {"Gen", "9p.getattr.gen", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_GEN,
+ NULL, HFILL}},
+ {&hf_9P_getattr_dataversion,
+ {"Data version", "9p.getattr.dataversion", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_GETATTR_DATA_VERSION,
+ NULL, HFILL}},
+ {&hf_9P_setattr_flags,
+ {"setattr_flags", "9p.setattr.flags", FT_UINT32, BASE_HEX, NULL, _9P_SETATTR_ALL,
+ "Setattr flags", HFILL}},
+ {&hf_9P_setattr_mode,
+ {"Mode", "9p.setattr.mode", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_MODE,
+ NULL, HFILL}},
+ {&hf_9P_setattr_uid,
+ {"UID", "9p.setattr.uid", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_UID,
+ NULL, HFILL}},
+ {&hf_9P_setattr_gid,
+ {"GID", "9p.setattr.gid", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_GID,
+ NULL, HFILL}},
+ {&hf_9P_setattr_size,
+ {"Size", "9p.setattr.size", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_SIZE,
+ NULL, HFILL}},
+ {&hf_9P_setattr_atime,
+ {"Atime", "9p.setattr.atime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_ATIME,
+ NULL, HFILL}},
+ {&hf_9P_setattr_mtime,
+ {"Mtime", "9p.setattr.mtime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_MTIME,
+ NULL, HFILL}},
+ {&hf_9P_setattr_ctime,
+ {"Ctime", "9p.setattr.ctime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_CTIME,
+ NULL, HFILL}},
+ {&hf_9P_setattr_atime_set,
+ {"Atime set", "9p.setattr.atimeset", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_ATIME_SET,
+ NULL, HFILL}},
+ {&hf_9P_setattr_mtime_set,
+ {"Mtime set", "9p.setattr.mtimeset", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_SETATTR_MTIME_SET,
+ NULL, HFILL}},
+ {&hf_9P_rdev,
+ {"rdev", "9p.rdev", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Device associated with file", HFILL}},
+ {&hf_9P_size,
+ {"Size", "9p.size", FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ {&hf_9P_blksize,
+ {"Blksize", "9p.blksize", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Block size", HFILL}},
+ {&hf_9P_blocks,
+ {"Blocks", "9p.blocks", FT_UINT64, BASE_DEC, NULL, 0x0,
+ NULL, HFILL}},
+ {&hf_9P_gen,
+ {"Gen", "9p.gen", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "inode generation number", HFILL}},
+ {&hf_9P_dataversion,
+ {"Dataversion", "9p.dataversion", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Data version", HFILL}},
+ {&hf_9P_fstype,
+ {"fstype", "9p.fstype", FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Filesystem type", HFILL}},
+ {&hf_9P_bfree,
+ {"bfree", "9p.bfree", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Free blocks", HFILL}},
+ {&hf_9P_bavail,
+ {"bavail", "9p.bavail", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Available blocks", HFILL}},
+ {&hf_9P_files,
+ {"files", "9p.files", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Total files", HFILL}},
+ {&hf_9P_ffree,
+ {"ffree", "9p.ffree", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Free files", HFILL}},
+ {&hf_9P_fsid,
+ {"fsid", "9p.fsid", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Filesystem id", HFILL}},
+ {&hf_9P_namelen,
+ {"namelen", "9p.namelen", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Max name length", HFILL}},
+ {&hf_9P_mknod_major,
+ {"mknod_major", "9p.mknod.major", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Major node number", HFILL}},
+ {&hf_9P_mknod_minor,
+ {"mknod_minor", "9p.mknod.minor", FT_UINT32, BASE_DEC, NULL, 0x0,
+ "Minor node number", HFILL}},
+ {&hf_9P_lflags,
+ {"lflags", "9p.lcreate.flags", FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Lcreate flags", HFILL}},
+ /* rdonly is 0x00, check instead that we are neither wronly nor rdwrite */
+ {&hf_9P_lflags_rdonly,
+ {"Read only", "9p.lflags.rdonly", FT_BOOLEAN, 32, TFS(&tfs_no_yes), _9P_DOTL_WRONLY|_9P_DOTL_RDWR,
+ NULL, HFILL}},
+ {&hf_9P_lflags_wronly,
+ {"Write only", "9p.lflags.wronly", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_WRONLY,
+ NULL, HFILL}},
+ {&hf_9P_lflags_rdwr,
+ {"Read Write", "9p.lflags.rdwr", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_RDWR,
+ NULL, HFILL}},
+ {&hf_9P_lflags_create,
+ {"Create", "9p.lflags.create", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_CREATE,
+ NULL, HFILL}},
+ {&hf_9P_lflags_excl,
+ {"Exclusive", "9p.lflags.excl", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_EXCL,
+ NULL, HFILL}},
+ {&hf_9P_lflags_noctty,
+ {"noctty", "9p.lflags.noctty", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_NOCTTY,
+ NULL, HFILL}},
+ {&hf_9P_lflags_trunc,
+ {"Truncate", "9p.lflags.trunc", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_TRUNC,
+ NULL, HFILL}},
+ {&hf_9P_lflags_append,
+ {"Append", "9p.lflags.append", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_APPEND,
+ NULL, HFILL}},
+ {&hf_9P_lflags_nonblock,
+ {"Nonblock", "9p.lflags.nonblock", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_NONBLOCK,
+ NULL, HFILL}},
+ {&hf_9P_lflags_dsync,
+ {"dsync", "9p.lflags.dsync", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_DSYNC,
+ NULL, HFILL}},
+ {&hf_9P_lflags_fasync,
+ {"fasync", "9p.lflags.fasync", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_FASYNC,
+ NULL, HFILL}},
+ {&hf_9P_lflags_direct,
+ {"Direct", "9p.lflags.direct", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_DIRECT,
+ NULL, HFILL}},
+ {&hf_9P_lflags_largefile,
+ {"Large File", "9p.lflags.largefile", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_LARGEFILE,
+ NULL, HFILL}},
+ {&hf_9P_lflags_directory,
+ {"Directory", "9p.lflags.directory", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_DIRECTORY,
+ NULL, HFILL}},
+ {&hf_9P_lflags_nofollow,
+ {"No follow", "9p.lflags.nofollow", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_NOFOLLOW,
+ NULL, HFILL}},
+ {&hf_9P_lflags_noatime,
+ {"No atime", "9p.lflags.noatime", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_NOATIME,
+ NULL, HFILL}},
+ {&hf_9P_lflags_cloexec,
+ {"cloexec", "9p.lflags.cloexec", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_CLOEXEC,
+ NULL, HFILL}},
+ {&hf_9P_lflags_sync,
+ {"Sync", "9p.lflags.sync", FT_BOOLEAN, 32, TFS(&tfs_yes_no), _9P_DOTL_SYNC,
+ NULL, HFILL}},
+ {&hf_9P_xattr_flag,
+ {"xattr_flag", "9p.xattr.flag", FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Xattr flag", HFILL}},
+ {&hf_9P_lock_type,
+ {"lock_type", "9p.lock.type", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &ninep_lock_type_ext, 0x0,
+ "Lock type", HFILL}},
+ {&hf_9P_lock_flag,
+ {"lock_flag", "9p.lock.flag", FT_UINT32, BASE_HEX | BASE_EXT_STRING, &ninep_lock_flag_ext, 0x0,
+ "Lock flag", HFILL}},
+ {&hf_9P_lock_start,
+ {"lock_start", "9p.lock.start", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Lock start", HFILL}},
+ {&hf_9P_lock_length,
+ {"lock_length", "9p.lock.length", FT_UINT64, BASE_DEC, NULL, 0x0,
+ "Lock length", HFILL}},
+ {&hf_9P_lock_procid,
+ {"lock_procid", "9p.lock.procid", FT_UINT32, BASE_HEX, NULL, 0x0,
+ "Lock procid", HFILL}},
+ {&hf_9P_lock_status,
+ {"lock_status", "9p.lock.status", FT_UINT8, BASE_HEX | BASE_EXT_STRING, &ninep_lock_status_ext, 0x0,
+ "Lock status", HFILL}}
};
static gint *ett[] = {
@@ -851,20 +2652,25 @@ void proto_register_9P(void)
&ett_9P_aname,
&ett_9P_ename,
&ett_9P_uname,
- &ett_9P_uid,
- &ett_9P_gid,
+ &ett_9P_user,
+ &ett_9P_group,
&ett_9P_muid,
&ett_9P_filename,
&ett_9P_version,
&ett_9P_qid,
&ett_9P_qidtype,
+ &ett_9P_getattr_flags,
+ &ett_9P_setattr_flags,
+ &ett_9P_lflags,
};
- proto_9P = proto_register_protocol("Plan 9 9P", "9P", "9p");
+ proto_9P = proto_register_protocol("Plan 9", "9P", "9p");
proto_register_field_array(proto_9P, hf, array_length(hf));
proto_register_subtree_array(ett, array_length(ett));
+
+ register_init_routine(_9p_hash_init);
}
void proto_reg_handoff_9P(void)
@@ -878,4 +2684,3 @@ void proto_reg_handoff_9P(void)
dissector_add_uint("tcp.port", NINEPORT, ninep_handle);
}
-