Ethereal-dev: [Ethereal-dev] Patch: Minor updates to packet-9p.c
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: "Nils O. Selåsdal" <noselasd@xxxxxxxxxxxxxxxxxxxxx>
Date: Mon, 18 Apr 2005 22:11:54 +0200
Hello, Attached is a patch to the packet-9p.c I submitted a few days ago, the diff is against revision 14129. It - Tries to be a bit smarter in figuring out if it's data continuitation. - Uses the time routines for showing the atime and mtime (it's seconds since 1970 GMT) - Decodes the mode in open/create messages.- Limits showing walks to directories deeper than 250 levels, sounds like a fair tradeoff.
I also added a sample capture of a 9P session to the Wiki; 9p.cap(For interrested parties; http://v9fs.sf.net provides the 9P protocol for Linux)
-- Nils O. Selåsdal NOS@xxxxxxx noselasd@xxxxxxxxxxxxxxxxxxxxx
Index: packet-9p.c =================================================================== --- packet-9p.c (revision 14129) +++ packet-9p.c (working copy) @@ -72,6 +72,14 @@ TWSTAT = 126, RWSTAT }; +/* File open modes */ +#define P9_OREAD 0x0 +#define P9_OWRITE 0x1 +#define P9_ORDWR 0x2 +#define P9_MODEMASK 0x3 +#define P9_OTRUNC 0x10 +#define P9_ORCLOSE 0x40 +#define P9_OEXCL 0x1000 /* Initialize the protocol and registered fields */ static int proto_9P = -1; @@ -84,6 +92,10 @@ static int hf_9P_fid = -1; static int hf_9P_nqid = -1; 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; @@ -117,6 +129,7 @@ /* subtree pointers */ static gint ett_9P = -1; +static gint ett_9P_omode = -1; /*9P Msg types to name mapping */ static const value_string ninep_msg_type[] = @@ -149,6 +162,17 @@ {RWSTAT, "Rwstat"}, {0, NULL}, }; +/* Open/Create modes */ +static const value_string ninep_mode_vals[] = +{ + {P9_OREAD, "Read Access"}, + {P9_OWRITE, "Write Access"}, + {P9_ORDWR, "Read/Write Access "}, + {P9_OEXCL, "Execute Access"}, + {0, NULL} +}; + +static void dissect_9P_mode(tvbuff_t * tvb, proto_tree * tree,int offset,int iscreate); /* Dissect 9P messages*/ static void dissect_9P(tvbuff_t * tvb, packet_info * pinfo, proto_tree * tree) @@ -161,7 +185,8 @@ gint len,reportedlen; tvbuff_t *next_tvb; proto_item *ti; - proto_tree *ninep_tree; + proto_tree *ninep_tree,*tmp_tree; + nstime_t tv; if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "9P"); @@ -171,19 +196,18 @@ ninesz = tvb_get_letohl(tvb, offset); ninemsg = tvb_get_guint8(tvb, offset + 4); - mname = val_to_str(ninemsg, ninep_msg_type, "unknown: %u"); + mname = val_to_str(ninemsg, ninep_msg_type,"Unknown"); - if (check_col(pinfo->cinfo, COL_INFO)) { - if(mname == NULL) { - col_add_fstr(pinfo->cinfo, COL_INFO, "Data Continuitation ? (Tag %d %s)", ninemsg,mname); - return; - } else { - col_append_fstr(pinfo->cinfo, COL_INFO, "%s Tag=%u",mname,(guint)tvb_get_letohs(tvb,offset+5)); - } - - } else if (mname == NULL) + if(strcmp(mname,"Unknown") == 0) { + if (check_col(pinfo->cinfo, COL_INFO)) + col_add_fstr(pinfo->cinfo, COL_INFO, "9P Data Continuitation(?) (Tag %u)",(guint)ninemsg); + return; + } + if (check_col(pinfo->cinfo, COL_INFO)) + col_append_fstr(pinfo->cinfo, COL_INFO, "%s Tag=%u",mname,(guint)tvb_get_letohs(tvb,offset+5)); + if (!tree) /*not much more of one line summary interrest yet.. */ return; @@ -282,6 +306,14 @@ tmp16 = tvb_get_letohs(tvb,offset); proto_tree_add_item(ninep_tree, hf_9P_nwalk, tvb, offset, 2, TRUE); offset +=2; + /* I can't imagine anyone having a directory depth more than 25, + Limit to 10 times that to be sure, 2^16 is too much */ + if(tmp16 > 250) { + tmp16 = 250; + tmp_tree = proto_tree_add_text(ninep_tree, tvb, 0, 0, "Only first 250 items shown"); + PROTO_ITEM_SET_GENERATED(tmp_tree); + } + for(i = 0 ; i < tmp16; i++) { guint16 tmplen; @@ -297,6 +329,14 @@ tmp16 = tvb_get_letohs(tvb,offset); proto_tree_add_item(ninep_tree, hf_9P_nqid, tvb, offset, 2, TRUE); offset +=2; + /* I can't imagine anyone having a directory depth more than 25, + Limit to 10 times that to be sure, 2^16 is too much */ + if(tmp16 > 250) { + tmp16 = 250; + tmp_tree = proto_tree_add_text(ninep_tree, tvb, 0, 0, "Only first 250 items shown"); + PROTO_ITEM_SET_GENERATED(tmp_tree); + } + for(i = 0; i < tmp16; i++) { proto_tree_add_item(ninep_tree, hf_9P_qidtype, tvb, offset, 1, TRUE); ++offset; @@ -311,7 +351,8 @@ case TOPEN: proto_tree_add_item(ninep_tree, hf_9P_fid, tvb, offset, 4, TRUE); offset +=4; - proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE); + tmp_tree = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE); + dissect_9P_mode(tvb,tmp_tree,offset,0); break; case ROPEN: @@ -339,7 +380,8 @@ proto_tree_add_item(ninep_tree, hf_9P_perm, tvb, offset, 4, TRUE); offset +=4; - proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE); + tmp_tree = proto_tree_add_item(ninep_tree, hf_9P_mode, tvb, offset, 1, TRUE); + dissect_9P_mode(tvb,tmp_tree,offset,1); break; case RCREATE: @@ -431,10 +473,14 @@ proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, TRUE); offset +=4; - proto_tree_add_item(ninep_tree, hf_9P_atime, tvb, offset, 4, TRUE); + tv.secs = tvb_get_letohl(tvb,offset); + tv.nsecs = 0; + proto_tree_add_time(ninep_tree, hf_9P_atime, tvb, offset, 4, &tv); offset +=4; - proto_tree_add_item(ninep_tree, hf_9P_mtime, tvb, offset, 4, TRUE); + tv.secs = tvb_get_letohl(tvb,offset); + tv.nsecs = 0; + proto_tree_add_time(ninep_tree, hf_9P_mtime, tvb, offset, 4, &tv); offset +=4; proto_tree_add_item(ninep_tree, hf_9P_length, tvb, offset, 8, TRUE); @@ -495,10 +541,14 @@ proto_tree_add_item(ninep_tree, hf_9P_statmode, tvb, offset, 4, TRUE); offset +=4; - proto_tree_add_item(ninep_tree, hf_9P_atime, tvb, offset, 4, TRUE); + tv.secs = tvb_get_letohl(tvb,offset); + tv.nsecs = 0; + proto_tree_add_time(ninep_tree, hf_9P_atime, tvb, offset, 4, &tv); offset +=4; - proto_tree_add_item(ninep_tree, hf_9P_mtime, tvb, offset, 4, TRUE); + tv.secs = tvb_get_letohl(tvb,offset); + tv.nsecs = 0; + proto_tree_add_time(ninep_tree, hf_9P_mtime, tvb, offset, 4, &tv); offset +=4; proto_tree_add_item(ninep_tree, hf_9P_length, tvb, offset, 8, TRUE); @@ -536,6 +586,23 @@ } +static void dissect_9P_mode(tvbuff_t * tvb, proto_tree * tree,int offset,int iscreate) +{ + proto_item *mode_tree; + guint8 mode; + + if(!tree) + return; + + 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); +} + /* Register 9P with Ethereal */ void proto_register_9P(void) { @@ -567,6 +634,18 @@ {&hf_9P_mode, {"Mode", "9p.mode", FT_UINT8, BASE_HEX, NULL, 0x0, "Mode", HFILL}}, + {&hf_9P_mode_rwx, + {"Open/Create Mode", "9p.mode.rwx", FT_UINT8, BASE_DEC,VALS(ninep_mode_vals),P9_MODEMASK, + "Open/Create Mode", HFILL}}, + {&hf_9P_mode_t, + {"Trunc", "9p.mode.trunc", FT_BOOLEAN, 8, TFS(&flags_set_truth), P9_OTRUNC, + "Truncate", HFILL}}, + {&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}}, @@ -595,10 +674,10 @@ {"Stat type", "9p.stattype", FT_UINT16, BASE_DEC, NULL, 0x0, "Stat type", HFILL}}, {&hf_9P_atime, - {"Atime", "9p.atime", FT_UINT32, BASE_DEC, NULL, 0x0, + {"Atime", "9p.atime", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "Access Time", HFILL}}, {&hf_9P_mtime, - {"Mtime", "9p.mtime", FT_UINT32, BASE_DEC, NULL, 0x0, + {"Mtime", "9p.mtime", FT_ABSOLUTE_TIME, BASE_NONE, NULL, 0x0, "Modified Time", HFILL}}, {&hf_9P_length, {"Length", "9p.length", FT_UINT64, BASE_DEC, NULL, 0x0, @@ -652,7 +731,8 @@ }; static gint *ett[] = { - &ett_9P + &ett_9P, + &ett_9P_omode, }; proto_9P = proto_register_protocol("Plan 9 9P", "9P", "9p");
- Follow-Ups:
- Re: [Ethereal-dev] Patch: Minor updates to packet-9p.c
- From: Nils O. Selåsdal
- Re: [Ethereal-dev] Patch: Minor updates to packet-9p.c
- Prev by Date: Re: [Ethereal-dev] Bug 68
- Next by Date: Re: [Ethereal-dev] Bug 68
- Previous by thread: Re: [Ethereal-dev] Bug 68
- Next by thread: Re: [Ethereal-dev] Patch: Minor updates to packet-9p.c
- Index(es):