forked from osmocom/wireshark
From Nils O. Sel?sdal:
- Decodes all the remaining bitfields in 9P - Tidies up display a bit (using more subtrees) - Fixes a few fields that are better off displayed as decimal/octal. svn path=/trunk/; revision=14287
This commit is contained in:
parent
32660dc86e
commit
07e46b0c48
|
@ -8,6 +8,8 @@
|
|||
* By Gerald Combs <gerald@ethereal.com>
|
||||
* Copyright 1998 Gerald Combs
|
||||
*
|
||||
* File permission bits decoding taken from packet-nfs.c
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
* as published by the Free Software Foundation; either version 2
|
||||
|
@ -80,7 +82,22 @@ enum {
|
|||
#define P9_MODEMASK 0x3
|
||||
#define P9_OTRUNC 0x10
|
||||
#define P9_ORCLOSE 0x40
|
||||
#define P9_OEXCL 0x1000
|
||||
|
||||
/* 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 */
|
||||
|
||||
#define QTDIR 0x80 /* Directory */
|
||||
#define QTAPPEND 0x40 /* Append only */
|
||||
#define QTEXCL 0x20 /* Exclusive use */
|
||||
#define QTMOUNT 0x10 /* Mounted channel */
|
||||
#define QTAUTH 0x08 /* Authentication */
|
||||
#define QTTMP 0x04 /* Temporary */
|
||||
#define QTFILE 0x00 /* plain file ?? */
|
||||
|
||||
/* Initialize the protocol and registered fields */
|
||||
static int proto_9P = -1;
|
||||
|
@ -96,7 +113,6 @@ static int hf_9P_mode = -1;
|
|||
static int hf_9P_mode_rwx = -1;
|
||||
static int hf_9P_mode_t = -1;
|
||||
static int hf_9P_mode_c = -1;
|
||||
static int hf_9P_mode_x = -1;
|
||||
static int hf_9P_iounit = -1;
|
||||
static int hf_9P_count = -1;
|
||||
static int hf_9P_offset = -1;
|
||||
|
@ -131,6 +147,18 @@ static dissector_handle_t data_handle;
|
|||
/* subtree pointers */
|
||||
static gint ett_9P = -1;
|
||||
static gint ett_9P_omode = -1;
|
||||
static gint ett_9P_dm = -1;
|
||||
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_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;
|
||||
|
||||
/*9P Msg types to name mapping */
|
||||
static const value_string ninep_msg_type[] =
|
||||
|
@ -172,8 +200,10 @@ static const value_string ninep_mode_vals[] =
|
|||
{P9_OEXEC, "Execute Access"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static void dissect_9P_mode(tvbuff_t * tvb, proto_tree * tree,int offset,int iscreate);
|
||||
|
||||
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);
|
||||
|
||||
/* Dissect 9P messages*/
|
||||
static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
||||
|
@ -229,40 +259,37 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
offset +=4;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_version, tvb, offset, tmp16, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_version, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_version);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += 2;
|
||||
break;
|
||||
case TAUTH:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_afid, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_uname, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_uname, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_uname);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_aname, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_aname);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_aname, tvb, offset, tmp16, TRUE);
|
||||
break;
|
||||
case RAUTH:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
break;
|
||||
case RERROR:
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_ename, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_ename);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_ename, tvb, offset, tmp16, TRUE);
|
||||
|
||||
break;
|
||||
case TFLUSH:
|
||||
|
@ -278,24 +305,20 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
offset +=4;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_uname, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_uname, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_uname);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16 + 2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_aname, tvb, offset, tmp16, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_aname, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_aname);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
break;
|
||||
case RATTACH:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
break;
|
||||
case TWALK:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, TRUE);
|
||||
|
@ -317,12 +340,15 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
|
||||
for(i = 0 ; i < tmp16; i++) {
|
||||
guint16 tmplen;
|
||||
|
||||
proto_item *wname;
|
||||
proto_tree *wname_tree;
|
||||
|
||||
tmplen = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_uint_format(ninep_tree, hf_9P_parmsz, tvb, offset, 2, tmplen, "%d. param length: %u",i,tmplen);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset, tmplen, TRUE);
|
||||
offset += tmplen;
|
||||
wname = proto_tree_add_item(ninep_tree, hf_9P_wname, tvb, offset+2, tmplen, TRUE);
|
||||
wname_tree = proto_item_add_subtree(wname,ett_9P_wname);
|
||||
proto_tree_add_item(wname_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
|
||||
offset += tmplen + 2;
|
||||
}
|
||||
|
||||
break;
|
||||
|
@ -339,33 +365,19 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
}
|
||||
|
||||
for(i = 0; i < tmp16; i++) {
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
offset +=8;
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
}
|
||||
break;
|
||||
case TOPEN:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
tmp_tree = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE);
|
||||
dissect_9P_mode(tvb,tmp_tree,offset,0);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE);
|
||||
dissect_9P_mode(tvb,ti,offset);
|
||||
break;
|
||||
case ROPEN:
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
offset +=8;
|
||||
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_iounit, tvb, offset, 4, TRUE);
|
||||
break;
|
||||
case TCREATE:
|
||||
|
@ -373,28 +385,22 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
offset +=4;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_name, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_name, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_filename);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16 + 2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_perm, tvb, offset, 4, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_perm, tvb, offset, 4, TRUE);
|
||||
dissect_9P_dm(tvb,ti,offset,1);
|
||||
offset +=4;
|
||||
|
||||
tmp_tree = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE);
|
||||
dissect_9P_mode(tvb,tmp_tree,offset,1);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE);
|
||||
dissect_9P_mode(tvb,ti,offset);
|
||||
|
||||
break;
|
||||
case RCREATE:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
offset +=8;
|
||||
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_iounit, tvb, offset, 4, TRUE);
|
||||
break;
|
||||
case TREAD:
|
||||
|
@ -462,16 +468,11 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
proto_tree_add_item(ninep_tree, hf_9P_dev, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
offset +=8;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, TRUE);
|
||||
dissect_9P_dm(tvb,ti,offset,0);
|
||||
offset +=4;
|
||||
|
||||
tv.secs = tvb_get_letohl(tvb,offset);
|
||||
|
@ -488,31 +489,28 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
offset +=8;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_filename, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_filename, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_filename);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_uid);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_gid);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_muid, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_muid, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_muid);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
break;
|
||||
case TWSTAT:
|
||||
proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, TRUE);
|
||||
|
@ -530,16 +528,11 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
proto_tree_add_item(ninep_tree, hf_9P_dev, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
++offset;
|
||||
dissect_9P_qid(tvb,ninep_tree,offset);
|
||||
offset += 13;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidvers, tvb, offset, 4, TRUE);
|
||||
offset +=4;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_qidpath, tvb, offset, 8, TRUE);
|
||||
offset +=8;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, TRUE);
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, TRUE);
|
||||
dissect_9P_dm(tvb,ti,offset,0);
|
||||
offset +=4;
|
||||
|
||||
tv.secs = tvb_get_letohl(tvb,offset);
|
||||
|
@ -556,52 +549,130 @@ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree)
|
|||
offset +=8;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_filename, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_filename, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_filename);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_uid, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_uid);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
|
||||
proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_gid, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_gid);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
|
||||
tmp16 = tvb_get_letohs(tvb,offset);
|
||||
proto_tree_add_item(ninep_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset +=2;
|
||||
proto_tree_add_item(ninep_tree, hf_9P_muid, tvb, offset, tmp16, TRUE);
|
||||
offset += tmp16;
|
||||
ti = proto_tree_add_item(ninep_tree, hf_9P_muid, tvb, offset+2, tmp16, TRUE);
|
||||
tmp_tree = proto_item_add_subtree(ti,ett_9P_muid);
|
||||
proto_tree_add_item(tmp_tree, hf_9P_parmsz, tvb, offset, 2, TRUE);
|
||||
offset += tmp16+2;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
static void dissect_9P_mode(tvbuff_t * tvb, proto_tree * tree,int offset,int iscreate)
|
||||
/* dissect 9P open mode flags */
|
||||
static void dissect_9P_mode(tvbuff_t * tvb, proto_item * item,int offset)
|
||||
{
|
||||
proto_item *mode_tree;
|
||||
guint8 mode;
|
||||
|
||||
mode = tvb_get_guint8(tvb,offset);
|
||||
mode_tree = proto_item_add_subtree(item, ett_9P_omode);
|
||||
if(!mode_tree)
|
||||
return;
|
||||
proto_tree_add_boolean(mode_tree, hf_9P_mode_c, tvb, offset, 1, mode);
|
||||
proto_tree_add_boolean(mode_tree, hf_9P_mode_t, tvb, offset, 1, mode);
|
||||
proto_tree_add_item(mode_tree, hf_9P_mode_rwx, tvb, offset, 1, mode);
|
||||
}
|
||||
|
||||
/* dissect 9P Qid */
|
||||
static void dissect_9P_qid(tvbuff_t * tvb, proto_tree * tree,int offset)
|
||||
{
|
||||
proto_item *qid_item,*qidtype_item;
|
||||
proto_tree *qid_tree,*qidtype_tree;
|
||||
guint64 path;
|
||||
guint32 vers;
|
||||
guint8 type;
|
||||
|
||||
if(!tree)
|
||||
return;
|
||||
|
||||
type = tvb_get_guint8(tvb,offset);
|
||||
vers = tvb_get_letohs(tvb,offset+1);
|
||||
path = tvb_get_letoh64(tvb,offset+1+4);
|
||||
|
||||
mode = tvb_get_guint8(tvb,offset);
|
||||
mode_tree = proto_item_add_subtree(tree, ett_9P_omode);
|
||||
proto_tree_add_item(mode_tree, hf_9P_mode_rwx, tvb, offset, 1, mode);
|
||||
proto_tree_add_boolean(mode_tree, hf_9P_mode_t, tvb, offset, 1, mode);
|
||||
proto_tree_add_boolean(mode_tree, hf_9P_mode_c, tvb, offset, 1, mode);
|
||||
if(iscreate) /* only in create calls */
|
||||
proto_tree_add_boolean(mode_tree, hf_9P_mode_x, tvb, offset, 1, mode);
|
||||
qid_item = proto_tree_add_text(tree,tvb,offset,13,"Qid type=0x%02x vers=%d path=%"PRIu64,type,vers,path);
|
||||
qid_tree = proto_item_add_subtree(qid_item,ett_9P_qid);
|
||||
|
||||
qidtype_item = proto_tree_add_item(qid_tree, hf_9P_qidtype, tvb, offset, 1, TRUE);
|
||||
qidtype_tree = proto_item_add_subtree(qidtype_item,ett_9P_qidtype);
|
||||
|
||||
proto_tree_add_text(qidtype_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(type, QTDIR, 8, "Directory", "not a Directory"));
|
||||
proto_tree_add_text(qidtype_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(type, QTAPPEND, 8, "Append only", "not Append only"));
|
||||
proto_tree_add_text(qidtype_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(type, QTEXCL, 8, "Exclusive use", "not Exclusive use"));
|
||||
proto_tree_add_text(qidtype_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(type, QTMOUNT, 8, "Mounted channel", "not a Mounted channel"));
|
||||
proto_tree_add_text(qidtype_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(type, QTAUTH, 8, "Authentication file", "not an Authentication file"));
|
||||
proto_tree_add_text(qidtype_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(type, QTTMP, 8, "Temporary file (not backed up)", "not a Temporary file"));
|
||||
|
||||
proto_tree_add_item(qid_tree, hf_9P_qidvers, tvb, offset+1, 4, TRUE);
|
||||
proto_tree_add_item(qid_tree, hf_9P_qidpath, tvb, offset+1+4, 8, TRUE);
|
||||
}
|
||||
|
||||
/*dissect 9P stat mode and create perm flags */
|
||||
static void dissect_9P_dm(tvbuff_t * tvb, proto_item * item,int offset,int iscreate)
|
||||
{
|
||||
proto_item *mode_tree;
|
||||
guint32 dm;
|
||||
|
||||
|
||||
dm = tvb_get_letohl(tvb,offset);
|
||||
mode_tree = proto_item_add_subtree(item, ett_9P_dm);
|
||||
if(!mode_tree)
|
||||
return;
|
||||
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 1, "%s",
|
||||
decode_boolean_bitfield(dm, DMDIR, 32, "Directory", "not a Directory"));
|
||||
if(!iscreate) { /* Not applicable to Tcreate (?) */
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, DMAPPEND, 32, "Append only", "not Append only"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, DMEXCL, 32, "Exclusive use", "not Exclusive use"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, DMMOUNT, 32, "Mounted channel", "not a Mounted channel"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, DMAUTH, 32, "Authentication file", "not an Authentication file"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, DMTMP, 32, "Temporary file (not backed up)", "not a Temporary file"));
|
||||
}
|
||||
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 0400, 32, "Read permission for owner", "no Read permission for owner"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 0200, 32, "Write permission for owner", "no Write permission for owner"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 0100, 32, "Execute permission for owner", "no Execute permission for owner"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 040, 32, "Read permission for group", "no Read permission for group"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 020, 32, "Write permission for group", "no Write permission for group"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 010, 32, "Execute permission for group", "no Execute permission for group"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 04, 32, "Read permission for others", "no Read permission for others"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 02, 32, "Write permission for others", "no Write permission for others"));
|
||||
proto_tree_add_text(mode_tree, tvb, offset, 4, "%s",
|
||||
decode_boolean_bitfield(dm, 01, 32, "Execute permission for others", "no Execute permission for others"));
|
||||
}
|
||||
|
||||
/* Register 9P with Ethereal */
|
||||
|
@ -624,14 +695,14 @@ void proto_register_9P(void)
|
|||
{"Param length", "9p.paramsz", FT_UINT16, BASE_DEC, NULL, 0x0,
|
||||
"Parameter length", HFILL}},
|
||||
{&hf_9P_maxsize,
|
||||
{"Max msg size", "9p.maxsize", FT_UINT32, BASE_HEX, NULL, 0x0,
|
||||
{"Max msg size", "9p.maxsize", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"Max message size", HFILL}},
|
||||
{&hf_9P_fid,
|
||||
{"Fid", "9p.fid", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"File ID", HFILL}},
|
||||
{&hf_9P_nqid,
|
||||
{"Nr Qids", "9p.nqid", FT_UINT16, BASE_DEC, NULL, 0x0,
|
||||
"Number of Qids", HFILL}},
|
||||
"Number of Qid results", HFILL}},
|
||||
{&hf_9P_mode,
|
||||
{"Mode", "9p.mode", FT_UINT8, BASE_HEX, NULL, 0x0,
|
||||
"Mode", HFILL}},
|
||||
|
@ -644,9 +715,6 @@ void proto_register_9P(void)
|
|||
{&hf_9P_mode_c,
|
||||
{"Remove on close", "9p.mode.orclose", FT_BOOLEAN, 8, TFS(&flags_set_truth), P9_ORCLOSE,
|
||||
"", HFILL}},
|
||||
{&hf_9P_mode_x,
|
||||
{"Exclusive", "9p.mode.excl", FT_BOOLEAN, 8, TFS(&flags_set_truth), P9_OEXCL,
|
||||
"", HFILL}},
|
||||
{&hf_9P_iounit,
|
||||
{"I/O Unit", "9p.iounit", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"I/O Unit", HFILL}},
|
||||
|
@ -666,14 +734,14 @@ void proto_register_9P(void)
|
|||
{"Qid version", "9p.qidvers", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"Qid version", HFILL}},
|
||||
{&hf_9P_qidtype,
|
||||
{"Qid type", "9p.qidtype", FT_UINT8, BASE_DEC, NULL, 0x0,
|
||||
{"Qid type", "9p.qidtype", FT_UINT8, BASE_HEX, NULL, 0x0,
|
||||
"Qid type", HFILL}},
|
||||
{&hf_9P_statmode,
|
||||
{"Stat mode", "9p.statmode", FT_UINT32, BASE_HEX, NULL, 0x0,
|
||||
"Stat mode", HFILL}},
|
||||
{"Mode", "9p.statmode", FT_UINT32, BASE_OCT, NULL, 0x0,
|
||||
"File mode flags", HFILL}},
|
||||
{&hf_9P_stattype,
|
||||
{"Stat type", "9p.stattype", FT_UINT16, BASE_DEC, NULL, 0x0,
|
||||
"Stat type", HFILL}},
|
||||
{"Type", "9p.stattype", FT_UINT16, BASE_DEC, NULL, 0x0,
|
||||
"Type", HFILL}},
|
||||
{&hf_9P_atime,
|
||||
{"Atime", "9p.atime", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0,
|
||||
"Access Time", HFILL}},
|
||||
|
@ -693,20 +761,20 @@ void proto_register_9P(void)
|
|||
{"Version", "9p.version", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"Version", HFILL}},
|
||||
{&hf_9P_afid,
|
||||
{"AFid", "9p.fid", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
{"Afid", "9p.fid", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"Authenticating FID", HFILL}},
|
||||
{&hf_9P_uname,
|
||||
{"Uname", "9p.uname", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"User Name", HFILL}},
|
||||
{&hf_9P_aname,
|
||||
{"Aname", "9p.aname", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"Attach Name", HFILL}},
|
||||
"Access Name", HFILL}},
|
||||
{&hf_9P_ename,
|
||||
{"Ename", "9p.ename", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"Error", HFILL}},
|
||||
{&hf_9P_name,
|
||||
{"Name", "9p.name", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"Name (of file)", HFILL}},
|
||||
"Name of file", HFILL}},
|
||||
{&hf_9P_sdlen,
|
||||
{"Stat data length", "9p.sdlen", FT_UINT16, BASE_DEC, NULL, 0x0,
|
||||
"Stat data length", HFILL}},
|
||||
|
@ -715,25 +783,37 @@ void proto_register_9P(void)
|
|||
"File name", HFILL}},
|
||||
{&hf_9P_uid,
|
||||
{"Uid", "9p.uid", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"User ID", HFILL}},
|
||||
"User id", HFILL}},
|
||||
{&hf_9P_gid,
|
||||
{"Gid", "9p.gid", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"Group ID", HFILL}},
|
||||
"Group id", HFILL}},
|
||||
{&hf_9P_muid,
|
||||
{"Muid", "9p.muid", FT_STRING, BASE_NONE, NULL, 0x0,
|
||||
"Modified Uid", HFILL}},
|
||||
"Last modifiers uid", HFILL}},
|
||||
{&hf_9P_newfid,
|
||||
{"New fid", "9p.newfid", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"New file ID", HFILL}},
|
||||
{&hf_9P_nwalk,
|
||||
{"Nr Walks", "9p.nwalk", FT_UINT32, BASE_DEC, NULL, 0x0,
|
||||
"Nr of walk results", HFILL}}
|
||||
"Nr of walk items", HFILL}}
|
||||
|
||||
};
|
||||
|
||||
static gint *ett[] = {
|
||||
&ett_9P,
|
||||
&ett_9P_omode,
|
||||
&ett_9P_dm,
|
||||
&ett_9P_wname,
|
||||
&ett_9P_aname,
|
||||
&ett_9P_ename,
|
||||
&ett_9P_uname,
|
||||
&ett_9P_uid,
|
||||
&ett_9P_gid,
|
||||
&ett_9P_muid,
|
||||
&ett_9P_filename,
|
||||
&ett_9P_version,
|
||||
&ett_9P_qid,
|
||||
&ett_9P_qidtype,
|
||||
};
|
||||
|
||||
proto_9P = proto_register_protocol("Plan 9 9P", "9P", "9p");
|
||||
|
|
Loading…
Reference in New Issue