Ethereal-dev: Re: [Ethereal-dev] information is display while filter, not otherwise
Note: This archive is from the project's previous web site, ethereal.com. This list is no longer active.
From: Nina Pham <nina@xxxxxxxxxxx>
Date: Thu, 31 Mar 2005 16:04:07 -0800
Ulf Lamping wrote:
Ethereal development <ethereal-dev@xxxxxxxxxxxx> schrieb am 01.04.05 01:35:18:Things are getting weird here. I wrote a plugin to capture one protocol. Some data I like to display on the information column wont be display when I did a filtering on a protocal name. Data disappears again when I clear the filter. Any idea will be appreciated.That sounds really strange. In such cases, I tend to do a "rebuild all". Guesswork: Maybe you used the "tree" parameter the wrong way? Regards, ULFL ______________________________________________________________ Verschicken Sie romantische, coole und witzige Bilder per SMS! Jetzt bei WEB.DE FreeMail: http://f.web.de/?mc=021193 _______________________________________________ Ethereal-dev mailing list Ethereal-dev@xxxxxxxxxxxx http://www.ethereal.com/mailman/listinfo/ethereal-dev
sorry to forgot the attachmentI thought I use tree parrameter in the wrong way. I created a tree then pass it in a function. But then I don't know what I suppose to do. I attached here part of the file in which I use tree parameter. In function dissect_KLATST, I created a tree call reqrsp_tree and passed it to function parseData. Thanks
/* packet-TST.c * * Ethereal - Network traffic analyzer * By Gerald Combs <gerald@xxxxxxxxxxxx> * Copyright 1998 Gerald Combs * * 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 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #include "plugins/plugin_api.h" #include "moduleinfo.h" #include <stdio.h> #include <stdlib.h> #include <string.h> #include <gmodule.h> #include <glib.h> #include "plugins/plugin_api_defs.h" #include <epan/packet.h> #include "mci.h" #ifndef ENABLE_STATIC G_MODULE_EXPORT const gchar version[] = VERSION; #endif #define MCI_HEADER_SIZE 8 #define SIGNATURE_OFFSET 0 #define TYPE_OFFSET 4 #define SIZE_OFFSET 6 #define DATA_OFFSET 8 /* IF PROTO exposes code to other dissectors, then it must be exported in a header file. If not, a header file is not needed at all. */ /* Initialize the protocol and registered fields */ static int proto_TST = -1; static int hf_TST_request = -1; static int hf_TST_name = -1; static int hf_TST_size = -1; static int hf_TST_type= -1; static int hf_TST_response= -1; static int hf_TST_offset= -1; /* Initialize the subtree pointers */ static gint ett_TST= -1; static gint ett_ReqRsp= -1; static gint ett_Data = -1; /* Initialze the mci request response table */ const MciReq mciReqItem[REQ_RSP_CNT] = { /* Name and Type, reqDataType */ NAME_CODE( TST_Request), COUNT, NAME_CODE( TST_Request_Test), COUNT, NAME_CODE( TST_Request_Reset), NONE, // There are more ... }; /*********************************************************************************/ void tst_print_etc(packet_info *pinfo) /* ** This function print "..." in the information column */ { if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, " ..."); } /*********************************************************************************/ void parseData(tvbuff_t *tvb, packet_info *pinfo, gboolean is_response, MciReq curMciReq, guint16 dataSize, proto_tree *ReqRsp_tree) /* ** Parse data and print them in the info column */ { proto_item *data_item; proto_tree *Data_tree; int offset; REQ_DATA_TYPE dataDisplay; guint16 dataType; int i; int j; guint16 halfWordOffset[4]; // get packet length, this doesn't include tcp header if (tvb != NULL) { packetLength = tvb_length(tvb); } dataDisplay = curMciReq.reqDataType; dataType = curMciReq.type; switch (dataDisplay) { case NONE: break; case COUNT: /*TST_Request TST_Request_Test TST_Data */ // display first 2 and last 2 offset */ // get the offsets which will be displayed for (i=0, j=0; j < dataSize; i++, j=j+4) { if ( j == 0 || j == 4 || ((j==8 || j==12) && (dataSize <= 16) )) { halfWordOffset[i] = DATA_OFFSET + j; } if ((j == (dataSize - 8)) || (j == (dataSize - 4)) && (dataSize > 16)) { halfWordOffset[i] = DATA_OFFSET + j; } } // display size if (check_col(pinfo->cinfo, COL_INFO)) { col_append_fstr(pinfo->cinfo, COL_INFO, " size=%u", dataSize); } if (dataSize >0) { if (check_col(pinfo->cinfo, COL_INFO)) col_append_str(pinfo->cinfo, COL_INFO, " Data="); for (i=0, j=0; i < dataSize / 4; j=j+4, i++) { // display first 2 and last 2 offset if (check_col(pinfo->cinfo, COL_INFO)) col_append_fstr(pinfo->cinfo, COL_INFO, " %x", tvb_get_letohs(tvb, halfWordOffset[i])); if (dataSize > 16 && i==2) tst_print_etc(pinfo); } } // display in summary display if (ReqRsp_tree) { proto_tree_add_item(ReqRsp_tree, hf_TST_size, tvb, SIZE_OFFSET, 4, FALSE); data_item = proto_tree_add_text(ReqRsp_tree, tvb, DATA_OFFSET, dataSize, "Data (%u bytes)", dataSize); Data_tree = proto_item_add_subtree(data_item, ett_Data); } break; case REGISTER: ... break; case POLTIMING: ... break; case RES_SEACQU: ... break; ... // there are more cases here } } /* Code to actually dissect the packets */ static void dissect_KLATST(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree) { proto_item *ti; proto_tree *KLATST_tree; proto_tree *ReqRsp_tree; gboolean is_response; guint32 TST_signature; guint16 TST_type; guint16 TST_size; gboolean is_data_packet = FALSE; guint tvbLen; TSTReq curTSTReq; tvbLen = tvb_length(tvb); /* Get the TST packet signature*/ TST_signature = tvb_get_letohl(tvb, SIGNATURE_OFFSET); /* Get the TST type*/ TST_type = tvb_get_letohs(tvb, TYPE_OFFSET); /* Get the TST size*/ TST_size = tvb_get_letohs(tvb, SIZE_OFFSET); if (tvbLen) { /* ** check if request or response */ if (pinfo->match_port == pinfo->destport) is_response = FALSE; else is_response = TRUE; /* Make entries in Protocol column and Info column on summary display */ if (check_col(pinfo->cinfo, COL_PROTOCOL)) col_set_str(pinfo->cinfo, COL_PROTOCOL, "KLATST"); /* put request name into information colume */ if (TST_signature == TST_PacketSignature) { int i; for (i=0; i < REQ_RSP_CNT; i++) { boolean found = FALSE; if (TST_type == TSTReqItem[i].type) { if (check_col(pinfo->cinfo, COL_INFO)) col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s", is_response ? "REPONSE" : "REQUEST", TSTReqItem[i].name); curTSTReq = TSTReqItem[i]; found = TRUE; } if (found) break; } } else { is_data_packet = TRUE; if (check_col(pinfo->cinfo, COL_INFO)) col_set_str(pinfo->cinfo, COL_INFO, "TST DATA Continuation"); } if (tree) { /* create display subtree for the protocol */ ti = proto_tree_add_item(tree, proto_KLATST, tvb, 0, -1, FALSE); KLATST_tree = proto_item_add_subtree(ti, ett_KLATST); /* add an item to the subtree */ if (ti) { if (is_response) { ti = proto_tree_add_text(KLATST_tree, tvb, 0, -1, "Response"); } else { ti = proto_tree_add_text(KLATST_tree, tvb, 0, -1, "Request"); } ReqRsp_tree = proto_item_add_subtree(ti, ett_ReqRsp); // These ared used for filtering if (is_response) { proto_tree_add_boolean_hidden(ReqRsp_tree, hf_KLATST_response, tvb, 0,0,TRUE); proto_tree_add_boolean_hidden(ReqRsp_tree, hf_KLATST_request, tvb, 0,0,FALSE); } else { proto_tree_add_boolean_hidden(ReqRsp_tree, hf_KLATST_response, tvb, 0,0,FALSE); proto_tree_add_boolean_hidden(ReqRsp_tree, hf_KLATST_request, tvb, 0,0,TRUE); } if (ReqRsp_tree) { // if data continuation packet or request/response if (!is_data_packet){ proto_tree_add_string(ReqRsp_tree, hf_KLATST_name, tvb, 0, 0, curTSTReq.name); } else { char *TSTName = "DATA Continuation"; proto_tree_add_string_hidden(ReqRsp_tree, hf_KLATST_name, tvb, 0, 0, TSTName); } } } /* parse data and put them in info column and summary display*/ #if 1 parseData(tvb, pinfo, is_response, curTSTReq, TST_size, ReqRsp_tree); } #else } parseData(tvb, pinfo, is_response, curTSTReq, TST_size, ReqRsp_tree); #endif } } /* Register the protocol with Ethereal */ /* this format is require because a script is used to build the C function that calls all the protocol registration. */ void proto_register_KLATST(void) { /* Setup list of header fields See Section 1.6.1 for details*/ static hf_register_info hf[] = { { &hf_KLATST_request, { "Request", "klaTST.request", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "TRUE if kla request", HFILL } }, { &hf_KLATST_response, { "Response", "klaTST.response", FT_BOOLEAN, BASE_NONE, NULL, 0x0, "TRUE if kla response", HFILL } }, { &hf_KLATST_name, { "Name", "klaTST.name", FT_STRING, BASE_NONE, NULL, 0x0, "", HFILL } }, { &hf_KLATST_size, { "Size", "klaTST.size", FT_UINT16, BASE_DEC, NULL, 0x0, "Size", HFILL } }, { &hf_KLATST_type, { "Type", "klaTST.type", FT_UINT16, BASE_HEX, NULL, 0x0, "Type", HFILL } }, }; /* Setup protocol subtree array */ static gint *ett[] = { &ett_TST, &ett_ReqRsp, &ett_Data, }; /* Register the protocol name and description */ proto_TST = proto_register_protocol("TST Protocal", "TST", "TST"); /* Required function calls to register the header fields and subtrees used */ proto_register_field_array(proto_TST, hf, array_length(hf)); proto_register_subtree_array(ett, array_length(ett)); } /* If this dissector uses sub-dissector registration add a registration routine. This format is required because a script is used to find these routines and create the code that calls these routines. */ void proto_reg_handoff_TST(void) { dissector_handle_t TST_handle; TST_handle = create_dissector_handle(dissect_TST, proto_TST); dissector_add("tcp.port", MCIPort, TST_handle); } #ifndef ENABLE_STATIC G_MODULE_EXPORT void plugin_init(plugin_address_table_t *pat) { plugin_address_table_init(pat); if (proto_TST == -1) proto_register_TST(); } G_MODULE_EXPORT void plugin_reg_handoff(void) { proto_reg_handoff_TST(); } #endif
- Follow-Ups:
- References:
- Re: [Ethereal-dev] information is display while filter, not otherwise
- From: Ulf Lamping
- Re: [Ethereal-dev] information is display while filter, not otherwise
- Prev by Date: Re: [Ethereal-dev] information is display while filter, not otherwise
- Next by Date: Re: [Ethereal-dev] information is display while filter, not otherwise
- Previous by thread: Re: [Ethereal-dev] information is display while filter, not otherwise
- Next by thread: Re: [Ethereal-dev] information is display while filter, not otherwise
- Index(es):