Ethereal-dev: [Ethereal-dev] please help. Junk tvb data
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: Tue, 22 Mar 2005 15:07:38 -0800
Ahh, this is making me crazy. I attached the file so you can see. Please
take a look a dissect_MCI function. Somehow, I can set mciOffset. Ater
I do int mciOffset = 0, it returns some junk number. Then I can't ever
set mciOffset again, nor getting mci_signature, mci_type, mci_size,
using tvb_get_ functions. By the way, I'm using MSCV++ to debug. It is
really making me nut here. Don't know what's going on.
/* packet-mci.c
*/
#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 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_MCI = -1;
static int hf_MCI_request = -1;
static int hf_MCI_request_name = -1;
static int hf_MCI_type= -1;
static int hf_MCI_response= -1;
/* Initialize the subtree pointers */
static gint ett_MCI= -1;
static gint ett_ReqRsp= -1;
static gint ett_Data = -1;
const MciReq mciReqItem[REQ_RSP_CNT] =
{
MCI_REQ( MCI_Request),
MCI_REQ( MCI_Request_Test),
MCI_REQ( MCI_Request_Reset),
MCI_REQ( MCI_Data_MDTCMon)
};
/* Code to actually dissect the packets */
static void
dissect_MCI(tvbuff_t *tvb, packet_info *pinfo, proto_tree *tree)
{
proto_item *ti;
proto_item *data_item;
proto_tree *MCI_tree;
proto_tree *ReqRsp_tree;
proto_tree *Data_tree;
gboolean is_response;
const char *req_name;
guint32 mci_signature;
guint16 mci_type;
guint16 mci_size;
gboolean is_read = TRUE;
gboolean is_data = FALSE;
guint16 bc;
guint64 tra;
guint64 datalen;
int cmd_code = 0;
guint tvbLen;
int mciOffset = 0;
tvbLen = tvb_length(tvb);
bc = tvbLen;
mciOffset = SIGNATURE_OFFSET;
mci_signature = tvb_get_ntohl(tvb, mciOffset);
mciOffset = TYPE_OFFSET;
mci_type = tvb_get_ntohs(tvb, mciOffset);
mciOffset = SIZE_OFFSET;
mci_size = tvb_get_ntohs(tvb, mciOffset);
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, "MCI");
/* put request name into information colume */
if (mci_signature == MCI_PacketSignature) {
int i;
for (i=0; i < REQ_RSP_CNT; i++)
{
if (mci_type == mciReqItem[i].type) {
if (check_col(pinfo->cinfo, COL_INFO))
col_add_fstr(pinfo->cinfo, COL_INFO, "%s: %s",
is_response ? "REPONSE" : "REQUEST",
mciReqItem[i].name);
}
}
} else {
is_data = TRUE;
if (check_col(pinfo->cinfo, COL_INFO))
col_set_str(pinfo->cinfo, COL_INFO, "MCI DATA");
}
if (tree) {
/* create display subtree for the protocol */
ti = proto_tree_add_item(tree, proto_MCI, tvb, 0, -1, FALSE);
MCI_tree = proto_item_add_subtree(ti, ett_MCI);
/* add an item to the subtree */
if (ti) {
if (is_response) {
ti = proto_tree_add_text(MCI_tree,
tvb, 0, -1, "Response");
} else {
ti = proto_tree_add_text(MCI_tree,
tvb, 0, -1, "Request");
}
ReqRsp_tree = proto_item_add_subtree(ti, ett_ReqRsp);
if (is_response) {
proto_tree_add_boolean_hidden(ReqRsp_tree,
hf_MCI_response, tvb, 0,0,TRUE);
proto_tree_add_boolean_hidden(ReqRsp_tree,
hf_MCI_request, tvb, 0,0,FALSE);
} else {
proto_tree_add_boolean_hidden(ReqRsp_tree,
hf_MCI_response, tvb, 0,0,FALSE);
proto_tree_add_boolean_hidden(ReqRsp_tree,
hf_MCI_request, tvb, 0,0,TRUE);
}
}
}
}
}
/* 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_MCI(void)
{
/* Setup list of header fields See Section 1.6.1 for details*/
static hf_register_info hf[] = {
{ &hf_MCI_request,
{ "Request", "mci.request",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"TRUE if request", HFILL }
},
{ &hf_MCI_response,
{ "Response", "mci.response",
FT_BOOLEAN, BASE_NONE, NULL, 0x0,
"TRUE if response", HFILL }
},
{ &hf_MCI_request_name,
{ "Request Name", "mci.request.name",
FT_STRING, BASE_NONE, NULL, 0x0,
"", HFILL }
},
{ &hf_MCI_type,
{ "Type", "mci.type",
FT_UINT32, BASE_DEC, NULL, 0x0,
"Type", HFILL }
}
};
/* Setup protocol subtree array */
static gint *ett[] = {
&ett_MCI,
&ett_ReqRsp,
&ett_Data,
};
/* Register the protocol name and description */
proto_MCI = proto_register_protocol("MCI Protocal",
"MCI", "mci");
/* Required function calls to register the header fields and subtrees used */
proto_register_field_array(proto_MCI, 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_MCI(void)
{
dissector_handle_t MCI_handle;
MCI_handle = create_dissector_handle(dissect_MCI,
proto_MCI);
dissector_add("tcp.port", MCIPort, MCI_handle);
}
#ifndef ENABLE_STATIC
G_MODULE_EXPORT void
plugin_init(plugin_address_table_t *pat) {
plugin_address_table_init(pat);
if (proto_MCI == -1)
proto_register_MCI();
}
G_MODULE_EXPORT void
plugin_reg_handoff(void) {
proto_reg_handoff_MCI();
}
#endif
- Prev by Date: Re: [Ethereal-dev] Banish ALL kinds of g_assert from epan (dissector) code?
- Next by Date: [Ethereal-dev] Re: [Ethereal-cvs] rev 13869: /trunk/epan/dissectors/: packet-wsp.c
- Previous by thread: Re: [Ethereal-dev] Banish ALL kinds of g_assert from epan (dissector) code?
- Next by thread: [Ethereal-dev] Re: [Ethereal-cvs] rev 13869: /trunk/epan/dissectors/: packet-wsp.c
- Index(es):